jsdoc: generate modules for sensor groups; customize yuidoc templates for displaying sensor groups by categories & connection types

Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
This commit is contained in:
Heidi Pan 2015-05-21 10:09:48 -07:00 committed by Mihai Tudor Panu
parent ed52f0e5cb
commit 33b508110e
14 changed files with 2150 additions and 116 deletions

View File

@ -111,8 +111,8 @@ if (BUILDDOC)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/doxy/node/${JSDOC_FILE} ${CMAKE_CURRENT_BINARY_DIR}/${JSDOC_FILE} COPYONLY)
endforeach()
add_custom_target(jsdoc
NODE_PATH=${NODE_PATH} ${NODE_EXECUTABLE} docgen -m upm -i xml
COMMAND ${YUIDOC_EXECUTABLE} -C --no-sort --config generators/yuidoc/conf.json -o html/node jsdoc/yuidoc/upm
NODE_PATH=${NODE_PATH} ${NODE_EXECUTABLE} docgen -m upm -i xml -t ${CMAKE_CURRENT_SOURCE_DIR}/src -g ../../../../docs/images/
COMMAND ${YUIDOC_EXECUTABLE} -C --no-sort --helpers generators/yuidoc/helper.js --themedir generators/yuidoc/tmpl -o html/node jsdoc/yuidoc/upm
COMMAND NODE_PATH=${NODE_PATH} ${NODE_EXECUTABLE} tolower -i html/node
DEPENDS doc
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}

View File

@ -35,7 +35,7 @@ var xml2js = require('./xml2js')
_.extend(opts, { addOptions: function(module) { return module.addOptions(opts); } });
opts
.option('-m, --module [module]', 'module name for which to build documentation', 'mraa')
.option('-f, --formats [formats]', 'format for js comments', 'jsdoc,yuidoc,ternjs')
.option('-f, --formats [formats]', 'format for js comments', 'yuidoc,ternjs')
.option('-o, --outdir [directory]', 'top directory to build documentation', __dirname + '/jsdoc')
.addOptions(xml2js)
.parse(process.argv);
@ -44,12 +44,14 @@ opts
// use promise-style programming rather than spaghetti callbacks
Promise.promisifyAll(fs);
// TODO: create directory structure if doesn't exist
var formats = opts.formats.split(',');
formats.forEach(function(format){
mkdirp('jsdoc/' + format + '/' + opts.module);
});
// main
xml2js.parse().then(function(specjs) {
Promise.all(_.map(formats, function(format) {

View File

@ -28,7 +28,7 @@ var _ = require('lodash');
// generate YuiDocs-style documentation
function generateDocs(specjs) {
var docs = GENERATE_MODULE(specjs.MODULE);
var docs = GENERATE_MODULE(specjs.MODULE, '');
GENERATE_TYPE = (function(enums) {
return function(type) {
return (_.contains(enums, type) ? ('Enum ' + type) : type);
@ -40,24 +40,25 @@ function generateDocs(specjs) {
docs = _.reduce(specjs.ENUMS, function(memo, enumSpec, enumName) {
return memo += GENERATE_ENUM(enumName, enumSpec);
}, docs);
docs = _.reduce(specjs.CLASSES, function(memo, classSpec, parentClass) {
return memo
+ GENERATE_CLASS(parentClass, classSpec.description)
+ _.reduce(classSpec.methods, function(memo, methodSpec, methodName) {
return memo += GENERATE_METHOD(methodName, methodSpec, parentClass);
}, '')
+ _.reduce(classSpec.variables, function(memo, variableSpec, variableName) {
return memo += GENERATE_VAR(variableName, variableSpec, parentClass);
}, '')
+ _.reduce(classSpec.enums, function(memo, enumSpec, enumName) {
return memo += GENERATE_ENUM(enumName, enumSpec, parentClass);
}, '');
}, docs);
if (_.isEmpty(specjs.CLASSGROUPS)) {
docs += GENERATE_CLASSES(specjs.CLASSES);
} else {
docs += GENERATE_MODULE('common', '');
var grouped = _.flatten(_.pluck(_.values(specjs.CLASSGROUPS), 'classes'));
var ungrouped = _.difference(_.keys(specjs.CLASSES), grouped);
docs += GENERATE_CLASSES(_.pick(specjs.CLASSES, ungrouped), 'common');
_.each(specjs.CLASSGROUPS, function(groupSpec, groupName) {
docs += GENERATE_CLASSES(_.pick(specjs.CLASSES, groupSpec.classes), groupName);
});
// TODO: figure out why yuidoc won't associate the class with the right module if module definitions are interspersed
_.each(specjs.CLASSGROUPS, function(groupSpec, groupName) {
docs += GENERATE_MODULE(groupName, groupSpec.description);
});
}
return docs;
}
// comment wrapper around entire spec
function GENERATE_DOC(text) {
return '/**\n' + text + ' */\n';
@ -65,15 +66,35 @@ function GENERATE_DOC(text) {
// generate module spec
function GENERATE_MODULE(module) {
return GENERATE_DOC('@module ' + module + '\n');
function GENERATE_MODULE(name, description) {
return GENERATE_DOC(description + '\n'
+ '@module ' + name + '\n');
}
// generate spec for the given list of classes
function GENERATE_CLASSES(classes, parent) {
return _.reduce(classes, function(memo, classSpec, className) {
return memo
+ GENERATE_CLASS(className, classSpec.description, parent)
+ _.reduce(classSpec.methods, function(memo, methodSpec, methodName) {
return memo += GENERATE_METHOD(methodName, methodSpec, className);
}, '')
+ _.reduce(classSpec.variables, function(memo, variableSpec, variableName) {
return memo += GENERATE_VAR(variableName, variableSpec, className);
}, '')
+ _.reduce(classSpec.enums, function(memo, enumSpec, enumName) {
return memo += GENERATE_ENUM(enumName, enumSpec, className);
}, '');
}, '');
}
// generate class spec
function GENERATE_CLASS(name, description) {
function GENERATE_CLASS(name, description, parent) {
return GENERATE_DOC(description + '\n'
+ '@class ' + name + '\n');
+ '@class ' + name + '\n'
+ (parent ? ('@module ' + parent + '\n') : ''));
}

196
doxy/node/generators/yuidoc/helper.js vendored Normal file
View File

@ -0,0 +1,196 @@
/*
* Author: Heidi Pan <heidi.pan@intel.com>
* Copyright (c) 2015 Intel Corporation.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
// extract the field from the class description text
function getField(classDescription, field) {
var pattern = new RegExp('\\+ __' + field + ':__ [A-Za-z0-9]*');
var label = new RegExp('\\+ __' + field + ':__');
if (classDescription) {
var matched = classDescription.match(pattern);
if (matched) {
return (matched[0].replace(label, '')).trim();
}
}
return 'other';
}
// generate html to group modules by the given field (e.g. category/connection type) of its children classes
function listByGroup(modules, classes, field, projectRoot) {
var moduleClasses = {};
var modulesByGroup = {};
var i, j;
for (i = 0; i < modules.length; i++) {
moduleClasses[modules[i].name] = [];
}
for (i = 0; i < classes.length; i++) {
moduleClasses[classes[i].module].push(i);
}
for (var module in moduleClasses) {
var classIndices = moduleClasses[module];
var groups = [];
for (i = 0; i < classIndices.length; i++) {
groups.push(getField(classes[classIndices[i]].description, field));
}
if (groups.length != 0) {
var group = groups[0];
var sanitychecked = true;
for (i = 1; i < groups.length; i++) {
if (groups[i] != group) {
sanitychecked = false;
break;
}
}
if (!sanitychecked) {
// TODO
}
if (group in modulesByGroup) {
modulesByGroup[group].push(module);
} else {
modulesByGroup[group] = [module];
}
}
}
var groups = Object.keys(modulesByGroup).sort();
var html = '';
var pfx = projectRoot + 'modules/';
var first = true;
for (i = 0; i < groups.length; i++) {
var group = groups[i];
html += (first ? '' : '</span>');
html += '<div class="upmGroup"><div class="right-arrow"></div>' + group + '</div><span class="upmModules" style="display:none">';
var moduleNames = modulesByGroup[group];
for (j = 0; j < moduleNames.length; j++) {
var moduleName = moduleNames[j];
html += '<a href="' + pfx + moduleName + '.html">' + moduleName + '</a>';
}
first = false;
}
return html;
}
// click handler to change direction of arrow and toggle visibility of grouped modules
var onClickHandler = "Y.on('domready', function() { \
Y.on('click', function(e) { \
var classes = this.next('.upmModules').toggleView(); \
if (classes.getStyle('display') == 'none') { \
this.one('> div').removeClass('down-arrow').addClass('right-arrow'); \
} else { \
this.one('> div').removeClass('right-arrow').addClass('down-arrow'); \
} \
}, '.upmGroup'); \
});";
// css to generate triangle icons
var insertStyles = "Y.one(document.head).append('<style> \
div.right-arrow { \
width: 0; \
height: 0; \
border-bottom: 5px solid transparent; \
border-top: 5px solid transparent; \
border-left: 5px solid #356de4; \
font-size: 0; \
margin-right: 5px; \
vertical-align: 5px; \
display: inline; \
} \
div.down-arrow { \
width: 0; \
height: 0; \
border-left: 5px solid transparent; \
border-right: 5px solid transparent; \
border-top: 5px solid #356de4; \
font-size: 0; \
margin-right: 5px; \
display: inline; \
} \
div.upmGroup { \
font-weight: bold; \
} \
</style>');";
var scripts = "YUI().use('node', 'event', function (Y) {"
+ onClickHandler
+ insertStyles
+ "});";
module.exports = {
listByCategory: function() {
return listByGroup(this.modules, this.classes, 'Category', this.projectRoot);
},
listByManufacturer: function() {
return listByGroup(this.modules, this.classes, 'Manufacturer', this.projectRoot);
},
listByConnection: function() {
return listByGroup(this.modules, this.classes, 'Connection', this.projectRoot);
},
javascripts: function(options) {
return '<script type="text/javascript">' + scripts + '</script>';
},
// generate custom cross links
// assume lowercase script will be run, so generate class links with lower case
customCrossLinks: function() {
var selector = 'script[type="class-metadata"]'
var html = "<script type='text/javascript'> \
var find = function(ar, elem) { \
for (var i = 0; i < ar.length; i++) { \
if (ar[i] == elem) { \
return true; \
} \
} \
return false; \
}; \
YUI().use('node', 'event', function (Y) { \
Y.on('domready', function() { \
var classes = Y.all('" + selector + "').getHTML(); \
for (var i = 0; i < classes.length; i++) { \
classes[i] = classes[i].toLowerCase(); \
} \
Y.all('span.type').each(function(node) { \
var t = node.getHTML(); \
if (find(classes, t.toLowerCase())) { \
node.setHTML('<a href=' + t.toLowerCase() + '.html>' + t + '</a>'); \
} \
}); \
}); \
}); \
</script>";
for (var i = 0; i < this.classes.length; i++) {
html += "<script type='class-metadata'>" + this.classes[i].name + "</script>";
}
return html;
}
};

View File

@ -0,0 +1,27 @@
Original Work Copyright 2011 Yahoo! Inc.
All rights reserved.
Modified Work Copyright (c) 2015 Intel Corporation.
Author: Heidi Pan <heidi.pan@intel.com>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the Yahoo! Inc. nor the
names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL YAHOO! INC. BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@ -0,0 +1,789 @@
/*
Font sizes for all selectors other than the body are given in percentages,
with 100% equal to 13px. To calculate a font size percentage, multiply the
desired size in pixels by 7.6923076923.
Here's a quick lookup table:
10px - 76.923%
11px - 84.615%
12px - 92.308%
13px - 100%
14px - 107.692%
15px - 115.385%
16px - 123.077%
17px - 130.769%
18px - 138.462%
19px - 146.154%
20px - 153.846%
*/
html {
background: #fff;
color: #333;
overflow-y: scroll;
}
body {
/*font: 13px/1.4 'Lucida Grande', 'Lucida Sans Unicode', 'DejaVu Sans', 'Bitstream Vera Sans', 'Helvetica', 'Arial', sans-serif;*/
font: 13px/1.4 'Helvetica', 'Arial', sans-serif;
margin: 0;
padding: 0;
}
/* -- Links ----------------------------------------------------------------- */
a {
color: #356de4;
text-decoration: none;
}
.hidden {
display: none;
}
a:hover { text-decoration: underline; }
/* "Jump to Table of Contents" link is shown to assistive tools, but hidden from
sight until it's focused. */
.jump {
position: absolute;
padding: 3px 6px;
left: -99999px;
top: 0;
}
.jump:focus { left: 40%; }
/* -- Paragraphs ------------------------------------------------------------ */
p { margin: 1.3em 0; }
dd p, td p { margin-bottom: 0; }
dd p:first-child, td p:first-child { margin-top: 0; }
/* -- Headings -------------------------------------------------------------- */
h1, h2, h3, h4, h5, h6 {
color: #D98527;/*was #f80*/
font-family: 'Trebuchet MS', sans-serif;
font-weight: bold;
line-height: 1.1;
margin: 1.1em 0 0.5em;
}
h1 {
font-size: 184.6%;
color: #30418C;
margin: 0.75em 0 0.5em;
}
h2 {
font-size: 153.846%;
color: #E48A2B;
}
h3 { font-size: 138.462%; }
h4 {
border-bottom: 1px solid #DBDFEA;
color: #E48A2B;
font-size: 115.385%;
font-weight: normal;
padding-bottom: 2px;
}
h5, h6 { font-size: 107.692%; }
/* -- Code and examples ----------------------------------------------------- */
code, kbd, pre, samp {
font-family: Menlo, Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace;
font-size: 92.308%;
line-height: 1.35;
}
p code, p kbd, p samp, li code {
background: #FCFBFA;
border: 1px solid #EFEEED;
padding: 0 3px;
}
a code, a kbd, a samp,
pre code, pre kbd, pre samp,
table code, table kbd, table samp,
.intro code, .intro kbd, .intro samp,
.toc code, .toc kbd, .toc samp {
background: none;
border: none;
padding: 0;
}
pre.code, pre.terminal, pre.cmd {
overflow-x: auto;
*overflow-x: scroll;
padding: 0.3em 0.6em;
}
pre.code {
background: #FCFBFA;
border: 1px solid #EFEEED;
border-left-width: 5px;
}
pre.terminal, pre.cmd {
background: #F0EFFC;
border: 1px solid #D0CBFB;
border-left: 5px solid #D0CBFB;
}
/* Don't reduce the font size of <code>/<kbd>/<samp> elements inside <pre>
blocks. */
pre code, pre kbd, pre samp { font-size: 100%; }
/* Used to denote text that shouldn't be selectable, such as line numbers or
shell prompts. Guess which browser this doesn't work in. */
.noselect {
-moz-user-select: -moz-none;
-khtml-user-select: none;
-webkit-user-select: none;
-o-user-select: none;
user-select: none;
}
/* -- Lists ----------------------------------------------------------------- */
dd { margin: 0.2em 0 0.7em 1em; }
dl { margin: 1em 0; }
dt { font-weight: bold; }
/* -- Tables ---------------------------------------------------------------- */
caption, th { text-align: left; }
table {
border-collapse: collapse;
width: 100%;
}
td, th {
border: 1px solid #fff;
padding: 5px 12px;
vertical-align: top;
}
td { background: #E6E9F5; }
td dl { margin: 0; }
td dl dl { margin: 1em 0; }
td pre:first-child { margin-top: 0; }
th {
background: #D2D7E6;/*#97A0BF*/
border-bottom: none;
border-top: none;
color: #000;/*#FFF1D5*/
font-family: 'Trebuchet MS', sans-serif;
font-weight: bold;
line-height: 1.3;
white-space: nowrap;
}
/* -- Layout and Content ---------------------------------------------------- */
#doc {
margin: auto;
min-width: 1024px;
}
.content { padding: 0 20px 0 25px; }
.sidebar {
padding: 0 15px 0 10px;
}
#bd {
padding: 7px 0 130px;
position: relative;
width: 99%;
}
/* -- Table of Contents ----------------------------------------------------- */
/* The #toc id refers to the single global table of contents, while the .toc
class refers to generic TOC lists that could be used throughout the page. */
.toc code, .toc kbd, .toc samp { font-size: 100%; }
.toc li { font-weight: bold; }
.toc li li { font-weight: normal; }
/* -- Intro and Example Boxes ----------------------------------------------- */
/*
.intro, .example { margin-bottom: 2em; }
.example {
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
border-radius: 4px;
-moz-box-shadow: 0 0 5px #bfbfbf;
-webkit-box-shadow: 0 0 5px #bfbfbf;
box-shadow: 0 0 5px #bfbfbf;
padding: 1em;
}
.intro {
background: none repeat scroll 0 0 #F0F1F8; border: 1px solid #D4D8EB; padding: 0 1em;
}
*/
/* -- Other Styles ---------------------------------------------------------- */
/* These are probably YUI-specific, and should be moved out of Selleck's default
theme. */
.button {
border: 1px solid #dadada;
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
border-radius: 3px;
color: #444;
display: inline-block;
font-family: Helvetica, Arial, sans-serif;
font-size: 92.308%;
font-weight: bold;
padding: 4px 13px 3px;
-moz-text-shadow: 1px 1px 0 #fff;
-webkit-text-shadow: 1px 1px 0 #fff;
text-shadow: 1px 1px 0 #fff;
white-space: nowrap;
background: #EFEFEF; /* old browsers */
background: -moz-linear-gradient(top, #f5f5f5 0%, #efefef 50%, #e5e5e5 51%, #dfdfdf 100%); /* firefox */
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f5f5f5), color-stop(50%,#efefef), color-stop(51%,#e5e5e5), color-stop(100%,#dfdfdf)); /* webkit */
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#dfdfdf',GradientType=0 ); /* ie */
}
.button:hover {
border-color: #466899;
color: #fff;
text-decoration: none;
-moz-text-shadow: 1px 1px 0 #222;
-webkit-text-shadow: 1px 1px 0 #222;
text-shadow: 1px 1px 0 #222;
background: #6396D8; /* old browsers */
background: -moz-linear-gradient(top, #6396D8 0%, #5A83BC 50%, #547AB7 51%, #466899 100%); /* firefox */
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#6396D8), color-stop(50%,#5A83BC), color-stop(51%,#547AB7), color-stop(100%,#466899)); /* webkit */
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#6396D8', endColorstr='#466899',GradientType=0 ); /* ie */
}
.newwindow { text-align: center; }
.header .version em {
display: block;
text-align: right;
}
#classdocs .item {
border-bottom: 1px solid #466899;
margin: 1em 0;
padding: 1.5em;
}
#classdocs .item .params p,
#classdocs .item .returns p,{
display: inline;
}
#classdocs .item em code, #classdocs .item em.comment {
color: green;
}
#classdocs .item em.comment a {
color: green;
text-decoration: underline;
}
#classdocs .foundat {
font-size: 11px;
font-style: normal;
}
.attrs .emits {
margin-left: 2em;
padding: .5em;
border-left: 1px dashed #ccc;
}
abbr {
border-bottom: 1px dashed #ccc;
font-size: 80%;
cursor: help;
}
.prettyprint li.L0,
.prettyprint li.L1,
.prettyprint li.L2,
.prettyprint li.L3,
.prettyprint li.L5,
.prettyprint li.L6,
.prettyprint li.L7,
.prettyprint li.L8 {
list-style: decimal;
}
ul li p {
margin-top: 0;
}
.method .name {
font-size: 110%;
}
.apidocs .methods .extends .method,
.apidocs .properties .extends .property,
.apidocs .attrs .extends .attr,
.apidocs .events .extends .event {
font-weight: bold;
}
.apidocs .methods .extends .inherited,
.apidocs .properties .extends .inherited,
.apidocs .attrs .extends .inherited,
.apidocs .events .extends .inherited {
font-weight: normal;
}
#hd {
background: whiteSmoke;
background: -moz-linear-gradient(top,#DCDBD9 0,#F6F5F3 100%);
background: -webkit-gradient(linear,left top,left bottom,color-stop(0%,#DCDBD9),color-stop(100%,#F6F5F3));
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#dcdbd9',endColorstr='#F6F5F3',GradientType=0);
border-bottom: 1px solid #DFDFDF;
padding: 0 15px 1px 20px;
margin-bottom: 15px;
}
#hd img {
margin-right: 10px;
vertical-align: middle;
}
img {
max-height: 300px;
}
/* -- API Docs CSS ---------------------------------------------------------- */
/*
This file is organized so that more generic styles are nearer the top, and more
specific styles are nearer the bottom of the file. This allows us to take full
advantage of the cascade to avoid redundant style rules. Please respect this
convention when making changes.
*/
/* -- Generic TabView styles ------------------------------------------------ */
/*
These styles apply to all API doc tabviews. To change styles only for a
specific tabview, see the other sections below.
*/
.yui3-js-enabled .apidocs .tabview {
visibility: hidden; /* Hide until the TabView finishes rendering. */
_visibility: visible;
}
.apidocs .tabview.yui3-tabview-content { visibility: visible; }
.apidocs .tabview .yui3-tabview-panel { background: #fff; }
/* -- Generic Content Styles ------------------------------------------------ */
/* Headings */
h2, h3, h4, h5, h6 {
border: none;
color: #30418C;
font-weight: bold;
text-decoration: none;
}
.link-docs {
float: right;
font-size: 15px;
margin: 4px 4px 6px;
padding: 6px 30px 5px;
}
.apidocs { zoom: 1; }
/* Generic box styles. */
.apidocs .box {
border: 1px solid;
border-radius: 3px;
margin: 1em 0;
padding: 0 1em;
}
/* A flag is a compact, capsule-like indicator of some kind. It's used to
indicate private and protected items, item return types, etc. in an
attractive and unobtrusive way. */
.apidocs .flag {
background: #bababa;
border-radius: 3px;
color: #fff;
font-size: 11px;
margin: 0 0.5em;
padding: 2px 4px 1px;
}
/* Class/module metadata such as "Uses", "Extends", "Defined in", etc. */
.apidocs .meta {
background: #f9f9f9;
border-color: #efefef;
color: #555;
font-size: 11px;
padding: 3px 6px;
}
.apidocs .meta p { margin: 0; }
/* Deprecation warning. */
.apidocs .box.deprecated,
.apidocs .flag.deprecated {
background: #fdac9f;
border: 1px solid #fd7775;
}
.apidocs .box.deprecated p { margin: 0.5em 0; }
.apidocs .flag.deprecated { color: #333; }
/* Module/Class intro description. */
.apidocs .intro {
background: #f0f1f8;
border-color: #d4d8eb;
}
/* Loading spinners. */
#bd.loading .apidocs,
#api-list.loading .yui3-tabview-panel {
background: #fff url(../img/spinner.gif) no-repeat center 70px;
min-height: 150px;
}
#bd.loading .apidocs .content,
#api-list.loading .yui3-tabview-panel .apis {
display: none;
}
.apidocs .no-visible-items { color: #666; }
/* Generic inline list. */
.apidocs ul.inline {
display: inline;
list-style: none;
margin: 0;
padding: 0;
}
.apidocs ul.inline li { display: inline; }
/* Comma-separated list. */
.apidocs ul.commas li:after { content: ','; }
.apidocs ul.commas li:last-child:after { content: ''; }
/* Keyboard shortcuts. */
kbd .cmd { font-family: Monaco, Helvetica; }
/* -- Generic Access Level styles ------------------------------------------- */
.apidocs .item.protected,
.apidocs .item.private,
.apidocs .index-item.protected,
.apidocs .index-item.deprecated,
.apidocs .index-item.private {
display: none;
}
.show-deprecated .item.deprecated,
.show-deprecated .index-item.deprecated,
.show-protected .item.protected,
.show-protected .index-item.protected,
.show-private .item.private,
.show-private .index-item.private {
display: block;
}
.hide-inherited .item.inherited,
.hide-inherited .index-item.inherited {
display: none;
}
/* -- Generic Item Index styles --------------------------------------------- */
.apidocs .index { margin: 1.5em 0 3em; }
.apidocs .index h3 {
border-bottom: 1px solid #efefef;
color: #333;
font-size: 13px;
margin: 2em 0 0.6em;
padding-bottom: 2px;
}
.apidocs .index .no-visible-items { margin-top: 2em; }
.apidocs .index-list {
border-color: #efefef;
font-size: 12px;
list-style: none;
margin: 0;
padding: 0;
-moz-column-count: 4;
-moz-column-gap: 10px;
-moz-column-width: 170px;
-ms-column-count: 4;
-ms-column-gap: 10px;
-ms-column-width: 170px;
-o-column-count: 4;
-o-column-gap: 10px;
-o-column-width: 170px;
-webkit-column-count: 4;
-webkit-column-gap: 10px;
-webkit-column-width: 170px;
column-count: 4;
column-gap: 10px;
column-width: 170px;
}
.apidocs .no-columns .index-list {
-moz-column-count: 1;
-ms-column-count: 1;
-o-column-count: 1;
-webkit-column-count: 1;
column-count: 1;
}
.apidocs .index-item { white-space: nowrap; }
.apidocs .index-item .flag {
background: none;
border: none;
color: #afafaf;
display: inline;
margin: 0 0 0 0.2em;
padding: 0;
}
/* -- Generic API item styles ----------------------------------------------- */
.apidocs .args {
display: inline;
margin: 0 0.5em;
}
.apidocs .flag.chainable { background: #46ca3b; }
.apidocs .flag.protected { background: #9b86fc; }
.apidocs .flag.private { background: #fd6b1b; }
.apidocs .flag.async { background: #356de4; }
.apidocs .flag.required { background: #e60923; }
.apidocs .item {
border-bottom: 1px solid #efefef;
margin: 1.5em 0 2em;
padding-bottom: 2em;
}
.apidocs .item h4,
.apidocs .item h5,
.apidocs .item h6 {
color: #333;
font-family: inherit;
font-size: 100%;
}
.apidocs .item .description p,
.apidocs .item pre.code {
margin: 1em 0 0;
}
.apidocs .item .meta {
background: none;
border: none;
padding: 0;
}
.apidocs .item .name {
display: inline;
font-size: 14px;
}
.apidocs .item .type,
.apidocs .item .type a,
.apidocs .returns-inline {
color: #555;
}
.apidocs .item .type,
.apidocs .returns-inline {
font-size: 11px;
margin: 0 0 0 0;
}
.apidocs .item .type a { border-bottom: 1px dotted #afafaf; }
.apidocs .item .type a:hover { border: none; }
/* -- Item Parameter List --------------------------------------------------- */
.apidocs .params-list {
list-style: square;
margin: 1em 0 0 2em;
padding: 0;
}
.apidocs .param { margin-bottom: 1em; }
.apidocs .param .type,
.apidocs .param .type a {
color: #666;
}
.apidocs .param .type {
margin: 0 0 0 0.5em;
*margin-left: 0.5em;
}
.apidocs .param-name { font-weight: bold; }
/* -- Item "Emits" block ---------------------------------------------------- */
.apidocs .item .emits {
background: #f9f9f9;
border-color: #eaeaea;
}
/* -- Item "Returns" block -------------------------------------------------- */
.apidocs .item .returns .type,
.apidocs .item .returns .type a {
font-size: 100%;
margin: 0;
}
/* -- Class Constructor block ----------------------------------------------- */
.apidocs .constructor .item {
border: none;
padding-bottom: 0;
}
/* -- File Source View ------------------------------------------------------ */
.apidocs .file pre.code,
#doc .apidocs .file pre.prettyprint {
background: inherit;
border: none;
overflow: visible;
padding: 0;
}
.apidocs .L0,
.apidocs .L1,
.apidocs .L2,
.apidocs .L3,
.apidocs .L4,
.apidocs .L5,
.apidocs .L6,
.apidocs .L7,
.apidocs .L8,
.apidocs .L9 {
background: inherit;
}
/* -- Submodule List -------------------------------------------------------- */
.apidocs .module-submodule-description {
font-size: 12px;
margin: 0.3em 0 1em;
}
.apidocs .module-submodule-description p:first-child { margin-top: 0; }
/* -- Sidebar TabView ------------------------------------------------------- */
#api-tabview { margin-top: 0.6em; }
#api-tabview-filter,
#api-tabview-panel {
border: 1px solid #dfdfdf;
}
#api-tabview-filter {
border-bottom: none;
border-top: none;
padding: 0.6em 10px 0 10px;
}
#api-tabview-panel { border-top: none; }
#api-filter { width: 97%; }
/* -- Content TabView ------------------------------------------------------- */
#classdocs .yui3-tabview-panel { border: none; }
/* -- Source File Contents -------------------------------------------------- */
.prettyprint li.L0,
.prettyprint li.L1,
.prettyprint li.L2,
.prettyprint li.L3,
.prettyprint li.L5,
.prettyprint li.L6,
.prettyprint li.L7,
.prettyprint li.L8 {
list-style: decimal;
}
/* -- API options ----------------------------------------------------------- */
#api-options {
font-size: 11px;
margin-top: 2.2em;
position: absolute;
right: 1.5em;
}
/*#api-options label { margin-right: 0.6em; }*/
/* -- API list -------------------------------------------------------------- */
#api-list {
margin-top: 1.5em;
*zoom: 1;
}
.apis {
font-size: 12px;
line-height: 1.4;
list-style: none;
margin: 0;
padding: 0.5em 0 0.5em 0.4em;
}
.apis a {
border: 1px solid transparent;
display: block;
margin: 0 0 0 -4px;
padding: 1px 4px 0;
text-decoration: none;
_border: none;
_display: inline;
}
.apis a:hover,
.apis a:focus {
background: #E8EDFC;
background: -moz-linear-gradient(top, #e8edfc 0%, #becef7 100%);
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#E8EDFC), color-stop(100%,#BECEF7));
border-color: #AAC0FA;
border-radius: 3px;
color: #333;
outline: none;
}
.api-list-item a:hover,
.api-list-item a:focus {
font-weight: bold;
text-shadow: 1px 1px 1px #fff;
}
.apis .message { color: #888; }
.apis .result a { padding: 3px 5px 2px; }
.apis .result .type {
right: 4px;
top: 7px;
}
.api-list-item .yui3-highlight {
font-weight: bold;
}

View File

@ -0,0 +1,51 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>{{htmlTitle}}</title>
<link rel="stylesheet" href="{{yuiGridsUrl}}">
<link rel="stylesheet" href="{{projectAssets}}/vendor/prettify/prettify-min.css">
<link rel="stylesheet" href="{{projectAssets}}/css/main.css" id="site_styles">
<link rel="icon" href="{{projectAssets}}/favicon.ico">
<script src="{{yuiSeedUrl}}"></script>
</head>
<body class="yui3-skin-sam">
<div id="doc">
<div id="hd" class="yui3-g header">
<div class="yui3-u-3-4">
<h1>UPM</h1>
<p>
The UPM API is a high level sensor library for IoT devices using MRAA. See examples <a href="https://github.com/intel-iot-devkit/upm/tree/master/examples/javascript">here</a>.
</p>
</div>
</div>
<div id="bd" class="yui3-g">
<div class="yui3-u-1-4">
<div id="docs-sidebar" class="sidebar apidocs">
{{>sidebar}}
</div>
</div>
<div class="yui3-u-3-4">
{{>options}}
<div class="apidocs">
<div id="docs-main">
<div class="content">
{{>layout_content}}
</div>
</div>
</div>
</div>
</div>
</div>
<script src="{{projectAssets}}/vendor/prettify/prettify-min.js"></script>
<script>prettyPrint();</script>
<script src="{{projectAssets}}/js/yui-prettify.js"></script>
<script src="{{projectAssets}}/../api.js"></script>
<script src="{{projectAssets}}/js/api-filter.js"></script>
<script src="{{projectAssets}}/js/api-list.js"></script>
<script src="{{projectAssets}}/js/api-search.js"></script>
<script src="{{projectAssets}}/js/apidocs.js"></script>
</body>
</html>

View File

@ -0,0 +1,205 @@
<h1>{{name}} Class</h1>
<div class="box meta">
{{#if uses}}
<div class="uses">
Uses
<ul class="inline commas">
{{#uses}}
<li><a href="{{.}}.html">{{.}}</a></li>
{{/uses}}
</ul>
</div>
{{/if}}
{{#if extends}}
<div class="extends">
Extends {{#crossLink extends}}{{/crossLink}}
</div>
{{/if}}
{{#if foundAt}}
<div class="foundat">
Defined in: <a href="{{foundAt}}">`{{{file}}}:{{{line}}}`</a>
</div>
{{/if}}
{{#if module}}
{{#if submodule}}
Module: {{#crossLinkModule submodule}}{{/crossLinkModule}}<br>
Parent Module: {{#crossLinkModule module}}{{/crossLinkModule}}
{{else}}
Module: {{#crossLinkModule module}}{{/crossLinkModule}}
{{/if}}
{{/if}}
{{#if since}}
<p>Available since {{since}}</p>
{{/if}}
</div>
{{#if deprecated}}
<div class="box deprecated">
<p>
{{#if deprecationMessage}}
<strong>Deprecated:</strong> {{deprecationMessage}}
{{else}}
This class is deprecated.
{{/if}}
</p>
</div>
{{/if}}
<div class="box intro">
{{{classDescription}}}
</div>
{{#is_constructor}}
<div class="constructor">
<h2>Constructor</h2>
{{>method}}
</div>
{{/is_constructor}}
<div id="classdocs" class="tabview">
<ul class="api-class-tabs">
<li class="api-class-tab index"><a href="#index">Index</a></li>
{{#if methods}}
<li class="api-class-tab methods"><a href="#methods">Methods</a></li>
{{/if}}
{{#if properties}}
<li class="api-class-tab properties"><a href="#properties">Properties</a></li>
{{/if}}
{{#if attrs}}
<li class="api-class-tab attrs"><a href="#attrs">Attributes</a></li>
{{/if}}
{{#if events}}
<li class="api-class-tab events"><a href="#events">Events</a></li>
{{/if}}
</ul>
<div>
<div id="index" class="api-class-tabpanel index">
<h2 class="off-left">Item Index</h2>
{{#if methods}}
<div class="index-section methods">
<h3>Methods</h3>
<ul class="index-list methods{{#if extends}} extends{{/if}}">
{{#methods}}
<li class="index-item method{{#if access}} {{access}}{{/if}}{{#if deprecated}} deprecated{{/if}}{{#if overwritten_from}} inherited{{/if}}{{#if extended_from}} inherited{{/if}}">
<a href="#method_{{name}}">{{name}}</a>
{{#if static}}
<span class="flag static">static</span>
{{/if}}
{{#if deprecated}}
<span class="flag deprecated">deprecated</span>
{{/if}}
</li>
{{/methods}}
</ul>
</div>
{{/if}}
{{#if properties}}
<div class="index-section properties">
<h3>Properties</h3>
<ul class="index-list properties{{#if extends}} extends{{/if}}">
{{#properties}}
<li class="index-item property{{#if access}} {{access}}{{/if}}{{#if deprecated}} deprecated{{/if}}{{#if overwritten_from}} inherited{{/if}}{{#if extended_from}} inherited{{/if}}">
<a href="#property_{{name}}">{{name}}</a>
{{#if static}}
<span class="flag static">static</span>
{{/if}}
{{#if deprecated}}
<span class="flag deprecated">deprecated</span>
{{/if}}
</li>
{{/properties}}
</ul>
</div>
{{/if}}
{{#if attrs}}
<div class="index-section attrs">
<h3>Attributes</h3>
<ul class="index-list attrs{{#if extends}} extends{{/if}}">
{{#attrs}}
<li class="index-item attr{{#if access}} {{access}}{{/if}}{{#if deprecated}} deprecated{{/if}}{{#if overwritten_from}} inherited{{/if}}{{#if extended_from}} inherited{{/if}}">
<a href="#attr_{{name}}">{{name}}</a>
</li>
{{/attrs}}
</ul>
</div>
{{/if}}
{{#if events}}
<div class="index-section events">
<h3>Events</h3>
<ul class="index-list events{{#if extends}} extends{{/if}}">
{{#events}}
<li class="index-item event{{#if access}} {{access}}{{/if}}{{#if deprecated}} deprecated{{/if}}{{#if overwritten_from}} inherited{{/if}}{{#if extended_from}} inherited{{/if}}">
<a href="#event_{{name}}">{{name}}</a>
{{#if static}}
<span class="flag static">static</span>
{{/if}}
{{#if deprecated}}
<span class="flag deprecated">deprecated</span>
{{/if}}
</li>
{{/events}}
</ul>
</div>
{{/if}}
</div>
{{#if methods}}
<div id="methods" class="api-class-tabpanel">
<h2 class="off-left">Methods</h2>
{{#methods}}
{{>method}}
{{/methods}}
</div>
{{/if}}
{{#if properties}}
<div id="properties" class="api-class-tabpanel">
<h2 class="off-left">Properties</h2>
{{#properties}}
{{>props}}
{{/properties}}
</div>
{{/if}}
{{#if attrs}}
<div id="attrs" class="api-class-tabpanel">
<h2 class="off-left">Attributes</h2>
{{#attrs}}
{{>attrs}}
{{/attrs}}
</div>
{{/if}}
{{#if events}}
<div id="events" class="api-class-tabpanel">
<h2 class="off-left">Events</h2>
{{#events}}
{{>events}}
{{/events}}
</div>
{{/if}}
</div>
</div>
{{{customCrossLinks}}}

View File

@ -0,0 +1,212 @@
<div id="method_{{name}}" class="method item{{#if access}} {{access}}{{/if}}{{#if deprecated}} deprecated{{/if}}{{#if extended_from}} inherited{{/if}}">
<h3 class="name"><code>{{name}}</code></h3>
{{#if params}}
<div class="args">
<span class="paren">(</span><ul class="args-list inline commas">
{{#params}}
<li class="arg">
{{#if optional}}
<code class="optional">[{{name}}{{#if optdefault}}={{optdefault}}{{/if}}]</code>
{{else}}
<code>{{name}}</code>
{{/if}}
</li>
{{/params}}
</ul><span class="paren">)</span>
</div>
{{else}}
<span class="paren">()</span>
{{/if}}
{{#if return}}
<span class="returns-inline">
<span class="type">{{#crossLink returnType}}{{/crossLink}}</span>
</span>
{{/if}}
{{#if deprecated}}
<span class="flag deprecated"{{#if deprecationMessage}} title="{{deprecationMessage}}"{{/if}}>deprecated</span>
{{/if}}
{{#if access}}
<span class="flag {{access}}">{{access}}</span>
{{/if}}
{{#if final}}
<span class="flag final">final</span>
{{/if}}
{{#if static}}
<span class="flag static">static</span>
{{/if}}
{{#if chainable}}
<span class="flag chainable">chainable</span>
{{/if}}
{{#if async}}
<span class="flag async">async</span>
{{/if}}
<div class="meta">
{{#if overwritten_from}}
<p>Inherited from
<a href="{{crossLinkRaw overwritten_from/class}}#method_{{overwritten_from/name}}">
{{overwritten_from/class}}
</a>
{{#if foundAt}}
but overwritten in
{{/if}}
{{else}}
{{#if extended_from}}
<p>Inherited from
<a href="{{crossLinkRaw extended_from}}#method_{{name}}">{{extended_from}}</a>:
{{else}}
{{#providedBy}}
<p>Provided by the <a href="../modules/{{.}}.html">{{.}}</a> module.</p>
{{/providedBy}}
<p>
{{#if foundAt}}
Defined in
{{/if}}
{{/if}}
{{/if}}
{{#if foundAt}}
<a href="{{foundAt}}">`{{{file}}}:{{{line}}}`</a>
{{/if}}
</p>
{{#if deprecationMessage}}
<p>Deprecated: {{deprecationMessage}}</p>
{{/if}}
{{#if since}}
<p>Available since {{since}}</p>
{{/if}}
</div>
<div class="description">
{{{methodDescription}}}
</div>
{{#if params}}
<div class="params">
<h4>Parameters:</h4>
<ul class="params-list">
{{#params}}
<li class="param">
{{#if optional}}
<code class="param-name optional">[{{name}}{{#if optdefault}}={{optdefault}}{{/if}}]</code>
<span class="type">{{#crossLink type}}{{/crossLink}}</span>
<span class="flag optional" title="This parameter is optional.">optional</span>
{{else}}
<code class="param-name">{{name}}</code>
<span class="type">{{#crossLink type}}{{/crossLink}}</span>
{{/if}}
{{#if multiple}}
<span class="flag multiple" title="This argument may occur one or more times.">multiple</span>
{{/if}}
<div class="param-description">
{{{description}}}
</div>
{{#if props}}
<ul class="params-list">
{{#props}}
<li class="param">
{{#if optional}}
<code class="param-name optional">[{{name}}{{#if optdefault}}={{optdefault}}{{/if}}]</code>
<span class="type">{{#crossLink type}}{{/crossLink}}</span>
<span class="flag optional" title="This parameter is optional.">optional</span>
{{else}}
<code class="param-name">{{name}}</code>
<span class="type">{{#crossLink type}}{{/crossLink}}</span>
{{/if}}
<div class="param-description">
{{{description}}}
</div>
{{#if props}}
<ul class="params-list">
{{#props}}
<li class="param">
{{#if optional}}
<code class="param-name optional">[{{name}}{{#if optdefault}}={{optdefault}}{{/if}}]</code>
<span class="type">{{#crossLink type}}{{/crossLink}}</span>
<span class="flag optional" title="This parameter is optional.">optional</span>
{{else}}
<code class="param-name">{{name}}</code>
<span class="type">{{#crossLink type}}{{/crossLink}}</span>
{{/if}}
<div class="param-description">
{{{description}}}
</div>
</li>
{{/props}}
</ul>
{{/if}}
</li>
{{/props}}
</ul>
{{/if}}
</li>
{{/params}}
</ul>
</div>
{{/if}}
{{#return}}
<div class="returns">
<h4>Returns:</h4>
<div class="returns-description">
{{#if description}}
{{#if type}}
<span class="type">{{#crossLink type}}{{/crossLink}}</span>:
{{/if}}
{{{description}}}
{{else}}
{{#if type}}
<span class="type">{{#crossLink type}}{{/crossLink}}</span>:
{{/if}}
{{/if}}
</div>
</div>
{{/return}}
{{#throws}}
<div class="throws">
<h4>Throws:</h4>
<div class="throws-description">
{{#if description}}
{{#if type}}
<span class="type">{{#crossLink type}}{{/crossLink}}</span>:
{{/if}}
{{{description}}}
{{else}}
{{#if type}}
<span class="type">{{#crossLink type}}{{/crossLink}}</span>:
{{/if}}
{{/if}}
</div>
</div>
{{/throws}}
{{#example}}
<div class="example">
<h4>Example:</h4>
<div class="example-content">
{{{.}}}
</div>
</div>
{{/example}}
</div>

View File

@ -0,0 +1,92 @@
<h1>{{name}} Module</h1>
<div class="box clearfix meta">
{{#extra}}
{{#selleck}}
<a class="button link-docs" href="/yui/docs/{{name}}">User Guide &amp; Examples</a>
{{/selleck}}
{{/extra}}
{{#if requires}}
<div class="uses">
Requires
<ul class="inline commas">
{{#requires}}
<li>{{#crossLinkModule .}}{{/crossLinkModule}}</li>
{{/requires}}
</ul>
</div>
{{/if}}
{{#if foundAt}}
<div class="foundat">
Defined in: <a href="{{foundAt}}">`{{{file}}}:{{{line}}}`</a>
</div>
{{/if}}
{{#if since}}
<p>Available since {{since}}</p>
{{/if}}
</div>
{{#if deprecated}}
<div class="box deprecated">
<p>
{{#if deprecationMessage}}
<strong>Deprecated:</strong> {{deprecationMessage}}
{{else}}
This module is deprecated.
{{/if}}
</p>
</div>
{{/if}}
<div class="box intro">
{{{moduleDescription}}}
</div>
{{#example}}
<div class="example">
<h4>Example:</h4>
<div class="example-content">
{{{.}}}
</div>
</div>
{{/example}}
<div class="yui3-g">
<div class="yui3-u-1-2">
{{#if moduleClasses}}
<p>This module provides the following classes:</p>
<ul class="module-classes">
{{#moduleClasses}}
<li class="module-class">
<a href="{{../projectRoot}}classes/{{name}}.html">
{{displayName}}
</a>
</li>
{{/moduleClasses}}
</ul>
{{/if}}
</div>
<div class="yui3-u-1-2">
{{#if subModules}}
<p>This module is a rollup of the following modules:</p>
<ul class="module-submodules">
{{#subModules}}
<li class="module-submodule">
<a href="{{../projectRoot}}modules/{{name}}.html">
{{displayName}}
</a>
<div class="module-submodule-description">
{{{description}}}
</div>
</li>
{{/subModules}}
</ul>
{{/if}}
</div>
</div>

View File

@ -0,0 +1,22 @@
<div id="api-options" hidden>
Show:
<label for="api-show-inherited">
<input type="checkbox" id="api-show-inherited" checked>
Inherited
</label>
<label for="api-show-protected">
<input type="checkbox" id="api-show-protected">
Protected
</label>
<label for="api-show-private">
<input type="checkbox" id="api-show-private">
Private
</label>
<label for="api-show-deprecated">
<input type="checkbox" id="api-show-deprecated">
Deprecated
</label>
</div>

View File

@ -0,0 +1,119 @@
<div id="property_{{name}}" class="property item{{#if access}} {{access}}{{/if}}{{#if deprecated}} deprecated{{/if}}{{#if extended_from}} inherited{{/if}}">
<h3 class="name"><code>{{name}}</code></h3>
<span class="type">{{#crossLink type}}{{/crossLink}}</span>
{{#if deprecated}}
<span class="flag deprecated"{{#if deprecationMessage}} title="{{deprecationMessage}}"{{/if}}>deprecated</span>
{{/if}}
{{#if access}}
<span class="flag {{access}}">{{access}}</span>
{{/if}}
{{#if final}}
<span class="flag final">final</span>
{{/if}}
{{#if static}}
<span class="flag static">static</span>
{{/if}}
<div class="meta">
{{#if overwritten_from}}
<p>Inherited from
<a href="{{crossLinkRaw overwritten_from/class}}#property_{{overwritten_from/name}}">
{{overwritten_from/class}}
</a>
{{#if foundAt}}
but overwritten in
{{/if}}
{{else}}
{{#if extended_from}}
<p>Inherited from
<a href="{{crossLinkRaw extended_from}}#property_{{name}}">{{extended_from}}</a>:
{{else}}
{{#providedBy}}
<p>Provided by the <a href="../modules/{{.}}.html">{{.}}</a> module.</p>
{{/providedBy}}
<p>
{{#if foundAt}}
Defined in
{{/if}}
{{/if}}
{{/if}}
{{#if foundAt}}
<a href="{{foundAt}}">`{{{file}}}:{{{line}}}`</a>
{{/if}}
</p>
{{#if deprecationMessage}}
<p>Deprecated: {{deprecationMessage}}</p>
{{/if}}
{{#if since}}
<p>Available since {{since}}</p>
{{/if}}
</div>
<div class="description">
{{{propertyDescription}}}
</div>
{{#if default}}
<p><strong>Default:</strong> {{default}}</p>
{{/if}}
{{#example}}
<div class="example">
<h4>Example:</h4>
<div class="example-content">
{{{.}}}
</div>
</div>
{{/example}}
{{#if subprops}}
<h4>Sub-properties:</h4>
<ul class="params-list">
{{#subprops}}
<li class="param">
{{#if optional}}
<code class="param-name optional">[{{name}}{{#if optdefault}}={{optdefault}}{{/if}}]</code>
<span class="type">{{#crossLink type}}{{/crossLink}}</span>
<span class="flag optional" title="This property is optional.">optional</span>
{{else}}
<code class="param-name">{{name}}</code>
<span class="type">{{#crossLink type}}{{/crossLink}}</span>
{{/if}}
<div class="param-description">
{{{description}}}
</div>
{{#if subprops}}
<ul class="params-list">
{{#subprops}}
<li class="param">
{{#if optional}}
<code class="param-name optional">[{{name}}{{#if optdefault}}={{optdefault}}{{/if}}]</code>
<span class="type">{{#crossLink type}}{{/crossLink}}</span>
<span class="flag optional" title="This property is optional.">optional</span>
{{else}}
<code class="param-name">{{name}}</code>
<span class="type">{{#crossLink type}}{{/crossLink}}</span>
{{/if}}
<div class="param-description">
{{{description}}}
</div>
</li>
{{/subprops}}
</ul>
{{/if}}
</li>
{{/subprops}}
</ul>
{{/if}}
</div>

View File

@ -0,0 +1,27 @@
<div id="api-list">
<h2 class="off-left">APIs</h2>
<div id="api-tabview" class="tabview">
<ul class="tabs">
<li><a href="#api-categories">By Category</a></li>
<li><a href="#api-connections">By Connection Type</a></li>
</ul>
<div id="api-tabview-filter">
<input type="search" id="api-filter" placeholder="Type to filter APIs" hidden>
</div>
<div id="api-tabview-panel">
<ul id="api-categories" class="apis modules">
{{{listByCategory}}}
</ul>
<ul id="api-connections" class="apis modules">
{{{listByConnection}}}
</ul>
</div>
</div>
{{{javascripts}}}
</div>

View File

@ -38,7 +38,7 @@ Promise.promisifyAll(fs);
var xml2js = {
// js-format specs
// MODULES: <module name>
// MODULE: <module name>
// ENUMS: {
// <enum name>: {
// type: <enum type>,
@ -80,27 +80,52 @@ var xml2js = {
// enums_by_group: { ... }
// }, ...
// }
// CLASSGROUPS: {
// <group name>: {
// description: <group description>,
// classes: [ <class name>, ... ]
// }, ...
// }
MODULE: '',
ENUMS: {},
ENUMS_BY_GROUP: {},
METHODS: {},
CLASSES: {},
CLASSGROUPS: {},
// c -> js type mapping
// baseline c -> js type mapping
TYPEMAPS: {
'^(const)?\\s*(unsigned|signed)?\\s*(int|short|long|float|double|size_t|u?int\\d{1,2}_t)?$': 'Number',
'^bool$': 'Boolean',
'^(const)?\\s*(unsigned|signed)?\\s*(char|char\\s*\\*|std::string)$': 'String' // TODO: verify that String mappings work
'^(const)?\\s*(unsigned|signed)?\\s*(char|char\\s*\\*|std::string)$': 'String' // TODO: verify that swig does this mapping
},
// custom c -> js type mapping for pointers
// ARRAY_TYPEMAPS: {
// <pointer data type>: {
// arrayType: <swig generated array type that will replace pointers of data type>,
// classes: [ <class that contains arrayType>, ... ]
// }, ...
// }
// POINTER_TYPEMAPS: {
// <class that contains pointerType>: {
// <c pointer data type>: <js swig generated pointer type that will replace pointers of data type>, ...
// }, ...
// }
ARRAY_TYPEMAPS: {},
POINTER_TYPEMAPS: {},
// add command line options for this module
addOptions: function(opts) {
xml2js.opts = opts;
return opts
.option('-i, --inputdir [directory]', 'directory for xml files', __dirname + '/xml/mraa')
.option('-c, --custom [file]', 'json for customizations', __dirname + '/custom.json')
.option('-c, --custom [file]', 'json for customizations')
.option('-t, --typemaps [directory]', 'directory for custom pointer type maps')
.option('-g, --imagedir [directory]', 'directory to link to where the images will be kept', '')
.option('-s, --strict', 'leave out methods/variables if unknown type')
},
@ -114,9 +139,10 @@ var xml2js = {
var TYPES_SPEC = xml2js.opts.inputdir + '/types_8h.xml';
xml2js.MODULE = xml2js.opts.module;
return Promise.join(createXmlParser(XML_GRAMMAR_SPEC),
xml2js.opts.typemaps ? initCustomPointerTypemaps(xml2js.opts.typemaps) : Promise.resolve(),
fs.readFileAsync(NAMESPACE_SPEC, 'utf8'),
fs.existsSync(TYPES_SPEC) ? fs.readFileAsync(TYPES_SPEC, 'utf8') : Promise.resolve(null),
function(xmlparser, xml, xml_types) {
function(xmlparser, ignore, xml, xml_types) {
if (xml_types != null) {
_.extend(xml2js.ENUMS, getEnums(xmlparser.parse(xml_types)[0], false));
_.extend(xml2js.ENUMS_BY_GROUP, getEnums(xmlparser.parse(xml_types)[0], true));
@ -125,42 +151,60 @@ var xml2js = {
_.extend(xml2js.ENUMS, getEnums(spec_c, false));
_.extend(xml2js.ENUMS_BY_GROUP, getEnums(spec_c, true));
_.extend(xml2js.METHODS, getMethods(spec_c));
return Promise.all(_.map(getClasses(spec_c), function(c) {
_.each(getSubclassNames(spec_c), function(className) { xml2js.CLASSES[className] = {} });
var parseClasses = _.map(getSubclasses(spec_c), function(c) {
return fs.readFileAsync(CLASS_SPEC(c), 'utf8').then(function(xml) {
try {
var spec_c = xmlparser.parse(xml)[0];
var className = getClassName(spec_c);
var className = getName(spec_c);
xml2js.CLASSES[className] = {
description: getClassDescription(spec_c),
description: getDescription(spec_c),
enums: getEnums(spec_c, false, className),
enums_by_group: getEnums(spec_c, true, className),
variables: getVariables(spec_c, className),
methods: getMethods(spec_c, className),
methods: getMethods(spec_c, className)
};
} catch(e) {
console.log(e.toString() + ': ' + c + ' was not parsed correctly.');
console.log(e.toString() + ': class ' + className + ' was not parsed correctly.');
}
});
})).then(function() {
if (fs.existsSync(xml2js.opts.custom)) {
return fs.readFileAsync(xml2js.opts.custom, 'utf8').then(function(custom) {
try {
customizeMethods(JSON.parse(custom));
} catch(e) {
console.log('invalid custom.json, ignored. ' + e.toString());
});
var parseGroups = fs.readdirAsync(xml2js.opts.inputdir).then(function(files) {
var groupxmlfiles = _.filter(files, function(fn) {
return ((path.extname(fn) == '.xml') && (path.basename(fn).search(/^group/) != -1));
});
return Promise.all(_.map(groupxmlfiles, function(fn) {
return fs.readFileAsync(xml2js.opts.inputdir + '/' + fn, 'utf8').then(function(xml) {
var spec_c = xmlparser.parse(xml)[0];
if (_.isEmpty(getSubmodules(spec_c))) {
xml2js.CLASSGROUPS[getName(spec_c)] = {
description: getDescription(spec_c),
classes: getSubclassNames(spec_c)
}
}
});
} else {
console.log((xml2js.opts.custom == __dirname + '/custom.json') ? 'No customizations given.' : 'Error: No such customization file exists: ' + xml2js.opts.custom);
}
}).then(function() {
validateMethods();
validateVars();
return _.pick(xml2js, 'MODULE', 'ENUMS', 'ENUMS_BY_GROUP', 'METHODS', 'CLASSES');
}));
});
return Promise.all(parseClasses.concat(parseGroups));
}).then(function() {
if (xml2js.opts.custom && fs.existsSync(xml2js.opts.custom)) {
return fs.readFileAsync(xml2js.opts.custom, 'utf8').then(function(custom) {
try {
customizeMethods(JSON.parse(custom));
} catch(e) {
console.log('invalid custom.json, ignored. ' + e.toString());
}
});
} else {
console.log(xml2js.opts.custom ? ('Error: No such customization file exists: ' + xml2js.opts.custom) : 'No customizations given.');
}
}).then(function() {
validateMethods();
validateVars();
generateCustomPointerClasses();
return _.pick(xml2js, 'MODULE', 'ENUMS', 'ENUMS_BY_GROUP', 'METHODS', 'CLASSES', 'CLASSGROUPS');
});
}
};
@ -172,6 +216,181 @@ function createXmlParser(XML_GRAMMAR_SPEC) {
}
// configure c->js typemaps from custom swig directives
// TODO: many built in assumptions based on current upm file structures & .i customizations
function initCustomPointerTypemaps(typemapsdir) {
return fs.readdirAsync(typemapsdir).then(function(dirs) {
return Promise.all(_.map(dirs, function(dir) {
// get all js*.i directives from class-specific subdirectories, to be parsed below for %typemaps directives
return fs.readdirAsync(typemapsdir + '/' + dir).then(function(files) {
var directive = _.find(files, function(fn) {
return ((path.extname(fn) == '.i') && (path.basename(fn).search(/^js/) != -1));
});
var data = {};
if (directive) {
data[dir] = typemapsdir + '/' + dir + '/' + directive;
}
return data;
}).catch(function(e) {
// get all .i directives from top level directory, and parse for %array_class directives
if (e.code == 'ENOTDIR') {
var fn = dir;
if (path.extname(fn) == '.i') {
return fs.readFileAsync(typemapsdir + '/' + fn, 'utf8').then(function(directives) {
var arraytypes = _.filter(directives.split(/\n/), function(line) {
return (line.search(/^%array_class/) != -1);
});
_.each(arraytypes, function(arraytype) {
var parsed = arraytype.match(/%array_class\(([A-Za-z0-9_]+)[\s]*,[\s]*([A-Za-z0-9_]+)\)/);
if (parsed) {
var from = parsed[1];
var to = parsed[2];
xml2js.ARRAY_TYPEMAPS[from] = { arrayType: to, classes: [] };
} else {
console.log('Incorrectly parsed array_class from ' + fn + ': ' + arraytype);
}
});
});
}
} else {
throw e;
}
});
}));
}).then(function(__directivesFiles) {
// parse for %typemaps & %pointer_functions directives
var _directivesFiles = _.filter(__directivesFiles, function(data) { return !_.isEmpty(data); });
var directivesFiles = _.object(_.map(_directivesFiles, _.keys), _.flatten(_.map(_directivesFiles, _.values)));
return Promise.all(_.map(directivesFiles, function(directivesFn, className) {
return fs.readFileAsync(directivesFn, 'utf8').then(function(directives) {
var typemaps = _.filter(directives.split(/\n/), function(line) {
return (line.search(/^%typemap/) != -1);
});
_.each(typemaps, function(typemap) {
var parsed = typemap.match(/%typemap\((in|out)\)[\s]+([A-Za-z0-9_]+[\s]*[\*])/);
if (parsed) {
var dir = parsed[1]; // TODO: ignored for now
var type = normalizePointer(parsed[2]);
var datatype = getPointerDataType(type);
if (_.has(xml2js.ARRAY_TYPEMAPS, datatype)) {
xml2js.ARRAY_TYPEMAPS[datatype].classes.push(className);
} else {
console.log('Ignored typemap from ' + directivesFn + ': ' + typemap.replace('{', '') + ' (no %array_class directive found for ' + datatype + ')');
}
} else {
console.log('Ignored typemap from ' + directivesFn + ': ' + typemap.replace('{', '') + ' (only considering in/out typemaps of pointer types)');
}
});
var ptrfns = _.filter(directives.split(/\n/), function(line) {
return (line.search(/^%pointer_functions/) != -1);
});
_.each(ptrfns, function(ptrfn) {
var parsed = ptrfn.match(/%pointer_functions\(([A-Za-z0-9_]+)[\s]*,[\s]*([A-Za-z0-9_]+)\)/);
if (parsed) {
var from = parsed[1];
var to = parsed[2];
if (!_.has(xml2js.POINTER_TYPEMAPS, className)) {
xml2js.POINTER_TYPEMAPS[className] = {};
}
xml2js.POINTER_TYPEMAPS[className][from] = to;
}
});
});
}));
});
}
// generate class specs for custom pointer types
function generateCustomPointerClasses() {
var arrayTypes = _.pluck(_.values(xml2js.ARRAY_TYPEMAPS), 'arrayType');
var pointerTypes = _.uniq(_.flatten(_.map(_.values(xml2js.POINTER_TYPEMAPS), _.values)));
_.each(arrayTypes, function(arrayType) {
var dataType = _.findKey(xml2js.ARRAY_TYPEMAPS, function(to) { return to.arrayType == arrayType; });
xml2js.CLASSES[arrayType] = {
description: 'Array of type ' + dataType + '.',
enums: {},
enums_by_group: {},
variables: {},
methods: {}
};
xml2js.CLASSES[arrayType].methods[arrayType] = {
description: 'Instantiates the array.',
params: {
nelements: {
type: 'Number',
description: 'number of elements in the array'
}
},
return: {}
};
xml2js.CLASSES[arrayType].methods.getitem = {
description: 'Access a particular element in the array.',
params: {
index: {
type: 'Number',
description: 'index of array to read from'
},
},
return: {
type: getType(dataType),
description: 'the value of the element found at the given index of the array'
}
};
xml2js.CLASSES[arrayType].methods.setitem = {
description: 'Modify a particular element in the array.',
params: {
index: {
type: 'Number',
description: 'index of array to write to'
},
value: {
type: getType(dataType),
description: 'the value to set the element found at the given index of the array'
}
},
return: {}
};
});
var pointerDataTypeMap = _.reduce(_.map(_.values(xml2js.POINTER_TYPEMAPS), _.invert), function(memo, typemap) {
return _.extend(memo, typemap);
}, {});
_.each(pointerTypes, function(pointerType) {
var dataType = pointerDataTypeMap[pointerType];
xml2js.CLASSES[pointerType] = {
description: 'Proxy object to data of type ' + dataType + '.',
enums: {},
enums_by_group: {},
variables: {},
methods: {}
};
xml2js.CLASSES[pointerType].methods[pointerType] = {
description: 'Instantiates the proxy object.',
params: {},
return: {}
};
xml2js.CLASSES[pointerType].methods.value = {
description: 'Get the value of the object.',
params: {},
return: {
type: getType(dataType),
description: 'the value of the object'
}
};
xml2js.CLASSES[pointerType].methods.assign = {
description: 'Set the value of the object.',
params: {
value: {
type: getType(dataType),
description: 'the value to set the object to'
}
},
return: {}
};
});
}
// override autogenerated methods with custom configuration
function customizeMethods(custom) {
_.each(custom, function(classMethods, className) {
@ -181,10 +400,11 @@ function customizeMethods(custom) {
});
}
// make sure methods have valid types, otherwise warn (& don't include if strict)
function validateMethods() {
xml2js.METHODS = _.pick(xml2js.METHODS, function(methodSpec, methodName) {
hasValidTypes(methodSpec, methodName);
return hasValidTypes(methodSpec, methodName);
});
_.each(xml2js.CLASSES, function(classSpec, className) {
var valid = _.pick(classSpec.methods, function(methodSpec, methodName) {
@ -271,17 +491,39 @@ function getEnums(spec_c, bygroup, parent) {
}
// get the name for the module/group/class
function getName(spec_c) {
return getText(getChild(spec_c, 'compoundname'), 'name').replace(xml2js.opts.module + '::', '');
}
// get the description for the module/group/class
function getDescription(spec_c) {
return getText(getChild(spec_c, 'detaileddescription'), 'description');
}
// get the classes (xml file names) for the given module
function getClasses(spec_c) {
function getSubclasses(spec_c) {
return _.map(getChildren(spec_c, 'innerclass'), function(innerclass) {
return getAttr(innerclass, 'refid');
});
}
// get the description of the class
function getClassDescription(spec_c) {
return getText(getChild(spec_c, 'detaileddescription'), 'description');
// get the classes (class names) for the given module
function getSubclassNames(spec_c) {
return _.map(getChildren(spec_c, 'innerclass'), function(innerclass) {
return getText(innerclass).replace(xml2js.opts.module + '::', '');
});
}
// get the submodules (xml file names) for the given module
function getSubmodules(spec_c) {
return _.map(getChildren(spec_c, 'innergroup'), function(innergroup) {
return getAttr(innergroup, 'refid');
});
}
@ -310,12 +552,12 @@ function getMethods(spec_c, parent) {
var paramsSpec = getChildren(method, 'param');
var params = {};
if (hasParams(paramsSpec)) {
params = getParams(paramsSpec, getParamsDetails(description), (parent ? (parent + '.') : '') + methodName);
params = getParams(paramsSpec, getParamsDetails(description), methodName, parent);
}
var returnSpec = getChild(method, 'type');
var retval = {};
if (!_.isEmpty(returnSpec)) {
retval = getReturn(returnSpec, getReturnDetails(description));
retval = getReturn(returnSpec, getReturnDetails(description), methodName, parent);
}
spec_js[methodName] = {
description: methodDescription,
@ -345,7 +587,7 @@ function getVariables(spec_c, parent) {
return (getAttr(variable, 'kind') == 'variable');
}), function(variable) {
var varName = getText(getChild(variable, 'name'), 'name');
var varType = getType(getText(getChild(variable, 'type')));
var varType = getType(getText(getChild(variable, 'type')), parent);
var varDescription = getText(getChild(variable, 'detaileddescription'));
spec_js[varName] = {
type: varType,
@ -358,8 +600,8 @@ function getVariables(spec_c, parent) {
// get return value specs of a method
function getReturn(spec_c, details) {
var retType = getType(getText(spec_c, 'type'));
function getReturn(spec_c, details, method, parent) {
var retType = getType(getText(spec_c, 'type'), parent);
var retDescription = (details ? getText(details, 'description') : '');
return ((retType == 'void') ? {} : {
type: retType,
@ -369,11 +611,11 @@ function getReturn(spec_c, details) {
// get paramater specs of a method
function getParams(spec_c, details, method) {
function getParams(spec_c, details, method, parent) {
var spec_js = {};
_.each(spec_c, function(param) {
try {
var paramType = getType(getText(getChild(param, 'type'), 'type'));
var paramType = getType(getText(getChild(param, 'type'), 'type'), parent);
var paramName = getText(getChild(param, 'declname'), 'name');
spec_js[paramName] = { type: paramType };
} catch(e) {
@ -394,7 +636,7 @@ function getParams(spec_c, details, method) {
var msg = ' has documentation for an unknown parameter: ' + paramName + '. ';
var suggestions = _.difference(_.keys(spec_js), _.map(details, getParamName));
var msgAddendum = (!_.isEmpty(suggestions) ? ('Did you mean ' + suggestions.join(', or ') + '?') : '');
console.log('Warning: ' + method + msg + msgAddendum);
console.log('Warning: ' + (parent ? (parent + '.') : '') + method + msg + msgAddendum);
}
});
return spec_js;
@ -402,19 +644,27 @@ function getParams(spec_c, details, method) {
// get the equivalent javascript type from the given c type
function getType(type_c) {
function getType(type_c, parent) {
var type_js = type_c;
_.find(xml2js.TYPEMAPS, function(to, from) {
var pattern = new RegExp(from, 'i');
if (type_c.search(pattern) == 0) {
type_js = to;
return true;
}
});
// TODO: temporary solution
// remove extra whitespace from pointers
// permanent solution would be to get rid of pointers all together
if (type_js.search(/\S+\s*\*$/) != -1) {
type_js = type_js.replace(/\s*\*$/, '*');
if (isPointer(type_js)) {
var dataType = getPointerDataType(type_js);
var className = parent.toLowerCase();
if (_.has(xml2js.ARRAY_TYPEMAPS, dataType) && _.contains(xml2js.ARRAY_TYPEMAPS[dataType].classes, className)) {
type_js = xml2js.ARRAY_TYPEMAPS[dataType].arrayType;
} else if (_.has(xml2js.POINTER_TYPEMAPS, className) && _.has(xml2js.POINTER_TYPEMAPS[className], dataType)) {
type_js = xml2js.POINTER_TYPEMAPS[className][dataType];
} else if (_.has(xml2js.CLASSES, dataType)) { // TODO: verify that swig does this mapping
type_js = dataType;
} else {
type_js = dataType + ' &#42;'
}
}
return type_js;
}
@ -429,13 +679,13 @@ function hasValidTypes(methodSpec, methodName, parent) {
if (!isValidType(paramSpec.type, parent)) {
valid = false;
printIgnoredMethodOnce();
console.log(' Error: parameter ' + paramName + ' has invalid type ' + paramSpec.type);
console.log(' Error: parameter ' + paramName + ' has invalid type ' + typeToString(paramSpec.type));
}
});
if (!_.isEmpty(methodSpec.return) && !isValidType(methodSpec.return.type, parent)) {
valid = false;
printIgnoredMethodOnce();
console.log(' Error: returns invalid type ' + methodSpec.return.type);
console.log(' Error: returns invalid type ' + typeToString(methodSpec.return.type));
}
return valid;
}
@ -447,26 +697,53 @@ function ofValidType(varSpec, varName, parent) {
return true;
} else {
var msgAddendum = (xml2js.opts.strict ? ' Omitted from JS documentation.' : '');
console.log('Error: ' + varName + ' is of invalid type ' + varSpec.type + '.' + msgAddendum);
console.log('Error: ' + varName + ' is of invalid type ' + typeToString(varSpec.type) + '.' + msgAddendum);
return false;
}
}
// verify whether the given type is valid JS
// TODO: check class-specific types
function isValidType(type, parent) {
return (_.contains(_.values(xml2js.TYPEMAPS), type) ||
_.has(xml2js.CLASSES, type) ||
_.has(xml2js.ENUMS_BY_GROUP, type) ||
_.contains(['Buffer', 'Function', 'mraa_result_t'], type) ||
_.has((parent ? xml2js.CLASSES[parent].enums_by_group : []), type));
_.has((parent ? xml2js.CLASSES[parent].enums_by_group : []), type) ||
isValidPointerType(type, parent));
}
function isValidPointerType(type, parent) {
var className = parent.toLowerCase();
var arrayTypemap = _.find(xml2js.ARRAY_TYPEMAPS, function(to) { return to.arrayType == type; });
var valid = ((arrayTypemap && _.contains(arrayTypemap.classes, className)) ||
(_.has(xml2js.POINTER_TYPEMAPS, className) && (_.contains(_.values(xml2js.POINTER_TYPEMAPS[className]), type))));
return valid;
}
// determines whether a type looks like a c pointer
function isPointer(type) {
return (type.search(/\w+\s*\*/) != -1);
return (type.search(/\w+\s*(\*|&amp;)$/) != -1);
}
// remove extraneous whitespace from pointer types as canonical representation
function normalizePointer(ptr) {
return ptr.replace(/\s*$/, '');
}
// get the data type of a pointer (e.g. int is the data type of int*)
function getPointerDataType(ptr) {
return ptr.replace(/\s*(\*|&amp;)$/, '');
}
// print more human friendly type for error messages
function typeToString(type) {
return type.replace('&#42;', '*');
}
@ -508,9 +785,9 @@ function getText(obj, why) {
case 'programlisting':
case 'htmlonly':
return text; // ignored
// TODO: html doesn't seem to work, using markdown for now
// TODO: html doesn't seem to work for yuidoc, using markdown for now
case 'itemizedlist':
return text += '\n' + getText(elem, why) + '\n';
return text += '\n' + getText(elem, why) + ' \n \n';
case 'listitem':
return text += '+ ' + getText(elem, why) + '\n';
case 'bold':
@ -520,7 +797,7 @@ function getText(obj, why) {
case 'image':
// TODO: copy images over; hard coded for now
var fn = getAttr(elem, 'name');
return text += ' \n \n![' + fn + '](' + '../../../../docs/images/' + fn + ') ';
return text += ' \n \n![' + fn + '](' + xml2js.opts.imagedir + '/' + fn + ') ';
case 'linebreak':
return text += ' \n';
case 'ndash':
@ -560,12 +837,6 @@ function getChildren(obj, name) {
}
// get the class name from its xml spec
function getClassName(spec_c) {
return getText(getChild(spec_c, 'compoundname'), 'name').replace(xml2js.opts.module + '::', '');
}
// debug helper: print untruncated object
function printObj(obj) {
console.log(util.inspect(obj, false, null));