86 lines
2.8 KiB
86 lines
2.8 KiB
/* -*- Mode: js; js-indent-level: 2; indent-tabs-mode: nil; tab-width: 2 -*- */ |
|
/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ |
|
/* |
|
* Copyright 2014 Mozilla Foundation |
|
* |
|
* 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. |
|
*/ |
|
/*jslint node: true */ |
|
|
|
'use strict'; |
|
|
|
var fs = require('fs'); |
|
var path = require('path'); |
|
var spawn = require('child_process').spawn; |
|
|
|
var ttxResourcesHome = path.join(__dirname, '..', 'ttx'); |
|
|
|
var nextTTXTaskId = Date.now(); |
|
|
|
function runTtx(ttxResourcesHome, fontPath, registerOnCancel, callback) { |
|
fs.realpath(ttxResourcesHome, function (err, ttxResourcesHome) { |
|
var fontToolsHome = path.join(ttxResourcesHome, 'fonttools-code'); |
|
fs.realpath(fontPath, function (err, fontPath) { |
|
var ttxPath = path.join('Tools', 'ttx'); |
|
if (!fs.existsSync(path.join(fontToolsHome, ttxPath))) { |
|
callback('TTX was not found, please checkout PDF.js submodules'); |
|
return; |
|
} |
|
var ttxEnv = { |
|
'PYTHONPATH': path.join(fontToolsHome, 'Lib'), |
|
'PYTHONDONTWRITEBYTECODE': true |
|
}; |
|
var ttxStdioMode = 'ignore'; |
|
var ttx = spawn('python', [ttxPath, fontPath], |
|
{cwd: fontToolsHome, stdio: ttxStdioMode, env: ttxEnv}); |
|
var ttxRunError; |
|
registerOnCancel(function (reason) { |
|
ttxRunError = reason; |
|
callback(reason); |
|
ttx.kill(); |
|
}); |
|
ttx.on('error', function (err) { |
|
ttxRunError = err; |
|
callback('Unable to execute ttx'); |
|
}); |
|
ttx.on('close', function (code) { |
|
if (ttxRunError) { |
|
return; |
|
} |
|
callback(); |
|
}); |
|
}); |
|
}); |
|
} |
|
|
|
exports.translateFont = function translateFont(content, registerOnCancel, |
|
callback) { |
|
var buffer = new Buffer(content, 'base64'); |
|
var taskId = (nextTTXTaskId++).toString(); |
|
var fontPath = path.join(ttxResourcesHome, taskId + '.otf'); |
|
var resultPath = path.join(ttxResourcesHome, taskId + '.ttx'); |
|
|
|
fs.writeFileSync(fontPath, buffer); |
|
runTtx(ttxResourcesHome, fontPath, registerOnCancel, function (err) { |
|
fs.unlink(fontPath); |
|
if (err) { |
|
console.error(err); |
|
callback(err); |
|
} else if (!fs.existsSync(resultPath)) { |
|
callback('Output was not generated'); |
|
} else { |
|
callback(null, fs.readFileSync(resultPath)); |
|
fs.unlink(resultPath); |
|
} |
|
}); |
|
};
|
|
|