From 9d4d337bb9bfeff61d6e7ef9f0c77ca8f1382501 Mon Sep 17 00:00:00 2001 From: Scott Tolksdorf Date: Sun, 26 Feb 2017 11:53:40 -0500 Subject: [PATCH] Snippet bar has been replaced and new style of snippets being worked on --- changelog.md | 4 + package.json | 2 +- scripts/snippet.test.js | 7 +- shared/homebrewery/brewEditor/brewEditor.jsx | 27 +- shared/homebrewery/brewEditor/brewEditor.less | 2 +- .../brewEditor/menubar/menubar.jsx | 22 +- .../brewEditor/menubar/menubar.less | 5 + .../brewEditor/menubar/snippet.map.js | 48 ++++ .../menubar/snippetGroup/snippetGroup.jsx | 42 +++ .../menubar/snippetGroup/snippetGroup.less | 56 ++++ .../brewEditor/snippetbar/snippetbar.jsx | 94 ------ .../brewEditor/snippetbar/snippetbar.less | 72 ----- .../snippetbar/snippets/classfeature.gen.js | 42 --- .../snippetbar/snippets/classtable.gen.js | 114 -------- .../snippetbar/snippets/coverpage.gen.js | 117 -------- .../snippetbar/snippets/fullclass.gen.js | 43 --- .../snippetbar/snippets/magic.gen.js | 91 ------ .../snippetbar/snippets/monsterblock.gen.js | 196 ------------- .../snippetbar/snippets/snippets.js | 267 ------------------ .../snippets/tableOfContents.gen.js | 72 ----- shared/homebrewery/snippets/brew/index.js | 20 +- .../homebrewery/snippets/brew/random.data.js | 11 +- .../snippets/brew/spell.snippet.js | 13 +- .../snippets/brew/spellname.list.js | 47 --- .../snippets/brew/table.snippet.js | 58 +++- .../homebrewery/snippets/style/a4.snippet.js | 8 + shared/homebrewery/snippets/style/index.js | 6 + .../homebrewery/snippets/style/ink.snippet.js | 9 + 28 files changed, 302 insertions(+), 1193 deletions(-) create mode 100644 shared/homebrewery/brewEditor/menubar/snippet.map.js create mode 100644 shared/homebrewery/brewEditor/menubar/snippetGroup/snippetGroup.jsx create mode 100644 shared/homebrewery/brewEditor/menubar/snippetGroup/snippetGroup.less delete mode 100644 shared/homebrewery/brewEditor/snippetbar/snippetbar.jsx delete mode 100644 shared/homebrewery/brewEditor/snippetbar/snippetbar.less delete mode 100644 shared/homebrewery/brewEditor/snippetbar/snippets/classfeature.gen.js delete mode 100644 shared/homebrewery/brewEditor/snippetbar/snippets/classtable.gen.js delete mode 100644 shared/homebrewery/brewEditor/snippetbar/snippets/coverpage.gen.js delete mode 100644 shared/homebrewery/brewEditor/snippetbar/snippets/fullclass.gen.js delete mode 100644 shared/homebrewery/brewEditor/snippetbar/snippets/magic.gen.js delete mode 100644 shared/homebrewery/brewEditor/snippetbar/snippets/monsterblock.gen.js delete mode 100644 shared/homebrewery/brewEditor/snippetbar/snippets/snippets.js delete mode 100644 shared/homebrewery/brewEditor/snippetbar/snippets/tableOfContents.gen.js delete mode 100644 shared/homebrewery/snippets/brew/spellname.list.js create mode 100644 shared/homebrewery/snippets/style/a4.snippet.js create mode 100644 shared/homebrewery/snippets/style/ink.snippet.js diff --git a/changelog.md b/changelog.md index cc60014..a6da7f7 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,9 @@ # changelog + +The self-discovery aspect of the snippets isn't working out. + + ## BIG NEWS With the next major release of Homebrewery, v3.0.0, this tool *will no longer support raw HTML input for brew code*. Most issues and errors users are having are because of this feature and it's become too taxing to help and fix these issues. diff --git a/package.json b/package.json index 36235ec..50ffe10 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "build": "node scripts/build.js", "populate": "node scripts/populate.js", - "temp" : "nodemon scripts/snippet.test.js", + "snippet" : "nodemon scripts/snippet.test.js", "prod": "set NODE_ENV=production&& npm run build", "postinstall": "npm run build", diff --git a/scripts/snippet.test.js b/scripts/snippet.test.js index e366e41..7cb4bf3 100644 --- a/scripts/snippet.test.js +++ b/scripts/snippet.test.js @@ -1,4 +1,7 @@ -const snippets = require('../shared/homebrewery/snippets/brew'); +const snippets = require('../shared/homebrewery/snippets'); +console.log(snippets); -console.log(snippets.phb.spell.gen()); \ No newline at end of file +console.log(snippets.style.print.a4PageSize()); +console.log(snippets.brew.phb.spell()); +console.log(snippets.brew.phb.table()); \ No newline at end of file diff --git a/shared/homebrewery/brewEditor/brewEditor.jsx b/shared/homebrewery/brewEditor/brewEditor.jsx index 721e481..ab8a81a 100644 --- a/shared/homebrewery/brewEditor/brewEditor.jsx +++ b/shared/homebrewery/brewEditor/brewEditor.jsx @@ -32,6 +32,10 @@ const BrewEditor = React.createClass({ view : 'code', //'code', 'style', 'meta' }; }, + isCode : function(){ return this.state.view == 'code' }, + isStyle : function(){ return this.state.view == 'style' }, + isMeta : function(){ return this.state.view == 'meta' }, + componentDidMount: function() { this.updateEditorSize(); @@ -53,11 +57,16 @@ const BrewEditor = React.createClass({ handleInject : function(injectText){ - const lines = this.props.value.split('\n'); - lines[this.cursorPosition.line] = splice(lines[this.cursorPosition.line], this.cursorPosition.ch, injectText); + const text = (this.isCode() ? this.props.brew.text : this.props.brew.style); - this.handleTextChange(lines.join('\n')); - this.refs.codeEditor.setCursorPosition(this.cursorPosition.line, this.cursorPosition.ch + injectText.length); + const lines = text.split('\n'); + const cursorPos = this.refs.codeEditor.getCursorPosition(); + lines[cursorPos.line] = splice(lines[cursorPos.line], cursorPos.ch, injectText); + + this.refs.codeEditor.setCursorPosition(cursorPos.line, cursorPos.ch + injectText.length); + + if(this.state.view == 'code') this.props.onCodeChange(lines.join('\n')); + if(this.state.view == 'style') this.props.onStyleChange(lines.join('\n')); }, @@ -87,6 +96,9 @@ const BrewEditor = React.createClass({ //MOve this to a util.sj file highlightPageLines : function(){ if(!this.refs.codeEditor) return; + if(!this.isCode()) return; + + const codeMirror = this.refs.codeEditor.codeMirror; const lineNumbers = _.reduce(this.props.brew.text.split('\n'), (r, line, lineNumber)=>{ @@ -116,19 +128,19 @@ const BrewEditor = React.createClass({ renderEditor : function(){ - if(this.state.view == 'meta'){ + if(this.isMeta()){ return } - if(this.state.view == 'style'){ + if(this.isStyle()){ return } - if(this.state.view == 'code'){ + if(this.isCode()){ return diff --git a/shared/homebrewery/brewEditor/brewEditor.less b/shared/homebrewery/brewEditor/brewEditor.less index a47dc69..d54d8f8 100644 --- a/shared/homebrewery/brewEditor/brewEditor.less +++ b/shared/homebrewery/brewEditor/brewEditor.less @@ -9,7 +9,7 @@ border-bottom : #333 solid 1px; } .block{ - color : blue; + color : purple; //font-style: italic; } } diff --git a/shared/homebrewery/brewEditor/menubar/menubar.jsx b/shared/homebrewery/brewEditor/menubar/menubar.jsx index ed47e08..32624a5 100644 --- a/shared/homebrewery/brewEditor/menubar/menubar.jsx +++ b/shared/homebrewery/brewEditor/menubar/menubar.jsx @@ -1,19 +1,37 @@ - const React = require('react'); const _ = require('lodash'); const cx = require('classnames'); +const SnippetMap = require('./snippet.map.js'); +const SnippetGroup = require('./snippetGroup/snippetGroup.jsx'); + +console.log(SnippetMap); const Menubar = React.createClass({ getDefaultProps: function() { return { - view : '', + view : 'code', onViewChange : ()=>{}, onSnippetInject : ()=>{}, }; }, + renderSnippets : function(){ + if(this.props.view == 'meta') return ; + + let mapping; + if(this.props.view == 'code') mapping = SnippetMap.brew; + if(this.props.view == 'style') mapping = SnippetMap.style; + + const groups = _.map(mapping, (group)=>{ + return + }); + + return
{groups}
+ }, render: function(){ return
+ {this.renderSnippets()} +
diff --git a/shared/homebrewery/brewEditor/menubar/menubar.less b/shared/homebrewery/brewEditor/menubar/menubar.less index 653e82c..e857528 100644 --- a/shared/homebrewery/brewEditor/menubar/menubar.less +++ b/shared/homebrewery/brewEditor/menubar/menubar.less @@ -32,4 +32,9 @@ } } } + + .snippets{ + display : flex; + height : 100%; + } } \ No newline at end of file diff --git a/shared/homebrewery/brewEditor/menubar/snippet.map.js b/shared/homebrewery/brewEditor/menubar/snippet.map.js new file mode 100644 index 0000000..85571de --- /dev/null +++ b/shared/homebrewery/brewEditor/menubar/snippet.map.js @@ -0,0 +1,48 @@ +const Snippets = require('homebrewery/snippets'); + +module.exports = { + brew : [ + { + name : 'PHB', + icon : 'fa-book', + snippets : [ + { + name : 'Spell', + icon : 'fa-magic', + gen : Snippets.brew.spell + }, + { + name : 'Table', + icon : 'fa-table', + gen : Snippets.brew.table + }, + + ] + }, + { + name : 'Mods', + icon : 'fa-gear', + snippets : [] + } + ], + + style : [ + { + name : 'Print', + icon : 'fa-print', + snippets : [ + { + name : 'Ink Friendly', + icon : 'fa-tint', + gen : Snippets.style.inkFriendly + }, + { + name : 'A4 Page Size', + icon : 'fa-file', + gen : Snippets.style.a4 + }, + + ] + } + ] +} \ No newline at end of file diff --git a/shared/homebrewery/brewEditor/menubar/snippetGroup/snippetGroup.jsx b/shared/homebrewery/brewEditor/menubar/snippetGroup/snippetGroup.jsx new file mode 100644 index 0000000..8268e0e --- /dev/null +++ b/shared/homebrewery/brewEditor/menubar/snippetGroup/snippetGroup.jsx @@ -0,0 +1,42 @@ + +const React = require('react'); +const _ = require('lodash'); +const cx = require('classnames'); + +const SnippetGroup = React.createClass({ + getDefaultProps: function() { + return { + brew : '', + name : '', + icon : 'fa-rocket', + snippets : [], + onClick : function(){}, + }; + }, + handleSnippetClick : function(snippet){ + this.props.onClick(snippet.gen()); + }, + renderSnippets : function(){ + return _.map(this.props.snippets, (snippet)=>{ + return
+ + {snippet.name} +
+ }) + }, + + render : function(){ + return
+
+ + {this.props.name} +
+
+ {this.renderSnippets()} +
+
+ }, + +}); + +module.exports = SnippetGroup; diff --git a/shared/homebrewery/brewEditor/menubar/snippetGroup/snippetGroup.less b/shared/homebrewery/brewEditor/menubar/snippetGroup/snippetGroup.less new file mode 100644 index 0000000..9dab435 --- /dev/null +++ b/shared/homebrewery/brewEditor/menubar/snippetGroup/snippetGroup.less @@ -0,0 +1,56 @@ +.snippetGroup{ + //display : inline-block; + display : flex; + height : 100%; + align-items : center; + + //height : @menuHeight; + padding : 0px 5px; + cursor : pointer; + font-size : 0.6em; + font-weight : 800; + ///line-height : @menuHeight; + text-transform : uppercase; + border-right : 1px solid black; + i{ + vertical-align : middle; + margin-right : 3px; + font-size : 1.2em; + } + &:hover, &.selected{ + background-color : #999; + } + .text{ + //line-height : @menuHeight; + .groupName{ + font-size : 10px; + } + } + &:hover{ + .dropdown{ + visibility : visible; + } + } + .dropdown{ + position : absolute; + top : 100%; + visibility : hidden; + z-index : 1000; + margin-left : -5px; + padding : 0px; + background-color : #ddd; + .snippet{ + .animate(background-color); + padding : 10px; + cursor : pointer; + font-size : 10px; + i{ + margin-right : 8px; + font-size : 13px; + } + &:hover{ + background-color : #999; + } + } + } +} \ No newline at end of file diff --git a/shared/homebrewery/brewEditor/snippetbar/snippetbar.jsx b/shared/homebrewery/brewEditor/snippetbar/snippetbar.jsx deleted file mode 100644 index 29c6b43..0000000 --- a/shared/homebrewery/brewEditor/snippetbar/snippetbar.jsx +++ /dev/null @@ -1,94 +0,0 @@ -const React = require('react'); -const _ = require('lodash'); -const cx = require('classnames'); - - -const Snippets = require('./snippets/snippets.js'); - -const execute = function(val, brew){ - if(_.isFunction(val)) return val(brew); - return val; -} - - - -const Snippetbar = React.createClass({ - getDefaultProps: function() { - return { - brew : '', - onInject : ()=>{}, - onToggle : ()=>{}, - showmeta : false - }; - }, - - handleSnippetClick : function(injectedText){ - this.props.onInject(injectedText) - }, - - renderSnippetGroups : function(){ - return _.map(Snippets, (snippetGroup)=>{ - return - }) - }, - - render : function(){ - return
- {this.renderSnippetGroups()} -
- -
-
- } -}); - -module.exports = Snippetbar; - - - - - - -const SnippetGroup = React.createClass({ - getDefaultProps: function() { - return { - brew : '', - groupName : '', - icon : 'fa-rocket', - snippets : [], - onSnippetClick : function(){}, - }; - }, - handleSnippetClick : function(snippet){ - this.props.onSnippetClick(execute(snippet.gen, this.props.brew)); - }, - renderSnippets : function(){ - return _.map(this.props.snippets, (snippet)=>{ - return
- - {snippet.name} -
- }) - }, - - render : function(){ - return
-
- - {this.props.groupName} -
-
- {this.renderSnippets()} -
-
- }, - -}); \ No newline at end of file diff --git a/shared/homebrewery/brewEditor/snippetbar/snippetbar.less b/shared/homebrewery/brewEditor/snippetbar/snippetbar.less deleted file mode 100644 index 45a6efe..0000000 --- a/shared/homebrewery/brewEditor/snippetbar/snippetbar.less +++ /dev/null @@ -1,72 +0,0 @@ - -.snippetBar{ - @height : 25px; - position : relative; - height : @height; - background-color : #ddd; - .toggleMeta{ - position : absolute; - top : 0px; - right : 0px; - height : @height; - width : @height; - cursor : pointer; - line-height : @height; - text-align : center; - &:hover, &.selected{ - background-color : #999; - } - } - .snippetGroup{ - display : inline-block; - height : @height; - padding : 0px 5px; - cursor : pointer; - font-size : 0.6em; - font-weight : 800; - line-height : @height; - text-transform : uppercase; - border-right : 1px solid black; - i{ - vertical-align : middle; - margin-right : 3px; - font-size : 1.2em; - } - &:hover, &.selected{ - background-color : #999; - } - .text{ - line-height : @height; - .groupName{ - font-size : 10px; - } - } - &:hover{ - .dropdown{ - visibility : visible; - } - } - .dropdown{ - position : absolute; - top : 100%; - visibility : hidden; - z-index : 1000; - margin-left : -5px; - padding : 0px; - background-color : #ddd; - .snippet{ - .animate(background-color); - padding : 5px; - cursor : pointer; - font-size : 10px; - i{ - margin-right : 8px; - font-size : 13px; - } - &:hover{ - background-color : #999; - } - } - } - } -} \ No newline at end of file diff --git a/shared/homebrewery/brewEditor/snippetbar/snippets/classfeature.gen.js b/shared/homebrewery/brewEditor/snippetbar/snippets/classfeature.gen.js deleted file mode 100644 index 2ca3abc..0000000 --- a/shared/homebrewery/brewEditor/snippetbar/snippets/classfeature.gen.js +++ /dev/null @@ -1,42 +0,0 @@ -var _ = require('lodash'); - -module.exports = function(classname){ - - classname = classname || _.sample(['archivist', 'fancyman', 'linguist', 'fletcher', - 'notary', 'berserker-typist', 'fishmongerer', 'manicurist', 'haberdasher', 'concierge']) - - classname = classname.toLowerCase(); - - var hitDie = _.sample([4, 6, 8, 10, 12]); - - var abilityList = ["Strength", "Dexerity", "Constitution", "Wisdom", "Charisma", "Intelligence"]; - var skillList = ["Acrobatics ", "Animal Handling", "Arcana", "Athletics", "Deception", "History", "Insight", "Intimidation", "Investigation", "Medicine", "Nature", "Perception", "Performance", "Persuasion", "Religion", "Sleight of Hand", "Stealth", "Survival"]; - - - return [ - "## Class Features", - "As a " + classname + ", you gain the following class features", - "#### Hit Points", - "___", - "- **Hit Dice:** 1d" + hitDie + " per " + classname + " level", - "- **Hit Points at 1st Level:** " + hitDie + " + your Constitution modifier", - "- **Hit Points at Higher Levels:** 1d" + hitDie + " (or " + (hitDie/2 + 1) + ") + your Constitution modifier per " + classname + " level after 1st", - "", - "#### Proficiencies", - "___", - "- **Armor:** " + (_.sampleSize(["Light armor", "Medium armor", "Heavy armor", "Shields"], _.random(0,3)).join(', ') || "None"), - "- **Weapons:** " + (_.sampleSize(["Squeegee", "Rubber Chicken", "Simple weapons", "Martial weapons"], _.random(0,2)).join(', ') || "None"), - "- **Tools:** " + (_.sampleSize(["Artian's tools", "one musical instrument", "Thieve's tools"], _.random(0,2)).join(', ') || "None"), - "", - "___", - "- **Saving Throws:** " + (_.sampleSize(abilityList, 2).join(', ')), - "- **Skills:** Choose two from " + (_.sampleSize(skillList, _.random(4, 6)).join(', ')), - "", - "#### Equipment", - "You start with the following equipment, in addition to the equipment granted by your background:", - "- *(a)* a martial weapon and a shield or *(b)* two martial weapons", - "- *(a)* five javelins or *(b)* any simple melee weapon", - "- " + (_.sample(["10 lint fluffs", "1 button", "a cherished lost sock"])), - "\n\n\n" - ].join('\n'); -} diff --git a/shared/homebrewery/brewEditor/snippetbar/snippets/classtable.gen.js b/shared/homebrewery/brewEditor/snippetbar/snippets/classtable.gen.js deleted file mode 100644 index 649d85b..0000000 --- a/shared/homebrewery/brewEditor/snippetbar/snippets/classtable.gen.js +++ /dev/null @@ -1,114 +0,0 @@ -var _ = require('lodash'); - -var features = [ - "Astrological Botany", - "Astrological Chemistry", - "Biochemical Sorcery", - "Civil Alchemy", - "Consecrated Biochemistry", - "Demonic Anthropology", - "Divinatory Mineralogy", - "Genetic Banishing", - "Hermetic Geography", - "Immunological Incantations", - "Nuclear Illusionism", - "Ritual Astronomy", - "Seismological Divination", - "Spiritual Biochemistry", - "Statistical Occultism", - "Police Necromancer", - "Sixgun Poisoner", - "Pharmaceutical Gunslinger", - "Infernal Banker", - "Spell Analyst", - "Gunslinger Corruptor", - "Torque Interfacer", - "Exo Interfacer", - "Gunpowder Torturer", - "Orbital Gravedigger", - "Phased Linguist", - "Mathematical Pharmacist", - "Plasma Outlaw", - "Malefic Chemist", - "Police Cultist" -]; - -var classnames = ['Archivist', 'Fancyman', 'Linguist', 'Fletcher', - 'Notary', 'Berserker-Typist', 'Fishmongerer', 'Manicurist', 'Haberdasher', 'Concierge']; - -var levels = ["1st", "2nd", "3rd", "4th", "5th", "6th", "7th", "8th", "9th", "10th", "11th", "12th", "13th", "14th", "15th", "16th", "17th", "18th", "19th", "20th"] - -var profBonus = [2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6]; - -var getFeature = (level)=>{ - var res = [] - if(_.includes([4,6,8,12,14,16,19], level+1)){ - res = ["Ability Score Improvement"] - } - res = _.union(res, _.sampleSize(features, _.sample([0,1,1,1,1,1]))); - if(!res.length) return "─"; - return res.join(', '); -} - -module.exports = { - full : function(){ - var classname = _.sample(classnames) - - var maxes = [4,3,3,3,3,2,2,1,1] - var drawSlots = function(Slots){ - var slots = Number(Slots); - return _.times(9, function(i){ - var max = maxes[i]; - if(slots < 1) return "—"; - var res = _.min([max, slots]); - slots -= res; - return res; - }).join(' | ') - } - - - var cantrips = 3; - var spells = 1; - var slots = 2; - return "
\n##### The " + classname + "\n" + - "| Level | Proficiency Bonus | Features | Cantrips Known | Spells Known | 1st | 2nd | 3rd | 4th | 5th | 6th | 7th | 8th | 9th |\n"+ - "|:---:|:---:|:---|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|\n" + - _.map(levels, function(levelName, level){ - var res = [ - levelName, - "+" + profBonus[level], - getFeature(level), - cantrips, - spells, - drawSlots(slots) - ].join(' | '); - - cantrips += _.random(0,1); - spells += _.random(0,1); - slots += _.random(0,2); - - return "| " + res + " |"; - }).join('\n') +'\n
\n\n'; - }, - - half : function(){ - var classname = _.sample(classnames) - - var featureScore = 1 - return "
\n##### The " + classname + "\n" + - "| Level | Proficiency Bonus | Features | " + _.sample(features) + "|\n" + - "|:---:|:---:|:---|:---:|\n" + - _.map(levels, function(levelName, level){ - var res = [ - levelName, - "+" + profBonus[level], - getFeature(level), - "+" + featureScore - ].join(' | '); - - featureScore += _.random(0,1); - - return "| " + res + " |"; - }).join('\n') +'\n
\n\n'; - } -}; \ No newline at end of file diff --git a/shared/homebrewery/brewEditor/snippetbar/snippets/coverpage.gen.js b/shared/homebrewery/brewEditor/snippetbar/snippets/coverpage.gen.js deleted file mode 100644 index d4b69d6..0000000 --- a/shared/homebrewery/brewEditor/snippetbar/snippets/coverpage.gen.js +++ /dev/null @@ -1,117 +0,0 @@ -var _ = require('lodash'); - -var titles = [ - "The Burning Gallows", - "The Ring of Nenlast", - "Below the Blind Tavern", - "Below the Hungering River", - "Before Bahamut's Land", - "The Cruel Grave from Within", - "The Strength of Trade Road", - "Through The Raven Queen's Worlds", - "Within the Settlement", - "The Crown from Within", - "The Merchant Within the Battlefield", - "Ioun's Fading Traveler", - "The Legion Ingredient", - "The Explorer Lure", - "Before the Charming Badlands", - "The Living Dead Above the Fearful Cage", - "Vecna's Hidden Sage", - "Bahamut's Demonspawn", - "Across Gruumsh's Elemental Chaos", - "The Blade of Orcus", - "Beyond Revenge", - "Brain of Insanity", - "Breed Battle!, A New Beginning", - "Evil Lake, A New Beginning", - "Invasion of the Gigantic Cat, Part II", - "Kraken War 2020", - "The Body Whisperers", - "The Diabolical Tales of the Ape-Women", - "The Doctor Immortal", - "The Doctor from Heaven", - "The Graveyard", - "Azure Core", - "Core Battle", - "Core of Heaven: The Guardian of Amazement", - "Deadly Amazement III", - "Dry Chaos IX", - "Gate Thunder", - "Guardian: Skies of the Dark Wizard", - "Lute of Eternity", - "Mercury's Planet: Brave Evolution", - "Ruby of Atlantis: The Quake of Peace", - "Sky of Zelda: The Thunder of Force", - "Vyse's Skies", - "White Greatness III", - "Yellow Divinity", - "Zidane's Ghost" -]; - -var subtitles = [ - "In an ominous universe, a botanist opposes terrorism.", - "In a demon-haunted city, in an age of lies and hate, a physicist tries to find an ancient treasure and battles a mob of aliens.", - "In a land of corruption, two cyberneticists and a dungeon delver search for freedom.", - "In an evil empire of horror, two rangers battle the forces of hell.", - "In a lost city, in an age of sorcery, a librarian quests for revenge.", - "In a universe of illusions and danger, three time travellers and an adventurer search for justice.", - "In a forgotten universe of barbarism, in an era of terror and mysticism, a virtual reality programmer and a spy try to find vengance and battle crime.", - "In a universe of demons, in an era of insanity and ghosts, three bodyguards and a bodyguard try to find vengance.", - "In a kingdom of corruption and battle, seven artificial intelligences try to save the last living fertile woman.", - "In a universe of virutal reality and agony, in an age of ghosts and ghosts, a fortune-teller and a wanderer try to avert the apocalypse.", - "In a crime-infested kingdom, three martial artists quest for the truth and oppose evil.", - "In a terrifying universe of lost souls, in an era of lost souls, eight dancers fight evil.", - "In a galaxy of confusion and insanity, three martial artists and a duke battle a mob of psychics.", - "In an amazing kingdom, a wizard and a secretary hope to prevent the destruction of mankind.", - "In a kingdom of deception, a reporter searches for fame.", - "In a hellish empire, a swordswoman and a duke try to find the ultimate weapon and battle a conspiracy.", - "In an evil galaxy of illusion, in a time of technology and misery, seven psychiatrists battle crime.", - "In a dark city of confusion, three swordswomen and a singer battle lawlessness.", - "In an ominous empire, in an age of hate, two philosophers and a student try to find justice and battle a mob of mages intent on stealing the souls of the innocent.", - "In a kingdom of panic, six adventurers oppose lawlessness.", - "In a land of dreams and hopelessness, three hackers and a cyborg search for justice.", - "On a planet of mysticism, three travelers and a fire fighter quest for the ultimate weapon and oppose evil.", - "In a wicked universe, five seers fight lawlessness.", - "In a kingdom of death, in an era of illusion and blood, four colonists search for fame.", - "In an amazing kingdom, in an age of sorcery and lost souls, eight space pirates quest for freedom.", - "In a cursed empire, five inventors oppose terrorism.", - "On a crime-ridden planet of conspiracy, a watchman and an artificial intelligence try to find love and oppose lawlessness.", - "In a forgotten land, a reporter and a spy try to stop the apocalypse.", - "In a forbidden land of prophecy, a scientist and an archivist oppose a cabal of barbarians intent on stealing the souls of the innocent.", - "On an infernal world of illusion, a grave robber and a watchman try to find revenge and combat a syndicate of mages intent on stealing the source of all magic.", - "In a galaxy of dark magic, four fighters seek freedom.", - "In an empire of deception, six tomb-robbers quest for the ultimate weapon and combat an army of raiders.", - "In a kingdom of corruption and lost souls, in an age of panic, eight planetologists oppose evil.", - "In a galaxy of misery and hopelessness, in a time of agony and pain, five planetologists search for vengance.", - "In a universe of technology and insanity, in a time of sorcery, a computer techician quests for hope.", - "On a planet of dark magic and barbarism, in an age of horror and blasphemy, seven librarians search for fame.", - "In an empire of dark magic, in a time of blood and illusions, four monks try to find the ultimate weapon and combat terrorism.", - "In a forgotten empire of dark magic, six kings try to prevent the destruction of mankind.", - "In a galaxy of dark magic and horror, in an age of hopelessness, four marines and an outlaw combat evil.", - "In a mysterious city of illusion, in an age of computerization, a witch-hunter tries to find the ultimate weapon and opposes an evil corporation.", - "In a damned kingdom of technology, a virtual reality programmer and a fighter seek fame.", - "In a hellish kingdom, in an age of blasphemy and blasphemy, an astrologer searches for fame.", - "In a damned world of devils, an alien and a ranger quest for love and oppose a syndicate of demons.", - "In a cursed galaxy, in a time of pain, seven librarians hope to avert the apocalypse.", - "In a crime-infested galaxy, in an era of hopelessness and panic, three champions and a grave robber try to solve the ultimate crime." -]; - - -module.exports = () => { - return ` - -
- -# ${_.sample(titles)} - -
-
-##### ${_.sample(subtitles)} -
- -\\page` -} \ No newline at end of file diff --git a/shared/homebrewery/brewEditor/snippetbar/snippets/fullclass.gen.js b/shared/homebrewery/brewEditor/snippetbar/snippets/fullclass.gen.js deleted file mode 100644 index 9a2da20..0000000 --- a/shared/homebrewery/brewEditor/snippetbar/snippets/fullclass.gen.js +++ /dev/null @@ -1,43 +0,0 @@ -var _ = require('lodash'); - -var ClassFeatureGen = require('./classfeature.gen.js'); - -var ClassTableGen = require('./classtable.gen.js'); - -module.exports = function(){ - - var classname = _.sample(['Archivist', 'Fancyman', 'Linguist', 'Fletcher', - 'Notary', 'Berserker-Typist', 'Fishmongerer', 'Manicurist', 'Haberdasher', 'Concierge']) - - - var image = _.sample(_.map([ - "http://orig01.deviantart.net/4682/f/2007/099/f/c/bard_stick_figure_by_wrpigeek.png", - "http://img07.deviantart.net/a3c9/i/2007/099/3/a/archer_stick_figure_by_wrpigeek.png", - "http://pre04.deviantart.net/d596/th/pre/f/2007/099/5/2/adventurer_stick_figure_by_wrpigeek.png", - "http://img13.deviantart.net/d501/i/2007/099/d/4/black_mage_stick_figure_by_wrpigeek.png", - "http://img09.deviantart.net/5cf3/i/2007/099/d/d/dark_knight_stick_figure_by_wrpigeek.png", - "http://pre01.deviantart.net/7a34/th/pre/f/2007/099/6/3/monk_stick_figure_by_wrpigeek.png", - "http://img11.deviantart.net/5dcc/i/2007/099/d/1/mystic_knight_stick_figure_by_wrpigeek.png", - "http://pre08.deviantart.net/ad45/th/pre/f/2007/099/a/0/thief_stick_figure_by_wrpigeek.png", - ], function(url){ - return "" - })) - - - return [ - image, - "", - "```", - "```", - "
\n\n", - "## " + classname, - "Cool intro stuff will go here", - - "\\page", - ClassTableGen(classname), - ClassFeatureGen(classname), - - - - ].join('\n') + '\n\n\n'; -}; \ No newline at end of file diff --git a/shared/homebrewery/brewEditor/snippetbar/snippets/magic.gen.js b/shared/homebrewery/brewEditor/snippetbar/snippets/magic.gen.js deleted file mode 100644 index 82469cd..0000000 --- a/shared/homebrewery/brewEditor/snippetbar/snippets/magic.gen.js +++ /dev/null @@ -1,91 +0,0 @@ -var _ = require('lodash'); - -var spellNames = [ - "Astral Rite of Acne", - "Create Acne", - "Cursed Ramen Erruption", - "Dark Chant of the Dentists", - "Erruption of Immaturity", - "Flaming Disc of Inconvenience", - "Heal Bad Hygene", - "Heavenly Transfiguration of the Cream Devil", - "Hellish Cage of Mucus", - "Irritate Peanut Butter Fairy", - "Luminous Erruption of Tea", - "Mystic Spell of the Poser", - "Sorcerous Enchantment of the Chimneysweep", - "Steak Sauce Ray", - "Talk to Groupie", - "Astonishing Chant of Chocolate", - "Astounding Pasta Puddle", - "Ball of Annoyance", - "Cage of Yarn", - "Control Noodles Elemental", - "Create Nervousness", - "Cure Baldness", - "Cursed Ritual of Bad Hair", - "Dispell Piles in Dentist", - "Eliminate Florists", - "Illusionary Transfiguration of the Babysitter", - "Necromantic Armor of Salad Dressing", - "Occult Transfiguration of Foot Fetish", - "Protection from Mucus Giant", - "Tinsel Blast", - "Alchemical Evocation of the Goths", - "Call Fangirl", - "Divine Spell of Crossdressing", - "Dominate Ramen Giant", - "Eliminate Vindictiveness in Gym Teacher", - "Extra-Planar Spell of Irritation", - "Induce Whining in Babysitter", - "Invoke Complaining", - "Magical Enchantment of Arrogance", - "Occult Globe of Salad Dressing", - "Overwhelming Enchantment of the Chocolate Fairy", - "Sorcerous Dandruff Globe", - "Spiritual Invocation of the Costumers", - "Ultimate Rite of the Confetti Angel", - "Ultimate Ritual of Mouthwash", -]; - -module.exports = { - - spellList : function(){ - var levels = ['Cantrips (0 Level)', '2nd Level', '3rd Level', '4th Level', '5th Level', '6th Level', '7th Level', '8th Level', '9th Level']; - - var content = _.map(levels, (level)=>{ - var spells = _.map(_.sampleSize(spellNames, _.random(5, 15)), (spell)=>{ - return `- ${spell}`; - }).join('\n'); - return `##### ${level} \n${spells} \n`; - }).join('\n'); - - return `
\n${content}\n
`; - }, - - spell : function(){ - var level = ["1st", "2nd", "3rd", "4th", "5th", "6th", "7th", "8th", "9th"]; - var spellSchools = ["abjuration", "conjuration", "divination", "enchantment", "evocation", "illusion", "necromancy", "transmutation"]; - - - var components = _.sampleSize(["V", "S", "M"], _.random(1,3)).join(', '); - if(components.indexOf("M") !== -1){ - components += " (" + _.sampleSize(['a small doll', 'a crushed button worth at least 1cp', 'discarded gum wrapper'], _.random(1,3)).join(', ') + ")" - } - - return [ - "#### " + _.sample(spellNames), - "*" + _.sample(level) + "-level " + _.sample(spellSchools) + "*", - "___", - "- **Casting Time:** 1 action", - "- **Range:** " + _.sample(["Self", "Touch", "30 feet", "60 feet"]), - "- **Components:** " + components, - "- **Duration:** " + _.sample(["Until dispelled", "1 round", "Instantaneous", "Concentration, up to 10 minutes", "1 hour"]), - "", - "A flame, equivalent in brightness to a torch, springs from from an object that you touch. ", - "The effect look like a regular flame, but it creates no heat and doesn't use oxygen. ", - "A *continual flame* can be covered or hidden but not smothered or quenched.", - "\n\n\n" - ].join('\n'); - } -} \ No newline at end of file diff --git a/shared/homebrewery/brewEditor/snippetbar/snippets/monsterblock.gen.js b/shared/homebrewery/brewEditor/snippetbar/snippets/monsterblock.gen.js deleted file mode 100644 index abbcd6c..0000000 --- a/shared/homebrewery/brewEditor/snippetbar/snippets/monsterblock.gen.js +++ /dev/null @@ -1,196 +0,0 @@ -var _ = require('lodash'); - -var genList = function(list, max){ - return _.sampleSize(list, _.random(0,max)).join(', ') || "None"; -} - -var getMonsterName = function(){ - return _.sample([ - "All-devouring Baseball Imp", - "All-devouring Gumdrop Wraith", - "Chocolate Hydra", - "Devouring Peacock", - "Economy-sized Colossus of the Lemonade Stand", - "Ghost Pigeon", - "Gibbering Duck", - "Sparklemuffin Peacock Spider", - "Gum Elemental", - "Illiterate Construct of the Candy Store", - "Ineffable Chihuahua", - "Irritating Death Hamster", - "Irritating Gold Mouse", - "Juggernaut Snail", - "Juggernaut of the Sock Drawer", - "Koala of the Cosmos", - "Mad Koala of the West", - "Milk Djinni of the Lemonade Stand", - "Mind Ferret", - "Mystic Salt Spider", - "Necrotic Halitosis Angel", - "Pinstriped Famine Sheep", - "Ritalin Leech", - "Shocker Kangaroo", - "Stellar Tennis Juggernaut", - "Wailing Quail of the Sun", - "Angel Pigeon", - "Anime Sphinx", - "Bored Avalanche Sheep of the Wasteland", - "Devouring Nougat Sphinx of the Sock Drawer", - "Djinni of the Footlocker", - "Ectoplasmic Jazz Devil", - "Flatuent Angel", - "Gelatinous Duck of the Dream-Lands", - "Gelatinous Mouse", - "Golem of the Footlocker", - "Lich Wombat", - "Mechanical Sloth of the Past", - "Milkshake Succubus", - "Puffy Bone Peacock of the East", - "Rainbow Manatee", - "Rune Parrot", - "Sand Cow", - "Sinister Vanilla Dragon", - "Snail of the North", - "Spider of the Sewer", - "Stellar Sawdust Leech", - "Storm Anteater of Hell", - "Stupid Spirit of the Brewery", - "Time Kangaroo", - "Tomb Poodle", - ]); -} - -var getType = function(){ - return _.sample(['Tiny', 'Small', 'Medium', 'Large', 'Gargantuan', 'Stupidly vast']) + " " + _.sample(['beast', 'fiend', 'annoyance', 'guy', 'cutie']) -} - -var getAlignment = function(){ - return _.sample([ - "annoying evil", - "chaotic gossipy", - "chaotic sloppy", - "depressed neutral", - "lawful bogus", - "lawful coy", - "manic-depressive evil", - "narrow-minded neutral", - "neutral annoying", - "neutral ignorant", - "oedpipal neutral", - "silly neutral", - "unoriginal neutral", - "weird neutral", - "wordy evil", - "unaligned" - ]); -}; - -var getStats = function(){ - return '>|' + _.times(6, function(){ - var num = _.random(1,20); - var mod = Math.ceil(num/2 - 5) - return num + " (" + (mod >= 0 ? '+'+mod : mod ) + ")" - }).join('|') + '|'; -} - -var genAbilities = function(){ - return _.sample([ - "> ***Pack Tactics.*** These guys work together. Like super well, you don't even know.", - "> ***False Appearance. *** While the armor reamin motionless, it is indistinguishable from a normal suit of armor.", - ]); -} - -var genAction = function(){ - var name = _.sample([ - "Abdominal Drop", - "Airplane Hammer", - "Atomic Death Throw", - "Bulldog Rake", - "Corkscrew Strike", - "Crossed Splash", - "Crossface Suplex", - "DDT Powerbomb", - "Dual Cobra Wristlock", - "Dual Throw", - "Elbow Hold", - "Gory Body Sweep", - "Heel Jawbreaker", - "Jumping Driver", - "Open Chin Choke", - "Scorpion Flurry", - "Somersault Stump Fists", - "Suffering Wringer", - "Super Hip Submission", - "Super Spin", - "Team Elbow", - "Team Foot", - "Tilt-a-whirl Chin Sleeper", - "Tilt-a-whirl Eye Takedown", - "Turnbuckle Roll" - ]) - - return "> ***" + name + ".*** *Melee Weapon Attack:* +4 to hit, reach 5ft., one target. *Hit* 5 (1d6 + 2) "; -} - - -module.exports = { - - full : function(){ - return [ - "___", - "___", - "> ## " + getMonsterName(), - ">*" + getType() + ", " + getAlignment() + "*", - "> ___", - "> - **Armor Class** " + _.random(10,20), - "> - **Hit Points** " + _.random(1, 150) + "(1d4 + 5)", - "> - **Speed** " + _.random(0,50) + "ft.", - ">___", - ">|STR|DEX|CON|INT|WIS|CHA|", - ">|:---:|:---:|:---:|:---:|:---:|:---:|", - getStats(), - ">___", - "> - **Condition Immunities** " + genList(["groggy", "swagged", "weak-kneed", "buzzed", "groovy", "melancholy", "drunk"], 3), - "> - **Senses** passive Perception " + _.random(3, 20), - "> - **Languages** " + genList(["Common", "Pottymouth", "Gibberish", "Latin", "Jive"], 2), - "> - **Challenge** " + _.random(0, 15) + " (" + _.random(10,10000)+ " XP)", - "> ___", - _.times(_.random(3,6), function(){ - return genAbilities() - }).join('\n>\n'), - "> ### Actions", - _.times(_.random(4,6), function(){ - return genAction() - }).join('\n>\n'), - ].join('\n') + '\n\n\n'; - }, - - half : function(){ - return [ - "___", - "> ## " + getMonsterName(), - ">*" + getType() + ", " + getAlignment() + "*", - "> ___", - "> - **Armor Class** " + _.random(10,20), - "> - **Hit Points** " + _.random(1, 150) + "(1d4 + 5)", - "> - **Speed** " + _.random(0,50) + "ft.", - ">___", - ">|STR|DEX|CON|INT|WIS|CHA|", - ">|:---:|:---:|:---:|:---:|:---:|:---:|", - getStats(), - ">___", - "> - **Condition Immunities** " + genList(["groggy", "swagged", "weak-kneed", "buzzed", "groovy", "melancholy", "drunk"], 3), - "> - **Senses** passive Perception " + _.random(3, 20), - "> - **Languages** " + genList(["Common", "Pottymouth", "Gibberish", "Latin", "Jive"], 2), - "> - **Challenge** " + _.random(0, 15) + " (" + _.random(10,10000)+ " XP)", - "> ___", - _.times(_.random(0,2), function(){ - return genAbilities() - }).join('\n>\n'), - "> ### Actions", - _.times(_.random(1,2), function(){ - return genAction() - }).join('\n>\n'), - ].join('\n') + '\n\n\n'; - } -} diff --git a/shared/homebrewery/brewEditor/snippetbar/snippets/snippets.js b/shared/homebrewery/brewEditor/snippetbar/snippets/snippets.js deleted file mode 100644 index bcb1df9..0000000 --- a/shared/homebrewery/brewEditor/snippetbar/snippets/snippets.js +++ /dev/null @@ -1,267 +0,0 @@ -var MagicGen = require('./magic.gen.js'); -var ClassTableGen = require('./classtable.gen.js'); -var MonsterBlockGen = require('./monsterblock.gen.js'); -var ClassFeatureGen = require('./classfeature.gen.js'); -var FullClassGen = require('./fullclass.gen.js'); -var CoverPageGen = require('./coverpage.gen.js'); -var TableOfContentsGen = require('./tableOfContents.gen.js'); - - -module.exports = [ - - { - groupName : 'Editor', - icon : 'fa-pencil', - snippets : [ - { - name : "Column Break", - icon : 'fa-columns', - gen : "```\n```\n\n" - }, - { - name : "New Page", - icon : 'fa-file-text', - gen : "\\page\n\n" - }, - { - name : "Vertical Spacing", - icon : 'fa-arrows-v', - gen : "
\n\n" - }, - { - name : "Wide Block", - icon : 'fa-arrows-h', - gen : "
\nEverything in here will be extra wide. Tables, text, everything! Beware though, CSS columns can behave a bit weird sometimes.\n
\n" - }, - { - name : "Image", - icon : 'fa-image', - gen : [ - "", - "Credit: Kyounghwan Kim" - ].join('\n') - }, - { - name : "Background Image", - icon : 'fa-tree', - gen : [ - "" - ].join('\n') - }, - - { - name : "Page Number", - icon : 'fa-bookmark', - gen : "
1
\n
PART 1 | FANCINESS
\n\n" - }, - - { - name : "Auto-incrementing Page Number", - icon : 'fa-sort-numeric-asc', - gen : "
\n" - }, - - { - name : "Link to page", - icon : 'fa-link', - gen : "[Click here](#p3) to go to page 3\n" - }, - - { - name : "Table of Contents", - icon : 'fa-book', - gen : TableOfContentsGen - }, - - - ] - }, - - - /************************* PHB ********************/ - - { - groupName : 'PHB', - icon : 'fa-book', - snippets : [ - { - name : 'Spell', - icon : 'fa-magic', - gen : MagicGen.spell, - }, - { - name : 'Spell List', - icon : 'fa-list', - gen : MagicGen.spellList, - }, - { - name : 'Class Feature', - icon : 'fa-trophy', - gen : ClassFeatureGen, - }, - { - name : 'Note', - icon : 'fa-sticky-note', - gen : function(){ - return [ - "> ##### Time to Drop Knowledge", - "> Use notes to point out some interesting information. ", - "> ", - "> **Tables and lists** both work within a note." - ].join('\n'); - }, - }, - { - name : 'Descriptive Text Box', - icon : 'fa-sticky-note-o', - gen : function(){ - return [ - "
", - "##### Time to Drop Knowledge", - "Use notes to point out some interesting information. ", - "", - "**Tables and lists** both work within a note.", - "
" - ].join('\n'); - }, - }, - { - name : 'Monster Stat Block', - icon : 'fa-bug', - gen : MonsterBlockGen.half, - }, - { - name : 'Wide Monster Stat Block', - icon : 'fa-paw', - gen : MonsterBlockGen.full, - }, - { - name : 'Cover Page', - icon : 'fa-file-word-o', - gen : CoverPageGen, - }, - ] - }, - - - - /********************* TABLES *********************/ - - { - groupName : 'Tables', - icon : 'fa-table', - snippets : [ - { - name : "Class Table", - icon : 'fa-table', - gen : ClassTableGen.full, - }, - { - name : "Half Class Table", - icon : 'fa-list-alt', - gen : ClassTableGen.half, - }, - { - name : 'Table', - icon : 'fa-th-list', - gen : function(){ - return [ - "##### Cookie Tastiness", - "| Tastiness | Cookie Type |", - "|:----:|:-------------|", - "| -5 | Raisin |", - "| 8th | Chocolate Chip |", - "| 11th | 2 or lower |", - "| 14th | 3 or lower |", - "| 17th | 4 or lower |\n\n", - ].join('\n'); - }, - }, - { - name : 'Wide Table', - icon : 'fa-list', - gen : function(){ - return [ - "
", - "##### Cookie Tastiness", - "| Tastiness | Cookie Type |", - "|:----:|:-------------|", - "| -5 | Raisin |", - "| 8th | Chocolate Chip |", - "| 11th | 2 or lower |", - "| 14th | 3 or lower |", - "| 17th | 4 or lower |", - "
\n\n" - ].join('\n'); - }, - }, - { - name : 'Split Table', - icon : 'fa-th-large', - gen : function(){ - return [ - "
", - "| d10 | Damage Type |", - "|:---:|:------------|", - "| 1 | Acid |", - "| 2 | Cold |", - "| 3 | Fire |", - "| 4 | Force |", - "| 5 | Lightning |", - "", - "```", - "```", - "", - "| d10 | Damage Type |", - "|:---:|:------------|", - "| 6 | Necrotic |", - "| 7 | Poison |", - "| 8 | Psychic |", - "| 9 | Radiant |", - "| 10 | Thunder |", - "
\n\n", - ].join('\n'); - }, - } - ] - }, - - - - - /**************** PRINT *************/ - - { - groupName : 'Print', - icon : 'fa-print', - snippets : [ - { - name : "A4 PageSize", - icon : 'fa-file-o', - gen : ['' - ].join('\n') - }, - { - name : "Ink Friendly", - icon : 'fa-tint', - gen : ['', - '' - ].join('\n') - }, - ] - }, - -] diff --git a/shared/homebrewery/brewEditor/snippetbar/snippets/tableOfContents.gen.js b/shared/homebrewery/brewEditor/snippetbar/snippets/tableOfContents.gen.js deleted file mode 100644 index 448b2f4..0000000 --- a/shared/homebrewery/brewEditor/snippetbar/snippets/tableOfContents.gen.js +++ /dev/null @@ -1,72 +0,0 @@ -const _ = require('lodash'); - -const getTOC = (pages) => { - const add1 = (title, page)=>{ - res.push({ - title : title, - page : page + 1, - children : [] - }); - } - const add2 = (title, page)=>{ - if(!_.last(res)) add1('', page); - _.last(res).children.push({ - title : title, - page : page + 1, - children : [] - }); - } - const add3 = (title, page)=>{ - if(!_.last(res)) add1('', page); - if(!_.last(_.last(res).children)) add2('', page); - _.last(_.last(res).children).children.push({ - title : title, - page : page + 1, - children : [] - }); - } - - let res = []; - _.each(pages, (page, pageNum)=>{ - const lines = page.split('\n'); - _.each(lines, (line) => { - if(_.startsWith(line, '# ')){ - const title = line.replace('# ', ''); - add1(title, pageNum) - } - if(_.startsWith(line, '## ')){ - const title = line.replace('## ', ''); - add2(title, pageNum); - } - if(_.startsWith(line, '### ')){ - const title = line.replace('### ', ''); - add3(title, pageNum); - } - }) - }); - return res; -} - -module.exports = function(brew){ - const pages = brew.split('\\page'); - const TOC = getTOC(pages); - const markdown = _.reduce(TOC, (r, g1, idx1)=>{ - r.push(`- **[${idx1 + 1} ${g1.title}](#p${g1.page})**`) - if(g1.children.length){ - _.each(g1.children, (g2, idx2) => { - r.push(` - [${idx1 + 1}.${idx2 + 1} ${g2.title}](#p${g2.page})`); - if(g2.children.length){ - _.each(g2.children, (g3, idx3) => { - r.push(` - [${idx1 + 1}.${idx2 + 1}.${idx3 + 1} ${g3.title}](#p${g3.page})`); - }); - } - }); - } - return r; - }, []).join('\n'); - - return `
-##### Table Of Contents -${markdown} -
\n`; -} \ No newline at end of file diff --git a/shared/homebrewery/snippets/brew/index.js b/shared/homebrewery/snippets/brew/index.js index 85955ef..dab63e4 100644 --- a/shared/homebrewery/snippets/brew/index.js +++ b/shared/homebrewery/snippets/brew/index.js @@ -1,13 +1,15 @@ const _ = require('lodash'); -const process = (imports)=>{ - -}; - -module.exports = { - phb : _.keyBy([ - require('./spell.snippet.js') - ], (spt)=>_.snakeCase(spt.name)), +module.exports = _.merge( + require('./spell.snippet.js'), + require('./table.snippet.js') -} \ No newline at end of file + //wide + //colors + //brushed + //font + //alignment + + +); \ No newline at end of file diff --git a/shared/homebrewery/snippets/brew/random.data.js b/shared/homebrewery/snippets/brew/random.data.js index d4a405b..c194bd2 100644 --- a/shared/homebrewery/snippets/brew/random.data.js +++ b/shared/homebrewery/snippets/brew/random.data.js @@ -1,4 +1,9 @@ -module.exports = { +const _ = require('lodash'); + +const Data = { + rand : (name, max = 1, min = 1)=>{ + return _.sampleSize(Data[name], _.random(min, max)); + }, titles : [ `The Burning Gallows`, @@ -309,4 +314,6 @@ module.exports = { -} \ No newline at end of file +}; + +module.exports = Data; \ No newline at end of file diff --git a/shared/homebrewery/snippets/brew/spell.snippet.js b/shared/homebrewery/snippets/brew/spell.snippet.js index 2b96d76..658dfc1 100644 --- a/shared/homebrewery/snippets/brew/spell.snippet.js +++ b/shared/homebrewery/snippets/brew/spell.snippet.js @@ -1,7 +1,4 @@ const _ = require('lodash'); - -const spellNames = require('./spellname.list.js'); - const Data = require('./random.data.js'); @@ -11,13 +8,11 @@ const schools = ['abjuration', 'conjuration', 'divination', 'enchantment', 'evoc module.exports = { - name : 'Spell', - icon : 'fa-spell', - gen : ()=>{ + spell : ()=>{ let components = _.sampleSize(['V', 'S', 'M'], _.random(1,3)).join(', '); if(components.indexOf('M') !== -1){ - components += ' (' + _.sampleSize(Data.gear, _.random(1,3)).join(', ') + ')' + components += ` (${Data.rand('gear',3).join(', ')})` } const duration = _.sample([ @@ -28,11 +23,11 @@ module.exports = { '1 hour' ]); - const description = _.sampleSize(Data.effects, _.random(1,2)).concat(_.sample(Data.effects2)).join(' '); + const description = Data.rand('effects', 2).concat(Data.rand('effects2')).join(' '); return `{{spell -#### ${_.sample(spellNames)} +#### ${_.sample(Data.spellNames)} *${_.sample(levels)}-level ${_.sample(schools)}* - **Casting Time:** ${_.sample(['1 action', 'Reaction', '10 minutes', '1 hour'])} - **Range:** ${_.sample(['Self', 'Touch', '30 feet', '60 feet'])} diff --git a/shared/homebrewery/snippets/brew/spellname.list.js b/shared/homebrewery/snippets/brew/spellname.list.js deleted file mode 100644 index f75ae67..0000000 --- a/shared/homebrewery/snippets/brew/spellname.list.js +++ /dev/null @@ -1,47 +0,0 @@ -module.exports = [ - 'Astral Rite of Acne', - 'Create Acne', - 'Cursed Ramen Erruption', - 'Dark Chant of the Dentists', - 'Erruption of Immaturity', - 'Flaming Disc of Inconvenience', - 'Heal Bad Hygene', - 'Heavenly Transfiguration of the Cream Devil', - 'Hellish Cage of Mucus', - 'Irritate Peanut Butter Fairy', - 'Luminous Erruption of Tea', - 'Mystic Spell of the Poser', - 'Sorcerous Enchantment of the Chimneysweep', - 'Steak Sauce Ray', - 'Talk to Groupie', - 'Astonishing Chant of Chocolate', - 'Astounding Pasta Puddle', - 'Ball of Annoyance', - 'Cage of Yarn', - 'Control Noodles Elemental', - 'Create Nervousness', - 'Cure Baldness', - 'Cursed Ritual of Bad Hair', - 'Dispell Piles in Dentist', - 'Eliminate Florists', - 'Illusionary Transfiguration of the Babysitter', - 'Necromantic Armor of Salad Dressing', - 'Occult Transfiguration of Foot Fetish', - 'Protection from Mucus Giant', - 'Tinsel Blast', - 'Alchemical Evocation of the Goths', - 'Call Fangirl', - 'Divine Spell of Crossdressing', - 'Dominate Ramen Giant', - 'Eliminate Vindictiveness in Gym Teacher', - 'Extra-Planar Spell of Irritation', - 'Induce Whining in Babysitter', - 'Invoke Complaining', - 'Magical Enchantment of Arrogance', - 'Occult Globe of Salad Dressing', - 'Overwhelming Enchantment of the Chocolate Fairy', - 'Sorcerous Dandruff Globe', - 'Spiritual Invocation of the Costumers', - 'Ultimate Rite of the Confetti Angel', - 'Ultimate Ritual of Mouthwash', -]; \ No newline at end of file diff --git a/shared/homebrewery/snippets/brew/table.snippet.js b/shared/homebrewery/snippets/brew/table.snippet.js index a500e5d..673d075 100644 --- a/shared/homebrewery/snippets/brew/table.snippet.js +++ b/shared/homebrewery/snippets/brew/table.snippet.js @@ -1,14 +1,62 @@ const _ = require('lodash'); +const Data = require('./random.data.js'); + + + +/* +- Roll +- Level +- Cost - spell lists -- roll charts +- cost +- Class +*/ + + +const columns = { + roll : (rows)=>{ + return _.concat([`d${rows}`, ':---:'], _.times(rows, (i)=>i+1)); + }, + level : (rows)=>{ + return _.concat([`${_.sample(Data.classes)} Level`, ':---:'], _.times(rows, (i)=>`${i*2+3}th`)); + }, + + spell : (rows)=>{ + return _.concat(['Spells', ':---'], _.times(rows, (i)=>{ + return `_${Data.rand('spellNames', 2).join(', ')}_` + })); + }, + cost : (rows)=>{ + return _.concat([`Cost`, '---:'], _.times(rows, (i)=>{ + return _.sample(['1 gp', '10 gp', '5 cp', '10,000 gp', '200 sp', '1 pp', '2 gp']); + })); + }, + gear : (rows)=>{ + return _.concat([_.sample(['Equipment', 'Reward', 'Treasure']), ':---'], _.times(rows, (i)=>{ + return Data.rand('gear'); + })); + } +} module.exports = { - name : 'Table', - icon : 'fa-table', - gen: ()=>{ + table : () => { + const rows = _.sample([4,6,8,10]); - }, + const cols = [ + columns.roll(rows), + columns.level(rows), + columns.gear(rows) + ]; + + return _.times(rows + 2, (i)=>{ + if(i==1){ + return '|' + _.map(cols, (col)=>col[i]).join('|') + '|'; + }else{ + return '| ' + _.map(cols, (col)=>col[i]).join(' | ') + ' |'; + } + }).join('\n'); + } } \ No newline at end of file diff --git a/shared/homebrewery/snippets/style/a4.snippet.js b/shared/homebrewery/snippets/style/a4.snippet.js new file mode 100644 index 0000000..bc62d33 --- /dev/null +++ b/shared/homebrewery/snippets/style/a4.snippet.js @@ -0,0 +1,8 @@ +module.exports = { + a4 : ()=>{ + return `.phb{ + width : 210mm; + height : 296.8mm; +}`; + } +} \ No newline at end of file diff --git a/shared/homebrewery/snippets/style/index.js b/shared/homebrewery/snippets/style/index.js index e69de29..995e36d 100644 --- a/shared/homebrewery/snippets/style/index.js +++ b/shared/homebrewery/snippets/style/index.js @@ -0,0 +1,6 @@ +const _ = require('lodash'); + +module.exports = _.merge( + require('./ink.snippet.js'), + require('./a4.snippet.js') +); diff --git a/shared/homebrewery/snippets/style/ink.snippet.js b/shared/homebrewery/snippets/style/ink.snippet.js new file mode 100644 index 0000000..ffd6d1e --- /dev/null +++ b/shared/homebrewery/snippets/style/ink.snippet.js @@ -0,0 +1,9 @@ + + +module.exports = { + inkFriendly : ()=>{ + return `.phb{ background : white;} +.phb img{ display : none;} +.phb hr+blockquote{background : white;}`; + } +} \ No newline at end of file