]> git.lyx.org Git - lyx.git/blobdiff - src/Paragraph.cpp
* src/LyXRC.{cpp,h}:
[lyx.git] / src / Paragraph.cpp
index 266d4a719318af7cbed4e05884cb8773f351d882..12a267fb5f48d1d90bb14f0b5dc8a733a707fb3b 100644 (file)
@@ -109,10 +109,10 @@ public:
                             Layout const & style);
 
        /// Output consecutive unicode chars, belonging to the same script as
-       /// specified by the latex macro \p ltx, to \p os starting from \p c.
+       /// specified by the latex macro \p ltx, to \p os starting from \p i.
        /// \return the number of characters written.
-       int writeScriptChars(odocstream & os, char_type c, docstring const & ltx,
-                          Change &, Encoding const &, pos_type &);
+       int writeScriptChars(odocstream & os, docstring const & ltx,
+                          Change &, Encoding const &, pos_type & i);
 
        /// This could go to ParagraphParameters if we want to.
        int startTeXParParams(BufferParams const &, odocstream &, TexRow &,
@@ -190,6 +190,10 @@ public:
        ///
        ParagraphParameters params_;
 
+       /// position of the paragraph in the buffer. Only macros from
+       /// paragraphs strictly smaller are visible in this paragraph
+       unsigned int macrocontext_position_;
+       
        /// for recording and looking up changes
        Changes changes_;
 
@@ -243,6 +247,7 @@ Paragraph::Private::Private(Paragraph * owner)
        : owner_(owner), inset_owner_(0), begin_of_body_(0)
 {
        id_ = paragraph_id++;
+       macrocontext_position_ = 0;
        text_.reserve(100);
 }
 
@@ -412,7 +417,7 @@ void Paragraph::Private::insertChar(pos_type pos, char_type c,
 
        // This is actually very common when parsing buffers (and
        // maybe inserting ascii text)
-       if (pos == text_.size()) {
+       if (pos == pos_type(text_.size())) {
                // when appending characters, no need to update tables
                text_.push_back(c);
                return;
@@ -570,18 +575,19 @@ bool Paragraph::Private::simpleTeXBlanks(OutputParams const & runparams,
 
 
 int Paragraph::Private::writeScriptChars(odocstream & os,
-                                        char_type c,
                                         docstring const & ltx,
                                         Change & runningChange,
                                         Encoding const & encoding,
                                         pos_type & i)
 {
-       // We only arrive here when a proper language for character c has not
-       // been specified (i.e., it could not be translated in the current
+       // FIXME: modifying i here is not very nice...
+
+       // We only arrive here when a proper language for character text_[i] has
+       // not been specified (i.e., it could not be translated in the current
        // latex encoding) and it belongs to a known script.
-       // Parameter ltx contains the latex translation of c as specified in
+       // Parameter ltx contains the latex translation of text_[i] as specified in
        // the unicodesymbols file and is something like "\textXXX{<spec>}".
-       // The latex macro name "textXXX" specifies the script to which c
+       // The latex macro name "textXXX" specifies the script to which text_[i]
        // belongs and we use it in order to check whether characters from the
        // same script immediately follow, such that we can collect them in a
        // single "\textXXX" macro. So, we have to retain "\textXXX{<spec>"
@@ -899,7 +905,7 @@ void Paragraph::Private::latexSpecialChar(
                docstring const latex = encoding.latexChar(c);
                if (Encodings::isKnownScriptChar(c, script)
                    && prefixIs(latex, from_ascii("\\" + script)))
-                       column += writeScriptChars(os, c, latex,
+                       column += writeScriptChars(os, latex,
                                        running_change, encoding, i) - 1;
                else if (latex.length() > 1 && latex[latex.length() - 1] != '}') {
                        // Prevent eating of a following
@@ -1215,7 +1221,7 @@ void Paragraph::appendChar(char_type c, Font const & font,
 void Paragraph::appendString(docstring const & s, Font const & font,
                Change const & change)
 {
-       size_t end = s.size();
+       pos_type end = s.size();
        size_t oldsize = d->text_.size();
        size_t newsize = oldsize + end;
        size_t capacity = d->text_.capacity();
@@ -1230,7 +1236,8 @@ void Paragraph::appendString(docstring const & s, Font const & font,
                // track change
                d->changes_.insert(change, i);
        }
-       d->fontlist_.setRange(oldsize, newsize, font);
+       d->fontlist_.set(oldsize, font);
+       d->fontlist_.set(newsize - 1, font);
 }
 
 
@@ -1276,7 +1283,9 @@ bool Paragraph::insetAllowed(InsetCode code)
 
 void Paragraph::resetFonts(Font const & font)
 {
-       d->fontlist_.setRange(0, d->text_.size(), font);
+       d->fontlist_.clear();
+       d->fontlist_.set(0, font);
+       d->fontlist_.set(d->text_.size() - 1, font);
 }
 
 // Gets uninstantiated font setting at position.
@@ -1364,11 +1373,10 @@ Font const Paragraph::getFont(BufferParams const & bparams, pos_type pos,
 Font const Paragraph::getLabelFont
        (BufferParams const & bparams, Font const & outerfont) const
 {
-       Font tmpfont = layout()->labelfont;
-       tmpfont.setLanguage(getParLanguage(bparams));
-       tmpfont.fontInfo().realize(outerfont.fontInfo());
-       tmpfont.fontInfo().realize(bparams.getFont().fontInfo());
-       return tmpfont;
+       FontInfo tmpfont = layout()->labelfont;
+       tmpfont.realize(outerfont.fontInfo());
+       tmpfont.realize(bparams.getFont().fontInfo());
+       return Font(tmpfont, getParLanguage(bparams));
 }
 
 
@@ -2156,7 +2164,7 @@ void Paragraph::simpleDocBookOnePar(Buffer const & buf,
        bool emph_flag = false;
 
        LayoutPtr const & style = layout();
-       Font font_old =
+       FontInfo font_old =
                style->labeltype == LABEL_MANUAL ? style->labelfont : style->font;
 
        if (style->pass_thru && !d->onlyText(buf, outerfont, initial))
@@ -2167,7 +2175,7 @@ void Paragraph::simpleDocBookOnePar(Buffer const & buf,
                Font font = getFont(buf.params(), i, outerfont);
 
                // handle <emphasis> tag
-               if (font_old.fontInfo().emph() != font.fontInfo().emph()) {
+               if (font_old.emph() != font.fontInfo().emph()) {
                        if (font.fontInfo().emph() == FONT_ON) {
                                os << "<emphasis>";
                                emph_flag = true;
@@ -2188,7 +2196,7 @@ void Paragraph::simpleDocBookOnePar(Buffer const & buf,
                        else
                                os << sgml::escapeChar(c);
                }
-               font_old = font;
+               font_old = font.fontInfo();
        }
 
        if (emph_flag) {
@@ -2486,6 +2494,18 @@ int Paragraph::checkBiblio(bool track_changes)
 }
 
 
+unsigned int Paragraph::macrocontextPosition() const
+{
+       return d->macrocontext_position_;
+}
+
+
+void Paragraph::setMacrocontextPosition(unsigned int pos)
+{
+       d->macrocontext_position_ = pos;
+}
+
+
 void Paragraph::checkAuthors(AuthorList const & authorList)
 {
        d->changes_.checkAuthors(authorList);