Fix lint errors

This commit is contained in:
Julian Viereck 2011-10-09 10:37:53 +02:00
parent a6180830f8
commit 20a348fc0c
7 changed files with 342 additions and 421 deletions

107
fonts.js
View File

@ -145,7 +145,7 @@ var FontLoader = {
for (var i = 0; i < fonts.length; i++) { for (var i = 0; i < fonts.length; i++) {
var font = fonts[i]; var font = fonts[i];
// If there is already a fontObj on the font, then it was loaded/attached // If there is already a fontObj on the font, then it was loaded/attached
// to the page already and we don't have to do anything for this font // to the page already and we don't have to do anything for this font
// here future. // here future.
@ -415,111 +415,6 @@ function getUnicodeRangeFor(value) {
return -1; return -1;
} }
/**
* FontShape is the minimal shape a FontObject can have to be useful during
* executing the IRQueue.
*/
var FontShape = (function FontShape() {
var constructor = function FontShape_constructor(obj) {
for (var name in obj) {
this[name] = obj[name];
}
var name = this.loadedName;
var bold = this.black ? (this.bold ? 'bolder' : 'bold') :
(this.bold ? 'bold' : 'normal');
var italic = this.italic ? 'italic' : 'normal';
this.fontFallback = this.serif ? 'serif' : 'sans-serif';
this.namePart1 = italic + ' ' + bold + ' ';
this.namePart2 = 'px "' + name + '", "';
this.supported = Object.keys(this.encoding).length != 0;
// Set the loading flag. Gets set to false in FontLoader.bind().
this.loading = true;
};
function int16(bytes) {
return (bytes[0] << 8) + (bytes[1] & 0xff);
};
constructor.prototype = {
getRule: function fonts_getRule(size, fallback) {
fallback = fallback || this.fontFallback;
return this.namePart1 + size + this.namePart2 + fallback + '"';
},
charsToUnicode: function fonts_chars2Unicode(chars) {
var charsCache = this.charsCache;
var str;
// if we translated this string before, just grab it from the cache
if (charsCache) {
str = charsCache[chars];
if (str)
return str;
}
// lazily create the translation cache
if (!charsCache)
charsCache = this.charsCache = Object.create(null);
// translate the string using the font's encoding
var encoding = this.encoding;
if (!encoding)
return chars;
str = '';
if (this.composite) {
// composite fonts have multi-byte strings convert the string from
// single-byte to multi-byte
// XXX assuming CIDFonts are two-byte - later need to extract the
// correct byte encoding according to the PDF spec
var length = chars.length - 1; // looping over two bytes at a time so
// loop should never end on the last byte
for (var i = 0; i < length; i++) {
var charcode = int16([chars.charCodeAt(i++), chars.charCodeAt(i)]);
var unicode = encoding[charcode];
if ('undefined' == typeof(unicode)) {
warn('Unencoded charcode ' + charcode);
unicode = charcode;
} else {
unicode = unicode.unicode;
}
str += String.fromCharCode(unicode);
}
}
else {
for (var i = 0; i < chars.length; ++i) {
var charcode = chars.charCodeAt(i);
var unicode = encoding[charcode];
if ('undefined' == typeof(unicode)) {
warn('Unencoded charcode ' + charcode);
unicode = charcode;
} else {
unicode = unicode.unicode;
}
// Handle surrogate pairs
if (unicode > 0xFFFF) {
str += String.fromCharCode(unicode & 0xFFFF);
unicode >>= 16;
}
str += String.fromCharCode(unicode);
}
}
// Enter the translated string into the cache
return (charsCache[chars] = str);
}
}
return constructor;
})();
/** /**
* 'Font' is the class the outside world should use, it encapsulate all the font * 'Font' is the class the outside world should use, it encapsulate all the font
* decoding logics whatever type it is (assuming the font type is supported). * decoding logics whatever type it is (assuming the font type is supported).

509
pdf.js

File diff suppressed because it is too large Load Diff

View File

@ -11,23 +11,23 @@ var WorkerPage = (function() {
this.workerPDF = workerPDF; this.workerPDF = workerPDF;
this.page = page; this.page = page;
this.objs = objs; this.objs = objs;
this.ref = page.ref; this.ref = page.ref;
} }
constructor.prototype = { constructor.prototype = {
get width() { get width() {
return this.page.width; return this.page.width;
}, },
get height() { get height() {
return this.page.height; return this.page.height;
}, },
get stats() { get stats() {
return this.page.stats; return this.page.stats;
}, },
get view() { get view() {
return this.page.view; return this.page.view;
}, },
@ -37,40 +37,40 @@ var WorkerPage = (function() {
this.callback = callback; this.callback = callback;
// TODO: Place the worker magic HERE. // TODO: Place the worker magic HERE.
// this.page.startRendering(ctx, callback, errback); // this.page.startRendering(ctx, callback, errback);
this.startRenderingTime = Date.now(); this.startRenderingTime = Date.now();
this.workerPDF.startRendering(this) this.workerPDF.startRendering(this);
}, },
startRenderingFromIRQueue: function(IRQueue, fonts) { startRenderingFromIRQueue: function(IRQueue, fonts) {
var gfx = new CanvasGraphics(this.ctx, this.objs); var gfx = new CanvasGraphics(this.ctx, this.objs);
var startTime = Date.now(); var startTime = Date.now();
var callback = function(err) { var callback = function(err) {
var pageNum = this.page.pageNumber + 1; var pageNum = this.page.pageNumber + 1;
console.log("page=%d - rendering time: time=%dms", console.log('page=%d - rendering time: time=%dms',
pageNum, Date.now() - startTime); pageNum, Date.now() - startTime);
console.log("page=%d - total time: time=%dms", console.log('page=%d - total time: time=%dms',
pageNum, Date.now() - this.startRenderingTime); pageNum, Date.now() - this.startRenderingTime);
this.callback(err); this.callback(err);
}.bind(this); }.bind(this);
this.page.startRenderingFromIRQueue(gfx, IRQueue, fonts, callback); this.page.startRenderingFromIRQueue(gfx, IRQueue, fonts, callback);
}, },
getLinks: function() { getLinks: function() {
return this.page.getLinks(); return this.page.getLinks();
} }
}; };
return constructor; return constructor;
})(); })();
/** /**
* A PDF document and page is build up of many objects. E.g. there are objects * A PDF document and page is build up of many objects. E.g. there are objects
* for fonts, images, rendering code and such. These objects might get processed * for fonts, images, rendering code and such. These objects might get processed
* inside of a worker. The `PDFObjects` implements some basic functions to manage * inside of a worker. The `PDFObjects` implements some basic functions to
* these objects. * manage these objects.
*/ */
var PDFObjects = (function() { var PDFObjects = (function() {
function PDFObjects() { function PDFObjects() {
@ -98,16 +98,16 @@ var PDFObjects = (function() {
* object needs to be resolved. If it isn't, this function throws. * object needs to be resolved. If it isn't, this function throws.
* *
* If called *with* a callback, the callback is called with the data of the * If called *with* a callback, the callback is called with the data of the
* object once the object is resolved. That means, if you call this * object once the object is resolved. That means, if you call this
* function and the object is already resolved, the callback gets called * function and the object is already resolved, the callback gets called
* right away. * right away.
*/ */
get: function(objId, callback) { get: function(objId, callback) {
// If there is a callback, then the get can be async and the object is // If there is a callback, then the get can be async and the object is
// not required to be resolved right now // not required to be resolved right now
if (callback) { if (callback) {
this.ensureObj(objId).then(callback); this.ensureObj(objId).then(callback);
} }
// If there isn't a callback, the user expects to get the resolved data // If there isn't a callback, the user expects to get the resolved data
// directly. // directly.
else { else {
@ -116,8 +116,8 @@ var PDFObjects = (function() {
// If there isn't an object yet or the object isn't resolved, then the // If there isn't an object yet or the object isn't resolved, then the
// data isn't ready yet! // data isn't ready yet!
if (!obj || !obj.isResolved) { if (!obj || !obj.isResolved) {
throw "Requesting object that isn't resolved yet " + objId; throw 'Requesting object that isn\'t resolved yet ' + objId;
} }
// Direct access. // Direct access.
else { else {
return obj.data; return obj.data;
@ -130,7 +130,7 @@ var PDFObjects = (function() {
*/ */
resolve: function(objId, data) { resolve: function(objId, data) {
var objs = this.objs; var objs = this.objs;
// In case there is a promise already on this object, just resolve it. // In case there is a promise already on this object, just resolve it.
if (objs[objId]) { if (objs[objId]) {
objs[objId].resolve(data); objs[objId].resolve(data);
@ -169,13 +169,13 @@ var PDFObjects = (function() {
// a *resolved* promise which shouldn't be the case! // a *resolved* promise which shouldn't be the case!
this.ensureObj(objId).data = data; this.ensureObj(objId).data = data;
} }
} };
return PDFObjects; return PDFObjects;
})(); })();
/** /**
* "Promise" object. * 'Promise' object.
* Each object that is stored in PDFObjects is based on a Promise object that * Each object that is stored in PDFObjects is based on a Promise object that
* contains the status of the object and the data. There migth be situations, * contains the status of the object and the data. There migth be situations,
* where a function want to use the value of an object, but it isn't ready at * where a function want to use the value of an object, but it isn't ready at
@ -201,12 +201,12 @@ var Promise = (function() {
this._data = data; this._data = data;
this.hasData = true; this.hasData = true;
} else { } else {
this.isResolved = false; this.isResolved = false;
this._data = EMPTY_PROMISE; this._data = EMPTY_PROMISE;
} }
this.callbacks = []; this.callbacks = [];
}; };
Promise.prototype = { Promise.prototype = {
hasData: false, hasData: false,
@ -215,7 +215,8 @@ var Promise = (function() {
return; return;
} }
if (this._data !== EMPTY_PROMISE) { if (this._data !== EMPTY_PROMISE) {
throw "Promise " + this.name + ": Cannot set the data of a promise twice"; throw 'Promise ' + this.name +
': Cannot set the data of a promise twice';
} }
this._data = data; this._data = data;
this.hasData = true; this.hasData = true;
@ -224,10 +225,10 @@ var Promise = (function() {
this.onDataCallback(data); this.onDataCallback(data);
} }
}, },
get data() { get data() {
if (this._data === EMPTY_PROMISE) { if (this._data === EMPTY_PROMISE) {
throw "Promise " + this.name + ": Cannot get data that isn't set"; throw 'Promise ' + this.name + ': Cannot get data that isn\'t set';
} }
return this._data; return this._data;
}, },
@ -239,35 +240,35 @@ var Promise = (function() {
this.onDataCallback = callback; this.onDataCallback = callback;
} }
}, },
resolve: function(data) { resolve: function(data) {
if (this.isResolved) { if (this.isResolved) {
throw "A Promise can be resolved only once " + this.name; throw 'A Promise can be resolved only once ' + this.name;
} }
this.isResolved = true; this.isResolved = true;
this.data = data; this.data = data;
var callbacks = this.callbacks; var callbacks = this.callbacks;
for (var i = 0; i < callbacks.length; i++) { for (var i = 0; i < callbacks.length; i++) {
callbacks[i].call(null, data); callbacks[i].call(null, data);
} }
}, },
then: function(callback) { then: function(callback) {
if (!callback) { if (!callback) {
throw "Requiring callback" + this.name; throw 'Requiring callback' + this.name;
} }
// If the promise is already resolved, call the callback directly. // If the promise is already resolved, call the callback directly.
if (this.isResolved) { if (this.isResolved) {
var data = this.data; var data = this.data;
callback.call(null, data); callback.call(null, data);
} else { } else {
this.callbacks.push(callback); this.callbacks.push(callback);
} }
} }
} };
return Promise; return Promise;
})(); })();

View File

@ -9,15 +9,15 @@ var console = {
var args = Array.prototype.slice.call(arguments); var args = Array.prototype.slice.call(arguments);
postMessage({ postMessage({
action: 'console_log', action: 'console_log',
data: args data: args
}); });
}, },
error: function error() { error: function error() {
var args = Array.prototype.slice.call(arguments); var args = Array.prototype.slice.call(arguments);
postMessage({ postMessage({
action: 'console_error', action: 'console_error',
data: args data: args
}); });
}, },

View File

@ -8,14 +8,14 @@ function MessageHandler(name, comObj) {
this.name = name; this.name = name;
this.comObj = comObj; this.comObj = comObj;
var ah = this.actionHandler = {}; var ah = this.actionHandler = {};
ah["console_log"] = [function(data) { ah['console_log'] = [function(data) {
console.log.apply(console, data); console.log.apply(console, data);
}] }];
ah["console_error"] = [function(data) { ah['console_error'] = [function(data) {
console.error.apply(console, data); console.error.apply(console, data);
}] }];
comObj.onmessage = function(event) { comObj.onmessage = function(event) {
var data = event.data; var data = event.data;
if (data.action in ah) { if (data.action in ah) {
@ -39,8 +39,8 @@ MessageHandler.prototype = {
send: function(actionName, data) { send: function(actionName, data) {
this.comObj.postMessage({ this.comObj.postMessage({
action: actionName, action: actionName,
data: data data: data
}); });
} }
} };

View File

@ -15,5 +15,5 @@ importScripts('processor_handler.js');
// Listen for messages from the main thread. // Listen for messages from the main thread.
var pdfDoc = null; var pdfDoc = null;
var handler = new MessageHandler("worker_processor", this); var handler = new MessageHandler('worker_processor', this);
WorkerProcessorHandler.setup(handler); WorkerProcessorHandler.setup(handler);

View File

@ -6,20 +6,21 @@
var WorkerProcessorHandler = { var WorkerProcessorHandler = {
setup: function(handler) { setup: function(handler) {
var pdfDoc = null; var pdfDoc = null;
handler.on("doc", function(data) { handler.on('doc', function(data) {
// Create only the model of the PDFDoc, which is enough for // Create only the model of the PDFDoc, which is enough for
// processing the content of the pdf. // processing the content of the pdf.
pdfDoc = new PDFDocModel(new Stream(data)); pdfDoc = new PDFDocModel(new Stream(data));
}); });
handler.on("page_request", function(pageNum) { handler.on('page_request', function(pageNum) {
pageNum = parseInt(pageNum); pageNum = parseInt(pageNum);
var page = pdfDoc.getPage(pageNum); var page = pdfDoc.getPage(pageNum);
// The following code does quite the same as Page.prototype.startRendering, // The following code does quite the same as
// but stops at one point and sends the result back to the main thread. // Page.prototype.startRendering, but stops at one point and sends the
// result back to the main thread.
var gfx = new CanvasGraphics(null); var gfx = new CanvasGraphics(null);
var start = Date.now(); var start = Date.now();
@ -29,15 +30,16 @@ var WorkerProcessorHandler = {
// Pre compile the pdf page and fetch the fonts/images. // Pre compile the pdf page and fetch the fonts/images.
var IRQueue = page.getIRQueue(handler, dependency); var IRQueue = page.getIRQueue(handler, dependency);
console.log("page=%d - getIRQueue: time=%dms, len=%d", pageNum, Date.now() - start, IRQueue.fnArray.length); console.log('page=%d - getIRQueue: time=%dms, len=%d', pageNum,
Date.now() - start, IRQueue.fnArray.length);
if (false /* show used commands */) { if (false /* show used commands */) {
var cmdMap = {}; var cmdMap = {};
var fnArray = IRQueue .fnArray; var fnArray = IRQueue .fnArray;
for (var i = 0; i < fnArray.length; i++) { for (var i = 0; i < fnArray.length; i++) {
var entry = fnArray[i]; var entry = fnArray[i];
if (entry == "paintReadyFormXObject") { if (entry == 'paintReadyFormXObject') {
//console.log(preCompilation.argsArray[i]); //console.log(preCompilation.argsArray[i]);
} }
if (cmdMap[entry] == null) { if (cmdMap[entry] == null) {
@ -46,7 +48,7 @@ var WorkerProcessorHandler = {
cmdMap[entry] += 1; cmdMap[entry] += 1;
} }
} }
console.log("cmds", JSON.stringify(cmdMap)); console.log('cmds', JSON.stringify(cmdMap));
} }
// Filter the dependecies for fonts. // Filter the dependecies for fonts.
@ -66,17 +68,17 @@ var WorkerProcessorHandler = {
// } // }
// } // }
handler.send("page", { handler.send('page', {
pageNum: pageNum, pageNum: pageNum,
IRQueue: IRQueue, IRQueue: IRQueue,
depFonts: fonts depFonts: fonts
}); });
}, this); }, this);
handler.on("font", function(data) { handler.on('font', function(data) {
var objId = data[0]; var objId = data[0];
var name = data[1]; var name = data[1];
var file = data[2]; var file = data[2];
var properties = data[3]; var properties = data[3];
var font = { var font = {
@ -92,15 +94,15 @@ var WorkerProcessorHandler = {
var fontFile = new Stream(file.bytes, file.start, var fontFile = new Stream(file.bytes, file.start,
file.end - file.start, fontFileDict); file.end - file.start, fontFileDict);
// Check if this is a FlateStream. Otherwise just use the created // Check if this is a FlateStream. Otherwise just use the created
// Stream one. This makes complex_ttf_font.pdf work. // Stream one. This makes complex_ttf_font.pdf work.
var cmf = file.bytes[0]; var cmf = file.bytes[0];
if ((cmf & 0x0f) == 0x08) { if ((cmf & 0x0f) == 0x08) {
font.file = new FlateStream(fontFile); font.file = new FlateStream(fontFile);
} else { } else {
font.file = fontFile; font.file = fontFile;
} }
} }
var obj = new Font(font.name, font.file, font.properties); var obj = new Font(font.name, font.file, font.properties);
@ -119,7 +121,7 @@ var WorkerProcessorHandler = {
// anymore as we sent over the ready str. // anymore as we sent over the ready str.
delete obj.data; delete obj.data;
handler.send("font_ready", [objId, obj]); handler.send('font_ready', [objId, obj]);
}); });
} }
} };