0
0
mirror of https://github.com/naturalcrit/homebrewery.git synced 2026-01-13 10:52:46 +00:00

Getting both renderers to play nice

This commit is contained in:
Scott Tolksdorf
2017-02-12 23:35:19 -05:00
parent b40e5bc4c4
commit 304cd0ffcd
22 changed files with 136 additions and 82 deletions

View File

@@ -53,7 +53,13 @@ const Homebrew = React.createClass({
return <PrintPage query={query}/>; return <PrintPage query={query}/>;
}, },
'/new' : <NewPage />, '/new' : <NewPage />,
'/changelog' : <SharePage />, '/changelog' : <SharePage />,
'/test' : <SharePage />,
'/test_old' : <SharePage />,
'*' : <HomePage />, '*' : <HomePage />,
}); });
}, },

View File

@@ -18,19 +18,6 @@ const Store = require('homebrewery/brew.store.js');
const Headtags = require('vitreum/headtags'); const Headtags = require('vitreum/headtags');
const SharePage = React.createClass({ const SharePage = React.createClass({
getDefaultProps: function() {
return {
brew : {
title : '',
text : '',
shareId : null,
createdAt : null,
updatedAt : null,
views : 0
}
};
},
componentDidMount: function() { componentDidMount: function() {
document.addEventListener('keydown', this.handleControlKeys); document.addEventListener('keydown', this.handleControlKeys);
}, },
@@ -78,7 +65,7 @@ const SharePage = React.createClass({
</Nav.section> </Nav.section>
</Navbar> </Navbar>
<div className='content'> <div className='content'>
<BrewRenderer brewText={brew.text} /> <BrewRenderer brew={brew} />
</div> </div>
</div> </div>
} }

View File

@@ -10,12 +10,11 @@
@horizontalRule : #9c2b1b; @horizontalRule : #9c2b1b;
@headerText : #58180D; @headerText : #58180D;
@monsterStatBackground : #FDF1DC; @monsterStatBackground : #FDF1DC;
@page { margin: 0; } @page { margin: 0; }
body { body {
counter-reset : phb-page-numbers; counter-reset : old-phb-page-numbers;
}
*{
-webkit-print-color-adjust : exact;
} }
.useSansSerif(){ .useSansSerif(){
font-family : ScalySans; font-family : ScalySans;
@@ -42,8 +41,11 @@ body {
-moz-column-gap : 1cm; -moz-column-gap : 1cm;
} }
.phb{ .phb{
& *{
-webkit-print-color-adjust : exact;
}
.useColumns(); .useColumns();
counter-increment : phb-page-numbers; counter-increment : old-phb-page-numbers;
position : relative; position : relative;
z-index : 15; z-index : 15;
box-sizing : border-box; box-sizing : border-box;
@@ -299,7 +301,7 @@ body {
color : #c9ad6a; color : #c9ad6a;
text-align : center; text-align : center;
&.auto::after { &.auto::after {
content : counter(phb-page-numbers); content : counter(old-phb-page-numbers);
} }
} }
.footnote{ .footnote{

View File

@@ -11,9 +11,9 @@
"prod": "set NODE_ENV=production&& npm run build", "prod": "set NODE_ENV=production&& npm run build",
"postinstall": "npm run build", "postinstall": "npm run build",
"start": "node server.js", "start": "node server.js",
"test": "mocha test", "test": "mocha tests",
"test:dev": "nodemon -x mocha test || exit 0", "test:dev": "nodemon -x mocha tests || exit 0",
"test:markdown": "nodemon -x mocha test/markdown.test.js || exit 0" "test:markdown": "nodemon -x mocha tests/markdown.test.js || exit 0"
}, },
"author": "stolksdorf", "author": "stolksdorf",
"license": "MIT", "license": "MIT",

View File

@@ -1,4 +1,5 @@
const _ = require('lodash'); const _ = require('lodash');
const fs = require('fs');
const config = require('nconf'); const config = require('nconf');
const utils = require('./utils.js'); const utils = require('./utils.js');
const BrewData = require('./brew.data.js'); const BrewData = require('./brew.data.js');
@@ -6,9 +7,12 @@ const router = require('express').Router();
const mw = require('./middleware.js'); const mw = require('./middleware.js');
const docs = { const statics = {
welcomeBrew : require('fs').readFileSync('./welcome.brew.md', 'utf8'), welcomeBrew : fs.readFileSync('./welcome.brew.md', 'utf8'),
changelog : require('fs').readFileSync('./changelog.md', 'utf8'), changelog : fs.readFileSync('./changelog.md', 'utf8'),
testBrew : fs.readFileSync('./statics/test.brew.md', 'utf8'),
oldTest : fs.readFileSync('./statics/oldTest.brew.md', 'utf8'),
}; };
@@ -59,6 +63,7 @@ router.get('/user/:username', (req, res, next) => {
//Search Page //Search Page
router.get('/search', (req, res, next) => { router.get('/search', (req, res, next) => {
//TODO: Double check that the defaults are okay
BrewData.search() BrewData.search()
.then((brews) => { .then((brews) => {
req.brews = brews; req.brews = brews;
@@ -70,7 +75,7 @@ router.get('/search', (req, res, next) => {
//Changelog Page //Changelog Page
router.get('/changelog', (req, res, next) => { router.get('/changelog', (req, res, next) => {
req.brew = { req.brew = {
text : docs.changelog, text : statics.changelog,
title : 'Changelog' title : 'Changelog'
}; };
return next(); return next();
@@ -81,8 +86,26 @@ router.get('/new', renderPage);
//Home Page //Home Page
router.get('/', (req, res, next) => { router.get('/', (req, res, next) => {
req.brew = { text : docs.welcomeBrew }; req.brew = { text : statics.welcomeBrew };
return next(); return next();
}, renderPage); }, renderPage);
//Test pages
router.get('/test', (req, res, next) => {
req.brew = {
text : statics.testBrew
};
return next();
}, renderPage);
router.get('/test_old', (req, res, next) => {
req.brew = {
text : statics.oldTest,
version : 1
};
return next();
}, renderPage);
module.exports = router; module.exports = router;

View File

@@ -2,7 +2,7 @@ const React = require('react');
const _ = require('lodash'); const _ = require('lodash');
const cx = require('classnames'); const cx = require('classnames');
const Markdown = require('homebrewery/markdown.js'); const Markdown = require('depricated/markdown.old.js');
const ErrorBar = require('./errorBar/errorBar.jsx'); const ErrorBar = require('./errorBar/errorBar.jsx');
const RenderWarnings = require('homebrewery/renderWarnings/renderWarnings.jsx') const RenderWarnings = require('homebrewery/renderWarnings/renderWarnings.jsx')
@@ -12,7 +12,7 @@ const Store = require('homebrewery/brew.store.js');
const PAGE_HEIGHT = 1056; const PAGE_HEIGHT = 1056;
const PPR_THRESHOLD = 50; const PPR_THRESHOLD = 50;
const BrewRenderer = React.createClass({ const OLD_BrewRenderer = React.createClass({
getDefaultProps: function() { getDefaultProps: function() {
return { return {
value : '', value : '',
@@ -58,8 +58,9 @@ const BrewRenderer = React.createClass({
if(this.refs.pages && this.refs.pages.firstChild) this.pageHeight = this.refs.pages.firstChild.clientHeight; if(this.refs.pages && this.refs.pages.firstChild) this.pageHeight = this.refs.pages.firstChild.clientHeight;
}, 1); }, 1);
const parentNode = document.querySelector('.page .content');
this.setState({ this.setState({
height : this.refs.main.parentNode.clientHeight, height : parentNode.clientHeight,
isMounted : true isMounted : true
}); });
}, },
@@ -99,7 +100,7 @@ const BrewRenderer = React.createClass({
}, },
renderDummyPage : function(index){ renderDummyPage : function(index){
return <div className='phb' id={`p${index + 1}`} key={index}> return <div className='phb old' id={`p${index + 1}`} key={index}>
<i className='fa fa-spinner fa-spin' /> <i className='fa fa-spinner fa-spin' />
</div> </div>
}, },
@@ -125,12 +126,8 @@ const BrewRenderer = React.createClass({
return this.lastRender; return this.lastRender;
}, },
renderStyle : function(){
},
render : function(){ render : function(){
return <div className='brewRenderer' return <div className='brewRendererOld'
onScroll={this.handleScroll} onScroll={this.handleScroll}
ref='main' ref='main'
style={{height : this.state.height}}> style={{height : this.state.height}}>
@@ -138,8 +135,6 @@ const BrewRenderer = React.createClass({
<ErrorBar errors={this.props.errors} /> <ErrorBar errors={this.props.errors} />
<RenderWarnings /> <RenderWarnings />
<style>{this.props.style}</style>
<div className='pages' ref='pages'> <div className='pages' ref='pages'>
{this.renderPages()} {this.renderPages()}
</div> </div>
@@ -149,4 +144,4 @@ const BrewRenderer = React.createClass({
} }
}); });
module.exports = BrewRenderer; module.exports = OLD_BrewRenderer;

View File

@@ -1,9 +1,10 @@
@import (less) './client/homebrew/phbStyle/phb.style.less'; @import (less) './client/homebrew/phbStyle/phb.style.less';
//@import (less) './shared/depricated/phb.old.css';
.pane{ .pane{
position : relative; position : relative;
} }
.brewRenderer{ .brewRendererOld{
overflow-y : scroll; overflow-y : scroll;
.pageInfo{ .pageInfo{
position : absolute; position : absolute;

View File

@@ -1,7 +1,7 @@
const _ = require('lodash'); const _ = require('lodash');
const flux = require('pico-flux'); const flux = require('pico-flux');
const Markdown = require('homebrewery/markdown.new.js'); const Markdown = require('homebrewery/markdown.js');
let State = { let State = {
version : '0.0.0', version : '0.0.0',
@@ -32,6 +32,8 @@ const Store = flux.createStore({
}, },
UPDATE_BREW_CODE : (brewCode) => { UPDATE_BREW_CODE : (brewCode) => {
State.brew.text = brewCode; State.brew.text = brewCode;
//TODO: Remove?
State.errors = Markdown.validate(brewCode); State.errors = Markdown.validate(brewCode);
}, },
UPDATE_BREW_STYLE : (style) => { UPDATE_BREW_STYLE : (style) => {

View File

@@ -2,6 +2,8 @@ const React = require('react');
const _ = require('lodash'); const _ = require('lodash');
const cx = require('classnames'); const cx = require('classnames');
const OldBrewRenderer = require('depricated/brewRendererOld/brewRendererOld.jsx');
const Markdown = require('homebrewery/markdown.js'); const Markdown = require('homebrewery/markdown.js');
const ErrorBar = require('./errorBar/errorBar.jsx'); const ErrorBar = require('./errorBar/errorBar.jsx');
@@ -15,13 +17,18 @@ const PPR_THRESHOLD = 50;
const BrewRenderer = React.createClass({ const BrewRenderer = React.createClass({
getDefaultProps: function() { getDefaultProps: function() {
return { return {
value : '', brew : {
style : '', text : '',
style : ''
},
//TODO: maybe remove?
errors : [] errors : []
}; };
}, },
getInitialState: function() { getInitialState: function() {
const pages = this.props.value.split('\\page'); const pages = this.props.brew.text.split('\\page');
return { return {
viewablePageNumber: 0, viewablePageNumber: 0,
@@ -37,16 +44,16 @@ const BrewRenderer = React.createClass({
componentDidMount: function() { componentDidMount: function() {
this.updateSize(); this.updateSize();
window.addEventListener("resize", this.updateSize); window.addEventListener('resize', this.updateSize);
}, },
componentWillUnmount: function() { componentWillUnmount: function() {
window.removeEventListener("resize", this.updateSize); window.removeEventListener('resize', this.updateSize);
}, },
componentWillReceiveProps: function(nextProps) { componentWillReceiveProps: function(nextProps) {
if(this.refs.pages && this.refs.pages.firstChild) this.pageHeight = this.refs.pages.firstChild.clientHeight; if(this.refs.pages && this.refs.pages.firstChild) this.pageHeight = this.refs.pages.firstChild.clientHeight;
const pages = nextProps.value.split('\\page'); const pages = nextProps.brew.text.split('\\page');
this.setState({ this.setState({
pages : pages, pages : pages,
usePPR : pages.length >= PPR_THRESHOLD usePPR : pages.length >= PPR_THRESHOLD
@@ -58,6 +65,7 @@ const BrewRenderer = React.createClass({
if(this.refs.pages && this.refs.pages.firstChild) this.pageHeight = this.refs.pages.firstChild.clientHeight; if(this.refs.pages && this.refs.pages.firstChild) this.pageHeight = this.refs.pages.firstChild.clientHeight;
}, 1); }, 1);
this.setState({ this.setState({
height : this.refs.main.parentNode.clientHeight, height : this.refs.main.parentNode.clientHeight,
isMounted : true isMounted : true
@@ -125,11 +133,10 @@ const BrewRenderer = React.createClass({
return this.lastRender; return this.lastRender;
}, },
renderStyle : function(){
},
render : function(){ render : function(){
if(this.props.brew.version == 1) return <OldBrewRenderer value={this.props.brew.text} />;
return <div className='brewRenderer' return <div className='brewRenderer'
onScroll={this.handleScroll} onScroll={this.handleScroll}
ref='main' ref='main'
@@ -139,7 +146,8 @@ const BrewRenderer = React.createClass({
<RenderWarnings /> <RenderWarnings />
<style>{this.props.style}</style> <style>{this.props.brew.style}</style>
<div className='pages' ref='pages'> <div className='pages' ref='pages'>
{this.renderPages()} {this.renderPages()}
</div> </div>

View File

@@ -3,9 +3,16 @@ const BrewRenderer = require('./brewRenderer.jsx');
module.exports = Store.createSmartComponent(BrewRenderer, () => { module.exports = Store.createSmartComponent(BrewRenderer, () => {
const brew = Store.getBrew();
return { return {
value : Store.getBrewCode(), brew : Store.getBrew(),
brewText : Store.getBrewCode(),
style : Store.getBrewStyle(), style : Store.getBrewStyle(),
errors : Store.getErrors() errors : Store.getErrors()
} }
}); });

View File

@@ -2,41 +2,43 @@ const _ = require('lodash');
const Markdown = require('marked'); const Markdown = require('marked');
const renderer = new Markdown.Renderer();
let blockCount = 0;
renderer.paragraph = function(text){
const blockReg = /{{[\w|,]+|}}/g;
const matches = text.match(blockReg);
if(!matches) return `\n<p>${text}</p>\n`;
let matchIndex = 0;
const res = _.reduce(text.split(blockReg), (r, text) => {
if(text) r.push(`\n<p>${text}</p>\n`);
const block = matches[matchIndex];
if(block && _.startsWith(block, '{{')){
r.push(`\n\n<div class="${block.substring(2).split(',').join(' ')}">`);
blockCount++;
}
if(block == '}}' && blockCount !== 0){
r.push('</div>\n\n');
blockCount--;
}
matchIndex++;
return r;
}, []).join('\n');
return res;
};
module.exports = { module.exports = {
marked : Markdown, marked : Markdown,
render : (rawBrewText)=>{ render : (rawBrewText)=>{
//Adds in the new div block syntax blockCount = 0;
let count = 0;
let blockReg = /{{[\w|,]+|}}/g;
const renderer = new Markdown.Renderer();
renderer.paragraph = function (text) {
const matches = text.match(blockReg);
if(!matches) return `\n<p>${text}</p>\n`;
let matchIndex = 0;
const res = _.reduce(text.split(blockReg), (r, text) => {
if(text) r.push(`\n<p>${text}</p>\n`);
const block = matches[matchIndex];
if(block && _.startsWith(block, '{{')){
r.push(`\n\n<div class="${block.substring(2).split(',').join(' ')}">`);
count++;
}
if(block == '}}' && count !== 0){
r.push('</div>\n\n');
count--;
}
matchIndex++;
return r;
}, []).join('\n');
return res;
};
let html = Markdown(rawBrewText, {renderer : renderer, sanitize: true}); let html = Markdown(rawBrewText, {renderer : renderer, sanitize: true});
html += _.times(count, ()=>{return '</div>'}).join('\n'); //Close all hanging block tags
html += _.times(blockCount, ()=>{return '</div>'}).join('\n');
return html; return html;
}, },
validate : (rawBrewText) => { validate : (rawBrewText) => {
return []; return [];
}, },
}; };

1
statics/oldTest.brew.md Normal file
View File

@@ -0,0 +1 @@
# Old test!

6
statics/test.brew.md Normal file
View File

@@ -0,0 +1,6 @@
# Test brew!
hwllo there???
Can you even work?

View File

@@ -8,7 +8,7 @@ module.exports = {
random : (num = 20)=>{ random : (num = 20)=>{
return _.times(num, ()=>{ return _.times(num, ()=>{
//TODO: Build better generator //TODO: Build better generator, use new snippets?
return { return {
title : 'BrewA', title : 'BrewA',
description : '', description : '',
@@ -20,6 +20,20 @@ module.exports = {
}; };
}); });
}, },
old : () => {
return [
{
title : 'OLD - div test',
description : '',
authors : ['old'],
text : `<div class='wide' style='text-align:center'> neato </div>`,
systems : [],
views : 0,
published : true,
version : 1
}
]
},
static : () => { static : () => {
return { return {
BrewA : { BrewA : {

View File

@@ -1,6 +1,6 @@
const testing = require('./test.init.js'); const testing = require('./test.init.js');
const Markdown = require('../shared/homebrewery/markdown.new.js'); const Markdown = require('../shared/homebrewery/markdown.js');
describe('Markdown', ()=>{ describe('Markdown', ()=>{