diff --git a/client/homebrew/editor/editor.jsx b/client/homebrew/editor/editor.jsx index 27737fcba..dedfeaebb 100644 --- a/client/homebrew/editor/editor.jsx +++ b/client/homebrew/editor/editor.jsx @@ -21,6 +21,7 @@ const DEFAULT_STYLE_TEXT = dedent` color: black; }`; +const DEFAULT_SNIPPET_TEXT = ``; let isJumping = false; const Editor = createClass({ @@ -35,6 +36,7 @@ const Editor = createClass({ onTextChange : ()=>{}, onStyleChange : ()=>{}, onMetaChange : ()=>{}, + onSnipChange : ()=>{}, reportError : ()=>{}, onCursorPageChange : ()=>{}, @@ -51,7 +53,7 @@ const Editor = createClass({ getInitialState : function() { return { editorTheme : this.props.editorTheme, - view : 'text' //'text', 'style', 'meta' + view : 'text' //'text', 'style', 'meta', 'snip' }; }, @@ -61,6 +63,7 @@ const Editor = createClass({ isText : function() {return this.state.view == 'text';}, isStyle : function() {return this.state.view == 'style';}, isMeta : function() {return this.state.view == 'meta';}, + isSnip : function() {return this.state.view == 'snip';}, componentDidMount : function() { @@ -459,6 +462,20 @@ const Editor = createClass({ userThemes={this.props.userThemes}/> ; } + + if(this.isSnip()){ + return <> + + ; + } }, redo : function(){ diff --git a/client/homebrew/editor/snippetbar/snippetbar.jsx b/client/homebrew/editor/snippetbar/snippetbar.jsx index 111b4fd38..bb932c0fe 100644 --- a/client/homebrew/editor/snippetbar/snippetbar.jsx +++ b/client/homebrew/editor/snippetbar/snippetbar.jsx @@ -41,6 +41,7 @@ const Snippetbar = createClass({ unfoldCode : ()=>{}, updateEditorTheme : ()=>{}, cursorPos : {}, + themeBundle : [], updateBrew : ()=>{} }; }, @@ -64,7 +65,7 @@ const Snippetbar = createClass({ }, componentDidUpdate : async function(prevProps, prevState) { - if(prevProps.renderer != this.props.renderer || prevProps.theme != this.props.theme || prevProps.snippetBundle != this.props.snippetBundle) { + if(prevProps.renderer != this.props.renderer || prevProps.theme != this.props.theme || prevProps.themeBundle != this.props.themeBundle) { this.setState({ snippets : this.compileSnippets() }); @@ -101,15 +102,12 @@ const Snippetbar = createClass({ }, compileSnippets : function() { - console.log('compileSnippets'); let compiledSnippets = []; let oldSnippets = _.keyBy(compiledSnippets, 'groupName'); - console.log(this.props.themesBundle); - - if( this.props.themesBundle) { - for (let snippets of this.props?.themesBundle?.snippets) { + if(this.props.themeBundle.snippets) { + for (let snippets of this.props.themeBundle.snippets) { if(typeof(snippets) == 'string') // load staticThemes as needed; they were sent as just a file name snippets = ThemeSnippets[snippets]; @@ -119,8 +117,8 @@ const Snippetbar = createClass({ oldSnippets = _.keyBy(compiledSnippets, 'groupName'); } } - console.log(this.props.themesBundle); - const userSnippetsasJSON = brewSnippetsToJSON(this.props.brew.title, this.props.brew.snippets, this.props?.themesBundle?.snippets); + + const userSnippetsasJSON = brewSnippetsToJSON(this.props.brew.title, this.props.brew.snippets, this.props.themeBundle.snippets); compiledSnippets.push(userSnippetsasJSON); return compiledSnippets; @@ -266,6 +264,10 @@ const Snippetbar = createClass({ onClick={()=>this.props.onViewChange('meta')}> +
this.props.onViewChange('snip')}> + +
; diff --git a/client/homebrew/editor/snippetbar/snippetbar.less b/client/homebrew/editor/snippetbar/snippetbar.less index 319cd0cad..a7202c428 100644 --- a/client/homebrew/editor/snippetbar/snippetbar.less +++ b/client/homebrew/editor/snippetbar/snippetbar.less @@ -48,6 +48,9 @@ &.meta { .tooltipLeft('Properties'); } + &.snip { + .tooltipLeft('Snippets'); + } &.undo { .tooltipLeft('Undo'); font-size : 0.75em; diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index a98b16717..df840bc48 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -61,7 +61,6 @@ const EditPage = createClass({ currentEditorCursorPageNum : 1, currentBrewRendererPageNum : 1, displayLockMessage : this.props.brew.lock || false, - snippetsBundle : {}, themeBundle : {} }; }, @@ -143,6 +142,19 @@ const EditPage = createClass({ }), ()=>{if(this.state.autoSave) this.trySave();}); }, + handleSnipChange : function(snippet){ + console.log('Snip Change!'); + //If there are errors, run the validator on every change to give quick feedback + let htmlErrors = this.state.htmlErrors; + if(htmlErrors.length) htmlErrors = Markdown.validate(snippet); + + this.setState((prevState)=>({ + brew : { ...prevState.brew, snippets: snippet }, + isPending : true, + htmlErrors : htmlErrors, + }), ()=>{if(this.state.autoSave) this.trySave();}); + }, + handleStyleChange : function(style){ this.setState((prevState)=>({ brew : { ...prevState.brew, style: style }, @@ -438,11 +450,12 @@ const EditPage = createClass({ onTextChange={this.handleTextChange} onStyleChange={this.handleStyleChange} onMetaChange={this.handleMetaChange} + onSnipChange={this.handleSnipChange} reportError={this.errorReported} renderer={this.state.brew.renderer} userThemes={this.props.userThemes} snippets={this.props.snippets} - snippetBundle={this.state.themeBundle.snippets} + themeBundle={this.state.themeBundle} updateBrew={this.updateBrew} onCursorPageChange={this.handleEditorCursorPageChange} onViewPageChange={this.handleEditorViewPageChange} diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 685415c14..9c4f55ef7 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -304,7 +304,9 @@ const api = { } //=== Static Themes ===// else { + const localSnippets = `${req.params.renderer}_${req.params.id}`; // Just log the name for loading on client const localStyle = `@import url(\"/themes/${req.params.renderer}/${req.params.id}/style.css\");`; + completeSnippets.push(localSnippets); completeStyles.push(`/* From Theme ${req.params.id} */\n\n${localStyle}`); req.params.id = Themes[req.params.renderer][req.params.id].baseTheme; diff --git a/shared/helpers.js b/shared/helpers.js index d5a4512a6..27c372dd7 100644 --- a/shared/helpers.js +++ b/shared/helpers.js @@ -8,29 +8,26 @@ const brewSnippetsToJSON = (menuTitle, userBrewSnippets, themeBundleSnippets)=>{ const textSplit = /^\\page/gm; const mpAsSnippets = []; // Snippets from Themes first. - //console.log(themeBundleSnippets); if(themeBundleSnippets) { - console.log('Looping!'); for (let themes of themeBundleSnippets) { - const userSnippets = []; - console.log(themes); - for (let snips of themes.snippets.split(textSplit)) { - const name = snips.split('\n')[0]; + if(typeof themes !== 'string') { + const userSnippets = []; + const name = themes.snippets.split('\n')[0]; if(name.length != 0) { userSnippets.push({ - name : name, + name : name.slice('\snippets '.length), icon : '', - gen : snips.split('\n').slice(0), + gen : themes.snippets.slice(name.length + 1), + }); + } + if(userSnippets.length > 0) { + mpAsSnippets.push({ + name : themes.name, + icon : '', + gen : '', + subsnippets : userSnippets }); } - } - if(userSnippets.length > 0) { - mpAsSnippets.push({ - name : themes.name, - icon : '', - gen : '', - subsnippets : userSnippets - }); } } }