@@ -5,15 +5,16 @@ use html5ever::interface::TreeSink;
55use html5ever:: {
66 Attribute , ExpandedName , QualName ,
77 tendril:: StrTendril ,
8- tree_builder:: { ElementFlags , NextParserState , NodeOrText , QuirksMode } ,
8+ tree_builder:: { ElementFlags , NodeOrText , QuirksMode } ,
99} ;
1010use markup5ever_rcdom:: { Handle , RcDom } ;
1111use std:: borrow:: Cow ;
12+ use std:: cell:: Cell ;
1213use std:: io;
1314
1415pub struct RcDomWithLineNumbers {
1516 dom : RcDom ,
16- current_line : u64 ,
17+ current_line : Cell < u64 > ,
1718}
1819
1920impl RcDomWithLineNumbers {
@@ -23,10 +24,11 @@ impl RcDomWithLineNumbers {
2324 }
2425
2526 pub fn create_error_from_parse_errors ( & self ) -> io:: Result < ( ) > {
26- if !self . dom . errors . is_empty ( ) {
27+ if !self . dom . errors . borrow ( ) . is_empty ( ) {
2728 let error_messages = self
2829 . dom
2930 . errors
31+ . borrow ( )
3032 . iter ( )
3133 . map ( |e| e. to_string ( ) )
3234 . collect :: < Vec < String > > ( )
@@ -45,7 +47,7 @@ impl Default for RcDomWithLineNumbers {
4547 fn default ( ) -> Self {
4648 Self {
4749 dom : RcDom :: default ( ) ,
48- current_line : 1 ,
50+ current_line : Cell :: new ( 1 ) ,
4951 }
5052 }
5153}
@@ -54,15 +56,17 @@ impl TreeSink for RcDomWithLineNumbers {
5456 type Output = RcDomWithLineNumbers ;
5557 type Handle = <RcDom as TreeSink >:: Handle ;
5658
59+ type ElemName < ' a > = <RcDom as TreeSink >:: ElemName < ' a > ;
60+
5761 // Override the parse_error method to add line numbers to the error messages.
58- fn parse_error ( & mut self , msg : Cow < ' static , str > ) {
59- let msg_with_line = format ! ( "Line {}: {}" , self . current_line, msg) ;
62+ fn parse_error ( & self , msg : Cow < ' static , str > ) {
63+ let msg_with_line = format ! ( "Line {}: {}" , self . current_line. get ( ) , msg) ;
6064 self . dom . parse_error ( Cow :: Owned ( msg_with_line) ) ;
6165 }
6266
6367 // Override to track the current line number.
64- fn set_current_line ( & mut self , line : u64 ) {
65- self . current_line = line;
68+ fn set_current_line ( & self , line : u64 ) {
69+ self . current_line . set ( line) ;
6670 }
6771
6872 // Override to return RcDomWithLineNumbers instead of RcDom.
@@ -73,69 +77,67 @@ impl TreeSink for RcDomWithLineNumbers {
7377 // Delegate all other methods to RcDom.
7478 delegate ! {
7579 to self . dom {
76- fn get_document( & mut self ) -> Self :: Handle ;
80+ fn get_document( & self ) -> Self :: Handle ;
7781
7882 fn elem_name<' a>( & ' a self , target: & ' a Self :: Handle ) -> ExpandedName <' a>;
7983
8084 fn create_element(
81- & mut self ,
85+ & self ,
8286 name: QualName ,
8387 attrs: Vec <Attribute >,
8488 flags: ElementFlags ,
8589 ) -> Self :: Handle ;
8690
87- fn create_comment( & mut self , text: StrTendril ) -> Self :: Handle ;
91+ fn create_comment( & self , text: StrTendril ) -> Self :: Handle ;
8892
89- fn create_pi( & mut self , target: StrTendril , data: StrTendril ) -> Self :: Handle ;
93+ fn create_pi( & self , target: StrTendril , data: StrTendril ) -> Self :: Handle ;
9094
91- fn append( & mut self , parent: & Self :: Handle , child: NodeOrText <Self :: Handle >) ;
95+ fn append( & self , parent: & Self :: Handle , child: NodeOrText <Self :: Handle >) ;
9296
9397 fn append_based_on_parent_node(
94- & mut self ,
98+ & self ,
9599 element: & Self :: Handle ,
96100 prev_element: & Self :: Handle ,
97101 child: NodeOrText <Self :: Handle >,
98102 ) ;
99103
100104 fn append_doctype_to_document(
101- & mut self ,
105+ & self ,
102106 name: StrTendril ,
103107 public_id: StrTendril ,
104108 system_id: StrTendril ,
105109 ) ;
106110
107- fn mark_script_already_started( & mut self , node: & Self :: Handle ) ;
111+ fn mark_script_already_started( & self , node: & Self :: Handle ) ;
108112
109- fn pop( & mut self , node: & Self :: Handle ) ;
113+ fn pop( & self , node: & Self :: Handle ) ;
110114
111- fn get_template_contents( & mut self , target: & Self :: Handle ) -> Self :: Handle ;
115+ fn get_template_contents( & self , target: & Self :: Handle ) -> Self :: Handle ;
112116
113117 fn same_node( & self , x: & Self :: Handle , y: & Self :: Handle ) -> bool ;
114118
115- fn set_quirks_mode( & mut self , mode: QuirksMode ) ;
119+ fn set_quirks_mode( & self , mode: QuirksMode ) ;
116120
117121 fn append_before_sibling(
118- & mut self ,
122+ & self ,
119123 sibling: & Self :: Handle ,
120124 new_node: NodeOrText <Self :: Handle >,
121125 ) ;
122126
123- fn add_attrs_if_missing( & mut self , target: & Self :: Handle , attrs: Vec <Attribute >) ;
127+ fn add_attrs_if_missing( & self , target: & Self :: Handle , attrs: Vec <Attribute >) ;
124128
125129 fn associate_with_form(
126- & mut self ,
130+ & self ,
127131 target: & Self :: Handle ,
128132 form: & Self :: Handle ,
129133 nodes: ( & Self :: Handle , Option <& Self :: Handle >) ,
130134 ) ;
131135
132- fn remove_from_parent( & mut self , target: & Self :: Handle ) ;
136+ fn remove_from_parent( & self , target: & Self :: Handle ) ;
133137
134- fn reparent_children( & mut self , node: & Self :: Handle , new_parent: & Self :: Handle ) ;
138+ fn reparent_children( & self , node: & Self :: Handle , new_parent: & Self :: Handle ) ;
135139
136140 fn is_mathml_annotation_xml_integration_point( & self , handle: & Self :: Handle ) -> bool ;
137-
138- fn complete_script( & mut self , node: & Self :: Handle ) -> NextParserState ;
139141 }
140142 }
141143}
0 commit comments