From 59e87a8729b9a2e19f3b3b416e940d18ce41b26b Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Mon, 8 Jun 2015 18:35:24 -0300 Subject: [PATCH] initial version of texcount --- services/clsi/app.coffee | 1 + .../clsi/app/coffee/CompileController.coffee | 10 ++++ .../clsi/app/coffee/CompileManager.coffee | 50 ++++++++++++++++++- .../acceptance/coffee/SynctexTests.coffee | 17 +++++++ .../acceptance/coffee/helpers/Client.coffee | 9 ++++ 5 files changed, 86 insertions(+), 1 deletion(-) diff --git a/services/clsi/app.coffee b/services/clsi/app.coffee index 9083bb4bf3..8e451a7650 100644 --- a/services/clsi/app.coffee +++ b/services/clsi/app.coffee @@ -36,6 +36,7 @@ app.delete "/project/:project_id", CompileController.clearCache app.get "/project/:project_id/sync/code", CompileController.syncFromCode app.get "/project/:project_id/sync/pdf", CompileController.syncFromPdf +app.get "/project/:project_id/wordcount", CompileController.wordcount ForbidSymlinks = require "./app/js/StaticServerForbidSymlinks" diff --git a/services/clsi/app/coffee/CompileController.coffee b/services/clsi/app/coffee/CompileController.coffee index 71368be737..ce107f8eab 100644 --- a/services/clsi/app/coffee/CompileController.coffee +++ b/services/clsi/app/coffee/CompileController.coffee @@ -66,3 +66,13 @@ module.exports = CompileController = res.send JSON.stringify { code: codePositions } + + wordcount: (req, res, next = (error) ->) -> + file = req.query.file + project_id = req.params.project_id + + CompileManager.wordcount project_id, file, (error, result) -> + return next(error) if error? + res.send JSON.stringify { + texcount: result + } diff --git a/services/clsi/app/coffee/CompileManager.coffee b/services/clsi/app/coffee/CompileManager.coffee index ac0c241149..5bbd3ab2e1 100644 --- a/services/clsi/app/coffee/CompileManager.coffee +++ b/services/clsi/app/coffee/CompileManager.coffee @@ -107,4 +107,52 @@ module.exports = CompileManager = line: parseInt(line, 10) column: parseInt(column, 10) } - return results \ No newline at end of file + return results + + _parseWordcountFromOutput: (output) -> + results = { + encode: "" + textWords: 0 + headWords: 0 + outside: 0 + headers: 0 + elements: 0 + mathInline: 0 + mathDisplay: 0 + } + for line in output.split("\n") + [data, info] = line.split(":") + if data.indexOf("Encoding") > -1 + results['encode'] = info.trim() + if data.indexOf("in text") > -1 + results['textWords'] = parseInt(info, 10) + if data.indexOf("in head") > -1 + results['headWords'] = parseInt(info, 10) + if data.indexOf("outside") > -1 + results['outside'] = parseInt(info, 10) + if data.indexOf("of head") > -1 + results['headers'] = parseInt(info, 10) + if data.indexOf("float") > -1 + results['elements'] = parseInt(info, 10) + if data.indexOf("inlines") > -1 + results['mathInline'] = parseInt(info, 10) + if data.indexOf("displayed") > -1 + results['mathDisplay'] = parseInt(info, 10) + + return results + + wordcount: (project_id, file_name, callback = (error, pdfPositions) ->) -> + base_dir = Settings.path.synctexBaseDir(project_id) + file_path = base_dir + "/" + file_name + logger.log project_id: project_id, file_name: file_name, "try wordcount" + CompileManager._runWordcount [file_path], (error, stdout) -> + return callback(error) if error? + logger.log project_id: project_id, file_name: file_name, stdout: stdout, "wordcount output" + callback null, CompileManager._parseWordcountFromOutput(stdout) + + _runWordcount: (args, callback = (error, stdout) ->) -> + bin_path = Path.resolve("texcount") + seconds = 1000 + child_process.execFile "texcount", args, timeout: 10 * seconds, (error, stdout, stderr) -> + return callback(error) if error? + callback(null, stdout) \ No newline at end of file diff --git a/services/clsi/test/acceptance/coffee/SynctexTests.coffee b/services/clsi/test/acceptance/coffee/SynctexTests.coffee index 330eaff22e..8979b983e5 100644 --- a/services/clsi/test/acceptance/coffee/SynctexTests.coffee +++ b/services/clsi/test/acceptance/coffee/SynctexTests.coffee @@ -36,3 +36,20 @@ describe "Syncing", -> ) done() + describe "wordcount file", -> + it "should return wordcount info", (done) -> + Client.wordcount @project_id, "main.tex", (error, result) -> + throw error if error? + expect(result).to.deep.equal( + texcount: { + encode: "ascii" + textWords: 2 + headWords: 0 + outside: 0 + headers: 0 + elements: 0 + mathInline: 0 + mathDisplay: 0 + } + ) + done() diff --git a/services/clsi/test/acceptance/coffee/helpers/Client.coffee b/services/clsi/test/acceptance/coffee/helpers/Client.coffee index 7025b79cce..3e1a5b86d0 100644 --- a/services/clsi/test/acceptance/coffee/helpers/Client.coffee +++ b/services/clsi/test/acceptance/coffee/helpers/Client.coffee @@ -90,3 +90,12 @@ module.exports = Client = @compile project_id, req, callback + wordcount: (project_id, file, callback = (error, pdfPositions) ->) -> + request.get { + url: "#{@host}/project/#{project_id}/wordcount" + qs: { + file: file + } + }, (error, response, body) -> + return callback(error) if error? + callback null, JSON.parse(body)