generated from 8bitgentleman/roam-depot-extension-template
-
Notifications
You must be signed in to change notification settings - Fork 0
/
entry-helpers.js
169 lines (146 loc) · 5.34 KB
/
entry-helpers.js
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
import componentCSSFile from "./component.css";
import clsjFile from "./component.cljs";
function removeCodeBlock(uid){
roamAlphaAPI.deleteBlock({"block":{"uid": uid}})
}
function uidForToday() {
let roamDate = new Date(Date.now());
let today = window.roamAlphaAPI.util.dateToPageTitle(roamDate);
return today
}
function createPage(title){
// creates the roam/css page if it does not exist
let pageUID = roamAlphaAPI.util.generateUID()
roamAlphaAPI.data
.page.create(
{"page":
{"title": title,
"uid": pageUID}})
return pageUID;
}
function getPageUidByPageTitle(title){
return roamAlphaAPI.q(
`[:find (pull ?e [:block/uid]) :where [?e :node/title "${title}"]]`
)?.[0]?.[0].uid || null
}
function createRenderBlock(renderPageName, titleblockUID, version, codeBlockUID, componentName){
let renderPageUID = getPageUidByPageTitle(renderPageName)|| createPage(renderPageName);
let templateBlockUID = roamAlphaAPI.util.generateUID()
let codeBlockHeaderUID = roamAlphaAPI.util.generateUID()
let renderBlockUID = roamAlphaAPI.util.generateUID()
// create the titleblock
//Component Name [[January 12th, 2023]]
roamAlphaAPI
.createBlock(
{"location":
{"parent-uid": renderPageUID,
"order": 0},
"block":
{"string": `${componentName} [[${uidForToday()}]]`,
"uid":titleblockUID,
"open":true,
"heading":3}})
// create the template name block
// Component Name vXX [[roam/templates]]
roamAlphaAPI
.createBlock(
{"location":
{"parent-uid": titleblockUID,
"order": 0},
"block":
{"string": `${componentName} ${version} [[roam/templates]]`,
"uid":templateBlockUID,
"open":true}})
// create the render component block
// {{roam/render:((diA0Fyj5m))}}
roamAlphaAPI
.createBlock(
{"location":
{"parent-uid": templateBlockUID,
"order": 0},
"block":
{"string": `{{[[roam/render]]:((${codeBlockUID})) }}`,
"uid":renderBlockUID}})
// create code header block
roamAlphaAPI
.createBlock(
{"location":
{"parent-uid": titleblockUID,
"order": 'last'},
"block":
{"string": `code`,
"uid":codeBlockHeaderUID,
"open":false}})
// create codeblock for the component
let cljs = clsjFile
let blockString = "```clojure\n " + cljs + " ```"
roamAlphaAPI
.createBlock(
{"location":
{"parent-uid": codeBlockHeaderUID,
"order": 0},
"block":
{"uid": codeBlockUID,
"string": blockString}})
}
function createCSSBlock(parentUID, cssBlockUID, cssFile, parentString){
// creates the initial code block and its parent
// adding this to the roam/css page so users can use it as an example
// if roam/css page doesn't exist then create it
let pageUID = getPageUidByPageTitle('roam/css') || createPage('roam/css');
// create closed parent block
roamAlphaAPI.createBlock(
{"location":
{"parent-uid": pageUID,
"order": "last"},
"block":
{"string": `${parentString} [[${uidForToday()}]]`,
"uid":parentUID,
"open":false,
"heading":3}})
// create codeblock for the component
// I do this so that a user can see what to customize
let css = cssFile.toString();
let blockString = "```css\n " + css + " ```"
roamAlphaAPI
.createBlock(
{"location":
{"parent-uid": parentUID,
"order": 0},
"block":
{"uid": cssBlockUID,
"string": blockString}})
}
function replaceRenderString(renderString, replacementString){
// replaces the {{[[roam/render]]:((5juEDRY_n))}} string across the entire graph
// I do this because when the original block is deleted Roam leaves massive codeblocks wherever it was ref'd
// also allows me to re-add back if a user uninstalls and then re-installs
let query = `[:find
(pull ?node [:block/string :node/title :block/uid])
:where
(or [?node :block/string ?node-String]
[?node :node/title ?node-String])
[(clojure.string/includes? ?node-String "${renderString}")]
]`;
let result = window.roamAlphaAPI.q(query).flat();
result.forEach(block => {
const updatedString = block.string.replace(renderString, replacementString);
window.roamAlphaAPI.updateBlock({
block: {
uid: block.uid,
string: updatedString
}
});
});
}
export function toggleRenderComponent(state, titleblockUID, cssBlockParentUID, version, renderString, replacementString, cssBlockUID, codeBlockUID, componentName) {
let renderPageName = 'roam/render'
if (state==true) {
createRenderBlock(renderPageName, titleblockUID, version, codeBlockUID, componentName)
createCSSBlock(cssBlockParentUID, cssBlockUID, componentCSSFile, `${componentName} STYLE`);
} else if(state==false){
replaceRenderString(renderString, replacementString)
removeCodeBlock(titleblockUID)
removeCodeBlock(cssBlockParentUID)
}
}