1 | class Base
|
2 | constructor: (project) ->
|
3 | @project = project
|
4 | @log = project.log
|
5 | @files = []
|
6 | @outline = {}
|
7 |
|
8 | renderFile: (data, fileInfo, callback) ->
|
9 | @log.trace 'BaseStyle#renderFile(..., %j, ...)', fileInfo
|
10 |
|
11 | @files.push fileInfo
|
12 |
|
13 | segments = Utils.splitSource data, fileInfo.language,
|
14 | requireWhitespaceAfterToken: !!@project.options.requireWhitespaceAfterToken
|
15 |
|
16 | @log.debug 'Split %s into %d segments', fileInfo.sourcePath, segments.length
|
17 |
|
18 | Utils.highlightCode segments, fileInfo.language, (error) =>
|
19 | if error
|
20 | if error.failedHighlights
|
21 | for highlight, i in error.failedHighlights
|
22 | @log.debug "highlight #{i}:"
|
23 | @log.warn segments[i]?.code.join '\n'
|
24 | @log.error highlight
|
25 |
|
26 | @log.error 'Failed to highlight %s as %s: %s', fileInfo.sourcePath, fileInfo.language.name, error.message or error
|
27 | return callback error
|
28 |
|
29 | Utils.markdownComments segments, @project, (error) =>
|
30 | if error
|
31 | @log.error 'Failed to markdown %s: %s', fileInfo.sourcePath, error.message
|
32 | return callback error
|
33 |
|
34 | @outline[fileInfo.targetPath] = utils.StyleHelpers.outlineHeaders segments
|
35 |
|
36 |
|
37 | segments = utils.StyleHelpers.segmentizeSoloHeaders segments
|
38 |
|
39 | @renderDocFile segments, fileInfo, callback
|
40 |
|
41 | renderDocFile: (segments, fileInfo, callback) ->
|
42 | @log.trace 'BaseStyle#renderDocFile(..., %j, ...)', fileInfo
|
43 |
|
44 | throw new Error "@templateFunc must be defined by subclasses!" unless @templateFunc
|
45 |
|
46 | docPath = path.resolve @project.outPath, "#{fileInfo.targetPath}.html"
|
47 |
|
48 | fsTools.mkdir path.dirname(docPath), '0755', (error) =>
|
49 | if error
|
50 | @log.error 'Unable to create directory %s: %s', path.dirname(docPath), error.message
|
51 | return callback error
|
52 |
|
53 | for segment in segments
|
54 | segment.markdownedComments = Utils.trimBlankLines segment.markdownedComments
|
55 | segment.highlightedCode = Utils.trimBlankLines segment.highlightedCode
|
56 |
|
57 | templateContext =
|
58 | project: @project
|
59 | segments: segments
|
60 | sourcePath: fileInfo.sourcePath
|
61 | targetPath: fileInfo.targetPath
|
62 | projectPath: fileInfo.projectPath
|
63 |
|
64 |
|
65 | pathChunks = path.dirname(fileInfo.targetPath).split(/[\/\\]/)
|
66 | if pathChunks.length == 1 && pathChunks[0] == '.'
|
67 | templateContext.relativeRoot = ''
|
68 | else
|
69 | templateContext.relativeRoot = "#{pathChunks.map(-> '..').join '/'}/"
|
70 |
|
71 | try
|
72 | data = @templateFunc templateContext
|
73 |
|
74 | catch error
|
75 | @log.error 'Rendering documentation template for %s failed: %s', docPath, error.message
|
76 | return callback error
|
77 |
|
78 | fs.writeFile docPath, data, 'utf-8', (error) =>
|
79 | if error
|
80 | @log.error 'Failed to write documentation file %s: %s', docPath, error.message
|
81 | return callback error
|
82 |
|
83 | @log.pass docPath
|
84 | callback()
|
85 |
|
86 | renderCompleted: (callback) ->
|
87 | @log.trace 'BaseStyle#renderCompleted(...)'
|
88 |
|
89 | @tableOfContents = utils.StyleHelpers.buildTableOfContents @files, @outline
|
90 |
|
91 | callback()
|