// 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('');
element.childNodes().forEach(node => {
convertToPre(node, fragments);
});
fragments.push('');
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 = ['
'];
element.childNodes().forEach(childNode => {
convertToPre(childNode, fragments);
});
fragments.push('
');
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('' + text + '
');
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();