1
0
mirror of https://github.com/stolksdorf/homebrewery.git synced 2025-12-13 03:25:56 +00:00
This commit is contained in:
Scott Tolksdorf
2017-01-11 20:17:52 -08:00
parent 4593099914
commit c470bed591
3 changed files with 104 additions and 1 deletions

View File

@@ -12,7 +12,8 @@
"postinstall": "npm run build",
"start": "node server.js",
"test": "mocha test",
"test:dev": "nodemon -x mocha test || exit 0"
"test:dev": "nodemon -x mocha test || exit 0",
"test:markdown": "nodemon -x mocha test/markdown.test.js || exit 0"
},
"author": "stolksdorf",
"license": "MIT",

View File

@@ -0,0 +1,82 @@
var _ = require('lodash');
var Markdown = require('marked');
var renderer = new Markdown.Renderer();
//Processes the markdown within an HTML block if it's just a class-wrapper
renderer.html = function (html) {
if(_.startsWith(_.trim(html), '<div') && _.endsWith(_.trim(html), '</div>')){
var openTag = html.substring(0, html.indexOf('>')+1);
html = html.substring(html.indexOf('>')+1);
html = html.substring(0, html.lastIndexOf('</div>'));
return `${openTag} ${Markdown(html)} </div>`;
}
return html;
};
const tagTypes = ['div', 'span', 'a'];
const tagRegex = new RegExp('(' +
_.map(tagTypes, (type)=>{
return `\\<${type}|\\</${type}>`;
}).join('|') + ')', 'g');
module.exports = {
marked : Markdown,
render : (rawBrewText)=>{
return Markdown(rawBrewText, {renderer : renderer})
},
validate : (rawBrewText) => {
var errors = [];
var leftovers = _.reduce(rawBrewText.split('\n'), (acc, line, _lineNumber) => {
var lineNumber = _lineNumber + 1;
var matches = line.match(tagRegex);
if(!matches || !matches.length) return acc;
_.each(matches, (match)=>{
_.each(tagTypes, (type)=>{
if(match == `<${type}`){
acc.push({
type : type,
line : lineNumber
});
}
if(match === `</${type}>`){
if(!acc.length){
errors.push({
line : lineNumber,
type : type,
text : 'Unmatched closing tag',
id : 'CLOSE'
});
}else if(_.last(acc).type == type){
acc.pop();
}else{
errors.push({
line : _.last(acc).line + ' to ' + lineNumber,
type : type,
text : 'Type mismatch on closing tag',
id : 'MISMATCH'
});
acc.pop();
}
}
});
});
return acc;
}, []);
_.each(leftovers, (unmatched)=>{
errors.push({
line : unmatched.line,
type : unmatched.type,
text : "Unmatched opening tag",
id : 'OPEN'
})
});
return errors;
},
};

View File

@@ -0,0 +1,20 @@
const testing = require('./test.init.js');
const Markdown = require('../shared/homebrewery/markdown.new.js');
describe('Markdown', ()=>{
it('should do a thing', ()=>{
const res = Markdown.render(`
test
<div> cool stuff </div>
test2
`)
console.log(res);
});
});