DocBook: support @ in index when used for sorting.

This commit is contained in:
Thibaut Cuvelier 2022-02-06 06:20:50 +01:00
parent 1eb19cb8e3
commit 34ea4080ec
3 changed files with 186 additions and 11 deletions

View File

@ -0,0 +1,147 @@
#LyX 2.4 created this file. For more info see https://www.lyx.org/
\lyxformat 608
\begin_document
\begin_header
\save_transient_properties true
\origin unavailable
\textclass article
\use_default_options true
\maintain_unincluded_children no
\language american
\language_package default
\inputencoding utf8
\fontencoding auto
\font_roman "default" "default"
\font_sans "default" "default"
\font_typewriter "default" "default"
\font_math "auto" "auto"
\font_default_family default
\use_non_tex_fonts false
\font_sc false
\font_roman_osf false
\font_sans_osf false
\font_typewriter_osf false
\font_sf_scale 100 100
\font_tt_scale 100 100
\use_microtype false
\use_dash_ligatures true
\graphics default
\default_output_format default
\output_sync 0
\bibtex_command default
\index_command default
\float_placement class
\float_alignment class
\paperfontsize default
\use_hyperref false
\papersize default
\use_geometry false
\use_package amsmath 1
\use_package amssymb 1
\use_package cancel 1
\use_package esint 1
\use_package mathdots 1
\use_package mathtools 1
\use_package mhchem 1
\use_package stackrel 1
\use_package stmaryrd 1
\use_package undertilde 1
\cite_engine basic
\cite_engine_type default
\use_bibtopic false
\use_indices false
\paperorientation portrait
\suppress_date false
\justification true
\use_refstyle 1
\use_minted 0
\use_lineno 0
\index Index
\shortcut idx
\color #008000
\end_index
\secnumdepth 3
\tocdepth 3
\paragraph_separation indent
\paragraph_indentation default
\is_math_indent 0
\math_numbering_side default
\quotes_style english
\dynamic_quotes 0
\papercolumns 1
\papersides 1
\paperpagestyle default
\tablestyle default
\tracking_changes false
\output_changes false
\change_bars false
\postpone_fragile_content true
\html_math_output 0
\html_css_as_file 0
\html_be_strict false
\docbook_table_output 0
\docbook_mathml_prefix 1
\end_header
\begin_body
\begin_layout Title
Index tests
\end_layout
\begin_layout Standard
Text
\begin_inset Index idx
status open
\begin_layout Plain Layout
Text
\end_layout
\end_inset
\begin_inset Index idx
status open
\begin_layout Plain Layout
SortedAs@Text
\end_layout
\end_inset
\begin_inset Index idx
status open
\begin_layout Plain Layout
Primary!Secondary
\end_layout
\end_inset
\begin_inset Index idx
status open
\begin_layout Plain Layout
SortedPrimary@Primary!Secondary
\end_layout
\end_inset
\begin_inset Index idx
status open
\begin_layout Plain Layout
Primary!Secondary!Tertiary
\end_layout
\end_inset
.
\end_layout
\end_body
\end_document

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- This DocBook file was created by LyX 2.4.0dev
See https://www.lyx.org/ for more information -->
<article xml:lang="en_US" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:xi="http://www.w3.org/2001/XInclude" version="5.2">
<title>Index tests</title>
<para>Text<indexterm><primary>Text</primary></indexterm><indexterm><primary sortas='SortedAs'>Text</primary></indexterm><indexterm><primary>Primary</primary><secondary>Secondary</secondary></indexterm><indexterm><primary sortas='SortedPrimary'>Primary</primary><secondary>Secondary</secondary></indexterm><indexterm><primary>Primary</primary><secondary>Secondary</secondary><tertiary>Tertiary</tertiary></indexterm>.</para>
</article>

View File

@ -194,16 +194,15 @@ void InsetIndex::docbook(XMLStream & xs, OutputParams const & runparams) const
InsetText::latex(ots, runparams); InsetText::latex(ots, runparams);
docstring latexString = trim(odss.str()); docstring latexString = trim(odss.str());
// Check whether there are unsupported things. // Check whether there are unsupported things. @ is supported, but only for sorting, without specific formatting.
if (latexString.find(from_utf8("@")) != latexString.npos) { if (latexString.find(from_utf8("@\\")) != lyx::docstring::npos) {
docstring error = from_utf8("Unsupported feature: an index entry contains an @. " docstring error = from_utf8("Unsupported feature: an index entry contains an @\\. "
"Complete entry: \"") + latexString + from_utf8("\""); "Complete entry: \"") + latexString + from_utf8("\"");
LYXERR0(error); LYXERR0(error);
xs << XMLStream::ESCAPE_NONE << (from_utf8("<!-- Output Error: ") + error + from_utf8(" -->\n")); xs << XMLStream::ESCAPE_NONE << (from_utf8("<!-- Output Error: ") + error + from_utf8(" -->\n"));
// TODO: implement @ using the sortas attribute (on primary, secondary, tertiary).
} }
// Handle several indices. // Handle several indices (indicated in the inset instead of the raw latexString).
docstring indexType = from_utf8(""); docstring indexType = from_utf8("");
if (buffer().masterBuffer()->params().use_indices) { if (buffer().masterBuffer()->params().use_indices) {
indexType += " type=\"" + params_.index + "\""; indexType += " type=\"" + params_.index + "\"";
@ -212,14 +211,25 @@ void InsetIndex::docbook(XMLStream & xs, OutputParams const & runparams) const
// Split the string into its main constituents: terms, and command (see, see also, range). // Split the string into its main constituents: terms, and command (see, see also, range).
size_t positionVerticalBar = latexString.find(from_ascii("|")); // What comes before | is (sub)(sub)entries. size_t positionVerticalBar = latexString.find(from_ascii("|")); // What comes before | is (sub)(sub)entries.
docstring indexTerms = latexString.substr(0, positionVerticalBar); docstring indexTerms = latexString.substr(0, positionVerticalBar);
docstring command = latexString.substr(positionVerticalBar + 1); docstring command;
if (positionVerticalBar != lyx::docstring::npos) {
command = latexString.substr(positionVerticalBar + 1);
}
// Handle sorting issues, with @.
vector<docstring> sortingElements = getVectorFromString(indexTerms, from_ascii("@"), false);
docstring sortAs;
if (sortingElements.size() == 2) {
sortAs = sortingElements[0];
indexTerms = sortingElements[1];
}
// Handle primary, secondary, and tertiary terms (entries, subentries, and subsubentries, for LaTeX). // Handle primary, secondary, and tertiary terms (entries, subentries, and subsubentries, for LaTeX).
vector<docstring> terms = getVectorFromString(indexTerms, from_ascii("!"), false); vector<docstring> terms = getVectorFromString(indexTerms, from_ascii("!"), false);
// Handle ranges. Happily, (| and |) can only be at the end of the string! However, | may be trapped by the // Handle ranges. Happily, (| and |) can only be at the end of the string!
bool hasStartRange = latexString.find(from_ascii("|(")) != latexString.npos; bool hasStartRange = latexString.find(from_ascii("|(")) != lyx::docstring::npos;
bool hasEndRange = latexString.find(from_ascii("|)")) != latexString.npos; bool hasEndRange = latexString.find(from_ascii("|)")) != lyx::docstring::npos;
if (hasStartRange || hasEndRange) { if (hasStartRange || hasEndRange) {
// Remove the ranges from the command if they do not appear at the beginning. // Remove the ranges from the command if they do not appear at the beginning.
size_t index = 0; size_t index = 0;
@ -258,7 +268,7 @@ void InsetIndex::docbook(XMLStream & xs, OutputParams const & runparams) const
} else { } else {
see = list; see = list;
if (see.find(from_ascii(",")) != see.npos) { if (see.find(from_ascii(",")) != std::string::npos) {
docstring error = from_utf8("Several index terms found as \"see\"! Only one is acceptable. " docstring error = from_utf8("Several index terms found as \"see\"! Only one is acceptable. "
"Complete entry: \"") + latexString + from_utf8("\""); "Complete entry: \"") + latexString + from_utf8("\"");
LYXERR0(error); LYXERR0(error);
@ -275,6 +285,12 @@ void InsetIndex::docbook(XMLStream & xs, OutputParams const & runparams) const
// If there are such things in the index entry, then this code may miserably fail. For example, for "Peter|(textbf", // If there are such things in the index entry, then this code may miserably fail. For example, for "Peter|(textbf",
// no range will be detected. // no range will be detected.
// TODO: Could handle formatting as significance="preferred"? // TODO: Could handle formatting as significance="preferred"?
if (!command.empty()) {
docstring error = from_utf8("Unsupported feature: an index entry contains a | with an unsupported command, ")
+ command + from_utf8(". ") + from_utf8("Complete entry: \"") + latexString + from_utf8("\"");
LYXERR0(error);
xs << XMLStream::ESCAPE_NONE << (from_utf8("<!-- Output Error: ") + error + from_utf8(" -->\n"));
}
// Write all of this down. // Write all of this down.
if (terms.empty() && !hasEndRange) { if (terms.empty() && !hasEndRange) {
@ -335,7 +351,12 @@ void InsetIndex::docbook(XMLStream & xs, OutputParams const & runparams) const
} else { } else {
xs << xml::StartTag("indexterm", attrs); xs << xml::StartTag("indexterm", attrs);
if (!terms.empty()) { // hasEndRange has no content. if (!terms.empty()) { // hasEndRange has no content.
xs << xml::StartTag("primary"); docstring attr;
if (!sortAs.empty()) {
attr = from_utf8("sortas='") + sortAs + from_utf8("'");
}
xs << xml::StartTag("primary", attr);
xs << terms[0]; xs << terms[0];
xs << xml::EndTag("primary"); xs << xml::EndTag("primary");
} }