diff --git a/builder.js b/builder.js
index f0fc4f0..9b82d1f 100644
--- a/builder.js
+++ b/builder.js
@@ -1,4 +1,39 @@
-class Builder {
+const defaultHtml = `
+
+
+
+
+ macchiato.dev
+
+
+
+
+ ${ '<' + 'script type="module" src="/app.js"><' + '/script>' }
+
+
+
+`.trim()
+
+const defaultIntro = `
+
+window.Macchiato = {
+ location: new MLocation(),
+}
+
+`.trim()
+
+export class Builder {
constructor(files) {
this.files = files
}
@@ -39,44 +74,53 @@ class Builder {
return script.outerHTML
}
+ buildReplace(filesMap) {
+ if ('_replace.js' in filesMap) {
+ const rSrc = filesMap['_replace.js']
+ return new Function(
+ rSrc.match(/\((\w+)\)/)[1],
+ rSrc.slice(
+ rSrc.indexOf('{') + 1,
+ rSrc.lastIndexOf('}')
+ )
+ )
+ } else {
+ return s => s
+ }
+ }
+
build() {
- const modules = this.files.map(file => {
- return this.buildModule(file)
+ const filesMap = Object.fromEntries(
+ this.files.map(
+ ({name, data}) => ([name, data])
+ )
+ )
+ const intro = this.buildModule({
+ name: '_intro.js',
+ data: (
+ '_intro.js' in filesMap ?
+ filesMap['_intro.js'] :
+ defaultIntro
+ ),
})
- return `
-
-
-
- Editor
-
-
-
-${'<'}script type="module">
-window.Macchiato = {modules: {}}
-${''}script>
-${modules.join("\n")}
-${'<'}script type="module">
-
-${''}script>
-
-
- `.trim()
+ const replace = this.buildReplace(filesMap)
+ const modules = this.files.filter(({name}) => (
+ name.endsWith('.js') &&
+ !name.startsWith('_')
+ )).map(file => (
+ this.buildModule({
+ ...file,
+ data: replace(file.data),
+ })
+ ))
+ const html = (
+ 'index.html' in filesMap ?
+ filesMap['index.html'] :
+ defaultHtml
+ )
+ return html.replace(
+ '<' + 'script type="module" src="/app.js"><' + '/script>',
+ intro + "\n" + modules.join("\n")
+ )
}
}
\ No newline at end of file
diff --git a/editor-build.js b/editor-build.js
new file mode 100644
index 0000000..085003a
--- /dev/null
+++ b/editor-build.js
@@ -0,0 +1,36 @@
+import { Builder } from '/loader/builder.js'
+
+export class EditorBuild {
+ deps = [
+ '/editor/file-group.js',
+ '/editor/file-view.js',
+ '/editor/text-edit.js',
+ '/editor/app.js',
+ '/forms/button-group.js',
+ '/dialog/dialog.js',
+ '/menu/dropdown.js',
+ ]
+
+ constructor() {
+ this.files = undefined
+ }
+
+ async loadFiles() {
+ const files = []
+ for (const name of this.deps) {
+ const resp = await fetch(name)
+ files.push({
+ name,
+ data: await resp.text(),
+ })
+ }
+ }
+
+ async build() {
+ if (this.files === undefined) {
+ await this.loadFiles()
+ }
+ const builder = new Builder(this.files)
+ return builder.build()
+ }
+}
\ No newline at end of file