0
0
mirror of https://github.com/naturalcrit/homebrewery.git synced 2026-01-06 03:32:40 +00:00

Merge branch 'master' into addEditorThemes-#362

This commit is contained in:
G.Ambatte
2023-04-16 07:13:39 +12:00
committed by GitHub
14 changed files with 16335 additions and 15774 deletions

View File

@@ -11,7 +11,7 @@ module.exports = {
browser : true, browser : true,
node : true node : true
}, },
plugins : ['react'], plugins : ['react', 'jest'],
rules : { rules : {
/** Errors **/ /** Errors **/
'camelcase' : ['error', { properties: 'never' }], 'camelcase' : ['error', { properties: 'never' }],
@@ -24,7 +24,7 @@ module.exports = {
'react/jsx-no-bind' : ['error', { allowArrowFunctions: true }], 'react/jsx-no-bind' : ['error', { allowArrowFunctions: true }],
'react/jsx-uses-react' : 'error', 'react/jsx-uses-react' : 'error',
'react/prefer-es6-class' : ['error', 'never'], 'react/prefer-es6-class' : ['error', 'never'],
'jest/valid-expect' : ['error', { maxArgs: 2 }], 'jest/valid-expect' : ['error', { maxArgs: 3 }],
/** Warnings **/ /** Warnings **/
'max-lines' : ['warn', { 'max-lines' : ['warn', {

View File

@@ -80,9 +80,15 @@ pre {
## changelog ## changelog
For a full record of development, visit our [Github Page](https://github.com/naturalcrit/homebrewery). For a full record of development, visit our [Github Page](https://github.com/naturalcrit/homebrewery).
### XXXXday DD/MM/2023 - v3.8.0 ### Wednesday 12/04/2023 - v3.8.0
{{taskList {{taskList
##### calculuschild
* [x] Rename `{{coverPage}}` to `{{frontCover}}`. Those using this {{beta BETA}} feature will need to update that text to make the cover page appear again.
* [x] Several background fixes to test scripts
##### Jeddai ##### Jeddai
* [X] Add content negotiation to exclude image requests from our API calls * [X] Add content negotiation to exclude image requests from our API calls
@@ -95,11 +101,48 @@ Fixes issue [#2595](https://github.com/naturalcrit/homebrewery/issues/2595)
Fixes issues [#2657](https://github.com/naturalcrit/homebrewery/issues/2657) Fixes issues [#2657](https://github.com/naturalcrit/homebrewery/issues/2657)
* [x] Fix internal links inside `<div>` blocks not automatically receiving the `target=_self` attribute * [x] Fix internal links inside `<div>` blocks not receiving the `target=_self` attribute
Fixes issues [#2680](https://github.com/naturalcrit/homebrewery/issues/2680) Fixes issues [#2680](https://github.com/naturalcrit/homebrewery/issues/2680)
* [x] See brew details on `/share` pages by clicking the brew title (author, last update, tags, etc.)
Fixes issues [#1679](https://github.com/naturalcrit/homebrewery/issues/1679)
* [x] Add local Windows install script via Chocolatey
##### 5e-Clerc
* [x] New {{openSans **TABLES → {{fas,fa-language}} RUNE TABLE**}} snippets for V3. Adds an alphabetic script translation table.
* [x] New {{openSans **IMAGES → {{fac,mask-center}} WATERCOLOR CENTER** }} snippets for V3, which adds a stylish watercolor texture to the center of your images!
* [x] New {{openSans **PHB → {{fac,book-inside-cover}} INSIDE COVER PAGE** }} snippet for V3! (Thanks to /u/Kaiburr_Kath-Hound on Reddit for providing some of these resources!)
* [x] Add some missing characters {{font-family:scalySansRemake Ñ ñ ç Ç Ý ý # ^ ¿ ' " ¡ ·}} to the "scalySansRemake" font in V3.
Fixes issues [#2280](https://github.com/naturalcrit/homebrewery/issues/2280)
##### Gazook89
* [x] Add "Language" selector in {{fa,fa-info-circle}} **Properties** menu. Sets the HTML Lang attribute for your brew to better handle hyphenation or spellcheck.
Fixes issues [#1343](https://github.com/naturalcrit/homebrewery/issues/1343)
* [x] Fix a crash when multiple `{injection}` tags appear in sequence
Fixes issues [#2712](https://github.com/naturalcrit/homebrewery/issues/2712)
##### MichielDeMey
* [x] Remove all-caps display on Account button since usernames are case-sensitive.
Fixes issues [#2731](https://github.com/naturalcrit/homebrewery/issues/2731)
}} }}
\page
### Monday 13/03/2023 - v3.7.2 ### Monday 13/03/2023 - v3.7.2
{{taskList {{taskList
@@ -113,7 +156,7 @@ Fixes issues [#2680](https://github.com/naturalcrit/homebrewery/issues/2680)
##### Lucastucious (new contributor!) ##### Lucastucious (new contributor!)
* [x] Changed `filter: drop-shadow` to `box-shadow` on text boxes, making text selectable in PDFs again. * [x] Changed `filter: drop-shadow` to `box-shadow` on text boxes, making PDF text selectable
Fixes issues [#1569](https://github.com/naturalcrit/homebrewery/issues/1569) Fixes issues [#1569](https://github.com/naturalcrit/homebrewery/issues/1569)
@@ -131,7 +174,6 @@ Fixes issues [#1569](https://github.com/naturalcrit/homebrewery/issues/1569)
* [x] Fix PDF pixelation on CoverPage text outlines * [x] Fix PDF pixelation on CoverPage text outlines
}} }}
### Tuesday 28/02/2023 - v3.7.0 ### Tuesday 28/02/2023 - v3.7.0
{{taskList {{taskList
@@ -161,7 +203,7 @@ Fixes issues [#2687](https://github.com/naturalcrit/homebrewery/issues/2687)
{{taskList {{taskList
##### G-Ambatte ##### G-Ambatte
* [x] Fix users not being removed from Authors list correctly * [x] Fix users not being removed from Authors list
Fixes issues [#2674](https://github.com/naturalcrit/homebrewery/issues/2674) Fixes issues [#2674](https://github.com/naturalcrit/homebrewery/issues/2674)
}} }}
@@ -191,6 +233,8 @@ Fixes issues [#2583](https://github.com/naturalcrit/homebrewery/issues/2583)
* [x] Fix cloned brews inheriting the parent view count * [x] Fix cloned brews inheriting the parent view count
}} }}
\page
### Friday 23/12/2022 - v3.5.0 ### Friday 23/12/2022 - v3.5.0
{{taskList {{taskList
@@ -204,8 +248,6 @@ Fixes issues [#2583](https://github.com/naturalcrit/homebrewery/issues/2583)
Fixes issues [#1987](https://github.com/naturalcrit/homebrewery/issues/1987) Fixes issues [#1987](https://github.com/naturalcrit/homebrewery/issues/1987)
}} }}
\page
### Saturday 10/12/2022 - v3.4.2 ### Saturday 10/12/2022 - v3.4.2
{{taskList {{taskList

View File

@@ -4,7 +4,7 @@ const createClass = require('create-react-class');
const _ = require('lodash'); const _ = require('lodash');
const cx = require('classnames'); //Unused variable const cx = require('classnames'); //Unused variable
const DISMISS_KEY = 'dismiss_notification08-27-22'; const DISMISS_KEY = 'dismiss_notification12-04-23';
const NotificationPopup = createClass({ const NotificationPopup = createClass({
displayName : 'NotificationPopup', displayName : 'NotificationPopup',
@@ -25,21 +25,14 @@ const NotificationPopup = createClass({
return ( return (
<> <>
<li key='psa'> <li key='psa'>
<em>V3.2.0 Released!</em> <br /> <em>Broken <b>CoverPage</b> snippet</em> <br />
We are happy to announce that after nearly a year of use by our many users, Those of you who have been trying out our Cover Page snippet may
we are making the V3 render mode the default setting for all new brews. notice that the cover page no longer displays correctly. Due to some
This mode has become quite popular, and has proven to be stable and powerful. small tweaks of this BETA feature, the CSS class has been renamed
Of course, we will always keep the option to use the Legacy renderer for any from "coverPage" to "frontCover". Simply change the text to "frontCover"
brew, which can still be accessed from the Properties menu. and it should again function as before. Remember that any snippet
</li> marked "beta" may have a similar change in the future as we
encounter any bugs or reworks.
<li key='stubs'>
<em>Change to Google Drive Storage!</em> <br />
We have made a change to the process of tranferring brews between Google
Drive and the Homebrewery storage. Starting now, any time a brew is
transferred, it will keep the same links instead of generating new ones!
We hope this change will help reduce issues where people "lost" their work
by trying to visit old links.
</li> </li>
<li key='googleDriveFolder'> <li key='googleDriveFolder'>

View File

@@ -0,0 +1,90 @@
const React = require('react');
const createClass = require('create-react-class');
const _ = require('lodash');
const Moment = require('moment');
const Nav = require('naturalcrit/nav/nav.jsx');
const MetadataNav = createClass({
displayName : 'MetadataNav',
getDefaultProps : function() {
return {
};
},
getInitialState : function() {
return {
showMetaWindow : false
};
},
componentDidMount : function() {
},
toggleMetaWindow : function(){
this.setState((prevProps)=>({
showMetaWindow : !prevProps.showMetaWindow
}));
},
getAuthors : function(){
if(!this.props.brew.authors || this.props.brew.authors.length == 0) return 'No authors';
return <>
{this.props.brew.authors.map((author, idx, arr)=>{
const spacer = arr.length - 1 == idx ? <></> : <span>, </span>;
return <span key={idx}><a className='userPageLink' href={`/user/${author}`}>{author}</a>{spacer}</span>;
})}
</>;
},
getTags : function(){
if(!this.props.brew.tags || this.props.brew.tags.length == 0) return 'No tags';
return <>
{this.props.brew.tags.map((tag, idx)=>{
return <span className='tag' key={idx}>{tag}</span>;
})}
</>;
},
getSystems : function(){
if(!this.props.brew.systems || this.props.brew.systems.length == 0) return 'No systems';
return this.props.brew.systems.join(', ');
},
renderMetaWindow : function(){
return <div className={`window ${this.state.showMetaWindow ? 'active' : 'inactive'}`}>
<div className='row'>
<h4>Description</h4>
<p>{this.props.brew.description || 'No description.'}</p>
</div>
<div className='row'>
<h4>Authors</h4>
<p>{this.getAuthors()}</p>
</div>
<div className='row'>
<h4>Tags</h4>
<p>{this.getTags()}</p>
</div>
<div className='row'>
<h4>Systems</h4>
<p>{this.getSystems()}</p>
</div>
<div className='row'>
<h4>Updated</h4>
<p>{Moment(this.props.brew.updatedAt).fromNow()}</p>
</div>
</div>;
},
render : function(){
return <Nav.item icon='fas fa-info-circle' color='grey' className='metadata'
onClick={()=>this.toggleMetaWindow()}>
{this.props.children}
{this.renderMetaWindow()}
</Nav.item>;
}
});
module.exports = MetadataNav;

View File

@@ -28,7 +28,7 @@
width : 250px; width : 250px;
margin : 0; margin : 0;
padding : 2px; padding : 2px;
background-color : #444; background-color : transparent;
font-family : 'Open Sans', sans-serif; font-family : 'Open Sans', sans-serif;
font-size : 12px; font-size : 12px;
font-weight : 800; font-weight : 800;
@@ -49,11 +49,14 @@
} }
} }
.brewTitle.navItem{ .brewTitle.navItem{
height: 100%;
font-size : 12px; font-size : 12px;
font-weight : 800; font-weight : 800;
color : white; color : white;
text-align : center; text-align : center;
text-transform : initial; text-transform : initial;
flex-grow : 1;
background-color: transparent;
} }
.save-menu { .save-menu {
.dropdown { .dropdown {
@@ -140,7 +143,7 @@
} }
&:hover{ &:hover{
background-color : @blue; background-color : @blue;
.clear{ .clear{
display : grid; display : grid;
place-content : center; place-content : center;
@@ -163,6 +166,87 @@
} }
} }
} }
.metadata.navItem {
position : relative;
padding: 0;
align-items: center;
display : flex;
flex-grow: 1;
height: 100%;
i{
margin-right: 10px;
}
.window{
position : absolute;
bottom : 0;
width : 440px;
left : 50%;
max-height : ~"calc(100vh - 28px)";
background-color : #333;
border : 3px solid #444;
border-top : unset;
border-radius : 0 0 5px 5px;
box-shadow : inset 0 7px 9px -7px #111;
display : flex;
flex-flow : row wrap;
justify-content : flex-start;
align-content : baseline;
padding : 0px 10px 5px;
margin : 0 auto;
z-index : -1;
transition : transform 0.4s, opacity 0.4s;
&.active{
transform: translateX(-50%) translateY(100%);
opacity: 1;
}
&.inactive{
transform: translateX(-50%) translateY(0%);
opacity: 0;
}
.row{
display : flex;
flex-flow : row wrap;
width : 100%;
h4{
display : block;
box-sizing : border-box;
padding : 5px 0px;
color : #bbb;
text-align : center;
flex-basis : 20%;
flex-grow : 1;
min-width : 76px;
}
p{
font-family : 'Open Sans', sans-serif;
font-size : 10px;
font-weight : normal;
text-transform : initial;
padding : 5px 0;
flex-basis : 80%;
flex-grow : 1;
.tag{
border : 2px solid grey;
padding : 2px;
margin : 2px 2px;
display : inline-block;
border-radius : 5px;
background-color : #444;
}
a.userPageLink{
text-decoration: none;
color: white;
&:hover{
text-decoration: underline;
}
}
}
&:nth-of-type(even){
background-color: #555;
}
}
}
}
.warning.navItem{ .warning.navItem{
position : relative; position : relative;
background-color : @orange; background-color : @orange;

View File

@@ -16,6 +16,7 @@
} }
.listPage{ .listPage{
.content{ .content{
z-index : 1;
.page{ .page{
.noColumns() !important; //Needed to override PHB Theme since this is on a lower @layer .noColumns() !important; //Needed to override PHB Theme since this is on a lower @layer
&::after{ &::after{
@@ -63,7 +64,7 @@
border-bottom : 1px solid #666; border-bottom : 1px solid #666;
color : white; color : white;
text-align : center; text-align : center;
z-index : 500; z-index : 1;
display : flex; display : flex;
justify-content : center; justify-content : center;
align-items : baseline; align-items : baseline;

View File

@@ -5,6 +5,7 @@ const { Meta } = require('vitreum/headtags');
const Nav = require('naturalcrit/nav/nav.jsx'); const Nav = require('naturalcrit/nav/nav.jsx');
const Navbar = require('../../navbar/navbar.jsx'); const Navbar = require('../../navbar/navbar.jsx');
const MetadataNav = require('../../navbar/metadata.navitem.jsx');
const PrintLink = require('../../navbar/print.navitem.jsx'); const PrintLink = require('../../navbar/print.navitem.jsx');
const RecentNavItem = require('../../navbar/recent.navitem.jsx').both; const RecentNavItem = require('../../navbar/recent.navitem.jsx').both;
const Account = require('../../navbar/account.navitem.jsx'); const Account = require('../../navbar/account.navitem.jsx');
@@ -50,8 +51,10 @@ const SharePage = createClass({
return <div className='sharePage sitePage'> return <div className='sharePage sitePage'>
<Meta name='robots' content='noindex, nofollow' /> <Meta name='robots' content='noindex, nofollow' />
<Navbar> <Navbar>
<Nav.section> <Nav.section className='titleSection'>
<Nav.item className='brewTitle'>{this.props.brew.title}</Nav.item> <MetadataNav brew={this.props.brew}>
<Nav.item className='brewTitle'>{this.props.brew.title}</Nav.item>
</MetadataNav>
</Nav.section> </Nav.section>
<Nav.section> <Nav.section>

View File

@@ -1,4 +1,8 @@
.sharePage{ .sharePage{
.navContent .navSection.titleSection {
flex-grow: 1;
justify-content: center;
}
.content{ .content{
overflow-y : hidden; overflow-y : hidden;
} }

31795
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
{ {
"name": "homebrewery", "name": "homebrewery",
"description": "Create authentic looking D&D homebrews using only markdown", "description": "Create authentic looking D&D homebrews using only markdown",
"version": "3.7.2", "version": "3.8.0",
"engines": { "engines": {
"node": "16.13.x" "node": "16.13.x"
}, },
@@ -62,7 +62,9 @@
"lines": 70 "lines": 70
} }
}, },
"setupFilesAfterEnv": ["jest-expect-message"] "setupFilesAfterEnv": [
"jest-expect-message"
]
}, },
"babel": { "babel": {
"presets": [ "presets": [
@@ -103,7 +105,7 @@
"npm": "^9.6.4", "npm": "^9.6.4",
"react": "^17.0.2", "react": "^17.0.2",
"react-dom": "^17.0.2", "react-dom": "^17.0.2",
"react-frame-component": "5.2.6", "react-frame-component": "^4.1.3",
"react-router-dom": "6.10.0", "react-router-dom": "6.10.0",
"sanitize-filename": "1.6.3", "sanitize-filename": "1.6.3",
"superagent": "^6.1.0", "superagent": "^6.1.0",
@@ -112,6 +114,7 @@
"devDependencies": { "devDependencies": {
"eslint": "^8.38.0", "eslint": "^8.38.0",
"eslint-plugin-react": "^7.32.2", "eslint-plugin-react": "^7.32.2",
"eslint-plugin-jest": "^27.2.1",
"jest": "^29.5.0", "jest": "^29.5.0",
"jest-expect-message": "^1.1.3", "jest-expect-message": "^1.1.3",
"supertest": "^6.3.3" "supertest": "^6.3.3"

View File

@@ -29,7 +29,7 @@ const Nav = {
section : createClass({ section : createClass({
displayName : 'Nav.section', displayName : 'Nav.section',
render : function(){ render : function(){
return <div className='navSection'> return <div className={`navSection ${this.props.className ?? ''}`}>
{this.props.children} {this.props.children}
</div>; </div>;
} }

View File

@@ -13,6 +13,7 @@ nav{
position : relative; position : relative;
display : flex; display : flex;
justify-content : space-between; justify-content : space-between;
z-index : 2;
} }
.navSection{ .navSection{
display : flex; display : flex;

View File

@@ -116,13 +116,13 @@ describe('Inline: When using the Inline syntax {{ }}', ()=>{
const source = '{{font-family:"trebuchet ms" text "with quotes"}}'; const source = '{{font-family:"trebuchet ms" text "with quotes"}}';
const rendered = Markdown.render(source); const rendered = Markdown.render(source);
// FIXME: adds extra \s after class names // FIXME: adds extra \s after class names
expect(rendered, `Input:\n${source}`, { showPrefix: false }, `Input:\n${source}`, { showPrefix: false }).toBe('<span class="inline-block" style="font-family:trebuchet ms;">text “with quotes”</span>'); expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('<span class="inline-block" style="font-family:trebuchet ms;">text “with quotes”</span>');
}); });
it('Renders a mustache span with text, id, class and a couple of css properties', function() { it('Renders a mustache span with text, id, class and a couple of css properties', function() {
const source = '{{pen,#author,color:orange,font-family:"trebuchet ms" text}}'; const source = '{{pen,#author,color:orange,font-family:"trebuchet ms" text}}';
const rendered = Markdown.render(source); const rendered = Markdown.render(source);
expect(rendered, `Input:\n${source}`, { showPrefix: false }, `Input:\n${source}`, { showPrefix: false }).toBe('<span class="inline-block pen" id="author" style="color:orange; font-family:trebuchet ms;">text</span>'); expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('<span class="inline-block pen" id="author" style="color:orange; font-family:trebuchet ms;">text</span>');
}); });
}); });
@@ -135,16 +135,16 @@ describe(`Block: When using the Block syntax {{tags\\ntext\\n}}`, ()=>{
}}`; }}`;
const rendered = Markdown.render(source).trimReturns(); const rendered = Markdown.render(source).trimReturns();
// FIXME: adds extra \s after class names // FIXME: adds extra \s after class names
expect(rendered, `Input:\n${source}`, { showPrefix: false }, `Input:\n${source}`, { showPrefix: false }).toBe(`<div class="block"><p>text</p></div>`); expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`<div class="block"><p>text</p></div>`);
}); });
it.failing('Renders an empty div', function() { it.failing('Renders an empty div', function() {
const source = dedent`{{ const source = dedent`{{
}}`; }}`;
const rendered = Markdown.render(source).trimReturns(); const rendered = Markdown.render(source).trimReturns();
// FIXME: adds extra \s after class names // FIXME: adds extra \s after class names
expect(rendered, `Input:\n${source}`, { showPrefix: false }, `Input:\n${source}`, { showPrefix: false }).toBe(`<div class="block"></div>`); expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`<div class="block"></div>`);
}); });
it('Renders a single paragraph with opening and closing brackets', function() { it('Renders a single paragraph with opening and closing brackets', function() {
@@ -152,16 +152,16 @@ describe(`Block: When using the Block syntax {{tags\\ntext\\n}}`, ()=>{
}}`; }}`;
const rendered = Markdown.render(source).trimReturns(); const rendered = Markdown.render(source).trimReturns();
// this actually renders in HB as '{{ }}'... // this actually renders in HB as '{{ }}'...
expect(rendered, `Input:\n${source}`, { showPrefix: false }, `Input:\n${source}`, { showPrefix: false }).toBe(`<p>{{}}</p>`); expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`<p>{{}}</p>`);
}); });
it.failing('Renders a div with a single class', function() { it.failing('Renders a div with a single class', function() {
const source = dedent`{{cat const source = dedent`{{cat
}}`; }}`;
const rendered = Markdown.render(source).trimReturns(); const rendered = Markdown.render(source).trimReturns();
// FIXME: adds two extra \s before closing `>` in opening tag // FIXME: adds two extra \s before closing `>` in opening tag
expect(rendered, `Input:\n${source}`, { showPrefix: false }, `Input:\n${source}`, { showPrefix: false }).toBe(`<div class="block cat"></div>`); expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`<div class="block cat"></div>`);
}); });
it.failing('Renders a div with a single class and text', function() { it.failing('Renders a div with a single class and text', function() {
@@ -170,7 +170,7 @@ describe(`Block: When using the Block syntax {{tags\\ntext\\n}}`, ()=>{
}}`; }}`;
const rendered = Markdown.render(source).trimReturns(); const rendered = Markdown.render(source).trimReturns();
// FIXME: adds two extra \s before closing `>` in opening tag // FIXME: adds two extra \s before closing `>` in opening tag
expect(rendered, `Input:\n${source}`, { showPrefix: false }, `Input:\n${source}`, { showPrefix: false }).toBe(`<div class="block cat"><p>Sample text.</p></div>`); expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`<div class="block cat"><p>Sample text.</p></div>`);
}); });
it.failing('Renders a div with two classes and text', function() { it.failing('Renders a div with two classes and text', function() {
@@ -179,7 +179,7 @@ describe(`Block: When using the Block syntax {{tags\\ntext\\n}}`, ()=>{
}}`; }}`;
const rendered = Markdown.render(source).trimReturns(); const rendered = Markdown.render(source).trimReturns();
// FIXME: adds two extra \s before closing `>` in opening tag // FIXME: adds two extra \s before closing `>` in opening tag
expect(rendered, `Input:\n${source}`, { showPrefix: false }, `Input:\n${source}`, { showPrefix: false }).toBe(`<div class="block cat dog"><p>Sample text.</p></div>`); expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`<div class="block cat dog"><p>Sample text.</p></div>`);
}); });
it.failing('Renders a div with a style and text', function() { it.failing('Renders a div with a style and text', function() {
@@ -312,7 +312,7 @@ describe('Injection: When an injection tag follows an element', ()=>{
|:------------------|:-----:| |:------------------|:-----:|
| 0 | 1 | | 0 | 1 |
| 300 | 2 | | 300 | 2 |
{ClassName}`; {ClassName}`;
const rendered = Markdown.render(source).trimReturns(); const rendered = Markdown.render(source).trimReturns();
expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`<table class="ClassName"><thead><tr><th align=left>Experience Points</th><th align=center>Level</th></tr></thead><tbody><tr><td align=left>0</td><td align=center>1</td></tr><tr><td align=left>300</td><td align=center>2</td></tr></tbody></table>`); expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`<table class="ClassName"><thead><tr><th align=left>Experience Points</th><th align=center>Level</th></tr></thead><tbody><tr><td align=left>0</td><td align=center>1</td></tr><tr><td align=left>300</td><td align=center>2</td></tr></tbody></table>`);
@@ -373,4 +373,3 @@ describe('Injection: When an injection tag follows an element', ()=>{
// From: https://drafts.csswg.org/selectors/#class-html: // From: https://drafts.csswg.org/selectors/#class-html:
// //
// > The class selector is given as a full stop (. U+002E) immediately followed by an identifier. // > The class selector is given as a full stop (. U+002E) immediately followed by an identifier.

View File

@@ -170,7 +170,7 @@ module.exports = [
gen : MonsterBlockGen.monster('monster,frame,wide', 4), gen : MonsterBlockGen.monster('monster,frame,wide', 4),
}, },
{ {
name : 'Cover Page', name : 'Front Cover Page',
icon : 'fac book-front-cover', icon : 'fac book-front-cover',
gen : CoverPageGen.front, gen : CoverPageGen.front,
experimental : true experimental : true