From c470bed5917b4af7dde8633cfd8086a1e80abbcf Mon Sep 17 00:00:00 2001 From: Scott Tolksdorf Date: Wed, 11 Jan 2017 20:17:52 -0800 Subject: [PATCH 01/20] 'Created --- package.json | 3 +- shared/homebrewery/markdown.new.js | 82 ++++++++++++++++++++++++++++++ test/markdown.test.js | 20 ++++++++ 3 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 shared/homebrewery/markdown.new.js diff --git a/package.json b/package.json index 02d5ab8..1b9005b 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/shared/homebrewery/markdown.new.js b/shared/homebrewery/markdown.new.js new file mode 100644 index 0000000..fcb8d6e --- /dev/null +++ b/shared/homebrewery/markdown.new.js @@ -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), '')){ + var openTag = html.substring(0, html.indexOf('>')+1); + html = html.substring(html.indexOf('>')+1); + html = html.substring(0, html.lastIndexOf('')); + return `${openTag} ${Markdown(html)} `; + } + return html; +}; + + +const tagTypes = ['div', 'span', 'a']; +const tagRegex = new RegExp('(' + + _.map(tagTypes, (type)=>{ + return `\\<${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 === ``){ + 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; + }, +}; + diff --git a/test/markdown.test.js b/test/markdown.test.js index e69de29..7ab0f8d 100644 --- a/test/markdown.test.js +++ b/test/markdown.test.js @@ -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 +
cool stuff
+ test2 + `) + console.log(res); + + + + }); + +}); \ No newline at end of file From 97c0443c76f739ad20bf26376e7f86e912684ab6 Mon Sep 17 00:00:00 2001 From: Scott Tolksdorf Date: Wed, 11 Jan 2017 20:27:23 -0800 Subject: [PATCH 02/20] Fixed bug where new page was storing null brews --- shared/homebrewery/brew.store.js | 1 + 1 file changed, 1 insertion(+) diff --git a/shared/homebrewery/brew.store.js b/shared/homebrewery/brew.store.js index d4885aa..5b74495 100644 --- a/shared/homebrewery/brew.store.js +++ b/shared/homebrewery/brew.store.js @@ -30,6 +30,7 @@ const Store = flux.createStore({ State.brew = brew; }, UPDATE_BREW_TEXT : (brewText) => { + console.log(State); State.brew.text = brewText; State.errors = Markdown.validate(brewText); }, From c8b089f7fb8a04b9a95d55f494a634e089f6531f Mon Sep 17 00:00:00 2001 From: Scott Tolksdorf Date: Thu, 12 Jan 2017 01:19:08 -0500 Subject: [PATCH 03/20] Added new lexer for handling the new block syntax --- shared/homebrewery/brew.store.js | 3 +- .../homebrewery/brewRenderer/brewRenderer.jsx | 2 +- shared/homebrewery/markdown.new.js | 59 ++++++++++++++++--- shared/naturalcrit/codeEditor/codeEditor.jsx | 2 +- 4 files changed, 53 insertions(+), 13 deletions(-) diff --git a/shared/homebrewery/brew.store.js b/shared/homebrewery/brew.store.js index 5b74495..483eba5 100644 --- a/shared/homebrewery/brew.store.js +++ b/shared/homebrewery/brew.store.js @@ -1,7 +1,7 @@ const _ = require('lodash'); const flux = require('pico-flux'); -const Markdown = require('homebrewery/markdown.js'); +const Markdown = require('homebrewery/markdown.new.js'); let State = { version : '0.0.0', @@ -30,7 +30,6 @@ const Store = flux.createStore({ State.brew = brew; }, UPDATE_BREW_TEXT : (brewText) => { - console.log(State); State.brew.text = brewText; State.errors = Markdown.validate(brewText); }, diff --git a/shared/homebrewery/brewRenderer/brewRenderer.jsx b/shared/homebrewery/brewRenderer/brewRenderer.jsx index 82dab8f..2b3c893 100644 --- a/shared/homebrewery/brewRenderer/brewRenderer.jsx +++ b/shared/homebrewery/brewRenderer/brewRenderer.jsx @@ -2,7 +2,7 @@ const React = require('react'); const _ = require('lodash'); const cx = require('classnames'); -const Markdown = require('homebrewery/markdown.js'); +const Markdown = require('homebrewery/markdown.new.js'); const ErrorBar = require('./errorBar/errorBar.jsx'); const RenderWarnings = require('homebrewery/renderWarnings/renderWarnings.jsx') diff --git a/shared/homebrewery/markdown.new.js b/shared/homebrewery/markdown.new.js index fcb8d6e..a155e23 100644 --- a/shared/homebrewery/markdown.new.js +++ b/shared/homebrewery/markdown.new.js @@ -1,9 +1,12 @@ -var _ = require('lodash'); -var Markdown = require('marked'); -var renderer = new Markdown.Renderer(); +const _ = require('lodash'); +const Markdown = require('marked'); + + +/* //Processes the markdown within an HTML block if it's just a class-wrapper renderer.html = function (html) { + console.log(html); if(_.startsWith(_.trim(html), '')){ var openTag = html.substring(0, html.indexOf('>')+1); html = html.substring(html.indexOf('>')+1); @@ -12,22 +15,59 @@ renderer.html = function (html) { } return html; }; +*/ -const tagTypes = ['div', 'span', 'a']; -const tagRegex = new RegExp('(' + - _.map(tagTypes, (type)=>{ - return `\\<${type}|\\`; - }).join('|') + ')', 'g'); module.exports = { marked : Markdown, render : (rawBrewText)=>{ - return Markdown(rawBrewText, {renderer : renderer}) + //Adds in the new div block syntax + let count = 0; + let blockReg = /{{\w+|}}/g; + const renderer = new Markdown.Renderer(); + renderer.paragraph = function (text) { + const matches = text.match(blockReg); + if(!matches) return `

${text}

\n`; + let matchIndex = 0; + const res = _.reduce(text.split(blockReg), (r, text) => { + if(text) r.push(`

${text}

\n`); + const block = matches[matchIndex]; + if(block && _.startsWith(block, '{{')){ + r.push(`
`); + count++; + } + if(block == '}}' && count !== 0){ + r.push('
'); + count--; + } + matchIndex++; + return r; + }, []).join('\n'); + return res; + }; + let html = Markdown(rawBrewText, {renderer : renderer, sanitize: true}); + html += _.times(count, ()=>{return ''}).join('\n'); + return html; }, + + + + + + + + + + + + + validate : (rawBrewText) => { + return []; + /* var errors = []; var leftovers = _.reduce(rawBrewText.split('\n'), (acc, line, _lineNumber) => { var lineNumber = _lineNumber + 1; @@ -77,6 +117,7 @@ module.exports = { }); return errors; + */ }, }; diff --git a/shared/naturalcrit/codeEditor/codeEditor.jsx b/shared/naturalcrit/codeEditor/codeEditor.jsx index c090757..c03c7ad 100644 --- a/shared/naturalcrit/codeEditor/codeEditor.jsx +++ b/shared/naturalcrit/codeEditor/codeEditor.jsx @@ -29,7 +29,7 @@ var CodeEditor = React.createClass({ value : this.props.value, lineNumbers: true, lineWrapping : this.props.wrap, - mode : this.props.language + mode : this.props.language, }); this.codeMirror.on('change', this.handleChange); From b1db8040a4cef1df451f72600f8af3fdd7c2b2a9 Mon Sep 17 00:00:00 2001 From: Scott Tolksdorf Date: Thu, 12 Jan 2017 01:31:26 -0500 Subject: [PATCH 04/20] Added a todo for generic line styling --- shared/homebrewery/brewEditor/brewEditor.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/shared/homebrewery/brewEditor/brewEditor.jsx b/shared/homebrewery/brewEditor/brewEditor.jsx index b321cd0..1f1a2fc 100644 --- a/shared/homebrewery/brewEditor/brewEditor.jsx +++ b/shared/homebrewery/brewEditor/brewEditor.jsx @@ -76,6 +76,7 @@ const BrewEditor = React.createClass({ this.refs.codeEditor.updateSize(); }, + //TODO: convert this into a generic function for columns and blocks highlightPageLines : function(){ if(!this.refs.codeEditor) return; const codeMirror = this.refs.codeEditor.codeMirror; From 76ced9ca49db0198341b69ae1e266940f049fe8e Mon Sep 17 00:00:00 2001 From: Scott Tolksdorf Date: Sun, 22 Jan 2017 13:56:57 -0500 Subject: [PATCH 05/20] Added comma parsing to the block code --- shared/homebrewery/markdown.new.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shared/homebrewery/markdown.new.js b/shared/homebrewery/markdown.new.js index a155e23..a990d15 100644 --- a/shared/homebrewery/markdown.new.js +++ b/shared/homebrewery/markdown.new.js @@ -25,7 +25,7 @@ module.exports = { render : (rawBrewText)=>{ //Adds in the new div block syntax let count = 0; - let blockReg = /{{\w+|}}/g; + let blockReg = /{{[\w|,]+|}}/g; const renderer = new Markdown.Renderer(); renderer.paragraph = function (text) { const matches = text.match(blockReg); @@ -35,7 +35,7 @@ module.exports = { if(text) r.push(`

${text}

\n`); const block = matches[matchIndex]; if(block && _.startsWith(block, '{{')){ - r.push(`
`); + r.push(`
`); count++; } if(block == '}}' && count !== 0){ From 22d9982888b9415eb5a3d9eb2c362d339bbb2690 Mon Sep 17 00:00:00 2001 From: Scott Tolksdorf Date: Wed, 25 Jan 2017 23:39:17 -0500 Subject: [PATCH 06/20] Added support for title description and thumbnail images --- client/homebrew/pages/sharePage/sharePage.jsx | 21 +++++++++++++++++++ server/brew.data.js | 1 + .../metadataEditor/metadataEditor.jsx | 11 +++++----- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/client/homebrew/pages/sharePage/sharePage.jsx b/client/homebrew/pages/sharePage/sharePage.jsx index 56d6f13..1f86cbe 100644 --- a/client/homebrew/pages/sharePage/sharePage.jsx +++ b/client/homebrew/pages/sharePage/sharePage.jsx @@ -15,6 +15,8 @@ const Utils = require('homebrewery/utils.js'); const Actions = require('homebrewery/brew.actions.js'); const Store = require('homebrewery/brew.store.js'); +const Headtags = require('vitreum/headtags'); + const SharePage = React.createClass({ getDefaultProps: function() { return { @@ -39,9 +41,28 @@ const SharePage = React.createClass({ p : Actions.print }), + renderMetatags : function(brew){ + let metatags = [ + , + + ]; + if(brew.title){ + metatags.push(); + } + if(brew.description){ + metatags.push(); + } + if(brew.thumbnail){ + metatags.push(); + } + return metatags; + }, + render : function(){ const brew = Store.getBrew(); return
+ {this.renderMetatags(brew)} + {brew.title} diff --git a/server/brew.data.js b/server/brew.data.js index c6e92ee..a040468 100644 --- a/server/brew.data.js +++ b/server/brew.data.js @@ -14,6 +14,7 @@ const BrewSchema = mongoose.Schema({ title : {type : String, default : ""}, description : {type : String, default : ""}, tags : {type : String, default : ""}, + thumbnail : {type : String, default : ""}, systems : [String], authors : [String], published : {type : Boolean, default : false}, diff --git a/shared/homebrewery/brewEditor/metadataEditor/metadataEditor.jsx b/shared/homebrewery/brewEditor/metadataEditor/metadataEditor.jsx index 694e9db..2afa0e2 100644 --- a/shared/homebrewery/brewEditor/metadataEditor/metadataEditor.jsx +++ b/shared/homebrewery/brewEditor/metadataEditor/metadataEditor.jsx @@ -139,13 +139,12 @@ const MetadataEditor = React.createClass({