Skip to content

Commit b70f70f

Browse files
marcoowpichfl
authored andcommitted
Add mechanism for arbitrary head tags (mainmatter#659)
* dedicated class for writing head tags * render head tags in SSR build * add static meta tags * add og:title meta tag * add canonical url tag * fix object iteration * add article published time meta tag * render meta date for blog posts * format * fix prerender build
1 parent c00fd83 commit b70f70f

File tree

17 files changed

+170
-16
lines changed

17 files changed

+170
-16
lines changed

.prettierignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
lib/generate-blog-components/lib/files/**/*
1+
lib/generate-blog/lib/templates/**/*
22
lib/global-css/css/vendor/normalize.css
33
src/ui/components/Header/template.hbs

ember-cli-build.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ class SimplabsApp extends GlimmerApp {
156156
});
157157
let ssrTree = this.ssrTree();
158158

159-
let appTree = new MergeTrees([jsTree, ssrTree]);
159+
let appTree = new MergeTrees([jsTree, ssrTree], { overwrite: true });
160160
return new Rollup(appTree, {
161161
rollup: {
162162
input: 'ssr/index.js',

lib/component-generation/prepare-templates.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,11 @@ module.exports = function prepareTemplates(folder) {
1616
.reduce((acc, folder) => {
1717
let component = path.basename(folder);
1818
acc[component] = ['template', 'stylesheet'].reduce((acc, template) => {
19-
let source = fs.readFileSync(path.join(folder, `${template}.hbs`)).toString();
20-
acc[template] = handlebars.compile(source);
19+
let file = path.join(folder, `${template}.hbs`);
20+
if (fs.existsSync(file)) {
21+
let source = fs.readFileSync(file).toString();
22+
acc[template] = handlebars.compile(source);
23+
}
2124
return acc;
2225
}, {});
2326
return acc;

lib/generate-blog/lib/components-builder.js

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,14 +73,12 @@ module.exports = class ComponentsBuilder extends BaseComponentsBuilder {
7373

7474
_writePostComponent(post, related) {
7575
let data = this._preparePostTemplateData(post);
76+
data.componentName = post.componentName;
7677
if (related) {
7778
data.related = this._preparePostTemplateData(related);
7879
}
7980
let componentTemplate = this.templates.post.template(data);
8081

81-
data = {
82-
componentName: post.componentName,
83-
};
8482
let componentCssBlock = this.templates.post.stylesheet(data);
8583

8684
this.writeComponent(post.componentName, componentTemplate, componentCssBlock);

lib/generate-blog/lib/templates/post/template.hbs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
<div>
2+
<HeadTag @name='meta' @keys=\{{hash property="article:published_time"}} @values=\{{hash content="{{isoDate}}"}} />
23
<script type="application/ld+json">
34
{
45
"@type": "BlogPosting",

lib/head-data/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ module.exports = {
1313
<meta name="language" content="en" />
1414
<meta name="content-language" content="en" />
1515
<meta name="publisher" content="simplabs GmbH" />
16+
<meta property="fb:admins" content="699569440119973" />
17+
<meta property="og:site_name" content="simplabs" />
18+
<meta name="twitter:site" content="@simplabs">
1619
<link type="application/atom+xml" rel="alternate" href="https://simplabs.com/feed.xml" title="simplabs Blog" />
1720
`;
1821
} else {

scripts/prerender.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,10 @@ let server = express();
7171
server.get('*', async function(req, res, next) {
7272
if (req.headers.accept && req.headers.accept.includes('text/html')) {
7373
let origin = `${req.protocol}://${req.headers.host}`;
74-
let { body, title } = await renderer.render(origin, req.url);
74+
let { body, head } = await renderer.render(origin, req.url);
7575
let shoeboxBundlePreloads = buildShoeboxBundlePreloads(body);
7676
let html = HTML.replace('<div id="app"></div>', body)
77-
.replace(/<title>[^<]*<\/title>/, `<title>${title}</title>`)
77+
.replace(/<head>/, `<head>\n${head}`)
7878
.replace('<link', `${shoeboxBundlePreloads}\n<link`);
7979
res.send(html);
8080
} else {

src/index.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import { classnames } from '@css-blocks/glimmer/dist/cjs/src/helpers/classnames'
22
import { concat } from '@css-blocks/glimmer/dist/cjs/src/helpers/concat';
33
import { ComponentManager, setPropertyDidChange } from '@glimmer/component';
44
import App from './main';
5+
import HeadTags from './utils/head-tags';
6+
import hash from './utils/helpers/hash';
57

68
const containerElement = document.getElementById('app');
79
const hasSSRBody = !!document.querySelector('[data-has-ssr-response]');
@@ -53,13 +55,24 @@ app.registerInitializer({
5355
'lazyRegistration',
5456
`utils:/${app.rootName}/lazy-registration/main`,
5557
);
58+
59+
registry.register(
60+
`utils:/${app.appName}/head-tags/main`,
61+
HeadTags
62+
);
63+
registry.registerInjection(
64+
`component`,
65+
'headTags',
66+
`utils:/${app.appName}/head-tags/main`,
67+
);
5668
}
5769
});
5870

5971
app.registerInitializer({
6072
initialize(registry) {
6173
register(registry, `helper:/${app.rootName}/components/-css-blocks-classnames`, classnames);
6274
register(registry, `helper:/${app.rootName}/components/-css-blocks-concat`, concat);
75+
register(registry, `helper:/${app.rootName}/components/hash`, hash);
6376
}
6477
});
6578

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import Component from '@glimmer/component';
2+
3+
export default class HeadTag extends Component {
4+
constructor(options) {
5+
super(options);
6+
7+
this.setMetaTags();
8+
}
9+
10+
public willDestroy() {
11+
this.headTags.remove(this.args.name, this.args.keys);
12+
}
13+
14+
private setMetaTags() {
15+
this.headTags.write(this.args.name, this.args.keys, this.args.values, this.args.content);
16+
}
17+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
:scope {
2+
block-name: HeadTag;
3+
}

0 commit comments

Comments
 (0)