@@ -5,15 +5,16 @@ use html5ever::interface::TreeSink;
5
5
use html5ever:: {
6
6
Attribute , ExpandedName , QualName ,
7
7
tendril:: StrTendril ,
8
- tree_builder:: { ElementFlags , NextParserState , NodeOrText , QuirksMode } ,
8
+ tree_builder:: { ElementFlags , NodeOrText , QuirksMode } ,
9
9
} ;
10
10
use markup5ever_rcdom:: { Handle , RcDom } ;
11
11
use std:: borrow:: Cow ;
12
+ use std:: cell:: Cell ;
12
13
use std:: io;
13
14
14
15
pub struct RcDomWithLineNumbers {
15
16
dom : RcDom ,
16
- current_line : u64 ,
17
+ current_line : Cell < u64 > ,
17
18
}
18
19
19
20
impl RcDomWithLineNumbers {
@@ -23,10 +24,11 @@ impl RcDomWithLineNumbers {
23
24
}
24
25
25
26
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 ( ) {
27
28
let error_messages = self
28
29
. dom
29
30
. errors
31
+ . borrow ( )
30
32
. iter ( )
31
33
. map ( |e| e. to_string ( ) )
32
34
. collect :: < Vec < String > > ( )
@@ -45,7 +47,7 @@ impl Default for RcDomWithLineNumbers {
45
47
fn default ( ) -> Self {
46
48
Self {
47
49
dom : RcDom :: default ( ) ,
48
- current_line : 1 ,
50
+ current_line : Cell :: new ( 1 ) ,
49
51
}
50
52
}
51
53
}
@@ -54,15 +56,17 @@ impl TreeSink for RcDomWithLineNumbers {
54
56
type Output = RcDomWithLineNumbers ;
55
57
type Handle = <RcDom as TreeSink >:: Handle ;
56
58
59
+ type ElemName < ' a > = <RcDom as TreeSink >:: ElemName < ' a > ;
60
+
57
61
// 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) ;
60
64
self . dom . parse_error ( Cow :: Owned ( msg_with_line) ) ;
61
65
}
62
66
63
67
// 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) ;
66
70
}
67
71
68
72
// Override to return RcDomWithLineNumbers instead of RcDom.
@@ -73,69 +77,67 @@ impl TreeSink for RcDomWithLineNumbers {
73
77
// Delegate all other methods to RcDom.
74
78
delegate ! {
75
79
to self . dom {
76
- fn get_document( & mut self ) -> Self :: Handle ;
80
+ fn get_document( & self ) -> Self :: Handle ;
77
81
78
82
fn elem_name<' a>( & ' a self , target: & ' a Self :: Handle ) -> ExpandedName <' a>;
79
83
80
84
fn create_element(
81
- & mut self ,
85
+ & self ,
82
86
name: QualName ,
83
87
attrs: Vec <Attribute >,
84
88
flags: ElementFlags ,
85
89
) -> Self :: Handle ;
86
90
87
- fn create_comment( & mut self , text: StrTendril ) -> Self :: Handle ;
91
+ fn create_comment( & self , text: StrTendril ) -> Self :: Handle ;
88
92
89
- fn create_pi( & mut self , target: StrTendril , data: StrTendril ) -> Self :: Handle ;
93
+ fn create_pi( & self , target: StrTendril , data: StrTendril ) -> Self :: Handle ;
90
94
91
- fn append( & mut self , parent: & Self :: Handle , child: NodeOrText <Self :: Handle >) ;
95
+ fn append( & self , parent: & Self :: Handle , child: NodeOrText <Self :: Handle >) ;
92
96
93
97
fn append_based_on_parent_node(
94
- & mut self ,
98
+ & self ,
95
99
element: & Self :: Handle ,
96
100
prev_element: & Self :: Handle ,
97
101
child: NodeOrText <Self :: Handle >,
98
102
) ;
99
103
100
104
fn append_doctype_to_document(
101
- & mut self ,
105
+ & self ,
102
106
name: StrTendril ,
103
107
public_id: StrTendril ,
104
108
system_id: StrTendril ,
105
109
) ;
106
110
107
- fn mark_script_already_started( & mut self , node: & Self :: Handle ) ;
111
+ fn mark_script_already_started( & self , node: & Self :: Handle ) ;
108
112
109
- fn pop( & mut self , node: & Self :: Handle ) ;
113
+ fn pop( & self , node: & Self :: Handle ) ;
110
114
111
- fn get_template_contents( & mut self , target: & Self :: Handle ) -> Self :: Handle ;
115
+ fn get_template_contents( & self , target: & Self :: Handle ) -> Self :: Handle ;
112
116
113
117
fn same_node( & self , x: & Self :: Handle , y: & Self :: Handle ) -> bool ;
114
118
115
- fn set_quirks_mode( & mut self , mode: QuirksMode ) ;
119
+ fn set_quirks_mode( & self , mode: QuirksMode ) ;
116
120
117
121
fn append_before_sibling(
118
- & mut self ,
122
+ & self ,
119
123
sibling: & Self :: Handle ,
120
124
new_node: NodeOrText <Self :: Handle >,
121
125
) ;
122
126
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 >) ;
124
128
125
129
fn associate_with_form(
126
- & mut self ,
130
+ & self ,
127
131
target: & Self :: Handle ,
128
132
form: & Self :: Handle ,
129
133
nodes: ( & Self :: Handle , Option <& Self :: Handle >) ,
130
134
) ;
131
135
132
- fn remove_from_parent( & mut self , target: & Self :: Handle ) ;
136
+ fn remove_from_parent( & self , target: & Self :: Handle ) ;
133
137
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 ) ;
135
139
136
140
fn is_mathml_annotation_xml_integration_point( & self , handle: & Self :: Handle ) -> bool ;
137
-
138
- fn complete_script( & mut self , node: & Self :: Handle ) -> NextParserState ;
139
141
}
140
142
}
141
143
}
0 commit comments