diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index ecb748ed2..b81bbb3ba 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -3,13 +3,15 @@ var _ = require('lodash'); var cx = require('classnames'); var Markdown = require('naturalcrit/markdown.js'); +var ErrorBar = require('./errorBar/errorBar.jsx'); var PAGE_HEIGHT = 1056 + 30; var BrewRenderer = React.createClass({ getDefaultProps: function() { return { - text : '' + text : '', + errors : [] }; }, getInitialState: function() { @@ -75,20 +77,6 @@ var BrewRenderer = React.createClass({ }, renderPage : function(pageText, index){ - - var html = Markdown.render(pageText) - - var checkHTML = function(html) { - var doc = document.createElement('div'); - doc.innerHTML = html; - console.log(doc.innerHTML); - return ( doc.innerHTML === html ); - } - - console.log('page', index, checkHTML(html)); - - - return
}, @@ -96,17 +84,6 @@ var BrewRenderer = React.createClass({ var pages = this.props.text.split('\\page'); this.totalPages = pages.length; - - //TESTING VALIDATION - try{ - var temp = Markdown.validate(this.props.text); - - console.log(temp); - }catch(e){ - console.log('ERR', e); - } - - return _.map(pages, (page, index)=>{ if(this.shouldRender(page, index)){ return this.renderPage(page, index); @@ -122,6 +99,8 @@ var BrewRenderer = React.createClass({ ref='main' style={{height : this.state.height}}> + +
{this.renderPages()}
diff --git a/client/homebrew/brewRenderer/errorBar/errorBar.jsx b/client/homebrew/brewRenderer/errorBar/errorBar.jsx new file mode 100644 index 000000000..123eaf728 --- /dev/null +++ b/client/homebrew/brewRenderer/errorBar/errorBar.jsx @@ -0,0 +1,72 @@ +var React = require('react'); +var _ = require('lodash'); +var cx = require('classnames'); + +var ErrorBar = React.createClass({ + getDefaultProps: function() { + return { + errors : [] + }; + }, + + hasOpenError : false, + hasCloseError : false, + hasMatchError : false, + + renderErrors : function(){ + this.hasOpenError = false; + this.hasCloseError = false; + this.hasMatchError = false; + + + var errors = _.map(this.props.errors, (err, idx) => { + if(err.id == 'OPEN') this.hasOpenError = true; + if(err.id == 'CLOSE') this.hasCloseError = true; + if(err.id == 'MISMATCH') this.hasMatchError = true; + return
  • + Line {err.line} : {err.text}, '{err.type}' tag +
  • + }); + + return + }, + + renderProtip : function(){ + var msg = []; + if(this.hasOpenError){ + msg.push(
    + An unmatched opening tag means there's an opened tag that isn't closed, you need to close a tag, like this {'
    '}. Make sure to match types! +
    ); + } + + if(this.hasCloseError){ + msg.push(
    + An unmatched closing tag means you closed a tag without opening it. Either remove it, you check to where you think you opened it. +
    ); + } + + if(this.hasMatchError){ + msg.push(
    + A type mismatch means you closed a tag, but the last open tag was a different type. +
    ); + } + return
    +

    Protips!

    + {msg} +
    + }, + + render : function(){ + if(!this.props.errors.length) return null; + + return
    + +

    There are HTML errors in your markup

    + {this.renderErrors()} +
    + {this.renderProtip()} +
    + } +}); + +module.exports = ErrorBar; diff --git a/client/homebrew/brewRenderer/errorBar/errorBar.less b/client/homebrew/brewRenderer/errorBar/errorBar.less new file mode 100644 index 000000000..79d2a0ccc --- /dev/null +++ b/client/homebrew/brewRenderer/errorBar/errorBar.less @@ -0,0 +1,56 @@ + +.errorBar{ + position : absolute; + z-index : 10000; + box-sizing : border-box; + width : 100%; + margin-right : 13px; + padding : 20px; + padding-bottom : 10px; + padding-left : 100px; + background-color : @red; + color : white; + i{ + position : absolute; + left : 30px; + opacity : 0.8; + font-size : 3em; + } + h3{ + font-size : 1.1em; + font-weight : 800; + } + ul{ + margin-top : 15px; + font-size : 0.8em; + list-style-position : inside; + list-style-type : disc; + li{ + line-height : 1.6em; + } + } + hr{ + box-sizing : border-box; + height : 2px; + width : 150%; + margin-top : 25px; + margin-bottom : 15px; + margin-left : -100px; + background-color : darken(@red, 8%); + border : none; + } + .protips{ + margin-left : -80px; + font-size : 0.6em; + &>div{ + margin-bottom : 10px; + line-height : 1.2em; + } + h4{ + opacity : 0.8; + font-weight : 800; + line-height : 1.5em; + text-transform : uppercase; + } + } +} \ No newline at end of file diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx index d664f88dc..242d2c736 100644 --- a/client/homebrew/pages/newPage/newPage.jsx +++ b/client/homebrew/pages/newPage/newPage.jsx @@ -8,7 +8,7 @@ var Navbar = require('../../navbar/navbar.jsx'); var EditTitle = require('../../navbar/editTitle.navitem.jsx'); var IssueNavItem = require('../../navbar/issue.navitem.jsx'); - +var Markdown = require('naturalcrit/markdown.js'); var SplitPane = require('naturalcrit/splitPane/splitPane.jsx'); var Editor = require('../../editor/editor.jsx'); var BrewRenderer = require('../../brewRenderer/brewRenderer.jsx'); @@ -22,7 +22,8 @@ var NewPage = React.createClass({ ver : '0.0.0', title : '', text: '', - isSaving : false + isSaving : false, + errors : [] }; }, @@ -57,7 +58,8 @@ var NewPage = React.createClass({ handleTextChange : function(text){ this.setState({ - text : text + text : text, + errors : Markdown.validate(text) }); localStorage.setItem(KEY, text); }, @@ -66,6 +68,7 @@ var NewPage = React.createClass({ this.setState({ isSaving : true }); + request.post('/api') .send({ title : this.state.title, @@ -112,13 +115,13 @@ var NewPage = React.createClass({ }, render : function(){ + console.log(this.state.errors); return
    {this.renderNavbar()} -
    - +
    diff --git a/shared/naturalcrit/markdown.js b/shared/naturalcrit/markdown.js index fb4657f53..fcb8d6ef2 100644 --- a/shared/naturalcrit/markdown.js +++ b/shared/naturalcrit/markdown.js @@ -47,7 +47,8 @@ module.exports = { errors.push({ line : lineNumber, type : type, - err : 'Unmatched closing tag' + text : 'Unmatched closing tag', + id : 'CLOSE' }); }else if(_.last(acc).type == type){ acc.pop(); @@ -55,7 +56,8 @@ module.exports = { errors.push({ line : _.last(acc).line + ' to ' + lineNumber, type : type, - err : 'Type mismatch on closing tag' + text : 'Type mismatch on closing tag', + id : 'MISMATCH' }); acc.pop(); } @@ -69,7 +71,8 @@ module.exports = { errors.push({ line : unmatched.line, type : unmatched.type, - err : "Unmatched opening tag" + text : "Unmatched opening tag", + id : 'OPEN' }) });