From 2049cf01db3c3e89ba6659e70beed8dfe99a178f Mon Sep 17 00:00:00 2001 From: Yury Delendik Date: Sat, 4 Feb 2017 08:19:46 -0600 Subject: [PATCH] Moves preprocessor stuff to the gulpfile. --- examples/learning/helloworld.html | 4 +- examples/learning/helloworld64.html | 4 +- examples/learning/prevnext.html | 4 +- examples/text-only/index.html | 1 + examples/text-only/pdf2svg.js | 2 +- gulpfile.js | 399 ++++++++++++++++++++++++---- make.js | 384 +------------------------- package.json | 1 + 8 files changed, 370 insertions(+), 429 deletions(-) diff --git a/examples/learning/helloworld.html b/examples/learning/helloworld.html index 564c2ce17..685cccd76 100644 --- a/examples/learning/helloworld.html +++ b/examples/learning/helloworld.html @@ -13,7 +13,7 @@ - + - + + diff --git a/examples/text-only/pdf2svg.js b/examples/text-only/pdf2svg.js index 9cdd720bc..c808db44c 100644 --- a/examples/text-only/pdf2svg.js +++ b/examples/text-only/pdf2svg.js @@ -18,7 +18,7 @@ var PAGE_NUMBER = 1; var PAGE_SCALE = 1.5; var SVG_NS = 'http://www.w3.org/2000/svg'; -PDFJS.workerSrc = '../../build/pdf.worker.js'; +PDFJS.workerSrc = '../../build/generic/build/pdf.worker.js'; function buildSVG(viewport, textContent) { // Building SVG with size of the viewport (for simplicity) diff --git a/gulpfile.js b/gulpfile.js index 2667d1e78..81de4ff3c 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -20,6 +20,7 @@ var fs = require('fs'); var gulp = require('gulp'); var gutil = require('gulp-util'); +var rename = require('gulp-rename'); var mkdirp = require('mkdirp'); var rimraf = require('rimraf'); var runSequence = require('run-sequence'); @@ -34,10 +35,19 @@ var BUILD_DIR = 'build/'; var JSDOC_DIR = 'jsdoc/'; var L10N_DIR = 'l10n/'; var TEST_DIR = 'test/'; +var EXTENSION_SRC_DIR = 'extensions/'; -var makeFile = require('./make.js'); -var stripCommentHeaders = makeFile.stripCommentHeaders; -var builder = makeFile.builder; +var GENERIC_DIR = BUILD_DIR + 'generic/'; +var COMPONENTS_DIR = BUILD_DIR + 'components/'; +var SINGLE_FILE_DIR = BUILD_DIR + 'singlefile/'; +var MINIFIED_DIR = BUILD_DIR + 'minified/'; +var FIREFOX_BUILD_DIR = BUILD_DIR + 'firefox/'; +var COMMON_WEB_FILES = [ + 'web/images/*.{png,svg,gif,cur}', + 'web/debugger.js' +]; + +var builder = require('./external/builder/builder.js'); var CONFIG_FILE = 'pdfjs.config'; var config = JSON.parse(fs.readFileSync(CONFIG_FILE).toString()); @@ -76,6 +86,16 @@ function stripUMDHeaders(content) { return content.replace(reg, ''); } +function stripCommentHeaders(content) { + var notEndOfComment = '(?:[^*]|\\*(?!/))+'; + var reg = new RegExp( + '\n/\\* Copyright' + notEndOfComment + '\\*/\\s*' + + '(?:/\\*' + notEndOfComment + '\\*/\\s*|//(?!#).*\n\\s*)*' + + '\\s*\'use strict\';', 'g'); + content = content.replace(reg, ''); + return content; +} + function checkChromePreferencesFile(chromePrefsPath, webPrefsPath) { var chromePrefs = JSON.parse(fs.readFileSync(chromePrefsPath).toString()); var chromePrefsKeys = Object.keys(chromePrefs.properties); @@ -296,6 +316,14 @@ function checkDir(path) { } } +function getTempFile(prefix, suffix) { + mkdirp.sync(BUILD_DIR + 'tmp/'); + var bytes = require('crypto').randomBytes(6).toString('hex'); + var path = BUILD_DIR + 'tmp/' + prefix + bytes + suffix; + fs.writeFileSync(path, ''); + return path; +} + function createTestSource(testsName) { var source = stream.Readable({ objectMode: true }); source._read = function () { @@ -484,55 +512,328 @@ gulp.task('cmaps', function () { compressCmaps(CMAP_INPUT, VIEWER_CMAP_OUTPUT, true); }); -gulp.task('bundle-firefox', ['buildnumber'], function () { - var defines = builder.merge(DEFINES, {FIREFOX: true}); - return streamqueue({ objectMode: true }, - createBundle(defines), createWebBundle(defines)) - .pipe(gulp.dest(BUILD_DIR)); -}); - -gulp.task('bundle-mozcentral', ['buildnumber'], function () { - var defines = builder.merge(DEFINES, {MOZCENTRAL: true}); - return streamqueue({ objectMode: true }, - createBundle(defines), createWebBundle(defines)) - .pipe(gulp.dest(BUILD_DIR)); -}); - -gulp.task('bundle-chromium', ['buildnumber'], function () { - var defines = builder.merge(DEFINES, {CHROME: true}); - return streamqueue({ objectMode: true }, - createBundle(defines), createWebBundle(defines)) - .pipe(gulp.dest(BUILD_DIR)); -}); - -gulp.task('bundle-singlefile', ['buildnumber'], function () { - var defines = builder.merge(DEFINES, {SINGLE_FILE: true}); - return createBundle(defines).pipe(gulp.dest(BUILD_DIR)); -}); - -gulp.task('bundle-generic', ['buildnumber'], function () { - var defines = builder.merge(DEFINES, {GENERIC: true}); - return streamqueue({ objectMode: true }, - createBundle(defines), createWebBundle(defines)) - .pipe(gulp.dest(BUILD_DIR)); -}); - -gulp.task('bundle-minified', ['buildnumber'], function () { - var defines = builder.merge(DEFINES, {MINIFIED: true, GENERIC: true}); - return streamqueue({ objectMode: true }, - createBundle(defines), createWebBundle(defines)) - .pipe(gulp.dest(BUILD_DIR)); -}); - -gulp.task('bundle-components', ['buildnumber'], function () { - var defines = builder.merge(DEFINES, {COMPONENTS: true, GENERIC: true}); - return createWebBundle(defines).pipe(gulp.dest(BUILD_DIR)); -}); - gulp.task('bundle', ['buildnumber'], function () { return createBundle(DEFINES).pipe(gulp.dest(BUILD_DIR)); }); +function preprocessCSS(source, mode, defines, cleanup) { + var outName = getTempFile('~preprocess', '.css'); + var setup = { + defines: defines, + copy: [], + preprocess: [], + preprocessCSS: [ + [mode, source, outName] + ] + }; + builder.build(setup); + var out = fs.readFileSync(outName).toString(); + fs.unlinkSync(outName); + if (cleanup) { + // Strip out all license headers in the middle. + var reg = /\n\/\* Copyright(.|\n)*?Mozilla Foundation(.|\n)*?\*\//g; + out = out.replace(reg, ''); + } + + var i = source.lastIndexOf('/'); + return createStringSource(source.substr(i + 1), out); +} + +function preprocessHTML(source, defines) { + var outName = getTempFile('~preprocess', '.html'); + var setup = { + defines: defines, + copy: [], + preprocess: [ + [source, outName] + ], + preprocessCSS: [] + }; + builder.build(setup); + var out = fs.readFileSync(outName).toString(); + fs.unlinkSync(outName); + + var i = source.lastIndexOf('/'); + return createStringSource(source.substr(i + 1), out); +} + +function preprocessJS(source, defines, cleanup) { + var outName = getTempFile('~preprocess', '.js'); + var setup = { + defines: defines, + copy: [], + preprocess: [ + [source, outName] + ], + preprocessCSS: [] + }; + builder.build(setup); + var out = fs.readFileSync(outName).toString(); + fs.unlinkSync(outName); + if (cleanup) { + out = stripCommentHeaders(out); + } + + var i = source.lastIndexOf('/'); + return createStringSource(source.substr(i + 1), out); +} + +// Builds the generic production viewer that should be compatible with most +// modern HTML5 browsers. +gulp.task('generic', ['buildnumber', 'locale'], function () { + console.log(); + console.log('### Creating generic viewer'); + var defines = builder.merge(DEFINES, {GENERIC: true}); + + rimraf.sync(GENERIC_DIR); + + return merge([ + createBundle(defines).pipe(gulp.dest(GENERIC_DIR + 'build')), + createWebBundle(defines).pipe(gulp.dest(GENERIC_DIR + 'web')), + gulp.src(COMMON_WEB_FILES, {base: 'web/'}) + .pipe(gulp.dest(GENERIC_DIR + 'web')), + gulp.src('LICENSE').pipe(gulp.dest(GENERIC_DIR)), + gulp.src([ + 'external/webL10n/l10n.js', + 'web/compatibility.js' + ]).pipe(gulp.dest(GENERIC_DIR + 'web')), + gulp.src([ + 'web/locale/*/viewer.properties', + 'web/locale/locale.properties' + ], {base: 'web/'}).pipe(gulp.dest(GENERIC_DIR + 'web')), + gulp.src(['external/bcmaps/*.bcmap', 'external/bcmaps/LICENSE'], + {base: 'external/bcmaps'}) + .pipe(gulp.dest(GENERIC_DIR + 'web/cmaps')), + preprocessHTML('web/viewer.html', defines) + .pipe(gulp.dest(GENERIC_DIR + 'web')), + preprocessCSS('web/viewer.css', 'generic', defines, true) + .pipe(gulp.dest(GENERIC_DIR + 'web')), + + gulp.src('web/compressed.tracemonkey-pldi-09.pdf') + .pipe(gulp.dest(GENERIC_DIR + 'web')), + ]); +}); + +gulp.task('components', ['buildnumber'], function () { + console.log(); + console.log('### Creating generic components'); + var defines = builder.merge(DEFINES, {COMPONENTS: true, GENERIC: true}); + + rimraf.sync(COMPONENTS_DIR); + + var COMPONENTS_IMAGES = [ + 'web/images/annotation-*.svg', + 'web/images/loading-icon.gif', + 'web/images/shadow.png', + 'web/images/texture.png', + ]; + + return merge([ + createWebBundle(defines).pipe(gulp.dest(COMPONENTS_DIR)), + gulp.src(COMPONENTS_IMAGES).pipe(gulp.dest(COMPONENTS_DIR + 'images')), + gulp.src('web/compatibility.js').pipe(gulp.dest(COMPONENTS_DIR)), + preprocessCSS('web/pdf_viewer.css', 'components', defines, true) + .pipe(gulp.dest(COMPONENTS_DIR)), + ]); +}); + +gulp.task('singlefile', ['buildnumber'], function () { + console.log(); + console.log('### Creating singlefile build'); + var defines = builder.merge(DEFINES, {SINGLE_FILE: true}); + + var SINGLE_FILE_BUILD_DIR = SINGLE_FILE_DIR + 'build/'; + + rimraf.sync(SINGLE_FILE_DIR); + + return createBundle(defines).pipe(gulp.dest(SINGLE_FILE_BUILD_DIR)); +}); + +gulp.task('minified-pre', ['buildnumber', 'locale'], function () { + console.log(); + console.log('### Creating minified viewer'); + var defines = builder.merge(DEFINES, {MINIFIED: true, GENERIC: true}); + + rimraf.sync(MINIFIED_DIR); + + return merge([ + createBundle(defines).pipe(gulp.dest(MINIFIED_DIR + 'build')), + createWebBundle(defines).pipe(gulp.dest(MINIFIED_DIR + 'web')), + gulp.src(COMMON_WEB_FILES, {base: 'web/'}) + .pipe(gulp.dest(MINIFIED_DIR + 'web')), + gulp.src([ + 'web/locale/*/viewer.properties', + 'web/locale/locale.properties' + ], {base: 'web/'}).pipe(gulp.dest(MINIFIED_DIR + 'web')), + gulp.src(['external/bcmaps/*.bcmap', 'external/bcmaps/LICENSE'], + {base: 'external/bcmaps'}) + .pipe(gulp.dest(MINIFIED_DIR + 'web/cmaps')), + + preprocessHTML('web/viewer.html', defines) + .pipe(gulp.dest(MINIFIED_DIR + 'web')), + preprocessCSS('web/viewer.css', 'minified', defines, true) + .pipe(gulp.dest(MINIFIED_DIR + 'web')), + + gulp.src('web/compressed.tracemonkey-pldi-09.pdf') + .pipe(gulp.dest(MINIFIED_DIR + 'web')), + ]); +}); + +gulp.task('firefox-pre', ['buildnumber', 'locale'], function () { + console.log(); + console.log('### Building Firefox extension'); + var defines = builder.merge(DEFINES, {FIREFOX: true}); + + var FIREFOX_BUILD_CONTENT_DIR = FIREFOX_BUILD_DIR + '/content/', + FIREFOX_EXTENSION_DIR = 'extensions/firefox/', + FIREFOX_CONTENT_DIR = EXTENSION_SRC_DIR + '/firefox/content/'; + + // Clear out everything in the firefox extension build directory + rimraf.sync(FIREFOX_BUILD_DIR); + + return merge([ + createBundle(defines).pipe(gulp.dest(FIREFOX_BUILD_CONTENT_DIR + 'build')), + createWebBundle(defines).pipe(gulp.dest(FIREFOX_BUILD_CONTENT_DIR + 'web')), + gulp.src(COMMON_WEB_FILES, {base: 'web/'}) + .pipe(gulp.dest(FIREFOX_BUILD_CONTENT_DIR + 'web')), + gulp.src(FIREFOX_EXTENSION_DIR + 'locale/**/*.properties', + {base: FIREFOX_EXTENSION_DIR}) + .pipe(gulp.dest(FIREFOX_BUILD_DIR)), + gulp.src(['external/bcmaps/*.bcmap', 'external/bcmaps/LICENSE'], + {base: 'external/bcmaps'}) + .pipe(gulp.dest(FIREFOX_BUILD_CONTENT_DIR + 'web/cmaps')), + + preprocessHTML('web/viewer.html', defines) + .pipe(gulp.dest(FIREFOX_BUILD_CONTENT_DIR + 'web')), + preprocessCSS('web/viewer.css', 'firefox', defines, true) + .pipe(gulp.dest(FIREFOX_BUILD_CONTENT_DIR + 'web')), + + gulp.src(FIREFOX_CONTENT_DIR + 'PdfJs-stub.jsm') + .pipe(rename('PdfJs.jsm')) + .pipe(gulp.dest(FIREFOX_BUILD_CONTENT_DIR)), + gulp.src(FIREFOX_CONTENT_DIR + 'PdfJsTelemetry-addon.jsm') + .pipe(rename('PdfJsTelemetry.jsm')) + .pipe(gulp.dest(FIREFOX_BUILD_CONTENT_DIR)), + gulp.src(FIREFOX_EXTENSION_DIR + '**/*.{rdf,png,manifest}', + {base: FIREFOX_EXTENSION_DIR}) + .pipe(gulp.dest(FIREFOX_BUILD_DIR)), + gulp.src(FIREFOX_EXTENSION_DIR + 'chrome/content.js', + {base: FIREFOX_EXTENSION_DIR}) + .pipe(gulp.dest(FIREFOX_BUILD_DIR)), + gulp.src('LICENSE').pipe(gulp.dest(FIREFOX_BUILD_DIR)), + + gulp.src(FIREFOX_EXTENSION_DIR + 'tools/l10n.js') + .pipe(gulp.dest(FIREFOX_BUILD_CONTENT_DIR + '/web')), + + preprocessJS(FIREFOX_CONTENT_DIR + 'PdfStreamConverter.jsm', defines, true) + .pipe(gulp.dest(FIREFOX_BUILD_CONTENT_DIR)), + preprocessJS(FIREFOX_CONTENT_DIR + 'PdfJsNetwork.jsm', defines, true) + .pipe(gulp.dest(FIREFOX_BUILD_CONTENT_DIR)), + preprocessJS(FIREFOX_CONTENT_DIR + 'PdfjsContentUtils.jsm', defines, true) + .pipe(gulp.dest(FIREFOX_BUILD_CONTENT_DIR)), + preprocessJS(FIREFOX_CONTENT_DIR + 'PdfjsChromeUtils.jsm', defines, true) + .pipe(gulp.dest(FIREFOX_BUILD_CONTENT_DIR)), + preprocessJS(FIREFOX_EXTENSION_DIR + 'bootstrap.js', defines, true) + .pipe(gulp.dest(FIREFOX_BUILD_DIR)), + ]); +}); + +gulp.task('mozcentral-pre', ['buildnumber', 'locale'], function () { + console.log(); + console.log('### Building mozilla-central extension'); + var defines = builder.merge(DEFINES, {MOZCENTRAL: true}); + + var MOZCENTRAL_DIR = BUILD_DIR + 'mozcentral/', + MOZCENTRAL_EXTENSION_DIR = MOZCENTRAL_DIR + 'browser/extensions/pdfjs/', + MOZCENTRAL_CONTENT_DIR = MOZCENTRAL_EXTENSION_DIR + 'content/', + FIREFOX_EXTENSION_DIR = 'extensions/firefox/', + MOZCENTRAL_L10N_DIR = MOZCENTRAL_DIR + 'browser/locales/en-US/pdfviewer/', + FIREFOX_CONTENT_DIR = EXTENSION_SRC_DIR + '/firefox/content/'; + + // Clear out everything in the firefox extension build directory + rimraf.sync(MOZCENTRAL_DIR); + + return merge([ + createBundle(defines).pipe(gulp.dest(MOZCENTRAL_CONTENT_DIR + 'build')), + createWebBundle(defines).pipe(gulp.dest(MOZCENTRAL_CONTENT_DIR + 'web')), + gulp.src(COMMON_WEB_FILES, {base: 'web/'}) + .pipe(gulp.dest(MOZCENTRAL_CONTENT_DIR + 'web')), + gulp.src(['external/bcmaps/*.bcmap', 'external/bcmaps/LICENSE'], + {base: 'external/bcmaps'}) + .pipe(gulp.dest(MOZCENTRAL_CONTENT_DIR + 'web/cmaps')), + + preprocessHTML('web/viewer.html', defines) + .pipe(gulp.dest(MOZCENTRAL_CONTENT_DIR + 'web')), + preprocessCSS('web/viewer.css', 'mozcentral', defines, true) + .pipe(gulp.dest(MOZCENTRAL_CONTENT_DIR + 'web')), + + gulp.src(FIREFOX_CONTENT_DIR + 'PdfJsTelemetry.jsm') + .pipe(gulp.dest(MOZCENTRAL_CONTENT_DIR)), + gulp.src(FIREFOX_EXTENSION_DIR + 'chrome-mozcentral.manifest') + .pipe(rename('chrome.manifest')) + .pipe(gulp.dest(MOZCENTRAL_EXTENSION_DIR)), + gulp.src(FIREFOX_EXTENSION_DIR + 'locale/en-US/*.properties', + {base: FIREFOX_EXTENSION_DIR}) + .pipe(gulp.dest(MOZCENTRAL_L10N_DIR)), + gulp.src(FIREFOX_EXTENSION_DIR + 'README.mozilla') + .pipe(gulp.dest(MOZCENTRAL_EXTENSION_DIR)), + gulp.src('LICENSE').pipe(gulp.dest(MOZCENTRAL_EXTENSION_DIR)), + gulp.src(FIREFOX_EXTENSION_DIR + 'tools/l10n.js') + .pipe(gulp.dest(MOZCENTRAL_CONTENT_DIR + '/web')), + + preprocessJS(FIREFOX_CONTENT_DIR + 'PdfJs.jsm', defines, true) + .pipe(gulp.dest(MOZCENTRAL_CONTENT_DIR)), + preprocessJS(FIREFOX_CONTENT_DIR + 'PdfStreamConverter.jsm', defines, true) + .pipe(gulp.dest(MOZCENTRAL_CONTENT_DIR)), + preprocessJS(FIREFOX_CONTENT_DIR + 'PdfJsNetwork.jsm', defines, true) + .pipe(gulp.dest(MOZCENTRAL_CONTENT_DIR)), + preprocessJS(FIREFOX_CONTENT_DIR + 'PdfjsContentUtils.jsm', defines, true) + .pipe(gulp.dest(MOZCENTRAL_CONTENT_DIR)), + preprocessJS(FIREFOX_CONTENT_DIR + 'PdfjsChromeUtils.jsm', defines, true) + .pipe(gulp.dest(MOZCENTRAL_CONTENT_DIR)), + ]); +}); + +gulp.task('chromium-pre', ['buildnumber', 'locale'], function () { + console.log(); + console.log('### Building Chromium extension'); + var defines = builder.merge(DEFINES, {CHROME: true}); + + var CHROME_BUILD_DIR = BUILD_DIR + '/chromium/', + CHROME_BUILD_CONTENT_DIR = CHROME_BUILD_DIR + '/content/'; + + // Clear out everything in the chrome extension build directory + rimraf.sync(CHROME_BUILD_DIR); + return merge([ + createBundle(defines).pipe(gulp.dest(CHROME_BUILD_CONTENT_DIR + 'build')), + createWebBundle(defines).pipe(gulp.dest(CHROME_BUILD_CONTENT_DIR + 'web')), + gulp.src(COMMON_WEB_FILES, {base: 'web/'}) + .pipe(gulp.dest(CHROME_BUILD_CONTENT_DIR + 'web')), + + gulp.src('external/webL10n/l10n.js') + .pipe(gulp.dest(CHROME_BUILD_CONTENT_DIR + 'web')), + gulp.src([ + 'web/locale/*/viewer.properties', + 'web/locale/locale.properties' + ], {base: 'web/'}).pipe(gulp.dest(CHROME_BUILD_CONTENT_DIR + 'web')), + gulp.src(['external/bcmaps/*.bcmap', 'external/bcmaps/LICENSE'], + {base: 'external/bcmaps'}) + .pipe(gulp.dest(CHROME_BUILD_CONTENT_DIR + 'web/cmaps')), + + preprocessHTML('web/viewer.html', defines) + .pipe(gulp.dest(CHROME_BUILD_CONTENT_DIR + 'web')), + preprocessCSS('web/viewer.css', 'chrome', defines, true) + .pipe(gulp.dest(CHROME_BUILD_CONTENT_DIR + 'web')), + + gulp.src('LICENSE').pipe(gulp.dest(CHROME_BUILD_DIR)), + gulp.src('extensions/chromium/*.{json,html,js,css,png}') + .pipe(gulp.dest(CHROME_BUILD_DIR)), + gulp.src('extensions/chromium/**/*.{json,html,js,css,png}', + {base: 'extensions/chromium/'}) + .pipe(gulp.dest(CHROME_BUILD_DIR)), + ]); +}); + gulp.task('jsdoc', function (done) { console.log(); console.log('### Generating documentation (JSDoc)'); @@ -723,6 +1024,8 @@ gulp.task('importl10n', function(done) { }); // Getting all shelljs registered tasks and register them with gulp +require('./make.js'); + var gulpContext = false; for (var taskName in global.target) { if (taskName in gulp.tasks) { diff --git a/make.js b/make.js index c6bf6edd9..50f35921e 100644 --- a/make.js +++ b/make.js @@ -24,7 +24,6 @@ try { return; } -var builder = require('./external/builder/builder.js'); var fs = require('fs'); var CONFIG_FILE = 'pdfjs.config'; @@ -33,15 +32,10 @@ var config = JSON.parse(fs.readFileSync(CONFIG_FILE)); var ROOT_DIR = __dirname + '/', // absolute path to project's root BUILD_DIR = 'build/', SRC_DIR = 'src/', - BUILD_TARGET = BUILD_DIR + 'pdf.js', - BUILD_WORKER_TARGET = BUILD_DIR + 'pdf.worker.js', - BUILD_TARGETS = [BUILD_TARGET, BUILD_WORKER_TARGET], FIREFOX_BUILD_DIR = BUILD_DIR + '/firefox/', CHROME_BUILD_DIR = BUILD_DIR + '/chromium/', JSDOC_DIR = BUILD_DIR + 'jsdoc', EXTENSION_SRC_DIR = 'extensions/', - FIREFOX_CONTENT_DIR = EXTENSION_SRC_DIR + '/firefox/content/', - LOCALE_SRC_DIR = 'l10n/', GH_PAGES_DIR = BUILD_DIR + 'gh-pages/', GENERIC_DIR = BUILD_DIR + 'generic/', MINIFIED_DIR = BUILD_DIR + 'minified/', @@ -56,18 +50,6 @@ var ROOT_DIR = __dirname + '/', // absolute path to project's root MOZCENTRAL_STREAM_CONVERTER2_ID = 'd0c5195d-e798-49d4-b1d3-9324328b2292', FIREFOX_STREAM_CONVERTER2_ID = '6457a96b-2d68-439a-bcfa-44465fbcdbb2'; -var DEFINES = { - PRODUCTION: true, - // The main build targets: - GENERIC: false, - FIREFOX: false, - MOZCENTRAL: false, - CHROME: false, - MINIFIED: false, - SINGLE_FILE: false, - COMPONENTS: false -}; - function getCurrentVersion() { // The 'build/version.json' file is created by 'buildnumber' task. return JSON.parse(fs.readFileSync(ROOT_DIR + 'build/version.json').toString()) @@ -95,103 +77,17 @@ target.all = function() { // Production stuff // -// Files that need to be included in every build. -var COMMON_WEB_FILES = - ['web/images', - 'web/debugger.js'], - COMMON_WEB_FILES_PREPROCESS = - ['web/viewer.html'], - COMMON_FIREFOX_FILES_PREPROCESS = - [FIREFOX_CONTENT_DIR + 'PdfStreamConverter.jsm', - FIREFOX_CONTENT_DIR + 'PdfJsNetwork.jsm', - FIREFOX_CONTENT_DIR + 'PdfjsContentUtils.jsm', - FIREFOX_CONTENT_DIR + 'PdfjsChromeUtils.jsm']; // // make generic // Builds the generic production viewer that should be compatible with most // modern HTML5 browsers. // target.generic = function() { - execGulp('bundle-generic'); - - target.locale(); - - cd(ROOT_DIR); - echo(); - echo('### Creating generic viewer'); - - rm('-rf', GENERIC_DIR); - mkdir('-p', GENERIC_DIR); - mkdir('-p', GENERIC_DIR + BUILD_DIR); - mkdir('-p', GENERIC_DIR + '/web'); - mkdir('-p', GENERIC_DIR + '/web/cmaps'); - - var defines = builder.merge(DEFINES, {GENERIC: true}); - - var setup = { - defines: defines, - copy: [ - [BUILD_TARGETS, GENERIC_DIR + BUILD_DIR], - [BUILD_DIR + 'viewer.js', GENERIC_DIR + '/web'], - [COMMON_WEB_FILES, GENERIC_DIR + '/web'], - ['LICENSE', GENERIC_DIR], - ['external/webL10n/l10n.js', GENERIC_DIR + '/web'], - ['web/compatibility.js', GENERIC_DIR + '/web'], - ['web/compressed.tracemonkey-pldi-09.pdf', GENERIC_DIR + '/web'], - ['external/bcmaps/*', GENERIC_DIR + '/web/cmaps/'], - ['web/locale', GENERIC_DIR + '/web'] - ], - preprocess: [ - [COMMON_WEB_FILES_PREPROCESS, GENERIC_DIR + '/web'] - ], - preprocessCSS: [ - ['generic', 'web/viewer.css', - GENERIC_DIR + '/web/viewer.css'] - ] - }; - builder.build(setup); - - cleanupJSSource(GENERIC_DIR + '/build/pdf.js'); - cleanupJSSource(GENERIC_DIR + '/web/viewer.js'); - cleanupCSSSource(GENERIC_DIR + '/web/viewer.css'); + execGulp('generic'); }; target.components = function() { - execGulp('bundle-components'); - - cd(ROOT_DIR); - echo(); - echo('### Creating generic components'); - - rm('-rf', COMPONENTS_DIR); - mkdir('-p', COMPONENTS_DIR); - mkdir('-p', COMPONENTS_DIR + 'images'); - - var defines = builder.merge(DEFINES, {COMPONENTS: true, GENERIC: true}); - - var COMPONENTS_IMAGES = [ - 'web/images/annotation-*.svg', - 'web/images/loading-icon.gif', - 'web/images/shadow.png', - 'web/images/texture.png', - ]; - - var setup = { - defines: defines, - copy: [ - [BUILD_DIR + 'pdf_viewer.js', COMPONENTS_DIR], - [COMPONENTS_IMAGES, COMPONENTS_DIR + 'images'], - ['web/compatibility.js', COMPONENTS_DIR], - ], - preprocess: [], - preprocessCSS: [ - ['components', 'web/pdf_viewer.css', COMPONENTS_DIR + 'pdf_viewer.css'], - ] - }; - builder.build(setup); - - cleanupJSSource(COMPONENTS_DIR + 'pdf_viewer.js'); - cleanupCSSSource(COMPONENTS_DIR + 'pdf_viewer.css'); + execGulp('components'); }; target.jsdoc = function() { @@ -400,93 +296,16 @@ target.bundle = function(args) { // flags the script loader to not attempt to load the separate worker JS file. // target.singlefile = function() { - cd(ROOT_DIR); - echo(); - echo('### Creating singlefile build'); - - var SINGLE_FILE_BUILD_DIR = SINGLE_FILE_DIR + 'build/'; - - execGulp('bundle-singlefile'); - - cd(ROOT_DIR); - - rm('-rf', SINGLE_FILE_DIR); - mkdir('-p', SINGLE_FILE_DIR); - mkdir('-p', SINGLE_FILE_BUILD_DIR); - - cp(BUILD_DIR + 'pdf.combined.js', SINGLE_FILE_BUILD_DIR); + execGulp('singlefile'); }; -function stripCommentHeaders(content) { - var notEndOfComment = '(?:[^*]|\\*(?!/))+'; - var reg = new RegExp( - '\n/\\* Copyright' + notEndOfComment + '\\*/\\s*' + - '(?:/\\*' + notEndOfComment + '\\*/\\s*|//(?!#).*\n\\s*)*' + - '\\s*\'use strict\';', 'g'); - content = content.replace(reg, ''); - return content; -} - -function cleanupJSSource(file) { - var content = cat(file); - - content = stripCommentHeaders(content); - - content.to(file); -} - -function cleanupCSSSource(file) { - var content = cat(file); - - // Strip out all license headers in the middle. - var reg = /\n\/\* Copyright(.|\n)*?Mozilla Foundation(.|\n)*?\*\//g; - content = content.replace(reg, ''); - - content.to(file); -} - // // make minified // Builds the minified production viewer that should be compatible with most // modern HTML5 browsers. // target.minified = function() { - execGulp('bundle-minified'); - target.locale(); - - cd(ROOT_DIR); - echo(); - echo('### Creating minified viewer'); - - rm('-rf', MINIFIED_DIR); - mkdir('-p', MINIFIED_DIR); - mkdir('-p', MINIFIED_DIR + BUILD_DIR); - mkdir('-p', MINIFIED_DIR + '/web'); - mkdir('-p', MINIFIED_DIR + '/web/cmaps'); - - var defines = builder.merge(DEFINES, {GENERIC: true, MINIFIED: true}); - - var setup = { - defines: defines, - copy: [ - [BUILD_TARGETS, MINIFIED_DIR + BUILD_DIR], - [BUILD_DIR + 'viewer.js', MINIFIED_DIR + '/web'], - [COMMON_WEB_FILES, MINIFIED_DIR + '/web'], - ['web/compressed.tracemonkey-pldi-09.pdf', MINIFIED_DIR + '/web'], - ['external/bcmaps/*', MINIFIED_DIR + '/web/cmaps'], - ['web/locale', MINIFIED_DIR + '/web'] - ], - preprocess: [ - [COMMON_WEB_FILES_PREPROCESS, MINIFIED_DIR + '/web'] - ], - preprocessCSS: [ - ['minified', 'web/viewer.css', - MINIFIED_DIR + '/web/viewer.css'] - ] - }; - builder.build(setup); - - cleanupCSSSource(MINIFIED_DIR + '/web/viewer.css'); + execGulp('minified-pre'); var viewerFiles = [ 'web/compatibility.js', @@ -542,22 +361,10 @@ target.buildnumber = function() { // make firefox // target.firefox = function() { - cd(ROOT_DIR); - echo(); - echo('### Building Firefox extension'); - var defines = builder.merge(DEFINES, {FIREFOX: true}); + execGulp('firefox-pre'); + cd(ROOT_DIR); var FIREFOX_BUILD_CONTENT_DIR = FIREFOX_BUILD_DIR + '/content/', - FIREFOX_EXTENSION_DIR = 'extensions/firefox/', - FIREFOX_EXTENSION_FILES_TO_COPY = - ['*.js', - '*.rdf', - '*.svg', - '*.png', - '*.manifest', - 'locale', - 'chrome', - '../../LICENSE'], FIREFOX_EXTENSION_FILES = ['bootstrap.js', 'install.rdf', @@ -570,55 +377,6 @@ target.firefox = function() { 'LICENSE'], FIREFOX_EXTENSION_NAME = 'pdf.js.xpi'; - target.locale(); - execGulp('bundle-firefox'); - cd(ROOT_DIR); - - // Clear out everything in the firefox extension build directory - rm('-rf', FIREFOX_BUILD_DIR); - mkdir('-p', FIREFOX_BUILD_CONTENT_DIR); - mkdir('-p', FIREFOX_BUILD_CONTENT_DIR + BUILD_DIR); - mkdir('-p', FIREFOX_BUILD_CONTENT_DIR + '/web'); - mkdir('-p', FIREFOX_BUILD_CONTENT_DIR + '/web/cmaps'); - - cp(FIREFOX_CONTENT_DIR + 'PdfJs-stub.jsm', - FIREFOX_BUILD_CONTENT_DIR + 'PdfJs.jsm'); - - cp(FIREFOX_CONTENT_DIR + 'PdfJsTelemetry-addon.jsm', - FIREFOX_BUILD_CONTENT_DIR + 'PdfJsTelemetry.jsm'); - - // Copy extension files - cd(FIREFOX_EXTENSION_DIR); - cp('-R', FIREFOX_EXTENSION_FILES_TO_COPY, ROOT_DIR + FIREFOX_BUILD_DIR); - cd(ROOT_DIR); - - var setup = { - defines: defines, - copy: [ - [BUILD_TARGETS, FIREFOX_BUILD_CONTENT_DIR + BUILD_DIR], - [BUILD_DIR + 'viewer.js', FIREFOX_BUILD_CONTENT_DIR + '/web'], - [COMMON_WEB_FILES, FIREFOX_BUILD_CONTENT_DIR + '/web'], - ['external/bcmaps/*', FIREFOX_BUILD_CONTENT_DIR + '/web/cmaps'], - [FIREFOX_EXTENSION_DIR + 'tools/l10n.js', - FIREFOX_BUILD_CONTENT_DIR + '/web'] - ], - preprocess: [ - [COMMON_WEB_FILES_PREPROCESS, FIREFOX_BUILD_CONTENT_DIR + '/web'], - [COMMON_FIREFOX_FILES_PREPROCESS, FIREFOX_BUILD_CONTENT_DIR], - [FIREFOX_EXTENSION_DIR + 'bootstrap.js', FIREFOX_BUILD_DIR] - ], - preprocessCSS: [ - ['firefox', 'web/viewer.css', - FIREFOX_BUILD_CONTENT_DIR + '/web/viewer.css'] - ] - }; - builder.build(setup); - - cleanupJSSource(FIREFOX_BUILD_CONTENT_DIR + '/web/viewer.js'); - cleanupJSSource(FIREFOX_BUILD_DIR + 'bootstrap.js'); - cleanupJSSource(FIREFOX_BUILD_CONTENT_DIR + 'PdfjsChromeUtils.jsm'); - cleanupCSSSource(FIREFOX_BUILD_CONTENT_DIR + '/web/viewer.css'); - // Remove '.DS_Store' and other hidden files find(FIREFOX_BUILD_DIR).forEach(function(file) { if (file.match(/^\./)) { @@ -667,77 +425,13 @@ target.firefox = function() { // make mozcentral // target.mozcentral = function() { + execGulp('mozcentral-pre'); + cd(ROOT_DIR); - echo(); - echo('### Building mozilla-central extension'); - var defines = builder.merge(DEFINES, {MOZCENTRAL: true}); var MOZCENTRAL_DIR = BUILD_DIR + 'mozcentral/', MOZCENTRAL_EXTENSION_DIR = MOZCENTRAL_DIR + 'browser/extensions/pdfjs/', - MOZCENTRAL_CONTENT_DIR = MOZCENTRAL_EXTENSION_DIR + 'content/', - MOZCENTRAL_L10N_DIR = MOZCENTRAL_DIR + 'browser/locales/en-US/pdfviewer/', - FIREFOX_CONTENT_DIR = EXTENSION_SRC_DIR + '/firefox/content/', - FIREFOX_EXTENSION_FILES_TO_COPY = - ['*.svg', - '*.png', - '*.manifest', - 'README.mozilla', - '../../LICENSE'], - DEFAULT_LOCALE_FILES = - [LOCALE_SRC_DIR + 'en-US/viewer.properties', - LOCALE_SRC_DIR + 'en-US/chrome.properties'], - FIREFOX_MC_EXCLUDED_FILES = - ['icon.png', - 'icon64.png']; - - execGulp('bundle-mozcentral'); - cd(ROOT_DIR); - - // Clear out everything in the firefox extension build directory - rm('-rf', MOZCENTRAL_DIR); - mkdir('-p', MOZCENTRAL_CONTENT_DIR); - mkdir('-p', MOZCENTRAL_L10N_DIR); - mkdir('-p', MOZCENTRAL_CONTENT_DIR + BUILD_DIR); - mkdir('-p', MOZCENTRAL_CONTENT_DIR + '/web'); - mkdir('-p', MOZCENTRAL_CONTENT_DIR + '/web/cmaps'); - - cp(FIREFOX_CONTENT_DIR + 'PdfJsTelemetry.jsm', MOZCENTRAL_CONTENT_DIR); - - // Copy extension files - cd('extensions/firefox'); - cp('-R', FIREFOX_EXTENSION_FILES_TO_COPY, - ROOT_DIR + MOZCENTRAL_EXTENSION_DIR); - mv('-f', ROOT_DIR + MOZCENTRAL_EXTENSION_DIR + '/chrome-mozcentral.manifest', - ROOT_DIR + MOZCENTRAL_EXTENSION_DIR + '/chrome.manifest'); - cd(ROOT_DIR); - - var setup = { - defines: defines, - copy: [ - [BUILD_TARGETS, MOZCENTRAL_CONTENT_DIR + BUILD_DIR], - [BUILD_DIR + 'viewer.js', MOZCENTRAL_CONTENT_DIR + '/web'], - [COMMON_WEB_FILES, MOZCENTRAL_CONTENT_DIR + '/web'], - ['external/bcmaps/*', MOZCENTRAL_CONTENT_DIR + '/web/cmaps'], - ['extensions/firefox/tools/l10n.js', MOZCENTRAL_CONTENT_DIR + '/web'] - ], - preprocess: [ - [COMMON_WEB_FILES_PREPROCESS, MOZCENTRAL_CONTENT_DIR + '/web'], - [FIREFOX_CONTENT_DIR + 'pdfjschildbootstrap.js', MOZCENTRAL_CONTENT_DIR], - [COMMON_FIREFOX_FILES_PREPROCESS, MOZCENTRAL_CONTENT_DIR], - [FIREFOX_CONTENT_DIR + 'PdfJs.jsm', MOZCENTRAL_CONTENT_DIR] - ], - preprocessCSS: [ - ['mozcentral', - 'web/viewer.css', - MOZCENTRAL_CONTENT_DIR + '/web/viewer.css'] - ] - }; - builder.build(setup); - - cleanupJSSource(MOZCENTRAL_CONTENT_DIR + '/web/viewer.js'); - cleanupJSSource(MOZCENTRAL_CONTENT_DIR + '/PdfJs.jsm'); - cleanupJSSource(MOZCENTRAL_CONTENT_DIR + '/PdfjsChromeUtils.jsm'); - cleanupCSSSource(MOZCENTRAL_CONTENT_DIR + '/web/viewer.css'); + MOZCENTRAL_CONTENT_DIR = MOZCENTRAL_EXTENSION_DIR + 'content/'; // Remove '.DS_Store' and other hidden files find(MOZCENTRAL_DIR).forEach(function(file) { @@ -746,18 +440,6 @@ target.mozcentral = function() { } }); - // Remove excluded files - cd(MOZCENTRAL_EXTENSION_DIR); - FIREFOX_MC_EXCLUDED_FILES.forEach(function(file) { - if (test('-f', file)) { - rm('-r', file); - } - }); - cd(ROOT_DIR); - - // Copy default localization files - cp(DEFAULT_LOCALE_FILES, MOZCENTRAL_L10N_DIR); - // Update the build version number var VERSION = getCurrentVersion(); sed('-i', /PDFJSSCRIPT_VERSION/, VERSION, @@ -779,56 +461,13 @@ target.mozcentral = function() { // make chrome // target.chromium = function() { - target.locale(); + execGulp('chromium-pre'); cd(ROOT_DIR); - echo(); - echo('### Building Chromium extension'); - var defines = builder.merge(DEFINES, {CHROME: true}); var CHROME_BUILD_DIR = BUILD_DIR + '/chromium/', CHROME_BUILD_CONTENT_DIR = CHROME_BUILD_DIR + '/content/'; - execGulp('bundle-chromium'); - cd(ROOT_DIR); - - // Clear out everything in the chrome extension build directory - rm('-Rf', CHROME_BUILD_DIR); - mkdir('-p', CHROME_BUILD_CONTENT_DIR); - mkdir('-p', CHROME_BUILD_CONTENT_DIR + BUILD_DIR); - mkdir('-p', CHROME_BUILD_CONTENT_DIR + '/web'); - - var setup = { - defines: defines, - copy: [ - [BUILD_TARGETS, CHROME_BUILD_CONTENT_DIR + BUILD_DIR], - [BUILD_DIR + 'viewer.js', CHROME_BUILD_CONTENT_DIR + '/web'], - [COMMON_WEB_FILES, CHROME_BUILD_CONTENT_DIR + '/web'], - [['extensions/chromium/*.json', - 'extensions/chromium/*.html', - 'extensions/chromium/*.js', - 'extensions/chromium/*.css', - 'extensions/chromium/icon*.png'], - CHROME_BUILD_DIR], - ['extensions/chromium/pageAction/*.*', CHROME_BUILD_DIR + '/pageAction'], - ['extensions/chromium/options/*.*', CHROME_BUILD_DIR + '/options'], - ['external/webL10n/l10n.js', CHROME_BUILD_CONTENT_DIR + '/web'], - ['external/bcmaps/*', CHROME_BUILD_CONTENT_DIR + '/web/cmaps'], - ['web/locale', CHROME_BUILD_CONTENT_DIR + '/web'] - ], - preprocess: [ - [COMMON_WEB_FILES_PREPROCESS, CHROME_BUILD_CONTENT_DIR + '/web'] - ], - preprocessCSS: [ - ['chrome', 'web/viewer.css', - CHROME_BUILD_CONTENT_DIR + '/web/viewer.css'] - ] - }; - builder.build(setup); - - cleanupJSSource(CHROME_BUILD_CONTENT_DIR + '/web/viewer.js'); - cleanupCSSSource(CHROME_BUILD_CONTENT_DIR + '/web/viewer.css'); - // Update the build version number var VERSION = getCurrentVersion(); sed('-i', /PDFJSSCRIPT_VERSION/, VERSION, @@ -1171,6 +810,3 @@ target.makefile = function () { target.importl10n = function() { execGulp('importl10n'); }; - -exports.stripCommentHeaders = stripCommentHeaders; -exports.builder = builder; diff --git a/package.json b/package.json index 78e5b57f0..96caf5e48 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "eslint": "^3.11.1", "esprima": "^2.7.2", "gulp": "^3.9.1", + "gulp-rename": "^1.2.2", "gulp-util": "^3.0.7", "gulp-zip": "^3.2.0", "jasmine": "^2.5.2",