};
},
- constructPostScript: function pdfFunctionConstructPostScript(fn, dict, xref) {
+ constructPostScript: function pdfFunctionConstructPostScript(fn, dict,
+ xref) {
var domain = dict.get('Domain');
var range = dict.get('Range');
if (!domain)
error('No domain.');
- if(!range)
- error('No range.')
+ if (!range)
+ error('No range.');
var lexer = new PostScriptLexer(fn);
var parser = new PostScriptParser(lexer);
}
FunctionCache.prototype = {
has: function(key) {
- return key in this.cache
+ return key in this.cache;
},
get: function(key) {
return this.cache[key];
// algorithm from http://jsfromhell.com/array/rotate
var l = a.length, p = (Math.abs(p) >= l && (p %= l),
p < 0 && (p += l), p), i, x;
- for(; p; p = (Math.ceil(l / p) - 1) * p - l + (l = p))
- for(i = l; i > p; x = a[--i], a[i] = a[i - p], a[i - p] = x);
+ for (; p; p = (Math.ceil(l / p) - 1) * p - l + (l = p))
+ for (i = l; i > p; x = a[--i], a[i] = a[i - p], a[i - p] = x);
this.stack = this.stack.concat(a);
}
};
break;
default:
error('Unknown operator ' + operator);
- break
+ break;
}
}
return stack.stack;
}
- }
+ };
return PostScriptEvaluator;
})();
// The true block is right after the 'if' so it just falls through on
// true else it jumps and skips the true block.
condition.push('jz', this.code.length);
- } else if(this.accept(PostScriptTokenTypes.LBRACE)) {
+ } else if (this.accept(PostScriptTokenTypes.LBRACE)) {
var jump = [];
this.code.push(jump);
var endOfTrue = this.code.length;
'use strict';
describe('function', function() {
- beforeEach(function () {
- this.addMatchers({
- toMatchArray: function(expected) {
- var actual = this.actual;
- if (actual.length != expected.length)
- return false;
- for (var i = 0; i < expected.length; i++) {
- var a = actual[i], b = expected[i];
- if (isArray(b)) {
- if (a.length != b.length)
- return false;
- for (var j = 0; j < a.length; j++) {
- var suba = a[j], subb = b[j];
- if (suba !== subb)
- return false
- }
- } else {
- if (a !== b)
- return false;
- }
- }
- return true;
- }
- });
- });
+ beforeEach(function() {
+ this.addMatchers({
+ toMatchArray: function(expected) {
+ var actual = this.actual;
+ if (actual.length != expected.length)
+ return false;
+ for (var i = 0; i < expected.length; i++) {
+ var a = actual[i], b = expected[i];
+ if (isArray(b)) {
+ if (a.length != b.length)
+ return false;
+ for (var j = 0; j < a.length; j++) {
+ var suba = a[j], subb = b[j];
+ if (suba !== subb)
+ return false;
+ }
+ } else {
+ if (a !== b)
+ return false;
+ }
+ }
+ return true;
+ }
+ });
+ });
describe('PostScriptParser', function() {
function parse(program) {
var stream = new StringStream(program);
- var parser = new PostScriptParser(new PostScriptLexer(stream));
- return parser.parse();
+ var parser = new PostScriptParser(new PostScriptLexer(stream));
+ return parser.parse();
}
it('parses empty programs', function() {
var output = parse('{}');
var number = 999;
var program = parse('{ ' + number + ' }');
var expectedProgram = [
- ['push', number]
+ ['push', number]
];
- expect(program).toMatchArray(expectedProgram);
+ expect(program).toMatchArray(expectedProgram);
});
it('parses negative numbers', function() {
var number = -999;
var program = parse('{ ' + number + ' }');
var expectedProgram = [
- ['push', number]
+ ['push', number]
];
- expect(program).toMatchArray(expectedProgram);
+ expect(program).toMatchArray(expectedProgram);
});
it('parses negative floats', function() {
var number = 3.3;
var program = parse('{ ' + number + ' }');
var expectedProgram = [
- ['push', number]
+ ['push', number]
];
- expect(program).toMatchArray(expectedProgram);
+ expect(program).toMatchArray(expectedProgram);
});
it('parses operators', function() {
var program = parse('{ sub }');
var expectedProgram = [
- ['sub']
+ ['sub']
];
- expect(program).toMatchArray(expectedProgram);
+ expect(program).toMatchArray(expectedProgram);
});
it('parses if statements', function() {
var program = parse('{ { 99 } if }');
var expectedProgram = [
- ['jz', 2],
- ['push', 99]
+ ['jz', 2],
+ ['push', 99]
];
- expect(program).toMatchArray(expectedProgram);
+ expect(program).toMatchArray(expectedProgram);
});
it('parses ifelse statements', function() {
var program = parse('{ { 99 } { 44 } ifelse }');
var expectedProgram = [
- ['jz', 3],
- ['push', 99],
- ['j', 4],
- ['push', 44],
+ ['jz', 3],
+ ['push', 99],
+ ['j', 4],
+ ['push', 44]
];
- expect(program).toMatchArray(expectedProgram);
+ expect(program).toMatchArray(expectedProgram);
});
it('handles missing brackets', function() {
- expect(function() { parse('{'); }).toThrow(
- new Error('Unexpected symbol: found undefined expected 1.'));
+ expect(function() { parse('{'); }).toThrow(
+ new Error('Unexpected symbol: found undefined expected 1.'));
});
});
describe('PostScriptEvaluator', function() {
function evaluate(program) {
var stream = new StringStream(program);
- var parser = new PostScriptParser(new PostScriptLexer(stream));
- var code = parser.parse();
- var evaluator = new PostScriptEvaluator(code);
- var output = evaluator.execute();
- console.log(output);
- return output;
+ var parser = new PostScriptParser(new PostScriptLexer(stream));
+ var code = parser.parse();
+ var evaluator = new PostScriptEvaluator(code);
+ var output = evaluator.execute();
+ return output;
}
it('pushes stack', function() {
var stack = evaluate('{ 99 }');
var expectedStack = [99];
- expect(stack).toMatchArray(expectedStack);
+ expect(stack).toMatchArray(expectedStack);
});
it('handles if with true', function() {
var stack = evaluate('{ 1 {99} if }');
var expectedStack = [99];
- expect(stack).toMatchArray(expectedStack);
+ expect(stack).toMatchArray(expectedStack);
});
it('handles if with false', function() {
var stack = evaluate('{ 0 {99} if }');
var expectedStack = [];
- expect(stack).toMatchArray(expectedStack);
+ expect(stack).toMatchArray(expectedStack);
});
it('handles ifelse with true', function() {
var stack = evaluate('{ 1 {99} {77} ifelse }');
var expectedStack = [99];
- expect(stack).toMatchArray(expectedStack);
+ expect(stack).toMatchArray(expectedStack);
});
it('handles ifelse with false', function() {
var stack = evaluate('{ 0 {99} {77} ifelse }');
var expectedStack = [77];
- expect(stack).toMatchArray(expectedStack);
+ expect(stack).toMatchArray(expectedStack);
});
it('handles nested if', function() {
var stack = evaluate('{ 1 {1 {77} if} if }');
var expectedStack = [77];
- expect(stack).toMatchArray(expectedStack);
+ expect(stack).toMatchArray(expectedStack);
});
-
+
it('abs', function() {
var stack = evaluate('{ -2 abs }');
var expectedStack = [2];
- expect(stack).toMatchArray(expectedStack);
+ expect(stack).toMatchArray(expectedStack);
});
it('adds', function() {
var stack = evaluate('{ 1 2 add }');
var expectedStack = [3];
- expect(stack).toMatchArray(expectedStack);
+ expect(stack).toMatchArray(expectedStack);
});
it('boolean ands', function() {
var stack = evaluate('{ true false and }');
var expectedStack = [false];
- expect(stack).toMatchArray(expectedStack);
+ expect(stack).toMatchArray(expectedStack);
});
it('bitwise ands', function() {
var stack = evaluate('{ 254 1 and }');
var expectedStack = [254 & 1];
- expect(stack).toMatchArray(expectedStack);
- });
- // TODO atan
- // TODO bitshift
- // TODO ceiling
- // TODO copy
- // TODO cos
- // TODO cvi
- // TODO cvr
- // TODO div
+ expect(stack).toMatchArray(expectedStack);
+ });
+ // TODO atan
+ // TODO bitshift
+ // TODO ceiling
+ // TODO copy
+ // TODO cos
+ // TODO cvi
+ // TODO cvr
+ // TODO div
it('duplicates', function() {
var stack = evaluate('{ 99 dup }');
var expectedStack = [99, 99];
- expect(stack).toMatchArray(expectedStack);
+ expect(stack).toMatchArray(expectedStack);
});
- // TODO eq
- it('exchanges', function() {
+ // TODO eq
+ it('exchanges', function() {
var stack = evaluate('{ 44 99 exch }');
var expectedStack = [99, 44];
- expect(stack).toMatchArray(expectedStack);
- });
- // TODO exp
- // TODO false
- // TODO floor
- // TODO ge
- // TODO gt
- // TODO idiv
- it('duplicates index', function() {
+ expect(stack).toMatchArray(expectedStack);
+ });
+ // TODO exp
+ // TODO false
+ // TODO floor
+ // TODO ge
+ // TODO gt
+ // TODO idiv
+ it('duplicates index', function() {
var stack = evaluate('{ 4 3 2 1 2 index }');
var expectedStack = [4, 3, 2, 1, 3];
- expect(stack).toMatchArray(expectedStack);
- });
- // TODO le
- // TODO ln
- // TODO log
- // TODO lt
- // TODO mod
- // TODO mul
- // TODO ne
- // TODO neg
- // TODO not
- // TODO or
- it('pops stack', function() {
+ expect(stack).toMatchArray(expectedStack);
+ });
+ // TODO le
+ // TODO ln
+ // TODO log
+ // TODO lt
+ // TODO mod
+ // TODO mul
+ // TODO ne
+ // TODO neg
+ // TODO not
+ // TODO or
+ it('pops stack', function() {
var stack = evaluate('{ 1 2 pop }');
var expectedStack = [1];
- expect(stack).toMatchArray(expectedStack);
+ expect(stack).toMatchArray(expectedStack);
});
- it('rolls stack right', function() {
+ it('rolls stack right', function() {
var stack = evaluate('{ 1 3 2 2 4 1 roll }');
var expectedStack = [2, 1, 3, 2];
- expect(stack).toMatchArray(expectedStack);
+ expect(stack).toMatchArray(expectedStack);
});
it('rolls stack left', function() {
var stack = evaluate('{ 1 3 2 2 4 -1 roll }');
var expectedStack = [3, 2, 2, 1];
- expect(stack).toMatchArray(expectedStack);
- });
- // TODO round
- // TODO sin
- // TODO sqrt
- // TODO sub
- // TODO true
- // TODO truncate
- // TODO xor
+ expect(stack).toMatchArray(expectedStack);
+ });
+ // TODO round
+ // TODO sin
+ // TODO sqrt
+ // TODO sub
+ // TODO true
+ // TODO truncate
+ // TODO xor
});
});