]> git.lyx.org Git - lyx.git/blob - src/output_linuxdoc.C
Rename ascii to plaintext and LatexRunParams to OutputParams.
[lyx.git] / src / output_linuxdoc.C
1 /**
2  * \file output_linuxdoc.C
3  * This file is part of LyX, the document processor.
4  * Licence details can be found in the file COPYING.
5  *
6  * \author Lars Gullik Bjønnes
7  * \author José Matos
8  *
9  * Full author contact details are available in file CREDITS.
10  */
11
12 #include <config.h>
13
14 #include "output_linuxdoc.h"
15
16 #include "buffer.h"
17 #include "bufferparams.h"
18 #include "paragraph.h"
19 #include "paragraph_funcs.h"
20 #include "ParagraphParameters.h"
21 #include "sgml.h"
22
23 #include <stack>
24
25 #ifdef HAVE_LOCALE
26 #endif
27
28 using std::ostream;
29 using std::stack;
30 using std::vector;
31 using std::string;
32
33 void linuxdocParagraphs(Buffer const & buf,
34                         ParagraphList const & paragraphs,
35                         ostream & os,
36                         OutputParams const & runparams)
37 {
38         
39         Paragraph::depth_type depth = 0; // paragraph depth
40         string item_name;
41         vector<string> environment_stack(5);
42
43         ParagraphList::iterator pit = const_cast<ParagraphList&>(paragraphs).begin();
44         ParagraphList::iterator pend = const_cast<ParagraphList&>(paragraphs).end();
45         for (; pit != pend; ++pit) {
46                 LyXLayout_ptr const & style = pit->layout();
47                 // treat <toc> as a special case for compatibility with old code
48                 if (pit->isInset(0)) {
49                         InsetOld * inset = pit->getInset(0);
50                         InsetOld::Code lyx_code = inset->lyxCode();
51                         if (lyx_code == InsetOld::TOC_CODE) {
52                                 string const temp = "toc";
53                                 sgml::openTag(os, depth, false, temp);
54                                 continue;
55                         }
56                 }
57
58                 // environment tag closing
59                 for (; depth > pit->params().depth(); --depth) {
60                         sgml::closeTag(os, depth, false, environment_stack[depth]);
61                         environment_stack[depth].erase();
62                 }
63
64                 // write opening SGML tags
65                 switch (style->latextype) {
66                 case LATEX_PARAGRAPH:
67                         if (depth == pit->params().depth()
68                            && !environment_stack[depth].empty()) {
69                                 sgml::closeTag(os, depth, false, environment_stack[depth]);
70                                 environment_stack[depth].erase();
71                                 if (depth)
72                                         --depth;
73                                 else
74                                         os << "</p>";
75                         }
76                         sgml::openTag(os, depth, false, style->latexname());
77                         break;
78
79                 case LATEX_COMMAND:
80                         if (depth != 0)
81                                 //error(ErrorItem(_("Error:"), _("Wrong depth for LatexType Command.\n"), pit->id(), 0, pit->size()));
82                                 ;
83
84                         if (!environment_stack[depth].empty()) {
85                                 sgml::closeTag(os, depth, false, environment_stack[depth]);
86                                 os << "</p>";
87                         }
88
89                         environment_stack[depth].erase();
90                         sgml::openTag(os, depth, false, style->latexname());
91                         break;
92
93                 case LATEX_ENVIRONMENT:
94                 case LATEX_ITEM_ENVIRONMENT:
95                 case LATEX_BIB_ENVIRONMENT:
96                 {
97                         string const & latexname = style->latexname();
98
99                         if (depth == pit->params().depth()
100                             && environment_stack[depth] != latexname) {
101                                 sgml::closeTag(os, depth, false,
102                                              environment_stack[depth]);
103                                 environment_stack[depth].erase();
104                         }
105                         if (depth < pit->params().depth()) {
106                                depth = pit->params().depth();
107                                environment_stack[depth].erase();
108                         }
109                         if (environment_stack[depth] != latexname) {
110                                 if (depth == 0) {
111                                         sgml::openTag(os, depth, false, "p");
112                                 }
113                                 sgml::openTag(os, depth, false, latexname);
114
115                                 if (environment_stack.size() == depth + 1)
116                                         environment_stack.push_back("!-- --");
117                                 environment_stack[depth] = latexname;
118                         }
119
120                         if (style->latexparam() == "CDATA")
121                                 os << "<![CDATA[";
122
123                         if (style->latextype == LATEX_ENVIRONMENT) break;
124
125                         if (style->labeltype == LABEL_MANUAL)
126                                 item_name = "tag";
127                         else
128                                 item_name = "item";
129
130                         sgml::openTag(os, depth + 1, false, item_name);
131                 }
132                 break;
133
134                 default:
135                         sgml::openTag(os, depth, false, style->latexname());
136                         break;
137                 }
138
139                 pit->simpleLinuxDocOnePar(buf, os, outerFont(pit, paragraphs),
140                                           runparams, depth);
141
142                 os << "\n";
143                 // write closing SGML tags
144                 switch (style->latextype) {
145                 case LATEX_COMMAND:
146                         break;
147                 case LATEX_ENVIRONMENT:
148                 case LATEX_ITEM_ENVIRONMENT:
149                 case LATEX_BIB_ENVIRONMENT:
150                         if (style->latexparam() == "CDATA")
151                                 os << "]]>";
152                         break;
153                 default:
154                         sgml::closeTag(os, depth, false, style->latexname());
155                         break;
156                 }
157         }
158
159         // Close open tags
160         for (int i = depth; i >= 0; --i)
161                 sgml::closeTag(os, depth, false, environment_stack[i]);
162 }
163
164