-
-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathmultiplelayouts.plugin.coffee
More file actions
93 lines (73 loc) · 2.29 KB
/
multiplelayouts.plugin.coffee
File metadata and controls
93 lines (73 loc) · 2.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# Export Plugin
module.exports = (BasePlugin) ->
# Requires
{TaskGroup} = require('taskgroup')
# Define Plugin
class MultipleLayoutsPlugin extends BasePlugin
# Plugin name
name: 'multiplelayouts'
extendCollections: (opts) ->
# Prepare
me = @
docpad = @docpad
files = docpad.getFiles(
additionalLayouts: $exists: true
)
files.on 'remove', (document) ->
me.removeAdditionalLayoutsFor(document)
# Chain
@
contextualizeBefore: (opts, next) ->
# Prepare
me = @
docpad = @docpad
database = docpad.getDatabase()
tasks = new TaskGroup().once('complete', next)
collection = opts.collection
sourcePageDocuments = collection.findAll(
additionalLayouts: $exists: true
)
# Remove their existing associated auto pages first
sourcePageDocuments.forEach (document) -> tasks.addTask (complete) ->
return me.removeAdditionalLayoutsFor(document, collection, complete)
sourcePageDocuments.forEach (document) -> tasks.addGroup (addGroup, addTask) ->
layouts = document.get('additionalLayouts')
return unless layouts?
layouts = [layouts] unless Array.isArray(layouts)
layouts.forEach (layout) -> addTask (complete) ->
newDoc = docpad.cloneModel(document)
newDoc.set(
filename: null
)
newDoc.setMeta(
fullPath: null # treat it as a virtual document
relativePath: (document.get('additionalLayoutsRelativeOutDirPath') or document.get('relativeOutDirPath')) + '/' + document.get('basename') + '-' + layout + '.' + document.get('extensions').join('.')
layout: layout
additionalLayoutFor: document.id
additionalLayouts: null
)
newDoc.normalize (err) ->
return complete(err) if err
database.add(newDoc)
opts.collection?.add(newDoc)
complete()
tasks.run()
#Chain
@
removeAdditionalLayoutsFor: (document, collection, next) ->
# Prepare
docpad = @docpad
database = docpad.getDatabase()
# Completion callback
tasks = new TaskGroup().setConfig(concurreny: 0)
tasks.once('complete', next) if next
files = docpad.getFiles(
additionalLayoutFor: document.id
)
files.forEach (file) -> tasks.addTask (complete) ->
collection?.remove(file)
database.remove(file)
file.delete(complete)
tasks.run()
#Chain
@