@@ -14,122 +14,21 @@ import java.nio.file.Files
14
14
import java .nio .file .FileVisitOption
15
15
import java .io .File
16
16
17
- case class Page (link : Link , content : Member | ResolvedTemplate | String , children : Seq [Page ]):
18
- def withNewChildren (newChildren : Seq [Page ]) = copy(children = children ++ newChildren)
19
-
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 = ctx.args.projectFormat match
124
- case " html" => html(
125
- mkHead(page),
126
- body(
127
- if ! page.hasFrame then renderContent(page)
128
- else mkFrame(page.link, newParents, renderContent(page))
129
- )
17
+ class HtmlRenderer (rootPackage : Member , members : Map [DRI , Member ])(using ctx : DocContext )
18
+ extends Renderer (rootPackage, members, extension = " html" ):
19
+
20
+ override def pageContent (page : Page , parents : Vector [Link ]): AppliedTag =
21
+ html(
22
+ mkHead(page),
23
+ body(
24
+ if ! page.hasFrame then renderContent(page)
25
+ else mkFrame(page.link, parents, renderContent(page))
130
26
)
131
- case " md" => renderContent(page)
132
- write(page.link.dri, content) +: page.children.flatMap(renderPage(_, newParents))
27
+ )
28
+
29
+ override def render (): Unit =
30
+ val renderedResources = renderResources()
31
+ super .render()
133
32
134
33
private def specificResources (page : Page ): Set [String ] =
135
34
page.children.toSet.flatMap(specificResources) ++ (page.content match
@@ -159,10 +58,6 @@ class HtmlRenderer(rootPackage: Member, val members: Map[DRI, Member])(using ctx
159
58
val resources = siteResourcesPaths.toSeq.map(pathToResource) ++ allResources(allPages) ++ onlyRenderedResources
160
59
resources.flatMap(renderResource)
161
60
162
- def render (): Unit =
163
- val renderedResources = renderResources()
164
- val sites = allPages.map(renderPage(_, Vector .empty))
165
-
166
61
def mkHead (page : Page ): AppliedTag =
167
62
val resources = page.content match
168
63
case t : ResolvedTemplate =>
@@ -226,14 +121,6 @@ class HtmlRenderer(rootPackage: Member, val members: Map[DRI, Member])(using ctx
226
121
227
122
renderNested(navigablePage, toplevel = true )._2
228
123
229
- private def canonicalUrl (l : String ): AppliedTag | String =
230
- val canon = args.docCanonicalBaseUrl
231
- if ! canon.isEmpty then
232
- val canonicalUrl = if canon.endsWith(" /" ) then canon else canon + " /"
233
- link(rel := " canonical" , href := canonicalUrl + l)
234
- else
235
- " " // return empty tag
236
-
237
124
private def hasSocialLinks = ! args.socialLinks.isEmpty
238
125
239
126
private def socialLinks (whiteIcon : Boolean = true ) =
0 commit comments