mirror of
https://github.com/eclipse/upm.git
synced 2025-03-15 04:57:30 +03:00
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:
parent
ed52f0e5cb
commit
33b508110e
@ -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}
|
||||
|
@ -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) {
|
||||
|
59
doxy/node/generators/yuidoc/generator.js
vendored
59
doxy/node/generators/yuidoc/generator.js
vendored
@ -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
196
doxy/node/generators/yuidoc/helper.js
vendored
Normal 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;
|
||||
}
|
||||
|
||||
};
|
27
doxy/node/generators/yuidoc/tmpl/LICENSE
Normal file
27
doxy/node/generators/yuidoc/tmpl/LICENSE
Normal 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.
|
789
doxy/node/generators/yuidoc/tmpl/assets/css/main.css
Normal file
789
doxy/node/generators/yuidoc/tmpl/assets/css/main.css
Normal 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;
|
||||
}
|
||||
|
51
doxy/node/generators/yuidoc/tmpl/layouts/main.handlebars
Normal file
51
doxy/node/generators/yuidoc/tmpl/layouts/main.handlebars
Normal 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>
|
205
doxy/node/generators/yuidoc/tmpl/partials/classes.handlebars
Normal file
205
doxy/node/generators/yuidoc/tmpl/partials/classes.handlebars
Normal 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}}}
|
212
doxy/node/generators/yuidoc/tmpl/partials/method.handlebars
Normal file
212
doxy/node/generators/yuidoc/tmpl/partials/method.handlebars
Normal 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>
|
92
doxy/node/generators/yuidoc/tmpl/partials/module.handlebars
Normal file
92
doxy/node/generators/yuidoc/tmpl/partials/module.handlebars
Normal 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 & 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>
|
22
doxy/node/generators/yuidoc/tmpl/partials/options.handlebars
Normal file
22
doxy/node/generators/yuidoc/tmpl/partials/options.handlebars
Normal 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>
|
||||
|
119
doxy/node/generators/yuidoc/tmpl/partials/props.handlebars
Normal file
119
doxy/node/generators/yuidoc/tmpl/partials/props.handlebars
Normal 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>
|
27
doxy/node/generators/yuidoc/tmpl/partials/sidebar.handlebars
Normal file
27
doxy/node/generators/yuidoc/tmpl/partials/sidebar.handlebars
Normal 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>
|
@ -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,24 +151,43 @@ 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)) {
|
||||
});
|
||||
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)
|
||||
}
|
||||
}
|
||||
});
|
||||
}));
|
||||
});
|
||||
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));
|
||||
@ -151,16 +196,15 @@ var xml2js = {
|
||||
}
|
||||
});
|
||||
} else {
|
||||
console.log((xml2js.opts.custom == __dirname + '/custom.json') ? 'No customizations given.' : 'Error: No such customization file exists: ' + xml2js.opts.custom);
|
||||
console.log(xml2js.opts.custom ? ('Error: No such customization file exists: ' + xml2js.opts.custom) : 'No customizations given.');
|
||||
}
|
||||
}).then(function() {
|
||||
validateMethods();
|
||||
validateVars();
|
||||
return _.pick(xml2js, 'MODULE', 'ENUMS', 'ENUMS_BY_GROUP', 'METHODS', 'CLASSES');
|
||||
});
|
||||
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 + ' *'
|
||||
}
|
||||
}
|
||||
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*(\*|&)$/) != -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*(\*|&)$/, '');
|
||||
}
|
||||
|
||||
|
||||
// print more human friendly type for error messages
|
||||
function typeToString(type) {
|
||||
return type.replace('*', '*');
|
||||
}
|
||||
|
||||
|
||||
@ -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 ';
|
||||
return text += ' \n \n ';
|
||||
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));
|
||||
|
Loading…
x
Reference in New Issue
Block a user