docdir = subst(docdir, "~", "\\string~");
bool const nonascii = !isAscii(from_utf8(docdir));
// LaTeX 2019/10/01 handles non-ascii path without detokenize
- bool const utfpathlatex = features.isAvailable("LaTeX-2019/10/01");
+ bool const utfpathlatex = features.isAvailableAtLeastFrom("LaTeX", 2019, 10);
bool const detokenize = !utfpathlatex && nonascii;
bool const quote = contains(docdir, ' ');
if (utfpathlatex && nonascii)
mathmlNamespace = + " xmlns:" + mathmlPrefix + "=\"http://www.w3.org/1998/Math/MathML\"";
}
+ // XML-compatible language code: in lib/languages, language codes are
+ // given as dictionary file names; HTML5 expects to follow BCP47. This
+ // function implements a simple heuristic that does the conversion.
+ std::string htmlCode = params().language->code();
+ std::replace(htmlCode.begin(), htmlCode.end(), '_', '-');
+
// Directly output the root tag, based on the current type of document.
- string languageCode = params().language->code();
- string params = "xml:lang=\"" + languageCode + '"'
- + " xmlns=\"http://docbook.org/ns/docbook\""
- + " xmlns:xlink=\"http://www.w3.org/1999/xlink\""
- + mathmlNamespace
- + " xmlns:xi=\"http://www.w3.org/2001/XInclude\""
- + " version=\"5.2\"";
+ string attributes = "xml:lang=\"" + htmlCode + '"'
+ + " xmlns=\"http://docbook.org/ns/docbook\""
+ + " xmlns:xlink=\"http://www.w3.org/1999/xlink\""
+ + mathmlNamespace
+ + " xmlns:xi=\"http://www.w3.org/2001/XInclude\""
+ + " version=\"5.2\"";
+ // Version 5.2 is required for formalgroup.
- os << "<" << from_ascii(tclass.docbookroot()) << " " << from_ascii(params) << ">\n";
+ os << "<" << from_ascii(tclass.docbookroot()) << " " << from_ascii(attributes) << ">\n";
}
if (output_body) {
output == FullSource || output == OnlyBody || output == IncludedFile;
if (output_preamble) {
- os << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
- << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN\" \"http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd\">\n"
- // FIXME Language should be set properly.
- << "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n"
+ // HTML5-compatible language code: in lib/languages, language codes are
+ // given as dictionary file names; HTML5 expects to follow BCP47. This
+ // function implements a simple heuristic that does the conversion.
+ std::string htmlCode = params().language->code();
+ std::replace(htmlCode.begin(), htmlCode.end(), '_', '-');
+
+ os << "<!DOCTYPE html>\n"
+ << "<html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"" << from_ascii(htmlCode) << "\">\n"
<< "<head>\n"
- << "<meta name=\"GENERATOR\" content=\"" << PACKAGE_STRING << "\" />\n"
- // FIXME Presumably need to set this right
- << "<meta http-equiv=\"Content-type\" content=\"text/html;charset=UTF-8\" />\n";
+ << "<meta name=\"generator\" content=\"" << PACKAGE_STRING << "\" />\n";
docstring const & doctitle = features.htmlTitle();
os << "<title>"
// we are here if the CSS is supposed to be written to the header
// or if we failed to write it to an external file.
if (!written) {
- os << "<style type='text/css'>\n"
+ os << "<style>\n"
<< dstyles
<< "\n</style>\n";
}