UNPKG

3.21 kBtext/coffeescriptView Raw
1class Base
2 constructor: (project) ->
3 @project = project
4 @log = project.log
5 @files = []
6 @outline = {} # Keyed on target path
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 # We also prefer to split out solo headers
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 # How many levels deep are we?
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()