| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- // Licensed to Cloudera, Inc. under one
- // or more contributor license agreements. See the NOTICE file
- // distributed with this work for additional information
- // regarding copyright ownership. Cloudera, Inc. licenses this file
- // to you under the Apache License, Version 2.0 (the
- // "License"); you may not use this file except in compliance
- // with the License. You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
- const program = require('commander');
- const EPub = require('epub');
- const Topic = require('./Topic');
- const libxml = require('libxmljs');
- const extractorUtils = require('./extractorUtils');
- const outputPath = './desktop/core/src/desktop/static/desktop/docs/hive/';
- const mako = './desktop/core/src/desktop/templates/sql_doc_index.mako';
- const jsonHandler = require('./jsonHandler');
- // Handle command line arguments
- program
- .version('1.0')
- .option('-e, --epub [path]', 'the path to the Hive epub file')
- .parse(process.argv);
- const epub = new EPub(program.epub);
- const convertToPre = (element, fragments) => {
- switch (element.name()) {
- case 'div':
- element.childNodes().forEach(node => {
- convertToPre(node, fragments);
- });
- break;
- case 'text':
- if (fragments.length === 1) {
- fragments.push(element.text().replace(/^\n/, ''));
- } else {
- fragments.push(element.text());
- }
- break;
- case 'code':
- if (
- element.attr('class') &&
- element
- .attr('class')
- .value()
- .indexOf('value') !== -1
- ) {
- fragments.push('<span class="hue-doc-varname">');
- element.childNodes().forEach(node => {
- convertToPre(node, fragments);
- });
- fragments.push('</span>');
- break;
- }
- default:
- element.childNodes().forEach(node => {
- convertToPre(node, fragments);
- });
- }
- };
- const adaptElement = element => {
- if (
- element.attr('class') &&
- element
- .attr('class')
- .value()
- .indexOf('syntaxhighlighter') !== -1
- ) {
- const fragments = ['<div class="hue-doc-codeblock">'];
- element.childNodes().forEach(childNode => {
- convertToPre(childNode, fragments);
- });
- fragments.push('</div>');
- const replacement = fragments.join('');
- element.replace(libxml.parseHtmlFragment(replacement).root());
- } else if (element.attr('class')) {
- element.attr('class').remove();
- }
- switch (element.name()) {
- case 'a':
- if (element.attr('href') && element.attr('href').value().indexOf('/links') == 0) {
- // Internal link
- let ref = element.attr('href').value().replace(/\/links\/_[0-9]+\//, '');
- extractorUtils.removeAllAttributes(element);
- const anchorMatch = ref.match(/.html#(.+)$/);
- if (anchorMatch) {
- element.attr('data-doc-anchor-id', anchorMatch[1]);
- ref = ref.replace('#' + anchorMatch[1], '');
- }
- ref = '_' + ref.replace('.html', '');
- element.attr({
- class: 'hue-doc-internal-link',
- href: 'javascript:void(0);',
- 'data-doc-ref': ref
- });
- } else if (element.attr('href')) {
- // External link
- const href = element.attr('href').value();
- extractorUtils.removeAllAttributes(element);
- element.attr({class: 'hue-doc-external-link', href: href, target: '_blank'});
- }
- break;
- default:
- }
- element.childNodes().forEach(adaptElement);
- };
- epub.on('end', () => {
- const rootTopics = [];
- const lastTopicPerLevel = {};
- const promises = [];
- epub.flow.forEach(chapter => {
- promises.push(
- new Promise((resolve, reject) => {
- const topic = new Topic('/', chapter.id);
- topic.fragment = {
- title: {
- text: () => chapter.title.replace(/LanguageManual\s(.+)/, '$1')
- }
- };
- epub.getChapter(chapter.id, (error, text) => {
- try {
- const contents = libxml.parseHtmlFragment('<div>' + text + '</div>');
- topic.domXml = contents.root();
- adaptElement(topic.domXml);
- resolve();
- } catch (error) {
- reject();
- }
- });
- if (lastTopicPerLevel[chapter.level - 1]) {
- lastTopicPerLevel[chapter.level - 1].children.push(topic);
- }
- if (chapter.level === 0) {
- rootTopics.push(topic);
- }
- lastTopicPerLevel[chapter.level] = topic;
- })
- );
- });
- Promise.all(promises).then(() => {
- const rootTopic = rootTopics[0];
- rootTopic.children.forEach(childTopic => {
- rootTopics.push(childTopic);
- });
- rootTopic.children = [];
- jsonHandler
- .saveTopics(rootTopics, outputPath, mako, false)
- .then(() => {
- console.log('Done.');
- })
- .catch(() => {
- console.log('Fail.');
- });
- });
- });
- epub.parse();
|