Pmiazga has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/405062 )

Change subject: WIP: Allow injecting extra styles
......................................................................

WIP: Allow injecting extra styles

Bug: T181680
Change-Id: I88720beba4fc13b8c65daeca5347c851b0c53cc4
---
M config.dev.yaml
A lib/pdf-format.js
M lib/queue.js
M lib/renderer.js
A magic.css
M routes/html2pdf-v1.js
6 files changed, 77 insertions(+), 12 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/services/chromium-render 
refs/changes/62/405062/1

diff --git a/config.dev.yaml b/config.dev.yaml
index e2fae85..17fd4f7 100644
--- a/config.dev.yaml
+++ b/config.dev.yaml
@@ -75,16 +75,28 @@
         query: '{{ default(request.query, {}) }}'
         headers: '{{request.headers}}'
         body: '{{request.body}}'
+      document_options:
+        supported_formats:
+          # Each supported format can override an option from pdf_options 
section (format, landscape, margin, etc)
+          # See 
https://github.com/GoogleChrome/puppeteer/blob/v0.13.0/docs/api.md#pagepdfoptions
 for more options
+          a4:
+            format: 'A4'
+          letter:
+            format: 'Letter'
+          legal:
+            format: 'Legal'
+        supported_styles:
+          # Each supported style points to a MediaWiki Resource loader
+          mobile: 'magic.css' 
#resources/skins.minerva.base.styles/print/styles.less'
       # 
https://github.com/GoogleChrome/puppeteer/blob/v0.13.0/docs/api.md#pagepdfoptions
-      # Explicitly override defaults so that we don't have unexected results
-      # after puppeteer upgrades
+      # Explicitly override defaults so that we don't have unexpected results 
after puppeteer upgrades.
+      # Those are default options which can be overridden by 
document_options.supported_formats.{SELECTED_FORMAT}
       pdf_options:
         scale: 1
         displayHeaderFooter: false
         printBackground: false
         landscape: false
         pageRanges: ''
-        format: 'Letter'
         margin:
           top: '0.5in'
           right: '0.5in'
diff --git a/lib/pdf-format.js b/lib/pdf-format.js
new file mode 100644
index 0000000..9b587cd
--- /dev/null
+++ b/lib/pdf-format.js
@@ -0,0 +1,31 @@
+'use strict';
+
+module.exports = class PDFFormat {
+
+    constructor( config, format, style ) {
+        this._config = config;
+        this._format = format.toLowerCase();
+        this._style = style ? style.toLowerCase() : false;
+    }
+
+    isValid() {
+        const validFormatDefinition = 
this._config.supported_formats.hasOwnProperty(this._format);
+        const validStylesDefinition = this._style ? 
this._config.supported_styles.hasOwnProperty(this._style) : true;
+        return validFormatDefinition && validStylesDefinition;
+    }
+
+    /**
+     * @return {Object} A set of PDF options
+     */
+    getPDFOptions() {
+        return this._config.supported_formats[this._format];
+    }
+
+    /**
+     * @return {String[]} An array of CSS files
+     */
+    getStyles() {
+        return this._style ? 
this._config.supported_styles[this._style].toString() : false;
+    }
+
+};
diff --git a/lib/queue.js b/lib/queue.js
index 5fb4624..164ec14 100644
--- a/lib/queue.js
+++ b/lib/queue.js
@@ -207,9 +207,8 @@
             .articleToPdf(
                 data.uri,
                 this._puppeteerOptions,
-                Object.assign(
-                    {}, this._pdfOptions, { format: data.format }
-                ))
+                this._pdfOptions
+                )
             .then((pdf) => {
                 renderTime = Date.now() - data._timeAtRenderStart;
                 this._logger.log(
diff --git a/lib/renderer.js b/lib/renderer.js
index 1809e78..564baf6 100644
--- a/lib/renderer.js
+++ b/lib/renderer.js
@@ -1,6 +1,7 @@
 'use strict';
 
 const puppeteer = require('puppeteer');
+const BBPromise = require("bluebird");
 
 /**
  * PDF renderer from a URL.
@@ -8,9 +9,10 @@
  * request should create a new instance of the class.
  */
 module.exports = class Renderer {
-    constructor() {
+    constructor( pdfFormat ) {
         this._browser = null;
         this._renderAborted = false;
+        this._pdfFormat = pdfFormat;
     }
 
     /**
@@ -37,6 +39,9 @@
     articleToPdf(url, puppeteerOptions, pdfOptions) {
         let page;
         const that = this;
+        const puppeteerPDFOptions = Object.assign(
+            {}, pdfOptions, this._pdfFormat.getPDFOptions()
+        );
 
         return puppeteer.launch(puppeteerOptions)
             .then((browser) => {
@@ -48,9 +53,18 @@
                 return page.goto(url, { waitUntil: 'networkidle2' });
             })
             .then(() => {
-                return page.pdf(pdfOptions);
+                const customStyles = that._pdfFormat.getStyles();
+                if (customStyles) {
+                    return page.addStyleTag({path: customStyles});
+                } else {
+                    return BBPromise.resolve(page);
+                }
+            })
+            .then(() => {
+                return page.pdf(puppeteerPDFOptions);
             })
             .catch((error) => {
+            console.log(error);
                 // Only thrown an error if we didn't close the browser 
ourselves
                 if (!this._renderAborted) {
                     that._closeBrowser();
diff --git a/magic.css b/magic.css
new file mode 100644
index 0000000..6cd36ff
--- /dev/null
+++ b/magic.css
@@ -0,0 +1,4 @@
+body.mw-body-content {
+    color: red;
+    font-size: 16px;
+}
diff --git a/routes/html2pdf-v1.js b/routes/html2pdf-v1.js
index 4c5b977..e30dfa0 100644
--- a/routes/html2pdf-v1.js
+++ b/routes/html2pdf-v1.js
@@ -4,6 +4,7 @@
 const sUtil = require('../lib/util');
 const uuid = require('cassandra-uuid');
 const Renderer = require('../lib/renderer');
+const PDFFormat = require('../lib/pdf-format');
 
 /**
  * The main router object
@@ -18,7 +19,7 @@
 /**
  * Returns PDF representation of the article
  */
-router.get('/:title/:format(letter|a4)', (req, res) => {
+router.get('/:title/:format/:style?', (req, res) => {
     const restbaseRequest = app.restbase_tpl.expand({
         request: {
             params: {
@@ -28,13 +29,17 @@
         }
     });
 
+    const format = new PDFFormat(app.conf.document_options, req.params.format, 
req.params.style);
+    if (!format.isValid()) {
+        res.status(400).send('Unknown format');
+        return;
+    }
     const id = `${uuid.TimeUuid.now().toString()}|${restbaseRequest.uri}`;
-    const renderer = new Renderer();
+    const renderer = new Renderer(format);
     const data = {
         id,
         renderer,
-        uri: restbaseRequest.uri,
-        format: req.params.format
+        uri: restbaseRequest.uri
     };
     app.queue.push(data, ((error, pdf) => {
         if (error) {

-- 
To view, visit https://gerrit.wikimedia.org/r/405062
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I88720beba4fc13b8c65daeca5347c851b0c53cc4
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/services/chromium-render
Gerrit-Branch: master
Gerrit-Owner: Pmiazga <pmia...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to