summaryrefslogtreecommitdiff
path: root/src/node/utils
diff options
context:
space:
mode:
authorSimon Gaeremynck <gaeremyncks@gmail.com>2015-10-20 19:46:08 +0100
committerSimon Gaeremynck <gaeremyncks@gmail.com>2015-10-20 19:46:08 +0100
commit2bfc3026d2e549064bd13e496d407169b2755df5 (patch)
treeb82e31be356959a4bfb3afbc1d59fe3179ac8ccc /src/node/utils
parent504cc102a02396232bb9e29b159e3b5188f85a36 (diff)
downloadetherpad-lite-2bfc3026d2e549064bd13e496d407169b2755df5.zip
Allow LibreOffice to be used when exporting a pad
This commit adds support for LibreOffice when exporting a pad to doc, pdf, .. This commit also cleans up some export logic when exporting to txt
Diffstat (limited to 'src/node/utils')
-rw-r--r--src/node/utils/ExportHtml.js31
-rw-r--r--src/node/utils/LibreOffice.js93
-rw-r--r--src/node/utils/Settings.js5
3 files changed, 115 insertions, 14 deletions
diff --git a/src/node/utils/ExportHtml.js b/src/node/utils/ExportHtml.js
index 53469c9b..fef2508c 100644
--- a/src/node/utils/ExportHtml.js
+++ b/src/node/utils/ExportHtml.js
@@ -123,8 +123,8 @@ function getHTMLFromAtext(pad, atext, authorColors)
var newLength = props.push(propName);
anumMap[a] = newLength -1;
- css+=".removed {text-decoration: line-through; " +
- "-ms-filter:'progid:DXImageTransform.Microsoft.Alpha(Opacity=80)'; "+
+ css+=".removed {text-decoration: line-through; " +
+ "-ms-filter:'progid:DXImageTransform.Microsoft.Alpha(Opacity=80)'; "+
"filter: alpha(opacity=80); "+
"opacity: 0.8; "+
"}\n";
@@ -287,7 +287,7 @@ function getHTMLFromAtext(pad, atext, authorColors)
var s = taker.take(chars);
- //removes the characters with the code 12. Don't know where they come
+ //removes the characters with the code 12. Don't know where they come
//from but they break the abiword parser and are completly useless
s = s.replace(String.fromCharCode(12), "");
@@ -401,7 +401,7 @@ function getHTMLFromAtext(pad, atext, authorColors)
pieces.push('<br><br>');
}
}*/
- else//means we are getting closer to the lowest level of indentation or are at the same level
+ else//means we are getting closer to the lowest level of indentation or are at the same level
{
var toClose = lists.length > 0 ? listLevels[listLevels.length - 2] - line.listLevel : 0
if( toClose > 0){
@@ -455,7 +455,7 @@ function getHTMLFromAtext(pad, atext, authorColors)
}
}
}
-
+
for (var k = lists.length - 1; k >= 0; k--)
{
if(lists[k][1] == "number")
@@ -484,14 +484,17 @@ exports.getPadHTMLDocument = function (padId, revNum, noDocType, callback)
stylesForExportCSS += css;
});
// Core inclusion of head etc.
- var head =
- (noDocType ? '' : '<!doctype html>\n') +
- '<html lang="en">\n' + (noDocType ? '' : '<head>\n' +
+ var head =
+ (noDocType ? '' : '<!doctype html>\n') +
+ '<html lang="en">\n' + (noDocType ? '' : '<head>\n' +
'<title>' + Security.escapeHTML(padId) + '</title>\n' +
- '<meta charset="utf-8">\n' +
- '<style> * { font-family: arial, sans-serif;\n' +
- 'font-size: 13px;\n' +
- 'line-height: 17px; }' +
+ '<meta name="generator" content="Etherpad Lite">\n' +
+ '<meta name="author" content="Etherpad Lite">\n' +
+ '<meta name="changedby" content="Etherpad Lite">\n' +
+ '<meta charset="utf-8">\n' +
+ '<style> * { font-family: arial, sans-serif;\n' +
+ 'font-size: 13px;\n' +
+ 'line-height: 17px; }' +
'ul.indent { list-style-type: none; }' +
'ol { list-style-type: none; padding-left:0;}' +
@@ -577,8 +580,8 @@ exports.getPadHTMLDocument = function (padId, revNum, noDocType, callback)
'ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol{ text-indent: 140px; }' +
'ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol > ol{ text-indent: 150px; }' +
- stylesForExportCSS +
- '</style>\n' + '</head>\n') +
+ stylesForExportCSS +
+ '</style>\n' + '</head>\n') +
'<body>';
var foot = '</body>\n</html>\n';
diff --git a/src/node/utils/LibreOffice.js b/src/node/utils/LibreOffice.js
new file mode 100644
index 00000000..41577245
--- /dev/null
+++ b/src/node/utils/LibreOffice.js
@@ -0,0 +1,93 @@
+/**
+ * Controls the communication with LibreOffice
+ */
+
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS-IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var async = require("async");
+var fs = require("fs");
+var os = require("os");
+var path = require("path");
+var settings = require("./Settings");
+var spawn = require("child_process").spawn;
+
+// Conversion tasks will be queued up, so we don't overload the system
+var queue = async.queue(doConvertTask, 1);
+
+/**
+ * Convert a file from one type to another
+ *
+ * @param {String} srcFile The path on disk to convert
+ * @param {String} destFile The path on disk where the converted file should be stored
+ * @param {String} type The type to convert into
+ * @param {Function} callback Standard callback function
+ */
+exports.convertFile = function(srcFile, destFile, type, callback) {
+ queue.push({"srcFile": srcFile, "destFile": destFile, "type": type, "callback": callback});
+};
+
+function doConvertTask(task, callback) {
+ var tmpDir = os.tmpdir();
+
+ async.series([
+ // Generate a PDF file with LibreOffice
+ function(callback) {
+ var soffice = spawn(settings.soffice, [
+ '--headless',
+ '--invisible',
+ '--nologo',
+ '--nolockcheck',
+ '--convert-to', task.type,
+ task.srcFile,
+ '--outdir', tmpDir
+ ]);
+
+ var stdoutBuffer = '';
+
+ // Delegate the processing of stdout to another function
+ soffice.stdout.on('data', function(data) {
+ stdoutBuffer += data.toString();
+ });
+
+ // Append error messages to the buffer
+ soffice.stderr.on('data', function(data) {
+ stdoutBuffer += data.toString();
+ });
+
+ // Throw an exception if libreoffice failed
+ soffice.on('exit', function(code) {
+ if (code != 0) {
+ return callback("LibreOffice died with exit code " + code + " and message: " + stdoutBuffer);
+ }
+
+ callback();
+ })
+ },
+
+ // Move the PDF file to the correct place
+ function(callback) {
+ var filename = path.basename(task.srcFile);
+ var pdfFilename = filename.substr(0, filename.lastIndexOf('.')) + '.' + task.type;
+ var pdfPath = path.join(tmpDir, pdfFilename);
+ fs.rename(pdfPath, task.destFile, callback);
+ }
+ ], function(err) {
+ // Invoke the callback for the local queue
+ callback();
+
+ // Invoke the callback for the task
+ task.callback(err);
+ });
+}
diff --git a/src/node/utils/Settings.js b/src/node/utils/Settings.js
index 2c2f90bf..d03e2a6c 100644
--- a/src/node/utils/Settings.js
+++ b/src/node/utils/Settings.js
@@ -153,6 +153,11 @@ exports.minify = true;
exports.abiword = null;
/**
+ * The path of the libreoffice executable
+ */
+exports.soffice = null;
+
+/**
* The path of the tidy executable
*/
exports.tidyHtml = null;