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 01/31] 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 02/31] 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 8bda68d6846de267a9f6b8dc661d9cbd8ad7c513 Mon Sep 17 00:00:00 2001
From: Gazook89 <58999374+Gazook89@users.noreply.github.com>
Date: Tue, 10 Aug 2021 08:31:08 -0500
Subject: [PATCH 03/31] Add 1/3 ClassTable, Unframed classes
- Adds a snippet for 1/3 Spellcasting/ClassTables for Issue #191 and builds on PR #1079 to work with v3 (but leaves out Legacy).
- Refactored classTable gen to more closely match monster block gen in terms of element classes (passed to gen function via attributes rather than baked into `return` function)
- Added an "unframed" snippet for each Full, Half, and Third class tables, which is consistent with monster stat blocks, and also is needed to satisfy #191 / #1079.
---
.../snippetbar/snippets/classtable.gen.js | 48 +++++++++++++++++--
.../editor/snippetbar/snippets/snippets.js | 26 ++++++++--
2 files changed, 67 insertions(+), 7 deletions(-)
diff --git a/client/homebrew/editor/snippetbar/snippets/classtable.gen.js b/client/homebrew/editor/snippetbar/snippets/classtable.gen.js
index c8a2d051f..ec5b4433a 100644
--- a/client/homebrew/editor/snippetbar/snippets/classtable.gen.js
+++ b/client/homebrew/editor/snippetbar/snippets/classtable.gen.js
@@ -51,7 +51,7 @@ const getFeature = (level)=>{
};
module.exports = {
- full : function(){
+ full : function(classes){
const classname = _.sample(classnames);
const maxes = [4, 3, 3, 3, 3, 2, 2, 1, 1];
@@ -70,7 +70,7 @@ module.exports = {
let cantrips = 3;
let spells = 1;
let slots = 2;
- return `{{classTable,wide\n##### The ${classname}\n` +
+ return `{{${classes}\n##### The ${classname}\n` +
`| Level | Proficiency | Features | Cantrips | Spells | --- Spell Slots Per Level --- |||||||||\n`+
`| ^| Bonus ^| ^| Known ^| Known ^| 1st | 2nd | 3rd | 4th | 5th | 6th | 7th | 8th | 9th |\n`+
`|:-----:|:-----------:|:---------|:--------:|:------:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|\n${
@@ -92,11 +92,11 @@ module.exports = {
}).join('\n')}\n}}\n\n`;
},
- half : function(){
+ half : function(classes){
const classname = _.sample(classnames);
let featureScore = 1;
- return `
\n##### The ${classname}\n` +
+ return `{{${classes}\n##### The ${classname}\n` +
`| Level | Proficiency Bonus | Features | ${_.sample(features)}|\n` +
`|:---:|:---:|:---|:---:|\n${
_.map(levels, function(levelName, level){
@@ -111,5 +111,45 @@ module.exports = {
return `| ${res} |`;
}).join('\n')}\n
\n\n`;
+ },
+
+ third : function(classes){
+ const classname = _.sample(classnames);
+
+ const maxes = [4, 3, 3, 3, 3, 2, 2, 1, 1];
+ const drawSlots = function(Slots){
+ let slots = Number(Slots);
+ return _.times(4, function(i){
+ const max = maxes[i];
+ if(slots < 1) return '—';
+ const res = _.min([max, slots]);
+ slots -= res;
+ return res;
+ }).join(' | ');
+ };
+
+
+ let cantrips = 3;
+ let spells = 1;
+ let slots = 2;
+ return `{{${classes}\n##### ${classname} Spellcasting\n` +
+ `| Class | Cantrips | Spells | --- Spells Slots per Spell Level --- ||||\n` +
+ `| Level ^| Known ^| Known ^| 1st | 2nd | 3rd | 4th |\n` +
+ `|:---:|:---:|:---:|:---:|:---:|:---:|:---:|\n${
+ _.map(levels, function(levelName, level){
+ const res = [
+ levelName,
+ cantrips,
+ spells,
+ drawSlots(slots)
+ ].join(' | ');
+
+ cantrips += _.random(0, 1);
+ spells += _.random(0, 1);
+ slots += _.random(0, 2);
+
+ return `| ${res} |`;
+ }).join('\n')}\n}}\n\n`;
}
+
};
diff --git a/client/homebrew/editor/snippetbar/snippets/snippets.js b/client/homebrew/editor/snippetbar/snippets/snippets.js
index b30a96e7c..10cb9cf4e 100644
--- a/client/homebrew/editor/snippetbar/snippets/snippets.js
+++ b/client/homebrew/editor/snippetbar/snippets/snippets.js
@@ -212,12 +212,32 @@ module.exports = [
{
name : 'Class Table',
icon : 'fas fa-table',
- gen : ClassTableGen.full,
+ gen : ClassTableGen.full('classTable,frame,wide'),
},
{
- name : 'Half Class Table',
+ name : 'Class Table (unframed)',
+ icon : 'fas fa-table',
+ gen : ClassTableGen.full('classTable,wide'),
+ },
+ {
+ name : '1/2 Class Table',
icon : 'fas fa-list-alt',
- gen : ClassTableGen.half,
+ gen : ClassTableGen.half('classTable,frame'),
+ },
+ {
+ name : '1/2 Class Table (unframed)',
+ icon : 'fas fa-list-alt',
+ gen : ClassTableGen.half('classTable'),
+ },
+ {
+ name : '1/3 Class Table',
+ icon : 'fas fa-list-alt',
+ gen : ClassTableGen.third('classTable,frame'),
+ },
+ {
+ name : '1/3 Class Table (unframed)',
+ icon : 'fas fa-list-alt',
+ gen : ClassTableGen.third('classTable'),
},
{
name : 'Table',
From 927cc2e9b557195a2774c6f179b23cb84dcb98b7 Mon Sep 17 00:00:00 2001
From: Gazook89 <58999374+Gazook89@users.noreply.github.com>
Date: Tue, 10 Aug 2021 08:33:05 -0500
Subject: [PATCH 04/31] Fix "Spell Slots per Spell Level"
Update current "--- Spells Slots per Level ---" to more accurate "--- Spells Slots per Spell Level ---" to match source material.
---
client/homebrew/editor/snippetbar/snippets/classtable.gen.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/client/homebrew/editor/snippetbar/snippets/classtable.gen.js b/client/homebrew/editor/snippetbar/snippets/classtable.gen.js
index ec5b4433a..39d033108 100644
--- a/client/homebrew/editor/snippetbar/snippets/classtable.gen.js
+++ b/client/homebrew/editor/snippetbar/snippets/classtable.gen.js
@@ -71,7 +71,7 @@ module.exports = {
let spells = 1;
let slots = 2;
return `{{${classes}\n##### The ${classname}\n` +
- `| Level | Proficiency | Features | Cantrips | Spells | --- Spell Slots Per Level --- |||||||||\n`+
+ `| Level | Proficiency | Features | Cantrips | Spells | --- Spell Slots Per Spell Level --- |||||||||\n`+
`| ^| Bonus ^| ^| Known ^| Known ^| 1st | 2nd | 3rd | 4th | 5th | 6th | 7th | 8th | 9th |\n`+
`|:-----:|:-----------:|:---------|:--------:|:------:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|\n${
_.map(levels, function(levelName, level){
From 9f519b469d349a65d061fd5b262e4d189949e5ae Mon Sep 17 00:00:00 2001
From: Gazook89 <58999374+Gazook89@users.noreply.github.com>
Date: Tue, 10 Aug 2021 08:44:25 -0500
Subject: [PATCH 05/31] Change classTable Icons
---
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 10cb9cf4e..fce298b57 100644
--- a/client/homebrew/editor/snippetbar/snippets/snippets.js
+++ b/client/homebrew/editor/snippetbar/snippets/snippets.js
@@ -216,7 +216,7 @@ module.exports = [
},
{
name : 'Class Table (unframed)',
- icon : 'fas fa-table',
+ icon : 'fas fa-border-none',
gen : ClassTableGen.full('classTable,wide'),
},
{
@@ -226,17 +226,17 @@ module.exports = [
},
{
name : '1/2 Class Table (unframed)',
- icon : 'fas fa-list-alt',
+ icon : 'fas fa-border-none',
gen : ClassTableGen.half('classTable'),
},
{
name : '1/3 Class Table',
- icon : 'fas fa-list-alt',
+ icon : 'fas fa-border-all',
gen : ClassTableGen.third('classTable,frame'),
},
{
name : '1/3 Class Table (unframed)',
- icon : 'fas fa-list-alt',
+ icon : 'fas fa-border-none',
gen : ClassTableGen.third('classTable'),
},
{
From 2a428100c52567aa4c39aae252f50f9f8ee78d93 Mon Sep 17 00:00:00 2001
From: Gazook89 <58999374+Gazook89@users.noreply.github.com>
Date: Tue, 10 Aug 2021 09:11:14 -0500
Subject: [PATCH 06/31] fix some indentation issues for circleCI
---
.../snippetbar/snippets/classtable.gen.js | 60 +++++++++----------
1 file changed, 30 insertions(+), 30 deletions(-)
diff --git a/client/homebrew/editor/snippetbar/snippets/classtable.gen.js b/client/homebrew/editor/snippetbar/snippets/classtable.gen.js
index 39d033108..5d631cb48 100644
--- a/client/homebrew/editor/snippetbar/snippets/classtable.gen.js
+++ b/client/homebrew/editor/snippetbar/snippets/classtable.gen.js
@@ -116,40 +116,40 @@ module.exports = {
third : function(classes){
const classname = _.sample(classnames);
- const maxes = [4, 3, 3, 3, 3, 2, 2, 1, 1];
- const drawSlots = function(Slots){
- let slots = Number(Slots);
- return _.times(4, function(i){
- const max = maxes[i];
- if(slots < 1) return '—';
- const res = _.min([max, slots]);
- slots -= res;
- return res;
- }).join(' | ');
- };
+ const maxes = [4, 3, 3, 3, 3, 2, 2, 1, 1];
+ const drawSlots = function(Slots){
+ let slots = Number(Slots);
+ return _.times(4, function(i){
+ const max = maxes[i];
+ if(slots < 1) return '—';
+ const res = _.min([max, slots]);
+ slots -= res;
+ return res;
+ }).join(' | ');
+ };
- let cantrips = 3;
- let spells = 1;
- let slots = 2;
- return `{{${classes}\n##### ${classname} Spellcasting\n` +
- `| Class | Cantrips | Spells | --- Spells Slots per Spell Level --- ||||\n` +
- `| Level ^| Known ^| Known ^| 1st | 2nd | 3rd | 4th |\n` +
- `|:---:|:---:|:---:|:---:|:---:|:---:|:---:|\n${
- _.map(levels, function(levelName, level){
- const res = [
- levelName,
- cantrips,
- spells,
- drawSlots(slots)
- ].join(' | ');
+ let cantrips = 3;
+ let spells = 1;
+ let slots = 2;
+ return `{{${classes}\n##### ${classname} Spellcasting\n` +
+ `| Class | Cantrips | Spells | --- Spells Slots per Spell Level --- ||||\n` +
+ `| Level ^| Known ^| Known ^| 1st | 2nd | 3rd | 4th |\n` +
+ `|:---:|:---:|:---:|:---:|:---:|:---:|:---:|\n${
+ _.map(levels, function(levelName, level){
+ const res = [
+ levelName,
+ cantrips,
+ spells,
+ drawSlots(slots)
+ ].join(' | ');
- cantrips += _.random(0, 1);
- spells += _.random(0, 1);
- slots += _.random(0, 2);
+ cantrips += _.random(0, 1);
+ spells += _.random(0, 1);
+ slots += _.random(0, 2);
- return `| ${res} |`;
- }).join('\n')}\n}}\n\n`;
+ return `| ${res} |`;
+ }).join('\n')}\n}}\n\n`;
}
};
From c9e1d7ba5c27d8f5510cb198a74573c5efd71dea Mon Sep 17 00:00:00 2001
From: Gazook89 <58999374+Gazook89@users.noreply.github.com>
Date: Tue, 10 Aug 2021 16:35:21 -0500
Subject: [PATCH 07/31] Fixed closing curly brackets on half class table
---
client/homebrew/editor/snippetbar/snippets/classtable.gen.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/client/homebrew/editor/snippetbar/snippets/classtable.gen.js b/client/homebrew/editor/snippetbar/snippets/classtable.gen.js
index 5d631cb48..1b1beb66a 100644
--- a/client/homebrew/editor/snippetbar/snippets/classtable.gen.js
+++ b/client/homebrew/editor/snippetbar/snippets/classtable.gen.js
@@ -110,7 +110,7 @@ module.exports = {
featureScore += _.random(0, 1);
return `| ${res} |`;
- }).join('\n')}\n\n\n`;
+ }).join('\n')}\n}}\n\n`;
},
third : function(classes){
From 4b001d98902e2933e5c0addd3fa76da152a2ed39 Mon Sep 17 00:00:00 2001
From: Gazook89 <58999374+Gazook89@users.noreply.github.com>
Date: Tue, 10 Aug 2021 20:22:36 -0500
Subject: [PATCH 08/31] Move Image Snippets to New Menu
Separating image related snippets to a new drop down snippet menu.
---
.../editor/snippetbar/snippets/snippets.js | 31 ++++++++++++-------
1 file changed, 19 insertions(+), 12 deletions(-)
diff --git a/client/homebrew/editor/snippetbar/snippets/snippets.js b/client/homebrew/editor/snippetbar/snippets/snippets.js
index b30a96e7c..2a08d2d4f 100644
--- a/client/homebrew/editor/snippetbar/snippets/snippets.js
+++ b/client/homebrew/editor/snippetbar/snippets/snippets.js
@@ -47,18 +47,6 @@ module.exports = [
}}
\n`
},
- {
- name : 'Image',
- icon : 'fas fa-image',
- gen : dedent`
-  {width:325px}
- Credit: Kyounghwan Kim`
- },
- {
- name : 'Background Image',
- icon : 'fas fa-tree',
- gen : ` {position:absolute,top:50px,right:30px,width:280px}`
- },
{
name : 'QR Code',
icon : 'fas fa-qrcode',
@@ -123,6 +111,25 @@ module.exports = [
]
},
+ /*********************** IMAGES *******************/
+ {
+ groupName : 'Images',
+ icon : 'fas fa-book',
+ snippets : [
+ {
+ name : 'Image',
+ icon : 'fas fa-image',
+ gen : dedent`
+  {width:325px}
+ Credit: Kyounghwan Kim`
+ },
+ {
+ name : 'Background Image',
+ icon : 'fas fa-tree',
+ gen : ` {position:absolute,top:50px,right:30px,width:280px}`
+ },
+ },
+
/************************* PHB ********************/
From 21058331cfd456a1db4b3739ed51b5133b3d436e Mon Sep 17 00:00:00 2001
From: Gazook89 <58999374+Gazook89@users.noreply.github.com>
Date: Tue, 10 Aug 2021 20:24:43 -0500
Subject: [PATCH 09/31] Add Class Table Circle Decoration Snippet
Adding a background image snippet that includes the fancy circular decoration found behind class tables in the source material.
*Could arguably replace the normal "Background Image" snippet and hit two bases with one stone*
---
client/homebrew/editor/snippetbar/snippets/snippets.js | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/client/homebrew/editor/snippetbar/snippets/snippets.js b/client/homebrew/editor/snippetbar/snippets/snippets.js
index 2a08d2d4f..b3be55914 100644
--- a/client/homebrew/editor/snippetbar/snippets/snippets.js
+++ b/client/homebrew/editor/snippetbar/snippets/snippets.js
@@ -128,6 +128,13 @@ module.exports = [
icon : 'fas fa-tree',
gen : ` {position:absolute,top:50px,right:30px,width:280px}`
},
+ {
+ name : 'Class Table Decoration',
+ icon : 'fas fa-award',
+ gen : dedent`\n
+  {position:absolute,top:0px,right:0px,width:380px}`
+ },
+ ]
},
From 51116efba7aa9c911177e3cc86809b7f2378fbd3 Mon Sep 17 00:00:00 2001
From: Gazook89 <58999374+Gazook89@users.noreply.github.com>
Date: Tue, 10 Aug 2021 20:56:28 -0500
Subject: [PATCH 10/31] Add Blended Watercolor Background Image
Add a snippet to create a nice watercolor background for use behind other images. Includes injection syntax which includes absolute position, hue-rotate, mix-blend-mode, and opacity.
Chooses an image randomly from an Imgur album. All images created by me (and open to creating more/making adjustments).
v3 only.
Could be improved by cycling through images rather than choosing randomly.
---
.../editor/snippetbar/snippets/snippets.js | 9 +++++++--
.../snippetbar/snippets/watercolor.gen.js | 20 +++++++++++++++++++
2 files changed, 27 insertions(+), 2 deletions(-)
create mode 100644 client/homebrew/editor/snippetbar/snippets/watercolor.gen.js
diff --git a/client/homebrew/editor/snippetbar/snippets/snippets.js b/client/homebrew/editor/snippetbar/snippets/snippets.js
index b3be55914..7aa2c2208 100644
--- a/client/homebrew/editor/snippetbar/snippets/snippets.js
+++ b/client/homebrew/editor/snippetbar/snippets/snippets.js
@@ -7,6 +7,7 @@ const ClassFeatureGen = require('./classfeature.gen.js');
const CoverPageGen = require('./coverpage.gen.js');
const TableOfContentsGen = require('./tableOfContents.gen.js');
const dedent = require('dedent-tabs').default;
+const watercolorGen = require('./watercolor.gen.js');
module.exports = [
@@ -131,8 +132,12 @@ module.exports = [
{
name : 'Class Table Decoration',
icon : 'fas fa-award',
- gen : dedent`\n
-  {position:absolute,top:0px,right:0px,width:380px}`
+ gen : `\n {position:absolute,top:0px,right:0px,width:380px}`
+ },
+ {
+ name : 'Watercolor Splatter',
+ icon : 'fas fa-fill-drip',
+ gen : watercolorGen,
},
]
},
diff --git a/client/homebrew/editor/snippetbar/snippets/watercolor.gen.js b/client/homebrew/editor/snippetbar/snippets/watercolor.gen.js
new file mode 100644
index 000000000..17be660f8
--- /dev/null
+++ b/client/homebrew/editor/snippetbar/snippets/watercolor.gen.js
@@ -0,0 +1,20 @@
+const _ = require('lodash');
+
+const watercolorBG = [
+ 'https://i.imgur.com/UPUX4zG.png',
+ 'https://i.imgur.com/Q6Uquv9.png',
+ 'https://i.imgur.com/UOtaJpJ.png',
+ 'https://i.imgur.com/Wy2DVk3.png',
+ 'https://i.imgur.com/IempVlg.png',
+ 'https://i.imgur.com/iJ1ddgd.png',
+ 'https://i.imgur.com/qg4an04.png',
+ 'https://i.imgur.com/ogGTcCh.png',
+ 'https://i.imgur.com/itBD19A.png',
+ 'https://i.imgur.com/tbbycAt.png',
+ 'https://i.imgur.com/1SVWpGR.png',
+ 'https://i.imgur.com/wC1zkuJ.png'
+];
+
+module.exports = ()=>{
+ return `\n}) {watercolor,position:absolute,top:0px,left:0px,width:240px,filter:hue-rotate(0deg),mix-blend-mode:multiply,opacity:80%}\n`
+};
\ No newline at end of file
From cefa3147fcf4b888ecaad362e8c1b10f15b00ba9 Mon Sep 17 00:00:00 2001
From: Gazook89 <58999374+Gazook89@users.noreply.github.com>
Date: Tue, 10 Aug 2021 21:16:12 -0500
Subject: [PATCH 11/31] Fixes for CircleCI
---
client/homebrew/editor/snippetbar/snippets/watercolor.gen.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/client/homebrew/editor/snippetbar/snippets/watercolor.gen.js b/client/homebrew/editor/snippetbar/snippets/watercolor.gen.js
index 17be660f8..40b5da973 100644
--- a/client/homebrew/editor/snippetbar/snippets/watercolor.gen.js
+++ b/client/homebrew/editor/snippetbar/snippets/watercolor.gen.js
@@ -6,7 +6,7 @@ const watercolorBG = [
'https://i.imgur.com/UOtaJpJ.png',
'https://i.imgur.com/Wy2DVk3.png',
'https://i.imgur.com/IempVlg.png',
- 'https://i.imgur.com/iJ1ddgd.png',
+ 'https://i.imgur.com/iJ1ddgd.png',
'https://i.imgur.com/qg4an04.png',
'https://i.imgur.com/ogGTcCh.png',
'https://i.imgur.com/itBD19A.png',
@@ -16,5 +16,5 @@ const watercolorBG = [
];
module.exports = ()=>{
- return `\n}) {watercolor,position:absolute,top:0px,left:0px,width:240px,filter:hue-rotate(0deg),mix-blend-mode:multiply,opacity:80%}\n`
+ return `\n}) {watercolor,position:absolute,top:0px,left:0px,width:240px,filter:hue-rotate(0deg),mix-blend-mode:multiply,opacity:80%}\n`;
};
\ No newline at end of file
From bd368c4c645f6484dab163190951b995ff0a7aa8 Mon Sep 17 00:00:00 2001
From: Gazook89 <58999374+Gazook89@users.noreply.github.com>
Date: Mon, 16 Aug 2021 13:34:31 -0500
Subject: [PATCH 12/31] add 'view' property
[minor fix] fix missing apostrophe
---
client/homebrew/editor/snippetbar/snippets/snippets.js | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/client/homebrew/editor/snippetbar/snippets/snippets.js b/client/homebrew/editor/snippetbar/snippets/snippets.js
index bce78af76..064d087f4 100644
--- a/client/homebrew/editor/snippetbar/snippets/snippets.js
+++ b/client/homebrew/editor/snippetbar/snippets/snippets.js
@@ -115,7 +115,8 @@ module.exports = [
/*********************** IMAGES *******************/
{
groupName : 'Images',
- icon : 'fas fa-book',
+ icon : 'fas fa-images',
+ view : 'text',
snippets : [
{
name : 'Image',
From ff3320c8dc2f9ed493d843fa59813047c6717d8d Mon Sep 17 00:00:00 2001
From: Gazook89 <58999374+Gazook89@users.noreply.github.com>
Date: Tue, 17 Aug 2021 15:49:16 -0500
Subject: [PATCH 13/31] reveal v3
---
config/default.json | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/config/default.json b/config/default.json
index daf77e82e..f74ce3b8e 100644
--- a/config/default.json
+++ b/config/default.json
@@ -2,5 +2,6 @@
"host" : "homebrewery.local.naturalcrit.com:8000",
"naturalcrit_url" : "local.naturalcrit.com:8010",
"secret" : "secret",
- "web_port" : 8000
+ "web_port" : 8000,
+ "enable_v3" : true
}
From bc7911b0bcea5aea11eb2754c5c0927b520f5469 Mon Sep 17 00:00:00 2001
From: Gazook89 <58999374+Gazook89@users.noreply.github.com>
Date: Tue, 17 Aug 2021 16:04:59 -0500
Subject: [PATCH 14/31] Add Watermark snippet
---
.../editor/snippetbar/snippets/snippets.js | 6 +++++
themes/5ePhb.style.less | 26 ++++++++++++++++++-
2 files changed, 31 insertions(+), 1 deletion(-)
diff --git a/client/homebrew/editor/snippetbar/snippets/snippets.js b/client/homebrew/editor/snippetbar/snippets/snippets.js
index 064d087f4..4aa706316 100644
--- a/client/homebrew/editor/snippetbar/snippets/snippets.js
+++ b/client/homebrew/editor/snippetbar/snippets/snippets.js
@@ -150,6 +150,12 @@ module.exports = [
icon : 'fas fa-fill-drip',
gen : watercolorGen,
},
+ {
+ name : 'Watermark',
+ icon : 'fas fa-id-card',
+ gen : dedent`
+ {{watermark Homebrewery}}\n`
+ },
]
},
diff --git a/themes/5ePhb.style.less b/themes/5ePhb.style.less
index 955a4639a..2e3ef96c1 100644
--- a/themes/5ePhb.style.less
+++ b/themes/5ePhb.style.less
@@ -265,8 +265,10 @@ body {
}
}
//*****************************
- // * ARTIST CREDIT BLOCK
+ // * Images Snippets
// *****************************/
+
+ /* Arist Credit */
.artist {
position : absolute;
text-align : center;
@@ -291,6 +293,28 @@ body {
}
}
+ /* Watermark */
+ .watermark {
+ display : grid !important;
+ place-items : center;
+ justify-content : center;
+ position : absolute;
+ top : 0;
+ left : 0;
+ width : 100%;
+ height : 100%;
+ font-size : 120px;
+ text-transform : uppercase;
+ color : black;
+ mix-blend-mode : overlay;
+ opacity : 30%;
+ transform : rotate(-45deg);
+ z-index : 500;
+ p {
+ margin-bottom : none;
+ }
+ }
+
//*****************************
// * MONSTER STAT BLOCK
// *****************************/
From 50a8468995c0487ce6397119052ee71ec33b6039 Mon Sep 17 00:00:00 2001
From: Gazook89 <58999374+Gazook89@users.noreply.github.com>
Date: Thu, 26 Aug 2021 12:00:56 -0500
Subject: [PATCH 15/31] Update legacy and v3 styles
- removed wrap from legacy
- add :not([rowspan]) qualifier to wrap on v3.
---
themes/5ePhb.style.less | 2 +-
themes/5ePhbLegacy.style.less | 3 ---
2 files changed, 1 insertion(+), 4 deletions(-)
diff --git a/themes/5ePhb.style.less b/themes/5ePhb.style.less
index ff0b2f189..8179ea97f 100644
--- a/themes/5ePhb.style.less
+++ b/themes/5ePhb.style.less
@@ -542,7 +542,7 @@ body {
// * CLASS TABLE
// *****************************/
.page .classTable{
- th[colspan] {
+ th[colspan]:not([rowspan]) {
white-space : nowrap;
}
&.frame {
diff --git a/themes/5ePhbLegacy.style.less b/themes/5ePhbLegacy.style.less
index 65fff2ba0..d814d4036 100644
--- a/themes/5ePhbLegacy.style.less
+++ b/themes/5ePhbLegacy.style.less
@@ -408,9 +408,6 @@ 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 dc65980dcb1acecb5c1f82ed8f9de13836c8e95a Mon Sep 17 00:00:00 2001
From: Gazook89 <58999374+Gazook89@users.noreply.github.com>
Date: Thu, 26 Aug 2021 12:51:36 -0500
Subject: [PATCH 16/31] pull drawSlots out of individual functions
---
.../snippetbar/snippets/classtable.gen.js | 44 +++++++------------
1 file changed, 16 insertions(+), 28 deletions(-)
diff --git a/client/homebrew/editor/snippetbar/snippets/classtable.gen.js b/client/homebrew/editor/snippetbar/snippets/classtable.gen.js
index 1b1beb66a..0c72ac898 100644
--- a/client/homebrew/editor/snippetbar/snippets/classtable.gen.js
+++ b/client/homebrew/editor/snippetbar/snippets/classtable.gen.js
@@ -50,22 +50,23 @@ const getFeature = (level)=>{
return res.join(', ');
};
+const maxes = [4, 3, 3, 3, 3, 2, 2, 1, 1];
+
+const drawSlots = function(Slots, rows){
+ let slots = Number(Slots);
+ return _.times(rows, function(i){
+ const max = maxes[i];
+ if(slots < 1) return '—';
+ const res = _.min([max, slots]);
+ slots -= res;
+ return res;
+ }).join(' | ');
+};
+
module.exports = {
full : function(classes){
const classname = _.sample(classnames);
- const maxes = [4, 3, 3, 3, 3, 2, 2, 1, 1];
- const drawSlots = function(Slots){
- let slots = Number(Slots);
- return _.times(9, function(i){
- const max = maxes[i];
- if(slots < 1) return '—';
- const res = _.min([max, slots]);
- slots -= res;
- return res;
- }).join(' | ');
- };
-
let cantrips = 3;
let spells = 1;
@@ -81,7 +82,7 @@ module.exports = {
getFeature(level),
cantrips,
spells,
- drawSlots(slots)
+ drawSlots(slots, 9)
].join(' | ');
cantrips += _.random(0, 1);
@@ -116,19 +117,6 @@ module.exports = {
third : function(classes){
const classname = _.sample(classnames);
- const maxes = [4, 3, 3, 3, 3, 2, 2, 1, 1];
- const drawSlots = function(Slots){
- let slots = Number(Slots);
- return _.times(4, function(i){
- const max = maxes[i];
- if(slots < 1) return '—';
- const res = _.min([max, slots]);
- slots -= res;
- return res;
- }).join(' | ');
- };
-
-
let cantrips = 3;
let spells = 1;
let slots = 2;
@@ -141,12 +129,12 @@ module.exports = {
levelName,
cantrips,
spells,
- drawSlots(slots)
+ drawSlots(slots, 4)
].join(' | ');
cantrips += _.random(0, 1);
spells += _.random(0, 1);
- slots += _.random(0, 2);
+ slots += _.random(0, 1);
return `| ${res} |`;
}).join('\n')}\n}}\n\n`;
From b4825e085e270ca176de0517636392ea262bddf9 Mon Sep 17 00:00:00 2001
From: Gazook89 <58999374+Gazook89@users.noreply.github.com>
Date: Fri, 27 Aug 2021 10:40:40 -0500
Subject: [PATCH 17/31] fix table snippet spacing in editor
---
.../snippetbar/snippets/classtable.gen.js | 50 +++++++++----------
1 file changed, 25 insertions(+), 25 deletions(-)
diff --git a/client/homebrew/editor/snippetbar/snippets/classtable.gen.js b/client/homebrew/editor/snippetbar/snippets/classtable.gen.js
index 0c72ac898..0055adf65 100644
--- a/client/homebrew/editor/snippetbar/snippets/classtable.gen.js
+++ b/client/homebrew/editor/snippetbar/snippets/classtable.gen.js
@@ -52,14 +52,14 @@ const getFeature = (level)=>{
const maxes = [4, 3, 3, 3, 3, 2, 2, 1, 1];
-const drawSlots = function(Slots, rows){
+const drawSlots = function(Slots, rows, padding){
let slots = Number(Slots);
return _.times(rows, function(i){
const max = maxes[i];
- if(slots < 1) return '—';
+ if(slots < 1) return _.pad('—', padding);
const res = _.min([max, slots]);
slots -= res;
- return res;
+ return _.pad(res.toString(), padding);
}).join(' | ');
};
@@ -72,17 +72,17 @@ module.exports = {
let spells = 1;
let slots = 2;
return `{{${classes}\n##### The ${classname}\n` +
- `| Level | Proficiency | Features | Cantrips | Spells | --- Spell Slots Per Spell Level --- |||||||||\n`+
- `| ^| Bonus ^| ^| Known ^| Known ^| 1st | 2nd | 3rd | 4th | 5th | 6th | 7th | 8th | 9th |\n`+
- `|:-----:|:-----------:|:---------|:--------:|:------:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|\n${
+ `| Level | Proficiency | Features | Cantrips | Spells | --- Spell Slots Per Spell Level --- |||||||||\n`+
+ `| ^| Bonus ^| ^| Known ^| Known ^| 1st | 2nd | 3rd | 4th | 5th | 6th | 7th | 8th | 9th |\n`+
+ `|:-----:|:-----------:|:--------------------------------------------------------|:--------:|:------:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|\n${
_.map(levels, function(levelName, level){
const res = [
- levelName,
- `+${profBonus[level]}`,
- getFeature(level),
- cantrips,
- spells,
- drawSlots(slots, 9)
+ _.pad(levelName, 5),
+ _.pad(`+${profBonus[level]}`, 11),
+ _.padEnd(getFeature(level), 55),
+ _.pad(cantrips.toString(), 8),
+ _.pad(spells.toString(), 6),
+ drawSlots(slots, 9, 3),
].join(' | ');
cantrips += _.random(0, 1);
@@ -98,14 +98,14 @@ module.exports = {
let featureScore = 1;
return `{{${classes}\n##### The ${classname}\n` +
- `| Level | Proficiency Bonus | Features | ${_.sample(features)}|\n` +
- `|:---:|:---:|:---|:---:|\n${
+ `| Level | Proficiency Bonus | Features | ${_.pad(_.sample(features), 26)} |\n` +
+ `|:-----:|:-----------------:|:--------------------------------------------------------|:--------------------------:|\n${
_.map(levels, function(levelName, level){
const res = [
- levelName,
- `+${profBonus[level]}`,
- getFeature(level),
- `+${featureScore}`
+ _.pad(levelName, 5),
+ _.pad(`+${profBonus[level]}`, 17),
+ _.padEnd(getFeature(level), 55),
+ _.pad(`+${featureScore}`, 26),
].join(' | ');
featureScore += _.random(0, 1);
@@ -121,15 +121,15 @@ module.exports = {
let spells = 1;
let slots = 2;
return `{{${classes}\n##### ${classname} Spellcasting\n` +
- `| Class | Cantrips | Spells | --- Spells Slots per Spell Level --- ||||\n` +
- `| Level ^| Known ^| Known ^| 1st | 2nd | 3rd | 4th |\n` +
- `|:---:|:---:|:---:|:---:|:---:|:---:|:---:|\n${
+ `| Class | Cantrips | Spells | --- Spells Slots per Spell Level --- ||||\n` +
+ `| Level ^| Known ^| Known ^| 1st | 2nd | 3rd | 4th |\n` +
+ `|:------:|:--------:|:-------:|:--------:|:--------:|:--------:|:--------:|\n${
_.map(levels, function(levelName, level){
const res = [
- levelName,
- cantrips,
- spells,
- drawSlots(slots, 4)
+ _.pad(levelName, 6),
+ _.pad(cantrips.toString(), 8),
+ _.pad(spells.toString(), 7),
+ drawSlots(slots, 4, 8),
].join(' | ');
cantrips += _.random(0, 1);
From 9d5130154be7c2d65de18524611e51881ff7a89b Mon Sep 17 00:00:00 2001
From: Trevor Buckner
Date: Fri, 27 Aug 2021 12:29:11 -0400
Subject: [PATCH 18/31] Remixed Feature names to be shorter.
---
.../snippetbar/snippets/classtable.gen.js | 46 +++++++++----------
1 file changed, 22 insertions(+), 24 deletions(-)
diff --git a/client/homebrew/editor/snippetbar/snippets/classtable.gen.js b/client/homebrew/editor/snippetbar/snippets/classtable.gen.js
index 0055adf65..789d15b68 100644
--- a/client/homebrew/editor/snippetbar/snippets/classtable.gen.js
+++ b/client/homebrew/editor/snippetbar/snippets/classtable.gen.js
@@ -4,33 +4,31 @@ const features = [
'Astrological Botany',
'Astrological Chemistry',
'Biochemical Sorcery',
- 'Civil Alchemy',
- 'Consecrated Biochemistry',
+ 'Civil Divination',
+ 'Consecrated Augury',
'Demonic Anthropology',
'Divinatory Mineralogy',
- 'Genetic Banishing',
- 'Hermetic Geography',
- 'Immunological Incantations',
- 'Nuclear Illusionism',
- 'Ritual Astronomy',
- 'Seismological Divination',
- 'Spiritual Biochemistry',
- 'Statistical Occultism',
- 'Police Necromancer',
- 'Sixgun Poisoner',
- 'Pharmaceutical Gunslinger',
- 'Infernal Banker',
- 'Spell Analyst',
- 'Gunslinger Corruptor',
- 'Torque Interfacer',
'Exo Interfacer',
+ 'Genetic Banishing',
'Gunpowder Torturer',
- 'Orbital Gravedigger',
- 'Phased Linguist',
- 'Mathematical Pharmacist',
- 'Plasma Outlaw',
+ 'Gunslinger Corruptor',
+ 'Hermetic Geography',
+ 'Immunological Cultist',
'Malefic Chemist',
- 'Police Cultist'
+ 'Mathematical Pharmacy',
+ 'Nuclear Biochemistry',
+ 'Orbital Gravedigger',
+ 'Pharmaceutical Outlaw',
+ 'Phased Linguist',
+ 'Plasma Gunslinger',
+ 'Police Necromancer',
+ 'Ritual Astronomy',
+ 'Sixgun Poisoner',
+ 'Seismological Alchemy',
+ 'Spiritual Illusionism',
+ 'Statistical Occultism',
+ 'Spell Analyst',
+ 'Torque Interfacer'
];
const classnames = ['Archivist', 'Fancyman', 'Linguist', 'Fletcher',
@@ -79,7 +77,7 @@ module.exports = {
const res = [
_.pad(levelName, 5),
_.pad(`+${profBonus[level]}`, 11),
- _.padEnd(getFeature(level), 55),
+ _.padEnd(getFeature(level), 48),
_.pad(cantrips.toString(), 8),
_.pad(spells.toString(), 6),
drawSlots(slots, 9, 3),
@@ -104,7 +102,7 @@ module.exports = {
const res = [
_.pad(levelName, 5),
_.pad(`+${profBonus[level]}`, 17),
- _.padEnd(getFeature(level), 55),
+ _.padEnd(getFeature(level), 48),
_.pad(`+${featureScore}`, 26),
].join(' | ');
From e5cfa98bbde35cb3fb0c574785dcf38e2a9d9a44 Mon Sep 17 00:00:00 2001
From: Trevor Buckner
Date: Fri, 27 Aug 2021 12:30:57 -0400
Subject: [PATCH 19/31] Shorten Features column to match shorter names
---
.../editor/snippetbar/snippets/classtable.gen.js | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)
diff --git a/client/homebrew/editor/snippetbar/snippets/classtable.gen.js b/client/homebrew/editor/snippetbar/snippets/classtable.gen.js
index 789d15b68..40c133b7a 100644
--- a/client/homebrew/editor/snippetbar/snippets/classtable.gen.js
+++ b/client/homebrew/editor/snippetbar/snippets/classtable.gen.js
@@ -70,9 +70,9 @@ module.exports = {
let spells = 1;
let slots = 2;
return `{{${classes}\n##### The ${classname}\n` +
- `| Level | Proficiency | Features | Cantrips | Spells | --- Spell Slots Per Spell Level --- |||||||||\n`+
- `| ^| Bonus ^| ^| Known ^| Known ^| 1st | 2nd | 3rd | 4th | 5th | 6th | 7th | 8th | 9th |\n`+
- `|:-----:|:-----------:|:--------------------------------------------------------|:--------:|:------:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|\n${
+ `| Level | Proficiency | Features | Cantrips | Spells | --- Spell Slots Per Spell Level --- |||||||||\n`+
+ `| ^| Bonus ^| ^| Known ^| Known ^| 1st | 2nd | 3rd | 4th | 5th | 6th | 7th | 8th | 9th |\n`+
+ `|:-----:|:-----------:|:-----------------------------------------------|:--------:|:------:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|\n${
_.map(levels, function(levelName, level){
const res = [
_.pad(levelName, 5),
@@ -96,8 +96,8 @@ module.exports = {
let featureScore = 1;
return `{{${classes}\n##### The ${classname}\n` +
- `| Level | Proficiency Bonus | Features | ${_.pad(_.sample(features), 26)} |\n` +
- `|:-----:|:-----------------:|:--------------------------------------------------------|:--------------------------:|\n${
+ `| Level | Proficiency Bonus | Features | ${_.pad(_.sample(features), 26)} |\n` +
+ `|:-----:|:-----------------:|:-----------------------------------------------|:--------------------------:|\n${
_.map(levels, function(levelName, level){
const res = [
_.pad(levelName, 5),
@@ -137,5 +137,4 @@ module.exports = {
return `| ${res} |`;
}).join('\n')}\n}}\n\n`;
}
-
};
From 1096c80b17c2562eece7d962b9b62232eb7b1481 Mon Sep 17 00:00:00 2001
From: Trevor Buckner
Date: Tue, 31 Aug 2021 13:50:45 -0400
Subject: [PATCH 20/31] Make Markdown extensions work with Marked.js 3
---
package-lock.json | 16 ++++++++--------
package.json | 2 +-
shared/naturalcrit/markdown.js | 28 ++++++++++++++--------------
3 files changed, 23 insertions(+), 23 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 9cb431541..5476b98d4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -27,7 +27,7 @@
"jwt-simple": "^0.5.6",
"less": "^3.13.1",
"lodash": "^4.17.21",
- "marked": "2.1.3",
+ "marked": "3.0.2",
"markedLegacy": "npm:marked@^0.3.19",
"moment": "^2.29.1",
"mongoose": "^5.13.7",
@@ -5974,14 +5974,14 @@
}
},
"node_modules/marked": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/marked/-/marked-2.1.3.tgz",
- "integrity": "sha512-/Q+7MGzaETqifOMWYEA7HVMaZb4XbcRfaOzcSsHZEith83KGlvaSG33u0SKu89Mj5h+T8V2hM+8O45Qc5XTgwA==",
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-3.0.2.tgz",
+ "integrity": "sha512-TMJQQ79Z0e3rJYazY0tIoMsFzteUGw9fB3FD+gzuIT3zLuG9L9ckIvUfF51apdJkcqc208jJN2KbtPbOvXtbjA==",
"bin": {
"marked": "bin/marked"
},
"engines": {
- "node": ">= 10"
+ "node": ">= 12"
}
},
"node_modules/markedLegacy": {
@@ -14059,9 +14059,9 @@
}
},
"marked": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/marked/-/marked-2.1.3.tgz",
- "integrity": "sha512-/Q+7MGzaETqifOMWYEA7HVMaZb4XbcRfaOzcSsHZEith83KGlvaSG33u0SKu89Mj5h+T8V2hM+8O45Qc5XTgwA=="
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-3.0.2.tgz",
+ "integrity": "sha512-TMJQQ79Z0e3rJYazY0tIoMsFzteUGw9fB3FD+gzuIT3zLuG9L9ckIvUfF51apdJkcqc208jJN2KbtPbOvXtbjA=="
},
"markedLegacy": {
"version": "npm:marked@0.3.19",
diff --git a/package.json b/package.json
index 2fa3e481e..2aafba0a8 100644
--- a/package.json
+++ b/package.json
@@ -58,7 +58,7 @@
"jwt-simple": "^0.5.6",
"less": "^3.13.1",
"lodash": "^4.17.21",
- "marked": "2.1.3",
+ "marked": "3.0.2",
"markedLegacy": "npm:marked@^0.3.19",
"moment": "^2.29.1",
"mongoose": "^5.13.7",
diff --git a/shared/naturalcrit/markdown.js b/shared/naturalcrit/markdown.js
index b37dedf81..8f01f0147 100644
--- a/shared/naturalcrit/markdown.js
+++ b/shared/naturalcrit/markdown.js
@@ -65,13 +65,13 @@ const mustacheSpans = {
raw : raw, // Text to consume from the source
text : text, // Additional custom properties
tags : tags,
- tokens : this.inlineTokens(text) // inlineTokens to process **bold**, *italics*, etc.
+ tokens : this.lexer.inlineTokens(text) // inlineTokens to process **bold**, *italics*, etc.
};
}
}
},
renderer(token) {
- return `${this.parser.parseInline(token.tokens)}`; // parseInline to turn child tokens into HTML
}
};
@@ -114,13 +114,13 @@ const mustacheDivs = {
raw : raw, // Text to consume from the source
text : text, // Additional custom properties
tags : tags,
- tokens : this.inline(this.blockTokens(text))
+ tokens : this.lexer.blockTokens(text)
};
}
}
},
renderer(token) {
- return `${this.parser.parse(token.tokens)}
`; // parseInline to turn child tokens into HTML
}
};
@@ -149,7 +149,7 @@ const mustacheInjectInline = {
},
renderer(token) {
token.type = token.originalType;
- const text = this.parseInline([token]);
+ const text = this.parser.parseInline([token]);
const openingTag = /(<[^\s<>]+)([^\n<>]*>.*)/s.exec(text);
if(openingTag) {
return `${openingTag[1]} class="${token.tags}${openingTag[2]}`;
@@ -182,7 +182,7 @@ const mustacheInjectBlock = {
},
renderer(token) {
token.type = token.originalType;
- const text = this.parse([token]);
+ const text = this.parser.parse([token]);
const openingTag = /(<[^\s<>]+)([^\n<>]*>.*)/s.exec(text);
if(openingTag) {
return `${openingTag[1]} class="${token.tags}${openingTag[2]}`;
@@ -211,8 +211,8 @@ const definitionLists = {
const definitions = [];
while (match = regex.exec(src)) {
definitions.push({
- dt : this.inlineTokens(match[1].trim()),
- dd : this.inlineTokens(match[2].trim())
+ dt : this.lexer.inlineTokens(match[1].trim()),
+ dd : this.lexer.inlineTokens(match[2].trim())
});
endIndex = regex.lastIndex;
}
@@ -227,8 +227,8 @@ const definitionLists = {
renderer(token) {
return `
${token.definitions.reduce((html, def)=>{
- return `${html}- ${this.parseInline(def.dt)}
`
- + `- ${this.parseInline(def.dd)}
\n`;
+ return `${html}- ${this.parser.parseInline(def.dt)}
`
+ + `- ${this.parser.parseInline(def.dd)}
\n`;
}, '')}
`;
}
@@ -302,7 +302,7 @@ const spanTable = {
row = item.header[j];
for (k = 0; k < row.length; k++) {
row[k].tokens = [];
- this.inlineTokens(row[k].text, row[k].tokens);
+ this.lexer.inlineTokens(row[k].text, row[k].tokens);
}
}
@@ -312,7 +312,7 @@ const spanTable = {
row = item.rows[j];
for (k = 0; k < row.length; k++) {
row[k].tokens = [];
- this.inlineTokens(row[k].text, row[k].tokens);
+ this.lexer.inlineTokens(row[k].text, row[k].tokens);
}
}
return item;
@@ -329,7 +329,7 @@ const spanTable = {
output += ``;
for (j = 0; j < row.length; j++) {
cell = row[j];
- text = this.parseInline(cell.tokens);
+ text = this.parser.parseInline(cell.tokens);
output += getTableCell(text, cell, 'th', token.align[col]);
col += cell.colspan;
}
@@ -344,7 +344,7 @@ const spanTable = {
output += `
`;
for (j = 0; j < row.length; j++) {
cell = row[j];
- text = this.parseInline(cell.tokens);
+ text = this.parser.parseInline(cell.tokens);
output += getTableCell(text, cell, 'td', token.align[col]);
col += cell.colspan;
}
From f5057119da7edd726ec8f051f472c42c8202109e Mon Sep 17 00:00:00 2001
From: Trevor Buckner
Date: Tue, 31 Aug 2021 16:39:13 -0400
Subject: [PATCH 21/31] Shrink tables width
---
.../snippetbar/snippets/classtable.gen.js | 50 ++++++++-----------
1 file changed, 21 insertions(+), 29 deletions(-)
diff --git a/client/homebrew/editor/snippetbar/snippets/classtable.gen.js b/client/homebrew/editor/snippetbar/snippets/classtable.gen.js
index 40c133b7a..c1f6254f9 100644
--- a/client/homebrew/editor/snippetbar/snippets/classtable.gen.js
+++ b/client/homebrew/editor/snippetbar/snippets/classtable.gen.js
@@ -2,7 +2,6 @@ const _ = require('lodash');
const features = [
'Astrological Botany',
- 'Astrological Chemistry',
'Biochemical Sorcery',
'Civil Divination',
'Consecrated Augury',
@@ -31,23 +30,16 @@ const features = [
'Torque Interfacer'
];
-const classnames = ['Archivist', 'Fancyman', 'Linguist', 'Fletcher',
- 'Notary', 'Berserker-Typist', 'Fishmongerer', 'Manicurist', 'Haberdasher', 'Concierge'];
+const classnames = ['Ackerman', 'Berserker-Typist', 'Concierge', 'Fishmonger',
+ 'Haberdasher', 'Manicurist', 'Netrunner', 'Weirkeeper'];
-const levels = ['1st', '2nd', '3rd', '4th', '5th', '6th', '7th', '8th', '9th', '10th', '11th', '12th', '13th', '14th', '15th', '16th', '17th', '18th', '19th', '20th'];
+const levels = ['1st', '2nd', '3rd', '4th', '5th',
+ '6th', '7th', '8th', '9th', '10th',
+ '11th', '12th', '13th', '14th', '15th',
+ '16th', '17th', '18th', '19th', '20th'];
const profBonus = [2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6];
-const getFeature = (level)=>{
- let res = [];
- if(_.includes([4, 6, 8, 12, 14, 16, 19], level+1)){
- res = ['Ability Score Improvement'];
- }
- res = _.union(res, _.sampleSize(features, _.sample([0, 1, 1, 1, 1, 1])));
- if(!res.length) return '─';
- return res.join(', ');
-};
-
const maxes = [4, 3, 3, 3, 3, 2, 2, 1, 1];
const drawSlots = function(Slots, rows, padding){
@@ -70,17 +62,17 @@ module.exports = {
let spells = 1;
let slots = 2;
return `{{${classes}\n##### The ${classname}\n` +
- `| Level | Proficiency | Features | Cantrips | Spells | --- Spell Slots Per Spell Level --- |||||||||\n`+
- `| ^| Bonus ^| ^| Known ^| Known ^| 1st | 2nd | 3rd | 4th | 5th | 6th | 7th | 8th | 9th |\n`+
- `|:-----:|:-----------:|:-----------------------------------------------|:--------:|:------:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|\n${
+ `| Level | Proficiency | Features | Cantrips | Spells | --- Spell Slots Per Spell Level ---|||||||||\n`+
+ `| ^| Bonus ^| ^| Known ^| Known ^|1st |2nd |3rd |4th |5th |6th |7th |8th |9th |\n`+
+ `|:-----:|:-----------:|:-------------|:--------:|:------:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|\n${
_.map(levels, function(levelName, level){
const res = [
_.pad(levelName, 5),
- _.pad(`+${profBonus[level]}`, 11),
- _.padEnd(getFeature(level), 48),
+ _.pad(`+${profBonus[level]}`, 2),
+ _.padEnd(_.sample(features), 21),
_.pad(cantrips.toString(), 8),
_.pad(spells.toString(), 6),
- drawSlots(slots, 9, 3),
+ drawSlots(slots, 9, 2),
].join(' | ');
cantrips += _.random(0, 1);
@@ -96,14 +88,14 @@ module.exports = {
let featureScore = 1;
return `{{${classes}\n##### The ${classname}\n` +
- `| Level | Proficiency Bonus | Features | ${_.pad(_.sample(features), 26)} |\n` +
- `|:-----:|:-----------------:|:-----------------------------------------------|:--------------------------:|\n${
+ `| Level | Proficiency Bonus | Features | ${_.pad(_.sample(features), 21)} |\n` +
+ `|:-----:|:-----------------:|:---------|:---------------------:|\n${
_.map(levels, function(levelName, level){
const res = [
_.pad(levelName, 5),
- _.pad(`+${profBonus[level]}`, 17),
- _.padEnd(getFeature(level), 48),
- _.pad(`+${featureScore}`, 26),
+ _.pad(`+${profBonus[level]}`, 2),
+ _.padEnd(_.sample(features), 23),
+ _.pad(`+${featureScore}`, 21),
].join(' | ');
featureScore += _.random(0, 1);
@@ -119,15 +111,15 @@ module.exports = {
let spells = 1;
let slots = 2;
return `{{${classes}\n##### ${classname} Spellcasting\n` +
- `| Class | Cantrips | Spells | --- Spells Slots per Spell Level --- ||||\n` +
- `| Level ^| Known ^| Known ^| 1st | 2nd | 3rd | 4th |\n` +
- `|:------:|:--------:|:-------:|:--------:|:--------:|:--------:|:--------:|\n${
+ `| Class | Cantrips | Spells |--- Spells Slots per Spell Level ---||||\n` +
+ `| Level ^| Known ^| Known ^| 1st | 2nd | 3rd | 4th |\n` +
+ `|:------:|:--------:|:-------:|:-------:|:-------:|:-------:|:-------:|\n${
_.map(levels, function(levelName, level){
const res = [
_.pad(levelName, 6),
_.pad(cantrips.toString(), 8),
_.pad(spells.toString(), 7),
- drawSlots(slots, 4, 8),
+ drawSlots(slots, 4, 7),
].join(' | ');
cantrips += _.random(0, 1);
From c178d189c918c573874a65cdb3c3d2273dd04b8f Mon Sep 17 00:00:00 2001
From: Trevor Buckner
Date: Tue, 31 Aug 2021 22:08:19 -0400
Subject: [PATCH 22/31] Update default.json
---
config/default.json | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/config/default.json b/config/default.json
index f74ce3b8e..daf77e82e 100644
--- a/config/default.json
+++ b/config/default.json
@@ -2,6 +2,5 @@
"host" : "homebrewery.local.naturalcrit.com:8000",
"naturalcrit_url" : "local.naturalcrit.com:8010",
"secret" : "secret",
- "web_port" : 8000,
- "enable_v3" : true
+ "web_port" : 8000
}
From bf146a8c0b6f9fa285f98291c399d6ef31a6b982 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 1 Sep 2021 03:01:15 +0000
Subject: [PATCH 23/31] Bump googleapis from 84.0.0 to 85.0.0
Bumps [googleapis](https://github.com/googleapis/google-api-nodejs-client) from 84.0.0 to 85.0.0.
- [Release notes](https://github.com/googleapis/google-api-nodejs-client/releases)
- [Changelog](https://github.com/googleapis/google-api-nodejs-client/blob/master/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-nodejs-client/compare/googleapis-v84.0.0...googleapis-v85.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 5476b98d4..fa82c7e54 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": "84.0.0",
+ "googleapis": "85.0.0",
"jwt-simple": "^0.5.6",
"less": "^3.13.1",
"lodash": "^4.17.21",
@@ -4794,9 +4794,9 @@
}
},
"node_modules/googleapis": {
- "version": "84.0.0",
- "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-84.0.0.tgz",
- "integrity": "sha512-5WWLwmraulw3p55lu0gNpLz2FME1gcuR7QxgmUdAVHMiVN4LEasYjJV9p36gxcf2TMe6bn6+PgQ/63+CvBEgoQ==",
+ "version": "85.0.0",
+ "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-85.0.0.tgz",
+ "integrity": "sha512-9zFsCbxz/642PROcYJsg/CCm89U1qe15c0Wtv7bmZ8cWYLD1Jszc5z+xTNoXZxnomLbvQaHeKBCPh7RdAccYOA==",
"dependencies": {
"google-auth-library": "^7.0.2",
"googleapis-common": "^5.0.2"
@@ -13155,9 +13155,9 @@
}
},
"googleapis": {
- "version": "84.0.0",
- "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-84.0.0.tgz",
- "integrity": "sha512-5WWLwmraulw3p55lu0gNpLz2FME1gcuR7QxgmUdAVHMiVN4LEasYjJV9p36gxcf2TMe6bn6+PgQ/63+CvBEgoQ==",
+ "version": "85.0.0",
+ "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-85.0.0.tgz",
+ "integrity": "sha512-9zFsCbxz/642PROcYJsg/CCm89U1qe15c0Wtv7bmZ8cWYLD1Jszc5z+xTNoXZxnomLbvQaHeKBCPh7RdAccYOA==",
"requires": {
"google-auth-library": "^7.0.2",
"googleapis-common": "^5.0.2"
diff --git a/package.json b/package.json
index 2aafba0a8..0f2f2762a 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": "84.0.0",
+ "googleapis": "85.0.0",
"jwt-simple": "^0.5.6",
"less": "^3.13.1",
"lodash": "^4.17.21",
From 59fd2454a45151b3e1dbdae182154f6979202052 Mon Sep 17 00:00:00 2001
From: Trevor Buckner
Date: Tue, 31 Aug 2021 23:57:08 -0400
Subject: [PATCH 24/31] Make images local, change snippet to allow color
instead of hue-rotate
---
.../snippetbar/snippets/watercolor.gen.js | 19 +--------
themes/5ePhb.style.less | 37 ++++++++++++++++++
themes/assets/assets.less | 15 +++++++
themes/assets/watercolor/watercolor1.png | Bin 0 -> 165163 bytes
themes/assets/watercolor/watercolor10.png | Bin 0 -> 117253 bytes
themes/assets/watercolor/watercolor11.png | Bin 0 -> 79832 bytes
themes/assets/watercolor/watercolor12.png | Bin 0 -> 34526 bytes
themes/assets/watercolor/watercolor2.png | Bin 0 -> 66157 bytes
themes/assets/watercolor/watercolor3.png | Bin 0 -> 81629 bytes
themes/assets/watercolor/watercolor4.png | Bin 0 -> 67706 bytes
themes/assets/watercolor/watercolor5.png | Bin 0 -> 79434 bytes
themes/assets/watercolor/watercolor6.png | Bin 0 -> 63920 bytes
themes/assets/watercolor/watercolor7.png | Bin 0 -> 119066 bytes
themes/assets/watercolor/watercolor8.png | Bin 0 -> 72654 bytes
themes/assets/watercolor/watercolor9.png | Bin 0 -> 74460 bytes
themes/assets/watercolor_orig/watercolor1.png | Bin 0 -> 964600 bytes
.../assets/watercolor_orig/watercolor10.png | Bin 0 -> 596772 bytes
.../assets/watercolor_orig/watercolor11.png | Bin 0 -> 98324 bytes
.../assets/watercolor_orig/watercolor12.png | Bin 0 -> 148384 bytes
themes/assets/watercolor_orig/watercolor2.png | Bin 0 -> 1492181 bytes
themes/assets/watercolor_orig/watercolor3.png | Bin 0 -> 93080 bytes
themes/assets/watercolor_orig/watercolor4.png | Bin 0 -> 204922 bytes
themes/assets/watercolor_orig/watercolor5.png | Bin 0 -> 252310 bytes
themes/assets/watercolor_orig/watercolor6.png | Bin 0 -> 1495025 bytes
themes/assets/watercolor_orig/watercolor7.png | Bin 0 -> 598625 bytes
themes/assets/watercolor_orig/watercolor8.png | Bin 0 -> 69770 bytes
themes/assets/watercolor_orig/watercolor9.png | Bin 0 -> 245611 bytes
27 files changed, 54 insertions(+), 17 deletions(-)
create mode 100644 themes/assets/watercolor/watercolor1.png
create mode 100644 themes/assets/watercolor/watercolor10.png
create mode 100644 themes/assets/watercolor/watercolor11.png
create mode 100644 themes/assets/watercolor/watercolor12.png
create mode 100644 themes/assets/watercolor/watercolor2.png
create mode 100644 themes/assets/watercolor/watercolor3.png
create mode 100644 themes/assets/watercolor/watercolor4.png
create mode 100644 themes/assets/watercolor/watercolor5.png
create mode 100644 themes/assets/watercolor/watercolor6.png
create mode 100644 themes/assets/watercolor/watercolor7.png
create mode 100644 themes/assets/watercolor/watercolor8.png
create mode 100644 themes/assets/watercolor/watercolor9.png
create mode 100644 themes/assets/watercolor_orig/watercolor1.png
create mode 100644 themes/assets/watercolor_orig/watercolor10.png
create mode 100644 themes/assets/watercolor_orig/watercolor11.png
create mode 100644 themes/assets/watercolor_orig/watercolor12.png
create mode 100644 themes/assets/watercolor_orig/watercolor2.png
create mode 100644 themes/assets/watercolor_orig/watercolor3.png
create mode 100644 themes/assets/watercolor_orig/watercolor4.png
create mode 100644 themes/assets/watercolor_orig/watercolor5.png
create mode 100644 themes/assets/watercolor_orig/watercolor6.png
create mode 100644 themes/assets/watercolor_orig/watercolor7.png
create mode 100644 themes/assets/watercolor_orig/watercolor8.png
create mode 100644 themes/assets/watercolor_orig/watercolor9.png
diff --git a/client/homebrew/editor/snippetbar/snippets/watercolor.gen.js b/client/homebrew/editor/snippetbar/snippets/watercolor.gen.js
index 40b5da973..735a35602 100644
--- a/client/homebrew/editor/snippetbar/snippets/watercolor.gen.js
+++ b/client/homebrew/editor/snippetbar/snippets/watercolor.gen.js
@@ -1,20 +1,5 @@
const _ = require('lodash');
-const watercolorBG = [
- 'https://i.imgur.com/UPUX4zG.png',
- 'https://i.imgur.com/Q6Uquv9.png',
- 'https://i.imgur.com/UOtaJpJ.png',
- 'https://i.imgur.com/Wy2DVk3.png',
- 'https://i.imgur.com/IempVlg.png',
- 'https://i.imgur.com/iJ1ddgd.png',
- 'https://i.imgur.com/qg4an04.png',
- 'https://i.imgur.com/ogGTcCh.png',
- 'https://i.imgur.com/itBD19A.png',
- 'https://i.imgur.com/tbbycAt.png',
- 'https://i.imgur.com/1SVWpGR.png',
- 'https://i.imgur.com/wC1zkuJ.png'
-];
-
module.exports = ()=>{
- return `\n}) {watercolor,position:absolute,top:0px,left:0px,width:240px,filter:hue-rotate(0deg),mix-blend-mode:multiply,opacity:80%}\n`;
-};
\ No newline at end of file
+ return `{{watercolor${_.random(1, 12)},top:20px,left:30px,width:300px,background-color:#BBAD82,opacity:80%}}\n\n`;
+};
diff --git a/themes/5ePhb.style.less b/themes/5ePhb.style.less
index 3c6d0485e..652744514 100644
--- a/themes/5ePhb.style.less
+++ b/themes/5ePhb.style.less
@@ -9,6 +9,7 @@
@headerText : #58180D; // Dark maroon
@monsterStatBackground : #EEDBAB; // Light orange parchment
@captionText : #766649; // Brown
+@watercolorStain : #BBAD82; // Light brown
@page { margin: 0; }
body {
counter-reset : phb-page-numbers;
@@ -322,6 +323,42 @@ body {
}
}
+ /* Watercolor */
+ [class*="watercolor"] {
+ position : absolute;
+ width : 2000px; /* dimensions need to be real big so the user can set */
+ height : 2000px; /* height or width and the image will maintain aspect ratio */
+ -webkit-mask-image : var(--wc);
+ -webkit-mask-size : contain;
+ -webkit-mask-repeat : no-repeat;
+ mask-image : var(--wc);
+ mask-size : contain;
+ mask-repeat : no-repeat;
+ background-size : cover;
+ background-color : @watercolorStain; /*default color*/
+ --wc : @watercolor1; /*default image*/
+ z-index : -2;
+ }
+
+ .watercolor1 { --wc : @watercolor1; }
+ .watercolor2 { --wc : @watercolor2; }
+ .watercolor3 { --wc : @watercolor3; }
+ .watercolor4 { --wc : @watercolor4; }
+ .watercolor5 { --wc : @watercolor5; }
+ .watercolor6 { --wc : @watercolor6; }
+ .watercolor7 { --wc : @watercolor7; }
+ .watercolor8 { --wc : @watercolor8; }
+ .watercolor9 { --wc : @watercolor9; }
+ .watercolor10 { --wc : @watercolor10; }
+ .watercolor11 { --wc : @watercolor11; }
+ .watercolor12 { --wc : @watercolor12; }
+
+ img {
+ z-index: 2 !important;
+ filter : drop-shadow(0px 6px 6px rgba(0,0,0,.4));
+ position: absolute;
+ }
+
//*****************************
// * MONSTER STAT BLOCK
// *****************************/
diff --git a/themes/assets/assets.less b/themes/assets/assets.less
index f159c9fc6..0823856fe 100644
--- a/themes/assets/assets.less
+++ b/themes/assets/assets.less
@@ -8,3 +8,18 @@
@monsterBlockBackground : data-uri('./themes/assets/parchmentBackgroundGrayscale.jpg');
@monsterBorderImage : data-uri('./themes/assets/monsterBorderFancy.png');
@codeBorderImage : data-uri('./themes/assets/codeBorder.png');
+
+// Watercolor Images
+
+@watercolor1 : data-uri('./themes/assets/watercolor/watercolor1.png');
+@watercolor2 : data-uri('./themes/assets/watercolor/watercolor2.png');
+@watercolor3 : data-uri('./themes/assets/watercolor/watercolor3.png');
+@watercolor4 : data-uri('./themes/assets/watercolor/watercolor4.png');
+@watercolor5 : data-uri('./themes/assets/watercolor/watercolor5.png');
+@watercolor6 : data-uri('./themes/assets/watercolor/watercolor6.png');
+@watercolor7 : data-uri('./themes/assets/watercolor/watercolor7.png');
+@watercolor8 : data-uri('./themes/assets/watercolor/watercolor8.png');
+@watercolor9 : data-uri('./themes/assets/watercolor/watercolor9.png');
+@watercolor10 : data-uri('./themes/assets/watercolor/watercolor10.png');
+@watercolor11 : data-uri('./themes/assets/watercolor/watercolor11.png');
+@watercolor12 : data-uri('./themes/assets/watercolor/watercolor12.png');
diff --git a/themes/assets/watercolor/watercolor1.png b/themes/assets/watercolor/watercolor1.png
new file mode 100644
index 0000000000000000000000000000000000000000..5855e6affb7f6e437d259c282ef04d1ca28239d4
GIT binary patch
literal 165163
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