1 // -*- C++ -*-
2 /**
3  * \file InsetLayout.h
4  * This file is part of LyX, the document processor.
5  * Licence details can be found in the file COPYING.
6  *
7  * \author Martin Vermeer
8  * \author Richard Heck
9  *
10  * Full author contact details are available in file CREDITS.
11  */
12 
13 #ifndef INSET_LAYOUT_H
14 #define INSET_LAYOUT_H
15 
16 #include "ColorCode.h"
17 #include "FontInfo.h"
18 #include "Layout.h"
19 
20 #include "support/docstring.h"
21 
22 #include <set>
23 #include <string>
24 
25 namespace lyx {
26 
27 class Lexer;
28 class TextClass;
29 
30 ///
31 class InsetLayout {
32 public:
33 	///
34 	InsetLayout();
35 	///
36 	enum InsetDecoration {
37 		CLASSIC,
38 		MINIMALISTIC,
39 		CONGLOMERATE,
40 		DEFAULT
41 	};
42 	///
43 	enum InsetLyXType {
44 		NOLYXTYPE,
45 		CHARSTYLE,
46 		CUSTOM,
47 		ELEMENT,
48 		END,
49 		STANDARD
50 	};
51 	///
52 	enum InsetLaTeXType {
53 		NOLATEXTYPE,
54 		COMMAND,
55 		ENVIRONMENT,
56 		ILT_ERROR
57 	};
58 	///
59 	bool read(Lexer & lexrc, TextClass const & tclass);
60 	///
name()61 	docstring name() const { return name_; }
62 	///
setName(docstring const & n)63 	void setName(docstring const & n) { name_ = n; }
64 	///
lyxtype()65 	InsetLyXType lyxtype() const { return lyxtype_; }
66 	///
labelstring()67 	docstring labelstring() const { return labelstring_; }
68 	///
contentaslabel()69 	bool contentaslabel() const { return contentaslabel_; }
70 	///
decoration()71 	InsetDecoration decoration() const { return decoration_; }
72 	///
latextype()73 	InsetLaTeXType latextype() const { return latextype_; }
74 	///
latexname()75 	std::string latexname() const { return latexname_; }
76 	///
latexparam()77 	std::string latexparam() const { return latexparam_; }
78 	///
leftdelim()79 	docstring leftdelim() const { return leftdelim_; }
80 	///
rightdelim()81 	docstring rightdelim() const { return rightdelim_; }
82 	///
font()83 	FontInfo font() const { return font_; }
84 	///
labelfont()85 	FontInfo labelfont() const { return labelfont_; }
86 	///
bgcolor()87 	ColorCode bgcolor() const { return bgcolor_; }
88 	///
latexargs()89 	Layout::LaTeXArgMap const & latexargs() const { return latexargs_; }
90 	///
postcommandargs()91 	Layout::LaTeXArgMap const & postcommandargs() const { return postcommandargs_; }
92 	/// Returns latexargs() + postcommandargs().
93 	/// But note that it returns a *copy*, not a reference, so do not do
94 	/// anything like:
95 	///   Layout::LaTeXArgMap::iterator it = args().begin();
96 	///   Layout::LaTeXArgMap::iterator en = args().end();
97 	/// Those are iterators for different containers.
98 	Layout::LaTeXArgMap args() const;
99 	///
100 	unsigned int optArgs() const;
101 	///
102 	unsigned int requiredArgs() const;
103 	///
preamble()104 	docstring preamble() const { return preamble_; }
105 	/// Get language dependent macro definitions needed for this inset
langpreamble()106 	docstring const langpreamble() const { return langpreamble_; }
107 	/// Get language and babel dependent macro definitions needed for
108 	/// this inset
babelpreamble()109 	docstring const babelpreamble() const { return babelpreamble_; }
110 	///
fixedwidthpreambleencoding()111 	bool fixedwidthpreambleencoding() const { return fixedwidthpreambleencoding_; }
112 	///
counter()113 	docstring counter() const { return counter_; }
114 	///
refprefix()115 	docstring refprefix() const { return refprefix_; }
116 	/// The tag enclosing all the material in this inset. Default is "span".
117 	std::string const & htmltag() const;
118 	/// Additional attributes for inclusion with the start tag. Default (if
119 	/// a tag is provided) is: class="name".
120 	std::string const & htmlattr() const;
121 	/// Tag for individual paragraphs in the inset. Default is none.
htmlinnertag()122 	std::string const & htmlinnertag() const { return htmlinnertag_; }
123 	/// Attributes for that tag. Default (if a tag is provided) is:
124 	/// class="name_inner".
125 	std::string const & htmlinnerattr() const;
126 	/// A label for this environment, possibly including a reference
127 	/// to a counter. E.g., for footnote, it might be:
128 	///    \arabic{footnote}
129 	/// No default.
130 	/// FIXME Could we get this from the layout?
htmllabel()131 	std::string const & htmllabel() const { return htmllabel_; }
132 	///
htmllabeltag()133 	inline std::string htmllabeltag() const { return "span"; }
134 	///
htmllabelattr()135 	std::string htmllabelattr() const
136 		{ return "class=\"" + defaultCSSClass() + "_label\""; }
137 	/// CSS associated with this inset.
138 	docstring htmlstyle() const;
139 	/// Additional material for the header.
htmlpreamble()140 	docstring htmlpreamble() const { return htmlpreamble_; }
141 	/// Whether this inset represents a "block" of material, i.e., a set
142 	/// of paragraphs of its own (true), or should be run into the previous
143 	/// paragraph (false). Examples:
144 	///   For branches, this is false.
145 	///   For footnotes, this is true.
146 	/// Defaults to true.
htmlisblock()147 	bool htmlisblock() const { return htmlisblock_; }
148 	///
requires()149 	std::set<std::string> requires() const { return requires_; }
150 	///
isMultiPar()151 	bool isMultiPar() const { return multipar_; }
152 	///
forcePlainLayout()153 	bool forcePlainLayout() const { return forceplain_; }
154 	///
allowParagraphCustomization()155 	bool allowParagraphCustomization() const { return custompars_; }
156 	///
isPassThru()157 	bool isPassThru() const { return passthru_; }
158 	///
passThruChars()159 	docstring passThruChars() const { return passthru_chars_; }
160 	///
parbreakIsNewline()161 	bool parbreakIsNewline() const { return parbreakisnewline_; }
162 	///
isNeedProtect()163 	bool isNeedProtect() const { return needprotect_; }
164 	///
isFreeSpacing()165 	bool isFreeSpacing() const { return freespacing_; }
166 	///
isKeepEmpty()167 	bool isKeepEmpty() const { return keepempty_; }
168 	///
forceLTR()169 	bool forceLTR() const { return forceltr_; }
170 	///
forceOwnlines()171 	bool forceOwnlines() const { return forceownlines_; }
172 	///
isInToc()173 	bool isInToc() const { return intoc_; }
174 	///
spellcheck()175 	bool spellcheck() const { return spellcheck_; }
176 	///
resetsFont()177 	bool resetsFont() const { return resetsfont_; }
178 	///
isDisplay()179 	bool isDisplay() const { return display_; }
180 	///
forcelocalfontswitch()181 	bool forcelocalfontswitch() const { return forcelocalfontswitch_; }
182 	///
obsoleted_by()183 	docstring const & obsoleted_by() const { return obsoleted_by_; }
184 	///
addToToc()185 	bool addToToc() const { return add_to_toc_; }
186 	///
tocType()187 	std::string tocType() const { return toc_type_; }
188 	///
isTocCaption()189 	bool isTocCaption() const { return is_toc_caption_; }
190 private:
191 	///
192 	void makeDefaultCSS() const;
193 	///
194 	std::string defaultCSSClass() const;
195 	///
196 	void readArgument(Lexer &);
197 	///
198 	docstring name_;
199 	/**
200 		* This is only used (at present) to decide where to put them on the menus.
201 		* Values are 'charstyle', 'custom' (things that by default look like a
202 		* footnote), 'element' (docbook), 'standard'.
203 		*/
204 	InsetLyXType lyxtype_;
205 	///
206 	docstring labelstring_;
207 	///
208 	bool contentaslabel_;
209 	///
210 	InsetDecoration decoration_;
211 	///
212 	InsetLaTeXType latextype_;
213 	///
214 	std::string latexname_;
215 	///
216 	std::string latexparam_;
217 	///
218 	docstring leftdelim_;
219 	///
220 	docstring rightdelim_;
221 	///
222 	FontInfo font_;
223 	///
224 	FontInfo labelfont_;
225 	///
226 	ColorCode bgcolor_;
227 	///
228 	docstring counter_;
229 	///
230 	docstring preamble_;
231 	/// Language dependent macro definitions needed for this inset
232 	docstring langpreamble_;
233 	/// Language and babel dependent macro definitions needed for this inset
234 	docstring babelpreamble_;
235 	///
236 	bool fixedwidthpreambleencoding_;
237 	///
238 	docstring refprefix_;
239 	///
240 	mutable std::string htmltag_;
241 	///
242 	mutable std::string htmlattr_;
243 	///
244 	std::string htmlinnertag_;
245 	///
246 	mutable std::string htmlinnerattr_;
247 	///
248 	std::string htmllabel_;
249 	///
250 	docstring htmlstyle_;
251 	/// Cache for default CSS info for this inset.
252 	mutable docstring htmldefaultstyle_;
253 	/// Cache for default CSS class.
254 	mutable std::string defaultcssclass_;
255 	/// Whether to force generation of default CSS even if some is given.
256 	/// False by default.
257 	bool htmlforcecss_;
258 	///
259 	docstring htmlpreamble_;
260 	///
261 	bool htmlisblock_;
262 	///
263 	std::set<std::string> requires_;
264 	///
265 	bool multipar_;
266 	///
267 	bool custompars_;
268 	///
269 	bool forceplain_;
270 	///
271 	bool passthru_;
272 	///
273 	docstring passthru_chars_;
274 	///
275 	bool parbreakisnewline_;
276 	///
277 	bool freespacing_;
278 	///
279 	bool keepempty_;
280 	///
281 	bool forceltr_;
282 	///
283 	bool forceownlines_;
284 	///
285 	bool needprotect_;
286 	/// should the contents be written to TOC strings?
287 	bool intoc_;
288 	/// check spelling of this inset?
289 	bool spellcheck_;
290 	///
291 	bool resetsfont_;
292 	///
293 	bool display_;
294 	///
295 	bool forcelocalfontswitch_;
296 	/** Name of an insetlayout that has replaced this insetlayout.
297 	    This is used to rename an insetlayout, while keeping backward
298 	    compatibility
299 	*/
300 	docstring obsoleted_by_;
301 	///
302 	Layout::LaTeXArgMap latexargs_;
303 	///
304 	Layout::LaTeXArgMap postcommandargs_;
305 	///
306 	bool add_to_toc_;
307 	///
308 	std::string toc_type_;
309 	///
310 	bool is_toc_caption_;
311 };
312 
313 ///
314 InsetLayout::InsetLyXType translateLyXType(std::string const & str);
315 InsetLayout::InsetDecoration translateDecoration(std::string const & str);
316 
317 } // namespace lyx
318 
319 #endif
320