/
formatter.coffee
34 lines (29 loc) · 1.11 KB
/
formatter.coffee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
stream = require 'stream'
_ = require 'lodash'
mediumHeaderRegex = /(?:\n\n)?(?:\x1b\[\d{2}m)?commit \w{40}(?:\x1b\[m)?\n(?:Merge: \w{40}(?: \w{40})*\n)?Author: [^\n]+\nDate: [^\n]+\n\n/g
class GitCommitMessageFormatter extends stream.Transform
constructor: (@_render, options) ->
super options
@_data = ''
_transform: (chunk, encoding, callback) ->
@_data += chunk.toString 'utf-8'
[headers, messages] = @_parseData()
rendered = (@_render msg for msg in messages)
results = (commit.join '' for commit in _.zip headers, rendered)
callback null, results.join ''
_parseData: ->
offsets = []
while match = mediumHeaderRegex.exec @_data
offsets.push [match.index, mediumHeaderRegex.lastIndex]
headers = (@_data[s...e].replace /^\n{2}/, '\n' for [s, e] in offsets)
offsets.push [-1, 0]
messages = []
for [s, e] in offsets
if prevEnd
lines = @_data[prevEnd...s].split '\n'
lines = (line[4..] for line in lines)
msg = lines.join '\n'
messages.push msg
prevEnd = e
[headers, messages]
module.exports = GitCommitMessageFormatter