@@ -14,120 +14,21 @@ import java.nio.file.Files
1414import java .nio .file .FileVisitOption
1515import java .io .File
1616
17- case class Page ( link : Link , content : Member | ResolvedTemplate | String , children : Seq [ Page ]) :
18- def withNewChildren ( newChildren : Seq [ Page ]) = copy(children = children ++ newChildren)
17+ class HtmlRenderer ( rootPackage : Member , members : Map [ DRI , Member ])( using ctx : DocContext )
18+ extends Renderer (rootPackage, members, extension = " html " ) :
1919
20- def withTitle (newTitle : String ) = copy(link = link.copy(name = newTitle))
21-
22- def hasFrame = content match
23- case t : ResolvedTemplate => t.hasFrame
24- case _ => true
25-
26- class HtmlRenderer (rootPackage : Member , val members : Map [DRI , Member ])(using ctx : DocContext )
27- extends SiteRenderer , Resources , Locations , Writer :
28- private val args = summon[DocContext ].args
29- val staticSite = summon[DocContext ].staticSiteContext
30-
31- val effectiveMembers = members
32-
33- private def memberPage (member : Member ): Page =
34- val childrenPages = member.members.filter(_.needsOwnPage)
35- Page (Link (member.name, member.dri), member, childrenPages.map(memberPage))
36-
37- val navigablePage : Page =
38- val rootPckPage = memberPage(rootPackage)
39- staticSite match
40- case None => rootPckPage.withTitle(args.name)
41- case Some (siteContext) =>
42- val (indexes, templates) = siteContext.templates.partition(f =>
43- f.templateFile.isIndexPage() && f.file.toPath.getParent() == siteContext.docsPath)
44- if (indexes.size > 1 )
45- val msg = s " ERROR: Multiple index pages for doc found ${indexes.map(_.file)}"
46- report.error(msg)
47-
48- val templatePages = templates.map(templateToPage(_, siteContext))
49-
50- indexes.headOption match
51- case None if templatePages.isEmpty=>
52- rootPckPage.withTitle(args.name)
53- case None =>
54- Page (Link (args.name, docsRootDRI)," " , templatePages :+ rootPckPage.withTitle(" API" ))
55- case Some (indexPage) =>
56- val newChildren = templatePages :+ rootPckPage.withTitle(" API" )
57- templateToPage(indexPage, siteContext).withNewChildren(newChildren)
58-
59- val hiddenPages : Seq [Page ] =
60- staticSite match
61- case None =>
62- Seq (navigablePage.copy( // Add index page that is a copy of api/index.html
63- link = navigablePage.link.copy(dri = docsRootDRI),
64- children = Nil
65- ))
66- case Some (siteContext) =>
67- // In case that we do not have an index page and we do not have any API entries
68- // we want to create empty index page, so there is one
69- val actualIndexTemplate = siteContext.indexTemplate() match {
70- case None if effectiveMembers.isEmpty => Seq (siteContext.emptyIndexTemplate)
71- case templates => templates.toSeq
72- }
73-
74- (siteContext.orphanedTemplates ++ actualIndexTemplate).map(templateToPage(_, siteContext))
75-
76- /**
77- * Here we have to retrive index pages from hidden pages and replace fake index pages in navigable page tree.
78- */
79- val allPages : Seq [Page ] =
80- def traversePages (page : Page ): (Page , Seq [Page ]) =
81- val (newChildren, newPagesToRemove): (Seq [Page ], Seq [Page ]) = page.children.map(traversePages(_)).foldLeft((Seq [Page ](), Seq [Page ]())) {
82- case ((pAcc, ptrAcc), (p, ptr)) => (pAcc :+ p, ptrAcc ++ ptr)
83- }
84- hiddenPages.find(_.link == page.link) match
85- case None =>
86- (page.copy(children = newChildren), newPagesToRemove)
87- case Some (newPage) =>
88- (newPage.copy(children = newChildren), newPagesToRemove :+ newPage)
89-
90- val (newNavigablePage, pagesToRemove) = traversePages(navigablePage)
91-
92- val all = newNavigablePage +: hiddenPages.filterNot(pagesToRemove.contains)
93- // We need to check for conflicts only if we have top-level member called blog or docs
94- val hasPotentialConflict =
95- rootPackage.members.exists(m => m.name.startsWith(" docs" ) || m.name.startsWith(" blog" ))
96-
97- if hasPotentialConflict then
98- def walk (page : Page ): Unit =
99- if page.link.dri.isStaticFile then
100- val dest = absolutePath(page.link.dri)
101- if apiPaths.contains(dest) then
102- report.error(s " Conflict between static page and API member for $dest. $pathsConflictResoultionMsg" )
103- page.children.foreach(walk)
104-
105- all.foreach (walk)
106-
107- all
108-
109- def renderContent (page : Page ) = page.content match
110- case m : Member =>
111- val signatureRenderer = new SignatureRenderer :
112- def currentDri : DRI = page.link.dri
113- def link (dri : DRI ): Option [String ] =
114- Some (pathToPage(currentDri, dri)).filter(_ != UnresolvedLocationLink )
115-
116- MemberRenderer (signatureRenderer).fullMember(m)
117- case t : ResolvedTemplate => siteContent(page.link.dri, t)
118- case a : String => raw(a)
119-
120-
121- def renderPage (page : Page , parents : Vector [Link ]): Seq [String ] =
122- val newParents = parents :+ page.link
123- val content = html(
20+ override def pageContent (page : Page , parents : Vector [Link ]): AppliedTag =
21+ html(
12422 mkHead(page),
12523 body(
12624 if ! page.hasFrame then renderContent(page)
127- else mkFrame(page.link, newParents , renderContent(page))
25+ else mkFrame(page.link, parents , renderContent(page))
12826 )
12927 )
130- write(page.link.dri, content) +: page.children.flatMap(renderPage(_, newParents))
28+
29+ override def render (): Unit =
30+ val renderedResources = renderResources()
31+ super .render()
13132
13233 private def specificResources (page : Page ): Set [String ] =
13334 page.children.toSet.flatMap(specificResources) ++ (page.content match
@@ -157,10 +58,6 @@ class HtmlRenderer(rootPackage: Member, val members: Map[DRI, Member])(using ctx
15758 val resources = siteResourcesPaths.toSeq.map(pathToResource) ++ allResources(allPages) ++ onlyRenderedResources
15859 resources.flatMap(renderResource)
15960
160- def render (): Unit =
161- val renderedResources = renderResources()
162- val sites = allPages.map(renderPage(_, Vector .empty))
163-
16461 def mkHead (page : Page ): AppliedTag =
16562 val resources = page.content match
16663 case t : ResolvedTemplate =>
@@ -229,14 +126,6 @@ class HtmlRenderer(rootPackage: Member, val members: Map[DRI, Member])(using ctx
229126
230127 renderNested(navigablePage, toplevel = true )._2
231128
232- private def canonicalUrl (l : String ): AppliedTag | String =
233- val canon = args.docCanonicalBaseUrl
234- if ! canon.isEmpty then
235- val canonicalUrl = if canon.endsWith(" /" ) then canon else canon + " /"
236- link(rel := " canonical" , href := canonicalUrl + l)
237- else
238- " " // return empty tag
239-
240129 private def hasSocialLinks = ! args.socialLinks.isEmpty
241130
242131 private def socialLinks (whiteIcon : Boolean = true ) =
0 commit comments