tidy-ext 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. data/.gitignore +4 -0
  2. data/LICENSE +50 -0
  3. data/README +12 -0
  4. data/Rakefile +60 -0
  5. data/VERSION +1 -0
  6. data/ext/tidy/access.c +3310 -0
  7. data/ext/tidy/access.h +279 -0
  8. data/ext/tidy/alloc.c +107 -0
  9. data/ext/tidy/attrask.c +209 -0
  10. data/ext/tidy/attrdict.c +2398 -0
  11. data/ext/tidy/attrdict.h +122 -0
  12. data/ext/tidy/attrget.c +213 -0
  13. data/ext/tidy/attrs.c +1911 -0
  14. data/ext/tidy/attrs.h +374 -0
  15. data/ext/tidy/buffio.c +232 -0
  16. data/ext/tidy/buffio.h +118 -0
  17. data/ext/tidy/charsets.c +1032 -0
  18. data/ext/tidy/charsets.h +14 -0
  19. data/ext/tidy/clean.c +2674 -0
  20. data/ext/tidy/clean.h +87 -0
  21. data/ext/tidy/config.c +1746 -0
  22. data/ext/tidy/config.h +153 -0
  23. data/ext/tidy/entities.c +419 -0
  24. data/ext/tidy/entities.h +24 -0
  25. data/ext/tidy/extconf.rb +5 -0
  26. data/ext/tidy/fileio.c +106 -0
  27. data/ext/tidy/fileio.h +46 -0
  28. data/ext/tidy/forward.h +69 -0
  29. data/ext/tidy/iconvtc.c +105 -0
  30. data/ext/tidy/iconvtc.h +15 -0
  31. data/ext/tidy/istack.c +373 -0
  32. data/ext/tidy/lexer.c +3825 -0
  33. data/ext/tidy/lexer.h +617 -0
  34. data/ext/tidy/localize.c +1882 -0
  35. data/ext/tidy/mappedio.c +329 -0
  36. data/ext/tidy/mappedio.h +16 -0
  37. data/ext/tidy/message.h +207 -0
  38. data/ext/tidy/parser.c +4408 -0
  39. data/ext/tidy/parser.h +76 -0
  40. data/ext/tidy/platform.h +636 -0
  41. data/ext/tidy/pprint.c +2276 -0
  42. data/ext/tidy/pprint.h +93 -0
  43. data/ext/tidy/ruby-tidy.c +195 -0
  44. data/ext/tidy/streamio.c +1407 -0
  45. data/ext/tidy/streamio.h +222 -0
  46. data/ext/tidy/tagask.c +286 -0
  47. data/ext/tidy/tags.c +955 -0
  48. data/ext/tidy/tags.h +235 -0
  49. data/ext/tidy/tidy-int.h +129 -0
  50. data/ext/tidy/tidy.h +1097 -0
  51. data/ext/tidy/tidyenum.h +622 -0
  52. data/ext/tidy/tidylib.c +1751 -0
  53. data/ext/tidy/tmbstr.c +306 -0
  54. data/ext/tidy/tmbstr.h +92 -0
  55. data/ext/tidy/utf8.c +539 -0
  56. data/ext/tidy/utf8.h +52 -0
  57. data/ext/tidy/version.h +14 -0
  58. data/ext/tidy/win32tc.c +795 -0
  59. data/ext/tidy/win32tc.h +19 -0
  60. data/spec/spec_helper.rb +5 -0
  61. data/spec/tidy/compat_spec.rb +44 -0
  62. data/spec/tidy/remote_uri_spec.rb +14 -0
  63. data/spec/tidy/test1.html +5 -0
  64. data/spec/tidy/tidy_spec.rb +34 -0
  65. metadata +125 -0
@@ -0,0 +1,122 @@
1
+ #ifndef __ATTRDICT_H__
2
+ #define __ATTRDICT_H__
3
+
4
+ /* attrdict.h -- extended attribute information
5
+
6
+ (c) 1998-2006 (W3C) MIT, ERCIM, Keio University
7
+ See tidy.h for the copyright notice.
8
+
9
+ $Id: attrdict.h,v 1.4 2006/09/12 15:14:44 arnaud02 Exp $
10
+ */
11
+
12
+ #include "tidy.h"
13
+
14
+ typedef struct _AttrVersion
15
+ {
16
+ TidyAttrId attribute;
17
+ uint versions;
18
+ } AttrVersion;
19
+
20
+ extern const AttrVersion TY_(W3CAttrsFor_A)[];
21
+ extern const AttrVersion TY_(W3CAttrsFor_ABBR)[];
22
+ extern const AttrVersion TY_(W3CAttrsFor_ACRONYM)[];
23
+ extern const AttrVersion TY_(W3CAttrsFor_ADDRESS)[];
24
+ extern const AttrVersion TY_(W3CAttrsFor_APPLET)[];
25
+ extern const AttrVersion TY_(W3CAttrsFor_AREA)[];
26
+ extern const AttrVersion TY_(W3CAttrsFor_B)[];
27
+ extern const AttrVersion TY_(W3CAttrsFor_BASE)[];
28
+ extern const AttrVersion TY_(W3CAttrsFor_BASEFONT)[];
29
+ extern const AttrVersion TY_(W3CAttrsFor_BDO)[];
30
+ extern const AttrVersion TY_(W3CAttrsFor_BIG)[];
31
+ extern const AttrVersion TY_(W3CAttrsFor_BLOCKQUOTE)[];
32
+ extern const AttrVersion TY_(W3CAttrsFor_BODY)[];
33
+ extern const AttrVersion TY_(W3CAttrsFor_BR)[];
34
+ extern const AttrVersion TY_(W3CAttrsFor_BUTTON)[];
35
+ extern const AttrVersion TY_(W3CAttrsFor_CAPTION)[];
36
+ extern const AttrVersion TY_(W3CAttrsFor_CENTER)[];
37
+ extern const AttrVersion TY_(W3CAttrsFor_CITE)[];
38
+ extern const AttrVersion TY_(W3CAttrsFor_CODE)[];
39
+ extern const AttrVersion TY_(W3CAttrsFor_COL)[];
40
+ extern const AttrVersion TY_(W3CAttrsFor_COLGROUP)[];
41
+ extern const AttrVersion TY_(W3CAttrsFor_DD)[];
42
+ extern const AttrVersion TY_(W3CAttrsFor_DEL)[];
43
+ extern const AttrVersion TY_(W3CAttrsFor_DFN)[];
44
+ extern const AttrVersion TY_(W3CAttrsFor_DIR)[];
45
+ extern const AttrVersion TY_(W3CAttrsFor_DIV)[];
46
+ extern const AttrVersion TY_(W3CAttrsFor_DL)[];
47
+ extern const AttrVersion TY_(W3CAttrsFor_DT)[];
48
+ extern const AttrVersion TY_(W3CAttrsFor_EM)[];
49
+ extern const AttrVersion TY_(W3CAttrsFor_FIELDSET)[];
50
+ extern const AttrVersion TY_(W3CAttrsFor_FONT)[];
51
+ extern const AttrVersion TY_(W3CAttrsFor_FORM)[];
52
+ extern const AttrVersion TY_(W3CAttrsFor_FRAME)[];
53
+ extern const AttrVersion TY_(W3CAttrsFor_FRAMESET)[];
54
+ extern const AttrVersion TY_(W3CAttrsFor_H1)[];
55
+ extern const AttrVersion TY_(W3CAttrsFor_H2)[];
56
+ extern const AttrVersion TY_(W3CAttrsFor_H3)[];
57
+ extern const AttrVersion TY_(W3CAttrsFor_H4)[];
58
+ extern const AttrVersion TY_(W3CAttrsFor_H5)[];
59
+ extern const AttrVersion TY_(W3CAttrsFor_H6)[];
60
+ extern const AttrVersion TY_(W3CAttrsFor_HEAD)[];
61
+ extern const AttrVersion TY_(W3CAttrsFor_HR)[];
62
+ extern const AttrVersion TY_(W3CAttrsFor_HTML)[];
63
+ extern const AttrVersion TY_(W3CAttrsFor_I)[];
64
+ extern const AttrVersion TY_(W3CAttrsFor_IFRAME)[];
65
+ extern const AttrVersion TY_(W3CAttrsFor_IMG)[];
66
+ extern const AttrVersion TY_(W3CAttrsFor_INPUT)[];
67
+ extern const AttrVersion TY_(W3CAttrsFor_INS)[];
68
+ extern const AttrVersion TY_(W3CAttrsFor_ISINDEX)[];
69
+ extern const AttrVersion TY_(W3CAttrsFor_KBD)[];
70
+ extern const AttrVersion TY_(W3CAttrsFor_LABEL)[];
71
+ extern const AttrVersion TY_(W3CAttrsFor_LEGEND)[];
72
+ extern const AttrVersion TY_(W3CAttrsFor_LI)[];
73
+ extern const AttrVersion TY_(W3CAttrsFor_LINK)[];
74
+ extern const AttrVersion TY_(W3CAttrsFor_LISTING)[];
75
+ extern const AttrVersion TY_(W3CAttrsFor_MAP)[];
76
+ extern const AttrVersion TY_(W3CAttrsFor_MENU)[];
77
+ extern const AttrVersion TY_(W3CAttrsFor_META)[];
78
+ extern const AttrVersion TY_(W3CAttrsFor_NEXTID)[];
79
+ extern const AttrVersion TY_(W3CAttrsFor_NOFRAMES)[];
80
+ extern const AttrVersion TY_(W3CAttrsFor_NOSCRIPT)[];
81
+ extern const AttrVersion TY_(W3CAttrsFor_OBJECT)[];
82
+ extern const AttrVersion TY_(W3CAttrsFor_OL)[];
83
+ extern const AttrVersion TY_(W3CAttrsFor_OPTGROUP)[];
84
+ extern const AttrVersion TY_(W3CAttrsFor_OPTION)[];
85
+ extern const AttrVersion TY_(W3CAttrsFor_P)[];
86
+ extern const AttrVersion TY_(W3CAttrsFor_PARAM)[];
87
+ extern const AttrVersion TY_(W3CAttrsFor_PLAINTEXT)[];
88
+ extern const AttrVersion TY_(W3CAttrsFor_PRE)[];
89
+ extern const AttrVersion TY_(W3CAttrsFor_Q)[];
90
+ extern const AttrVersion TY_(W3CAttrsFor_RB)[];
91
+ extern const AttrVersion TY_(W3CAttrsFor_RBC)[];
92
+ extern const AttrVersion TY_(W3CAttrsFor_RP)[];
93
+ extern const AttrVersion TY_(W3CAttrsFor_RT)[];
94
+ extern const AttrVersion TY_(W3CAttrsFor_RTC)[];
95
+ extern const AttrVersion TY_(W3CAttrsFor_RUBY)[];
96
+ extern const AttrVersion TY_(W3CAttrsFor_S)[];
97
+ extern const AttrVersion TY_(W3CAttrsFor_SAMP)[];
98
+ extern const AttrVersion TY_(W3CAttrsFor_SCRIPT)[];
99
+ extern const AttrVersion TY_(W3CAttrsFor_SELECT)[];
100
+ extern const AttrVersion TY_(W3CAttrsFor_SMALL)[];
101
+ extern const AttrVersion TY_(W3CAttrsFor_SPAN)[];
102
+ extern const AttrVersion TY_(W3CAttrsFor_STRIKE)[];
103
+ extern const AttrVersion TY_(W3CAttrsFor_STRONG)[];
104
+ extern const AttrVersion TY_(W3CAttrsFor_STYLE)[];
105
+ extern const AttrVersion TY_(W3CAttrsFor_SUB)[];
106
+ extern const AttrVersion TY_(W3CAttrsFor_SUP)[];
107
+ extern const AttrVersion TY_(W3CAttrsFor_TABLE)[];
108
+ extern const AttrVersion TY_(W3CAttrsFor_TBODY)[];
109
+ extern const AttrVersion TY_(W3CAttrsFor_TD)[];
110
+ extern const AttrVersion TY_(W3CAttrsFor_TEXTAREA)[];
111
+ extern const AttrVersion TY_(W3CAttrsFor_TFOOT)[];
112
+ extern const AttrVersion TY_(W3CAttrsFor_TH)[];
113
+ extern const AttrVersion TY_(W3CAttrsFor_THEAD)[];
114
+ extern const AttrVersion TY_(W3CAttrsFor_TITLE)[];
115
+ extern const AttrVersion TY_(W3CAttrsFor_TR)[];
116
+ extern const AttrVersion TY_(W3CAttrsFor_TT)[];
117
+ extern const AttrVersion TY_(W3CAttrsFor_U)[];
118
+ extern const AttrVersion TY_(W3CAttrsFor_UL)[];
119
+ extern const AttrVersion TY_(W3CAttrsFor_VAR)[];
120
+ extern const AttrVersion TY_(W3CAttrsFor_XMP)[];
121
+
122
+ #endif /* __ATTRDICT_H__ */
@@ -0,0 +1,213 @@
1
+ /* attrget.c -- Locate attribute value by type
2
+
3
+ (c) 1998-2006 (W3C) MIT, ERCIM, Keio University
4
+ See tidy.h for the copyright notice.
5
+
6
+ CVS Info:
7
+ $Author: arnaud02 $
8
+ $Date: 2006/09/12 15:14:44 $
9
+ $Revision: 1.6 $
10
+
11
+ */
12
+
13
+ #include "tidy-int.h"
14
+ #include "tags.h"
15
+ #include "attrs.h"
16
+ #include "tidy.h"
17
+
18
+ TidyAttr TIDY_CALL tidyAttrGetById( TidyNode tnod, TidyAttrId attId )
19
+ {
20
+ Node* nimp = tidyNodeToImpl(tnod);
21
+ return tidyImplToAttr( TY_(AttrGetById)( nimp, attId ) );
22
+ }
23
+ TidyAttr TIDY_CALL tidyAttrGetHREF( TidyNode tnod )
24
+ {
25
+ return tidyImplToAttr( attrGetHREF( tidyNodeToImpl(tnod) ) );
26
+ }
27
+ TidyAttr TIDY_CALL tidyAttrGetSRC( TidyNode tnod )
28
+ {
29
+ return tidyImplToAttr( attrGetSRC( tidyNodeToImpl(tnod) ) );
30
+ }
31
+ TidyAttr TIDY_CALL tidyAttrGetID( TidyNode tnod )
32
+ {
33
+ return tidyImplToAttr( attrGetID( tidyNodeToImpl(tnod) ) );
34
+ }
35
+ TidyAttr TIDY_CALL tidyAttrGetNAME( TidyNode tnod )
36
+ {
37
+ return tidyImplToAttr( attrGetNAME( tidyNodeToImpl(tnod) ) );
38
+ }
39
+ TidyAttr TIDY_CALL tidyAttrGetSUMMARY( TidyNode tnod )
40
+ {
41
+ return tidyImplToAttr( attrGetSUMMARY( tidyNodeToImpl(tnod) ) );
42
+ }
43
+ TidyAttr TIDY_CALL tidyAttrGetALT( TidyNode tnod )
44
+ {
45
+ return tidyImplToAttr( attrGetALT( tidyNodeToImpl(tnod) ) );
46
+ }
47
+ TidyAttr TIDY_CALL tidyAttrGetLONGDESC( TidyNode tnod )
48
+ {
49
+ return tidyImplToAttr( attrGetLONGDESC( tidyNodeToImpl(tnod) ) );
50
+ }
51
+ TidyAttr TIDY_CALL tidyAttrGetUSEMAP( TidyNode tnod )
52
+ {
53
+ return tidyImplToAttr( attrGetUSEMAP( tidyNodeToImpl(tnod) ) );
54
+ }
55
+ TidyAttr TIDY_CALL tidyAttrGetISMAP( TidyNode tnod )
56
+ {
57
+ return tidyImplToAttr( attrGetISMAP( tidyNodeToImpl(tnod) ) );
58
+ }
59
+ TidyAttr TIDY_CALL tidyAttrGetLANGUAGE( TidyNode tnod )
60
+ {
61
+ return tidyImplToAttr( attrGetLANGUAGE( tidyNodeToImpl(tnod) ) );
62
+ }
63
+ TidyAttr TIDY_CALL tidyAttrGetTYPE( TidyNode tnod )
64
+ {
65
+ return tidyImplToAttr( attrGetTYPE( tidyNodeToImpl(tnod) ) );
66
+ }
67
+ TidyAttr TIDY_CALL tidyAttrGetVALUE( TidyNode tnod )
68
+ {
69
+ return tidyImplToAttr( attrGetVALUE( tidyNodeToImpl(tnod) ) );
70
+ }
71
+ TidyAttr TIDY_CALL tidyAttrGetCONTENT( TidyNode tnod )
72
+ {
73
+ return tidyImplToAttr( attrGetCONTENT( tidyNodeToImpl(tnod) ) );
74
+ }
75
+ TidyAttr TIDY_CALL tidyAttrGetTITLE( TidyNode tnod )
76
+ {
77
+ return tidyImplToAttr( attrGetTITLE( tidyNodeToImpl(tnod) ) );
78
+ }
79
+ TidyAttr TIDY_CALL tidyAttrGetXMLNS( TidyNode tnod )
80
+ {
81
+ return tidyImplToAttr( attrGetXMLNS( tidyNodeToImpl(tnod) ) );
82
+ }
83
+ TidyAttr TIDY_CALL tidyAttrGetDATAFLD( TidyNode tnod )
84
+ {
85
+ return tidyImplToAttr( attrGetDATAFLD( tidyNodeToImpl(tnod) ) );
86
+ }
87
+ TidyAttr TIDY_CALL tidyAttrGetWIDTH( TidyNode tnod )
88
+ {
89
+ return tidyImplToAttr( attrGetWIDTH( tidyNodeToImpl(tnod) ) );
90
+ }
91
+ TidyAttr TIDY_CALL tidyAttrGetHEIGHT( TidyNode tnod )
92
+ {
93
+ return tidyImplToAttr( attrGetHEIGHT( tidyNodeToImpl(tnod) ) );
94
+ }
95
+ TidyAttr TIDY_CALL tidyAttrGetFOR( TidyNode tnod )
96
+ {
97
+ return tidyImplToAttr( attrGetFOR( tidyNodeToImpl(tnod) ) );
98
+ }
99
+ TidyAttr TIDY_CALL tidyAttrGetSELECTED( TidyNode tnod )
100
+ {
101
+ return tidyImplToAttr( attrGetSELECTED( tidyNodeToImpl(tnod) ) );
102
+ }
103
+ TidyAttr TIDY_CALL tidyAttrGetCHECKED( TidyNode tnod )
104
+ {
105
+ return tidyImplToAttr( attrGetCHECKED( tidyNodeToImpl(tnod) ) );
106
+ }
107
+ TidyAttr TIDY_CALL tidyAttrGetLANG( TidyNode tnod )
108
+ {
109
+ return tidyImplToAttr( attrGetLANG( tidyNodeToImpl(tnod) ) );
110
+ }
111
+ TidyAttr TIDY_CALL tidyAttrGetTARGET( TidyNode tnod )
112
+ {
113
+ return tidyImplToAttr( attrGetTARGET( tidyNodeToImpl(tnod) ) );
114
+ }
115
+ TidyAttr TIDY_CALL tidyAttrGetHTTP_EQUIV( TidyNode tnod )
116
+ {
117
+ return tidyImplToAttr( attrGetHTTP_EQUIV( tidyNodeToImpl(tnod) ) );
118
+ }
119
+ TidyAttr TIDY_CALL tidyAttrGetREL( TidyNode tnod )
120
+ {
121
+ return tidyImplToAttr( attrGetREL( tidyNodeToImpl(tnod) ) );
122
+ }
123
+
124
+ TidyAttr TIDY_CALL tidyAttrGetOnMOUSEMOVE( TidyNode tnod )
125
+ {
126
+ return tidyImplToAttr( attrGetOnMOUSEMOVE( tidyNodeToImpl(tnod) ) );
127
+ }
128
+ TidyAttr TIDY_CALL tidyAttrGetOnMOUSEDOWN( TidyNode tnod )
129
+ {
130
+ return tidyImplToAttr( attrGetOnMOUSEDOWN( tidyNodeToImpl(tnod) ) );
131
+ }
132
+ TidyAttr TIDY_CALL tidyAttrGetOnMOUSEUP( TidyNode tnod )
133
+ {
134
+ return tidyImplToAttr( attrGetOnMOUSEUP( tidyNodeToImpl(tnod) ) );
135
+ }
136
+ TidyAttr TIDY_CALL tidyAttrGetOnCLICK( TidyNode tnod )
137
+ {
138
+ return tidyImplToAttr( attrGetOnCLICK( tidyNodeToImpl(tnod) ) );
139
+ }
140
+ TidyAttr TIDY_CALL tidyAttrGetOnMOUSEOVER( TidyNode tnod )
141
+ {
142
+ return tidyImplToAttr( attrGetOnMOUSEOVER( tidyNodeToImpl(tnod) ) );
143
+ }
144
+ TidyAttr TIDY_CALL tidyAttrGetOnMOUSEOUT( TidyNode tnod )
145
+ {
146
+ return tidyImplToAttr( attrGetOnMOUSEOUT( tidyNodeToImpl(tnod) ) );
147
+ }
148
+ TidyAttr TIDY_CALL tidyAttrGetOnKEYDOWN( TidyNode tnod )
149
+ {
150
+ return tidyImplToAttr( attrGetOnKEYDOWN( tidyNodeToImpl(tnod) ) );
151
+ }
152
+ TidyAttr TIDY_CALL tidyAttrGetOnKEYUP( TidyNode tnod )
153
+ {
154
+ return tidyImplToAttr( attrGetOnKEYUP( tidyNodeToImpl(tnod) ) );
155
+ }
156
+ TidyAttr TIDY_CALL tidyAttrGetOnKEYPRESS( TidyNode tnod )
157
+ {
158
+ return tidyImplToAttr( attrGetOnKEYPRESS( tidyNodeToImpl(tnod) ) );
159
+ }
160
+ TidyAttr TIDY_CALL tidyAttrGetOnFOCUS( TidyNode tnod )
161
+ {
162
+ return tidyImplToAttr( attrGetOnFOCUS( tidyNodeToImpl(tnod) ) );
163
+ }
164
+ TidyAttr TIDY_CALL tidyAttrGetOnBLUR( TidyNode tnod )
165
+ {
166
+ return tidyImplToAttr( attrGetOnBLUR( tidyNodeToImpl(tnod) ) );
167
+ }
168
+ TidyAttr TIDY_CALL tidyAttrGetBGCOLOR( TidyNode tnod )
169
+ {
170
+ return tidyImplToAttr( attrGetBGCOLOR( tidyNodeToImpl(tnod) ) );
171
+ }
172
+ TidyAttr TIDY_CALL tidyAttrGetLINK( TidyNode tnod )
173
+ {
174
+ return tidyImplToAttr( attrGetLINK( tidyNodeToImpl(tnod) ) );
175
+ }
176
+ TidyAttr TIDY_CALL tidyAttrGetALINK( TidyNode tnod )
177
+ {
178
+ return tidyImplToAttr( attrGetALINK( tidyNodeToImpl(tnod) ) );
179
+ }
180
+ TidyAttr TIDY_CALL tidyAttrGetVLINK( TidyNode tnod )
181
+ {
182
+ return tidyImplToAttr( attrGetVLINK( tidyNodeToImpl(tnod) ) );
183
+ }
184
+
185
+ TidyAttr TIDY_CALL tidyAttrGetTEXT( TidyNode tnod )
186
+ {
187
+ return tidyImplToAttr( attrGetTEXT( tidyNodeToImpl(tnod) ) );
188
+ }
189
+ TidyAttr TIDY_CALL tidyAttrGetSTYLE( TidyNode tnod )
190
+ {
191
+ return tidyImplToAttr( attrGetSTYLE( tidyNodeToImpl(tnod) ) );
192
+ }
193
+ TidyAttr TIDY_CALL tidyAttrGetABBR( TidyNode tnod )
194
+ {
195
+ return tidyImplToAttr( attrGetABBR( tidyNodeToImpl(tnod) ) );
196
+ }
197
+ TidyAttr TIDY_CALL tidyAttrGetCOLSPAN( TidyNode tnod )
198
+ {
199
+ return tidyImplToAttr( attrGetCOLSPAN( tidyNodeToImpl(tnod) ) );
200
+ }
201
+ TidyAttr TIDY_CALL tidyAttrGetROWSPAN( TidyNode tnod )
202
+ {
203
+ return tidyImplToAttr( attrGetROWSPAN( tidyNodeToImpl(tnod) ) );
204
+ }
205
+
206
+ /*
207
+ * local variables:
208
+ * mode: c
209
+ * indent-tabs-mode: nil
210
+ * c-basic-offset: 4
211
+ * eval: (c-set-offset 'substatement-open 0)
212
+ * end:
213
+ */