@phoenix-plugin-registry/hirse.outline-list
Version:
Displays a list of the functions or definitions in the currently opened document. Works with CSS, CoffeeScript, HTML, Haxe, Jade, JavaScript, JSX, LESS, Markdown, PHP, Python, Ruby, SCSS, SVG, Stylus, and XML.
137 lines (129 loc) • 5.07 kB
JavaScript
define(function Haxe(require, exports, module) {
"use strict";
/** @const {string} Placeholder for unnamed functions. */
var UNNAMED_PLACEHOLDER = "function";
/**
* Get the visibility class based on the function name.
* @private
* @param {string} name List entry name.
* @param {string} type List entry type.
* @param {boolean} isPrivate Flag if the entry is private.
* @param {boolean} isStatic Flag if the entry is private.
* @param {boolean} isRegion Flag if the entry is a region.
* @returns {string} CSS visibility class.
*/
function _getVisibilityClass(name, type, isPrivate, isStatic, isRegion) {
var visClass = "";
if (isRegion) {
visClass += " outline-entry-region";
} else {
if (isStatic) {
visClass = " outline-entry-static";
}
if (name === UNNAMED_PLACEHOLDER) {
visClass += " outline-entry-unnamed";
} else {
visClass += " outline-entry-" + (isPrivate ? "private" : "public");
}
if (type !== "") {
visClass += " outline-entry-class";
}
}
return visClass;
}
/**
* Create the HTML list entry.
* @private
* @param {string} name List entry name.
* @param {string} type List entry type.
* @param {boolean} isPrivate Flag if the entry is private.
* @param {boolean} isStatic Flag if the entry is private.
* @param {boolean} isRegion Flag if the entry is a region.
* @param {string} args Arguments as single string.
* @param {number} line Line number.
* @param {number} ch Character number.
* @returns {object} Entry object with an $html property.
*/
function _createListEntry(name, type, isPrivate, isStatic, isRegion, args, line, ch) {
var $elements = [];
var $name = $(document.createElement("span"));
$name.addClass("outline-entry-name");
$name.text(name);
$elements.push($name);
var $arguments = $(document.createElement("span"));
$arguments.addClass("outline-entry-arg");
$arguments.text(args);
$elements.push($arguments);
return {
name: name,
line: line,
ch: ch,
classes: "outline-entry-hx outline-entry-icon" + _getVisibilityClass(name, type, isPrivate, isStatic, isRegion),
$html: $elements
};
}
/**
* Add surrouding parens to the arguments if missing.
* @private
* @param {string} args String of arguments.
* @returns {string} String of arguments with parens.
*/
function _surroundArgs(args) {
if (args[0] !== "(") {
args = "(" + args + ")";
}
return args;
}
/**
* Create the entry list of functions language dependent.
* @param {string} text Documents text with normalized line endings.
* @returns {object[]} List of outline entries.
*/
function getOutlineList(text) {
var lines = text.replace(/\)((?:[^\S\n]*\n)+)\s*\{/g, "){$1").split("\n");
var regex = /(?:([\w$]+)\s*[=:]\s*)?\s*(?:(public|private)?\s+)?\s*(?:(static)?\s+)?\s*(?:function(?:\s+(?:&\s*)?([\w]+(?:\s*<.*>)?))?\s*(\(.*\))|(?:(class|interface|typedef)\s+)\s*([\w]+(?:\s*<.*>)?))|\/\/\s*(region)\s*(.*)/g;
var result = [];
lines.forEach(function (line, index) {
var match = regex.exec(line);
while (match !== null) {
var name = (match[1] || match[4] || match[7] || match[9] || "").trim();
var isRegion = match[8] === "region";
var isStatic = match[3] === "static";
var isPrivate = !(match[2] === "public");
var type = (match[6] || "").trim();
var args = match[5] ? _surroundArgs(match[5]) : "()";
match = regex.exec(line);
if (name.length === 0) {
name = UNNAMED_PLACEHOLDER;
}
result.push(_createListEntry(name, type, isPrivate, isStatic, isRegion, args, index, line.length));
}
});
return result;
}
/**
* Compare two list entries.
* @param {object} a First list entry object.
* @param {object} b Second list entry object.
* @returns {number} Comparison result.
*/
function compare(a, b) {
if (b === UNNAMED_PLACEHOLDER) {
return -1;
}
if (a === UNNAMED_PLACEHOLDER) {
return 1;
}
if (a > b) {
return 1;
}
if (a < b) {
return -1;
}
return 0;
}
module.exports = {
getOutlineList: getOutlineList,
compare: compare
};
});