Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #ifndef INCLUDED_SC_SOURCE_FILTER_XML_XMLSTYLE_HXX
21 : #define INCLUDED_SC_SOURCE_FILTER_XML_XMLSTYLE_HXX
22 :
23 : #include <xmloff/maptype.hxx>
24 : #include <xmloff/xmlaustp.hxx>
25 : #include <xmloff/xmltypes.hxx>
26 : #include <xmloff/xmlprmap.hxx>
27 : #include <xmloff/prhdlfac.hxx>
28 : #include <xmloff/styleexp.hxx>
29 : #include <xmloff/xmlexppr.hxx>
30 : #include <xmloff/contextid.hxx>
31 : #include <xmloff/xmlprhdl.hxx>
32 :
33 : extern const XMLPropertyMapEntry aXMLScCellStylesProperties[];
34 : extern const XMLPropertyMapEntry aXMLScColumnStylesProperties[];
35 : extern const XMLPropertyMapEntry aXMLScRowStylesProperties[];
36 : extern const XMLPropertyMapEntry aXMLScFromXLSRowStylesProperties[];
37 : extern const XMLPropertyMapEntry aXMLScRowStylesImportProperties[];
38 : extern const XMLPropertyMapEntry aXMLScTableStylesProperties[];
39 : extern const XMLPropertyMapEntry aXMLScTableStylesImportProperties[];
40 :
41 : //CellStyles
42 : #define XML_SC_TYPE_CELLPROTECTION (XML_SC_TYPES_START + 1)
43 : #define XML_SC_TYPE_PRINTCONTENT (XML_SC_TYPES_START + 2)
44 : #define XML_SC_TYPE_HORIJUSTIFY (XML_SC_TYPES_START + 3)
45 : #define XML_SC_TYPE_HORIJUSTIFY_METHOD (XML_SC_TYPES_START + 4)
46 : #define XML_SC_TYPE_HORIJUSTIFYSOURCE (XML_SC_TYPES_START + 5)
47 : #define XML_SC_TYPE_HORIJUSTIFYREPEAT (XML_SC_TYPES_START + 6)
48 : #define XML_SC_TYPE_ORIENTATION (XML_SC_TYPES_START + 7)
49 : #define XML_SC_TYPE_ROTATEANGLE (XML_SC_TYPES_START + 8)
50 : #define XML_SC_TYPE_ROTATEREFERENCE (XML_SC_TYPES_START + 9)
51 : #define XML_SC_TYPE_BORDERLEFT (XML_SC_TYPES_START + 10)
52 : #define XML_SC_TYPE_BORDERRIGHT (XML_SC_TYPES_START + 11)
53 : #define XML_SC_TYPE_BORDERTOP (XML_SC_TYPES_START + 12)
54 : #define XML_SC_TYPE_BORDERBOTTOM (XML_SC_TYPES_START + 13)
55 : #define XML_SC_TYPE_VERTJUSTIFY (XML_SC_TYPES_START + 14)
56 : #define XML_SC_TYPE_VERTJUSTIFY_METHOD (XML_SC_TYPES_START + 15)
57 : #define XML_SC_ISTEXTWRAPPED (XML_SC_TYPES_START + 16)
58 : #define XML_SC_TYPE_EQUAL (XML_SC_TYPES_START + 17)
59 : #define XML_SC_TYPE_VERTICAL (XML_SC_TYPES_START + 18)
60 :
61 : // CTF_SC_HORIJUSTIFY (XML_SC_CTF_START + 1)
62 : // CTF_SC_HORIJUSTIFY_SOURCE (XML_SC_CTF_START + 2)
63 : #define CTF_SC_ALLPADDING (XML_SC_CTF_START + 3)
64 : #define CTF_SC_BOTTOMPADDING (XML_SC_CTF_START + 4)
65 : #define CTF_SC_LEFTPADDING (XML_SC_CTF_START + 5)
66 : #define CTF_SC_RIGHTPADDING (XML_SC_CTF_START + 6)
67 : #define CTF_SC_TOPPADDING (XML_SC_CTF_START + 7)
68 : #define CTF_SC_ALLBORDER (XML_SC_CTF_START + 8)
69 : #define CTF_SC_LEFTBORDER (XML_SC_CTF_START + 9)
70 : #define CTF_SC_RIGHTBORDER (XML_SC_CTF_START + 10)
71 : #define CTF_SC_TOPBORDER (XML_SC_CTF_START + 11)
72 : #define CTF_SC_BOTTOMBORDER (XML_SC_CTF_START + 12)
73 : #define CTF_SC_ALLBORDERWIDTH (XML_SC_CTF_START + 13)
74 : #define CTF_SC_LEFTBORDERWIDTH (XML_SC_CTF_START + 14)
75 : #define CTF_SC_RIGHTBORDERWIDTH (XML_SC_CTF_START + 15)
76 : #define CTF_SC_TOPBORDERWIDTH (XML_SC_CTF_START + 16)
77 : #define CTF_SC_BOTTOMBORDERWIDTH (XML_SC_CTF_START + 17)
78 : #define CTF_SC_NUMBERFORMAT (XML_SC_CTF_START + 18)
79 : #define CTF_SC_MAP (XML_SC_CTF_START + 19)
80 : // CTF_SC_PARAINDENT (XML_SC_CTF_START + 20)
81 : // CTF_SC_OLDTEXTBACKGROUND (XML_SC_CTF_START + 21)
82 : #define CTF_SC_IMPORT_MAP (XML_SC_CTF_START + 22)
83 : #define CTF_SC_CELLSTYLE (XML_SC_CTF_START + 23)
84 : #define CTF_SC_VALIDATION (XML_SC_CTF_START + 24)
85 : #define CTF_SC_DIAGONALTLBR (XML_SC_CTF_START + 25)
86 : #define CTF_SC_DIAGONALTLBRWIDTH (XML_SC_CTF_START + 26)
87 : #define CTF_SC_DIAGONALBLTR (XML_SC_CTF_START + 27)
88 : #define CTF_SC_DIAGONALBLTRWIDTH (XML_SC_CTF_START + 28)
89 : #define CTF_SC_DIAGONALTLBRWIDTHS (XML_SC_CTF_START + 29)
90 : #define CTF_SC_DIAGONALBLTRWIDTHS (XML_SC_CTF_START + 30)
91 :
92 : #define CTF_SC_ROWHEIGHT (XML_SC_CTF_START + 50)
93 : #define CTF_SC_ROWOPTIMALHEIGHT (XML_SC_CTF_START + 51)
94 : #define CTF_SC_ROWBREAKBEFORE (XML_SC_CTF_START + 52)
95 : #define CTF_SC_ISVISIBLE (XML_SC_CTF_START + 53)
96 :
97 : #define CTF_SC_MASTERPAGENAME (XML_SC_CTF_START + 53)
98 : #define CTF_SC_HYPERLINK (XML_SC_CTF_START + 54)
99 :
100 : //ColumnStyles
101 : #define XML_SC_TYPE_BREAKBEFORE (XML_SC_TYPES_START + 50)
102 :
103 : class ScXMLExport;
104 :
105 : class ScXMLCellExportPropertyMapper : public SvXMLExportPropertyMapper
106 : {
107 : protected:
108 : /** Application-specific filter. By default do nothing. */
109 : virtual void ContextFilter(
110 : bool bEnableFoFontFamily,
111 : ::std::vector< XMLPropertyState >& rProperties,
112 : ::com::sun::star::uno::Reference<
113 : ::com::sun::star::beans::XPropertySet > rPropSet ) const SAL_OVERRIDE;
114 : public:
115 : ScXMLCellExportPropertyMapper(
116 : const rtl::Reference< XMLPropertySetMapper >& rMapper );
117 : virtual ~ScXMLCellExportPropertyMapper();
118 : virtual void handleElementItem(
119 : SvXMLExport& rExport,
120 : const XMLPropertyState& rProperty,
121 : sal_uInt16 nFlags,
122 : const ::std::vector< XMLPropertyState > *pProperties = 0,
123 : sal_uInt32 nIdx = 0 ) const SAL_OVERRIDE;
124 :
125 : /** this method is called for every item that has the MID_FLAG_SPECIAL_ITEM_EXPORT flag set */
126 : virtual void handleSpecialItem(
127 : SvXMLAttributeList& rAttrList,
128 : const XMLPropertyState& rProperty,
129 : const SvXMLUnitConverter& rUnitConverter,
130 : const SvXMLNamespaceMap& rNamespaceMap,
131 : const ::std::vector< XMLPropertyState > *pProperties = 0,
132 : sal_uInt32 nIdx = 0 ) const SAL_OVERRIDE;
133 : };
134 :
135 : class ScXMLRowExportPropertyMapper : public SvXMLExportPropertyMapper
136 : {
137 : protected:
138 : /** Application-specific filter. By default do nothing. */
139 : virtual void ContextFilter(
140 : bool bEnableFoFontFamily,
141 : ::std::vector< XMLPropertyState >& rProperties,
142 : ::com::sun::star::uno::Reference<
143 : ::com::sun::star::beans::XPropertySet > rPropSet ) const SAL_OVERRIDE;
144 : public:
145 : ScXMLRowExportPropertyMapper(
146 : const rtl::Reference< XMLPropertySetMapper >& rMapper );
147 : virtual ~ScXMLRowExportPropertyMapper();
148 : };
149 :
150 : class ScXMLColumnExportPropertyMapper : public SvXMLExportPropertyMapper
151 : {
152 : public:
153 : ScXMLColumnExportPropertyMapper(
154 : const rtl::Reference< XMLPropertySetMapper >& rMapper );
155 : virtual ~ScXMLColumnExportPropertyMapper();
156 :
157 : /** this method is called for every item that has the MID_FLAG_SPECIAL_ITEM_EXPORT flag set */
158 : virtual void handleSpecialItem(
159 : SvXMLAttributeList& rAttrList,
160 : const XMLPropertyState& rProperty,
161 : const SvXMLUnitConverter& rUnitConverter,
162 : const SvXMLNamespaceMap& rNamespaceMap,
163 : const ::std::vector< XMLPropertyState > *pProperties = 0,
164 : sal_uInt32 nIdx = 0 ) const SAL_OVERRIDE;
165 : };
166 :
167 : class ScXMLTableExportPropertyMapper : public SvXMLExportPropertyMapper
168 : {
169 : protected:
170 : public:
171 : ScXMLTableExportPropertyMapper(
172 : const rtl::Reference< XMLPropertySetMapper >& rMapper );
173 : virtual ~ScXMLTableExportPropertyMapper();
174 :
175 : /** this method is called for every item that has the MID_FLAG_SPECIAL_ITEM_EXPORT flag set */
176 : virtual void handleSpecialItem(
177 : SvXMLAttributeList& rAttrList,
178 : const XMLPropertyState& rProperty,
179 : const SvXMLUnitConverter& rUnitConverter,
180 : const SvXMLNamespaceMap& rNamespaceMap,
181 : const ::std::vector< XMLPropertyState > *pProperties = 0,
182 : sal_uInt32 nIdx = 0 ) const SAL_OVERRIDE;
183 : };
184 :
185 : class ScXMLAutoStylePoolP : public SvXMLAutoStylePoolP
186 : {
187 : ScXMLExport& rScXMLExport;
188 :
189 : virtual void exportStyleAttributes(
190 : SvXMLAttributeList& rAttrList,
191 : sal_Int32 nFamily,
192 : const ::std::vector< XMLPropertyState >& rProperties,
193 : const SvXMLExportPropertyMapper& rPropExp,
194 : const SvXMLUnitConverter& rUnitConverter,
195 : const SvXMLNamespaceMap& rNamespaceMap
196 : ) const SAL_OVERRIDE;
197 :
198 : virtual void exportStyleContent(
199 : const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XDocumentHandler > & rHandler,
200 : sal_Int32 nFamily,
201 : const ::std::vector< XMLPropertyState >& rProperties,
202 : const SvXMLExportPropertyMapper& rPropExp
203 : , const SvXMLUnitConverter& rUnitConverter,
204 : const SvXMLNamespaceMap& rNamespaceMap
205 : ) const SAL_OVERRIDE;
206 :
207 : public:
208 : ScXMLAutoStylePoolP(ScXMLExport& rScXMLExport);
209 : virtual ~ScXMLAutoStylePoolP();
210 : };
211 :
212 : class ScXMLStyleExport : public XMLStyleExport
213 : {
214 : virtual void exportStyleAttributes(
215 : const ::com::sun::star::uno::Reference<
216 : ::com::sun::star::style::XStyle > & rStyle ) SAL_OVERRIDE;
217 : virtual void exportStyleContent(
218 : const ::com::sun::star::uno::Reference<
219 : ::com::sun::star::style::XStyle > & rStyle ) SAL_OVERRIDE;
220 : public:
221 : ScXMLStyleExport(
222 : SvXMLExport& rExp,
223 : const OUString& rPoolStyleName,
224 : SvXMLAutoStylePoolP *pAutoStyleP=0 );
225 : virtual ~ScXMLStyleExport();
226 : };
227 :
228 : class XMLScPropHdlFactory : public XMLPropertyHandlerFactory
229 : {
230 : public:
231 : XMLScPropHdlFactory();
232 : virtual ~XMLScPropHdlFactory();
233 : virtual const XMLPropertyHandler* GetPropertyHandler( sal_Int32 nType ) const SAL_OVERRIDE;
234 : };
235 :
236 1268 : class XmlScPropHdl_CellProtection : public XMLPropertyHandler
237 : {
238 : public:
239 : virtual ~XmlScPropHdl_CellProtection();
240 : virtual bool equals( const ::com::sun::star::uno::Any& r1, const ::com::sun::star::uno::Any& r2 ) const SAL_OVERRIDE;
241 : virtual bool importXML( const OUString& rStrImpValue, ::com::sun::star::uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const SAL_OVERRIDE;
242 : virtual bool exportXML( OUString& rStrExpValue, const ::com::sun::star::uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const SAL_OVERRIDE;
243 : };
244 :
245 1268 : class XmlScPropHdl_PrintContent : public XMLPropertyHandler
246 : {
247 : public:
248 : virtual ~XmlScPropHdl_PrintContent();
249 : virtual bool equals( const ::com::sun::star::uno::Any& r1, const ::com::sun::star::uno::Any& r2 ) const SAL_OVERRIDE;
250 : virtual bool importXML( const OUString& rStrImpValue, ::com::sun::star::uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const SAL_OVERRIDE;
251 : virtual bool exportXML( OUString& rStrExpValue, const ::com::sun::star::uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const SAL_OVERRIDE;
252 : };
253 :
254 2536 : class XmlScPropHdl_JustifyMethod : public XMLPropertyHandler
255 : {
256 : public:
257 : virtual ~XmlScPropHdl_JustifyMethod();
258 : virtual bool equals( const ::com::sun::star::uno::Any& r1, const ::com::sun::star::uno::Any& r2 ) const SAL_OVERRIDE;
259 : virtual bool importXML( const OUString& rStrImpValue, ::com::sun::star::uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const SAL_OVERRIDE;
260 : virtual bool exportXML( OUString& rStrExpValue, const ::com::sun::star::uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const SAL_OVERRIDE;
261 : };
262 :
263 1268 : class XmlScPropHdl_HoriJustify : public XMLPropertyHandler
264 : {
265 : public:
266 : virtual ~XmlScPropHdl_HoriJustify();
267 : virtual bool equals( const ::com::sun::star::uno::Any& r1, const ::com::sun::star::uno::Any& r2 ) const SAL_OVERRIDE;
268 : virtual bool importXML( const OUString& rStrImpValue, ::com::sun::star::uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const SAL_OVERRIDE;
269 : virtual bool exportXML( OUString& rStrExpValue, const ::com::sun::star::uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const SAL_OVERRIDE;
270 : };
271 :
272 1268 : class XmlScPropHdl_HoriJustifySource : public XMLPropertyHandler
273 : {
274 : public:
275 : virtual ~XmlScPropHdl_HoriJustifySource();
276 : virtual bool equals( const ::com::sun::star::uno::Any& r1, const ::com::sun::star::uno::Any& r2 ) const SAL_OVERRIDE;
277 : virtual bool importXML( const OUString& rStrImpValue, ::com::sun::star::uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const SAL_OVERRIDE;
278 : virtual bool exportXML( OUString& rStrExpValue, const ::com::sun::star::uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const SAL_OVERRIDE;
279 : };
280 :
281 1268 : class XmlScPropHdl_HoriJustifyRepeat : public XMLPropertyHandler
282 : {
283 : public:
284 : virtual ~XmlScPropHdl_HoriJustifyRepeat();
285 : virtual bool equals( const ::com::sun::star::uno::Any& r1, const ::com::sun::star::uno::Any& r2 ) const SAL_OVERRIDE;
286 : virtual bool importXML( const OUString& rStrImpValue, ::com::sun::star::uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const SAL_OVERRIDE;
287 : virtual bool exportXML( OUString& rStrExpValue, const ::com::sun::star::uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const SAL_OVERRIDE;
288 : };
289 :
290 1268 : class XmlScPropHdl_Orientation : public XMLPropertyHandler
291 : {
292 : public:
293 : virtual ~XmlScPropHdl_Orientation();
294 : virtual bool equals( const ::com::sun::star::uno::Any& r1, const ::com::sun::star::uno::Any& r2 ) const SAL_OVERRIDE;
295 : virtual bool importXML( const OUString& rStrImpValue, ::com::sun::star::uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const SAL_OVERRIDE;
296 : virtual bool exportXML( OUString& rStrExpValue, const ::com::sun::star::uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const SAL_OVERRIDE;
297 : };
298 :
299 1268 : class XmlScPropHdl_RotateAngle : public XMLPropertyHandler
300 : {
301 : public:
302 : virtual ~XmlScPropHdl_RotateAngle();
303 : virtual bool equals( const ::com::sun::star::uno::Any& r1, const ::com::sun::star::uno::Any& r2 ) const SAL_OVERRIDE;
304 : virtual bool importXML( const OUString& rStrImpValue, ::com::sun::star::uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const SAL_OVERRIDE;
305 : virtual bool exportXML( OUString& rStrExpValue, const ::com::sun::star::uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const SAL_OVERRIDE;
306 : };
307 :
308 1268 : class XmlScPropHdl_RotateReference : public XMLPropertyHandler
309 : {
310 : public:
311 : virtual ~XmlScPropHdl_RotateReference();
312 : virtual bool equals( const ::com::sun::star::uno::Any& r1, const ::com::sun::star::uno::Any& r2 ) const SAL_OVERRIDE;
313 : virtual bool importXML( const OUString& rStrImpValue, ::com::sun::star::uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const SAL_OVERRIDE;
314 : virtual bool exportXML( OUString& rStrExpValue, const ::com::sun::star::uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const SAL_OVERRIDE;
315 : };
316 :
317 1268 : class XmlScPropHdl_VertJustify : public XMLPropertyHandler
318 : {
319 : public:
320 : virtual ~XmlScPropHdl_VertJustify();
321 : virtual bool equals( const ::com::sun::star::uno::Any& r1, const ::com::sun::star::uno::Any& r2 ) const SAL_OVERRIDE;
322 : virtual bool importXML( const OUString& rStrImpValue, ::com::sun::star::uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const SAL_OVERRIDE;
323 : virtual bool exportXML( OUString& rStrExpValue, const ::com::sun::star::uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const SAL_OVERRIDE;
324 : };
325 :
326 1268 : class XmlScPropHdl_BreakBefore : public XMLPropertyHandler
327 : {
328 : public:
329 : virtual ~XmlScPropHdl_BreakBefore();
330 : virtual bool equals( const ::com::sun::star::uno::Any& r1, const ::com::sun::star::uno::Any& r2 ) const SAL_OVERRIDE;
331 : virtual bool importXML( const OUString& rStrImpValue, ::com::sun::star::uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const SAL_OVERRIDE;
332 : virtual bool exportXML( OUString& rStrExpValue, const ::com::sun::star::uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const SAL_OVERRIDE;
333 : };
334 :
335 1268 : class XmlScPropHdl_IsTextWrapped : public XMLPropertyHandler
336 : {
337 : public:
338 : virtual ~XmlScPropHdl_IsTextWrapped();
339 : virtual bool equals( const ::com::sun::star::uno::Any& r1, const ::com::sun::star::uno::Any& r2 ) const SAL_OVERRIDE;
340 : virtual bool importXML( const OUString& rStrImpValue, ::com::sun::star::uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const SAL_OVERRIDE;
341 : virtual bool exportXML( OUString& rStrExpValue, const ::com::sun::star::uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const SAL_OVERRIDE;
342 : };
343 :
344 1268 : class XmlScPropHdl_IsEqual : public XMLPropertyHandler
345 : {
346 : public:
347 2536 : virtual ~XmlScPropHdl_IsEqual() {}
348 34 : virtual bool equals( const ::com::sun::star::uno::Any& /* r1 */, const ::com::sun::star::uno::Any& /* r2 */ ) const SAL_OVERRIDE { return true; }
349 : virtual bool importXML( const OUString& rStrImpValue, ::com::sun::star::uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const SAL_OVERRIDE;
350 : virtual bool exportXML( OUString& rStrExpValue, const ::com::sun::star::uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const SAL_OVERRIDE;
351 : };
352 :
353 1268 : class XmlScPropHdl_Vertical : public XMLPropertyHandler
354 : {
355 : public:
356 : virtual ~XmlScPropHdl_Vertical();
357 : virtual bool equals( const ::com::sun::star::uno::Any& r1, const ::com::sun::star::uno::Any& r2 ) const SAL_OVERRIDE;
358 : virtual bool importXML( const OUString& rStrImpValue, ::com::sun::star::uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const SAL_OVERRIDE;
359 : virtual bool exportXML( OUString& rStrExpValue, const ::com::sun::star::uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const SAL_OVERRIDE;
360 : };
361 :
362 : #endif
363 :
364 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|