[LyX/master] DocBook: add support for DocBookArgumentAfterMainTag.
Thibaut Cuvelier
tcuvelier at lyx.org
Wed Feb 17 21:50:01 UTC 2021
commit adc7820d458244a6425f269fd98737c8d42ca18a
Author: Thibaut Cuvelier <tcuvelier at lyx.org>
Date: Sun Feb 14 07:07:04 2021 +0100
DocBook: add support for DocBookArgumentAfterMainTag.
---
src/Layout.cpp | 6 ++++++
src/Layout.h | 8 +++++++-
src/OutputParams.h | 3 +++
src/insets/InsetArgument.cpp | 5 ++++-
src/insets/InsetArgument.h | 4 ++++
src/insets/InsetLayout.cpp | 8 ++++++++
src/insets/InsetLayout.h | 4 ++++
src/insets/InsetText.cpp | 22 +++++++++++++++++++---
8 files changed, 55 insertions(+), 5 deletions(-)
diff --git a/src/Layout.cpp b/src/Layout.cpp
index e037ad1..e5d683e 100644
--- a/src/Layout.cpp
+++ b/src/Layout.cpp
@@ -1284,6 +1284,12 @@ void Layout::readArgument(Lexer & lex, bool validating)
} else if (tok == "docbooktagtype") {
lex.next();
arg.docbooktagtype = lex.getDocString();
+ } else if (tok == "docbookargumentaftermaintag") {
+ lex.next();
+ arg.docbookargumentaftermaintag = lex.getBool();
+ } else if (tok == "docbookargumentbeforemaintag") {
+ lex.next();
+ arg.docbookargumentbeforemaintag = lex.getBool();
} else {
lex.printError("Unknown tag");
error = true;
diff --git a/src/Layout.h b/src/Layout.h
index 4eb8412..99cc4df 100644
--- a/src/Layout.h
+++ b/src/Layout.h
@@ -89,7 +89,7 @@ public:
std::string const & latexname() const { return latexname_; }
///
std::string const & itemcommand() const { return itemcommand_; }
- /// The arguments of this layout
+ /// One argument of this layout
struct latexarg {
docstring labelstring;
docstring menustring;
@@ -112,10 +112,16 @@ public:
bool is_toc_caption = false;
bool free_spacing = false;
std::string newlinecmd;
+ /// The DocBook tag corresponding to this argument.
docstring docbooktag;
docstring docbooktagtype;
docstring docbookattr;
+ /// Whether this argument should be output after the main tag (default: inside). The result if the argument
+ /// should be output both before and after the main tag is undefined.
bool docbookargumentbeforemaintag = false;
+ /// Whether this argument should be output before the main tag (default: inside). The result if the argument
+ /// should be output both before and after the main tag is undefined.
+ bool docbookargumentaftermaintag = false;
};
///
typedef std::map<std::string, latexarg> LaTeXArgMap;
diff --git a/src/OutputParams.h b/src/OutputParams.h
index 05eed6b..48ad61e 100644
--- a/src/OutputParams.h
+++ b/src/OutputParams.h
@@ -393,6 +393,9 @@ public:
/// Some parameters are output before the rest of the paragraph, they should not be generated a second time.
std::set<InsetArgument const *> docbook_prepended_arguments = {};
+ /// Some parameters are output after the rest of the paragraph, they should not be generated a second time.
+ std::set<InsetArgument const *> docbook_appended_arguments = {};
+
/// Are we generating this material for inclusion in a TOC-like entity?
bool for_toc = false;
diff --git a/src/insets/InsetArgument.cpp b/src/insets/InsetArgument.cpp
index 3f26f85..811b884 100644
--- a/src/insets/InsetArgument.cpp
+++ b/src/insets/InsetArgument.cpp
@@ -127,6 +127,7 @@ void InsetArgument::updateBuffer(ParIterator const & it, UpdateType utype, bool
docbooktagtype_ = (*lait).second.docbooktagtype;
docbookattr_ = (*lait).second.docbookattr;
docbookargumentbeforemaintag_ = (*lait).second.docbookargumentbeforemaintag;
+ docbookargumentaftermaintag_ = (*lait).second.docbookargumentaftermaintag;
pass_thru_local_ = false;
if (lait->second.is_toc_caption) {
is_toc_caption_ = true;
@@ -313,9 +314,11 @@ InsetDecoration InsetArgument::decoration() const
void InsetArgument::docbook(XMLStream & xs, OutputParams const & rp) const {
- // Ignore arguments that have already been output.
+ // Ignore arguments that have already been output or are planned to be output elsewhere.
if (rp.docbook_prepended_arguments.find(this) != rp.docbook_prepended_arguments.end())
return;
+ if (rp.docbook_appended_arguments.find(this) != rp.docbook_appended_arguments.end())
+ return;
if (docbooktag_ != from_ascii("NONE") && docbooktag_ != from_ascii("IGNORE")) {
// TODO: implement docbooktagtype_.
diff --git a/src/insets/InsetArgument.h b/src/insets/InsetArgument.h
index 2249f2f..7488e45 100644
--- a/src/insets/InsetArgument.h
+++ b/src/insets/InsetArgument.h
@@ -41,6 +41,8 @@ public:
bool docbookargumentbeforemaintag() const { return docbookargumentbeforemaintag_; }
+ bool docbookargumentaftermaintag() const { return docbookargumentaftermaintag_; }
+
/// \name Public functions inherited from Inset class
//@{
///
@@ -135,6 +137,8 @@ private:
docstring docbookattr_;
///
bool docbookargumentbeforemaintag_ = false;
+ ///
+ bool docbookargumentaftermaintag_ = false;
protected:
/// \name Protected functions inherited from Inset class
diff --git a/src/insets/InsetLayout.cpp b/src/insets/InsetLayout.cpp
index 391f9c9..b6056cd 100644
--- a/src/insets/InsetLayout.cpp
+++ b/src/insets/InsetLayout.cpp
@@ -96,6 +96,7 @@ bool InsetLayout::read(Lexer & lex, TextClass const & tclass,
IL_DOCBOOKSECTION,
IL_DOCBOOKININFO,
IL_DOCBOOKARGUMENTBEFOREMAINTAG,
+ IL_DOCBOOKARGUMENTAFTERMAINTAG,
IL_DOCBOOKNOTINPARA,
IL_DOCBOOKWRAPPERTAG,
IL_DOCBOOKWRAPPERTAGTYPE,
@@ -151,6 +152,7 @@ bool InsetLayout::read(Lexer & lex, TextClass const & tclass,
{ "custompars", IL_CUSTOMPARS },
{ "decoration", IL_DECORATION },
{ "display", IL_DISPLAY },
+ { "docbookargumentaftermaintag", IL_DOCBOOKARGUMENTAFTERMAINTAG },
{ "docbookargumentbeforemaintag", IL_DOCBOOKARGUMENTBEFOREMAINTAG },
{ "docbookattr", IL_DOCBOOKATTR },
{ "docbookininfo", IL_DOCBOOKININFO },
@@ -525,6 +527,9 @@ bool InsetLayout::read(Lexer & lex, TextClass const & tclass,
case IL_DOCBOOKARGUMENTBEFOREMAINTAG:
lex >> docbookargumentbeforemaintag_;
break;
+ case IL_DOCBOOKARGUMENTAFTERMAINTAG:
+ lex >> docbookargumentaftermaintag_;
+ break;
case IL_DOCBOOKNOTINPARA:
lex >> docbooknotinpara_;
break;
@@ -839,6 +844,9 @@ void InsetLayout::readArgument(Lexer & lex)
} else if (tok == "docbookargumentbeforemaintag") {
lex.next();
arg.docbookargumentbeforemaintag = lex.getBool();
+ } else if (tok == "docbookargumentaftermaintag") {
+ lex.next();
+ arg.docbookargumentaftermaintag = lex.getBool();
} else {
lex.printError("Unknown tag");
error = true;
diff --git a/src/insets/InsetLayout.h b/src/insets/InsetLayout.h
index 47fa633..b48fde7 100644
--- a/src/insets/InsetLayout.h
+++ b/src/insets/InsetLayout.h
@@ -164,6 +164,8 @@ public:
///
bool docbookargumentbeforemaintag() const { return docbookargumentbeforemaintag_; }
///
+ bool docbookargumentaftermaintag() const { return docbookargumentaftermaintag_; }
+ ///
std::string docbookwrappertag() const { return docbookwrappertag_; }
///
std::string docbookwrappertagtype() const;
@@ -322,6 +324,8 @@ private:
bool docbooknotinpara_ = false;
///
bool docbookargumentbeforemaintag_ = false;
+ ///
+ bool docbookargumentaftermaintag_ = false;
///
bool docbooksection_ = false;
///
diff --git a/src/insets/InsetText.cpp b/src/insets/InsetText.cpp
index 5504a2d..7942588 100644
--- a/src/insets/InsetText.cpp
+++ b/src/insets/InsetText.cpp
@@ -635,7 +635,7 @@ void InsetText::docbook(XMLStream & xs, OutputParams const & rp, XHTMLOptions op
writeOuterTag = !allBibitems;
}
- // Detect arguments that should be output before the paragraph.
+ // Detect arguments that should be output before/after the paragraph.
// Don't reuse runparams.docbook_prepended_arguments, as the same object is used in InsetArgument to determine
// whether the inset should be output or not, whatever the context (i.e. position with respect to the wrapper).
std::set<InsetArgument const *> prependedArguments;
@@ -649,6 +649,17 @@ void InsetText::docbook(XMLStream & xs, OutputParams const & rp, XHTMLOptions op
}
}
+ std::set<InsetArgument const *> appendedArguments;
+ for (auto const & par : paragraphs()) {
+ for (pos_type i = 0; i < par.size(); ++i) {
+ if (par.getInset(i) && par.getInset(i)->lyxCode() == ARG_CODE) {
+ InsetArgument const *arg = par.getInset(i)->asInsetArgument();
+ if (arg->docbookargumentaftermaintag())
+ appendedArguments.insert(par.getInset(i)->asInsetArgument());
+ }
+ }
+ }
+
// Start outputting this inset.
// - First, wrapper around the inset and its main tag.
if (writeOuterTag) {
@@ -665,14 +676,15 @@ void InsetText::docbook(XMLStream & xs, OutputParams const & rp, XHTMLOptions op
}
}
- // - Think about the arguments.
+ // - Think about the arguments before the paragraph.
OutputParams np = runparams;
np.docbook_in_par = true;
for (auto const & arg : prependedArguments)
arg->docbook(xs, np);
- // - Mark the newly generated arguments are not-to-be-generated-again.
+ // - Mark the newly generated arguments are not-to-be-generated-again. Do the same for arguments that will follow.
runparams.docbook_prepended_arguments = std::move(prependedArguments);
+ runparams.docbook_appended_arguments = appendedArguments;
// - Deal with the first item.
// TODO: in things like SciPoster, this should also check if the item tag is allowed. Hard to formalise for now...
@@ -697,6 +709,10 @@ void InsetText::docbook(XMLStream & xs, OutputParams const & rp, XHTMLOptions op
docbookParagraphs(text_, buffer(), xs, runparams);
xs.endDivision();
+ // - Think about the arguments after the paragraph.
+ for (auto const & arg : appendedArguments)
+ arg->docbook(xs, np);
+
// - Close the required tags.
if (writeOuterTag) {
if (!il.docbookitemtag().empty() && il.docbookitemtag() != "NONE" && il.docbookitemtag() != "IGNORE")
More information about the lyx-cvs
mailing list