api documentation
This commit is contained in:
357
doc/utils/handlebars_helper.js
Normal file
357
doc/utils/handlebars_helper.js
Normal file
@@ -0,0 +1,357 @@
|
||||
define([
|
||||
'locales',
|
||||
'handlebars',
|
||||
'diffMatchPatch'
|
||||
], function(locale, Handlebars, DiffMatchPatch) {
|
||||
|
||||
/**
|
||||
* Return a text as markdown.
|
||||
* Currently only a little helper to replace apidoc-inline Links (#Group:Name).
|
||||
* Should be replaced with a full markdown lib.
|
||||
* @param string text
|
||||
*/
|
||||
Handlebars.registerHelper('markdown', function(text) {
|
||||
if ( ! text ) {
|
||||
return text;
|
||||
}
|
||||
text = text.replace(/((\[(.*?)\])?\(#)((.+?):(.+?))(\))/mg, function(match, p1, p2, p3, p4, p5, p6) {
|
||||
var link = p3 || p5 + '/' + p6;
|
||||
return '<a href="#api-' + p5 + '-' + p6 + '">' + link + '</a>';
|
||||
});
|
||||
return text;
|
||||
});
|
||||
|
||||
/**
|
||||
* start/stop timer for simple performance check.
|
||||
*/
|
||||
var timer;
|
||||
Handlebars.registerHelper('startTimer', function(text) {
|
||||
timer = new Date();
|
||||
return '';
|
||||
});
|
||||
|
||||
Handlebars.registerHelper('stopTimer', function(text) {
|
||||
console.log(new Date() - timer);
|
||||
return '';
|
||||
});
|
||||
|
||||
/**
|
||||
* Return localized Text.
|
||||
* @param string text
|
||||
*/
|
||||
Handlebars.registerHelper('__', function(text) {
|
||||
return locale.__(text);
|
||||
});
|
||||
|
||||
/**
|
||||
* Console log.
|
||||
* @param mixed obj
|
||||
*/
|
||||
Handlebars.registerHelper('cl', function(obj) {
|
||||
console.log(obj);
|
||||
return '';
|
||||
});
|
||||
|
||||
/**
|
||||
* Replace underscore with space.
|
||||
* @param string text
|
||||
*/
|
||||
Handlebars.registerHelper('underscoreToSpace', function(text) {
|
||||
return text.replace(/(_+)/g, ' ');
|
||||
});
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
Handlebars.registerHelper('assign', function(name) {
|
||||
if(arguments.length > 0) {
|
||||
var type = typeof(arguments[1]);
|
||||
var arg = null;
|
||||
if(type === 'string' || type === 'number' || type === 'boolean') arg = arguments[1];
|
||||
Handlebars.registerHelper(name, function() { return arg; });
|
||||
}
|
||||
return '';
|
||||
});
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
Handlebars.registerHelper('nl2br', function(text) {
|
||||
return _handlebarsNewlineToBreak(text);
|
||||
});
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
Handlebars.registerHelper('if_eq', function(context, options) {
|
||||
var compare = context;
|
||||
// Get length if context is an object
|
||||
if (context instanceof Object && ! (options.hash.compare instanceof Object))
|
||||
compare = Object.keys(context).length;
|
||||
|
||||
if (compare === options.hash.compare)
|
||||
return options.fn(this);
|
||||
|
||||
return options.inverse(this);
|
||||
});
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
Handlebars.registerHelper('if_gt', function(context, options) {
|
||||
var compare = context;
|
||||
// Get length if context is an object
|
||||
if (context instanceof Object && ! (options.hash.compare instanceof Object))
|
||||
compare = Object.keys(context).length;
|
||||
|
||||
if(compare > options.hash.compare)
|
||||
return options.fn(this);
|
||||
|
||||
return options.inverse(this);
|
||||
});
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
var templateCache = {};
|
||||
Handlebars.registerHelper('subTemplate', function(name, sourceContext) {
|
||||
if ( ! templateCache[name])
|
||||
templateCache[name] = Handlebars.compile($('#template-' + name).html());
|
||||
|
||||
var template = templateCache[name];
|
||||
var templateContext = $.extend({}, this, sourceContext.hash);
|
||||
return new Handlebars.SafeString( template(templateContext) );
|
||||
});
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
Handlebars.registerHelper('toLowerCase', function(value) {
|
||||
return (value && typeof value === 'string') ? value.toLowerCase() : '';
|
||||
});
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
Handlebars.registerHelper('splitFill', function(value, splitChar, fillChar) {
|
||||
var splits = value.split(splitChar);
|
||||
return new Array(splits.length).join(fillChar) + splits[splits.length - 1];
|
||||
});
|
||||
|
||||
/**
|
||||
* Convert Newline to HTML-Break (nl2br).
|
||||
*
|
||||
* @param {String} text
|
||||
* @returns {String}
|
||||
*/
|
||||
function _handlebarsNewlineToBreak(text) {
|
||||
return ('' + text).replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1' + '<br>' + '$2');
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
Handlebars.registerHelper('each_compare_list_field', function(source, compare, options) {
|
||||
var fieldName = options.hash.field;
|
||||
var newSource = [];
|
||||
if (source) {
|
||||
source.forEach(function(entry) {
|
||||
var values = entry;
|
||||
values['key'] = entry[fieldName];
|
||||
newSource.push(values);
|
||||
});
|
||||
}
|
||||
|
||||
var newCompare = [];
|
||||
if (compare) {
|
||||
compare.forEach(function(entry) {
|
||||
var values = entry;
|
||||
values['key'] = entry[fieldName];
|
||||
newCompare.push(values);
|
||||
});
|
||||
}
|
||||
return _handlebarsEachCompared('key', newSource, newCompare, options);
|
||||
});
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
Handlebars.registerHelper('each_compare_keys', function(source, compare, options) {
|
||||
var newSource = [];
|
||||
if (source) {
|
||||
var sourceFields = Object.keys(source);
|
||||
sourceFields.forEach(function(name) {
|
||||
var values = {};
|
||||
values['value'] = source[name];
|
||||
values['key'] = name;
|
||||
newSource.push(values);
|
||||
});
|
||||
}
|
||||
|
||||
var newCompare = [];
|
||||
if (compare) {
|
||||
var compareFields = Object.keys(compare);
|
||||
compareFields.forEach(function(name) {
|
||||
var values = {};
|
||||
values['value'] = compare[name];
|
||||
values['key'] = name;
|
||||
newCompare.push(values);
|
||||
});
|
||||
}
|
||||
return _handlebarsEachCompared('key', newSource, newCompare, options);
|
||||
});
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
Handlebars.registerHelper('each_compare_field', function(source, compare, options) {
|
||||
return _handlebarsEachCompared('field', source, compare, options);
|
||||
});
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
Handlebars.registerHelper('each_compare_title', function(source, compare, options) {
|
||||
return _handlebarsEachCompared('title', source, compare, options);
|
||||
});
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
Handlebars.registerHelper('reformat', function(source, type){
|
||||
if (type == 'json')
|
||||
try {
|
||||
return JSON.stringify(JSON.parse(source.trim()),null, " ");
|
||||
} catch(e) {
|
||||
|
||||
}
|
||||
return source
|
||||
});
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
Handlebars.registerHelper('showDiff', function(source, compare, options) {
|
||||
var ds = '';
|
||||
if(source === compare) {
|
||||
ds = source;
|
||||
} else {
|
||||
if( ! source)
|
||||
return compare;
|
||||
|
||||
if( ! compare)
|
||||
return source;
|
||||
|
||||
var d = diffMatchPatch.diff_main(compare, source);
|
||||
diffMatchPatch.diff_cleanupSemantic(d);
|
||||
ds = diffMatchPatch.diff_prettyHtml(d);
|
||||
ds = ds.replace(/¶/gm, '');
|
||||
}
|
||||
if(options === 'nl2br')
|
||||
ds = _handlebarsNewlineToBreak(ds);
|
||||
|
||||
return ds;
|
||||
});
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
function _handlebarsEachCompared(fieldname, source, compare, options)
|
||||
{
|
||||
var dataList = [];
|
||||
var index = 0;
|
||||
if(source) {
|
||||
source.forEach(function(sourceEntry) {
|
||||
var found = false;
|
||||
if (compare) {
|
||||
compare.forEach(function(compareEntry) {
|
||||
if(sourceEntry[fieldname] === compareEntry[fieldname]) {
|
||||
var data = {
|
||||
typeSame: true,
|
||||
source: sourceEntry,
|
||||
compare: compareEntry,
|
||||
index: index
|
||||
};
|
||||
dataList.push(data);
|
||||
found = true;
|
||||
index++;
|
||||
}
|
||||
});
|
||||
}
|
||||
if ( ! found) {
|
||||
var data = {
|
||||
typeIns: true,
|
||||
source: sourceEntry,
|
||||
index: index
|
||||
};
|
||||
dataList.push(data);
|
||||
index++;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (compare) {
|
||||
compare.forEach(function(compareEntry) {
|
||||
var found = false;
|
||||
if (source) {
|
||||
source.forEach(function(sourceEntry) {
|
||||
if(sourceEntry[fieldname] === compareEntry[fieldname])
|
||||
found = true;
|
||||
});
|
||||
}
|
||||
if ( ! found) {
|
||||
var data = {
|
||||
typeDel: true,
|
||||
compare: compareEntry,
|
||||
index: index
|
||||
};
|
||||
dataList.push(data);
|
||||
index++;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
var ret = '';
|
||||
var length = dataList.length;
|
||||
for (var index in dataList) {
|
||||
if(index == (length - 1))
|
||||
dataList[index]['_last'] = true;
|
||||
ret = ret + options.fn(dataList[index]);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
var diffMatchPatch = new DiffMatchPatch();
|
||||
|
||||
/**
|
||||
* Overwrite Colors
|
||||
*/
|
||||
DiffMatchPatch.prototype.diff_prettyHtml = function(diffs) {
|
||||
var html = [];
|
||||
var pattern_amp = /&/g;
|
||||
var pattern_lt = /</g;
|
||||
var pattern_gt = />/g;
|
||||
var pattern_para = /\n/g;
|
||||
for (var x = 0; x < diffs.length; x++) {
|
||||
var op = diffs[x][0]; // Operation (insert, delete, equal)
|
||||
var data = diffs[x][1]; // Text of change.
|
||||
var text = data.replace(pattern_amp, '&').replace(pattern_lt, '<')
|
||||
.replace(pattern_gt, '>').replace(pattern_para, '¶<br>');
|
||||
switch (op) {
|
||||
case DIFF_INSERT:
|
||||
html[x] = '<ins>' + text + '</ins>';
|
||||
break;
|
||||
case DIFF_DELETE:
|
||||
html[x] = '<del>' + text + '</del>';
|
||||
break;
|
||||
case DIFF_EQUAL:
|
||||
html[x] = '<span>' + text + '</span>';
|
||||
break;
|
||||
}
|
||||
}
|
||||
return html.join('');
|
||||
};
|
||||
|
||||
// Exports
|
||||
return Handlebars;
|
||||
});
|
||||
184
doc/utils/send_sample_request.js
Executable file
184
doc/utils/send_sample_request.js
Executable file
@@ -0,0 +1,184 @@
|
||||
define([
|
||||
'jquery',
|
||||
'lodash'
|
||||
], function($, _) {
|
||||
|
||||
var initDynamic = function() {
|
||||
// Button send
|
||||
$(".sample-request-send").off("click");
|
||||
$(".sample-request-send").on("click", function(e) {
|
||||
e.preventDefault();
|
||||
var $root = $(this).parents("article");
|
||||
var group = $root.data("group");
|
||||
var name = $root.data("name");
|
||||
var version = $root.data("version");
|
||||
sendSampleRequest(group, name, version, $(this).data("sample-request-type"));
|
||||
});
|
||||
|
||||
// Button clear
|
||||
$(".sample-request-clear").off("click");
|
||||
$(".sample-request-clear").on("click", function(e) {
|
||||
e.preventDefault();
|
||||
var $root = $(this).parents("article");
|
||||
var group = $root.data("group");
|
||||
var name = $root.data("name");
|
||||
var version = $root.data("version");
|
||||
clearSampleRequest(group, name, version);
|
||||
});
|
||||
}; // initDynamic
|
||||
|
||||
function sendSampleRequest(group, name, version, type)
|
||||
{
|
||||
var $root = $('article[data-group="' + group + '"][data-name="' + name + '"][data-version="' + version + '"]');
|
||||
|
||||
// Optional header
|
||||
var header = {};
|
||||
$root.find(".sample-request-header:checked").each(function(i, element) {
|
||||
var group = $(element).data("sample-request-header-group-id");
|
||||
$root.find("[data-sample-request-header-group=\"" + group + "\"]").each(function(i, element) {
|
||||
var key = $(element).data("sample-request-header-name");
|
||||
var value = element.value;
|
||||
if ( ! element.optional && element.defaultValue !== '') {
|
||||
value = element.defaultValue;
|
||||
}
|
||||
header[key] = value;
|
||||
});
|
||||
});
|
||||
|
||||
// create JSON dictionary of parameters
|
||||
var param = {};
|
||||
var paramType = {};
|
||||
$root.find(".sample-request-param:checked").each(function(i, element) {
|
||||
var group = $(element).data("sample-request-param-group-id");
|
||||
$root.find("[data-sample-request-param-group=\"" + group + "\"]").not(function(){
|
||||
return $(this).val() == "" && $(this).is("[data-sample-request-param-optional='true']");
|
||||
}).each(function(i, element) {
|
||||
var key = $(element).data("sample-request-param-name");
|
||||
var value = element.value;
|
||||
if ( ! element.optional && element.defaultValue !== '') {
|
||||
value = element.defaultValue;
|
||||
}
|
||||
param[key] = value;
|
||||
paramType[key] = $(element).next().text();
|
||||
});
|
||||
});
|
||||
|
||||
// grab user-inputted URL
|
||||
var url = $root.find(".sample-request-url").val();
|
||||
|
||||
// Insert url parameter
|
||||
var pattern = pathToRegexp(url, null);
|
||||
var matches = pattern.exec(url);
|
||||
for (var i = 1; i < matches.length; i++) {
|
||||
var key = matches[i].substr(1);
|
||||
if (param[key] !== undefined) {
|
||||
url = url.replace(matches[i], encodeURIComponent(param[key]));
|
||||
|
||||
// remove URL parameters from list
|
||||
delete param[key];
|
||||
}
|
||||
} // for
|
||||
|
||||
$root.find(".sample-request-response").fadeTo(250, 1);
|
||||
$root.find(".sample-request-response-json").html("Loading...");
|
||||
refreshScrollSpy();
|
||||
|
||||
_.each( param, function( val, key ) {
|
||||
var t = paramType[ key ].toLowerCase();
|
||||
if ( t === 'object' || t === 'array' ) {
|
||||
try {
|
||||
param[ key ] = JSON.parse( val );
|
||||
} catch (e) {
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// send AJAX request, catch success or error callback
|
||||
var ajaxRequest = {
|
||||
url : url,
|
||||
headers : header,
|
||||
data : param,
|
||||
type : type.toUpperCase(),
|
||||
success : displaySuccess,
|
||||
error : displayError
|
||||
};
|
||||
|
||||
$.ajax(ajaxRequest);
|
||||
|
||||
|
||||
function displaySuccess(data, status, jqXHR) {
|
||||
var jsonResponse;
|
||||
try {
|
||||
jsonResponse = JSON.parse(jqXHR.responseText);
|
||||
jsonResponse = JSON.stringify(jsonResponse, null, 4);
|
||||
} catch (e) {
|
||||
jsonResponse = data;
|
||||
}
|
||||
$root.find(".sample-request-response-json").html(jsonResponse);
|
||||
refreshScrollSpy();
|
||||
};
|
||||
|
||||
function displayError(jqXHR, textStatus, error) {
|
||||
var message = "Error " + jqXHR.status + ": " + error;
|
||||
var jsonResponse;
|
||||
try {
|
||||
jsonResponse = JSON.parse(jqXHR.responseText);
|
||||
jsonResponse = JSON.stringify(jsonResponse, null, 4);
|
||||
} catch (e) {
|
||||
jsonResponse = escape(jqXHR.responseText);
|
||||
}
|
||||
|
||||
if (jsonResponse)
|
||||
message += "<br>" + jsonResponse;
|
||||
|
||||
// flicker on previous error to make clear that there is a new response
|
||||
if($root.find(".sample-request-response").is(":visible"))
|
||||
$root.find(".sample-request-response").fadeTo(1, 0.1);
|
||||
|
||||
$root.find(".sample-request-response").fadeTo(250, 1);
|
||||
$root.find(".sample-request-response-json").html(message);
|
||||
refreshScrollSpy();
|
||||
};
|
||||
}
|
||||
|
||||
function clearSampleRequest(group, name, version)
|
||||
{
|
||||
var $root = $('article[data-group="' + group + '"][data-name="' + name + '"][data-version="' + version + '"]');
|
||||
|
||||
// hide sample response
|
||||
$root.find(".sample-request-response-json").html("");
|
||||
$root.find(".sample-request-response").hide();
|
||||
|
||||
// reset value of parameters
|
||||
$root.find(".sample-request-param").each(function(i, element) {
|
||||
element.value = "";
|
||||
});
|
||||
|
||||
// restore default URL
|
||||
var $urlElement = $root.find(".sample-request-url");
|
||||
$urlElement.val($urlElement.prop("defaultValue"));
|
||||
|
||||
refreshScrollSpy();
|
||||
}
|
||||
|
||||
function refreshScrollSpy()
|
||||
{
|
||||
$('[data-spy="scroll"]').each(function () {
|
||||
$(this).scrollspy("refresh");
|
||||
});
|
||||
}
|
||||
|
||||
function escapeHtml(str) {
|
||||
var div = document.createElement("div");
|
||||
div.appendChild(document.createTextNode(str));
|
||||
return div.innerHTML;
|
||||
}
|
||||
|
||||
/**
|
||||
* Exports.
|
||||
*/
|
||||
return {
|
||||
initDynamic: initDynamic
|
||||
};
|
||||
|
||||
});
|
||||
Reference in New Issue
Block a user