diff --git a/tools/template/architecture.md b/tools/template/architecture.md index 0e40c0f..fe97363 100644 --- a/tools/template/architecture.md +++ b/tools/template/architecture.md @@ -533,61 +533,69 @@ fn apply(this, mutator, updatedAt, seq){ ### 다른 작업들 -``` -global doc - -searchWord(word) { - words(doc) - |> filter((w, _) => w = word) - |> map((_, i) => i) -} - -searchWordPrompt() { - word = prompt() - wordPositions = searchWord(word) - highlight(wordPositions, length(word)) -} - -when Ctrl-F is pressed { searchWordPrompt() } -``` - ``` module chunk { type mode = Read | Write - + struct Chunk { id: string content: string type: string } - + newChunk() { { id = uuid() ; content = "" ; type = "" } } - - chunkViewer(chunk : Chunk, deleteThis : () => void) : Component { + + chunkViewer(chunk : Chunk, focusedChunk : State, deleteThis : () => void) : Component { var mode = Read - + var c = new Component( content { value = chunk.content } settypebutton editbutton deletebutton ) - + when mode becomes Read { chunk.content = content } - + when mode becomes Write { focusedChunk = chunk.id } + when focusedChunk is changed { mode = Read } + when editbutton is clicked { mode = (mode = Read) ? Write : Read } when deletebutton is clicked { deleteThis() } when settypebutton is clicked { chunk.type = prompt() } - + return c } } +``` +``` +module search { + searchWord(chunks, word) { + return doc.chunks.concat_map((s) => s.matchAll(word)) + } + + searchWordPrompt(chunks: Chunk.chunk list) { + var word = prompt() + var results = searchWord(chunks, word) + + var c = new Component(results) + + when result in results is selected { + moveto(result.location) + close() + } + } + + when Ctrl-F is pressed { searchWordPrompt() } +} +``` + +``` module document { struct Document { title: string @@ -595,25 +603,88 @@ module document { tags: string set chunks: chunk.Chunk array } - + documentViewer(doc: document) : Component { var focusedChunk = null - + var c = new Component( taglist { value: tags } chunklist ) - + delete(id) { i = doc.chunks.find((c) => c.id = id) doc.chunks.remove(i) } - + chunklist = doc.chunks.concat_map((c, i) => - [ divider(i), chuknViewer(c, () => delete(c.id)) ]) - + [ divider(i), chuknViewer(c, focusedChunk, () => delete(c.id)) ]) + when divider(i) clicked { doc.chunks.insert(i, c) } when chunkViewer(c) is dropped on divider(i) { doc.chunks.move(c, i) } + + return c } } -``` \ No newline at end of file +``` + +``` +module filelist { + fileList(dir : Directory, open: (File) => void) : Component { + var c = new Component( + filelist + ) + + filelist = dir.files().map((f) => button(f)) + + when button(f) is clicked { + open(f) + } + + return c + } +} +``` + +``` +module settings { + settings() : Component { + var c = new Component( + language = select("korean", "english") + theme = select("light", "dark") + ) + + when language(l) is selected { + global context.lang = l + } + + when theme(t) is selected { + global context.theme = t + } + + return c + } +} + +``` +module frontend { + main() : Component { + var docv + + var open = (f) => { + with doc = openfile(f) { + docv = document.documentViewer(doc) + } + } + + var filelist = filelist.fileList(rootdir, open) + + var c = new Component( + document = docv + filelist = filelist + ) + + return c + } +} +``` diff --git a/tools/template/interface.png b/tools/template/interface.png index fb31e77..7992d43 100644 Binary files a/tools/template/interface.png and b/tools/template/interface.png differ