-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
117 lines (102 loc) · 3.56 KB
/
index.js
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
var spawn = require('cross-spawn-async')
, WritableBuffer = require('stream-buffers').WritableStreamBuffer
, fs = require('fs')
, path = require('path')
try {
fs.mkdirSync(__dirname+'/.temp')
}catch(e) {}
function pandoc(args) {
return spawn('pandoc', args)
}
const features = {
importTypes: {
'text/markdown': 'markdown'
, 'text/x-markdown': 'markdown'
, 'application/x-latex': 'latex'
, 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'docx'
, 'application/vnd.oasis.opendocument.text': 'odt'
, 'application/docbook+xml': 'docbook'
, 'application/epub+zip': 'epub'
}
, exportTypes: {
'text/markdown': 'markdown'
, 'text/x-markdown': 'markdown'
, 'application/x-latex': 'latex'
, 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'docx'
, 'application/vnd.oasis.opendocument.text': 'odt'
, 'application/docbook+xml': 'docbook'
, 'application/epub+zip': 'epub'
}
}
module.exports = setup
module.exports.consumes = ['importexport']
function setup(plugin, imports, register) {
var ie = imports.importexport
Object.keys(features.importTypes)
.forEach(importType => {
ie.registerImportProvider('text/html', importType, function*(document, user, data) {
var tempFile = path.join(__dirname,'.temp', 'import-'+Math.random()+'.bin')
yield function (cb) {
fs.writeFile(tempFile, data, cb)
}
try {
// convert input to html
var buffer = yield function(cb) {
var child = pandoc(['--from='+features.importTypes[importType], '--to=html', tempFile])
child.on('error', cb)
var bufferStream = new WritableBuffer()
var errBufferStream = new WritableBuffer()
child.stdout.pipe(bufferStream)
child.on('exit', (code) => {
if(code) {
if(errBufferStream.getContents()) {
return cb(new Error('Pandoc exited with '+code+':'+errBufferStream.getContents().toString('utf8')))
}else{
return cb(new Error('Pandoc exited with '+code))
}
}
cb(null, bufferStream.getContents())
})
child.stderr.pipe(errBufferStream)
}
}catch(e) {
fs.unlink(tempFile)
throw e
}
fs.unlink(tempFile)
// delegate to the html importer
yield ie.import(document.id, user, 'text/html', buffer)
})
})
Object.keys(features.exportTypes)
.forEach(exportType => {
ie.registerExportProvider('text/html', exportType, function* (document, snapshot) {
// convert snapshot to html
var html = yield ie.export(snapshot.id, 'text/html')
var tempFile = path.join(__dirname,'.temp', 'export-'+Math.random()+'.bin')
yield function(cb) {
var child = pandoc(['--from=html', '--to='+features.exportTypes[exportType], '-o', tempFile])
child.on('error', cb)
var errBufferStream = new WritableBuffer()
child.on('exit', (code) => {
if(code) {
if(errBufferStream.getContents()) {
return cb(new Error('Pandoc exited with '+code+':'+errBufferStream.getContents().toString('utf8')))
}else{
return cb(new Error('Pandoc exited with '+code))
}
}
cb()
})
child.stderr.pipe(errBufferStream)
child.stdin.end(html)
}
var buffer = yield function(cb) {
fs.readFile(tempFile, cb)
}
fs.unlink(tempFile)
return buffer
})
})
register()
}