]> git.lyx.org Git - lyx.git/blobdiff - src/Paragraph.h
* add PreBabelPreamble to Language definition (fixes #4786).
[lyx.git] / src / Paragraph.h
index 06318200c92aa0720111828ee95c270386b6b301..2c2e77246fc1c951d03da27171da2be5bad06b94 100644 (file)
@@ -5,10 +5,10 @@
  * Licence details can be found in the file COPYING.
  *
  * \author Asger Alstrup
- * \author Lars Gullik Bjønnes
+ * \author Lars Gullik Bjønnes
  * \author John Levon
- * \author André Pönitz
- * \author Jürgen Vigna
+ * \author André Pönitz
+ * \author Jürgen Vigna
  *
  * Full author contact details are available in file CREDITS.
  */
 #define PARAGRAPH_H
 
 #include "FontEnums.h"
-#include "Layout.h"
+#include "SpellChecker.h"
 
 #include "insets/InsetCode.h"
 
 #include "support/strfwd.h"
 #include "support/types.h"
 
+#include <set>
+
 namespace lyx {
 
 class AuthorList;
@@ -34,6 +36,7 @@ class Counters;
 class Cursor;
 class CursorSlice;
 class DocIterator;
+class docstring_list;
 class DocumentClass;
 class Inset;
 class InsetBibitem;
@@ -41,6 +44,7 @@ class LaTeXFeatures;
 class Inset_code;
 class InsetList;
 class Language;
+class Layout;
 class Font;
 class Font_size;
 class MetricsInfo;
@@ -49,6 +53,8 @@ class PainterInfo;
 class ParagraphParameters;
 class TexRow;
 class Toc;
+class WordLangTuple;
+class XHTMLStream;
 
 class FontSpan {
 public:
@@ -60,6 +66,22 @@ public:
 public:
        /// Range including first and last.
        pos_type first, last;
+
+       inline bool operator<(FontSpan const & s) const
+       {
+               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
+       {
+               return first <= p && p <= last;
+       }
+
 };
 
 ///
@@ -78,7 +100,9 @@ enum AsStringParameter
 {
        AS_STR_NONE = 0, ///< No option, only printable characters.
        AS_STR_LABEL = 1, ///< Prefix with paragraph label.
-       AS_STR_INSETS = 2 ///< Go into insets.
+       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.
 };
 
 
@@ -88,7 +112,7 @@ class Paragraph
 public:
        ///
        Paragraph();
-       ///
+       /// Copy constructor.
        Paragraph(Paragraph const &);
        /// Partial copy constructor.
        /// Copy the Paragraph contents from \p beg to \p end (without end).
@@ -99,6 +123,8 @@ public:
        ~Paragraph();
        ///
        int id() const;
+       ///
+       void setId(int id);
 
        ///
        void addChangesToToc(DocIterator const & cdit, Buffer const & buf) const;
@@ -111,6 +137,8 @@ public:
                            Language const * from, Language const * to);
        ///
        bool isMultiLingual(BufferParams const &) const;
+       ///
+       void getLanguages(std::set<Language const *> &) const;
 
        /// Convert the paragraph to a string.
        /// \param AsStringParameter options. This can contain any combination of
@@ -123,15 +151,20 @@ public:
        docstring asString(pos_type beg, pos_type end,
                int options = AS_STR_NONE) 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 write(std::ostream &, BufferParams const &,
                   depth_type & depth) const;
        ///
        void validate(LaTeXFeatures &) const;
 
-       ///
-       bool latex(BufferParams const &, Font const & outerfont, odocstream &,
-               TexRow & texrow, OutputParams const &) const;
+       /// \param force means: output even if layout.inpreamble is true.
+       void latex(BufferParams const &, Font const & outerfont, odocstream &,
+                  TexRow & texrow, OutputParams const &,
+                  int start_pos = 0, int end_pos = -1, bool force = false) const;
 
        /// Can we drop the standard paragraph wrapper?
        bool emptyTag() const;
@@ -139,8 +172,11 @@ public:
        /// Get the id of the paragraph, usefull for docbook
        std::string getID(Buffer const & buf, OutputParams const & runparams) const;
 
-       /// Get the first word of a paragraph, return the position where it left
-       pos_type firstWord(odocstream & os, 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;
+
+       /// 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,
@@ -148,6 +184,13 @@ public:
                                 OutputParams const & runparams,
                                 Font const & outerfont,
                                 pos_type initial = 0) 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;
 
        ///
        bool hasSameLayout(Paragraph const & par) const;
@@ -160,10 +203,6 @@ public:
        ///
        Inset const & inInset() const;
        ///
-       InsetCode ownerCode() const;
-       ///
-       bool forcePlainLayout() const;
-       ///
        bool allowParagraphCustomization() const;
        ///
        bool usePlainLayout() const;
@@ -178,6 +217,10 @@ public:
        void setLayout(Layout const & layout);
        ///
        void setPlainOrDefaultLayout(DocumentClass const & tc);
+       ///
+       void setDefaultLayout(DocumentClass const & tc);
+       ///
+       void setPlainLayout(DocumentClass const & tc);
 
        /// This is the item depth, only used by enumerate and itemize
        signed char itemdepth;
@@ -188,11 +231,13 @@ public:
        /// is there a change within the given range ?
        bool isChanged(pos_type start, pos_type end) const;
        /// is there an unchanged char at the given pos ?
-       bool isUnchanged(pos_type pos) const;
+       bool isChanged(pos_type pos) const;
        /// is there an insertion at the given pos ?
        bool isInserted(pos_type pos) const;
        /// is there a deletion at the given pos ?
        bool isDeleted(pos_type pos) const;
+       /// is the whole paragraph deleted ?
+       bool isDeleted(pos_type start, pos_type end) const;
 
        /// will the paragraph be physically merged with the next
        /// one if the imaginary end-of-par character is logically deleted?
@@ -205,10 +250,10 @@ public:
        void setChange(pos_type pos, Change const & change);
 
        /// accept changes within the given range
-       void acceptChanges(BufferParams const & bparams, pos_type start, pos_type end);
+       void acceptChanges(pos_type start, pos_type end);
 
        /// reject changes within the given range
-       void rejectChanges(BufferParams const & bparams, pos_type start, pos_type end);
+       void rejectChanges(pos_type start, pos_type end);
 
        /// Paragraphs can contain "manual labels", for example, Description
        /// environment. The text for this user-editable label is stored in
@@ -219,19 +264,16 @@ public:
        /// recompute this value
        void setBeginOfBody();
 
+       ///
+       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);
-       /// translate \p label to the paragraph language if possible.
-       docstring const translateIfPossible(docstring const & label,
-               BufferParams const & bparams) const;
-       /// Expand the counters for the labelstring of \c layout
-       docstring expandLabel(Layout const &, BufferParams const &,
-               bool process_appendix = true) const;
        /// Actual paragraph alignment used
        char getAlign() const;
        /// The nesting depth of a paragraph
@@ -253,10 +295,10 @@ public:
            between the characters font and the layoutfont.
            This is what is stored in the fonttable
        */
-       Font const
+       Font const &
        getFontSettings(BufferParams const &, pos_type pos) const;
        ///
-       Font const getFirstFontSettings(BufferParams const &) const;
+       Font const getFirstFontSettings(BufferParams const &) const;
 
        /** Get fully instantiated font. If pos == -1, use the layout
            font attached to this paragraph.
@@ -340,9 +382,9 @@ public:
        bool isSeparator(pos_type pos) const;
        ///
        bool isLineSeparator(pos_type pos) const;
-       /// True if the character/inset at this point can be part of a word.
-       /// Note that digits in particular are considered as letters
-       bool isLetter(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;
        /// 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
@@ -391,14 +433,44 @@ public:
                pos_type pos, ///< start from here.
                bool del = true) const;
        
+       void locateWord(pos_type & from, pos_type & to,
+               word_location const loc) const;
        ///
-       void updateWords(CursorSlice const & sl);
+       void updateWords();
+
+       /// Spellcheck word at position \p from and fill in found misspelled word
+       /// and \p suggestions if \p do_suggestion is true.
+       /// \return result from spell checker, SpellChecker::UNKNOWN_WORD when misspelled.
+       SpellChecker::Result spellCheck(pos_type & from, pos_type & to, WordLangTuple & wl,
+               docstring_list & suggestions, bool do_suggestion =  true,
+               bool check_learned = false) const;
+
+       /// Spell checker status at position \p pos.
+       /// \return true if pointed position is misspelled.
+       bool isMisspelled(pos_type pos) const;
+
+       /// spell check of whole paragraph
+       /// remember results until call of requestSpellCheck()
+       void spellCheck() const;
+
+       /// query state of spell checker results
+       bool needsSpellCheck() const;
+       /// mark position of text manipulation to inform the spell checker
+       /// default value -1 marks the whole paragraph to be checked (again)
+       void requestSpellCheck(pos_type pos = -1);
+
+       /// an automatically generated identifying label for this paragraph.
+       /// presently used only in the XHTML output routines.
+       std::string magicLabel() const;
 
 private:
+       /// Expand the counters for the labelstring of \c layout
+       docstring expandParagraphLabel(Layout const &, BufferParams const &,
+               bool process_appendix) const;
        ///
        void deregisterWords();
        ///
-       void collectWords(CursorSlice const & sl);
+       void collectWords();
        ///
        void registerWords();