mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-12 14:05:59 +00:00
0d43ba149a
For one, it still contains a few things that are already in CVS (the 'brown paperbag' changes). Secondly, this changes the ParagraphList to a std::vector but does not yet take full advantage of it except removing LyXText::parOffset() and similar. I had an extensive talk with my profiler and we are happy nevertheless. This also moves almost all Cut&Paste specific stuff from text.C to CutAndPaste.C. Much smaller interface now... Namespace CutAndPaste is now lyx::cap::. Was inconsistent with the rest.... Make ParagraphList a proper class. We'll need this later for a specialized erase/insert. Remove some unneeded prototypes and function declarations Use ParameterStruct directly instead of ShareContainer<ParameterStruct> Inline a few accesses to CursorSlice members as suggested by the profiler. Fix commandline conversion crash reported by Kayvan. Replace PosIterator by DocumentIterator. The latter can also iterate through math and nested text in math... Remove math specific hack from Documentiterator Derive InsetCollapsable from InsetText instead of using an InsetText member. This give us the opportunity to get rid of the InsetOld::owner_ backpointer. Cosmetics in CutAndPaste.C and cursor.C. Fix nasty crash (popping slices off an empty selection anchor). Add a few asserts. Remove all 'manual' update calls. We do now one per user interaction which is completely sufficient. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@8527 a592a061-630c-0410-9148-cb99ea01b6c8
165 lines
4.0 KiB
C
165 lines
4.0 KiB
C
/**
|
|
* \file output_linuxdoc.C
|
|
* This file is part of LyX, the document processor.
|
|
* Licence details can be found in the file COPYING.
|
|
*
|
|
* \author Lars Gullik Bjønnes
|
|
* \author José Matos
|
|
*
|
|
* Full author contact details are available in file CREDITS.
|
|
*/
|
|
|
|
#include <config.h>
|
|
|
|
#include "output_linuxdoc.h"
|
|
|
|
#include "buffer.h"
|
|
#include "bufferparams.h"
|
|
#include "paragraph.h"
|
|
#include "paragraph_funcs.h"
|
|
#include "ParagraphList_fwd.h"
|
|
#include "ParagraphParameters.h"
|
|
#include "sgml.h"
|
|
|
|
#include <stack>
|
|
|
|
#ifdef HAVE_LOCALE
|
|
#endif
|
|
|
|
using std::ostream;
|
|
using std::stack;
|
|
using std::vector;
|
|
using std::string;
|
|
|
|
void linuxdocParagraphs(Buffer const & buf,
|
|
ParagraphList const & paragraphs,
|
|
ostream & os,
|
|
OutputParams const & runparams)
|
|
{
|
|
|
|
Paragraph::depth_type depth = 0; // paragraph depth
|
|
string item_name;
|
|
vector<string> environment_stack(5);
|
|
|
|
ParagraphList::iterator pit = const_cast<ParagraphList&>(paragraphs).begin();
|
|
ParagraphList::iterator pend = const_cast<ParagraphList&>(paragraphs).end();
|
|
for (; pit != pend; ++pit) {
|
|
LyXLayout_ptr const & style = pit->layout();
|
|
// treat <toc> as a special case for compatibility with old code
|
|
if (pit->isInset(0)) {
|
|
InsetBase * inset = pit->getInset(0);
|
|
if (inset->lyxCode() == InsetOld::TOC_CODE) {
|
|
string const temp = "toc";
|
|
sgml::openTag(os, depth, false, temp);
|
|
continue;
|
|
}
|
|
}
|
|
|
|
// environment tag closing
|
|
for (; depth > pit->params().depth(); --depth) {
|
|
sgml::closeTag(os, depth, false, environment_stack[depth]);
|
|
environment_stack[depth].erase();
|
|
}
|
|
|
|
// write opening SGML tags
|
|
switch (style->latextype) {
|
|
case LATEX_PARAGRAPH:
|
|
if (depth == pit->params().depth()
|
|
&& !environment_stack[depth].empty()) {
|
|
sgml::closeTag(os, depth, false, environment_stack[depth]);
|
|
environment_stack[depth].erase();
|
|
if (depth)
|
|
--depth;
|
|
else
|
|
os << "</p>";
|
|
}
|
|
sgml::openTag(os, depth, false, style->latexname());
|
|
break;
|
|
|
|
case LATEX_COMMAND:
|
|
if (depth != 0)
|
|
//error(ErrorItem(_("Error:"), _("Wrong depth for LatexType Command.\n"), pit->id(), 0, pit->size()));
|
|
;
|
|
|
|
if (!environment_stack[depth].empty()) {
|
|
sgml::closeTag(os, depth, false, environment_stack[depth]);
|
|
os << "</p>";
|
|
}
|
|
|
|
environment_stack[depth].erase();
|
|
sgml::openTag(os, depth, false, style->latexname());
|
|
break;
|
|
|
|
case LATEX_ENVIRONMENT:
|
|
case LATEX_ITEM_ENVIRONMENT:
|
|
case LATEX_BIB_ENVIRONMENT: {
|
|
string const & latexname = style->latexname();
|
|
|
|
if (depth == pit->params().depth()
|
|
&& environment_stack[depth] != latexname) {
|
|
sgml::closeTag(os, depth, false,
|
|
environment_stack[depth]);
|
|
environment_stack[depth].erase();
|
|
}
|
|
if (depth < pit->params().depth()) {
|
|
depth = pit->params().depth();
|
|
environment_stack[depth].erase();
|
|
}
|
|
if (environment_stack[depth] != latexname) {
|
|
if (depth == 0) {
|
|
sgml::openTag(os, depth, false, "p");
|
|
}
|
|
sgml::openTag(os, depth, false, latexname);
|
|
|
|
if (environment_stack.size() == depth + 1)
|
|
environment_stack.push_back("!-- --");
|
|
environment_stack[depth] = latexname;
|
|
}
|
|
|
|
if (style->latexparam() == "CDATA")
|
|
os << "<![CDATA[";
|
|
|
|
if (style->latextype == LATEX_ENVIRONMENT) break;
|
|
|
|
if (style->labeltype == LABEL_MANUAL)
|
|
item_name = "tag";
|
|
else
|
|
item_name = "item";
|
|
|
|
sgml::openTag(os, depth + 1, false, item_name);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
sgml::openTag(os, depth, false, style->latexname());
|
|
break;
|
|
}
|
|
|
|
pit->simpleLinuxDocOnePar(buf, os,
|
|
outerFont(pit - const_cast<ParagraphList&>(paragraphs).begin(), paragraphs),
|
|
runparams, depth);
|
|
|
|
os << "\n";
|
|
// write closing SGML tags
|
|
switch (style->latextype) {
|
|
case LATEX_COMMAND:
|
|
break;
|
|
case LATEX_ENVIRONMENT:
|
|
case LATEX_ITEM_ENVIRONMENT:
|
|
case LATEX_BIB_ENVIRONMENT:
|
|
if (style->latexparam() == "CDATA")
|
|
os << "]]>";
|
|
break;
|
|
default:
|
|
sgml::closeTag(os, depth, false, style->latexname());
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Close open tags
|
|
for (int i = depth; i >= 0; --i)
|
|
sgml::closeTag(os, depth, false, environment_stack[i]);
|
|
}
|
|
|
|
|