]> git.lyx.org Git - lyx.git/blobdiff - src/Paragraph.h
* OutputUi.ui - Reorganize Output pane so it takes less vertical space.
[lyx.git] / src / Paragraph.h
index f5d6a23b26f9b18f20f47542ab3a6c2cdf870c62..ca88dd774e9d48e7f0472b8db35972899af5c0d0 100644 (file)
 #ifndef PARAGRAPH_H
 #define PARAGRAPH_H
 
-#include "FontEnums.h"
+#include "LayoutEnums.h"
 #include "SpellChecker.h"
 
-#include "insets/InsetCode.h"
-
 #include "support/strfwd.h"
 #include "support/types.h"
 
 #include <set>
+#include <vector>
 
 namespace lyx {
 
@@ -32,31 +31,25 @@ class AuthorList;
 class Buffer;
 class BufferParams;
 class Change;
-class Counters;
-class Cursor;
-class CursorSlice;
 class DocIterator;
 class docstring_list;
 class DocumentClass;
 class Inset;
-class InsetBibitem;
 class LaTeXFeatures;
-class Inset_code;
 class InsetList;
 class Language;
 class Layout;
 class Font;
-class Font_size;
-class MetricsInfo;
 class OutputParams;
-class PainterInfo;
 class ParagraphParameters;
-class TexRow;
-class Toc;
+class TocBackend;
 class WordLangTuple;
-class XHTMLStream;
+class XMLStream;
 class otexstream;
 
+/// Inset identifier (above 0x10ffff, for ucs-4)
+char_type const META_INSET = 0x200001;
+
 class FontSpan {
 public:
        /// Invalid font span containing no character
@@ -72,13 +65,13 @@ public:
        {
                return first < s.first;
        }
-       
+
        inline bool operator==(FontSpan const & s) const
        {
                return first == s.first && last == s.last;
        }
 
-       inline bool inside(pos_type p) const
+       inline bool contains(pos_type p) const
        {
                return first <= p && p <= last;
        }
@@ -87,24 +80,24 @@ public:
        {
                return empty() ? 0 : last - first;
        }
-       
+
 
        inline FontSpan intersect(FontSpan const & f) const
        {
                FontSpan result = FontSpan();
-               if (inside(f.first))
+               if (contains(f.first))
                        result.first = f.first;
-               else if (f.inside(first))
+               else if (f.contains(first))
                        result.first = first;
                else
                        return result;
-               if (inside(f.last))
+               if (contains(f.last))
                        result.last = f.last;
-               else if (f.inside(last))
+               else if (f.contains(last))
                        result.last = last;
                return result;
        }
-       
+
        inline bool empty() const
        {
                return first > last;
@@ -129,7 +122,9 @@ enum AsStringParameter
        AS_STR_LABEL = 1, ///< Prefix with paragraph label.
        AS_STR_INSETS = 2, ///< Go into insets.
        AS_STR_NEWLINES = 4, ///< Get also newline characters.
-       AS_STR_SKIPDELETE = 8 ///< Skip deleted text in change tracking.
+       AS_STR_SKIPDELETE = 8, ///< Skip deleted text in change tracking.
+       AS_STR_PLAINTEXT = 16, ///< Don't export formatting when descending into insets.
+       AS_STR_MATHED = 32 ///< Use a format suitable for mathed (eg. for InsetRef).
 };
 
 
@@ -154,7 +149,8 @@ public:
        void setId(int id);
 
        ///
-       void addChangesToToc(DocIterator const & cdit, Buffer const & buf) const;
+       void addChangesToToc(DocIterator const & cdit, Buffer const & buf,
+                            bool output_active, TocBackend & backend) const;
        ///
        Language const * getParLanguage(BufferParams const &) const;
        ///
@@ -174,52 +170,57 @@ public:
        ///             asString(AS_STR_LABEL | AS_STR_INSETS)
        ///             asString(AS_STR_INSETS)
        docstring asString(int options = AS_STR_NONE) const;
-       ///
+
+       /// Convert the paragraph to a string.
+       /// \note If options includes AS_STR_PLAINTEXT, then runparams must be != 0
        docstring asString(pos_type beg, pos_type end,
-               int options = AS_STR_NONE) const;
+                          int options = AS_STR_NONE,
+                          const OutputParams *runparams = 0) const;
        ///
-       void forToc(docstring &, size_t maxlen) const;
-
-       /// Extract only the explicitly visible text (without any formatting),
-       /// descending into insets
-       docstring stringify(pos_type beg, pos_type end, int options, OutputParams & runparams) const;
+       void forOutliner(docstring &, size_t maxlen, bool shorten = true,
+                        bool label = true) const;
 
        ///
        void write(std::ostream &, BufferParams const &,
-                  depth_type & depth) const;
+               depth_type & depth) const;
        ///
        void validate(LaTeXFeatures &) const;
 
        /// \param force means: output even if layout.inpreamble is true.
        void latex(BufferParams const &, Font const & outerfont, otexstream &,
-                  OutputParams const &, int start_pos = 0, int end_pos = -1,
-                  bool force = false) const;
+               OutputParams const &, int start_pos = 0, int end_pos = -1,
+               bool force = false) const;
 
        /// Can we drop the standard paragraph wrapper?
        bool emptyTag() const;
 
-       /// Get the id of the paragraph, usefull for docbook
+       /// Get the id of the paragraph, useful for DocBook
        std::string getID(Buffer const & buf, OutputParams const & runparams) const;
 
        /// Output the first word of a paragraph, return the position where it left.
-       pos_type firstWordDocBook(odocstream & os, OutputParams const & runparams) const;
+       pos_type firstWordDocBook(XMLStream & xs, OutputParams const & runparams) const;
 
        /// Output the first word of a paragraph, return the position where it left.
-       pos_type firstWordLyXHTML(XHTMLStream & xs, OutputParams const & runparams) const;
-
-       /// Writes to stream the docbook representation
-       void simpleDocBookOnePar(Buffer const & buf,
-                                odocstream &,
-                                OutputParams const & runparams,
-                                Font const & outerfont,
-                                pos_type initial = 0) const;
+       pos_type firstWordLyXHTML(XMLStream & xs, OutputParams const & runparams) const;
+
+       /// Outputs to stream the DocBook representation, one element per paragraph.
+       std::tuple<std::vector<docstring>, std::vector<docstring>, std::vector<docstring>>
+       simpleDocBookOnePar(Buffer const & buf,
+                                                                          OutputParams const & runparams,
+                                                                          Font const & outerfont,
+                                                                          pos_type initial = 0,
+                                                                          bool is_last_par = false,
+                                                                          bool ignore_fonts = false) const;
+
        /// \return any material that has had to be deferred until after the
        /// paragraph has closed.
        docstring simpleLyXHTMLOnePar(Buffer const & buf,
-                                XHTMLStream & xs,
-                                OutputParams const & runparams,
-                                Font const & outerfont,
-                                pos_type initial = 0) const;
+                                                                 XMLStream & xs,
+                                                                 OutputParams const & runparams,
+                                                                 Font const & outerfont,
+                                                                 bool start_paragraph = true,
+                                                                 bool close_paragraph = true,
+                                                                 pos_type initial = 0) const;
 
        ///
        bool hasSameLayout(Paragraph const & par) const;
@@ -238,6 +239,10 @@ public:
        ///
        bool isPassThru() const;
        ///
+       bool parbreakIsNewline() const;
+       ///
+       bool isPartOfTextSequence() const;
+       ///
        pos_type size() const;
        ///
        bool empty() const;
@@ -259,10 +264,16 @@ public:
        /// look up change at given pos
        Change const & lookupChange(pos_type pos) const;
 
-       /// is there a change within the given range ?
+       /// is there a change within the given range (does not
+       /// check contained paragraphs)
        bool isChanged(pos_type start, pos_type end) const;
+       /// Are there insets containing changes in the range?
+       bool hasChangedInsets(pos_type start, pos_type end) const;
        /// is there an unchanged char at the given pos ?
        bool isChanged(pos_type pos) const;
+       /// is there a change in the paragraph ?
+       bool isChanged() const;
+
        /// is there an insertion at the given pos ?
        bool isInserted(pos_type pos) const;
        /// is there a deletion at the given pos ?
@@ -273,6 +284,8 @@ public:
        /// will the paragraph be physically merged with the next
        /// one if the imaginary end-of-par character is logically deleted?
        bool isMergedOnEndOfParDeletion(bool trackChanges) const;
+       /// Return Change form of paragraph break
+       Change parEndChange() const;
 
        /// set change for the entire par
        void setChange(Change const & change);
@@ -298,15 +311,15 @@ public:
        ///
        docstring expandLabel(Layout const &, BufferParams const &) const;
        ///
-       docstring expandDocBookLabel(Layout const &, BufferParams const &) const;
-       ///
        docstring const & labelString() const;
        /// the next two functions are for the manual labels
        docstring const getLabelWidthString() const;
        /// Set label width string.
        void setLabelWidthString(docstring const & s);
        /// Actual paragraph alignment used
-       char getAlign() const;
+       LyXAlignment getAlign(BufferParams const &) const;
+       /// Default paragraph alignment as determined by layout
+       LyXAlignment getDefaultAlign(BufferParams const &) const;
        /// The nesting depth of a paragraph
        depth_type getDepth() const;
        /// The maximal possible depth of a paragraph after this one
@@ -331,12 +344,8 @@ public:
        ///
        Font const & getFirstFontSettings(BufferParams const &) const;
 
-       /** Get fully instantiated font. If pos == -1, use the layout
-           font attached to this paragraph.
-           If pos == -2, use the label font of the layout attached here.
-           In all cases, the font is instantiated, i.e. does not have any
-           attributes with values FONT_INHERIT, FONT_IGNORE or
-           FONT_TOGGLE.
+       /** Get fully instantiated font, i.e., one that does not have any
+           attributes with values FONT_INHERIT, FONT_IGNORE or FONT_TOGGLE.
        */
        Font const getFont(BufferParams const &, pos_type pos,
                              Font const & outerfont) const;
@@ -354,12 +363,10 @@ public:
        ///
        char_type getChar(pos_type pos) const;
        /// Get the char, but mirror all bracket characters if it is right-to-left
-       char_type getUChar(BufferParams const &, pos_type pos) const;
+       char_type getUChar(BufferParams const &, OutputParams const &,
+                          pos_type pos) const;
        /// pos <= size() (there is a dummy font change at the end of each par)
        void setFont(pos_type pos, Font const & font);
-       /// Returns the height of the highest font in range
-       FontSize highestFontInRange(pos_type startpos,
-                                       pos_type endpos, FontSize def_size) const;
        ///
        void insert(pos_type pos, docstring const & str,
                    Font const & font, Change const & change);
@@ -377,10 +384,6 @@ public:
        ///
        void insertChar(pos_type pos, char_type c,
                        Font const &, Change const & change);
-       /// Insert \p inset at position \p pos with \p change traking status.
-       /// \return true if successful.
-       bool insertInset(pos_type pos, Inset * inset,
-                        Change const & change);
        /// Insert \p inset at position \p pos with \p change traking status and
        /// \p font.
        /// \return true if successful.
@@ -400,7 +403,9 @@ public:
        ///
        InsetList const & insetList() const;
        ///
-       void setBuffer(Buffer &);
+       void setInsetBuffers(Buffer &);
+       ///
+       void resetBuffer();
 
        ///
        bool isHfill(pos_type pos) const;
@@ -409,13 +414,15 @@ public:
        bool isInset(pos_type pos) const;
        ///
        bool isNewline(pos_type pos) const;
+       ///
+       bool isEnvSeparator(pos_type pos) const;
        /// return true if the char is a word separator
        bool isSeparator(pos_type pos) const;
        ///
        bool isLineSeparator(pos_type pos) const;
        /// True if the character/inset at this point is a word separator.
        /// Note that digits in particular are not considered as word separator.
-       bool isWordSeparator(pos_type pos) const;
+       bool isWordSeparator(pos_type pos, bool const ignore_deleted = false) const;
        /// True if the element at this point is a character that is not a letter.
        bool isChar(pos_type pos) const;
        /// True if the element at this point is a space
@@ -423,6 +430,9 @@ public:
        /// True if the element at this point is a hard hyphen or a apostrophe
        /// If it is enclosed by spaces return false
        bool isHardHyphenOrApostrophe(pos_type pos) const;
+       /// Return true if this paragraph has verbatim content that needs to be
+       /// protected by \cprotect
+       bool needsCProtection(bool const fragile = false) const;
 
        /// returns true if at least one line break or line separator has been deleted
        /// at the beginning of the paragraph (either physically or logically)
@@ -434,12 +444,12 @@ public:
        /// return true if we allow this par to stay empty
        bool allowEmpty() const;
        ///
-       char_type transformChar(char_type c, pos_type pos) const;
-       ///
        ParagraphParameters & params();
        ///
        ParagraphParameters const & params() const;
 
+       /// Check whether a call to fixBiblio is needed.
+       bool brokenBiblio() const;
        /// Check if we are in a Biblio environment and insert or
        /// delete InsetBibitems as necessary.
        /// \retval int 1, if we had to add an inset, in which case
@@ -447,7 +457,7 @@ public:
        /// an inset, in which case pos is the position from which the inset
        /// was deleted, and the cursor will need to be moved back one if it
        /// was previously past that position. Return 0 otherwise.
-       int checkBiblio(Buffer const & buffer);
+       int fixBiblio(Buffer const & buffer);
 
        /// For each author, set 'used' to true if there is a change
        /// by this author in the paragraph.
@@ -467,9 +477,9 @@ public:
                bool mw, ///<
                pos_type pos, ///< start from here.
                bool del = true) const;
-       
+
        void locateWord(pos_type & from, pos_type & to,
-               word_location const loc) const;
+               word_location const loc, bool const ignore_deleted = false) const;
        ///
        void updateWords();
 
@@ -486,10 +496,9 @@ public:
        /// \return true if one of the tested positions is misspelled.
        bool isMisspelled(pos_type pos, bool check_boundary = false) const;
 
-       /// \return true if both positions are inside the same
-       /// spell range - i.e. the same word.
-       /// use it for positions inside misspelled range only.
-       bool isSameSpellRange(pos_type pos1, pos_type pos2) const;
+       /// \return the spell range (misspelled area) around position.
+       /// Range is empty if word at position is correctly spelled.
+       FontSpan const & getSpellRange(pos_type pos) const;
 
        /// spell check of whole paragraph
        /// remember results until call of requestSpellCheck()
@@ -505,6 +514,10 @@ public:
        /// presently used only in the XHTML output routines.
        std::string magicLabel() const;
 
+       /// anonymizes the paragraph contents (but not the paragraphs
+       /// contained inside it. Does not handle undo.
+       void anonymize();
+
 private:
        /// Expand the counters for the labelstring of \c layout
        docstring expandParagraphLabel(Layout const &, BufferParams const &,