From 7f4c4cd5487735e6fa95331320eadd2b46d5e279 Mon Sep 17 00:00:00 2001 From: Juergen Spitzmueller Date: Wed, 26 Jul 2023 09:53:25 +0200 Subject: [PATCH] Improve AllowedOccurrences This does now apply to the whole inset or paragraph group (not to the current paragraph only) unless the new boolean AllowedOccurrencesPerItem is set and we are in a list-type environment. Amends 729ab602ca70 --- lib/doc/Customization.lyx | 88 +++++++++++++++++++++++++++++++++- lib/doc/de/Customization.lyx | 73 ++++++++++++++++++++++++++++ lib/layouts/linguistics.module | 1 + lib/scripts/layout2layout.py | 3 +- src/Paragraph.cpp | 66 ++++++++++++++++++++----- src/insets/InsetLayout.cpp | 5 ++ src/insets/InsetLayout.h | 4 ++ 7 files changed, 224 insertions(+), 16 deletions(-) diff --git a/lib/doc/Customization.lyx b/lib/doc/Customization.lyx index 04d9033ae6..060a19756a 100644 --- a/lib/doc/Customization.lyx +++ b/lib/doc/Customization.lyx @@ -21086,7 +21086,7 @@ AllowedInInsets \begin_layout Description -\change_inserted -712698321 1690292676 +\change_inserted -712698321 1690357747 \begin_inset Flex Code status collapsed @@ -21094,6 +21094,8 @@ status collapsed \change_inserted -712698321 1690292501 AllowedOccurrences +\change_unchanged + \end_layout \end_inset @@ -21106,6 +21108,8 @@ status collapsed \change_inserted -712698321 1690292507 int +\change_unchanged + \end_layout \end_inset @@ -21118,6 +21122,8 @@ status collapsed \change_inserted -712698321 1690292530 AllowedInInsets +\change_unchanged + \end_layout \end_inset @@ -21130,12 +21136,90 @@ status collapsed \change_inserted -712698321 1690292536 AllowedInLayouts +\change_unchanged + \end_layout \end_inset has been defined, - this can be used to determine how many times the inset can be inserted to a given paragraph. + this can be used to determine how many times the inset can be inserted to a given inset or the paragraph (group). +\end_layout + +\begin_layout Description + +\change_inserted -712698321 1690357828 +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1690357753 +AllowedOccurrencesPerItem +\end_layout + +\end_inset + + [ +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1690357747 + +\emph on +0 +\end_layout + +\end_inset + +, +\begin_inset space \thinspace{} +\end_inset + + +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1690357747 +1 +\end_layout + +\end_inset + +] If this is set to true, + +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1690357774 +AllowedOccurrences +\end_layout + +\end_inset + + applies to single paragraphs if we are in a list-type environment (with +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1690357825 + +\backslash +item +\change_unchanged + +\end_layout + +\end_inset + +s). \change_unchanged \end_layout diff --git a/lib/doc/de/Customization.lyx b/lib/doc/de/Customization.lyx index aa5aad8f94..9ae0e74016 100644 --- a/lib/doc/de/Customization.lyx +++ b/lib/doc/de/Customization.lyx @@ -17439,6 +17439,79 @@ AllowedInLayouts \begin_inset Flex Code status collapsed +\begin_layout Plain Layout +AllowedOccurrencesPerItem +\end_layout + +\end_inset + + [ +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\emph on +0 +\end_layout + +\end_inset + +, +\begin_inset space \thinspace{} +\end_inset + + +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout +1 +\end_layout + +\end_inset + +] Wenn dies auf +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout +true +\end_layout + +\end_inset + + gesetzt wird, + zählen die +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout +AllowedOccurrences +\end_layout + +\end_inset + + je Absatz, + sofern wir uns in einer listenartigen Umgebung (mit +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\backslash +item +\end_layout + +\end_inset + +s) befinden. +\end_layout + +\begin_layout Description +\begin_inset Flex Code +status collapsed + \begin_layout Plain Layout Argument \end_layout diff --git a/lib/layouts/linguistics.module b/lib/layouts/linguistics.module index 43ec54fff0..bd2528c931 100644 --- a/lib/layouts/linguistics.module +++ b/lib/layouts/linguistics.module @@ -158,6 +158,7 @@ InsetLayout Flex:Example_Preamble Numbered_Example_(multiline), Numbered_Examples_(consecutive) EndAllowedInLayouts AllowedOccurrences 1 + AllowedOccurrencesPerItem true End InsetLayout Flex:Subexample_Preamble diff --git a/lib/scripts/layout2layout.py b/lib/scripts/layout2layout.py index cb6023c96f..c77b05e100 100644 --- a/lib/scripts/layout2layout.py +++ b/lib/scripts/layout2layout.py @@ -342,7 +342,8 @@ currentFormat = 102 # Incremented to format 102, 25 July 2023 by spitz # add InsetLayout tags AllowedInInsets, EndAllowedInInsets, -# AllowedInLayouts, EndAllowedInLayouts, AllowedOccurrences +# AllowedInLayouts, EndAllowedInLayouts, AllowedOccurrences, +# AllowedOccurrencesPerItem # Do not forget to document format change in Customization # Manual (section "Declaring a new text class"). diff --git a/src/Paragraph.cpp b/src/Paragraph.cpp index 22e18435d6..d4658faf84 100644 --- a/src/Paragraph.cpp +++ b/src/Paragraph.cpp @@ -2344,33 +2344,73 @@ bool Paragraph::allowedInContext(Cursor const & cur, InsetLayout const & il) con set const & allowed_insets = il.allowedInInsets(); set const & allowed_layouts = il.allowedInLayouts(); - bool result = false; - if (allowed_insets.find(inInset().getLayout().name()) != allowed_insets.end()) - result = true; + bool in_allowed_inset = + allowed_insets.find(inInset().getLayout().name()) != allowed_insets.end(); - else if (allowed_layouts.find(d->layout_->name()) != allowed_layouts.end()) - result = true; + bool in_allowed_layout = + allowed_layouts.find(d->layout_->name()) != allowed_layouts.end(); - else if (inInset().asInsetArgument()) { + if (!in_allowed_inset && inInset().asInsetArgument()) { // check if the argument allows the inset in question if (cur.depth() > 1) { docstring parlayout = cur[cur.depth() - 2].inset().getLayout().name() + from_ascii("@") + from_ascii(inInset().asInsetArgument()->name()); if (allowed_insets.find(parlayout) != allowed_insets.end()) - result = true; + in_allowed_inset = true; } } - if (result && il.allowedOccurrences() != -1) { - int have_ins = 0; - for (auto const & table : insetList()) - if (table.inset->getLayout().name() == il.name()) - ++have_ins; + int have_ins = 0; + // check if we exceed the number of allowed insets in this inset + if (in_allowed_inset && inInset().asInsetText() && il.allowedOccurrences() != -1) { + ParagraphList & pars = cur.text()->paragraphs(); + for (Paragraph const & par : pars) { + for (auto const & table : par.insetList()) + if (table.inset->getLayout().name() == il.name()) + ++have_ins; + } + if (have_ins >= il.allowedOccurrences()) + return false; + } + + have_ins = 0; + // check if we exceed the number of allowed insets in the layout group + if (in_allowed_layout && il.allowedOccurrences() != -1) { + pit_type pit = cur.pit(); + pit_type lastpit = cur.pit(); + ParagraphList & pars = cur.text()->paragraphs(); + // If we are not on a list-type environment or AllowedOccurrencesPerItem + // is false, we check the whole paragraph group + if (d->layout_->isEnvironment() + && !(il.allowedOccurrencesPerItem() + && (d->layout_->latextype == LATEX_LIST_ENVIRONMENT + || d->layout_->latextype == LATEX_ITEM_ENVIRONMENT))) { + lastpit = cur.lastpit(); + // get the first paragraph in sequence with this layout + depth_type const current_depth = params().depth(); + while (true) { + if (pit == 0) + break; + Paragraph cpar = pars[pit - 1]; + if (&cpar.layout() == d->layout_ + && cpar.params().depth() == current_depth) + --pit; + else + break; + } + } + for (; pit <= lastpit; ++pit) { + if (&pars[pit].layout() != d->layout_) + break; + for (auto const & table : pars[pit].insetList()) + if (table.inset->getLayout().name() == il.name()) + ++have_ins; + } if (have_ins >= il.allowedOccurrences()) return false; } - if (result) + if (in_allowed_layout || in_allowed_inset) return true; return (allowed_insets.empty() && allowed_layouts.empty()); diff --git a/src/insets/InsetLayout.cpp b/src/insets/InsetLayout.cpp index de217a07cc..fc1a53c7ff 100644 --- a/src/insets/InsetLayout.cpp +++ b/src/insets/InsetLayout.cpp @@ -67,6 +67,7 @@ bool InsetLayout::read(Lexer & lex, TextClass const & tclass, IL_ALLOWED_IN_INSET, IL_ALLOWED_IN_LAYOUT, IL_ALLOWED_OCCURRENCES, + IL_ALLOWED_OCCURRENCES_PER_ITEM, IL_ARGUMENT, IL_BABELPREAMBLE, IL_BGCOLOR, @@ -155,6 +156,7 @@ bool InsetLayout::read(Lexer & lex, TextClass const & tclass, { "allowedininsets", IL_ALLOWED_IN_INSET }, { "allowedinlayouts", IL_ALLOWED_IN_LAYOUT }, { "allowedoccurrences", IL_ALLOWED_OCCURRENCES }, + { "allowedoccurrencesperitem", IL_ALLOWED_OCCURRENCES_PER_ITEM }, { "argument", IL_ARGUMENT }, { "babelpreamble", IL_BABELPREAMBLE }, { "bgcolor", IL_BGCOLOR }, @@ -656,6 +658,9 @@ bool InsetLayout::read(Lexer & lex, TextClass const & tclass, case IL_ALLOWED_OCCURRENCES: lex >> allowed_occurrences_; break; + case IL_ALLOWED_OCCURRENCES_PER_ITEM: + lex >> allowed_occurrences_per_item_; + break; case IL_END: getout = true; break; diff --git a/src/insets/InsetLayout.h b/src/insets/InsetLayout.h index bf5a016883..6700100252 100644 --- a/src/insets/InsetLayout.h +++ b/src/insets/InsetLayout.h @@ -258,6 +258,8 @@ public: std::set const & allowedInLayouts() const { return allowed_in_layouts_; } /// int allowedOccurrences() const { return allowed_occurrences_; } + /// + bool allowedOccurrencesPerItem() const { return allowed_occurrences_per_item_; } private: /// void makeDefaultCSS() const; @@ -447,6 +449,8 @@ private: std::set allowed_in_layouts_; /// int allowed_occurrences_ = -1; + /// + bool allowed_occurrences_per_item_ = false; }; /// -- 2.39.5