Skip to content

Commit cda8237

Browse files
committed
Support translated titles in nav.
1 parent 5248674 commit cda8237

2 files changed

Lines changed: 50 additions & 16 deletions

File tree

converter/generator/BookTransformer.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,22 @@ async Task TransformAsync(string language, string layoutScripts)
8787
var srcEnDir = Path.Combine(SourceFolderEn, BookDirName);
8888
string? fallbackBanner = null;
8989

90+
var titles = Titles[language] = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
91+
92+
foreach (var (_, file, _) in Pages)
93+
{
94+
var srcFile = Path.Combine(srcDir, file);
95+
96+
if (File.Exists(srcFile) || (language != "en" && File.Exists(srcFile = Path.Combine(srcEnDir, file))))
97+
{
98+
titles.Add(file, GetPageTitle(srcFile));
99+
}
100+
else
101+
{
102+
ReportProblem("en/book.xml", $"Source file not found: {srcFile}");
103+
}
104+
}
105+
90106
foreach (var (url, file, nav) in Pages)
91107
{
92108
var dstDir = Path.Combine(OutputFolder, url, language != "en" ? language : "");

converter/generator/Transformer.cs

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ internal abstract class Transformer
2323
protected readonly Dictionary<string, (string book, string url, string titleEn)> PageLinks;
2424
protected readonly Dictionary<string, string> MovedPages;
2525

26+
protected readonly Dictionary<string, Dictionary<string, string>> Titles = [];
27+
2628
readonly Dictionary<string, List<(string message, TextPosition? position)>> Problems = [];
2729
readonly Dictionary<string, int> ProblemCounts = [];
2830

@@ -105,13 +107,29 @@ protected void Transform(string sourceFile, string destinationFile, Nav nav, str
105107
document.ToHtml(sw, HtmlMarkupFormatter.Instance);
106108
}
107109

108-
void Transform(IHtmlDocument document, string sourceFile, Nav nav, string language, INodeList headerNodes, INodeList? bannerNodes)
110+
protected static string GetPageTitle(string sourceFile)
109111
{
110-
if (document.QuerySelector("h1.firstHeading") is IElement firstHeading)
112+
using var fs = new FileStream(sourceFile, FileMode.Open, FileAccess.Read);
113+
var parser = new HtmlParser();
114+
var document = parser.ParseDocument(fs);
115+
116+
return GetPageTitle(document);
117+
}
118+
119+
private static string GetPageTitle(IHtmlDocument document)
120+
{
121+
if (document.QuerySelector("h1") is IElement firstHeading)
111122
{
112-
document.Title = firstHeading.Text();
123+
return firstHeading.Text();
113124
}
114125

126+
return "";
127+
}
128+
129+
void Transform(IHtmlDocument document, string sourceFile, Nav nav, string language, INodeList headerNodes, INodeList? bannerNodes)
130+
{
131+
document.Title = GetPageTitle(document);
132+
115133
var head = document.Head!;
116134
var body = document.Body!;
117135

@@ -134,8 +152,8 @@ void Transform(IHtmlDocument document, string sourceFile, Nav nav, string langua
134152
TransformImage(img, sourceFile, language, sourceDir);
135153
}
136154

137-
var familyDiv = CreateNavDiv(document, nav, sourceDir, language);
138-
body.AppendChild(familyDiv);
155+
var navDataDiv = CreateNavDataDiv(document, nav, sourceDir, language);
156+
body.AppendChild(navDataDiv);
139157

140158
var loading = document.CreateElement<IHtmlDivElement>();
141159
loading.ClassName = "loading";
@@ -150,38 +168,38 @@ void Transform(IHtmlDocument document, string sourceFile, Nav nav, string langua
150168
body.AppendNodes(loading, mainContent);
151169
}
152170

153-
private IHtmlDivElement CreateNavDiv(IHtmlDocument document, Nav nav, string sourceDir, string language)
171+
private IHtmlDivElement CreateNavDataDiv(IHtmlDocument document, Nav nav, string sourceDir, string language)
154172
{
155-
var familyDiv = document.CreateElement<IHtmlDivElement>();
173+
var navDataDiv = document.CreateElement<IHtmlDivElement>();
156174

157-
familyDiv.Id = "doc-nav-data";
158-
familyDiv.IsHidden = true;
175+
navDataDiv.Id = "doc-nav-data";
176+
navDataDiv.IsHidden = true;
159177

160178
if (!String.IsNullOrEmpty(nav.Parent))
161179
{
162180
if (TryResolveHref(sourceDir, language, "../" + nav.Parent, out var url, out var _))
163181
{
164-
familyDiv.SetAttribute("data-parent-link", url);
182+
navDataDiv.SetAttribute("data-parent-link", url);
165183
}
166184
}
167185
else
168186
{
169-
familyDiv.SetAttribute("data-parent-link", language == "en" ? "/" : $"/{language}");
187+
navDataDiv.SetAttribute("data-parent-link", language == "en" ? "/" : $"/{language}");
170188
}
171189

172190
if (nav.Siblings is not null)
173191
{
174192
var ul = CreateDataUL("doc-siblings-data", nav.Siblings);
175-
familyDiv.AppendChild(ul);
193+
navDataDiv.AppendChild(ul);
176194
}
177195

178196
if (nav.Children is not null)
179197
{
180198
var ul = CreateDataUL("doc-children-data", nav.Children);
181-
familyDiv.AppendChild(ul);
199+
navDataDiv.AppendChild(ul);
182200
}
183201

184-
return familyDiv;
202+
return navDataDiv;
185203

186204
IHtmlUnorderedListElement CreateDataUL(string id, string[] files)
187205
{
@@ -193,12 +211,12 @@ IHtmlUnorderedListElement CreateDataUL(string id, string[] files)
193211
{
194212
var li = document.CreateElement<IHtmlListItemElement>();
195213

196-
if (TryResolveHref(sourceDir, language, "../" + path, out var url, out var titleEn))
214+
if (TryResolveHref(sourceDir, language, "../" + path, out var url, out var _))
197215
{
198216
var a = document.CreateElement<IHtmlAnchorElement>();
199217

200218
a.SetAttribute("href", url);
201-
a.TextContent = titleEn ?? "";
219+
a.TextContent = Titles[language][path];
202220

203221
li.AppendChild(a);
204222
}

0 commit comments

Comments
 (0)