Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

A plugin, support export site to a pdf file.[#546] #919

Closed
wants to merge 5 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@
"lint": "eslint --fix packages/**/*.js packages/**/*.vue packages/**/bin/*",
"release": "yarn --pure-lockfile && node scripts/release.js",
"changelog": "node scripts/genChangelog.js run",
"test": "node scripts/test.js"
"test": "node scripts/test.js",
"debug":"lerna exec --scope docs -- yarn debug"
},
"gitHooks": {
"pre-commit": "lint-staged"
Expand Down
2 changes: 2 additions & 0 deletions packages/@vuepress/plugin-export-site/.npmignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
__tests__
__mocks__
3 changes: 3 additions & 0 deletions packages/@vuepress/plugin-export-site/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# @vuepress/plugin-export-site

> export-site plugin for vuepress
57 changes: 57 additions & 0 deletions packages/@vuepress/plugin-export-site/export.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
const puppeteer = require('puppeteer')
const PDFMerge = require('easy-pdf-merge')
const { path, fs, logger } = require('@vuepress/shared-utils')

module.exports = async ({ extension, sourceDir, pages, dest, enabled }) => {
if (!enabled) return
if (extension === 'pdf') {
await exportPDF({ sourceDir, pages, dest })
} else {
logger.warn(`Not support ${extension} format site export!`)
}
}

async function exportPDF ({ sourceDir, pages = [], dest }) {
try {
const paths = pages.map(s => s.path)
const pdfTempDir = path.resolve('./_tempPDF')
fs.ensureDirSync(pdfTempDir)
const browser = await puppeteer.launch()
const page = await browser.newPage()
// port finder
const options = paths.map(path => {
return {
location: `http://localhost:8080${path}`,
path: `${pdfTempDir}/${path.replace(/\//g, '-').replace('-', '').replace(/\.html/, '').replace(/-$/, '')}.pdf`
}
})
const files = options.map(option => path.resolve(option.path))
await downloadPDFs(page, options)
await mergePDF(files, dest)
await browser.close()
fs.removeSync(pdfTempDir)
} catch (e) {
logger.error(e.stack)
}
}

async function downloadPDFs (page, options) {
for (let i = 0; i < options.length; i++) {
const { location, path } = options[i]
await page.goto(location, { waitUntil: 'networkidle2' })
await page.pdf({ path, format: 'A4' })
logger.success(`pdf ${path} generator success`)
}
}

function mergePDF (files, exportFile = 'site') {
return new Promise((resolve, reject) => {
PDFMerge(files, `${exportFile}.pdf`, (err) => {
if (err) {
reject(err)
}
logger.success(`export ${exportFile}.pdf file success!`)
resolve()
})
})
}
17 changes: 17 additions & 0 deletions packages/@vuepress/plugin-export-site/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
const siteExport = require('./export')

module.exports = (options = {}, ctx) => {
return {
async ready () {
setTimeout(() => {
siteExport({
extension: options.extension,
sourceDir: ctx.sourceDir,
pages: ctx.pages,
dest: ctx.outDir,
enabled: !ctx.isProd
}, 0)
})
}
}
}
29 changes: 29 additions & 0 deletions packages/@vuepress/plugin-export-site/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{
"name": "@vuepress/plugin-export-site",
"version": "1.0.0-alpha.8",
"description": "export-site plugin for vuepress",
"main": "index.js",
"publishConfig": {
"access": "public"
},
"repository": {
"type": "git",
"url": "git+https://github.com/vuejs/vuepress.git"
},
"dependencies": {
"easy-pdf-merge": "^0.1.3",
"puppeteer": "^1.7.0"
},
"keywords": [
"documentation",
"vue",
"vuepress",
"generator"
],
"author": "LinFeng1997 <ynublow@gmail.com>",
"license": "MIT",
"bugs": {
"url": "https://github.com/vuejs/vuepress/issues"
},
"homepage": "https://github.com/vuejs/vuepress/packages/@vuepress/plugin-export-site#readme"
}
5 changes: 4 additions & 1 deletion packages/docs/docs/.vuepress/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,10 @@ module.exports = {
},
'@vuepress/plugin-medium-zoom': true,
'@vuepress/notification': true,
'flowchart': true
'flowchart': true,
'@vuepress/export-site': {
extension: 'pdf'
}
},
clientRootMixin: path.resolve(__dirname, 'mixin.js')
}
Expand Down
3 changes: 2 additions & 1 deletion packages/docs/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
"description": "docs of VuePress",
"scripts": {
"dev": "vuepress dev docs --temp .temp",
"build": "vuepress build docs --temp .temp"
"build": "vuepress build docs --temp .temp",
"debug": "node --inspect-brk ../vuepress/vuepress.js dev docs --temp .temp"
},
"repository": {
"type": "git",
Expand Down