commit 0bd2978ac99d894ea876d38336192246537a0594 Author: Thibaut Cuvelier <tcuvel...@lyx.org> Date: Wed Oct 7 06:05:22 2020 +0200
DocBook: add DocBookInnerTag and family. This allows old DocBook documents to be valid when output. --- autotests/export/docbook/olddb_article.xml | 2 +- autotests/export/docbook/olddb_book.xml | 2 +- lib/layouts/db_stdtitle.inc | 2 + lib/scripts/layout2layout.py | 7 +++- src/Layout.cpp | 46 ++++++++++++++++++++++++++++ src/Layout.h | 12 +++++++ src/TextClass.cpp | 2 +- src/output_docbook.cpp | 5 ++- 8 files changed, 72 insertions(+), 6 deletions(-) diff --git a/autotests/export/docbook/olddb_article.xml b/autotests/export/docbook/olddb_article.xml index 8ebaba6..cf592a3 100644 --- a/autotests/export/docbook/olddb_article.xml +++ b/autotests/export/docbook/olddb_article.xml @@ -8,7 +8,7 @@ <personname>Article author</personname> </author> <authorgroup> -<author>Article author group</author> +<author><personname>Article author group</personname></author> </authorgroup> <date>Article date</date> <abstract> diff --git a/autotests/export/docbook/olddb_book.xml b/autotests/export/docbook/olddb_book.xml index 71befec..aa0e3bf 100644 --- a/autotests/export/docbook/olddb_book.xml +++ b/autotests/export/docbook/olddb_book.xml @@ -8,7 +8,7 @@ <personname>Book author</personname> </author> <authorgroup> -<author>Book author group</author> +<author><personname>Book author group</personname></author> </authorgroup> <date>Book date</date> <abstract> diff --git a/lib/layouts/db_stdtitle.inc b/lib/layouts/db_stdtitle.inc index 9adc1bb..7943de8 100644 --- a/lib/layouts/db_stdtitle.inc +++ b/lib/layouts/db_stdtitle.inc @@ -17,6 +17,8 @@ Style Authorgroup # TODO: missing a DocBookInnerTag to be valid (authorgroup > author > personname). DocBookTag author DocBookTagType paragraph + DocBookInnerTag personname + DocBookInnerTagType inline DocBookWrapperTag authorgroup DocBookWrapperTagType paragraph End diff --git a/lib/scripts/layout2layout.py b/lib/scripts/layout2layout.py index fd0c193..9da2572 100644 --- a/lib/scripts/layout2layout.py +++ b/lib/scripts/layout2layout.py @@ -11,7 +11,7 @@ # This script will update a .layout file to current format # The latest layout format is also defined in src/TextClass.cpp -currentFormat = 84 +currentFormat = 85 # Incremented to format 4, 6 April 2007, lasgouttes @@ -289,6 +289,9 @@ currentFormat = 84 # DocBookItemWrapperTagTagType, DocBookItemTagTagType, # DocBookLabelTag +# Incremented to format 85, 7 October 2020 by tcuvelier +# New tags DocBookInnerTag, DocBookInnerAttr, +# DocBookInnerTagType # Do not forget to document format change in Customization # Manual (section "Declaring a new text class"). @@ -538,7 +541,7 @@ def convert(lines, end_format): i += 1 continue - if 82 <= format <= 84: + if 82 <= format <= 85: # nothing to do. i += 1 continue diff --git a/src/Layout.cpp b/src/Layout.cpp index 01c4f16..8dec223 100644 --- a/src/Layout.cpp +++ b/src/Layout.cpp @@ -107,6 +107,9 @@ enum LayoutTags { LT_DOCBOOKTAG, LT_DOCBOOKATTR, LT_DOCBOOKTAGTYPE, + LT_DOCBOOKINNERATTR, + LT_DOCBOOKINNERTAG, + LT_DOCBOOKINNERTAGTYPE, LT_DOCBOOKININFO, LT_DOCBOOKABSTRACT, LT_DOCBOOKWRAPPERTAG, @@ -234,6 +237,9 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass, { "docbookattr", LT_DOCBOOKATTR }, { "docbookforceabstracttag", LT_DOCBOOKFORCEABSTRACTTAG }, { "docbookininfo", LT_DOCBOOKININFO }, + { "docbookinnerattr", LT_DOCBOOKINNERATTR }, + { "docbookinnertag", LT_DOCBOOKINNERTAG }, + { "docbookinnertagtype", LT_DOCBOOKINNERTAGTYPE }, { "docbookitemattr", LT_DOCBOOKITEMATTR }, { "docbookiteminnerattr", LT_DOCBOOKITEMINNERATTR }, { "docbookiteminnertag", LT_DOCBOOKITEMINNERTAG }, @@ -750,6 +756,18 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass, lex >> docbooktagtype_; break; + case LT_DOCBOOKINNERTAG: + lex >> docbookinnertag_; + break; + + case LT_DOCBOOKINNERATTR: + lex >> docbookinnerattr_; + break; + + case LT_DOCBOOKINNERTAGTYPE: + lex >> docbookinnertagtype_; + break; + case LT_DOCBOOKFORCEABSTRACTTAG: lex >> docbookforceabstracttag_; break; @@ -1638,6 +1656,12 @@ void Layout::write(ostream & os) const os << "\tDocBookAttr \"" << docbookattr_ << "\"\n"; if(!docbooktagtype_.empty()) os << "\tDocBookTagType " << docbooktagtype_ << '\n'; + if(!docbookinnertag_.empty()) + os << "\tDocBookInnerTag " << docbookinnertag_ << '\n'; + if(!docbookinnerattr_.empty()) + os << "\tDocBookInnerAttr \"" << docbookinnerattr_ << "\"\n"; + if(!docbookinnertagtype_.empty()) + os << "\tDocBookInnerTagType " << docbookinnertagtype_ << '\n'; if(!docbookininfo_.empty()) os << "\tDocBookInInfo " << docbookininfo_ << '\n'; os << "\tDocBookAbstract " << docbookabstract_ << '\n'; @@ -1857,6 +1881,28 @@ string const & Layout::docbooktagtype() const } +string const & Layout::docbookinnertag() const +{ + if (docbookinnertag_.empty()) + docbookinnertag_ = "NONE"; + return docbookinnertag_; +} + + +string const & Layout::docbookinnerattr() const +{ + return docbookinnerattr_; +} + + +string const & Layout::docbookinnertagtype() const +{ + if (!isValidTagType(docbookinnertagtype_)) + docbookinnertagtype_ = "block"; + return docbookinnertagtype_; +} + + string const & Layout::docbookininfo() const { // Indeed, a trilean. Only titles should be "maybe": otherwise, metadata is "always", content is "never". diff --git a/src/Layout.h b/src/Layout.h index a339021..63184cd 100644 --- a/src/Layout.h +++ b/src/Layout.h @@ -199,6 +199,12 @@ public: /// std::string const & docbooktagtype() const; /// + std::string const & docbookinnertag() const; + /// + std::string const & docbookinnerattr() const; + /// + std::string const & docbookinnertagtype() const; + /// std::string const & docbookininfo() const; /// bool docbookabstract() const { return docbookabstract_; } @@ -509,6 +515,12 @@ private: mutable std::string docbookattr_; /// DocBook tag type corresponding to this layout (block, paragraph, or inline; default: block). mutable std::string docbooktagtype_; + /// DocBook inner tag corresponding to this layout. + mutable std::string docbookinnertag_; + /// Roles to add to docbookinnertag_, if any (default: none). + mutable std::string docbookinnerattr_; + /// DocBook inner-tag type corresponding to this layout (block, paragraph, or inline; default: block). + mutable std::string docbookinnertagtype_; /// DocBook tag corresponding to this item (mainly for lists). mutable std::string docbookitemtag_; /// Roles to add to docbookitemtag_, if any (default: none). diff --git a/src/TextClass.cpp b/src/TextClass.cpp index 3628872..03a7624 100644 --- a/src/TextClass.cpp +++ b/src/TextClass.cpp @@ -62,7 +62,7 @@ namespace lyx { // You should also run the development/tools/updatelayouts.py script, // to update the format of all of our layout files. // -int const LAYOUT_FORMAT = 84; // tcuvelier: DocBook*TagType. +int const LAYOUT_FORMAT = 85; // tcuvelier: DocBookInnerTag. // Layout format for the current lyx file format. Controls which format is diff --git a/src/output_docbook.cpp b/src/output_docbook.cpp index 0d0aa10..a8d509a 100644 --- a/src/output_docbook.cpp +++ b/src/output_docbook.cpp @@ -309,10 +309,12 @@ void openParTag(XMLStream & xs, const Paragraph * par, const Paragraph * prevpar const string & tag = lay.docbooktag(); if (tag != "NONE") { auto xmltag = xml::ParTag(tag, lay.docbookattr()); - if (!xs.isTagOpen(xmltag, 1)) // Don't nest a paragraph directly in a paragraph. + if (!xs.isTagOpen(xmltag, 1)) { // Don't nest a paragraph directly in a paragraph. // TODO: required or not? // TODO: avoid creating a ParTag object just for this query... openTag(xs, lay.docbooktag(), lay.docbookattr(), lay.docbooktagtype()); + openTag(xs, lay.docbookinnertag(), lay.docbookinnerattr(), lay.docbookinnertagtype()); + } } openTag(xs, lay.docbookitemtag(), lay.docbookitemattr(), lay.docbookitemtagtype()); @@ -342,6 +344,7 @@ void closeParTag(XMLStream & xs, Paragraph const * par, Paragraph const * nextpa // Main logic. closeTag(xs, lay.docbookiteminnertag(), lay.docbookiteminnertagtype()); closeTag(xs, lay.docbookitemtag(), lay.docbookitemtagtype()); + closeTag(xs, lay.docbookinnertag(), lay.docbookinnertagtype()); closeTag(xs, lay.docbooktag(), lay.docbooktagtype()); if (closeWrapper) closeTag(xs, lay.docbookwrappertag(), lay.docbookwrappertagtype()); -- lyx-cvs mailing list lyx-cvs@lists.lyx.org http://lists.lyx.org/mailman/listinfo/lyx-cvs