libwordring
simple_node.hpp
1 #pragma once
2 
3 #include <wordring/html/html_atom.hpp>
4 #include <wordring/html/html_defs.hpp>
5 
6 #include <wordring/encoding/encoding.hpp>
7 
8 #include <wordring/whatwg/infra/infra.hpp>
9 
10 #include <iterator>
11 #include <optional>
12 #include <variant>
13 #include <vector>
14 
15 namespace wordring::html
16 {
17  // ---------------------------------------------------------------------------------------------
18  // 属性
19  // ---------------------------------------------------------------------------------------------
20 
25  template <typename String>
27  {
28  template <typename String1>
29  friend bool operator==(simple_attr<String1> const&, simple_attr<String1> const&);
30 
31  template <typename String1>
32  friend bool operator==(simple_attr<String1> const&, attribute_name);
33 
34  template <typename String1>
35  friend bool operator==(attribute_name, simple_attr<String1> const&);
36 
37  template <typename String1>
38  friend bool operator==(simple_attr<String1> const&, String1 const&);
39 
40  template <typename String1>
41  friend bool operator==(String1 const&, simple_attr<String1> const&);
42 
43  template <typename String1>
44  friend bool operator!=(simple_attr<String1> const&, simple_attr<String1> const&);
45 
46  template <typename String1>
47  friend bool operator!=(simple_attr<String1> const&, attribute_name);
48 
49  template <typename String1>
50  friend bool operator!=(attribute_name, simple_attr<String1> const&);
51 
52  template <typename String1>
53  friend bool operator!=(simple_attr<String1> const&, String1 const&);
54 
55  template <typename String1>
56  friend bool operator!=(String1 const&, simple_attr<String1> const&);
57 
58  public:
59  using string_type = String;
60 
63 
64  public:
65  simple_attr()
66  : m_namespace_uri(static_cast<ns_name>(0))
67  , m_prefix()
68  , m_local_name(static_cast<attribute_name>(0))
69  , m_value()
70  {
71  }
72 
73  simple_attr(simple_attr const&) = default;
74  simple_attr(simple_attr&&) = default;
75 
80  simple_attr(ns_name ns, string_type const& prefix, attribute_name name, string_type const& val = string_type())
81  : m_namespace_uri(ns)
82  , m_prefix(prefix)
83  , m_local_name(name)
84  , m_value(val)
85  {
86  }
87 
92  simple_attr(ns_name ns, string_type const& prefix, string_type const& name, string_type const& val = string_type())
93  : m_namespace_uri(ns)
94  , m_prefix(prefix)
95  , m_local_name(name)
96  , m_value(val)
97  {
98  }
99 
100  simple_attr(attribute_name name, string_type const& val = string_type())
101  : m_namespace_uri(static_cast<ns_name>(0))
102  , m_prefix()
103  , m_local_name(name)
104  , m_value(val)
105  {
106  }
107 
108  simple_attr(string_type const& name, string_type const& val = string_type())
109  : m_namespace_uri(static_cast<ns_name>(0))
110  , m_prefix()
111  , m_local_name(name)
112  , m_value(val)
113  {
114  }
115 
116  simple_attr& operator=(simple_attr const& rhs) = default;
117  simple_attr& operator=(simple_attr&& rhs) = default;
118 
119  string_type namespace_uri() const { return static_cast<string_type>(m_namespace_uri); }
120 
121  void namespace_uri(string_type const& uri) { m_namespace_uri = uri; }
122 
123  ns_name namespace_uri_name() const { return m_namespace_uri; }
124 
125  void namespace_uri_name(ns_name uri) { m_namespace_uri = uri; }
126 
127  string_type const& prefix() const { return m_prefix; }
128 
129  void prefix(string_type const& s) { m_prefix = s; }
130 
131  string_type local_name() const { return static_cast<string_type>(m_local_name); }
132 
133  void local_name(string_type const& name) { m_local_name = name; }
134 
135  attribute_name local_name_name() const { return m_local_name; }
136 
137  void local_name_name(attribute_name name) { m_local_name = name; }
138 
139  string_type qualified_name() const
140  {
141  string_type s = prefix();
142  if (!s.empty()) wordring::to_string(U':', std::back_inserter(s));
143  s.append(local_name());
144 
145  return s;
146  }
147 
148  string_type const& value() const { return m_value; }
149 
150  void value(string_type const& s) { m_value = s; }
151 
152  protected:
153  namespace_uri_type m_namespace_uri;
154  string_type m_prefix;
155  local_name_type m_local_name;
156 
157  string_type m_value;
158  };
159 
160  static_assert(std::is_copy_constructible_v<simple_attr<std::u32string>>);
161  static_assert(std::is_copy_assignable_v<simple_attr<std::u32string>>);
162 
167  template <typename String1>
168  inline bool operator==(simple_attr<String1> const& lhs, simple_attr<String1> const& rhs)
169  {
170  return lhs.m_namespace_uri == rhs.m_namespace_uri
171  && lhs.m_prefix == rhs.m_prefix
172  && lhs.m_local_name == rhs.m_local_name;
173  }
174 
175  template <typename String1>
176  inline bool operator==(simple_attr<String1> const& lhs, attribute_name local_name)
177  {
178  return lhs == simple_attr<String1>(local_name);
179  }
180 
181  template <typename String1>
182  inline bool operator==(attribute_name local_name, simple_attr<String1> const& rhs)
183  {
184  return simple_attr<String1>(local_name) == rhs;
185  }
186 
187  template <typename String1>
188  inline bool operator==(simple_attr<String1> const& lhs, String1 const& local_name)
189  {
190  return lhs == simple_attr<String1>(local_name);
191  }
192 
193  template <typename String1>
194  inline bool operator==(String1 const& local_name, simple_attr<String1> const& rhs)
195  {
196  return simple_attr<String1>(local_name) == rhs;
197  }
198 
199  template <typename String1>
200  inline bool operator!=(simple_attr<String1> const& lhs, simple_attr<String1> const& rhs)
201  {
202  return !(lhs == rhs);
203  }
204 
205  template <typename String1>
206  inline bool operator!=(simple_attr<String1> const& lhs, attribute_name local_name)
207  {
208  return !(lhs == local_name);
209  }
210 
211  template <typename String1>
212  inline bool operator!=(attribute_name local_name, simple_attr<String1> const& rhs)
213  {
214  return !(local_name == rhs);
215  }
216 
217  template <typename String1>
218  inline bool operator!=(simple_attr<String1> const& lhs, String1 const& local_name)
219  {
220  return !(lhs == local_name);
221  }
222 
223  template <typename String1>
224  inline bool operator!=(String1 const& local_name, simple_attr<String1> const& rhs)
225  {
226  return !(local_name == rhs);
227  }
228 
229  // --------------------------------------------------------------------------------------------
230  // 文書
231  // --------------------------------------------------------------------------------------------
232 
237  template <typename String>
239  {
240  template <typename String1>
242 
243  template <typename String1>
244  friend bool operator!=(simple_document<String1> const&, simple_document<String1> const&);
245 
246  public:
247  using string_type = String;
248 
249  public:
251  : m_document_type(document_type_name::Html)
252  , m_document_mode(document_mode_name::NoQuirks)
253  {
254  }
255 
256  simple_document(simple_document const&) = default;
257  simple_document(simple_document&&) = default;
258 
259  simple_document& operator=(simple_document const&) = default;
260  simple_document& operator=(simple_document&&) = default;
261 
262  document_type_name document_type() const { return m_document_type; }
263 
264  void document_type(document_type_name type)
265  {
266  m_document_type = type;
267  }
268 
269  document_mode_name document_mode() const { return m_document_mode; }
270 
271  void document_mode(document_mode_name mode)
272  {
273  m_document_mode = mode;
274  }
275 
276  protected:
277  document_type_name m_document_type;
278  document_mode_name m_document_mode;
279  };
280 
281  static_assert(std::is_copy_constructible_v<simple_document<std::u32string>>);
282  static_assert(std::is_copy_assignable_v<simple_document<std::u32string>>);
283 
284  template <typename String1>
286  {
287  assert(false);
288  return false;
289  }
290 
291  template <typename String1>
292  inline bool operator!=(simple_document<String1> const& lhs, simple_document<String1> const& rhs)
293  {
294  return !(lhs == rhs);
295  }
296 
297  // --------------------------------------------------------------------------------------------
298  // 文書型
299  // --------------------------------------------------------------------------------------------
300 
305  template <typename String>
307  {
308  template <typename String1>
310 
311  template <typename String1>
312  friend bool operator!=(simple_document_type<String1> const&, simple_document_type<String1> const&);
313 
314  public:
315  using string_type = String;
316 
317  public:
318  simple_document_type(string_type const& name, string_type const& public_id, string_type const& system_id)
319  : m_name(name)
320  , m_public_id(public_id)
321  , m_system_id(system_id)
322  {
323  }
324 
325  string_type const& name() const { return m_name; }
326 
327  void name(string_type const& s) { m_name = s; }
328 
329  string_type const& public_id() const { return m_public_id; }
330 
331  void public_id(string_type const& s) { m_public_id = s; }
332 
333  string_type const& system_id() const { return m_system_id; }
334 
335  void system_id(string_type const& s) { m_system_id = s; }
336 
337  protected:
338  string_type m_name;
339  string_type m_public_id;
340  string_type m_system_id;
341  };
342 
343  static_assert(std::is_copy_constructible_v<simple_document_type<std::u32string>>);
344  static_assert(std::is_copy_assignable_v<simple_document_type<std::u32string>>);
345 
346  template <typename String1>
348  {
349  assert(false);
350  return false;
351  }
352 
353  template <typename String1>
354  inline bool operator!=(simple_document_type<String1> const& lhs, simple_document_type<String1> const& rhs)
355  {
356  return !(lhs == rhs);
357  }
358 
359  // --------------------------------------------------------------------------------------------
360  // 文書片
361  // --------------------------------------------------------------------------------------------
362 
367  template <typename String>
369  {
370  template <typename String1>
372 
373  template <typename String1>
374  friend bool operator!=(simple_document_fragment<String1> const&, simple_document_fragment<String1> const&);
375 
376  public:
377  using string_type = String;
378  };
379 
380  static_assert(std::is_copy_constructible_v<simple_document_fragment<std::u32string>>);
381  static_assert(std::is_copy_assignable_v<simple_document_fragment<std::u32string>>);
382 
383  template <typename String1>
385  {
386  assert(false);
387  return false;
388  }
389 
390  template <typename String1>
391  inline bool operator!=(simple_document_fragment<String1> const& lhs, simple_document_fragment<String1> const& rhs)
392  {
393  return !(lhs == rhs);
394  }
395 
396  // --------------------------------------------------------------------------------------------
397  // 要素
398  // --------------------------------------------------------------------------------------------
399 
404  template <typename String>
406  {
407  template <typename String1>
408  friend bool operator==(simple_element<String1> const&, simple_element<String1> const&);
409 
410  template <typename String1>
411  friend bool operator!=(simple_element<String1> const&, simple_element<String1> const&);
412 
413  public:
414  using string_type = String;
415 
418 
420  using container = std::vector<attribute_type>;
421  using iterator = typename container::iterator;
422  using const_iterator = typename container::const_iterator;
423 
424  public:
426  : m_namespace_uri(static_cast<ns_name>(0))
427  , m_namespace_prefix()
428  , m_local_name(static_cast<tag_name>(0))
429  , m_attributes()
430  {
431  }
432 
433  simple_element(string_type const& ns, string_type const& prefix, string_type const& name)
434  : m_namespace_uri(ns)
435  , m_namespace_prefix(prefix)
436  , m_local_name(name)
437  , m_attributes()
438  {
439  }
440 
441  simple_element(ns_name ns, string_type const& prefix, string_type const& name)
442  : m_namespace_uri(ns)
443  , m_namespace_prefix(prefix)
444  , m_local_name(name)
445  , m_attributes()
446  {
447  }
448 
449  simple_element(ns_name ns, string_type const& prefix, tag_name name)
450  : m_namespace_uri(ns)
451  , m_namespace_prefix(prefix)
452  , m_local_name(name)
453  , m_attributes()
454  {
455  }
456 
457  simple_element(string_type const& name)
458  : m_namespace_uri(ns_name::HTML)
459  , m_namespace_prefix()
460  , m_local_name(name)
461  , m_attributes()
462  {
463  }
464 
465  simple_element(tag_name name)
466  : m_namespace_uri(ns_name::HTML)
467  , m_namespace_prefix()
468  , m_local_name(name)
469  , m_attributes()
470  {
471  }
472 
477  string_type namespace_uri() const { return static_cast<string_type>(m_namespace_uri); }
478 
479  void namespace_uri(string_type const& uri) { m_namespace_uri = uri; }
480 
481  ns_name namespace_uri_name() const { return m_namespace_uri; }
482 
483  void namespace_uri_name(ns_name ns) { m_namespace_uri = ns; }
484 
485  string_type namespace_prefix() const { return m_namespace_prefix; }
486 
487  void namespace_prefix(string_type const& prefix) { m_namespace_prefix = prefix; }
488 
489  string_type local_name() const { return static_cast<string_type>(m_local_name); }
490 
491  void local_name(string_type const& name) { m_local_name = name; }
492 
493  tag_name local_name_name() const { return m_local_name; }
494 
495  void local_name_name(tag_name name) { m_local_name = name; }
496 
497  string_type qualified_name() const
498  {
499  string_type s = namespace_prefix();
500  if (!s.empty()) wordring::to_string(U':', std::back_inserter(s));
501  s.append(local_name());
502 
503  return s;
504  }
505 
506  // 属性
507  void push_back(attribute_type const& attr) { m_attributes.push_back(std::move(attr)); }
508 
509  iterator begin() { return m_attributes.begin(); }
510 
511  const_iterator begin() const { return m_attributes.begin(); }
512 
513  iterator end() { return m_attributes.end(); }
514 
515  const_iterator end() const { return m_attributes.end(); }
516 
519  const_iterator find(attribute_type const& attr) const
520  {
521  return std::find(m_attributes.begin(), m_attributes.end(), attr);
522  }
523 
526  const_iterator find(ns_name ns, string_type const& prefix, string_type const& name) const
527  {
528  return std::find_if(m_attributes.begin(), m_attributes.end(), [&](attribute_type const& a)->bool {
529  return a == attribute_type(ns, prefix, name); });
530  }
531 
534  const_iterator find(ns_name ns, string_type const& prefix, attribute_name name) const
535  {
536  return std::find_if(m_attributes.begin(), m_attributes.end(), [&](attribute_type const& a)->bool {
537  return a == attribute_type(ns, prefix, name); });
538  }
539 
542  const_iterator find(string_type const& name) const
543  {
544  return find(static_cast<ns_name>(0), string_type(), name);
545  }
546 
549  const_iterator find(attribute_name name) const
550  {
551  return find(static_cast<ns_name>(0), string_type(), name);
552  }
553 
554  private:
555  namespace_uri_type m_namespace_uri;
556  string_type m_namespace_prefix;
557  local_name_type m_local_name;
558 
559  container m_attributes;
560  };
561 
562  static_assert(std::is_copy_constructible_v<simple_element<std::u32string>>);
563  static_assert(std::is_copy_assignable_v<simple_element<std::u32string>>);
564 
565  template <typename String1>
566  inline bool operator==(simple_element<String1> const& lhs, simple_element<String1> const& rhs)
567  {
568  using attribute_type = typename simple_element<String1>::attribute_type;
569 
570  if (lhs.m_attributes.size() != rhs.m_attributes.size()) return false;
571 
572  for (attribute_type const& a : lhs.m_attributes)
573  {
574  if (std::find(rhs.m_attributes.begin(), rhs.m_attributes.end(), a) == rhs.m_attributes.end()) return false;
575  }
576 
577  return true;
578  }
579 
580  template <typename String1>
581  inline bool operator!=(simple_element<String1> const& lhs, simple_element<String1> const& rhs)
582  {
583  return !(lhs == rhs);
584  }
585 
586  // --------------------------------------------------------------------------------------------
587  // テキスト
588  // --------------------------------------------------------------------------------------------
589 
594  template <typename String>
596  {
597  template <typename String1>
598  friend bool operator==(simple_text<String1> const&, simple_text<String1> const&);
599 
600  template <typename String1>
601  friend bool operator!=(simple_text<String1> const&, simple_text<String1> const&);
602 
603  public:
604  using string_type = String;
605  using value_type = typename string_type::value_type;
606 
607  public:
608  simple_text() = default;
609 
610  simple_text(string_type const& s)
611  : m_data(s)
612  {
613  }
614 
615  string_type const& data() const { return m_data; }
616 
617  /*
618  * 文字列の編集はあらゆる方法で行われるため、生バッファを編集可能に公開する必要が有る。
619  */
620  string_type& data() { return m_data; }
621 
622  void data(string_type const& s) { m_data = s; }
623 
626  void push_back(value_type ch) { m_data.push_back(ch); }
627 
628  protected:
629  string_type m_data;
630  };
631 
632  static_assert(std::is_copy_constructible_v<simple_text<std::u32string>>);
633  static_assert(std::is_copy_assignable_v<simple_text<std::u32string>>);
634 
635  template <typename String1>
636  inline bool operator==(simple_text<String1> const&, simple_text<String1> const&)
637  {
638  assert(false);
639  return false;
640  }
641 
642  template <typename String1>
643  inline bool operator!=(simple_text<String1> const& lhs, simple_text<String1> const& rhs)
644  {
645  return !(lhs == rhs);
646  }
647 
648  // ---------------------------------------------------------------------------------------------
649  // 処理命令
650  // ---------------------------------------------------------------------------------------------
651 
656  template <typename String>
658  {
659  template <typename String1>
661 
662  template <typename String1>
664 
665  public:
666  using string_type = String;
667 
668  public:
669  string_type const& data() const { return m_data; }
670 
671  string_type& data() { return m_data; }
672 
673  void data(string_type const& s) { m_data = s; }
674 
675  void data(string_type&& s) { m_data = std::move(s); }
676 
677  string_type const& target() const { return m_target; }
678 
679  string_type& target() { return m_target; }
680 
681  void target(string_type const& s) { m_target = s; }
682 
683  void target(string_type&& s) { m_target = std::move(s); }
684 
685  protected:
686  string_type m_data;
687  string_type m_target;
688  };
689 
690  static_assert(std::is_copy_constructible_v<simple_processing_instruction<std::u32string>>);
691  static_assert(std::is_copy_assignable_v<simple_processing_instruction<std::u32string>>);
692 
693  template <typename String1>
695  {
696  assert(false);
697  return false;
698  }
699 
700  template <typename String1>
701  inline bool operator!=(simple_processing_instruction<String1> const& lhs, simple_processing_instruction<String1> const& rhs)
702  {
703  return !(lhs == rhs);
704  }
705 
706  // ---------------------------------------------------------------------------------------------
707  // コメント
708  // ---------------------------------------------------------------------------------------------
709 
714  template <typename String>
716  {
717  template <typename String1>
718  friend bool operator==(simple_comment<String1> const&, simple_comment<String1> const&);
719 
720  template <typename String1>
721  friend bool operator!=(simple_comment<String1> const&, simple_comment<String1> const&);
722 
723  public:
724  using string_type = String;
725 
726  public:
728  {
729  }
730 
731  simple_comment(string_type const& s)
732  : m_data(s)
733  {
734  }
735 
736  simple_comment(string_type&& s)
737  : m_data(std::move(s))
738  {
739  }
740 
741  string_type const& data() const { return m_data; }
742 
743  string_type& data() { return m_data; }
744 
745  void data(string_type const& s) { m_data = s; }
746 
747  void data(string_type&& s) { m_data = std::move(s); }
748 
749  protected:
750  string_type m_data;
751  };
752 
753  static_assert(std::is_copy_constructible_v<simple_comment<std::u32string>>);
754  static_assert(std::is_copy_assignable_v<simple_comment<std::u32string>>);
755 
756  template <typename String1>
758  {
759  assert(false);
760  return false;
761  }
762 
763  template <typename String1>
764  inline bool operator!=(simple_comment<String1> const& lhs, simple_comment<String1> const& rhs)
765  {
766  return !(lhs == rhs);
767  }
768 
769  // ---------------------------------------------------------------------------------------------
770  // ノード
771  // ---------------------------------------------------------------------------------------------
772 
773 
774  template <typename String>
776  {
777  template <typename String1>
778  friend bool operator==(simple_node<String1> const lhs, simple_node<String1> const& rhs);
779 
780  template <typename String1>
781  friend bool operator!=(simple_node<String1> const lhs, simple_node<String1> const& rhs);
782 
783  public:
784  using string_type = std::remove_cv_t<String>;
785 
793 
795  using attribute_iterator = typename element_type::iterator;
796  using const_attribute_iterator = typename element_type::const_iterator;
797 
800  using value_type = std::variant<
801  element_type, // 0
802  text_type, // 1
804  comment_type, // 3
805  document_type, // 4
806  document_type_type, // 5
808  >;
809 
824  enum class type_name : std::uint32_t
825  {
826  Element = 1,
827  Text = 3,
828  ProcessingInstruction = 7,
829  Comment = 8,
830  Document = 9,
831  DocumentType = 10,
832  DocumentFragment = 11,
833  };
834 
835  public:
836  simple_node() = default;
837  simple_node(simple_node const&) = default;
838  simple_node(simple_node&&) = default;
839 
840  simple_node(element_type const& val) : m_value(val) {}
841  simple_node(element_type && val) : m_value(std::move(val)) {}
842 
843  simple_node(text_type const& val) : m_value(val) {}
844  simple_node(text_type && val) : m_value(std::move(val)) {}
845 
846  simple_node(processing_instruction_type const& val) : m_value(val) {}
847  simple_node(processing_instruction_type && val) : m_value(std::move(val)) {}
848 
849  simple_node(comment_type const& val) : m_value(val) {}
850  simple_node(comment_type && val) : m_value(std::move(val)) {}
851 
852  simple_node(document_type const& val) : m_value(val) {}
853  simple_node(document_type && val) : m_value(std::move(val)) {}
854 
855  simple_node(document_type_type const& val) : m_value(val) {}
856  simple_node(document_type_type && val) : m_value(std::move(val)) {}
857 
858  simple_node(document_fragment_type const& val) : m_value(val) {}
859  simple_node(document_fragment_type && val) : m_value(std::move(val)) {}
860 
861  simple_node& operator=(simple_node const& rhs) = default;
862  simple_node& operator=(simple_node&& rhs) = default;
863 
864  type_name type() const
865  {
866  switch (m_value.index())
867  {
868  case 0: return type_name::Element;
869  case 1: return type_name::Text;
870  case 2: return type_name::ProcessingInstruction;
871  case 3: return type_name::Comment;
872  case 4: return type_name::Document;
873  case 5: return type_name::DocumentType;
874  case 6: return type_name::DocumentFragment;
875  default:
876  break;
877  }
878 
879  return static_cast<type_name>(0);
880  }
881 
882  bool is_element() const { return std::holds_alternative<element_type>(m_value); }
883  bool is_text() const { return std::holds_alternative<text_type>(m_value); }
884  bool is_processing_instruction() const { return std::holds_alternative<processing_instruction_type>(m_value); }
885  bool is_comment() const { return std::holds_alternative<comment_type>(m_value); }
886  bool is_document() const { return std::holds_alternative<document_type>(m_value); }
887  bool is_document_type() const { return std::holds_alternative<document_type_type>(m_value); }
888 
891  ns_name namespace_uri_name() const
892  {
893  if (is_element()) return std::get_if<element_type>(&m_value)->namespace_uri_name();
894  assert(false);
895  return static_cast<ns_name>(0);
896  }
897 
900  string_type namespace_uri() const
901  {
902  if (is_element()) return std::get_if<element_type>(&m_value)->namespace_uri();
903  assert(false);
904  return m_string;
905  }
906 
909  tag_name local_name_name() const
910  {
911  if (is_element()) return std::get_if<element_type>(&m_value)->local_name_name();
912  assert(false);
913  return static_cast<tag_name>(0);
914  }
915 
918  string_type local_name() const
919  {
920  if (is_element()) return std::get_if<element_type>(&m_value)->local_name();
921  assert(false);
922  return m_string;
923  }
924 
925  string_type qualified_name() const
926  {
927  if (is_element()) return std::get_if<element_type>(&m_value)->qualified_name();
928  assert(false);
929  return m_string;
930  }
931 
934  attribute_iterator begin()
935  {
936  if (is_element()) return std::get_if<element_type>(&m_value)->begin();
937  assert(false);
938  return attribute_iterator();
939  }
940 
943  const_attribute_iterator begin() const
944  {
945  if (is_element()) return std::get_if<element_type>(&m_value)->begin();
946  assert(false);
947  return attribute_iterator();
948  }
949 
952  attribute_iterator end()
953  {
954  if (is_element()) return std::get_if<element_type>(&m_value)->end();
955  assert(false);
956  return attribute_iterator();
957  }
958 
961  const_attribute_iterator end() const
962  {
963  if (is_element()) return std::get_if<element_type>(&m_value)->end();
964  assert(false);
965  return attribute_iterator();
966  }
967 
980  const_attribute_iterator find(ns_name ns, string_type const& prefix, string_type const& name) const
981  {
982  return std::find_if(begin(), end(), [&](attribute_type const& a)->bool {
983  return a == attribute_type(ns, prefix, name); });
984  }
985 
996  const_attribute_iterator find(string_type const& name) const
997  {
998  return find(static_cast<ns_name>(0), string_type(), name);
999  }
1000 
1011  const_attribute_iterator find(attribute_name name) const
1012  {
1013  return std::find_if(begin(), end(), [&](attribute_type const& a)->bool {
1014  return a == attribute_type(static_cast<ns_name>(0), string_type(), name); });
1015  }
1016 
1017  bool contains(ns_name ns, string_type const& prefix, string_type const& name)
1018  {
1019  const_attribute_iterator it = std::find_if(begin(), end(), [&](attribute_type const& a)->bool {
1020  return a == attribute_type(ns, prefix, name); });
1021 
1022  return it != end();
1023  }
1024 
1028  {
1029  if (is_element()) std::get_if<element_type>(&m_value)->push_back(std::move(attr));
1030  else assert(false);
1031  }
1032 
1033  wordring::html::document_type_name document_type_name() const
1034  {
1035  if (is_document()) return std::get_if<document_type>(&m_value)->document_type();
1036  assert(false);
1037  return static_cast<wordring::html::document_type_name>(0);
1038  }
1039 
1044  void document_type_name(wordring::html::document_type_name type)
1045  {
1046  if (is_document()) std::get_if<document_type>(&m_value)->document_type(type);
1047  else assert(false);
1048  }
1049 
1051  {
1052  if (is_document()) return std::get_if<document_type>(&m_value)->document_mode();
1053  assert(false);
1054  return static_cast<wordring::html::document_mode_name>(0);
1055  }
1056 
1062  {
1063  if (is_document()) std::get_if<document_type>(&m_value)->document_mode(mode);
1064  else assert(false);
1065  }
1066 
1069  string_type const& data() const
1070  {
1071  switch (type())
1072  {
1073  case type_name::Text:
1074  return std::get_if<text_type>(&m_value)->data();
1075  case type_name::Comment:
1076  return std::get_if<comment_type>(&m_value)->data();
1077  case type_name::ProcessingInstruction:
1078  return std::get_if<processing_instruction_type>(&m_value)->data();
1079  default:
1080  break;
1081  }
1082  assert(false);
1083  return m_string;
1084  }
1085 
1097  string_type& data()
1098  {
1099  switch (type())
1100  {
1101  case type_name::Text:
1102  return std::get_if<text_type>(&m_value)->data();
1103  case type_name::Comment:
1104  return std::get_if<comment_type>(&m_value)->data();
1105  case type_name::ProcessingInstruction:
1106  return std::get_if<processing_instruction_type>(&m_value)->data();
1107  default:
1108  break;
1109  }
1110  assert(false);
1111  return m_string;
1112  }
1113 
1114  string_type const& target() const
1115  {
1116  if (is_processing_instruction()) return std::get_if<processing_instruction_type>(&m_value)->target();
1117  assert(false);
1118  return m_string;
1119  }
1120 
1121  string_type const& name() const
1122  {
1123  if (is_document_type()) return std::get_if<document_type_type>(&m_value)->name();
1124  assert(false);
1125  return m_string;
1126  }
1127 
1128  private:
1129  value_type m_value;
1130  string_type m_string;
1131  };
1132 
1133  static_assert(std::is_copy_constructible_v<simple_node<std::u32string>>);
1134  static_assert(std::is_copy_assignable_v<simple_node<std::u32string>>);
1135 
1136  template <typename String1>
1137  inline bool operator==(simple_node<String1> const lhs, simple_node<String1> const& rhs)
1138  {
1139  return lhs.m_value == rhs.m_value;
1140  }
1141 
1142  template <typename String1>
1143  inline bool operator!=(simple_node<String1> const lhs, simple_node<String1> const& rhs)
1144  {
1145  return !(lhs == rhs);
1146  }
1147 }
wordring::html::simple_document
simple_html 用の Document ノード
Definition: simple_node.hpp:238
wordring::html::simple_element::find
const_iterator find(ns_name ns, string_type const &prefix, string_type const &name) const
属性を検索する
Definition: simple_node.hpp:526
wordring::html::simple_document_type
simple_html 用の DocumentType ノード
Definition: simple_node.hpp:306
wordring::html::simple_node::find
const_attribute_iterator find(attribute_name name) const
属性を検索する
Definition: simple_node.hpp:1011
wordring::html::simple_text
simple_html 用の Text ノード
Definition: simple_node.hpp:595
wordring::html::simple_element::find
const_iterator find(attribute_name name) const
属性を検索する
Definition: simple_node.hpp:549
wordring::html::simple_node::local_name
string_type local_name() const
要素のローカル名を返す
Definition: simple_node.hpp:918
wordring::html::simple_node::value_type
std::variant< element_type, text_type, processing_instruction_type, comment_type, document_type, document_type_type, document_fragment_type > value_type
HTML のノードに相当する共用体
Definition: simple_node.hpp:808
wordring::html::simple_attr::operator==
friend bool operator==(simple_attr< String1 > const &, simple_attr< String1 > const &)
名前空間、接頭辞、ローカル名が一致する場合、true を返す
Definition: simple_node.hpp:168
wordring::html::simple_node::namespace_uri
string_type namespace_uri() const
要素の名前空間を返す
Definition: simple_node.hpp:900
wordring::html::simple_node::push_back
void push_back(attribute_type &&attr)
属性を追加する
Definition: simple_node.hpp:1027
wordring::html::simple_element
simple_html 用の Element ノード
Definition: simple_node.hpp:405
wordring::html::simple_node::end
attribute_iterator end()
属性の終端を返す
Definition: simple_node.hpp:952
wordring::html::simple_attr::simple_attr
simple_attr(ns_name ns, string_type const &prefix, string_type const &name, string_type const &val=string_type())
名前空間付き属性を構築する
Definition: simple_node.hpp:92
wordring::html::simple_node::begin
const_attribute_iterator begin() const
属性の開始を返す
Definition: simple_node.hpp:943
wordring::html::simple_node::local_name_name
tag_name local_name_name() const
要素のローカル名を返す
Definition: simple_node.hpp:909
wordring::html::simple_node::find
const_attribute_iterator find(ns_name ns, string_type const &prefix, string_type const &name) const
属性を検索する
Definition: simple_node.hpp:980
wordring::html::simple_processing_instruction
simple_html 用の ProcessingInstruction ノード
Definition: simple_node.hpp:657
wordring::html::simple_element::namespace_uri
string_type namespace_uri() const
名前空間 URI を返す
Definition: simple_node.hpp:477
wordring::html::simple_text::push_back
void push_back(value_type ch)
Definition: simple_node.hpp:626
wordring::html::simple_node::namespace_uri_name
ns_name namespace_uri_name() const
要素の名前空間 URI を返す
Definition: simple_node.hpp:891
wordring::html::simple_node::document_mode_name
void document_mode_name(wordring::html::document_mode_name mode)
文書ノードに文書モードを設定する
Definition: simple_node.hpp:1061
wordring::html::simple_node::find
const_attribute_iterator find(string_type const &name) const
属性を検索する
Definition: simple_node.hpp:996
wordring::html::simple_comment
simple_html 用の コメント ノード
Definition: simple_node.hpp:715
wordring::html::simple_document_fragment
simple_html 用の DocumentFragment ノード
Definition: simple_node.hpp:368
wordring::html
wordring::whatwg::html::basic_html_atom
列挙体と文字列の相互変換を行うクラス
Definition: whatwg/html/html_atom.hpp:28
wordring::html::simple_node::document_type_name
void document_type_name(wordring::html::document_type_name type)
文書ノードに文書形式を設定する
Definition: simple_node.hpp:1044
wordring::whatwg::html::document_mode_name
document_mode_name
Definition: whatwg/html/html_defs.hpp:28
wordring::html::simple_node
Definition: simple_node.hpp:775
wordring::html::simple_element::find
const_iterator find(ns_name ns, string_type const &prefix, attribute_name name) const
属性を検索する
Definition: simple_node.hpp:534
wordring::html::simple_element::find
const_iterator find(string_type const &name) const
属性を検索する
Definition: simple_node.hpp:542
wordring::html::simple_node::data
string_type & data()
ノードの文字列データを参照する
Definition: simple_node.hpp:1097
wordring::html::simple_attr::simple_attr
simple_attr(ns_name ns, string_type const &prefix, attribute_name name, string_type const &val=string_type())
名前空間付き属性を構築する
Definition: simple_node.hpp:80
wordring::html::simple_node::type_name
type_name
ノードの型名を示す列挙体
Definition: simple_node.hpp:824
wordring::html::simple_node::data
string_type const & data() const
ノードの文字列データを参照する
Definition: simple_node.hpp:1069
wordring::html::simple_attr
simple_html 用の属性ノード
Definition: simple_node.hpp:26
wordring::html::operator==
bool operator==(simple_attr< String1 > const &lhs, simple_attr< String1 > const &rhs)
名前空間、接頭辞、ローカル名が一致する場合、true を返す
Definition: simple_node.hpp:168
wordring::html::simple_node::end
const_attribute_iterator end() const
属性の終端を返す
Definition: simple_node.hpp:961
wordring::html::simple_element::find
const_iterator find(attribute_type const &attr) const
属性を検索する
Definition: simple_node.hpp:519
wordring::html::simple_node::begin
attribute_iterator begin()
属性の開始を返す
Definition: simple_node.hpp:934