commit 35588958ea9fe018eb3f89c1c4e50f9c6e748587
Author: Thibaut Cuvelier <[email protected]>
Date:   Mon Feb 7 04:47:40 2022 +0100

    DocBook: in ERTs, allow the use of \string.
---
 src/insets/InsetERT.cpp |   64 +++++++++++++++++++++++++++++++++--------------
 1 files changed, 45 insertions(+), 19 deletions(-)

diff --git a/src/insets/InsetERT.cpp b/src/insets/InsetERT.cpp
index 397f118..50b5daa 100644
--- a/src/insets/InsetERT.cpp
+++ b/src/insets/InsetERT.cpp
@@ -30,7 +30,7 @@
 #include "support/TempFile.h"
 
 #include <sstream>
-
+#include <regex>
 #include <iostream>
 
 using namespace std;
@@ -436,26 +436,52 @@ void InsetERT::docbook(XMLStream & xs, OutputParams const 
& runparams) const
 //             auto lay = getLayout();
 //     }
 
-       // Try to recognise some commands to have a nicer DocBook output. First 
step: some commands have a direct mapping
-       // to DocBook, mostly because the mapping is simply text or an XML 
entity.
-       docstring os_trimmed = trim(os.str());
+       // Try to recognise some commands to have a nicer DocBook output.
        bool output_as_comment = true;
 
-       auto command_raw_translation = 
raw_latex_encoding_to_unicode_xml.find(os_trimmed);
-       if (command_raw_translation != raw_latex_encoding_to_unicode_xml.end()) 
{
-               xs << command_raw_translation->second;
-               output_as_comment = false;
-       } else {
-               // If the trimmed ERT ends with {}, try a mapping without it.
-               auto os_braces = os_trimmed.find(from_ascii("{}"));
-
-               if (os_braces != lyx::docstring::npos) {
-                       auto key = os_trimmed.substr(0, os_braces);
-                       auto command_braces_translation = 
raw_latex_encoding_to_unicode_xml.find(key);
-
-                       if (command_braces_translation != 
raw_latex_encoding_to_unicode_xml.end()) {
-                               xs << command_braces_translation->second;
-                               output_as_comment = false;
+       // First step: some commands have a direct mapping to DocBook, mostly 
because the mapping is simply text or
+       // an XML entity.
+       {
+               docstring os_trimmed = trim(os.str());
+
+               auto command_raw_translation = 
raw_latex_encoding_to_unicode_xml.find(os_trimmed);
+               if (command_raw_translation != 
raw_latex_encoding_to_unicode_xml.end()) {
+                       xs << command_raw_translation->second;
+                       output_as_comment = false;
+               } else {
+                       // If the trimmed ERT ends with {}, try a mapping 
without it.
+                       auto os_braces = os_trimmed.find(from_ascii("{}"));
+
+                       if (os_braces != lyx::docstring::npos) {
+                               auto key = os_trimmed.substr(0, os_braces);
+                               auto command_braces_translation = 
raw_latex_encoding_to_unicode_xml.find(key);
+
+                               if (command_braces_translation != 
raw_latex_encoding_to_unicode_xml.end()) {
+                                       xs << 
command_braces_translation->second;
+                                       output_as_comment = false;
+                               }
+                       }
+               }
+       }
+
+       // Second step: the command \string can be ignored. If that's the only 
command in the ERT, then done.
+       // There may be several occurrences. (\string is 7 characters long.)
+       if (os.str().length() >= 7) {
+               docstring os_str = os.str();
+
+               while (os_str.length() >= 7) {
+                       auto os_text = os_str.find(from_ascii("\\string"));
+
+                       if (os_text != lyx::docstring::npos && 
!std::isalpha(static_cast<int>(os_str[os_text + 7]))) {
+                               os_str = os_str.substr(0, os_text) + 
os_str.substr(os_text + 7, os_str.length());
+
+                               if (os_str.find('\\') == std::string::npos) {
+                                       xs << os_str;
+                                       output_as_comment = false;
+                                       break;
+                               }
+                       } else {
+                               break;
                        }
                }
        }
-- 
lyx-cvs mailing list
[email protected]
http://lists.lyx.org/mailman/listinfo/lyx-cvs

Reply via email to