From 5c4da77357e9c6533fea7506abbf906d422adab3 Mon Sep 17 00:00:00 2001 From: James Socol Date: Sat, 20 Feb 2021 14:04:54 -0500 Subject: [PATCH 001/188] Parametrize fillMode for .useColumns A @fillMode parameter for .useColumns9) allows setting `column-fill` property to `balance` for wide statblocks (or other wide column types) instead of relying on Chrome's fallback behavior that ignores `auto` when there's no set container height. Set the default for the for `@fillMode` to `auto` to maintain the current behavior. --- client/homebrew/phbStyle/phb.style.less | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/homebrew/phbStyle/phb.style.less b/client/homebrew/phbStyle/phb.style.less index 792755ade..b480a234b 100644 --- a/client/homebrew/phbStyle/phb.style.less +++ b/client/homebrew/phbStyle/phb.style.less @@ -26,9 +26,9 @@ body { letter-spacing : -0.02em; } } -.useColumns(@multiplier : 1){ +.useColumns(@multiplier : 1, @fillMode: auto){ column-count : 2; - column-fill : auto; + column-fill : @fillMode; column-gap : 1cm; column-width : 8cm * @multiplier; -webkit-column-count : 2; @@ -272,7 +272,7 @@ body { } //Full Width hr+hr+blockquote{ - .useColumns(0.96); + .useColumns(0.96, @fillMode: balance); } //***************************** // * FOOTER From 00f90d108473e8f146c2d8f6fc6262617c6df8ab Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Sat, 31 Jul 2021 17:21:25 +1200 Subject: [PATCH 002/188] Add a page count to User page --- client/homebrew/pages/userPage/brewItem/brewItem.jsx | 4 ++++ client/homebrew/pages/userPage/brewItem/brewItem.less | 3 +++ server/homebrew.api.js | 2 ++ server/homebrew.model.js | 11 ++++++----- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/client/homebrew/pages/userPage/brewItem/brewItem.jsx b/client/homebrew/pages/userPage/brewItem/brewItem.jsx index b24bad363..c55933685 100644 --- a/client/homebrew/pages/userPage/brewItem/brewItem.jsx +++ b/client/homebrew/pages/userPage/brewItem/brewItem.jsx @@ -105,6 +105,7 @@ const BrewItem = createClass({

{brew.title}

{brew.description}


+
@@ -113,6 +114,9 @@ const BrewItem = createClass({ {brew.views} + + {brew.pageCount || 1} + {moment(brew.updatedAt).fromNow()} diff --git a/client/homebrew/pages/userPage/brewItem/brewItem.less b/client/homebrew/pages/userPage/brewItem/brewItem.less index efae9d8d3..7d806e841 100644 --- a/client/homebrew/pages/userPage/brewItem/brewItem.less +++ b/client/homebrew/pages/userPage/brewItem/brewItem.less @@ -69,4 +69,7 @@ padding : 0px; margin : -5px; } + .spacer { + height : 25px; + } } diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 1f988761d..00195910a 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -38,6 +38,7 @@ const newBrew = (req, res)=>{ brew.authors = (req.account) ? [req.account.username] : []; brew.text = mergeBrewText(brew.text, brew.style); + brew.pageCount = (brew.text.match(/\\page/g) || []).length + 1; delete brew.editId; delete brew.shareId; @@ -66,6 +67,7 @@ const updateBrew = (req, res)=>{ .then((brew)=>{ brew = _.merge(brew, req.body); brew.text = mergeBrewText(brew.text, brew.style); + brew.pageCount = (brew.text.match(/\\page/g) || []).length + 1; // Compress brew text to binary before saving brew.textBin = zlib.deflateRawSync(brew.text); diff --git a/server/homebrew.model.js b/server/homebrew.model.js index c2abdf199..acc78a624 100644 --- a/server/homebrew.model.js +++ b/server/homebrew.model.js @@ -4,11 +4,12 @@ const _ = require('lodash'); const zlib = require('zlib'); const HomebrewSchema = mongoose.Schema({ - shareId : { type: String, default: ()=>{return nanoid(12);}, index: { unique: true } }, - editId : { type: String, default: ()=>{return nanoid(12);}, index: { unique: true } }, - title : { type: String, default: '' }, - text : { type: String, default: '' }, - textBin : { type: Buffer }, + shareId : { type: String, default: ()=>{return nanoid(12);}, index: { unique: true } }, + editId : { type: String, default: ()=>{return nanoid(12);}, index: { unique: true } }, + title : { type: String, default: '' }, + text : { type: String, default: '' }, + textBin : { type: Buffer }, + pageCount : { type: Number, default: 1 }, description : { type: String, default: '' }, tags : { type: String, default: '' }, From 9e5451b94093211a6353af104e3799b44d8b66cb Mon Sep 17 00:00:00 2001 From: Gazook89 <58999374+Gazook89@users.noreply.github.com> Date: Mon, 2 Aug 2021 21:12:20 -0500 Subject: [PATCH 003/188] Add Artist Snippet Add Artist Snippet --- .../editor/snippetbar/snippets/snippets.js | 12 ++++++++ .../snippetbar/snippetsLegacy/snippets.js | 8 +++++ themes/5ePhb.style.less | 26 ++++++++++++++++ themes/5ePhbLegacy.style.less | 28 ++++++++++++++++++ .../5e legacy/WalterTurncoat-Regular.woff2 | Bin 0 -> 61412 bytes themes/fonts/5e legacy/fonts.less | 6 ++++ themes/fonts/5e/WalterTurncoat-Regular.woff2 | Bin 0 -> 61412 bytes themes/fonts/5e/fonts.less | 6 ++++ 8 files changed, 86 insertions(+) create mode 100644 themes/fonts/5e legacy/WalterTurncoat-Regular.woff2 create mode 100644 themes/fonts/5e/WalterTurncoat-Regular.woff2 diff --git a/client/homebrew/editor/snippetbar/snippets/snippets.js b/client/homebrew/editor/snippetbar/snippets/snippets.js index 2ac8c7ea0..d7cf7aac8 100644 --- a/client/homebrew/editor/snippetbar/snippets/snippets.js +++ b/client/homebrew/editor/snippetbar/snippets/snippets.js @@ -191,6 +191,18 @@ module.exports = [ icon : 'fas fa-hat-wizard', gen : MagicGen.item, }, + { + name : 'Artist Credit', + icon : 'fas fa-signature', + gen : function(){ + return dedent` + {{artist,top:10px,left:10px + ##### Starry Night + [Van Gogh](https://www.vangoghmuseum.nl/en) + }} + \n`; + }, + }, ] }, diff --git a/client/homebrew/editor/snippetbar/snippetsLegacy/snippets.js b/client/homebrew/editor/snippetbar/snippetsLegacy/snippets.js index 2d4e2d0e4..b77e9269a 100644 --- a/client/homebrew/editor/snippetbar/snippetsLegacy/snippets.js +++ b/client/homebrew/editor/snippetbar/snippetsLegacy/snippets.js @@ -166,6 +166,14 @@ module.exports = [ icon : 'far fa-file-word', gen : CoverPageGen, }, + { + name : 'Artist Credit', + icon : 'fas fa-signature', + gen : '
\n' + + '##### Starry Night\n' + + '[Van Gogh](https://www.vangoghmuseum.nl/en)\n' + + '
\n' + }, ] }, diff --git a/themes/5ePhb.style.less b/themes/5ePhb.style.less index 3ca74dbf4..af5fdfe00 100644 --- a/themes/5ePhb.style.less +++ b/themes/5ePhb.style.less @@ -263,6 +263,32 @@ body { margin-bottom : 0em; } } + //***************************** + // * ARTIST CREDIT BLOCK + // *****************************/ + .artist { + position:absolute; + text-align:center; + font-family:'Walter Turncoat','ScalySansSmallCapsRemake', sans-serif; + font-size:10px; + p, p + p { + margin:unset; + text-indent:unset; + line-height:1em; + } + h5 { + font-size:1.3em; + font-family:'Walter Turncoat' + } + a{ + color:black; + text-decoration:unset; + &:hover { + text-decoration:underline; + } + } + } + //***************************** // * MONSTER STAT BLOCK // *****************************/ diff --git a/themes/5ePhbLegacy.style.less b/themes/5ePhbLegacy.style.less index 0f1cae7ec..295d7000c 100644 --- a/themes/5ePhbLegacy.style.less +++ b/themes/5ePhbLegacy.style.less @@ -445,6 +445,34 @@ body { .phb pre+.descriptive{ margin-top : 8px; } + +//***************************** +// * ARTIST CREDIT BLOCK +// *****************************/ +.phb { + .artist { + position:absolute; + text-align:center; + font-family:'Walter Turncoat','ScalySansSmallCapsRemake', sans-serif; + font-size:10px; + p, p + p { + margin:unset; + text-indent:unset; + line-height:1em; + } + h5 { + font-size:1.3em; + font-family:'Walter Turncoat' + } + a{ + color:black; + text-decoration:unset; + &:hover { + text-decoration:underline; + } + } + } +} //***************************** // * TABLE OF CONTENTS // *****************************/ diff --git a/themes/fonts/5e legacy/WalterTurncoat-Regular.woff2 b/themes/fonts/5e legacy/WalterTurncoat-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..758e2400d31eaf9f27885d116f266c1564b637ff GIT binary patch literal 61412 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 Hjza(djQ4%x literal 0 HcmV?d00001 diff --git a/themes/fonts/5e legacy/fonts.less b/themes/fonts/5e legacy/fonts.less index 0c47c8e7e..88e058a15 100644 --- a/themes/fonts/5e legacy/fonts.less +++ b/themes/fonts/5e legacy/fonts.less @@ -37,6 +37,12 @@ font-weight: normal; font-style: normal; } +@font-face { + font-family: 'Walter Turncoat'; + src: url('../fonts/5e legacy/WalterTurncoat-Regular.woff2'); + font-weight: normal; + font-style: normal; +} /* Headers */ @font-face { diff --git a/themes/fonts/5e/WalterTurncoat-Regular.woff2 b/themes/fonts/5e/WalterTurncoat-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..758e2400d31eaf9f27885d116f266c1564b637ff GIT binary patch literal 61412 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 Hjza(djQ4%x literal 0 HcmV?d00001 diff --git a/themes/fonts/5e/fonts.less b/themes/fonts/5e/fonts.less index 7cd1c9652..be7e09d0e 100644 --- a/themes/fonts/5e/fonts.less +++ b/themes/fonts/5e/fonts.less @@ -55,6 +55,12 @@ font-weight: normal; font-style: normal; } +@font-face { + font-family: 'Walter Turncoat'; + src: url('../fonts/5e/WalterTurncoat-Regular.woff2'); + font-weight: normal; + font-style: normal; +} /* Headers */ @font-face { From d763f2de2fc8a8e0a0c3d6ff2780440faa8184f7 Mon Sep 17 00:00:00 2001 From: Gazook89 <58999374+Gazook89@users.noreply.github.com> Date: Wed, 4 Aug 2021 15:50:31 -0500 Subject: [PATCH 004/188] Update fonts.less --- themes/fonts/5e legacy/fonts.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/fonts/5e legacy/fonts.less b/themes/fonts/5e legacy/fonts.less index 88e058a15..a3527130b 100644 --- a/themes/fonts/5e legacy/fonts.less +++ b/themes/fonts/5e legacy/fonts.less @@ -38,7 +38,7 @@ font-style: normal; } @font-face { - font-family: 'Walter Turncoat'; + font-family: WalterTurncoat; src: url('../fonts/5e legacy/WalterTurncoat-Regular.woff2'); font-weight: normal; font-style: normal; From 2ab0c9cbebdeae8cdea2e41886996d3dca7f50f4 Mon Sep 17 00:00:00 2001 From: Gazook89 <58999374+Gazook89@users.noreply.github.com> Date: Wed, 4 Aug 2021 15:53:21 -0500 Subject: [PATCH 005/188] update font name in 5e styles --- themes/5ePhb.style.less | 2 +- themes/5ePhbLegacy.style.less | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/themes/5ePhb.style.less b/themes/5ePhb.style.less index af5fdfe00..af4c9519f 100644 --- a/themes/5ePhb.style.less +++ b/themes/5ePhb.style.less @@ -278,7 +278,7 @@ body { } h5 { font-size:1.3em; - font-family:'Walter Turncoat' + font-family:WalterTurncoat; } a{ color:black; diff --git a/themes/5ePhbLegacy.style.less b/themes/5ePhbLegacy.style.less index 295d7000c..d527e7c1e 100644 --- a/themes/5ePhbLegacy.style.less +++ b/themes/5ePhbLegacy.style.less @@ -462,7 +462,7 @@ body { } h5 { font-size:1.3em; - font-family:'Walter Turncoat' + font-family:WalterTurncoat; } a{ color:black; From e3285b5ca40e6f2284406501dc89f6a69d47e6e8 Mon Sep 17 00:00:00 2001 From: Gazook89 <58999374+Gazook89@users.noreply.github.com> Date: Mon, 9 Aug 2021 21:06:29 -0500 Subject: [PATCH 006/188] Create .frame class for Class Tables Add a `.frame` class for Class Tables so that the frame and background can be toggled on or off in a similar fashion to the new monster stat block. This will allow a class table to be used as a "third caster archetype" table such as referenced in PR #1079. Adds consistency with Monster blocks, too. --- themes/5ePhb.style.less | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/themes/5ePhb.style.less b/themes/5ePhb.style.less index 9e56a7009..5e5fb3b7c 100644 --- a/themes/5ePhb.style.less +++ b/themes/5ePhb.style.less @@ -514,17 +514,19 @@ body { // * CLASS TABLE // *****************************/ .page .classTable{ - margin-top : 25px; - margin-bottom : 40px; - border-collapse : separate; - background-color : white; - border : initial; - border-style : solid; - border-image-outset : 25px 17px; - border-image-repeat : stretch; - border-image-slice : 150 200 150 200; - border-image-source : @frameBorderImage; - border-image-width : 47px; + &.frame { + margin-top : 25px; + margin-bottom : 40px; + border-collapse : separate; + background-color : white; + border : initial; + border-style : solid; + border-image-outset : 25px 17px; + border-image-repeat : stretch; + border-image-slice : 150 200 150 200; + border-image-source : @frameBorderImage; + border-image-width : 47px; + } h5{ margin-bottom : 10px; } From 5d4bc23c84db150422110e94c663e16f97e3b88d Mon Sep 17 00:00:00 2001 From: Gazook89 <58999374+Gazook89@users.noreply.github.com> Date: Mon, 9 Aug 2021 21:09:34 -0500 Subject: [PATCH 007/188] Remove text wrapping from spanned header This removes text wrapping from col-spanned headers inside a classtable...needed for half-tables that contain `--- Spells Slots per Spell Level ---` so they don't wrap to next line. Both v3 and Legacy --- themes/5ePhb.style.less | 3 +++ themes/5ePhbLegacy.style.less | 3 +++ 2 files changed, 6 insertions(+) diff --git a/themes/5ePhb.style.less b/themes/5ePhb.style.less index 5e5fb3b7c..c733ca221 100644 --- a/themes/5ePhb.style.less +++ b/themes/5ePhb.style.less @@ -514,6 +514,9 @@ body { // * CLASS TABLE // *****************************/ .page .classTable{ + th[colspan] { + white-space : nowrap; + } &.frame { margin-top : 25px; margin-bottom : 40px; diff --git a/themes/5ePhbLegacy.style.less b/themes/5ePhbLegacy.style.less index 0f1cae7ec..9346c25bd 100644 --- a/themes/5ePhbLegacy.style.less +++ b/themes/5ePhbLegacy.style.less @@ -407,6 +407,9 @@ body { border-image-slice : 150 200 150 200; border-image-source : @frameBorderImage; border-image-width : 47px; + th[colspan] { + white-space : nowrap; + } h5{ margin-bottom : 10px; } From 70217155435d9bd32b488efb3153cae92993c79f Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Tue, 10 Aug 2021 00:51:30 -0400 Subject: [PATCH 008/188] /v3_preview page will show a v3 version of the homepage --- client/homebrew/homebrew.jsx | 1 + client/homebrew/pages/homePage/homePage.jsx | 9 +- .../homebrew/pages/homePage/welcome_msg_v3.md | 174 ++++++++++++++++++ server.js | 33 +++- shared/naturalcrit/markdown.js | 4 +- 5 files changed, 207 insertions(+), 14 deletions(-) create mode 100644 client/homebrew/pages/homePage/welcome_msg_v3.md diff --git a/client/homebrew/homebrew.jsx b/client/homebrew/homebrew.jsx index 118c21e91..aa7b04a63 100644 --- a/client/homebrew/homebrew.jsx +++ b/client/homebrew/homebrew.jsx @@ -49,6 +49,7 @@ const Homebrew = createClass({ }/> }/> }/> + }/> }/>
diff --git a/client/homebrew/pages/homePage/homePage.jsx b/client/homebrew/pages/homePage/homePage.jsx index b8ee5634b..dfb4908a0 100644 --- a/client/homebrew/pages/homePage/homePage.jsx +++ b/client/homebrew/pages/homePage/homePage.jsx @@ -1,6 +1,7 @@ require('./homePage.less'); const React = require('react'); const createClass = require('create-react-class'); +const _ = require('lodash'); const cx = require('classnames'); const request = require('superagent'); const { Meta } = require('vitreum/headtags'); @@ -49,9 +50,9 @@ const HomePage = createClass({ this.refs.editor.update(); }, handleTextChange : function(text){ - this.setState({ - brew : { text: text } - }); + this.setState((prevState)=>({ + brew : _.merge({}, prevState.brew, { text: text }) + })); }, renderNavbar : function(){ return @@ -81,7 +82,7 @@ const HomePage = createClass({ renderer={this.state.brew.renderer} showEditButtons={false} /> - + diff --git a/client/homebrew/pages/homePage/welcome_msg_v3.md b/client/homebrew/pages/homePage/welcome_msg_v3.md new file mode 100644 index 000000000..6377e934c --- /dev/null +++ b/client/homebrew/pages/homePage/welcome_msg_v3.md @@ -0,0 +1,174 @@ +```css +.page #example + table td { + border:1px dashed #00000030; +} + + +``` + +# The Homebrewery *V3* +Welcome traveler from an antique land. Please sit and tell us of what you have seen. The unheard of monsters, who slither and bite. Tell us of the wondrous items and and artifacts you have found, their mysteries yet to be unlocked. Of the vexing vocations and surprising skills you have seen. + +### Homebrew D&D made easy +The Homebrewery makes the creation and sharing of authentic looking Fifth-Edition homebrews easy. It uses [Markdown](https://help.github.com/articles/markdown-basics/) with a little CSS magic to make your brews come to life. + +**Try it!** Simply edit the text on the left and watch it *update live* on the right. + +### Editing and Sharing +When you create your own homebrew, you will be given a *edit url* and a *share url*. + +Any changes you make while on the *edit url* will be automatically saved to the database within a few seconds. Anyone with the edit url will be able to make edits to your homebrew, so be careful about who you share it with. + +Anyone with the *share url* will be able to access a read-only version of your homebrew. + +### PDF Creation +PDF Printing works best in Google Chrome. If you are having quality/consistency issues, try using Chrome to print instead. + +After clicking the "Print" item in the navbar a new page will open and a print dialog will pop-up. +* Set the **Destination** to "Save as PDF" +* Set **Paper Size** to "Letter" +* If you are printing on A4 paper, make sure to have the "A4 page size snippet" in your brew +* In **Options** make sure "Background Images" is selected. +* Hit print and enjoy! You're done! + +If you want to save ink or have a monochrome printer, add the **Ink Friendly** snippet to your brew before you print + + + +\column + +## New in V3.0.0 +With the latest major update to *The Homebrewery* we've implemented an extended Markdown-like syntax for block and span elements, plus a few other changes, eliminating the need for HTML tags like `div` and `span` in most cases. No raw HTML tags should be needed in a brew, and going forward, raw HTML will no longer receive debugging support (*but can still be used if you insist*). + +All brews made prior to the release of v3.0.0 will still render normally, and you may switch between the "legacy" brew renderer and the newer "V3" renderer via the {{fa,fa-info-circle}} **Properties** button on your brew. Much of the syntax and styling has changed in V3, so code in one version may be broken in the other. + +Scroll down to the next page for a brief summary of the changes and new features available in V3! + +#### New Things All The Time! +What's new in the latest update? Check out the full changelog [here](/changelog). + +### Helping out +Like this tool? Want to buy me a beer? [Head here](https://www.patreon.com/Naturalcrit) to help me keep the servers running. + +This tool will **always** be free, never have ads, and I will never offer any "premium" features or whatever. + +### Bugs, Issues, Suggestions? +Need help getting started or just the right look for your brew? Head to [r/Homebrewery](https://www.reddit.com/r/homebrewery/submit?selftext=true&title=%5BIssue%5D%20Describe%20Your%20Issue%20Here) and let us know! + +Have an idea of how to make The Homebrewery better? Or did you find something that wasn't quite right? Check out the [GitHub Repo](https://github.com/naturalcrit/homebrewery/) to report technical issues. + + + +### Legal Junk +The Homebrewery is licensed using the [MIT License](https://github.com/naturalcrit/homebrewery/blob/master/license). Which means you are free to use The Homebrewery any way that you want, except for claiming that you made it yourself. + +If you wish to sell or in some way gain profit for what's created on this site, it's your responsibility to ensure you have the proper licenses/rights for any images or resources used. + +#### Crediting Me +If you'd like to credit The Homebrewery in your brew, I'd be flattered! Just reference that you made it with The Homebrewery. + +### More Resources +If you are looking for more 5e Homebrew resources check out [r/UnearthedArcana](https://www.reddit.com/r/UnearthedArcana/) and their list of useful resources [here](https://www.reddit.com/r/UnearthedArcana/comments/3uwxx9/resources_open_to_the_community/). + + + + + +
1
+
PART 1 | FANCINESS
+ + + + +\page + +## Markdown+ +Homebrewery aims to make homebrewering as simple as possible, providing a live editor in combination with Markdown syntax for formatting. + +In version 3.0.0, with a goal of retaining maximum flexibility while elmininating the need for any HTML in a brew, Homebrewery has developed additional Markdown-like syntax. + +{{text-align:center +**You must enable v3 via the metadata editor!** +}} + + +### Curly Brackets +The biggest change in version 3 is the replacement of `` and `
` with `{{ }}`. Inline spans and block elements can be created and given ID's and Classes, as well as css properties, each of which are comma separated with no spaces. Spans and Blocks start the same: + +#### Span +My favorite author is {{pen,#author,color:orange,font-family:"trebuchet ms" Brandon Sanderson}}. The orange text is given a class of `pen`, and id of `author`, colored orange, and given a new font. + + +#### Block +{{purple,#book,background:#aa88aa55,text-align:center +My favorite book is Wheel of Time. This block has a class of `purple`, an id of `book`, and has been styled with a purple background and centered text. +}} + + +#### Injection +For any element that is not inside a span or block, you can *inject* attributes using the same syntax but with single brackets immediately after the element. Below, a width and border are set for an image: + +![alt-text](https://s-media-cache-ak0.pinimg.com/736x/4a/81/79/4a8179462cfdf39054a418efd4cb743e.jpg) {width:100px,border:"2px solid",border-radius:10px} + +\* *this does not currently work for tables yet* + +### Vertical Spacing +The HTML tag `
` has been replaced by either a single `:` along on a line, or multiple `:` on the same line. + +:: + +Much nicer than `




` + +### Definition Lists +V3 uses HTML *definition lists* to create "lists" with hanging indents. + + +**Condition Immunities** :: Here is some text that is long and overflows into a second line, creating a "hanging indent". +**Senses** :: Here is some text that is long and overflows into a second line, creating a "hanging indent". + + + +\column + +### Tables +New in v3.0.0 is the option to add column & row spanning between cells. You can see a working example in the updated Class Table Snippet, but a simplified example is given below. + +A cell can be spanned across columns by bunching pipe `|` characters together. + +Row spanning is achieved by adding a `^` at the end of a cell just before the `|`. + +These can be combined to span a cell across both columns and rows. Cells must have the same colspan if they are to be rowspan'd. + +##### Example +| | Spanned Header || +| Head A | Head B | Head C | +|:-------|:-------|:-------| +| 1A | 1B | 1C | +| 2A ^| 2B | 2C | +| 3A ^| 3B 3C || +| 4A | 4B 4C^|| +| 5A ^| 5B | 5C | +| 6A | 6B ^| 6C | + + +## Images +Images must be hosted online somewhere, like [Imgur](https://www.imgur.com). You use the address to that image to reference it in your brew\*. Images can be included using Markdown-style images. + +Using *Curly Injection* you can assign an id, classes, or specific inline CSS properties to the image. + +::: + +\* *When using Imgur-hosted images, use the "direct link", which can be found when you click into your image in the Imgur interace.* + +## Snippets +Homebrewery comes with a series of *code snippets* found at the top of the editor pane that make it easy to create brews as quickly as possible. Just set your cursor where you want the code to appear in the editor pane, choose a snippet, and make the adjustments you need. + + +## Style Editor Panel + +{{fa,fa-paint-brush}}Also, technically released prior to v3 but still new to many users, check out the new **Style Editor** located on the right side of the Snippet bar. This editor excepts CSS for styling without requiring `' ].join('\n') }, + { + name : 'Square Page Size', + icon : 'far fa-file', + gen : ['' + ].join('\n') + }, { name : 'Ink Friendly', icon : 'fas fa-tint', From a63949636ebe60eeffffd796f26491fa8c1d2c7f Mon Sep 17 00:00:00 2001 From: Gazook89 <58999374+Gazook89@users.noreply.github.com> Date: Tue, 10 Aug 2021 22:02:46 -0500 Subject: [PATCH 028/188] Update Ink Friendly snippet for v3 updated the ink friendly snippet so that it points to elements like .monster rather than hr+blockquote. Goes further than original snippet by setting white background for monster, note, descriptive blocks. Did not update Legacy. --- client/homebrew/editor/snippetbar/snippets/snippets.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/homebrew/editor/snippetbar/snippets/snippets.js b/client/homebrew/editor/snippetbar/snippets/snippets.js index d68cc32ac..6e26ab9ee 100644 --- a/client/homebrew/editor/snippetbar/snippets/snippets.js +++ b/client/homebrew/editor/snippetbar/snippets/snippets.js @@ -319,9 +319,9 @@ module.exports = [ name : 'Ink Friendly', icon : 'fas fa-tint', gen : ['', '' ].join('\n') From af8ca7141d4e298aa5d10f96c05809715b659185 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Wed, 11 Aug 2021 01:01:04 -0400 Subject: [PATCH 029/188] Update welcome_msg_v3.md --- .../homebrew/pages/homePage/welcome_msg_v3.md | 41 ++++++++++--------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/client/homebrew/pages/homePage/welcome_msg_v3.md b/client/homebrew/pages/homePage/welcome_msg_v3.md index 6377e934c..9a5294f81 100644 --- a/client/homebrew/pages/homePage/welcome_msg_v3.md +++ b/client/homebrew/pages/homePage/welcome_msg_v3.md @@ -12,7 +12,7 @@ Welcome traveler from an antique land. Please sit and tell us of what you have s ### Homebrew D&D made easy The Homebrewery makes the creation and sharing of authentic looking Fifth-Edition homebrews easy. It uses [Markdown](https://help.github.com/articles/markdown-basics/) with a little CSS magic to make your brews come to life. -**Try it!** Simply edit the text on the left and watch it *update live* on the right. +**Try it!** Simply edit the text on the left and watch it *update live* on the right. Note that not every button is visible on this demo page. Click New {{fas,fa-plus-square}} in the navbar above to start brewing with all the features! ### Editing and Sharing When you create your own homebrew, you will be given a *edit url* and a *share url*. @@ -27,11 +27,11 @@ PDF Printing works best in Google Chrome. If you are having quality/consistency After clicking the "Print" item in the navbar a new page will open and a print dialog will pop-up. * Set the **Destination** to "Save as PDF" * Set **Paper Size** to "Letter" -* If you are printing on A4 paper, make sure to have the "A4 page size snippet" in your brew +* If you are printing on A4 paper, make sure to have the {{far,fa-file}} **A4 Pagesize** snippet in your brew * In **Options** make sure "Background Images" is selected. * Hit print and enjoy! You're done! -If you want to save ink or have a monochrome printer, add the **Ink Friendly** snippet to your brew before you print +If you want to save ink or have a monochrome printer, add the {{fas,fa-tint}} **Ink Friendly** snippet to your brew before you print @@ -55,12 +55,12 @@ This tool will **always** be free, never have ads, and I will never offer any "p ### Bugs, Issues, Suggestions? Need help getting started or just the right look for your brew? Head to [r/Homebrewery](https://www.reddit.com/r/homebrewery/submit?selftext=true&title=%5BIssue%5D%20Describe%20Your%20Issue%20Here) and let us know! -Have an idea of how to make The Homebrewery better? Or did you find something that wasn't quite right? Check out the [GitHub Repo](https://github.com/naturalcrit/homebrewery/) to report technical issues. +Have an idea to make The Homebrewery better? Or did you find something that wasn't quite right? Check out the [GitHub Repo](https://github.com/naturalcrit/homebrewery/) to report technical issues. ### Legal Junk -The Homebrewery is licensed using the [MIT License](https://github.com/naturalcrit/homebrewery/blob/master/license). Which means you are free to use The Homebrewery any way that you want, except for claiming that you made it yourself. +The Homebrewery is licensed using the [MIT License](https://github.com/naturalcrit/homebrewery/blob/master/license). Which means you are free to use The Homebrewery codebase any way that you want, except for claiming that you made it yourself. If you wish to sell or in some way gain profit for what's created on this site, it's your responsibility to ensure you have the proper licenses/rights for any images or resources used. @@ -83,32 +83,37 @@ If you are looking for more 5e Homebrew resources check out [r/UnearthedArcana]( \page ## Markdown+ -Homebrewery aims to make homebrewering as simple as possible, providing a live editor in combination with Markdown syntax for formatting. +The Homebrewery aims to make homebrewing as simple as possible, providing a live editor with Markdown syntax that is more human-readable and faster to write with than raw HTML. -In version 3.0.0, with a goal of retaining maximum flexibility while elmininating the need for any HTML in a brew, Homebrewery has developed additional Markdown-like syntax. +In version 3.0.0, with a goal of adding maximum flexibility without users resorting to complex HTML to accomplish simple tasks, Homebrewery provides an extended verision of Markdown with additional syntax. {{text-align:center -**You must enable v3 via the metadata editor!** +**You can enable V3 via the {{fa,fa-info-circle}} **Properties** button!** }} ### Curly Brackets -The biggest change in version 3 is the replacement of `` and `
` with `{{ }}`. Inline spans and block elements can be created and given ID's and Classes, as well as css properties, each of which are comma separated with no spaces. Spans and Blocks start the same: +The biggest change in V3 is the replacement of `` and `
` with `{{ }}` for a cleaner custom formatting. Inline spans and block elements can be created and given ID's and Classes, as well as css properties, each of which are comma separated with no spaces. Use double quotes if a value requires spaces. Spans and Blocks start the same: #### Span -My favorite author is {{pen,#author,color:orange,font-family:"trebuchet ms" Brandon Sanderson}}. The orange text is given a class of `pen`, and id of `author`, colored orange, and given a new font. +My favorite author is {{pen,#author,color:orange,font-family:"trebuchet ms" Brandon Sanderson}}. The orange text is given a class of `pen`, and id of `author`, colored orange, and given a new font. Note that the first space outside of quotes marks the beginning of the content. #### Block {{purple,#book,background:#aa88aa55,text-align:center -My favorite book is Wheel of Time. This block has a class of `purple`, an id of `book`, and has been styled with a purple background and centered text. +My favorite book is Wheel of Time. This block has a class of `purple`, an id of `book`, and has been styled with a purple background and centered text. Note that the opening and curly brackets are on their own lines without any other contents. }} #### Injection -For any element that is not inside a span or block, you can *inject* attributes using the same syntax but with single brackets immediately after the element. Below, a width and border are set for an image: +For any element not inside a span or block, you can *inject* attributes using the same syntax but with single brackets in a single line immediately after the element. -![alt-text](https://s-media-cache-ak0.pinimg.com/736x/4a/81/79/4a8179462cfdf39054a418efd4cb743e.jpg) {width:100px,border:"2px solid",border-radius:10px} +Inline elements like *italics* {color:#D35400} or images require the injection on the same line. + +Block elements like headers require injection starting on the line immediately following. + +##### A Purple Header +{color:purple} \* *this does not currently work for tables yet* @@ -122,16 +127,12 @@ Much nicer than `




` ### Definition Lists V3 uses HTML *definition lists* to create "lists" with hanging indents. - -**Condition Immunities** :: Here is some text that is long and overflows into a second line, creating a "hanging indent". -**Senses** :: Here is some text that is long and overflows into a second line, creating a "hanging indent". - - +**Senses** :: Here is some text that is long and overflows into a second line, creating a "hanging indent". \column ### Tables -New in v3.0.0 is the option to add column & row spanning between cells. You can see a working example in the updated Class Table Snippet, but a simplified example is given below. +Tables now allow column & row spanning between cells. This is included in some updated snippets, but a simplified example is given below. A cell can be spanned across columns by bunching pipe `|` characters together. @@ -156,7 +157,7 @@ Images must be hosted online somewhere, like [Imgur](https://www.imgur.com). You Using *Curly Injection* you can assign an id, classes, or specific inline CSS properties to the image. -::: +![alt-text](https://s-media-cache-ak0.pinimg.com/736x/4a/81/79/4a8179462cfdf39054a418efd4cb743e.jpg) {width:100px,border:"2px solid",border-radius:10px} \* *When using Imgur-hosted images, use the "direct link", which can be found when you click into your image in the Imgur interace.* From 69a69bbb82e897839c146c85aad75c99c67ec258 Mon Sep 17 00:00:00 2001 From: Gazook89 <58999374+Gazook89@users.noreply.github.com> Date: Wed, 11 Aug 2021 21:44:39 -0500 Subject: [PATCH 030/188] Add 'editor' property to snippets.js Add another property to the snippet groups, "editor", with values either "text" or "style". --- client/homebrew/editor/snippetbar/snippets/snippets.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/client/homebrew/editor/snippetbar/snippets/snippets.js b/client/homebrew/editor/snippetbar/snippets/snippets.js index 6e26ab9ee..ad8dc2750 100644 --- a/client/homebrew/editor/snippetbar/snippets/snippets.js +++ b/client/homebrew/editor/snippetbar/snippets/snippets.js @@ -14,6 +14,7 @@ module.exports = [ { groupName : 'Editor', icon : 'fas fa-pencil-alt', + editor : 'text', snippets : [ { name : 'Column Break', @@ -129,6 +130,7 @@ module.exports = [ { groupName : 'PHB', icon : 'fas fa-book', + editor : 'text', snippets : [ { name : 'Spell', @@ -208,6 +210,7 @@ module.exports = [ { groupName : 'Tables', icon : 'fas fa-table', + editor : 'text', snippets : [ { name : 'Class Table', @@ -290,6 +293,7 @@ module.exports = [ { groupName : 'Page', icon : 'fas fa-print', + editor : 'style', snippets : [ { name : 'A4 Page Size', From 3d9f8ea142f4fb5d622f550a3633a5aaeeb506ff Mon Sep 17 00:00:00 2001 From: Gazook89 <58999374+Gazook89@users.noreply.github.com> Date: Thu, 12 Aug 2021 06:01:48 -0500 Subject: [PATCH 031/188] Update snippet.js 'editor' to 'view' Change new property 'editor' to 'view' on @calculuschild 's recommendation. --- client/homebrew/editor/snippetbar/snippets/snippets.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client/homebrew/editor/snippetbar/snippets/snippets.js b/client/homebrew/editor/snippetbar/snippets/snippets.js index ad8dc2750..8f608a614 100644 --- a/client/homebrew/editor/snippetbar/snippets/snippets.js +++ b/client/homebrew/editor/snippetbar/snippets/snippets.js @@ -14,7 +14,7 @@ module.exports = [ { groupName : 'Editor', icon : 'fas fa-pencil-alt', - editor : 'text', + view : 'text', snippets : [ { name : 'Column Break', @@ -130,7 +130,7 @@ module.exports = [ { groupName : 'PHB', icon : 'fas fa-book', - editor : 'text', + view : 'text', snippets : [ { name : 'Spell', @@ -210,7 +210,7 @@ module.exports = [ { groupName : 'Tables', icon : 'fas fa-table', - editor : 'text', + view : 'text', snippets : [ { name : 'Class Table', @@ -293,7 +293,7 @@ module.exports = [ { groupName : 'Page', icon : 'fas fa-print', - editor : 'style', + view : 'style', snippets : [ { name : 'A4 Page Size', From 3545bdc5868dcda1b9014ce3e17bc550e7794cb3 Mon Sep 17 00:00:00 2001 From: Gazook89 <58999374+Gazook89@users.noreply.github.com> Date: Thu, 12 Aug 2021 06:59:55 -0500 Subject: [PATCH 032/188] Update snippetbar.jsx with filter for editor/view specific menus Add logic to filter available snippet menus based on the view/editor that is open ("text" vs "style") for both Legacy and v3. --- .../homebrew/editor/snippetbar/snippetbar.jsx | 24 +++++++++++++++---- .../snippetbar/snippetsLegacy/snippets.js | 4 ++++ 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/client/homebrew/editor/snippetbar/snippetbar.jsx b/client/homebrew/editor/snippetbar/snippetbar.jsx index 0c054b12b..560786344 100644 --- a/client/homebrew/editor/snippetbar/snippetbar.jsx +++ b/client/homebrew/editor/snippetbar/snippetbar.jsx @@ -39,12 +39,26 @@ const Snippetbar = createClass({ renderSnippetGroups : function(){ let snippets = []; - if(this.props.view === 'text') { - if(this.props.renderer === 'V3') - snippets = SnippetsV3; + + if(this.props.renderer === 'V3') + if(this.props.view === 'text') { + snippets = SnippetsV3.filter(SnippetsV3 => SnippetsV3.view === 'text'); + } + else if(this.props.view === 'style') { + snippets = SnippetsV3.filter(SnippetsV3 => SnippetsV3.view === 'style'); + } else - snippets = SnippetsLegacy; - } + snippets = null + else + if(this.props.view === 'text') { + snippets = SnippetsLegacy.filter(SnippetsLegacy => SnippetsLegacy.view === 'text'); + } + else if(this.props.view === 'style') { + snippets = SnippetsLegacy.filter(SnippetsLegacy => SnippetsLegacy.view === 'style'); + } + else + snippets = null + return _.map(snippets, (snippetGroup)=>{ return Date: Thu, 12 Aug 2021 07:00:51 -0500 Subject: [PATCH 033/188] Change 'print' to 'page' on Legacy snippet.js Tiny fix to change "Print" menu to "Page" menu on Legacy. --- client/homebrew/editor/snippetbar/snippetsLegacy/snippets.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/homebrew/editor/snippetbar/snippetsLegacy/snippets.js b/client/homebrew/editor/snippetbar/snippetsLegacy/snippets.js index d497148e3..b66430dbb 100644 --- a/client/homebrew/editor/snippetbar/snippetsLegacy/snippets.js +++ b/client/homebrew/editor/snippetbar/snippetsLegacy/snippets.js @@ -266,7 +266,7 @@ module.exports = [ /**************** PRINT *************/ { - groupName : 'Print', + groupName : 'Page', icon : 'fas fa-print', view : 'style', snippets : [ From 807f865d8b1ea88db7c640eb201f05993e32f2eb Mon Sep 17 00:00:00 2001 From: Gazook89 <58999374+Gazook89@users.noreply.github.com> Date: Thu, 12 Aug 2021 07:42:08 -0500 Subject: [PATCH 034/188] Match Legacy snippets to v3, remove ' + gen : ['/* A4 Page Size */', + '.phb{', + ' width : 210mm;', + ' height : 296.8mm;', + '}', + '' ].join('\n') }, { name : 'Square Page Size', icon : 'far fa-file', - gen : ['' + gen : ['/* Square Page Size */', + '.page {', + ' width:5.25in;', + ' height:5.25in;', + ' padding:.5in;', + ' columns:unset;', + '}', + '' ].join('\n') }, { name : 'Ink Friendly', icon : 'fas fa-tint', - gen : ['', + gen : ['/* Ink Friendly */', + '.pages *:is(.page,.monster,.note,.descriptive) {', + ' background:white !important;', + ' box-shadow:0px 0px 3px !important;', + '}', + '', + '.page .note:before {', + ' box-shadow:0px 0px 3px;', + '}', '' ].join('\n') }, diff --git a/client/homebrew/editor/snippetbar/snippetsLegacy/snippets.js b/client/homebrew/editor/snippetbar/snippetsLegacy/snippets.js index b66430dbb..5015d371a 100644 --- a/client/homebrew/editor/snippetbar/snippetsLegacy/snippets.js +++ b/client/homebrew/editor/snippetbar/snippetsLegacy/snippets.js @@ -271,24 +271,36 @@ module.exports = [ view : 'style', snippets : [ { - name : 'A4 PageSize', + name : 'A4 Page Size', icon : 'far fa-file', - gen : ['' + '}' + ].join('\n') + }, + { + name : 'Square Page Size', + icon : 'far fa-file', + gen : ['/* Square Page Size */', + '.phb {', + ' width:5.25in;', + ' height:5.25in;', + ' padding:.5in;', + ' columns:unset;', + '}', + '' ].join('\n') }, { name : 'Ink Friendly', icon : 'fas fa-tint', - gen : ['', + gen : ['/* Ink Friendly */', + '.phb, .phb blockquote, .phb hr+blockquote {', + ' background : white;', + ' box-shadow : 0px 0px 3px;', + '}', '' ].join('\n') }, From 562bf6d4ac29ecff79b9d233dbc0c5292c8c68bd Mon Sep 17 00:00:00 2001 From: Gazook89 <58999374+Gazook89@users.noreply.github.com> Date: Thu, 12 Aug 2021 07:45:00 -0500 Subject: [PATCH 035/188] Fix to snippets.js both legacy and v3 for CircleCI --- client/homebrew/editor/snippetbar/snippets/snippets.js | 8 ++++---- .../homebrew/editor/snippetbar/snippetsLegacy/snippets.js | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/client/homebrew/editor/snippetbar/snippets/snippets.js b/client/homebrew/editor/snippetbar/snippets/snippets.js index 39f28133c..a4c47d765 100644 --- a/client/homebrew/editor/snippetbar/snippets/snippets.js +++ b/client/homebrew/editor/snippetbar/snippets/snippets.js @@ -14,7 +14,7 @@ module.exports = [ { groupName : 'Editor', icon : 'fas fa-pencil-alt', - view : 'text', + view : 'text', snippets : [ { name : 'Column Break', @@ -130,7 +130,7 @@ module.exports = [ { groupName : 'PHB', icon : 'fas fa-book', - view : 'text', + view : 'text', snippets : [ { name : 'Spell', @@ -210,7 +210,7 @@ module.exports = [ { groupName : 'Tables', icon : 'fas fa-table', - view : 'text', + view : 'text', snippets : [ { name : 'Class Table', @@ -293,7 +293,7 @@ module.exports = [ { groupName : 'Page', icon : 'fas fa-print', - view : 'style', + view : 'style', snippets : [ { name : 'A4 Page Size', diff --git a/client/homebrew/editor/snippetbar/snippetsLegacy/snippets.js b/client/homebrew/editor/snippetbar/snippetsLegacy/snippets.js index 5015d371a..b9cf865a9 100644 --- a/client/homebrew/editor/snippetbar/snippetsLegacy/snippets.js +++ b/client/homebrew/editor/snippetbar/snippetsLegacy/snippets.js @@ -13,7 +13,7 @@ module.exports = [ { groupName : 'Editor', icon : 'fas fa-pencil-alt', - view : 'text', + view : 'text', snippets : [ { name : 'Column Break', @@ -115,7 +115,7 @@ module.exports = [ { groupName : 'PHB', icon : 'fas fa-book', - view : 'text', + view : 'text', snippets : [ { name : 'Spell', @@ -183,7 +183,7 @@ module.exports = [ { groupName : 'Tables', icon : 'fas fa-table', - view : 'text', + view : 'text', snippets : [ { name : 'Class Table', @@ -268,7 +268,7 @@ module.exports = [ { groupName : 'Page', icon : 'fas fa-print', - view : 'style', + view : 'style', snippets : [ { name : 'A4 Page Size', From 88c485ffe5934c44e16b668baf0df0473ee25411 Mon Sep 17 00:00:00 2001 From: Gazook89 <58999374+Gazook89@users.noreply.github.com> Date: Thu, 12 Aug 2021 21:10:13 -0500 Subject: [PATCH 036/188] circleCI fix hopefully last one.. circleCI fixes circleCI fixes --- .../homebrew/editor/snippetbar/snippetbar.jsx | 28 ++++++++----------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/client/homebrew/editor/snippetbar/snippetbar.jsx b/client/homebrew/editor/snippetbar/snippetbar.jsx index 560786344..5302a339b 100644 --- a/client/homebrew/editor/snippetbar/snippetbar.jsx +++ b/client/homebrew/editor/snippetbar/snippetbar.jsx @@ -39,26 +39,20 @@ const Snippetbar = createClass({ renderSnippetGroups : function(){ let snippets = []; - if(this.props.renderer === 'V3') if(this.props.view === 'text') { - snippets = SnippetsV3.filter(SnippetsV3 => SnippetsV3.view === 'text'); - } - else if(this.props.view === 'style') { - snippets = SnippetsV3.filter(SnippetsV3 => SnippetsV3.view === 'style'); - } - else - snippets = null + snippets = SnippetsV3.filter((SnippetsV3)=>SnippetsV3.view === 'text'); + } else if(this.props.view === 'style') { + snippets = SnippetsV3.filter((SnippetsV3)=>SnippetsV3.view === 'style'); + } else + snippets = null; else - if(this.props.view === 'text') { - snippets = SnippetsLegacy.filter(SnippetsLegacy => SnippetsLegacy.view === 'text'); - } - else if(this.props.view === 'style') { - snippets = SnippetsLegacy.filter(SnippetsLegacy => SnippetsLegacy.view === 'style'); - } - else - snippets = null - + if(this.props.view === 'text') { + snippets = SnippetsLegacy.filter((SnippetsLegacy)=>SnippetsLegacy.view === 'text'); + } else if(this.props.view === 'style') { + snippets = SnippetsLegacy.filter((SnippetsLegacy)=>SnippetsLegacy.view === 'style'); + } else + snippets = null; return _.map(snippets, (snippetGroup)=>{ return Date: Fri, 13 Aug 2021 03:00:59 +0000 Subject: [PATCH 037/188] Bump nanoid from 3.1.23 to 3.1.25 Bumps [nanoid](https://github.com/ai/nanoid) from 3.1.23 to 3.1.25. - [Release notes](https://github.com/ai/nanoid/releases) - [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md) - [Commits](https://github.com/ai/nanoid/compare/3.1.23...3.1.25) --- updated-dependencies: - dependency-name: nanoid dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 19aa2bb61..c75f61fdf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,7 +31,7 @@ "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.29.1", "mongoose": "^5.13.6", - "nanoid": "3.1.23", + "nanoid": "3.1.25", "nconf": "^0.11.3", "prop-types": "15.7.2", "query-string": "7.0.1", @@ -6405,9 +6405,9 @@ "optional": true }, "node_modules/nanoid": { - "version": "3.1.23", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", - "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==", + "version": "3.1.25", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", + "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -14420,9 +14420,9 @@ "optional": true }, "nanoid": { - "version": "3.1.23", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", - "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==" + "version": "3.1.25", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", + "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==" }, "nanomatch": { "version": "1.2.13", diff --git a/package.json b/package.json index 3e185be9d..bb36a7d3b 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.29.1", "mongoose": "^5.13.6", - "nanoid": "3.1.23", + "nanoid": "3.1.25", "nconf": "^0.11.3", "prop-types": "15.7.2", "query-string": "7.0.1", From 9dc6d2532a697af7dbe563bbab7464524dc439e3 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Fri, 13 Aug 2021 14:38:43 -0400 Subject: [PATCH 038/188] Drastic simplification of SpanTables via better regex Thanks @ericscheid for finding a good regex! --- shared/naturalcrit/markdown.js | 43 +++++++--------------------------- 1 file changed, 9 insertions(+), 34 deletions(-) diff --git a/shared/naturalcrit/markdown.js b/shared/naturalcrit/markdown.js index 8bdda100e..0eef037db 100644 --- a/shared/naturalcrit/markdown.js +++ b/shared/naturalcrit/markdown.js @@ -369,53 +369,28 @@ const getTableCell = (text, cell, type, align)=>{ }; const splitCells = (tableRow, count, prevRow = [])=>{ - // trim any excessive pipes at start of row - tableRow = tableRow.replace(/^\|+(?=\|)/, '') - .replace(/(\|)(\|*)/g, (match, p1, p2, offset, str)=>{ - let escaped = false, - curr = offset; - while (--curr >= 0 && str[curr] === '\\') escaped = !escaped; - if(escaped) { - // odd number of slashes means | is escaped - // so apply a space after to separate from unescaped pipes - return `${p1} ${p2}`; - } else { - // add space before unescaped | to distinguish it from an escaped pipe - return ` ${p1}${p2}`; - } - }); - tableRow = ` ${tableRow}`; + const cells = [...tableRow.matchAll(/(?:[^|\\]|\\.?)+(?:\|+|$)/g)].map((x)=>x[0]); - // Split into cells by matching anything that ends with space followed by pipes - const cells = [...tableRow.matchAll(/[^\|].*?(?: \|+|$)/g)].map((x)=>{ - if(x[0].slice(-2) == ' |') //Cut off the added space too if only one pipe - return x[0].slice(0, -2); - else { - return x[0].slice(0, -1); - } - }); - - // First/last cell in a row cannot be empty if it has no leading/trailing pipe - if(!cells[0].trim()) { cells.shift(); } - if(!cells[cells.length - 1].trim()) { cells.pop(); } + // Remove first/last cell in a row if whitespace only and no leading/trailing pipe + if(!cells[0]?.trim()) { cells.shift(); } + if(!cells[cells.length - 1]?.trim()) { cells.pop(); } let numCols = 0; - let i = 0; + let i, j, trimmedCell, prevCell, prevCols; - for (; i < cells.length; i++) { - const trimmedCell = cells[i].split(/ \|+$/)[0]; + for (i = 0; i < cells.length; i++) { + trimmedCell = cells[i].split(/\|+$/)[0]; cells[i] = { rowspan : 1, colspan : Math.max(cells[i].length - trimmedCell.length, 1), text : trimmedCell.trim().replace(/\\\|/g, '|') - // trim whitespace and display escaped pipes as normal character + // display escaped pipes as normal character }; // Handle Rowspan if(trimmedCell.slice(-1) == '^' && prevRow.length) { // Find matching cell in previous row - let prevCols = 0; - let j, prevCell; + prevCols = 0; for (j = 0; j < prevRow.length; j++) { prevCell = prevRow[j]; if((prevCols == numCols) && (prevCell.colspan == cells[i].colspan)) { From 4588e02faf2060bd3e3f22fceac8270e5fe38405 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 13 Aug 2021 19:03:49 +0000 Subject: [PATCH 039/188] Bump mongoose from 5.13.6 to 5.13.7 Bumps [mongoose](https://github.com/Automattic/mongoose) from 5.13.6 to 5.13.7. - [Release notes](https://github.com/Automattic/mongoose/releases) - [Changelog](https://github.com/Automattic/mongoose/blob/master/History.md) - [Commits](https://github.com/Automattic/mongoose/commits/5.13.7) --- updated-dependencies: - dependency-name: mongoose dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index c75f61fdf..b96f158e9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,7 +30,7 @@ "marked": "2.1.3", "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.29.1", - "mongoose": "^5.13.6", + "mongoose": "^5.13.7", "nanoid": "3.1.25", "nconf": "^0.11.3", "prop-types": "15.7.2", @@ -6321,9 +6321,9 @@ } }, "node_modules/mongoose": { - "version": "5.13.6", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.13.6.tgz", - "integrity": "sha512-IyswXkgxnnl+rpiU+lzXl5/BOEle2llDfuPBrN6K+Eb5vS6a/HN/A9zrdtOcSTb0tVoCZ0QN5PfDSwa/EEGBuQ==", + "version": "5.13.7", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.13.7.tgz", + "integrity": "sha512-ADIvftZ+KfoTALMZ0n8HvBlezFhcUd73hQaHQDwQ+3X+JZlqE47fUy9yhFZ2SjT+qzmuaCcIXCfhewIc38t2fQ==", "dependencies": { "@types/mongodb": "^3.5.27", "bson": "^1.1.4", @@ -14345,9 +14345,9 @@ } }, "mongoose": { - "version": "5.13.6", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.13.6.tgz", - "integrity": "sha512-IyswXkgxnnl+rpiU+lzXl5/BOEle2llDfuPBrN6K+Eb5vS6a/HN/A9zrdtOcSTb0tVoCZ0QN5PfDSwa/EEGBuQ==", + "version": "5.13.7", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.13.7.tgz", + "integrity": "sha512-ADIvftZ+KfoTALMZ0n8HvBlezFhcUd73hQaHQDwQ+3X+JZlqE47fUy9yhFZ2SjT+qzmuaCcIXCfhewIc38t2fQ==", "requires": { "@types/mongodb": "^3.5.27", "bson": "^1.1.4", diff --git a/package.json b/package.json index bb36a7d3b..988c36f55 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "marked": "2.1.3", "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.29.1", - "mongoose": "^5.13.6", + "mongoose": "^5.13.7", "nanoid": "3.1.25", "nconf": "^0.11.3", "prop-types": "15.7.2", From 58568468f6c640234a32a50faac683253c2601ff Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Sat, 14 Aug 2021 00:52:35 -0400 Subject: [PATCH 040/188] Fix font in v3. Clean up LESS formatting. --- themes/5ePhb.style.less | 23 ++++++++++++----------- themes/5ePhbLegacy.style.less | 23 ++++++++++++----------- themes/fonts/5e/fonts.less | 2 +- 3 files changed, 25 insertions(+), 23 deletions(-) diff --git a/themes/5ePhb.style.less b/themes/5ePhb.style.less index 2dd99c95b..04b0e7418 100644 --- a/themes/5ePhb.style.less +++ b/themes/5ePhb.style.less @@ -267,23 +267,24 @@ body { // * ARTIST CREDIT BLOCK // *****************************/ .artist { - position:absolute; - text-align:center; - font-family:'WalterTurncoat','ScalySansSmallCapsRemake', sans-serif; - font-size:10px; + position : absolute; + text-align : center; + font-family : WalterTurncoat; + font-size : 0.27cm; p, p + p { - margin:unset; - text-indent:unset; - line-height:1em; + margin : unset; + text-indent : unset; + line-height : 1em; } h5 { - font-size:1.3em; + font-size : 1.3em; + font-family : WalterTurncoat; } a{ - color:black; - text-decoration:unset; + color : black; + text-decoration : unset; &:hover { - text-decoration:underline; + text-decoration :underline; } } } diff --git a/themes/5ePhbLegacy.style.less b/themes/5ePhbLegacy.style.less index a5e5e4610..bb6c570d9 100644 --- a/themes/5ePhbLegacy.style.less +++ b/themes/5ePhbLegacy.style.less @@ -451,23 +451,24 @@ body { // *****************************/ .phb { .artist { - position:absolute; - text-align:center; - font-family:'WalterTurncoat','ScalySansSmallCapsRemake', sans-serif; - font-size:10px; + position : absolute; + text-align : center; + font-family : WalterTurncoat; + font-size : 0.27cm; p, p + p { - margin:unset; - text-indent:unset; - line-height:1em; + margin : unset; + text-indent : unset; + line-height : 1em; } h5 { - font-size:1.3em; + font-size : 1.3em; + font-family : WalterTurncoat; } a{ - color:black; - text-decoration:unset; + color : black; + text-decoration : unset; &:hover { - text-decoration:underline; + text-decoration : underline; } } } diff --git a/themes/fonts/5e/fonts.less b/themes/fonts/5e/fonts.less index be7e09d0e..df4f169d2 100644 --- a/themes/fonts/5e/fonts.less +++ b/themes/fonts/5e/fonts.less @@ -56,7 +56,7 @@ font-style: normal; } @font-face { - font-family: 'Walter Turncoat'; + font-family: WalterTurncoat; src: url('../fonts/5e/WalterTurncoat-Regular.woff2'); font-weight: normal; font-style: normal; From 8f7d6a3eb5ba32db5e37fd69bea9b54add4a80e2 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Sat, 14 Aug 2021 23:21:13 -0400 Subject: [PATCH 041/188] Update color, snippet positioning, added into v3 Image and BackgroundImage --- .../editor/snippetbar/snippets/snippets.js | 18 ++++++++++++++---- .../snippetbar/snippetsLegacy/snippets.js | 2 +- themes/5ePhb.style.less | 16 +++++++++------- themes/5ePhbLegacy.style.less | 16 +++++++++------- 4 files changed, 33 insertions(+), 19 deletions(-) diff --git a/client/homebrew/editor/snippetbar/snippets/snippets.js b/client/homebrew/editor/snippetbar/snippets/snippets.js index ba0f477b7..76e444bdd 100644 --- a/client/homebrew/editor/snippetbar/snippets/snippets.js +++ b/client/homebrew/editor/snippetbar/snippets/snippets.js @@ -51,13 +51,23 @@ module.exports = [ name : 'Image', icon : 'fas fa-image', gen : dedent` - ![cat warrior](https://s-media-cache-ak0.pinimg.com/736x/4a/81/79/4a8179462cfdf39054a418efd4cb743e.jpg) {width:325px} - Credit: Kyounghwan Kim` + ![cat warrior](https://s-media-cache-ak0.pinimg.com/736x/4a/81/79/4a8179462cfdf39054a418efd4cb743e.jpg) {width:325px,mix-blend-mode:multiply} + + {{artist,position:relative,top:-230px,left:-100px,margin-bottom:-30px + ##### Cat Warrior + [Kyoung Hwan Kim](https://www.artstation.com/tahra) + }}` }, { name : 'Background Image', icon : 'fas fa-tree', - gen : `![homebrew mug](http://i.imgur.com/hMna6G0.png) {position:absolute,top:50px,right:30px,width:280px}` + gen : dedent` + ![homebrew mug](http://i.imgur.com/hMna6G0.png) {position:absolute,top:50px,right:30px,width:280px} + + {{artist,top:90px,right:30px + ##### Homebrew Mug + [naturalcrit](https://homebrew.naturalcrit.com) + }}` }, { name : 'QR Code', @@ -203,7 +213,7 @@ module.exports = [ icon : 'fas fa-signature', gen : function(){ return dedent` - {{artist,top:10px,left:10px + {{artist,top:90px,right:30px ##### Starry Night [Van Gogh](https://www.vangoghmuseum.nl/en) }} diff --git a/client/homebrew/editor/snippetbar/snippetsLegacy/snippets.js b/client/homebrew/editor/snippetbar/snippetsLegacy/snippets.js index 677b0e826..69f8e1597 100644 --- a/client/homebrew/editor/snippetbar/snippetsLegacy/snippets.js +++ b/client/homebrew/editor/snippetbar/snippetsLegacy/snippets.js @@ -174,7 +174,7 @@ module.exports = [ { name : 'Artist Credit', icon : 'fas fa-signature', - gen : '
\n' + + gen : '
\n' + '##### Starry Night\n' + '[Van Gogh](https://www.vangoghmuseum.nl/en)\n' + '
\n' diff --git a/themes/5ePhb.style.less b/themes/5ePhb.style.less index 04b0e7418..613d66efa 100644 --- a/themes/5ePhb.style.less +++ b/themes/5ePhb.style.less @@ -2,12 +2,13 @@ @import (less) './themes/assets/assets.less'; //Colors -@background : #EEE5CE; -@noteGreen : #e0e5c1; -@headerUnderline : #c9ad6a; -@horizontalRule : #9c2b1b; -@headerText : #58180D; -@monsterStatBackground : #EEDBAB; +@background : #EEE5CE; // Light parchment +@noteGreen : #e0e5c1; // Pastel green +@headerUnderline : #c9ad6a; // Gold +@horizontalRule : #9c2b1b; // Maroon +@headerText : #58180D; // Dark maroon +@monsterStatBackground : #EEDBAB; // Light orange parchment +@captionText : #766649; // Brown @page { margin: 0; } body { counter-reset : phb-page-numbers; @@ -271,6 +272,7 @@ body { text-align : center; font-family : WalterTurncoat; font-size : 0.27cm; + color : @captionText; p, p + p { margin : unset; text-indent : unset; @@ -281,7 +283,7 @@ body { font-family : WalterTurncoat; } a{ - color : black; + color : @captionText; text-decoration : unset; &:hover { text-decoration :underline; diff --git a/themes/5ePhbLegacy.style.less b/themes/5ePhbLegacy.style.less index bb6c570d9..17e11260a 100644 --- a/themes/5ePhbLegacy.style.less +++ b/themes/5ePhbLegacy.style.less @@ -2,12 +2,13 @@ @import (less) './themes/assets/assets.less'; @import (less) './themes/phb.depricated.less'; //Colors -@background : #EEE5CE; -@noteGreen : #e0e5c1; -@headerUnderline : #c9ad6a; -@horizontalRule : #9c2b1b; -@headerText : #58180D; -@monsterStatBackground : #FDF1DC; +@background : #EEE5CE; // Light parchment +@noteGreen : #e0e5c1; // Pastel green +@headerUnderline : #c9ad6a; // Gold +@horizontalRule : #9c2b1b; // Maroon +@headerText : #58180D; // Dark maroon +@monsterStatBackground : #FDF1DC; // Lighter parchment +@captionText : #766649; // Brown @page { margin: 0; } body { counter-reset : phb-page-numbers; @@ -455,6 +456,7 @@ body { text-align : center; font-family : WalterTurncoat; font-size : 0.27cm; + color : @captionText; p, p + p { margin : unset; text-indent : unset; @@ -465,7 +467,7 @@ body { font-family : WalterTurncoat; } a{ - color : black; + color : @captionText; text-decoration : unset; &:hover { text-decoration : underline; From d8536438740de90cce5b62aa8bdcc02419be2f6d Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Sat, 14 Aug 2021 23:38:21 -0400 Subject: [PATCH 042/188] Inherit colors --- themes/5ePhb.style.less | 4 ++-- themes/5ePhbLegacy.style.less | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/themes/5ePhb.style.less b/themes/5ePhb.style.less index 613d66efa..095d7c568 100644 --- a/themes/5ePhb.style.less +++ b/themes/5ePhb.style.less @@ -283,10 +283,10 @@ body { font-family : WalterTurncoat; } a{ - color : @captionText; + color : inherit; text-decoration : unset; &:hover { - text-decoration :underline; + text-decoration : underline; } } } diff --git a/themes/5ePhbLegacy.style.less b/themes/5ePhbLegacy.style.less index 17e11260a..d814d4036 100644 --- a/themes/5ePhbLegacy.style.less +++ b/themes/5ePhbLegacy.style.less @@ -467,7 +467,7 @@ body { font-family : WalterTurncoat; } a{ - color : @captionText; + color : inherit; text-decoration : unset; &:hover { text-decoration : underline; From 521c393b746d35c9e705c3d0d61269200ece319d Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Sun, 15 Aug 2021 15:51:24 +1200 Subject: [PATCH 043/188] Add title filtering to User Page. --- client/homebrew/pages/userPage/userPage.jsx | 32 ++++++++++++++++++-- client/homebrew/pages/userPage/userPage.less | 3 +- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/client/homebrew/pages/userPage/userPage.jsx b/client/homebrew/pages/userPage/userPage.jsx index 9e78ee6ea..58bce39b6 100644 --- a/client/homebrew/pages/userPage/userPage.jsx +++ b/client/homebrew/pages/userPage/userPage.jsx @@ -31,8 +31,9 @@ const UserPage = createClass({ }, getInitialState : function() { return { - sortType : 'alpha', - sortDir : 'asc' + sortType : 'alpha', + sortDir : 'asc', + filterString : '' }; }, getUsernameWithS : function() { @@ -52,6 +53,7 @@ const UserPage = createClass({ }, sortBrewOrder : function(brew){ + if(!brew.title){brew.title='No Title';}; const mapping = { 'alpha' : _.deburr(brew.title.toLowerCase()), 'created' : moment(brew.createdAt).format(), @@ -90,6 +92,25 @@ const UserPage = createClass({ ; }, + handleFilterTextChange : function(e){ + this.setState({ + filterString : e.target.value + }); + return; + }, + + renderFilterOption : function(){ + return + + ; + }, + renderSortOptions : function(){ return
@@ -114,6 +135,7 @@ const UserPage = createClass({ {`${(this.state.sortDir == 'asc' ? '\u25B2 ASC' : '\u25BC DESC')}`} + {this.renderFilterOption()}
@@ -121,7 +143,11 @@ const UserPage = createClass({ }, getSortedBrews : function(){ - return _.groupBy(this.props.brews, (brew)=>{ + const testString = _.deburr(this.state.filterString).toLowerCase(); + const brewCollection = this.state.filterString ? _.filter(this.props.brews, (brew)=>{ + return (_.deburr(brew?.title).toLowerCase().includes(testString)); + }) : this.props.brews; + return _.groupBy(brewCollection, (brew)=>{ return (brew.published ? 'published' : 'private'); }); }, diff --git a/client/homebrew/pages/userPage/userPage.less b/client/homebrew/pages/userPage/userPage.less index c7e8621e3..3b1fa0260 100644 --- a/client/homebrew/pages/userPage/userPage.less +++ b/client/homebrew/pages/userPage/userPage.less @@ -34,8 +34,9 @@ font-family : 'Open Sans', sans-serif; position : fixed; top : 35px; + left : calc(50vw - 408px); border : 2px solid #58180D; - width : 675px; + width : 800px; background-color : #EEE5CE; padding : 2px; text-align : center; From a7e6d0a5138c2639ccda26582956aa4518c4494a Mon Sep 17 00:00:00 2001 From: Gazook89 <58999374+Gazook89@users.noreply.github.com> Date: Sat, 14 Aug 2021 23:34:12 -0500 Subject: [PATCH 044/188] Update metadataEditor.less "small" text --- client/homebrew/editor/metadataEditor/metadataEditor.less | 3 --- 1 file changed, 3 deletions(-) diff --git a/client/homebrew/editor/metadataEditor/metadataEditor.less b/client/homebrew/editor/metadataEditor/metadataEditor.less index a58df14cd..c046b655d 100644 --- a/client/homebrew/editor/metadataEditor/metadataEditor.less +++ b/client/homebrew/editor/metadataEditor/metadataEditor.less @@ -62,9 +62,6 @@ .button(@silver); } small{ - position : absolute; - bottom : -15px; - left : 0px; font-size : 0.6em; font-style : italic; } From edce4e5bbc10bba6af4aa5fb4a51d713a9efa819 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Sun, 15 Aug 2021 00:45:01 -0400 Subject: [PATCH 045/188] Refactoring switching logic, formatting LESS --- .../homebrew/editor/snippetbar/snippetbar.jsx | 14 +------ .../editor/snippetbar/snippets/snippets.js | 39 ++++++++++--------- .../snippetbar/snippetsLegacy/snippets.js | 33 +++++++++------- 3 files changed, 41 insertions(+), 45 deletions(-) diff --git a/client/homebrew/editor/snippetbar/snippetbar.jsx b/client/homebrew/editor/snippetbar/snippetbar.jsx index 5302a339b..9ea04695f 100644 --- a/client/homebrew/editor/snippetbar/snippetbar.jsx +++ b/client/homebrew/editor/snippetbar/snippetbar.jsx @@ -40,19 +40,9 @@ const Snippetbar = createClass({ let snippets = []; if(this.props.renderer === 'V3') - if(this.props.view === 'text') { - snippets = SnippetsV3.filter((SnippetsV3)=>SnippetsV3.view === 'text'); - } else if(this.props.view === 'style') { - snippets = SnippetsV3.filter((SnippetsV3)=>SnippetsV3.view === 'style'); - } else - snippets = null; + snippets = SnippetsV3.filter((snippetGroup)=>snippetGroup.view === this.props.view); else - if(this.props.view === 'text') { - snippets = SnippetsLegacy.filter((SnippetsLegacy)=>SnippetsLegacy.view === 'text'); - } else if(this.props.view === 'style') { - snippets = SnippetsLegacy.filter((SnippetsLegacy)=>SnippetsLegacy.view === 'style'); - } else - snippets = null; + snippets = SnippetsLegacy.filter((snippetGroup)=>snippetGroup.view === this.props.view); return _.map(snippets, (snippetGroup)=>{ return Date: Sun, 15 Aug 2021 00:51:22 -0400 Subject: [PATCH 046/188] Lint --- server.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/server.js b/server.js index d0d7b351d..281a0477d 100644 --- a/server.js +++ b/server.js @@ -45,14 +45,14 @@ const sanitizeBrew = (brew, full=false)=>{ return brew; }; -const splitTextAndStyle = (brew) => { - brew.text = brew.text.replaceAll('\r\n','\n'); +const splitTextAndStyle = (brew)=>{ + brew.text = brew.text.replaceAll('\r\n', '\n'); if(brew.text.startsWith('```css')) { const index = brew.text.indexOf('```\n\n'); brew.style = brew.text.slice(7, index - 1); brew.text = brew.text.slice(index + 5); } -} +}; app.use('/', serveCompressedStaticAssets(`${__dirname}/build`)); @@ -101,7 +101,7 @@ app.use(require('./server/admin.api.js')); const HomebrewModel = require('./server/homebrew.model.js').model; const welcomeText = require('fs').readFileSync('./client/homebrew/pages/homePage/welcome_msg.md', 'utf8'); -const welcomeText_v3 = require('fs').readFileSync('./client/homebrew/pages/homePage/welcome_msg_v3.md', 'utf8'); +const welcomeTextV3 = require('fs').readFileSync('./client/homebrew/pages/homePage/welcome_msg_v3.md', 'utf8'); const changelogText = require('fs').readFileSync('./changelog.md', 'utf8'); String.prototype.replaceAll = function(s, r){return this.split(s).join(r);}; @@ -123,7 +123,7 @@ app.get('/', async (req, res, next)=>{ //Home page v3 app.get('/v3_preview', async (req, res, next)=>{ const brew = { - text : welcomeText_v3, + text : welcomeTextV3, renderer : 'V3' }; splitTextAndStyle(brew); From 501b356344ab4b874bffa567b449efd719be93a4 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Sun, 15 Aug 2021 19:15:43 +1200 Subject: [PATCH 047/188] Updates based on Gitter feedback --- client/homebrew/pages/userPage/userPage.jsx | 8 +++++--- client/homebrew/pages/userPage/userPage.less | 3 +++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/client/homebrew/pages/userPage/userPage.jsx b/client/homebrew/pages/userPage/userPage.jsx index 58bce39b6..b2b0df5ec 100644 --- a/client/homebrew/pages/userPage/userPage.jsx +++ b/client/homebrew/pages/userPage/userPage.jsx @@ -102,9 +102,10 @@ const UserPage = createClass({ renderFilterOption : function(){ return @@ -145,7 +146,8 @@ const UserPage = createClass({ getSortedBrews : function(){ const testString = _.deburr(this.state.filterString).toLowerCase(); const brewCollection = this.state.filterString ? _.filter(this.props.brews, (brew)=>{ - return (_.deburr(brew?.title).toLowerCase().includes(testString)); + return (_.deburr(brew?.title).toLowerCase().includes(testString)) || + (_.deburr(brew?.description).toLowerCase().includes(testString)); }) : this.props.brews; return _.groupBy(brewCollection, (brew)=>{ return (brew.published ? 'published' : 'private'); diff --git a/client/homebrew/pages/userPage/userPage.less b/client/homebrew/pages/userPage/userPage.less index 3b1fa0260..d968aab9a 100644 --- a/client/homebrew/pages/userPage/userPage.less +++ b/client/homebrew/pages/userPage/userPage.less @@ -53,6 +53,9 @@ vertical-align : middle; tbody tr{ background-color: transparent !important; + i{ + padding-right : 5px + } button{ background-color : transparent; color : #58180D; From 3cf05e551fdca5679be5a96757e2555db8c09a7e Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Sun, 15 Aug 2021 20:17:50 +1200 Subject: [PATCH 048/188] Add support for Google Brews. --- server/googleActions.js | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/server/googleActions.js b/server/googleActions.js index 8faa0c720..66deb538a 100644 --- a/server/googleActions.js +++ b/server/googleActions.js @@ -116,10 +116,11 @@ GoogleActions = { updatedAt : file.modifiedTime, gDrive : true, googleId : file.id, + pageCount : file.properties?.pageCount || 1, title : file.properties.title, description : file.description, - views : file.properties.views, + views : file.properties.views, tags : '', published : file.properties.published ? file.properties.published == 'true' : false, authors : [req.account.username], //TODO: properly save and load authors to google drive @@ -154,13 +155,15 @@ GoogleActions = { resource : { name : `${brew.title}.txt`, description : `${brew.description}`, properties : { title : brew.title, - published : brew.published, - lastViewed : brew.lastViewed, - views : brew.views, - version : brew.version, - renderer : brew.renderer, - tags : brew.tags, - systems : brew.systems.join() } + published : brew.published, + lastViewed : brew.lastViewed, + views : brew.views, + version : brew.version, + renderer : brew.renderer, + tags : brew.tags, + systems : brew.systems.join(), + pageCount : (brew.text.match(/\\page/g) || []).length + 1 + } }, media : { mimeType : 'text/plain', body : brew.text } @@ -190,10 +193,11 @@ GoogleActions = { 'description' : `${brew.description}`, 'parents' : [folderId], 'properties' : { //AppProperties is not accessible - 'shareId' : nanoid(12), - 'editId' : nanoid(12), - 'title' : brew.title, - 'views' : '0' + 'shareId' : nanoid(12), + 'editId' : nanoid(12), + 'title' : brew.title, + 'views' : '0', + 'pageCount' : (brew.text.match(/\\page/g) || []).length + 1 } }; @@ -227,6 +231,7 @@ GoogleActions = { updatedAt : new Date(), gDrive : true, googleId : obj.data.id, + pageCount : fileMetadata.properties.pageCount || 1, title : brew.title, description : brew.description, @@ -298,6 +303,7 @@ GoogleActions = { createdAt : obj.data.createdTime, updatedAt : obj.data.modifiedTime, lastViewed : obj.data.properties.lastViewed, + pageCount : obj.data.properties?.pageCount || 1, views : parseInt(obj.data.properties.views) || 0, //brews with no view parameter will return undefined version : parseInt(obj.data.properties.version) || 0, renderer : obj.data.properties.renderer ? obj.data.properties.renderer : 'legacy', From 3489a76a1db228e2b59d9f3ca016897d002fbce9 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Sun, 15 Aug 2021 20:32:23 +1200 Subject: [PATCH 049/188] Hide pageCount on User Page if the brew only has one page --- client/homebrew/pages/userPage/brewItem/brewItem.jsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/client/homebrew/pages/userPage/brewItem/brewItem.jsx b/client/homebrew/pages/userPage/brewItem/brewItem.jsx index c55933685..8a9d90880 100644 --- a/client/homebrew/pages/userPage/brewItem/brewItem.jsx +++ b/client/homebrew/pages/userPage/brewItem/brewItem.jsx @@ -114,9 +114,11 @@ const BrewItem = createClass({ {brew.views} - - {brew.pageCount || 1} - + {(brew?.pageCount>1) && + + {brew.pageCount} + + } {moment(brew.updatedAt).fromNow()} From f0a0c0c11daeb6fd033f6feac539a888730f81eb Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Sat, 31 Jul 2021 17:21:25 +1200 Subject: [PATCH 050/188] Add a page count to User page --- client/homebrew/pages/userPage/brewItem/brewItem.jsx | 4 ++++ client/homebrew/pages/userPage/brewItem/brewItem.less | 3 +++ server/homebrew.api.js | 2 ++ server/homebrew.model.js | 11 ++++++----- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/client/homebrew/pages/userPage/brewItem/brewItem.jsx b/client/homebrew/pages/userPage/brewItem/brewItem.jsx index f0557c47e..7603e19ac 100644 --- a/client/homebrew/pages/userPage/brewItem/brewItem.jsx +++ b/client/homebrew/pages/userPage/brewItem/brewItem.jsx @@ -112,6 +112,7 @@ const BrewItem = createClass({

{brew.title}

{brew.description}


+
@@ -120,6 +121,9 @@ const BrewItem = createClass({ {brew.views} + + {brew.pageCount || 1} + {moment(brew.updatedAt).fromNow()} diff --git a/client/homebrew/pages/userPage/brewItem/brewItem.less b/client/homebrew/pages/userPage/brewItem/brewItem.less index efae9d8d3..7d806e841 100644 --- a/client/homebrew/pages/userPage/brewItem/brewItem.less +++ b/client/homebrew/pages/userPage/brewItem/brewItem.less @@ -69,4 +69,7 @@ padding : 0px; margin : -5px; } + .spacer { + height : 25px; + } } diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 36d0aa576..b865d9193 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -38,6 +38,7 @@ const newBrew = (req, res)=>{ brew.authors = (req.account) ? [req.account.username] : []; brew.text = mergeBrewText(brew.text, brew.style); + brew.pageCount = (brew.text.match(/\\page/g) || []).length + 1; delete brew.editId; delete brew.shareId; @@ -66,6 +67,7 @@ const updateBrew = (req, res)=>{ .then((brew)=>{ brew = _.merge(brew, req.body); brew.text = mergeBrewText(brew.text, brew.style); + brew.pageCount = (brew.text.match(/\\page/g) || []).length + 1; // Compress brew text to binary before saving brew.textBin = zlib.deflateRawSync(brew.text); diff --git a/server/homebrew.model.js b/server/homebrew.model.js index c2abdf199..acc78a624 100644 --- a/server/homebrew.model.js +++ b/server/homebrew.model.js @@ -4,11 +4,12 @@ const _ = require('lodash'); const zlib = require('zlib'); const HomebrewSchema = mongoose.Schema({ - shareId : { type: String, default: ()=>{return nanoid(12);}, index: { unique: true } }, - editId : { type: String, default: ()=>{return nanoid(12);}, index: { unique: true } }, - title : { type: String, default: '' }, - text : { type: String, default: '' }, - textBin : { type: Buffer }, + shareId : { type: String, default: ()=>{return nanoid(12);}, index: { unique: true } }, + editId : { type: String, default: ()=>{return nanoid(12);}, index: { unique: true } }, + title : { type: String, default: '' }, + text : { type: String, default: '' }, + textBin : { type: Buffer }, + pageCount : { type: Number, default: 1 }, description : { type: String, default: '' }, tags : { type: String, default: '' }, From 7b0f5cec977da236e608ffafb94b15560a27db30 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Sun, 15 Aug 2021 20:17:50 +1200 Subject: [PATCH 051/188] Add support for Google Brews. --- server/googleActions.js | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/server/googleActions.js b/server/googleActions.js index eab6babf3..291747349 100644 --- a/server/googleActions.js +++ b/server/googleActions.js @@ -116,10 +116,11 @@ GoogleActions = { updatedAt : file.modifiedTime, gDrive : true, googleId : file.id, + pageCount : file.properties?.pageCount || 1, title : file.properties.title, description : file.description, - views : file.properties.views, + views : file.properties.views, tags : '', published : file.properties.published ? file.properties.published == 'true' : false, authors : [req.account.username], //TODO: properly save and load authors to google drive @@ -154,13 +155,15 @@ GoogleActions = { resource : { name : `${brew.title}.txt`, description : `${brew.description}`, properties : { title : brew.title, - published : brew.published, - lastViewed : brew.lastViewed, - views : brew.views, - version : brew.version, - renderer : brew.renderer, - tags : brew.tags, - systems : brew.systems.join() } + published : brew.published, + lastViewed : brew.lastViewed, + views : brew.views, + version : brew.version, + renderer : brew.renderer, + tags : brew.tags, + systems : brew.systems.join(), + pageCount : (brew.text.match(/\\page/g) || []).length + 1 + } }, media : { mimeType : 'text/plain', body : brew.text } @@ -191,11 +194,12 @@ GoogleActions = { 'description' : `${brew.description}`, 'parents' : [folderId], 'properties' : { //AppProperties is not accessible - 'shareId' : nanoid(12), - 'editId' : nanoid(12), - 'title' : brew.title, - 'views' : '0', - 'renderer' : brew.renderer || 'legacy' + 'shareId' : nanoid(12), + 'editId' : nanoid(12), + 'title' : brew.title, + 'views' : '0', + 'pageCount' : (brew.text.match(/\\page/g) || []).length + 1, + 'renderer' : brew.renderer || 'legacy' } }; @@ -230,6 +234,7 @@ GoogleActions = { updatedAt : new Date(), gDrive : true, googleId : obj.data.id, + pageCount : fileMetadata.properties.pageCount || 1, title : brew.title, description : brew.description, @@ -301,6 +306,7 @@ GoogleActions = { createdAt : obj.data.createdTime, updatedAt : obj.data.modifiedTime, lastViewed : obj.data.properties.lastViewed, + pageCount : obj.data.properties?.pageCount || 1, views : parseInt(obj.data.properties.views) || 0, //brews with no view parameter will return undefined version : parseInt(obj.data.properties.version) || 0, renderer : obj.data.properties.renderer ? obj.data.properties.renderer : 'legacy', From 1edc62d0235b7f5344c3e02c96c21d238c790e55 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Sun, 15 Aug 2021 20:32:23 +1200 Subject: [PATCH 052/188] Hide pageCount on User Page if the brew only has one page --- client/homebrew/pages/userPage/brewItem/brewItem.jsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/client/homebrew/pages/userPage/brewItem/brewItem.jsx b/client/homebrew/pages/userPage/brewItem/brewItem.jsx index 7603e19ac..bd91e0796 100644 --- a/client/homebrew/pages/userPage/brewItem/brewItem.jsx +++ b/client/homebrew/pages/userPage/brewItem/brewItem.jsx @@ -121,9 +121,11 @@ const BrewItem = createClass({ {brew.views} - - {brew.pageCount || 1} - + {(brew?.pageCount>1) && + + {brew.pageCount} + + } {moment(brew.updatedAt).fromNow()} From 76a6c9c2d39ab5f02c1a163f41b9ddc503e66579 Mon Sep 17 00:00:00 2001 From: Gazook89 <58999374+Gazook89@users.noreply.github.com> Date: Sun, 15 Aug 2021 19:52:12 -0500 Subject: [PATCH 053/188] Remove :before on .note Move all properties from :before to the base .note....don't see a need to add a superfluous pseudo element. --- themes/5ePhb.style.less | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/themes/5ePhb.style.less b/themes/5ePhb.style.less index 095d7c568..629886e4c 100644 --- a/themes/5ePhb.style.less +++ b/themes/5ePhb.style.less @@ -199,20 +199,12 @@ body { // * NOTE // *****************************/ .note{ - &::before{ - content : ""; - box-sizing : border-box; - border-style : solid; - border-width : 11px; - border-image : @noteBorderImage 12; - border-image-outset : 9px 0px; - box-shadow : 1px 4px 14px #888; - position : absolute; - width : 100%; - height : 100%; - top : 0; - left : 0; - } + box-sizing : border-box; + border-style : solid; + border-width : 11px; + border-image : @noteBorderImage 12; + border-image-outset : 9px 0px; + box-shadow : 1px 4px 14px #888; .useSansSerif(); position : relative; margin-top : 1.3em; From 0773dd24ab600844a4bbfb09737e09327f035a8c Mon Sep 17 00:00:00 2001 From: Gazook89 <58999374+Gazook89@users.noreply.github.com> Date: Sun, 15 Aug 2021 19:57:20 -0500 Subject: [PATCH 054/188] change box-shadows to drop-shadows monster blocks, descriptive notes, regular notes. --- themes/5ePhb.style.less | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/themes/5ePhb.style.less b/themes/5ePhb.style.less index 629886e4c..d50349f46 100644 --- a/themes/5ePhb.style.less +++ b/themes/5ePhb.style.less @@ -204,7 +204,7 @@ body { border-width : 11px; border-image : @noteBorderImage 12; border-image-outset : 9px 0px; - box-shadow : 1px 4px 14px #888; + filter : drop-shadow(1px 4px 6px #888); .useSansSerif(); position : relative; margin-top : 1.3em; @@ -239,7 +239,7 @@ body { border-width : 7px; border-image : @descriptiveBoxImage 12 stretch; border-image-outset : 4px; - box-shadow : 0px 0px 6px #faf7ea; + filter : drop-shadow(0 0 3px #faf7ea); padding : 0.1em; & + * { margin-top : 1.4em; @@ -297,7 +297,7 @@ body { border-image-outset : 0px 2px; background-blend-mode : overlay; background-attachment : fixed; - box-shadow : 1px 4px 14px #888; + filter : drop-shadow(1px 4px 6px #888); padding : 4px 2px; margin : 0px -6px 1em; } From 1b7729ca010b3b5f4b0b9f507269d5dfddafdec7 Mon Sep 17 00:00:00 2001 From: Gazook89 <58999374+Gazook89@users.noreply.github.com> Date: Sun, 15 Aug 2021 20:17:15 -0500 Subject: [PATCH 055/188] reverting change to .note:before setting back to what it was. apparently :before is necessary due to border-image spacing. --- themes/5ePhb.style.less | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/themes/5ePhb.style.less b/themes/5ePhb.style.less index d50349f46..b736056b0 100644 --- a/themes/5ePhb.style.less +++ b/themes/5ePhb.style.less @@ -199,12 +199,20 @@ body { // * NOTE // *****************************/ .note{ - box-sizing : border-box; - border-style : solid; - border-width : 11px; - border-image : @noteBorderImage 12; - border-image-outset : 9px 0px; - filter : drop-shadow(1px 4px 6px #888); + &::before{ + content : ""; + box-sizing : border-box; + border-style : solid; + border-width : 11px; + border-image : @noteBorderImage 12; + border-image-outset : 9px 0px; + filter : drop-shadow(1px 4px 6px #888); + position : absolute; + width : 100%; + height : 100%; + top : 0; + left : 0; + } .useSansSerif(); position : relative; margin-top : 1.3em; From 7977e869c3df30f804360847d7cde8c9e28e879f Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Mon, 16 Aug 2021 00:52:34 -0400 Subject: [PATCH 056/188] Small tweaks. Move "Create your own" button slightly. --- client/homebrew/pages/homePage/homePage.less | 6 ++-- .../homebrew/pages/homePage/welcome_msg_v3.md | 28 +++++++++++-------- server.js | 2 +- themes/5ePhb.style.less | 5 +++- 4 files changed, 24 insertions(+), 17 deletions(-) diff --git a/client/homebrew/pages/homePage/homePage.less b/client/homebrew/pages/homePage/homePage.less index 37b412282..719e89f22 100644 --- a/client/homebrew/pages/homePage/homePage.less +++ b/client/homebrew/pages/homePage/homePage.less @@ -5,7 +5,7 @@ position : absolute; display : block; right : 70px; - bottom : 70px; + bottom : 50px; z-index : 100; z-index : 5001; padding : 1em; @@ -23,7 +23,7 @@ position : absolute; display : block; right : 200px; - bottom : 90px; + bottom : 70px; z-index : 100; z-index : 5000; padding : 0.8em; @@ -40,4 +40,4 @@ right : 350px; } } -} \ No newline at end of file +} diff --git a/client/homebrew/pages/homePage/welcome_msg_v3.md b/client/homebrew/pages/homePage/welcome_msg_v3.md index 9a5294f81..471932ed1 100644 --- a/client/homebrew/pages/homePage/welcome_msg_v3.md +++ b/client/homebrew/pages/homePage/welcome_msg_v3.md @@ -3,6 +3,10 @@ border:1px dashed #00000030; } +.page { + padding-bottom : 1.6cm; +} + ``` @@ -86,22 +90,19 @@ If you are looking for more 5e Homebrew resources check out [r/UnearthedArcana]( The Homebrewery aims to make homebrewing as simple as possible, providing a live editor with Markdown syntax that is more human-readable and faster to write with than raw HTML. In version 3.0.0, with a goal of adding maximum flexibility without users resorting to complex HTML to accomplish simple tasks, Homebrewery provides an extended verision of Markdown with additional syntax. - -{{text-align:center -**You can enable V3 via the {{fa,fa-info-circle}} **Properties** button!** -}} +**You can enable V3 via the {{fa,fa-info-circle}} Properties button!** ### Curly Brackets The biggest change in V3 is the replacement of `` and `
` with `{{ }}` for a cleaner custom formatting. Inline spans and block elements can be created and given ID's and Classes, as well as css properties, each of which are comma separated with no spaces. Use double quotes if a value requires spaces. Spans and Blocks start the same: #### Span -My favorite author is {{pen,#author,color:orange,font-family:"trebuchet ms" Brandon Sanderson}}. The orange text is given a class of `pen`, and id of `author`, colored orange, and given a new font. Note that the first space outside of quotes marks the beginning of the content. +My favorite author is {{pen,#author,color:orange,font-family:"trebuchet ms" Brandon Sanderson}}. The orange text has a class of `pen`, an id of `author`, is colored orange, and given a new font. The first space outside of quotes marks the beginning of the content. #### Block -{{purple,#book,background:#aa88aa55,text-align:center -My favorite book is Wheel of Time. This block has a class of `purple`, an id of `book`, and has been styled with a purple background and centered text. Note that the opening and curly brackets are on their own lines without any other contents. +{{purple,#book,text-align:center,background:#aa88aa55 +My favorite book is Wheel of Time. This block has a class of `purple`, an id of `book`, and centered text with a colored background. The opening and closing brackets are on lines separate from the block contents. }} @@ -110,15 +111,15 @@ For any element not inside a span or block, you can *inject* attributes using th Inline elements like *italics* {color:#D35400} or images require the injection on the same line. -Block elements like headers require injection starting on the line immediately following. +Block elements like headers require the injection to start on the line immediately following. ##### A Purple Header -{color:purple} +{color:purple,text-align:center} \* *this does not currently work for tables yet* ### Vertical Spacing -The HTML tag `
` has been replaced by either a single `:` along on a line, or multiple `:` on the same line. +A blank line can be achieved with a run of one or more `:` alone on a line. More `:`'s will create more space. :: @@ -129,12 +130,15 @@ V3 uses HTML *definition lists* to create "lists" with hanging indents. **Senses** :: Here is some text that is long and overflows into a second line, creating a "hanging indent". +### Column Breaks +Column and page breaks with `\column` and `\page`. + \column ### Tables Tables now allow column & row spanning between cells. This is included in some updated snippets, but a simplified example is given below. -A cell can be spanned across columns by bunching pipe `|` characters together. +A cell can be spanned across columns by grouping multiple pipe `|` characters at the end of a cell. Row spanning is achieved by adding a `^` at the end of a cell just before the `|`. @@ -167,7 +171,7 @@ Homebrewery comes with a series of *code snippets* found at the top of the edito ## Style Editor Panel -{{fa,fa-paint-brush}}Also, technically released prior to v3 but still new to many users, check out the new **Style Editor** located on the right side of the Snippet bar. This editor excepts CSS for styling without requiring ` + +.taskList li { + list-style-type : none; +} + +.taskList li input { + margin-left : -0.52cm; + transform: translateY(.05cm); + filter: brightness(1.1) drop-shadow(1px 2px 1px #222); +} + +.taskList li input[checked] { + filter: sepia(100%) hue-rotate(60deg) saturate(3.5) contrast(4) brightness(1.1) drop-shadow(1px 2px 1px #222); +} + +pre + * { + margin-top: 0.17cm; +} + +pre { + margin-top: 0.17cm; +} + +.page { + padding-bottom:.5cm; +} +``` # changelog +### Thursday, 09/09/2021 - v2.13.5 +- Slightly better error logging and messages for users. + +##### G-Ambatte : +- Added a search bar to the User page to help find your brews. +- Added page counts to brews in the User page; page count will be updated the next time a brew is edited. +- Fixed edge case where view counts could get reset. +- Fixed edge case where last-modified time was not accurate for Google Doc brews. + +##### Gazook89 : +- Fixed typo in the **PRINT → Ink-Friendly** snippet. + + + ### Tuesday, 17/08/2021 - v2.13.4 -- Fixed user page crashing when user has untitled brew +- Fixed User page crashing when user has an untitled brew ##### G-Ambatte: - Tweaks to user page tool tips @@ -43,6 +83,10 @@ h5 { - Fixed the issue with new brews not saving! + + +\page + ### Saturday, 26/6/2021 - v2.13.0 - "Share to Reddit" button now works with Google brews @@ -59,9 +103,6 @@ myStyle {color: black} - Pasting your brew into a "New" page and saving will transfer any CSS in the code fence to the Style tab. - Unsaved work in the New page Style tab is now cached to your browser storage if you navigate away. -\page - - ### Thursday, 10/6/2021 - v2.12.0 - New "style" tab to better organize custom CSS in preparation for new themes and sharable styles. @@ -98,6 +139,8 @@ myStyle {color: black} - Fix for box-shadows breaking across columns.
(Thanks G-Ambatte for all of these!) - Small user interface tweaks (Thanks Ericsheid) +\column + ### Friday, 02/1/2021 - v2.10.6 - Fixed punctuation for usernames ending with 's' on the user page. (Thanks AlexeySachkov) - Fixed server crashes due to excessive long lines in brews @@ -122,8 +165,6 @@ myStyle {color: black} - Fixed issue with users unable to create new brews - Fixing brews being lost when loaded via back button -\page - ### Wednesday, 07/10/2020 - v2.10.0 - Google Drive integration -- Sign in with your Google account to link it with your Homebrewery profile. A new button in the Edit page will let you transfer your file to your personal Google Drive storage, and Google will keep a backup of each version! No more lost work surprises! @@ -141,6 +182,8 @@ myStyle {color: black} - Fixed delete button removing everyone's copy for brews with multiple authors - Compressed homebrew text in database +\page + ### Monday, 26/11/2018 - v2.8.1 - Fixed some SSL issues with images in the example page so they appear now - Fixed duplicate scrollbars in Edit Page @@ -154,7 +197,7 @@ myStyle {color: black} - Refactored background code ### Sunday, 04/06/2017 - v2.7.5 -- Fixed the class feature snippet duplicating the entire brew +- Fixed Class Feature snippet duplicating entire brew - Fixed headers in tables being duplicated - Fixed border-image being scrambled on class tables and descriptive text boxes - Fixed pages going out of sync in large brews, causing them to be rendered off-page @@ -180,9 +223,12 @@ myStyle {color: black} ### Sunday, 25/12/2016 - v2.7.0 - Switching over to using Vitreum v4 - - Removed gulp, all tasks are run through npm scripts +- Removed gulp, all tasks are run through npm scripts - Updating docs for local dev - Removing support for Docker. I have never used it, nor will I ever test for it, so I don't want to continue to explictly support it on this repo. Feel free to make a fork and make it docker-able though :) + +\column + - Changed icon for the metadata - Made links useable in footer (thanks u/Dustfinger1 re:249) - Added print media queries to remove box shadow on print (thanks u/dmmagic re: 246) @@ -210,8 +256,6 @@ myStyle {color: black} - Added a hover tooltip to fully read the brew description - Made the brew items take up only 25% allowing you to view more per row. -\page - ### Wednesday, 23/11/2016 - v2.5.0 - Metadata can now be added to brews - Added a metadata editor onto the edit and new pages @@ -227,6 +271,8 @@ myStyle {color: black} - You can now print from a new page without saving - Added the ability to use ctrl+p and ctrl+s to print and save respectively. +\page + ### Monday, 07/11/2016 - Added final touches to the html validator and updating the rest of the branch - If anyone finds issues with the new HTML validator, please let me know. I hope this will bring a more consistent feel to Homebrewery rendering. @@ -258,7 +304,7 @@ myStyle {color: black} - Even works after you print to pdf! ### Tuesday, 07/06/2016 - v2.2.2 -- Fixed bug with new markdown lexer and aprser not working on print page +- Fixed bug with new markdown lexer and parser not working on print page ### Sunday, 05/06/2016 - v2.2.1 - Adding in a new Class table div block. The old Class table block used weird stacking of HTML elements, resulting is difficult to control behaviour and poor interactiosn with the rest of the page. This new block is much easier to style and work with. @@ -266,8 +312,10 @@ myStyle {color: black} - Added in a new auto-incremeting page number snippet (thakns u/Ryrok!) - Lists in monster stat blocks should be fixed now +\column + ### Saturday, 04/06/2016 - v2.2.0 -- MIgrating The Homebrewery over to hombrewery.naturalcrit.com. It know runs on it's own server, with it's own repo separate from the other tools I'm working on. Makes updating and deploying much easier. +- Migrating The Homebrewery over to hombrewery.naturalcrit.com. It now runs on it's own server, with it's own repo separate from the other tools I'm working on. Makes updating and deploying much easier. ### Sunday, 29/05/2016 - v2.1.0 - Finally added a syntax for doing spell lists. A bit in-depth about why this took so long. Essentially I'm running out of syntax to use in stardard Markdown. There are too many unique elements in the PHB-style to be mapped. I solved this earlier by stacking certain elements together (eg. an `
` before a `blockquote` turns it into moster state block), but those are getting unweildly. I would like to simply wrap these in `div`s with classes, but unfortunately Markdown stops processing when within HTML blocks. To get around this I wrote my own override to the Markdown parser and lexer to process Markdown within a simple div class wrapper. This should open the door for more unique syntaxes in the future. Big step! diff --git a/package-lock.json b/package-lock.json index c82e7f3ff..dda8f56a5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { "name": "homebrewery", - "version": "2.13.4", + "version": "2.13.5", "lockfileVersion": 2, "requires": true, "packages": { "": { - "version": "2.13.4", + "version": "2.13.5", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index ec408fdd7..0eabd1953 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "homebrewery", "description": "Create authentic looking D&D homebrews using only markdown", - "version": "2.13.4", + "version": "2.13.5", "engines": { "node": "14.15.x" }, From e070601b2863b725c342a8dd5754edcef66afd1d Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Thu, 9 Sep 2021 23:17:46 -0400 Subject: [PATCH 155/188] Make Changelog split text and style --- server.js | 1 + 1 file changed, 1 insertion(+) diff --git a/server.js b/server.js index 2f1564b20..6bf98d200 100644 --- a/server.js +++ b/server.js @@ -138,6 +138,7 @@ app.get('/changelog', async (req, res, next)=>{ text : changelogText, renderer : 'V3' }; + splitTextAndStyle(brew); req.brew = brew; return next(); }); From 494311aee3079106a46311dc0cf41f190c443ea9 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Fri, 10 Sep 2021 00:13:48 -0400 Subject: [PATCH 156/188] Popup notification Update the popup notification on the home page. --- .../notificationPopup/notificationPopup.jsx | 41 ++++++++++++++----- .../notificationPopup/notificationPopup.less | 16 ++++---- 2 files changed, 39 insertions(+), 18 deletions(-) diff --git a/client/homebrew/brewRenderer/notificationPopup/notificationPopup.jsx b/client/homebrew/brewRenderer/notificationPopup/notificationPopup.jsx index f561298a3..9bfea7ff0 100644 --- a/client/homebrew/brewRenderer/notificationPopup/notificationPopup.jsx +++ b/client/homebrew/brewRenderer/notificationPopup/notificationPopup.jsx @@ -4,7 +4,7 @@ const createClass = require('create-react-class'); const _ = require('lodash'); const cx = require('classnames'); //Unused variable -const DISMISS_KEY = 'dismiss_notification7-10-20'; +const DISMISS_KEY = 'dismiss_notification09-9-21'; const NotificationPopup = createClass({ getInitialState : function() { @@ -22,16 +22,33 @@ const NotificationPopup = createClass({ notifications : { psa : function(){ return
; + }, + refreshGoogle : function (){ + return
  • + Refresh your Google Drive Credentials!
    + Currently a lot of people are striking issues with their Google credentials expiring, which happens one year after the last sign in via + Google. This can cause errors when trying to save your brews. If this happens, simply visit the   + + logout page + + , sign out, and then sign back in "with Google" to refresh your credentials. See   + + this discussion on Github + for more details.
  • ; }, faq : function(){ @@ -62,8 +79,10 @@ const NotificationPopup = createClass({ return
    -

    Notice

    - This website is always improving and we are still adding new features and squashing bugs. Keep the following in mind: +
    +

    Notice

    + This website is always improving and we are still adding new features and squashing bugs. Keep the following in mind: +
      {_.values(this.state.notifications)}
    ; } diff --git a/client/homebrew/brewRenderer/notificationPopup/notificationPopup.less b/client/homebrew/brewRenderer/notificationPopup/notificationPopup.less index 69bffd583..dfd3c6c63 100644 --- a/client/homebrew/brewRenderer/notificationPopup/notificationPopup.less +++ b/client/homebrew/brewRenderer/notificationPopup/notificationPopup.less @@ -1,23 +1,22 @@ .popups{ position : fixed; - top : @navbarHeight; + top : @navbarHeight; right : 15px; z-index : 10001; - width : 350px; + width : 450px; } .notificationPopup{ - position : relative; - float : right; + position : relative; display : inline-block; - width : 350px; + width : 100%; padding : 15px; padding-bottom : 10px; - padding-left : 55px; + padding-left : 25px; background-color : @blue; color : white; a{ - color : @steel; + color : #e0e5c1; font-weight : 800; } i.info{ @@ -37,6 +36,9 @@ opacity : 1; } } + .header { + padding-left : 50px; + } small{ opacity : 0.7; font-size : 0.6em; From fbf1bbbf99dfc9c63e67665c7bab4d8c85312882 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Sat, 11 Sep 2021 09:41:23 +1200 Subject: [PATCH 157/188] Add Page Count to the Google brew update function --- server/googleActions.js | 1 + 1 file changed, 1 insertion(+) diff --git a/server/googleActions.js b/server/googleActions.js index aca84daa3..72059cb2d 100644 --- a/server/googleActions.js +++ b/server/googleActions.js @@ -163,6 +163,7 @@ GoogleActions = { version : brew.version, renderer : brew.renderer, tags : brew.tags, + pageCount : brew.pageCount, systems : brew.systems.join() } }, From 673dc5805130cc8fccde6af2214900e4bb1887f5 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Fri, 10 Sep 2021 22:18:33 -0400 Subject: [PATCH 158/188] Update 5ePhbLegacy.style.less --- themes/5ePhbLegacy.style.less | 3 --- 1 file changed, 3 deletions(-) diff --git a/themes/5ePhbLegacy.style.less b/themes/5ePhbLegacy.style.less index 254e612c3..fb2d6a829 100644 --- a/themes/5ePhbLegacy.style.less +++ b/themes/5ePhbLegacy.style.less @@ -231,11 +231,9 @@ body { // Monster Ability table hr+table{ margin : 0; - column-span : none; background-color : transparent; border-style : none; border-image : none; - -webkit-column-span : none; tbody{ tr:nth-child(odd), tr:nth-child(even){ background-color : transparent; @@ -416,7 +414,6 @@ body { // * DESCRIPTIVE TEXT BOX // ************************************/ .phb .descriptive{ - display : inline-block; margin-bottom : 1em; background-color : #faf7ea; font-family : ScalySans; From 2497fbbc7405b861fe368567389fdd9b254b6947 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Fri, 10 Sep 2021 23:22:52 -0400 Subject: [PATCH 159/188] Tweaks to popup notification. --- .../notificationPopup/notificationPopup.jsx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/client/homebrew/brewRenderer/notificationPopup/notificationPopup.jsx b/client/homebrew/brewRenderer/notificationPopup/notificationPopup.jsx index 9bfea7ff0..819bf53d3 100644 --- a/client/homebrew/brewRenderer/notificationPopup/notificationPopup.jsx +++ b/client/homebrew/brewRenderer/notificationPopup/notificationPopup.jsx @@ -24,9 +24,9 @@ const NotificationPopup = createClass({ return
  • V3.0.0 Released!
    After a long and bumpy road, we decided it was high time we finally release version 3 of the homebrewery into the wild. You can check out a - brief overview and see how to opt-in to the new features here:   - V3 Welcome Page   - and the Changelog. + brief overview and see how to opt-in to the new features here:  + V3 Welcome Page and  + the Changelog.

    BE WARNED: As we continue to develop V3, expect small tweaks in the styling, fonts, and snippets; your brews may look slightly different from day-to-day. All of your old documents will continue to work as normal; we are not touching them. If you don't want to deal @@ -34,18 +34,18 @@ const NotificationPopup = createClass({

    With this in mind, if you still wish to try out V3, you can opt-in any of your brews to the the V3 renderer. This will likely break much of your formatting as a lot of the Markdown code has been updated, and starting from scratch may be cleaner. - (Don't worry, you can always change the renderer back to legacy for any brew at any time). + (Don't worry, you can always change the renderer back to Legacy for any brew at any time).
  • ; }, refreshGoogle : function (){ return
  • Refresh your Google Drive Credentials!
    Currently a lot of people are striking issues with their Google credentials expiring, which happens one year after the last sign in via - Google. This can cause errors when trying to save your brews. If this happens, simply visit the   + Google. This can cause errors when trying to save your brews. If this happens, simply visit the  logout page - , sign out, and then sign back in "with Google" to refresh your credentials. See   + , sign out, and then sign back in "with Google" to refresh your credentials. See  this discussion on Github for more details. @@ -54,7 +54,7 @@ const NotificationPopup = createClass({ faq : function(){ return
  • Protect your work!
    - If you opt not to use your Google Drive, keep in mind that we do not save a history of your projects. Please make frequent backups of your brews!   + If you opt not to use your Google Drive, keep in mind that we do not save a history of your projects. Please make frequent backups of your brews!  See the FAQ to learn how to avoid losing your work! From 6237df953ef396308752c5f8700813202fc2701d Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Fri, 10 Sep 2021 23:34:20 -0400 Subject: [PATCH 160/188] Update changelog and welcome pages --- changelog.md | 181 ++++++++++++++++++ client/homebrew/pages/homePage/welcome_msg.md | 12 +- .../homebrew/pages/homePage/welcome_msg_v3.md | 18 +- 3 files changed, 191 insertions(+), 20 deletions(-) diff --git a/changelog.md b/changelog.md index cde71bb57..fb1d3c538 100644 --- a/changelog.md +++ b/changelog.md @@ -32,6 +32,187 @@ pre { # changelog +### Saturday, 28/08/2021 - v3.0.0 + +We have been working on v3 for a *very* long time. We want to thank everyone for being paitent. + + +Some features planned for V3 have actually been released over the recent months as part of V2, and some are still on the way. But at its core, V3 provides brand new Markdown-to-Brew rendering system, which was no simple task. This has opened up access to all sorts of bugfixes, tweaks, and potential for new features that just wouldn't be possible on the old system. + +***BE WARNED:*** As we continue to develop V3, expect small tweaks in the styling, fonts, and snippets; your brews may look slightly different from day-to-day; some things might break completely while we tackle any bugs in this early stage. All of your old documents will continue to work as normal. We are not touching them. If you don't want to deal With the possibility of slight formatting changes, you may choose to stick with the Legacy renderer on any of your brews for as long as you like. However, most new features added from now on will only be available for brews using the V3 renderer. + +Massive changelog incoming: + +#### Markdown+ +With the latest major update to *The Homebrewery*, we've implemented an extended Markdown-like syntax for block and span elements, plus a few other changes, eliminating the need for HTML tags like `div`, and `span` in most cases. This should hopefully aid non-coders with readability, and also allows us a few tricks in the background to fix some old issues. No raw HTML tags should be needed in a brew, and going forward, raw HTML will no longer receive debugging support (*but can still be used if you insist*). + +All brews made prior to the release of v3.0.0 will still render normally, and you may switch between the "Legacy" brew renderer and the newer "V3" renderer via the {{fa,fa-info-circle}} **Properties** button on your brew. Much of the syntax and styling has changed in V3, so code in one version may be broken in the other. + +Visit [this page](/v3_preview) for brief examples of the new syntax! + +#### Extended Markdown Syntax: + +{{taskList +* [x] Add Divs and Spans for all your custom styling needs, via a simplified Markdown-like syntax: + ``` + {{myDivClass,#myId,color:red + My Div content + }} + + Hello {{mySpan,color:blue World}} ! + ``` + Fixes issues: [#348](https://github.com/naturalcrit/homebrewery/issues/348) + +* [x] Add inline CSS to Markdown objects via "curly injection" syntax: + ``` + Hello *world*{myClass,#id,color:red} + ``` + Fixes issues: [#403](https://github.com/naturalcrit/homebrewery/issues/403) +}} + +\column + +{{taskList +* [x] Rowspan, Colspan, and multiple header rows with extended table syntax: +``` +| Header 1a | Header 1b | Header 1c | +| Header 2a | Header 2b | Header 2c | +|:---------:|:----------|:---------:| +| Span 2 columns || Span 2 | +| one col | one col | rows ^| +``` + Fixes issues: [#773](https://github.com/naturalcrit/homebrewery/issues/773), [#191](https://github.com/naturalcrit/homebrewery/issues/191) + +* [x] Hanging indents via `
    ` tags, as seen in the **PHB → Spell** snippet. Add via "double-colon" syntax: +``` +Term :: big long definition that bleeds onto multiple lines +``` + Fixes issues: [#182](https://github.com/naturalcrit/homebrewery/issues/182), [#149](https://github.com/naturalcrit/homebrewery/issues/149) + +* [x] Easier vertical spacing via colons alone on a line: + ``` + ::: + ``` + Fixes issues: [#374](https://github.com/naturalcrit/homebrewery/issues/374) + +* [x] Avoid paragraph indendation by ending the previous paragraph with a backslash `\` or two spaces ` ` + ``` + Paragraph one\ + Paragraph two + ``` + Fixes issues: [#636](https://github.com/naturalcrit/homebrewery/issues/636) + +* [x] Code blocks can be inserted by surrounding it with rows of three backticks ` ``` `, for demonstration purposes or to share custom styles. Inline-code can be inserted with single backticks `code` +
    ```
    + Here is some code!
    +```
    +
    + + Fixes issues: [#465](https://github.com/naturalcrit/homebrewery/issues/465) + +#### New and Fixed Snippets + +* [x] Column breaks now use `\column` instead of ` ``` ` backticks. + + Fixes issues: [#607](https://github.com/naturalcrit/homebrewery/issues/607) + +* [x] Page breaks using `\page` now only trigger when placed alone at the start of a line. + + Fixes issues: [#1147](https://github.com/naturalcrit/homebrewery/issues/1147) + +* [x] New **EDITOR → QR Code** snippet. + + Fixes issues: [#538](https://github.com/naturalcrit/homebrewery/issues/538) + +* [x] New **IMAGES → Watercolor Splatter** snippet, which adds one of a range of stylish stains to your brew. + +* [x] New **IMAGES → Watermark** snippet, which adds transparent text diagonally across the page. + +* [x] New **PHB → Magic Item** snippet. + + Fixes issues: [#671](https://github.com/naturalcrit/homebrewery/issues/671) + +* [x] New **TABLES → 1/3 Class Table** snippet for 1/3 casters. + + Fixes issues: [#191](https://github.com/naturalcrit/homebrewery/issues/191) +}} + +\page +{{taskList +* [x] Improved **EDITOR → Table of Contents** snippet to actually look like the PHB style. Will auto-generate based on the headers in your brew. + + Fixes issues: [#304](https://github.com/naturalcrit/homebrewery/issues/304) + +* [x] Improved **PHB → Monster Stat Block** snippet with textures, and an option to remove the frame entirely. + +* [x] Improved **PHB → Spell List** snippet can now be made single-column. + + Fixes issues: [#509](https://github.com/naturalcrit/homebrewery/issues/509), [#914](https://github.com/naturalcrit/homebrewery/issues/914) + +* [x] Improved **TABLES → Class Table** snippet is now cleaned up, has an option to remove the frame entirely, and includes additional boundary decorations. + + Fixes issues: [#773](https://github.com/naturalcrit/homebrewery/issues/773), [#302](https://github.com/naturalcrit/homebrewery/issues/302) + +#### Miscellaneous Formatting Fixes + +* [x] Paragraphs are now able to split across columns. + + Fixes issues: [#239](https://github.com/naturalcrit/homebrewery/issues/239) + +* [x] Multiple fixes for bold/italicize using asterisks `* *` + + Fixes issues: [#1321](https://github.com/naturalcrit/homebrewery/issues/1321), [#852](https://github.com/naturalcrit/homebrewery/issues/852) + +* [x] Multiple for list items not displaying correctly. + + Fixes issues: [#1085](https://github.com/naturalcrit/homebrewery/issues/1085), [#588](https://github.com/naturalcrit/homebrewery/issues/588) + +* [x] "Smart quotes", so left and right quotes are different. + + Fixes issues: [#849](https://github.com/naturalcrit/homebrewery/issues/849) + +* [x] Long URLs in links now wrap properly. + + Fixes issues: [#1136](https://github.com/naturalcrit/homebrewery/issues/1136) + +* [x] Better support for `wide` blocks that span across the whole page! No more problems with contents getting shunted off the edge, and each new wide element in a page will restart the next item back at column one. Manual `\column` breaks will help organize subsequent content between the columns as needed. + + Fixes issues: [#144](https://github.com/naturalcrit/homebrewery/issues/144), [#1024](https://github.com/naturalcrit/homebrewery/issues/1024) + +* [x] Fonts now support a wider range of latin characters for non-English brews, including áéíóúñ¡¿, etc... + + Fixes issues: [#116](https://github.com/naturalcrit/homebrewery/issues/116) + +* [x] Drop-caps (fancy first letters) have been re-styled and re-aligned to correct the ugly overlapping and cut-off on some characters like K and Y. + + Fixes issues: [#848](https://github.com/naturalcrit/homebrewery/issues/848) +}} + +\column + +### Under-the-Hood Stuff +We had to make a whole lot of background upgrades and changes to get all of this working, and now that the framework is in place, there's a lot more planned and upcoming *"sometime"* : + +{{taskList +* [ ] New Themes to style your brews. DMG, MM, a custom Homebrewery theme, and others. +* [ ] The ability to build your own custom themes using CSS, apply it to other brews, and share it with others! +* [ ] Easy control of item colors. Change your monster blocks, tables, and notes from yellow to green to red! +* [ ] New image-based snippets, including handwritten notes, title illustrations, and alternative decorations. +* [ ] New fun fonts like Elvish, Draconic, Orcish, etc. +* [ ] Better organization of personal brews using tags. +* [ ] ....a log-out button...? +* [ ] AND MORE. +}} + +### Interface +:: +#### Style Editor Panel + +{{fa,fa-paint-brush}} Technically released prior to v3 but still new to many users, check out the new **Style Editor** located on the right side of the Snippet bar. This editor accepts CSS for styling without requiring `` and paste the copied information there. You can then use `font-family: fontname`, where *fontname* is the part after `font-family: ` in the `@font-face` segment, to add that font to your brew. + +***Example:*** You want to have a different font for all elements with the `testFontClass` class. This is how you would go about that: + +1. Upload your font to [fontsquirrel.com](https://www.fontsquirrel.com/tools/webfont-generator) and have it base64 encoded. + +2. In the resulting .zip file, look for the .css file, open it, and copy its contents, which will look something like this (Your `url()` parts will be much longer, I removed most of it for the sake of readability): + + @font-face { + font-family: 'testFont'; + src: url(data:application/font-woff2;charset=utf-8;base64,d09GMgABAA[...]+wEAAA=) format('woff2'), + url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAHTcABI[...]+wAAAADYwmAT) format('woff'); + font-weight: normal; + font-style: normal; + } + +3. In your homebrew, either add a `` section at the top or, if you already have one, add the copied `@font-face{ [...] }` to it. + +4. In that same `` tags to this file!). Upload said file to a place that is accessible to the homebrewery. Go to your brew, remove everything within your `` tags, and add this: `@import "https://my.website.com/MyHomebrewStyle.css";` + +Be aware that, should you change something in that css file, your homebrew will have to be reloaded for these changes to take effect. + +**Q:** How do I use different colors in my brews? +**A:** [Described here](https://old.reddit.com/r/homebrewery/comments/9kesk1/changing_text_colour_to_white/) + +**Q:** How do I get a line break without indentation? +**A:** [Described here](https://old.reddit.com/r/homebrewery/comments/8hmr50/getting_line_breaks_without_getting_a_new/) + +**Q:** How do I fix line indentations in monster statblocks? +**A:** [Described here](https://old.reddit.com/r/homebrewery/comments/ag46i1/indentation_problem/) + +**Q:** When I write more text than fits into the two columns on the page, the text overflows into a third column and goes off-page. Why isn't a new page generated for the text? +**A:** Auto-generating a new page via code lies between tricky and impossible. Use `\page` to create a new page manually. If you have an idea about how to implement auto-new-page-ing, head over to [GitHub](https://github.com/naturalcrit/homebrewery) and let us know. + +**Q:** Typing `#### Adhesion` in the formatting doesn't show the titling at all in the completed page? +**A:** Whitelist homebrewery.naturalcrit.com in your ad-blocking software. + +## Paper Size +**Q:** I have white borders on the bottom/sides of the print preview. +**A:** The homebrewery paper size and your print paper size do not match. + +The default homebrewery paper size is “Letter.” + +If you are in the US (and you did not add the A4 snippet), in the "Print to PDF" window, click "More settings" and change "Paper size" to "Letter". + +If you are anywhere else, your default "Paper size" setting is most likely "A4" and you need to change it to "Letter" (as described above). You can also add the A4 snippet to the top of your brew to make it A4-sized. + +## Get PDF +**Q:** Whenever I click on the "Get PDF" button, instead of getting a download, it opens Print Preview in another tab. +**A:** Yes, this is by design. In the print preview, select "Save as PDF" as the Destination, and then click "Save". There will be a normal download dialog where you can save your brew as a PDF. + +--- + +# PSAs + +## Back Up Your Stuff! + +By that I mean, when you brew, occasionally hit CTRL + A, CTRL + C, open a texteditor (on your local machine), CTRL + V your brew in there, and save that file. + +You can go as crazy as you want to be with that. Create one file per brew, that's fine. Create one file per brew per day you edit it, that's even better. Create one file per brew per day you edit it, save it in two or more separate (remote) locations? That's even more better (I do it that way ;) ). + +Whatever method you prefer, just do it. + +Also, see the "Backing Up Brews with a Bookmarklet", "Backing Up Brews with Linux" section, and the comments below. + +## Brewmasters + + +We recently started the "Brewmasters" program, where we give out a special flair to users that have proven that they know what they are talking about when it comes to using the [Homebrewery](https://homebrewery.naturalcrit.com). + +The first member to earn this special flair is u/VexbaneAramori, who is a pillar of this community. + +Brewmasters can nominate other active users to become Brewmasters via ModMail as well. + +Thanks to all who help to make this community more helpful and welcoming. :) + +**18.05.2020 - Update:** We're happy to announce that u/Jintonix has joined the ranks of our Brewmasters. Welcome! + +--- + +# Miscellaneous + +## Backing Up Brews with a Bookmarklet + +This solution was provided by u/garumoo in the [comments](https://www.reddit.com/r/homebrewery/comments/adh6lh/faqs_psas_announcements/edrvz8o/) of the old [PSA](https://www.reddit.com/r/homebrewery/comments/adh6lh/faqs_psas_announcements/). + +> Here is a handy bookmarklet for saving your brew +> +> Just create a new bookmark, put it onto your browser button bar, and edit it, changing the URL to: + + javascript:(function() {var nav=document.getElementsByClassName('navContent')[0];var share=nav.querySelector('.navItem[icon="fa-share-alt"');var code=nav.querySelector('.navItem[icon="fa-code"');if(share||code){let brewtitle=document.getElementsByClassName('brewTitle')[0].innerText;let date=new Date();let dd=date.getDate();let mm=date.getMonth()+1;let yyyy=date.getFullYear();let hour=date.getHours();let mins=date.getMinutes();dd=dd<10?'0'+dd:dd;mm=mm<10?'0'+mm:mm;hour=hour<10?'0'+hour:hour;mins=mins<10?'0'+mins:mins;let dateString=`${yyyy}-${mm}-${dd}-${hour}${mins}`;let filename=brewtitle+'-'+dateString+'.md';var sourceuri=share?share.href.replace('share','source'):code.href;fetch(sourceuri).then((response)=>{if(response.ok){return response.text()}}).then((payload)=>{var div=document.createElement('div');div.innerHTML=payload;var brewtext=div.innerText;delete div;let data_uri='data:text/markdown; charset=UTF-8,'+encodeURIComponent(brewtext);var link=document.createElement("a");link.download=filename;link.href=data_uri;document.body.appendChild(link);link.click();document.body.removeChild(link);delete link})}})(); + +> Then, while viewing either the edit or the share versions, just click the bookmarklet. It should then download as a text file named as Brewtitle-yyyy-mm-dd-hhmm.md +> +> The code doesn't sanitise the brewtitle so if you have a funky brewtitle and things blow up that's on you. + +## Backing Up Brews with Linux + +This following script was written by myself, u/Thurse. For an easier to use script, check out u/-Hydrargyros-'s [comment](https://www.reddit.com/r/homebrewery/comments/adh6lh/faqs_psas_announcements/ee9xtsw/) on the old [PSA](https://www.reddit.com/r/homebrewery/comments/adh6lh/faqs_psas_announcements/). + +Hello everyone, +as of now, I'm pretty sure everyone has read our [PSA on Backing Up Your Stuff](https://old.reddit.com/r/homebrewery/comments/a0ubx1/psa_back_up_your_stuff/), as you should... :) + +In the PSA thread, u/sonaplayer offered a way to automatically back up your stuff via Google Docs. Although a good method, it can't handle larger brews, so it wasn't for me. I actually corresponded with u/sonaplayer on the topic, and said at one point "maybe someday I will write something in bash...". Well, "someday" was during the christmas holidays, so I present to you: + +A bash script to backup your brews! + +### How does this work? + +1. Go to https://pastebin.com/hkx0NXid and click "download". +1a. You can actually look at the source code there to see how it works. +2. Save the file as `backupBrews.sh` (this should be the default name already). +2a. If it isn't already on a Linux system, transfer the file to one. Or use "[git bash for Windows](https://gitforwindows.org/)" or whatever tickles your fancy. +3. Make sure you put it to a place where you have sufficient permissions to read, write, and create folders. +4. The script should run on any Linux, I tested it on Raspbian and with "git bash for Windows". +5. The simplest way to use this is `./backupBrews.sh -b BrewId` where the `BrewId` is the last part of the SHARE link: https://homebrewery.naturalcrit.com/share/*HereIsTheBrewId*. You don't need the whole link, just the `BrewId` part! Also, don't use the EDIT id, because that won't work. +5a. There will be several checks, if they pass, your brew will be downloaded and "cleaned up". What does that mean? When you get the source of your brew, all the `<` will be replaced with `<` and all the `>` will be replaced with `>`. The clean up process turns all the `<` and `>` back into `<` and `>`, so that you can theoretically take the text from the .md file and paste it into the homebrewery, ready to go. **Be aware:** Clean up can take quite a while. My Raspberry Pi 3 B+ needs about 10 minutes to clean up my largest brew at ~1,000,000 characters. +5b. A folder will be created in the current location of the script, named as follows: `./backup/BrewId/` +5c. Inside that folder, a file named BrewId_YYYYMMDD_HHMMSS.md will be created. +6. That's it. For advanced usage, see `--help` or the info below. + +### Advanced Usage + +Apparently, you are not content with the tool's basic function. That's cool, I wasn't either. :) + +There are some more options you can use, described in detail below. + +  + +#### Mandatory Options + +* `-b BrewId` + +At least one `-b BrewId` is mandatory, else the program will exit. You can do however many brews at once as you like. Just make sure to use `-b BrewId`, and all's good. + +***Example.*** `./backupBrews.sh -b BrewId1 -b BrewId2 -b BrewId3` + +Instead of using the BrewId as the name for the folder and the file, you can give your brew a (short) name. You should avoid spaces and special characters. If you must, you can use quotes to have spaces in the name. BrewName and BrewId have to be separated via `::`. + +***Example.*** `./backupBrews.sh -b BrewName1::BrewId1` + +You can of course combine these options: + +***Example.*** `./backupBrews.sh -b BrewName1::BrewId1 -b BrewId2 -b "Dont use spaces"::BrewId3` + +  + +#### Optional options + +* `--help` + +Show the help. This is the only option you can use without the `-b` option. + +  + +* `-s` + +The tool is verbose by default. The `-s` option turns off all output. You are still able to get an exit status via `echo $?`. + +***Example.*** `./backupBrews.sh -s -b BrewId` + +  + +* `-d dateformat` + +This changes the date format at the end of the backup file. Standard is `%Y%m%d_%H%M%S`. You can enter whatever is accepted by `date`. See `date --help` for more information. The example below gives you the current unix timestamp, so your filename would look something like this: `BrewId_1546297200.md` + +***Example.*** `./backupBrews.sh -d %s -b BrewId` + +  + +* `-l location` + +This changes the savelocation of your backups. The example below puts the brew folders into a folder called "backup" in the home of the current user, like so: `~/backup/BrewId/BrewId_20190101_000000.md`. Be aware that this script will only create a folder for the brew, not folders above that. To use the example, if the folder `~/backup/` doesn't exist, this tool will not create that folder and simply exit. + +***Example.*** `./backupBrews.sh -l "~/backup/" -b BrewId` + +  + +You can of course combine all of the options mentioned above: + +***Example.*** `./backupBrews.sh -s -d %s -l "~/backup/" -b BrewName1::BrewId1 -b BrewId2 -b "Dont use spaces"::BrewId3` + +--- + +If you have any questions, feel free to ask. \ No newline at end of file diff --git a/server.js b/server.js index 6bf98d200..9aa74179d 100644 --- a/server.js +++ b/server.js @@ -103,6 +103,7 @@ const HomebrewModel = require('./server/homebrew.model.js').model; const welcomeText = require('fs').readFileSync('./client/homebrew/pages/homePage/welcome_msg.md', 'utf8'); const welcomeTextV3 = require('fs').readFileSync('./client/homebrew/pages/homePage/welcome_msg_v3.md', 'utf8'); const changelogText = require('fs').readFileSync('./changelog.md', 'utf8'); +const faqText = require('fs').readFileSync('./faq.md', 'utf8'); String.prototype.replaceAll = function(s, r){return this.split(s).join(r);}; @@ -143,6 +144,18 @@ app.get('/changelog', async (req, res, next)=>{ return next(); }); +//FAQ page +app.get('/faq', async (req, res, next)=>{ + const brew = { + title : 'FAQ', + text : faqText, + renderer : 'V3' + }; + splitTextAndStyle(brew); + req.brew = brew; + return next(); +}); + //Source page app.get('/source/:id', asyncHandler(async (req, res)=>{ const brew = await getBrewFromId(req.params.id, 'raw'); From 22e54636d421812b0a0095eeeee79dd52886fccc Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Wed, 15 Sep 2021 14:02:19 -0400 Subject: [PATCH 174/188] Fix partial page rendering on v3 "dummy pages" on v3 were unstyled, giving them very small height which led to a cycle of pages changing size, which shifted other pages into view, which changed their sizes, etc. --- client/homebrew/brewRenderer/brewRenderer.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index 9ea4632c4..260dbdf13 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -117,7 +117,7 @@ const BrewRenderer = createClass({ }, renderDummyPage : function(index){ - return
    + return
    ; }, From 0e4c83043514bffc2d72112cb3dde8b84717c76b Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Wed, 15 Sep 2021 14:15:44 -0400 Subject: [PATCH 175/188] Migrate Mongoose to v6 --- package-lock.json | 447 +++++++++++++++++++++++++--------------------- package.json | 2 +- server.js | 5 +- 3 files changed, 248 insertions(+), 206 deletions(-) diff --git a/package-lock.json b/package-lock.json index dae627090..34a980e00 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,7 +30,7 @@ "marked": "3.0.4", "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.29.1", - "mongoose": "^5.13.7", + "mongoose": "^6.0.5", "nanoid": "3.1.25", "nconf": "^0.11.3", "prop-types": "15.7.2", @@ -1865,32 +1865,29 @@ "node": ">=6" } }, - "node_modules/@types/bson": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.3.tgz", - "integrity": "sha512-mVRvYnTOZJz3ccpxhr3wgxVmSeiYinW+zlzQz3SXWaJmD1DuL05Jeq7nKw3SnbKmbleW5qrLG5vdyWe/A9sXhw==", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" }, - "node_modules/@types/mongodb": { - "version": "3.6.17", - "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.17.tgz", - "integrity": "sha512-9hhgvYPdC5iHyyksPcKCu45gfaAIPQHKHGdvNXu4582DmOZX3wrUJIJPT40o4G1oTKPgpMMFqZglOTjhnYoF+A==", - "dependencies": { - "@types/bson": "*", - "@types/node": "*" - } - }, "node_modules/@types/node": { - "version": "15.6.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-15.6.1.tgz", - "integrity": "sha512-7EIraBEyRHEe7CH+Fm1XvgqU6uwZN8Q7jppJGcqjROMT29qhAuuOxYB1uEY5UMYQKEmA5D+5tBnhdaPXSsLONA==" + "version": "16.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.1.tgz", + "integrity": "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==" + }, + "node_modules/@types/webidl-conversions": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-6.1.1.tgz", + "integrity": "sha512-XAahCdThVuCFDQLT7R7Pk/vqeObFNL3YqRyFZg+AqAP/W1/w3xHaIxuW7WszQqTbIBOPRcItYJIou3i/mppu3Q==" + }, + "node_modules/@types/whatwg-url": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.1.tgz", + "integrity": "sha512-2YubE1sjj5ifxievI5Ge1sckb9k/Er66HyR2c+3+I6VDUUg1TLPdYYTEbQ+DjRkS4nTxMJhgWfSfMRD2sl2EYQ==", + "dependencies": { + "@types/node": "*", + "@types/webidl-conversions": "*" + } }, "node_modules/abbrev": { "version": "1.1.1", @@ -2410,20 +2407,6 @@ "file-uri-to-path": "1.0.0" } }, - "node_modules/bl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", - "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", - "dependencies": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" - }, "node_modules/bn.js": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", @@ -2806,11 +2789,37 @@ "integrity": "sha512-4i3T0cwnHo1O4Mnp9JniEco8bZiXoqbm3PhW5hv7uu8YLg35iajYrRnNyKFaN8/8SSTskU2hYqVTeYVPceSpUA==" }, "node_modules/bson": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", - "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.5.2.tgz", + "integrity": "sha512-8CEMJpwc7qlQtrn2rney38jQSEeMar847lz0LyitwRmVknAW8iHXrzW4fTjHfyWm0E3sukyD/zppdH+QU1QefA==", + "dependencies": { + "buffer": "^5.6.0" + }, "engines": { - "node": ">=0.6.19" + "node": ">=6.9.0" + } + }, + "node_modules/bson/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, "node_modules/buffer": { @@ -3518,9 +3527,9 @@ } }, "node_modules/denque": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", - "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", + "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", "engines": { "node": ">=0.10" } @@ -6287,116 +6296,100 @@ } }, "node_modules/mongodb": { - "version": "3.6.11", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.11.tgz", - "integrity": "sha512-4Y4lTFHDHZZdgMaHmojtNAlqkvddX2QQBEN0K//GzxhGwlI9tZ9R0vhbjr1Decw+TF7qK0ZLjQT292XgHRRQgw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.1.1.tgz", + "integrity": "sha512-fbACrWEyvr6yl0sSiCGV0sqEiBwTtDJ8iSojmkDjAfw9JnOZSAkUyv9seFSPYhPPKwxp1PDtyjvBNfMDz0WBLQ==", "dependencies": { - "bl": "^2.2.1", - "bson": "^1.1.4", - "denque": "^1.4.1", - "optional-require": "^1.0.3", - "safe-buffer": "^5.1.2" + "bson": "^4.5.1", + "denque": "^1.5.0", + "mongodb-connection-string-url": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=12.9.0" }, "optionalDependencies": { "saslprep": "^1.0.0" - }, - "peerDependenciesMeta": { - "aws4": { - "optional": true - }, - "bson-ext": { - "optional": true - }, - "kerberos": { - "optional": true - }, - "mongodb-client-encryption": { - "optional": true - }, - "mongodb-extjson": { - "optional": true - }, - "snappy": { - "optional": true - } + } + }, + "node_modules/mongodb-connection-string-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.0.0.tgz", + "integrity": "sha512-M0I1vyLoq5+HQTuPSJWbt+hIXsMCfE8sS1fS5mvP9R2DOMoi2ZD32yWqgBIITyu0dFu4qtS50erxKjvUeBiyog==", + "dependencies": { + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^9.1.0" } }, "node_modules/mongoose": { - "version": "5.13.7", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.13.7.tgz", - "integrity": "sha512-ADIvftZ+KfoTALMZ0n8HvBlezFhcUd73hQaHQDwQ+3X+JZlqE47fUy9yhFZ2SjT+qzmuaCcIXCfhewIc38t2fQ==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.0.5.tgz", + "integrity": "sha512-1MoG52oosjEK8z45DHQVbakP6DJG1sbQI/ZASBW8sZRV+rCaG/pC3L3wWjrsiped/2+uhvanWM9C89F2n6bQ3w==", "dependencies": { - "@types/mongodb": "^3.5.27", - "bson": "^1.1.4", + "bson": "^4.2.2", "kareem": "2.3.2", - "mongodb": "3.6.11", - "mongoose-legacy-pluralize": "1.0.2", - "mpath": "0.8.3", - "mquery": "3.2.5", + "mongodb": "4.1.1", + "mpath": "0.8.4", + "mquery": "4.0.0", "ms": "2.1.2", - "optional-require": "1.0.x", "regexp-clone": "1.0.0", - "safe-buffer": "5.2.1", "sift": "13.5.2", "sliced": "1.0.1" }, "engines": { - "node": ">=4.0.0" + "node": ">=12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/mongoose" } }, - "node_modules/mongoose-legacy-pluralize": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", - "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==" - }, "node_modules/mongoose/node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "node_modules/mongoose/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, "node_modules/mpath": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.3.tgz", - "integrity": "sha512-eb9rRvhDltXVNL6Fxd2zM9D4vKBxjVVQNLNijlj7uoXUy19zNDsIif5zR+pWmPCWNKwAtqyo4JveQm4nfD5+eA==", + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.4.tgz", + "integrity": "sha512-DTxNZomBcTWlrMW76jy1wvV37X/cNNxPW1y2Jzd4DZkAaC5ZGsm8bfGfNOthcDuRJujXLqiuS6o3Tpy0JEoh7g==", "engines": { "node": ">=4.0.0" } }, "node_modules/mquery": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.5.tgz", - "integrity": "sha512-VjOKHHgU84wij7IUoZzFRU07IAxd5kWJaDmyUzQlbjHjyoeK5TNeeo8ZsFDtTYnSgpW6n/nMNIHvE3u8Lbrf4A==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.0.tgz", + "integrity": "sha512-nGjm89lHja+T/b8cybAby6H0YgA4qYC/lx6UlwvHGqvTq8bDaNeCwl1sY8uRELrNbVWJzIihxVd+vphGGn1vBw==", "dependencies": { - "bluebird": "3.5.1", - "debug": "3.1.0", + "debug": "4.x", "regexp-clone": "^1.0.0", - "safe-buffer": "5.1.2", "sliced": "1.0.1" }, "engines": { - "node": ">=4.0.0" + "node": ">=12.0.0" } }, "node_modules/mquery/node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "dependencies": { - "ms": "2.0.0" + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, + "node_modules/mquery/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -6778,14 +6771,6 @@ "wrappy": "1" } }, - "node_modules/optional-require": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.0.3.tgz", - "integrity": "sha512-RV2Zp2MY2aeYK5G+B/Sps8lW5NHAzE5QClbFP15j+PWmP+T9PxlJXBOOLoSAdgwFvS4t0aMR4vpedMkbHfh0nA==", - "engines": { - "node": ">=4" - } - }, "node_modules/optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -8674,6 +8659,25 @@ "nodetouch": "bin/nodetouch.js" } }, + "node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tr46/node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, "node_modules/truncate-utf8-bytes": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", @@ -9343,6 +9347,26 @@ "node": ">=0.10.0" } }, + "node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "engines": { + "node": ">=10.4" + } + }, + "node_modules/whatwg-url": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-9.1.0.tgz", + "integrity": "sha512-CQ0UcrPHyomtlOCot1TL77WyMIm/bCwrJ2D6AOKGwEczU9EpyoqAokfqrf/MioU9kHcMsmJZcg1egXix2KYEsA==", + "dependencies": { + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -10753,32 +10777,29 @@ "defer-to-connect": "^1.0.1" } }, - "@types/bson": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.3.tgz", - "integrity": "sha512-mVRvYnTOZJz3ccpxhr3wgxVmSeiYinW+zlzQz3SXWaJmD1DuL05Jeq7nKw3SnbKmbleW5qrLG5vdyWe/A9sXhw==", - "requires": { - "@types/node": "*" - } - }, "@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" }, - "@types/mongodb": { - "version": "3.6.17", - "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.17.tgz", - "integrity": "sha512-9hhgvYPdC5iHyyksPcKCu45gfaAIPQHKHGdvNXu4582DmOZX3wrUJIJPT40o4G1oTKPgpMMFqZglOTjhnYoF+A==", - "requires": { - "@types/bson": "*", - "@types/node": "*" - } - }, "@types/node": { - "version": "15.6.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-15.6.1.tgz", - "integrity": "sha512-7EIraBEyRHEe7CH+Fm1XvgqU6uwZN8Q7jppJGcqjROMT29qhAuuOxYB1uEY5UMYQKEmA5D+5tBnhdaPXSsLONA==" + "version": "16.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.1.tgz", + "integrity": "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==" + }, + "@types/webidl-conversions": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-6.1.1.tgz", + "integrity": "sha512-XAahCdThVuCFDQLT7R7Pk/vqeObFNL3YqRyFZg+AqAP/W1/w3xHaIxuW7WszQqTbIBOPRcItYJIou3i/mppu3Q==" + }, + "@types/whatwg-url": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.1.tgz", + "integrity": "sha512-2YubE1sjj5ifxievI5Ge1sckb9k/Er66HyR2c+3+I6VDUUg1TLPdYYTEbQ+DjRkS4nTxMJhgWfSfMRD2sl2EYQ==", + "requires": { + "@types/node": "*", + "@types/webidl-conversions": "*" + } }, "abbrev": { "version": "1.1.1", @@ -11203,20 +11224,6 @@ "file-uri-to-path": "1.0.0" } }, - "bl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", - "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" - }, "bn.js": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", @@ -11547,9 +11554,23 @@ } }, "bson": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", - "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==" + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.5.2.tgz", + "integrity": "sha512-8CEMJpwc7qlQtrn2rney38jQSEeMar847lz0LyitwRmVknAW8iHXrzW4fTjHfyWm0E3sukyD/zppdH+QU1QefA==", + "requires": { + "buffer": "^5.6.0" + }, + "dependencies": { + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + } + } }, "buffer": { "version": "5.2.1", @@ -12140,9 +12161,9 @@ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "denque": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", - "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==" + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", + "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==" }, "depd": { "version": "1.1.2", @@ -14311,34 +14332,37 @@ "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" }, "mongodb": { - "version": "3.6.11", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.11.tgz", - "integrity": "sha512-4Y4lTFHDHZZdgMaHmojtNAlqkvddX2QQBEN0K//GzxhGwlI9tZ9R0vhbjr1Decw+TF7qK0ZLjQT292XgHRRQgw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.1.1.tgz", + "integrity": "sha512-fbACrWEyvr6yl0sSiCGV0sqEiBwTtDJ8iSojmkDjAfw9JnOZSAkUyv9seFSPYhPPKwxp1PDtyjvBNfMDz0WBLQ==", "requires": { - "bl": "^2.2.1", - "bson": "^1.1.4", - "denque": "^1.4.1", - "optional-require": "^1.0.3", - "safe-buffer": "^5.1.2", + "bson": "^4.5.1", + "denque": "^1.5.0", + "mongodb-connection-string-url": "^2.0.0", "saslprep": "^1.0.0" } }, - "mongoose": { - "version": "5.13.7", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.13.7.tgz", - "integrity": "sha512-ADIvftZ+KfoTALMZ0n8HvBlezFhcUd73hQaHQDwQ+3X+JZlqE47fUy9yhFZ2SjT+qzmuaCcIXCfhewIc38t2fQ==", + "mongodb-connection-string-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.0.0.tgz", + "integrity": "sha512-M0I1vyLoq5+HQTuPSJWbt+hIXsMCfE8sS1fS5mvP9R2DOMoi2ZD32yWqgBIITyu0dFu4qtS50erxKjvUeBiyog==", "requires": { - "@types/mongodb": "^3.5.27", - "bson": "^1.1.4", + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^9.1.0" + } + }, + "mongoose": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.0.5.tgz", + "integrity": "sha512-1MoG52oosjEK8z45DHQVbakP6DJG1sbQI/ZASBW8sZRV+rCaG/pC3L3wWjrsiped/2+uhvanWM9C89F2n6bQ3w==", + "requires": { + "bson": "^4.2.2", "kareem": "2.3.2", - "mongodb": "3.6.11", - "mongoose-legacy-pluralize": "1.0.2", - "mpath": "0.8.3", - "mquery": "3.2.5", + "mongodb": "4.1.1", + "mpath": "0.8.4", + "mquery": "4.0.0", "ms": "2.1.2", - "optional-require": "1.0.x", "regexp-clone": "1.0.0", - "safe-buffer": "5.2.1", "sift": "13.5.2", "sliced": "1.0.1" }, @@ -14347,43 +14371,36 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" } } }, - "mongoose-legacy-pluralize": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", - "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==" - }, "mpath": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.3.tgz", - "integrity": "sha512-eb9rRvhDltXVNL6Fxd2zM9D4vKBxjVVQNLNijlj7uoXUy19zNDsIif5zR+pWmPCWNKwAtqyo4JveQm4nfD5+eA==" + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.4.tgz", + "integrity": "sha512-DTxNZomBcTWlrMW76jy1wvV37X/cNNxPW1y2Jzd4DZkAaC5ZGsm8bfGfNOthcDuRJujXLqiuS6o3Tpy0JEoh7g==" }, "mquery": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.5.tgz", - "integrity": "sha512-VjOKHHgU84wij7IUoZzFRU07IAxd5kWJaDmyUzQlbjHjyoeK5TNeeo8ZsFDtTYnSgpW6n/nMNIHvE3u8Lbrf4A==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.0.tgz", + "integrity": "sha512-nGjm89lHja+T/b8cybAby6H0YgA4qYC/lx6UlwvHGqvTq8bDaNeCwl1sY8uRELrNbVWJzIihxVd+vphGGn1vBw==", "requires": { - "bluebird": "3.5.1", - "debug": "3.1.0", + "debug": "4.x", "regexp-clone": "^1.0.0", - "safe-buffer": "5.1.2", "sliced": "1.0.1" }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "requires": { - "ms": "2.0.0" + "ms": "2.1.2" } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, @@ -14675,11 +14692,6 @@ "wrappy": "1" } }, - "optional-require": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.0.3.tgz", - "integrity": "sha512-RV2Zp2MY2aeYK5G+B/Sps8lW5NHAzE5QClbFP15j+PWmP+T9PxlJXBOOLoSAdgwFvS4t0aMR4vpedMkbHfh0nA==" - }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -16223,6 +16235,21 @@ "nopt": "~1.0.10" } }, + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "requires": { + "punycode": "^2.1.1" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + } + } + }, "truncate-utf8-bytes": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", @@ -16762,6 +16789,20 @@ } } }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" + }, + "whatwg-url": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-9.1.0.tgz", + "integrity": "sha512-CQ0UcrPHyomtlOCot1TL77WyMIm/bCwrJ2D6AOKGwEczU9EpyoqAokfqrf/MioU9kHcMsmJZcg1egXix2KYEsA==", + "requires": { + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index e50c54c8e..34da45abf 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "marked": "3.0.4", "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.29.1", - "mongoose": "^5.13.7", + "mongoose": "^6.0.5", "nanoid": "3.1.25", "nconf": "^0.11.3", "prop-types": "15.7.2", diff --git a/server.js b/server.js index e6e191ab5..a13be320b 100644 --- a/server.js +++ b/server.js @@ -72,10 +72,11 @@ const config = require('nconf') //DB const mongoose = require('mongoose'); mongoose.connect(config.get('mongodb_uri') || config.get('mongolab_uri') || 'mongodb://localhost/naturalcrit', - { retryWrites: false, useNewUrlParser: true, useCreateIndex: true, useUnifiedTopology: true }); -mongoose.connection.on('error', ()=>{ + { retryWrites: false }); +mongoose.connection.on('error', (err)=>{ console.log('Error : Could not connect to a Mongo Database.'); console.log(' If you are running locally, make sure mongodb.exe is running.'); + console.log(err); throw 'Can not connect to Mongo'; }); From ca491067f1810c592be70bb12e9096589978fc52 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Wed, 15 Sep 2021 14:36:34 -0400 Subject: [PATCH 176/188] linting --- server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server.js b/server.js index 9aa74179d..89f0b828c 100644 --- a/server.js +++ b/server.js @@ -103,7 +103,7 @@ const HomebrewModel = require('./server/homebrew.model.js').model; const welcomeText = require('fs').readFileSync('./client/homebrew/pages/homePage/welcome_msg.md', 'utf8'); const welcomeTextV3 = require('fs').readFileSync('./client/homebrew/pages/homePage/welcome_msg_v3.md', 'utf8'); const changelogText = require('fs').readFileSync('./changelog.md', 'utf8'); -const faqText = require('fs').readFileSync('./faq.md', 'utf8'); +const faqText = require('fs').readFileSync('./faq.md', 'utf8'); String.prototype.replaceAll = function(s, r){return this.split(s).join(r);}; From 74e746ace9d9d4e46b7c35ec0f844f715804e9da Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Sep 2021 18:40:18 +0000 Subject: [PATCH 177/188] Bump dedent-tabs from 0.10.0 to 0.10.1 Bumps [dedent-tabs](https://github.com/adrianjost/dedent-tabs) from 0.10.0 to 0.10.1. - [Release notes](https://github.com/adrianjost/dedent-tabs/releases) - [Commits](https://github.com/adrianjost/dedent-tabs/compare/v0.10.0...v0.10.1) --- updated-dependencies: - dependency-name: dedent-tabs dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 34a980e00..d0eeabbf3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ "codemirror": "^5.62.3", "cookie-parser": "^1.4.5", "create-react-class": "^15.7.0", - "dedent-tabs": "^0.10.0", + "dedent-tabs": "^0.10.1", "express": "^4.17.1", "express-async-handler": "^1.1.4", "express-static-gzip": "2.1.1", @@ -3467,9 +3467,9 @@ } }, "node_modules/dedent-tabs": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/dedent-tabs/-/dedent-tabs-0.10.0.tgz", - "integrity": "sha512-meGhMg4ieQIw/kssncvurnfuDJlMz05Q10EfE/m73Nos8KBU8UUJoMiCf5/ZAzsNmqgf0zan+/i145t2z+9A+Q==" + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/dedent-tabs/-/dedent-tabs-0.10.1.tgz", + "integrity": "sha512-BLwWIXQnJAxhCL+kDN4g/KItzG9glaw1cFglr+pql8W4lTADsZxC0QpolcRXO2M4+bI2/MXCGeg0WPuzeM3SYQ==" }, "node_modules/deep-extend": { "version": "0.6.0", @@ -12113,9 +12113,9 @@ } }, "dedent-tabs": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/dedent-tabs/-/dedent-tabs-0.10.0.tgz", - "integrity": "sha512-meGhMg4ieQIw/kssncvurnfuDJlMz05Q10EfE/m73Nos8KBU8UUJoMiCf5/ZAzsNmqgf0zan+/i145t2z+9A+Q==" + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/dedent-tabs/-/dedent-tabs-0.10.1.tgz", + "integrity": "sha512-BLwWIXQnJAxhCL+kDN4g/KItzG9glaw1cFglr+pql8W4lTADsZxC0QpolcRXO2M4+bI2/MXCGeg0WPuzeM3SYQ==" }, "deep-extend": { "version": "0.6.0", diff --git a/package.json b/package.json index 34da45abf..d0c2434a4 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "codemirror": "^5.62.3", "cookie-parser": "^1.4.5", "create-react-class": "^15.7.0", - "dedent-tabs": "^0.10.0", + "dedent-tabs": "^0.10.1", "express": "^4.17.1", "express-async-handler": "^1.1.4", "express-static-gzip": "2.1.1", From f7b5cfc623e9b64ae4410b6b91c741556352ff5a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Sep 2021 18:40:37 +0000 Subject: [PATCH 178/188] Bump googleapis from 85.0.0 to 86.1.0 Bumps [googleapis](https://github.com/googleapis/google-api-nodejs-client) from 85.0.0 to 86.1.0. - [Release notes](https://github.com/googleapis/google-api-nodejs-client/releases) - [Changelog](https://github.com/googleapis/google-api-nodejs-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-nodejs-client/compare/googleapis-v85.0.0...googleapis-v86.1.0) --- updated-dependencies: - dependency-name: googleapis dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 34a980e00..431db0ded 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,7 @@ "express-async-handler": "^1.1.4", "express-static-gzip": "2.1.1", "fs-extra": "10.0.0", - "googleapis": "85.0.0", + "googleapis": "86.1.0", "jwt-simple": "^0.5.6", "less": "^3.13.1", "lodash": "^4.17.21", @@ -4803,9 +4803,9 @@ } }, "node_modules/googleapis": { - "version": "85.0.0", - "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-85.0.0.tgz", - "integrity": "sha512-9zFsCbxz/642PROcYJsg/CCm89U1qe15c0Wtv7bmZ8cWYLD1Jszc5z+xTNoXZxnomLbvQaHeKBCPh7RdAccYOA==", + "version": "86.1.0", + "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-86.1.0.tgz", + "integrity": "sha512-gcYXoH5/xXBLDyLYPZHtxw89DKqxtRhFOF907ph8HYpUeKDQARIhjOauYkX8Pp8fwhUvCFtydx7jOkYolthbbQ==", "dependencies": { "google-auth-library": "^7.0.2", "googleapis-common": "^5.0.2" @@ -13176,9 +13176,9 @@ } }, "googleapis": { - "version": "85.0.0", - "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-85.0.0.tgz", - "integrity": "sha512-9zFsCbxz/642PROcYJsg/CCm89U1qe15c0Wtv7bmZ8cWYLD1Jszc5z+xTNoXZxnomLbvQaHeKBCPh7RdAccYOA==", + "version": "86.1.0", + "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-86.1.0.tgz", + "integrity": "sha512-gcYXoH5/xXBLDyLYPZHtxw89DKqxtRhFOF907ph8HYpUeKDQARIhjOauYkX8Pp8fwhUvCFtydx7jOkYolthbbQ==", "requires": { "google-auth-library": "^7.0.2", "googleapis-common": "^5.0.2" diff --git a/package.json b/package.json index 34da45abf..bcf1c4a51 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "express-async-handler": "^1.1.4", "express-static-gzip": "2.1.1", "fs-extra": "10.0.0", - "googleapis": "85.0.0", + "googleapis": "86.1.0", "jwt-simple": "^0.5.6", "less": "^3.13.1", "lodash": "^4.17.21", From 1f2809a9139651591413316c19c63cb15fd50e9a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Sep 2021 18:40:48 +0000 Subject: [PATCH 179/188] Bump mongoose from 6.0.5 to 6.0.6 Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.0.5 to 6.0.6. - [Release notes](https://github.com/Automattic/mongoose/releases) - [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md) - [Commits](https://github.com/Automattic/mongoose/compare/6.0.5...6.0.6) --- updated-dependencies: - dependency-name: mongoose dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 34a980e00..460879ac4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,7 +30,7 @@ "marked": "3.0.4", "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.29.1", - "mongoose": "^6.0.5", + "mongoose": "^6.0.6", "nanoid": "3.1.25", "nconf": "^0.11.3", "prop-types": "15.7.2", @@ -6321,9 +6321,9 @@ } }, "node_modules/mongoose": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.0.5.tgz", - "integrity": "sha512-1MoG52oosjEK8z45DHQVbakP6DJG1sbQI/ZASBW8sZRV+rCaG/pC3L3wWjrsiped/2+uhvanWM9C89F2n6bQ3w==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.0.6.tgz", + "integrity": "sha512-8lHgva/q5msZT16KOKDl+26Mh7uzTrmznup0p/TMqDCt7Y41voP7rZ0sTW/6tk2nsrmmMlJzzThJ8vexq7aQtQ==", "dependencies": { "bson": "^4.2.2", "kareem": "2.3.2", @@ -14352,9 +14352,9 @@ } }, "mongoose": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.0.5.tgz", - "integrity": "sha512-1MoG52oosjEK8z45DHQVbakP6DJG1sbQI/ZASBW8sZRV+rCaG/pC3L3wWjrsiped/2+uhvanWM9C89F2n6bQ3w==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.0.6.tgz", + "integrity": "sha512-8lHgva/q5msZT16KOKDl+26Mh7uzTrmznup0p/TMqDCt7Y41voP7rZ0sTW/6tk2nsrmmMlJzzThJ8vexq7aQtQ==", "requires": { "bson": "^4.2.2", "kareem": "2.3.2", diff --git a/package.json b/package.json index 34da45abf..4c75d4199 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "marked": "3.0.4", "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.29.1", - "mongoose": "^6.0.5", + "mongoose": "^6.0.6", "nanoid": "3.1.25", "nconf": "^0.11.3", "prop-types": "15.7.2", From aff764d91c8406c67275f40de159b7e8545fe357 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Wed, 15 Sep 2021 14:56:58 -0400 Subject: [PATCH 180/188] Fix typo in snippet --- .../editor/snippetbar/snippets/monsterblock.gen.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/client/homebrew/editor/snippetbar/snippets/monsterblock.gen.js b/client/homebrew/editor/snippetbar/snippets/monsterblock.gen.js index e51249ab1..dddf9b78c 100644 --- a/client/homebrew/editor/snippetbar/snippets/monsterblock.gen.js +++ b/client/homebrew/editor/snippetbar/snippets/monsterblock.gen.js @@ -160,16 +160,18 @@ module.exports = { ## ${getMonsterName()} *${getType()}, ${getAlignment()}* ___ - + **Armor Class** :: ${_.random(10, 20)} (chain mail, shield) + **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** :: darkvision 60 ft., passive Perception ${_.random(3, 20)} **Languages** :: ${genList(['Common', 'Pottymouth', 'Gibberish', 'Latin', 'Jive'], 2)} - + **Challenge** :: ${_.random(0, 15)} (${_.random(10, 10000)} XP) ___ ${_.times(_.random(genLines, genLines + 2), function(){return genAbilities();}).join('\n:\n')} : From 837cacc992a4973ac6d0bb54b4582d1ec39d212c Mon Sep 17 00:00:00 2001 From: Gazook89 <58999374+Gazook89@users.noreply.github.com> Date: Thu, 16 Sep 2021 09:51:16 -0500 Subject: [PATCH 181/188] add `.page` container div to printPage.jsx --- client/homebrew/pages/printPage/printPage.jsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/client/homebrew/pages/printPage/printPage.jsx b/client/homebrew/pages/printPage/printPage.jsx index 6b3274de6..e083bd98d 100644 --- a/client/homebrew/pages/printPage/printPage.jsx +++ b/client/homebrew/pages/printPage/printPage.jsx @@ -63,7 +63,9 @@ const PrintPage = createClass({ {/* Apply CSS from Style tab */}
    ${this.props.brew.style} ` }} /> - {this.renderPages()} +
    + {this.renderPages()} +
    ; } }); From 80ea598ec298f9d14a06afc20964b8afd187ee19 Mon Sep 17 00:00:00 2001 From: Gazook89 <58999374+Gazook89@users.noreply.github.com> Date: Thu, 16 Sep 2021 19:59:54 -0500 Subject: [PATCH 182/188] match brewRenderer.jsx output to printPage.jsx output --- client/homebrew/brewRenderer/brewRenderer.jsx | 21 +++++++++---------- client/homebrew/pages/printPage/printPage.jsx | 9 ++++++-- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index 260dbdf13..ad767ad9f 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -188,7 +188,6 @@ const BrewRenderer = createClass({ : null} style={{ width: '100%', height: '100%', visibility: this.state.visibility }} contentDidMount={this.frameDidMount}>
    - -
    - {/* Apply CSS from Style tab and render pages from Markdown tab */} - {this.state.isMounted - && - <> - {this.renderStyle()} + + {/* Apply CSS from Style tab and render pages from Markdown tab */} + {this.state.isMounted + && + <> + {this.renderStyle()} +
    {this.renderPages()} - - } -
    +
    + + }
    {this.renderPageInfo()} diff --git a/client/homebrew/pages/printPage/printPage.jsx b/client/homebrew/pages/printPage/printPage.jsx index e083bd98d..909adc1a9 100644 --- a/client/homebrew/pages/printPage/printPage.jsx +++ b/client/homebrew/pages/printPage/printPage.jsx @@ -35,6 +35,11 @@ const PrintPage = createClass({ if(this.props.query.dialog) window.print(); }, + renderStyle : function() { + if(!this.props.brew.style) return; + return
    ${this.props.brew.style} ` }} />; + }, + renderPages : function(){ if(this.props.brew.renderer == 'legacy') { return _.map(this.state.brewText.split('\\page'), (pageText, index)=>{ @@ -62,8 +67,8 @@ const PrintPage = createClass({ {/* Apply CSS from Style tab */} -
    ${this.props.brew.style} ` }} /> -
    + {this.renderStyle()} +
    {this.renderPages()}
    ; From 356c062ce5708780dfaa3b302f605b88a4252395 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 Sep 2021 03:01:16 +0000 Subject: [PATCH 183/188] Bump googleapis from 86.1.0 to 87.0.0 Bumps [googleapis](https://github.com/googleapis/google-api-nodejs-client) from 86.1.0 to 87.0.0. - [Release notes](https://github.com/googleapis/google-api-nodejs-client/releases) - [Changelog](https://github.com/googleapis/google-api-nodejs-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-api-nodejs-client/compare/googleapis-v86.1.0...googleapis-v87.0.0) --- updated-dependencies: - dependency-name: googleapis dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 77085140f..ba00f8a9c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,7 @@ "express-async-handler": "^1.1.4", "express-static-gzip": "2.1.1", "fs-extra": "10.0.0", - "googleapis": "86.1.0", + "googleapis": "87.0.0", "jwt-simple": "^0.5.6", "less": "^3.13.1", "lodash": "^4.17.21", @@ -4803,9 +4803,9 @@ } }, "node_modules/googleapis": { - "version": "86.1.0", - "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-86.1.0.tgz", - "integrity": "sha512-gcYXoH5/xXBLDyLYPZHtxw89DKqxtRhFOF907ph8HYpUeKDQARIhjOauYkX8Pp8fwhUvCFtydx7jOkYolthbbQ==", + "version": "87.0.0", + "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-87.0.0.tgz", + "integrity": "sha512-/SfRpfshQoluC309qRkNWUiTkUN5uQtP/TuPvYbw/7khiJJnxrhP632zPZPKT+8zEPe5/j5hYzMnJKywJNeFvw==", "dependencies": { "google-auth-library": "^7.0.2", "googleapis-common": "^5.0.2" @@ -13176,9 +13176,9 @@ } }, "googleapis": { - "version": "86.1.0", - "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-86.1.0.tgz", - "integrity": "sha512-gcYXoH5/xXBLDyLYPZHtxw89DKqxtRhFOF907ph8HYpUeKDQARIhjOauYkX8Pp8fwhUvCFtydx7jOkYolthbbQ==", + "version": "87.0.0", + "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-87.0.0.tgz", + "integrity": "sha512-/SfRpfshQoluC309qRkNWUiTkUN5uQtP/TuPvYbw/7khiJJnxrhP632zPZPKT+8zEPe5/j5hYzMnJKywJNeFvw==", "requires": { "google-auth-library": "^7.0.2", "googleapis-common": "^5.0.2" diff --git a/package.json b/package.json index 5ac8290b9..e2d4f9ebe 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "express-async-handler": "^1.1.4", "express-static-gzip": "2.1.1", "fs-extra": "10.0.0", - "googleapis": "86.1.0", + "googleapis": "87.0.0", "jwt-simple": "^0.5.6", "less": "^3.13.1", "lodash": "^4.17.21", From 875e8b59a692378dee68e40b97cce95833b4286e Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Fri, 17 Sep 2021 13:57:07 -0400 Subject: [PATCH 184/188] Update changelog and version to 3.0.1 --- changelog.md | 35 +++++++++++++++++++++++++++++++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/changelog.md b/changelog.md index e36cbb82a..8ee6d33d2 100644 --- a/changelog.md +++ b/changelog.md @@ -32,6 +32,41 @@ pre { # changelog +### Friday, 17/09/2021 - v3.0.1 + +{{taskList +* [x] Updated V3 **PHB → Class Feature** snippet to use V3 syntax. + + Fixes issues: [Reported on Reddit](https://www.reddit.com/r/homebrewery/comments/pm6ki7/two_version_of_class_features_making_it_look_more/) + +* [x] Improved V3 **PHB → Monster Stat Block** snippet and styling to allow for easier control of paragraph indentation in the Abilities text. + + Fixes issues: [#181](https://github.com/naturalcrit/homebrewery/issues/181) + +* [x] Improved Legacy **TABLES → Split Table** snippet by removing unneeded column-break backticks. + + Fixes issues: [#844](https://github.com/naturalcrit/homebrewery/issues/844) + +* [x] Changed block elements to use CSS `width` instead of `min-width`. This should make custom styles behave more predictably when trying to resize items. + + Fixes issues: [Reported on Reddit](https://www.reddit.com/r/homebrewery/comments/pohoy3/looking_for_help_with_basic_stuff_in_v3/) + +* [x] Fixed Partial Page Rendering in V3 for large brews + + Fixes issues: [Reported on Reddit](https://www.reddit.com/r/homebrewery/comments/pori3a/weird_behaviour_of_the_brew_after_page_50/) + +* [x] Fixed HTML validation to handle tags starting with 'a', as in `<​aside>`. + + Fixes issues: [#230](https://github.com/naturalcrit/homebrewery/issues/230) + +* [x] Fixed page footers switching side when printing. + + Fixes issues: [#1612](https://github.com/naturalcrit/homebrewery/issues/1612) +}} + + +\page + ### Saturday, 11/09/2021 - v3.0.0 We have been working on v3 for a *very* long time. We want to thank everyone for being paitent. diff --git a/package-lock.json b/package-lock.json index 77085140f..112c29e1c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { "name": "homebrewery", - "version": "3.0.0", + "version": "3.0.1", "lockfileVersion": 2, "requires": true, "packages": { "": { - "version": "3.0.0", + "version": "3.0.1", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 5ac8290b9..9b09ac976 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "homebrewery", "description": "Create authentic looking D&D homebrews using only markdown", - "version": "3.0.0", + "version": "3.0.1", "engines": { "node": "14.15.x" }, From b4a658cac57466d594a26aaa46a16193ee276d54 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 20 Sep 2021 03:00:37 +0000 Subject: [PATCH 185/188] Bump eslint-plugin-react from 7.25.1 to 7.25.3 Bumps [eslint-plugin-react](https://github.com/yannickcr/eslint-plugin-react) from 7.25.1 to 7.25.3. - [Release notes](https://github.com/yannickcr/eslint-plugin-react/releases) - [Changelog](https://github.com/yannickcr/eslint-plugin-react/blob/master/CHANGELOG.md) - [Commits](https://github.com/yannickcr/eslint-plugin-react/compare/v7.25.1...v7.25.3) --- updated-dependencies: - dependency-name: eslint-plugin-react dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 41 ++++++++++++++++++++++++++++++++--------- package.json | 2 +- 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8b6337ccb..a3e7c26f0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,7 +45,7 @@ }, "devDependencies": { "eslint": "^7.32.0", - "eslint-plugin-react": "^7.25.1", + "eslint-plugin-react": "^7.25.3", "pico-check": "^2.1.3" }, "engines": { @@ -3868,20 +3868,20 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.25.1.tgz", - "integrity": "sha512-P4j9K1dHoFXxDNP05AtixcJEvIT6ht8FhYKsrkY0MPCPaUMYijhpWwNiRDZVtA8KFuZOkGSeft6QwH8KuVpJug==", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.25.3.tgz", + "integrity": "sha512-ZMbFvZ1WAYSZKY662MBVEWR45VaBT6KSJCiupjrNlcdakB90juaZeDCbJq19e73JZQubqFtgETohwgAt8u5P6w==", "dev": true, "dependencies": { "array-includes": "^3.1.3", "array.prototype.flatmap": "^1.2.4", "doctrine": "^2.1.0", "estraverse": "^5.2.0", - "has": "^1.0.3", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.0.4", "object.entries": "^1.1.4", "object.fromentries": "^2.0.4", + "object.hasown": "^1.0.0", "object.values": "^1.1.4", "prop-types": "^15.7.2", "resolve": "^2.0.0-next.3", @@ -6724,6 +6724,19 @@ "node": ">= 0.4" } }, + "node_modules/object.hasown": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.0.0.tgz", + "integrity": "sha512-qYMF2CLIjxxLGleeM0jrcB4kiv3loGVAjKQKvH8pSU/i2VcRRvUNmxbD+nEMmrXRfORhuVJuH8OtSYCZoue3zA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.18.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -12519,20 +12532,20 @@ } }, "eslint-plugin-react": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.25.1.tgz", - "integrity": "sha512-P4j9K1dHoFXxDNP05AtixcJEvIT6ht8FhYKsrkY0MPCPaUMYijhpWwNiRDZVtA8KFuZOkGSeft6QwH8KuVpJug==", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.25.3.tgz", + "integrity": "sha512-ZMbFvZ1WAYSZKY662MBVEWR45VaBT6KSJCiupjrNlcdakB90juaZeDCbJq19e73JZQubqFtgETohwgAt8u5P6w==", "dev": true, "requires": { "array-includes": "^3.1.3", "array.prototype.flatmap": "^1.2.4", "doctrine": "^2.1.0", "estraverse": "^5.2.0", - "has": "^1.0.3", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.0.4", "object.entries": "^1.1.4", "object.fromentries": "^2.0.4", + "object.hasown": "^1.0.0", "object.values": "^1.1.4", "prop-types": "^15.7.2", "resolve": "^2.0.0-next.3", @@ -14657,6 +14670,16 @@ "has": "^1.0.3" } }, + "object.hasown": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.0.0.tgz", + "integrity": "sha512-qYMF2CLIjxxLGleeM0jrcB4kiv3loGVAjKQKvH8pSU/i2VcRRvUNmxbD+nEMmrXRfORhuVJuH8OtSYCZoue3zA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.18.1" + } + }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", diff --git a/package.json b/package.json index 2474ab086..5c3f9e803 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ }, "devDependencies": { "eslint": "^7.32.0", - "eslint-plugin-react": "^7.25.1", + "eslint-plugin-react": "^7.25.3", "pico-check": "^2.1.3" } } From 2ab010acadedc9b8fcfe96d9fbd9662c62797207 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Sep 2021 03:01:04 +0000 Subject: [PATCH 186/188] Bump mongoose from 6.0.6 to 6.0.7 Bumps [mongoose](https://github.com/Automattic/mongoose) from 6.0.6 to 6.0.7. - [Release notes](https://github.com/Automattic/mongoose/releases) - [Changelog](https://github.com/Automattic/mongoose/blob/master/CHANGELOG.md) - [Commits](https://github.com/Automattic/mongoose/compare/6.0.6...6.0.7) --- updated-dependencies: - dependency-name: mongoose dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index a3e7c26f0..178302061 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,7 +30,7 @@ "marked": "3.0.4", "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.29.1", - "mongoose": "^6.0.6", + "mongoose": "^6.0.7", "nanoid": "3.1.25", "nconf": "^0.11.3", "prop-types": "15.7.2", @@ -6321,9 +6321,9 @@ } }, "node_modules/mongoose": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.0.6.tgz", - "integrity": "sha512-8lHgva/q5msZT16KOKDl+26Mh7uzTrmznup0p/TMqDCt7Y41voP7rZ0sTW/6tk2nsrmmMlJzzThJ8vexq7aQtQ==", + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.0.7.tgz", + "integrity": "sha512-44STDcV6awu0zfo1Z3NyKPHZwfVrGU93/QgR0gYbt4bik/nEa7lI1RRGcq5oyGM0YE7l63i2j80v1OhvrlFvYw==", "dependencies": { "bson": "^4.2.2", "kareem": "2.3.2", @@ -14365,9 +14365,9 @@ } }, "mongoose": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.0.6.tgz", - "integrity": "sha512-8lHgva/q5msZT16KOKDl+26Mh7uzTrmznup0p/TMqDCt7Y41voP7rZ0sTW/6tk2nsrmmMlJzzThJ8vexq7aQtQ==", + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.0.7.tgz", + "integrity": "sha512-44STDcV6awu0zfo1Z3NyKPHZwfVrGU93/QgR0gYbt4bik/nEa7lI1RRGcq5oyGM0YE7l63i2j80v1OhvrlFvYw==", "requires": { "bson": "^4.2.2", "kareem": "2.3.2", diff --git a/package.json b/package.json index 5c3f9e803..a04679af7 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "marked": "3.0.4", "markedLegacy": "npm:marked@^0.3.19", "moment": "^2.29.1", - "mongoose": "^6.0.6", + "mongoose": "^6.0.7", "nanoid": "3.1.25", "nconf": "^0.11.3", "prop-types": "15.7.2", From 808478671808f38a6ab3acaf48eb1c84365f0f67 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Sep 2021 03:01:28 +0000 Subject: [PATCH 187/188] Bump eslint-plugin-react from 7.25.3 to 7.26.0 Bumps [eslint-plugin-react](https://github.com/yannickcr/eslint-plugin-react) from 7.25.3 to 7.26.0. - [Release notes](https://github.com/yannickcr/eslint-plugin-react/releases) - [Changelog](https://github.com/yannickcr/eslint-plugin-react/blob/master/CHANGELOG.md) - [Commits](https://github.com/yannickcr/eslint-plugin-react/compare/v7.25.3...v7.26.0) --- updated-dependencies: - dependency-name: eslint-plugin-react dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 31 ++++++++++++++++++++++++------- package.json | 2 +- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index a3e7c26f0..040367b89 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,7 +45,7 @@ }, "devDependencies": { "eslint": "^7.32.0", - "eslint-plugin-react": "^7.25.3", + "eslint-plugin-react": "^7.26.0", "pico-check": "^2.1.3" }, "engines": { @@ -3868,9 +3868,9 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.25.3.tgz", - "integrity": "sha512-ZMbFvZ1WAYSZKY662MBVEWR45VaBT6KSJCiupjrNlcdakB90juaZeDCbJq19e73JZQubqFtgETohwgAt8u5P6w==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.26.0.tgz", + "integrity": "sha512-dceliS5itjk4EZdQYtLMz6GulcsasguIs+VTXuiC7Q5IPIdGTkyfXVdmsQOqEhlD9MciofH4cMcT1bw1WWNxCQ==", "dev": true, "dependencies": { "array-includes": "^3.1.3", @@ -3885,6 +3885,7 @@ "object.values": "^1.1.4", "prop-types": "^15.7.2", "resolve": "^2.0.0-next.3", + "semver": "^6.3.0", "string.prototype.matchall": "^4.0.5" }, "engines": { @@ -3925,6 +3926,15 @@ "path-parse": "^1.0.6" } }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -12532,9 +12542,9 @@ } }, "eslint-plugin-react": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.25.3.tgz", - "integrity": "sha512-ZMbFvZ1WAYSZKY662MBVEWR45VaBT6KSJCiupjrNlcdakB90juaZeDCbJq19e73JZQubqFtgETohwgAt8u5P6w==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.26.0.tgz", + "integrity": "sha512-dceliS5itjk4EZdQYtLMz6GulcsasguIs+VTXuiC7Q5IPIdGTkyfXVdmsQOqEhlD9MciofH4cMcT1bw1WWNxCQ==", "dev": true, "requires": { "array-includes": "^3.1.3", @@ -12549,6 +12559,7 @@ "object.values": "^1.1.4", "prop-types": "^15.7.2", "resolve": "^2.0.0-next.3", + "semver": "^6.3.0", "string.prototype.matchall": "^4.0.5" }, "dependencies": { @@ -12576,6 +12587,12 @@ "is-core-module": "^2.2.0", "path-parse": "^1.0.6" } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true } } }, diff --git a/package.json b/package.json index 5c3f9e803..131835f2d 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ }, "devDependencies": { "eslint": "^7.32.0", - "eslint-plugin-react": "^7.25.3", + "eslint-plugin-react": "^7.26.0", "pico-check": "^2.1.3" } } From 2ea5148c4a4688f8256f896a5ed86eeec3b3da25 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Sep 2021 03:01:53 +0000 Subject: [PATCH 188/188] Bump codemirror from 5.62.3 to 5.63.0 Bumps [codemirror](https://github.com/codemirror/CodeMirror) from 5.62.3 to 5.63.0. - [Release notes](https://github.com/codemirror/CodeMirror/releases) - [Changelog](https://github.com/codemirror/CodeMirror/blob/master/CHANGELOG.md) - [Commits](https://github.com/codemirror/CodeMirror/compare/5.62.3...5.63.0) --- updated-dependencies: - dependency-name: codemirror dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index a3e7c26f0..7be58f8c0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "@babel/preset-react": "^7.14.5", "body-parser": "^1.19.0", "classnames": "^2.3.1", - "codemirror": "^5.62.3", + "codemirror": "^5.63.0", "cookie-parser": "^1.4.5", "create-react-class": "^15.7.0", "dedent-tabs": "^0.10.1", @@ -3138,9 +3138,9 @@ } }, "node_modules/codemirror": { - "version": "5.62.3", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.62.3.tgz", - "integrity": "sha512-zZAyOfN8TU67ngqrxhOgtkSAGV9jSpN1snbl8elPtnh9Z5A11daR405+dhLzLnuXrwX0WCShWlybxPN3QC/9Pg==" + "version": "5.63.0", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.63.0.tgz", + "integrity": "sha512-KlLWRPggDg2rBD1Mx7/EqEhaBdy+ybBCVh/efgjBDsPpMeEu6MbTAJzIT4TuCzvmbTEgvKOGzVT6wdBTNusqrg==" }, "node_modules/collection-visit": { "version": "1.0.0", @@ -11843,9 +11843,9 @@ } }, "codemirror": { - "version": "5.62.3", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.62.3.tgz", - "integrity": "sha512-zZAyOfN8TU67ngqrxhOgtkSAGV9jSpN1snbl8elPtnh9Z5A11daR405+dhLzLnuXrwX0WCShWlybxPN3QC/9Pg==" + "version": "5.63.0", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.63.0.tgz", + "integrity": "sha512-KlLWRPggDg2rBD1Mx7/EqEhaBdy+ybBCVh/efgjBDsPpMeEu6MbTAJzIT4TuCzvmbTEgvKOGzVT6wdBTNusqrg==" }, "collection-visit": { "version": "1.0.0", diff --git a/package.json b/package.json index 5c3f9e803..29c6964fc 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "@babel/preset-react": "^7.14.5", "body-parser": "^1.19.0", "classnames": "^2.3.1", - "codemirror": "^5.62.3", + "codemirror": "^5.63.0", "cookie-parser": "^1.4.5", "create-react-class": "^15.7.0", "dedent-tabs": "^0.10.1",
  • - Google Drive Integration!
    - We have added Google Drive integration to the Homebrewery!
    Sign in with - your Google account to link it with your Homebrewery profile. A new button in the Edit page will let you transfer your file to your personal - Google Drive storage, and Google will keep a backup of each version! No more lost work surprises! + V3.0.0 Released!
    + After a long and bumpy road, we decided it was high time we finally release version 3 of the homebrewery into the wild. You can check out a + brief overview and see how to opt-in to the new features here:   +
    V3 Welcome Page   + and the Changelog.

    - However, we are aware that there may be uncaught bugs. We encourage you to copy your brew into a text document before transferring to Google - Drive just in case any issues arise as this update is rolled out. + BE WARNED: As we continue to develop V3, expect small tweaks in the styling, fonts, and snippets; your brews may look slightly + different from day-to-day. All of your old documents will continue to work as normal; we are not touching them. If you don't want to deal + with the possibility of slight formatting changes, you may choose to stick with the Legacy renderer on any of your brews for as long as you like.

    - Note: Transferring an existing brew to Google Drive will change the edit and share links of your document. If you have shared your - document online, remember to update the links there as well. + With this in mind, if you still wish to try out V3, you can opt-in any of your brews to the the V3 renderer. + This will likely break much of your formatting as a lot of the Markdown code has been updated, and starting from scratch may be cleaner. + (Don't worry, you can always change the renderer back to legacy for any brew at any time). +