Skip to content

Commit 0969a2e

Browse files
committed
SubOntologies WIP | Get subpages+homepage working in portal
Remove frontMatter from content
1 parent c9a7e62 commit 0969a2e

File tree

4 files changed

+173
-79
lines changed

4 files changed

+173
-79
lines changed

src/compiler2/drivers/fs/index.js

+22-20
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,6 @@ const exploreDirectory = async (currentPath, depth = 0) => {
5757
* * *
5858
* * */
5959

60-
const frontMatter = require('front-matter')
61-
const _ = require('lodash')
62-
const Driver = require('../../lib/Driver')
63-
const { ContentTree, ContentTreeEntry } = require('../../lib/ContentTree')
64-
6560
/*
6661
const ContentParsers = require('../../lib/Parsers')
6762
@@ -114,6 +109,11 @@ class FolderEntry extends FileSystemEntry {
114109
}
115110
*/
116111

112+
const frontMatter = require('front-matter')
113+
const _ = require('lodash')
114+
const Driver = require('../../lib/Driver')
115+
const { ContentTree, ContentTreeEntry } = require('../../lib/ContentTree')
116+
117117
class FileSystemDriver extends Driver {
118118
constructor() {
119119
super()
@@ -205,22 +205,24 @@ class FileSystemDriver extends Driver {
205205

206206
tokenize(fileSystemTree) {
207207
return fileSystemTree.reduce((entries, entry) => {
208-
const maybeFrontMatter = (
209-
entry.content ?
210-
(frontMatter(entry.content).attributes || {}) :
211-
{}
212-
)
213-
214-
const contentNode = this.deepTokenize({
215-
...entry,
216-
...maybeFrontMatter,
217-
format: this.mapExtensionToFormat(entry.extension)
218-
})
208+
if (entry.content) {
209+
const frontMatterResult = frontMatter(entry.content || '')
210+
return entries.concat(
211+
this.deepTokenize({
212+
...entry,
213+
...(frontMatterResult.attributes || {}),
214+
content: frontMatterResult.body,
215+
format: this.mapExtensionToFormat(entry.extension),
216+
})
217+
)
218+
}
219219

220-
return [
221-
...entries,
222-
contentNode
223-
]
220+
return entries.concat(
221+
this.deepTokenize({
222+
...entry,
223+
format: this.mapExtensionToFormat(entry.extension)
224+
})
225+
)
224226
}, [])
225227
}
226228
}

src/compiler2/ontologies/portal/index.js

+148-57
Original file line numberDiff line numberDiff line change
@@ -2,112 +2,203 @@ const Settings = require('../../../settings')
22
const Ontology = require('../../lib/Ontology')
33
// const Assets = require('./models/assets')
44
// const LocalAsset = require('./models/localAsset')
5-
const Homepage = require('./models/homepage')
6-
const Subpage = require('./models/subpage')
75

8-
const Views = {
9-
homepage: require('./views/homepage'),
10-
subpages: require('./views/subpages')
11-
}
126

137
module.exports = ({ ontologies }) => {
8+
const Models = {
9+
Homepage: require('./models/homepage'),
10+
Subpage: require('./models/subpage')
11+
}
12+
1413
const SubOntologies = {
15-
sense: (entry) => {
16-
if (entry.type !== 'object') {
17-
return entry
18-
}
19-
const subOntology = ontologies.get(entry.data.name.data)
20-
if (!subOntology) {
21-
return entry
22-
}
23-
return new subOntology(entry)
14+
view: 'should it have a view?',
15+
16+
schema: (entry) => ({
17+
type: 'object',
18+
data: {
19+
name: ontologies.get
20+
},
21+
}),
22+
23+
match: (entry, _schema) => {
24+
const schema = _schema || SubOntologies.schema(entry)
25+
return Object.keys(schema).every((key) => {
26+
const expected = schema[key]
27+
const actual = entry[key]
28+
if (typeof expected === 'string') {
29+
return actual.data === expected
30+
}
31+
if (expected instanceof RegExp) {
32+
console.log('expected is regex', entry, key)
33+
return !!actual.data.match(expected)
34+
}
35+
if (expected instanceof Function) {
36+
return expected(actual.data)
37+
}
38+
if (typeof expected === 'object') {
39+
console.log('expected is object', entry, key)
40+
return SubOntologies.match(actual, expected)
41+
}
42+
})
2443
},
2544

2645
reduce: (model, entry) => {
2746
return model
47+
if (!SubOntologies.match(entry)) {
48+
return model
49+
}
50+
const subOntology = ontologies.get(entry.data.name.data)
2851
return {
2952
...model,
30-
[entry.name]: entry.contentModel
53+
[entry.data.name.data]: entry.contentModel
3154
}
3255
},
3356

3457
render: (renderer, model) => {
58+
return Promise.resolve()
3559
}
3660
}
3761

62+
/*
63+
* Organize Models together with their Views in a [modelName] folder?
64+
* */
3865
const HomepageCenter = {
39-
sense: (entry) => {
40-
if (entry.type !== 'object') {
41-
return entry
42-
}
43-
if (!entry.data.format.data.match(/(markdown|plaintext|hypertext|handlebars)/)) {
44-
return entry
45-
}
46-
if (!entry.data.name.data.match(/(homepage|home|index)/)) {
47-
return entry
48-
}
49-
return new Homepage(entry)
66+
view: require('./views/homepage'),
67+
68+
schema: (entry) => ({
69+
type: 'object',
70+
data: {
71+
name: /(homepage|home|index)/,
72+
format: /(markdown|plaintext|hypertext|handlebars)/,
73+
},
74+
}),
75+
76+
match: (entry, _schema) => {
77+
const schema = _schema || HomepageCenter.schema(entry)
78+
console.log('HomepageCenter.match schema', schema)
79+
return Object.keys(schema).every((key) => {
80+
const expected = schema[key]
81+
const actual = entry[key]
82+
if (typeof expected === 'string') {
83+
console.log('expected is string', entry, key)
84+
return (actual.data || actual) === expected
85+
}
86+
if (expected instanceof RegExp) {
87+
console.log('expected is regex', entry, key)
88+
return !!(actual.data || actual).match(expected)
89+
}
90+
if (expected instanceof Function) {
91+
return expected(actual.data || actual)
92+
}
93+
if (key === 'data') {
94+
console.log('expected is object', entry, key)
95+
return HomepageCenter.match(actual, expected)
96+
}
97+
})
5098
},
5199

52100
reduce: (model, entry) => {
53-
return {
101+
console.log('HomepageCenter.reduce', model, entry)
102+
if (!HomepageCenter.match(entry)) {
103+
console.log('HomepageCenter other')
104+
return model
105+
}
106+
const homepage = new Models.Homepage(entry)
107+
console.log('HomepageCenter homepage', homepage)
108+
const newModel = {
54109
...model,
55-
homepage: entry.contentModel.data
110+
homepage: homepage.contentModel.data
56111
}
112+
console.log('HomepageCenter newModel', newModel)
113+
return newModel
57114
},
58115

59116
render: async (renderer, model) => {
60-
await Views.homepage(renderer, model)
117+
await HomepageCenter.view(renderer, model)
61118
}
62119
}
63120

121+
/*
122+
*
123+
* Seeing if an interface emerges
124+
* Will merge with their models under a renewed interface?
125+
*
126+
* */
64127
const Subpages = {
65-
sense: (entry) => {
66-
if (entry.type !== 'object') {
67-
return entry
68-
}
69-
if (!entry.data.format.data.match(/(markdown|plaintext|hypertext|handlebars)/)) {
70-
return entry
128+
view: require('./views/subpages'),
129+
130+
schema: (entry) => ({
131+
type: 'object',
132+
data: {
133+
format: /(markdown|plaintext|hypertext|handlebars)/
71134
}
72-
return new Subpage(entry)
135+
}),
136+
137+
match: (entry, _schema) => {
138+
const schema = _schema || Subpages.schema(entry)
139+
console.log('Subpages.match schema', schema)
140+
return Object.keys(schema).every((key) => {
141+
const expected = schema[key]
142+
const actual = entry[key]
143+
if (typeof expected === 'string') {
144+
console.log('expected is string', entry, key)
145+
return (actual.data || actual) === expected
146+
}
147+
if (expected instanceof RegExp) {
148+
console.log('expected is regex', entry, key)
149+
return !!(actual.data || actual).match(expected)
150+
}
151+
if (expected instanceof Function) {
152+
return expected(actual.data || actual)
153+
}
154+
if (key === 'data') {
155+
console.log('expected is object', entry, key)
156+
return Subpages.match(actual, expected)
157+
}
158+
})
73159
},
74160

75161
reduce: (model, entry) => {
76-
return {
162+
console.log('Subpages.reduce', model, entry)
163+
if (!Subpages.match(entry)) {
164+
console.log('Subpages other')
165+
return model
166+
}
167+
const subpage = new Models.Subpage(entry)
168+
console.log('Subpages subpage', subpage)
169+
const newModel = {
77170
...model,
78171
subpages: [
79172
...(model.subpages || []),
80-
entry.contentModel.data
173+
subpage.contentModel.data
81174
]
82175
}
176+
console.log('Subpages newModel', newModel)
177+
return newModel
83178
},
84179

85180
render: async (renderer, model) => {
86-
await Views.subpages(renderer, model)
181+
console.log('subpages.render contentModel', model)
182+
await Subpages.view(renderer, model)
87183
}
88184
}
89185

90186
class Portal extends Ontology {
91187
constructor(contentTree) {
92188
super(contentTree)
93-
// console.log('rootOntology portal')
94189
this.contentModel = contentTree.tree.reduce((model, entry) => {
95-
const subOntology = SubOntologies.sense(entry)
96-
if (subOntology instanceof Ontology) {
97-
console.log('sensed subontology')
98-
return SubOntologies.reduce(model, subOntology)
99-
}
100-
const homepage = HomepageCenter.sense(entry)
101-
if (homepage instanceof Homepage) {
102-
console.log('sensed homepage')
103-
return HomepageCenter.reduce(model, homepage)
104-
}
105-
const subpage = Subpages.sense(entry)
106-
if (subpage instanceof Subpage) {
107-
console.log('sensed subpage')
108-
return Subpages.reduce(model, subpage)
109-
}
110-
return model
190+
console.log('portal.contentTree.reduce', model, entry)
191+
192+
const maybeWithSubOntologies = SubOntologies.reduce(model, entry)
193+
console.log('portal.contentTree.reduce withSubOntologies', maybeWithSubOntologies, entry)
194+
195+
const maybeWithHomepage = HomepageCenter.reduce(maybeWithSubOntologies, entry)
196+
console.log('portal.contentTree.reduce withHomepage', maybeWithHomepage, entry)
197+
198+
const maybeWithSubpages = Subpages.reduce(maybeWithHomepage, entry, entry)
199+
console.log('portal.contentTree.reduce withSubpages', maybeWithSubpages)
200+
201+
return maybeWithSubpages
111202
}, {})
112203
console.log('portal.contentModel', JSON.stringify(this.contentModel, null, 2))
113204
}

src/compiler2/ontologies/portal/models/homepage.js

+1
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ const createFolderedHomepage = (fsObject) => {
8686
return _createHomepage(fsObject, { foldered: true })
8787
}
8888
*/
89+
8990
const Settings = require('../../../../settings')
9091
const contentTypes = require('../contentTypes')
9192

src/compiler2/ontologies/portal/views/subpages.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,11 @@ const parseContent = (rawContent, format) => {
4646
const renderSubpages = (Renderer, contentModel) => {
4747
const { out } = Settings.getSettings()
4848
const compilation = contentModel.subpages.map(subpage => {
49-
console.log('rendering subpage', subpage, 'to', join(out, subpage.outputPath))
49+
// console.log('rendering subpage', subpage, 'to', join(out, subpage.outputPath))
5050
return Renderer.render({
5151
template: `root/pages/subpage/${subpage.type}`,
5252
outputPath: join(out, subpage.outputPath),
53-
content: parseContent(subpage.content, subpage.format),
53+
content: parseContent(subpage.content.data, subpage.format.data),
5454
data: {
5555
...contentModel,
5656
subpage,

0 commit comments

Comments
 (0)