nyxml
Version:
Lite markup for forum posts
305 lines (233 loc) • 7.44 kB
JavaScript
var fs = require('fs');
var q = require('q');
var nyx = require('./rules.js');
var cssRef = require('./cssReference.json');
var dyn = require('./dynamic.js');
//Append to add more rules to NYX base set
exports.use = function (type, newSet){
if (type == "css") {
} else {
for (each in newSet) {
var error = nyx.add(each, newSet[each]);
if (error) {
return error;
} else {
console.log(nyx.rules());
}
}
}
return true;
}
//Used for converting txt documents written in NYX to HTML
exports.scan = function (path, enclose){
var defer = q.defer();
fs.readFile(path, "utf8", function (err, data){
if (err) {
defer.reject(new Error(error));
} else {
defer = parseNyx(data, enclose, defer);
}
});
return defer.promise;
}
//Used to convert a NYX string into HTML
exports.toHtml = function(data, enclose) {
var defer = q.defer();
defer = parseNyx(data, enclose, defer);
return defer.promise;
}
//Holds the current html being created
var htmlOut = ""
//Keeps track of any tags which are still open
var openTags = [];
//Keeps track of tags which contain nested elements
var dynClose = [];
//Keeps track of the last tag that was added to htmlOut
var prevTag = "";
//Is the current tag nested in another tag?
var nesting = false;
//Is the html contained within a parent div
var masterBox = false;
function htmlConvert (prefix, format, global, enclose){
if (enclose) {
htmlOut = "<div style='" + cssConvert(nyx.rules().set) + prefix + "'>";
openTags.push("div");
} else {
var tag = format.tag;
if (tag == undefined) tag = "div";
var formatting = cssConvert(format, global);
if (formatting == "") {
var style = "";
} else {
style = " style='" + formatting + "'";
}
htmlOut += "<" + tag + style + ">" + format.content;
openTags.push(tag);
}
}
function cssConvert (format, global) {
var output = "";
for (each in format.format) {
var value = format.format[each];
if (value == "default" && !masterBox) {
value = global.set.format[each];
} else if (value == "default" && masterBox) {
continue;
}
var rule = cssRef[each];
var css = rule.css + ":" + value + rule.unit + ";";
output += css;
}
return output
}
function closeTags (all){
var tagCount = openTags.length -1;
if (all){
var i = 0;
while (i <= tagCount) {
var pos = tagCount - i;
var tag = openTags[pos];
var close = "</" + tag + ">";
htmlOut += close;
prevTag = close;
i++;
}
openTags = [];
} else {
var tag = openTags[tagCount];
openTags.splice(-1, 1);
var close = "</" + tag + ">";
htmlOut += close;
prevTag = close;
}
}
function checkPrefix (prefix){
switch (prefix) {
case '_':
return "text-decoration:underline;";
break;
case '^':
return "font-weight:bold;";
break;
case '-':
return "text-decoration:line-through;";
break;
case '/':
return "font-style:italic;";
break;
case '>':
return true;
break;
default:
return false;
}
}
function nestElement (currentTag){
nesting = true;
var outLength = htmlOut.length - 1;
var finalTagLength = prevTag.length - 1;
htmlOut = htmlOut.substring(0, outLength - finalTagLength);
var parentTag = prevTag.substring(2, finalTagLength);
openTags.push(parentTag);
}
function parseNyx (data, inBox, defer){
if (inBox == undefined) inBox = false;
masterBox = inBox;
var lines = data.split('\n');
var rules = nyx.rules();
//Check if no rules have been used
var plain = false;
for (each in lines) {
var line = lines[each];
var prefix = checkPrefix(line[0]);
if (prefix != false) {
line = line.substring(1);
} else {
prefix = "";
}
//Ignore whitespaces
if (!/\S/.test(line)) {
continue;
}
//Check if line is plain text
if (!/\>/.test(line)) {
// if (plain) {
// lines[each - 1];
// }
continue;
}
// element>element
var elements = line.split('>');
var controls = elements[0].split(' ');
var editor = controls[0];
var settings = rules[editor];
if (prefix == true) {
nestElement(settings.tag);
} else if (nesting) {
nesting = false;
closeTags();
}
if (settings == undefined) {
defer.reject(new Error("Editor: " + editor + " is not a recognised editor! - Line " + (+each + +1)));
return false;
}
if (settings.content != undefined) {
settings.content = elements[1];
} else {
settings.content = "";
}
if (line[0] == '>') {
var content = line.substring(1);
htmlOut += " " + content;
}
var setup = false;
var write = true;
var i = 1;
while (i < controls.length) {
var NYXrule = controls[i].split('=');
var option = NYXrule[0];
var value = NYXrule[1];
if (settings.format[option] == undefined) {
defer.reject(new Error("Rule: " + option + " is not a member of: " + editor + " - Line " + (+each + +1)))
} else {
if (editor == "set") {
nyx.set("set,format," + option, value);
settings = rules.set;
setup = true;
write = inBox;
} else {
settings.format[option] = value;
}
}
i++;
}
if (settings.special != undefined) {
if (settings.special == "link") {
if (settings.idLink == dynClose[dynClose.length - 1]) {
dynClose = dynClose.splice(dynClose.length - 1, 1);
write = false;
} else {
write = true;
}
} else {
var dynamic = dyn[settings.special];
settings = dynamic(settings, elements[1]);
if (settings.autoClose == false) {
dynClose.push(settings.id);
}
if (!settings) {
return false;
}
}
}
if (write) {
htmlConvert(prefix, settings, rules, setup);
}
if (settings.autoClose) {
closeTags();
}
}
closeTags(true);
defer.resolve(htmlOut);
return defer;
}