update booklet

This commit is contained in:
lxsang 2020-07-10 14:01:52 +02:00
parent eb26c964b2
commit 4af1718c0c
11 changed files with 136 additions and 21 deletions

View File

@ -4,8 +4,15 @@ A back-end tool for my online document hub [https://doc.iohub.dev/antos/](https:
## Change logs ## Change logs
### v0.1.0-a: new feature
* Entries of the same parent now can go up and down
* Support drag and drop to move entries around
* Support assets such as image files can be uploaded and stored directly into the book structure
* Booklet can now render local image
### v0.0.3-a ### v0.0.3-a
* Clean up code * Clean up code
### v0.0.2-a ### v0.0.2-a
* First public release * First public release
*

View File

@ -1,6 +1,6 @@
<afx-app-window apptitle="Booklet" width="600" height="500" data-id="Booklet"> <afx-app-window apptitle="Booklet" width="600" height="500" data-id="Booklet">
<afx-hbox > <afx-hbox >
<afx-tree-view data-id = "toc-ui" data-width="200"></afx-tree-view> <afx-tree-view data-id = "toc-ui" data-width="200" dragndrop="true"></afx-tree-view>
<afx-resizer data-width="3"></afx-resizer> <afx-resizer data-width="3"></afx-resizer>
<div data-id = "mycontainer"> <div data-id = "mycontainer">
<textarea data-id="markarea" ></textarea> <textarea data-id="markarea" ></textarea>

View File

@ -4,8 +4,15 @@ A back-end tool for my online document hub [https://doc.iohub.dev/antos/](https:
## Change logs ## Change logs
### v0.1.0-a: new feature
* Entries of the same parent now can go up and down
* Support drag and drop to move entries around
* Support assets such as image files can be uploaded and stored directly into the book structure
* Booklet can now render local image
### v0.0.3-a ### v0.0.3-a
* Clean up code * Clean up code
### v0.0.2-a ### v0.0.2-a
* First public release * First public release
*

File diff suppressed because one or more lines are too long

View File

@ -6,7 +6,7 @@
"author": "Xuan Sang LE", "author": "Xuan Sang LE",
"email": "mrsang@lxsang.me" "email": "mrsang@lxsang.me"
}, },
"version":"0.0.3-a", "version":"0.1.0-a",
"category":"Other", "category":"Other",
"iconclass":"fa fa-adn", "iconclass":"fa fa-adn",
"mimes":["dir"] "mimes":["dir"]

View File

@ -1,6 +1,6 @@
<afx-app-window apptitle="Booklet" width="600" height="500" data-id="Booklet"> <afx-app-window apptitle="Booklet" width="600" height="500" data-id="Booklet">
<afx-hbox > <afx-hbox >
<afx-tree-view data-id = "toc-ui" data-width="200"></afx-tree-view> <afx-tree-view data-id = "toc-ui" data-width="200" dragndrop="true"></afx-tree-view>
<afx-resizer data-width="3"></afx-resizer> <afx-resizer data-width="3"></afx-resizer>
<div data-id = "mycontainer"> <div data-id = "mycontainer">
<textarea data-id="markarea" ></textarea> <textarea data-id="markarea" ></textarea>

Binary file not shown.

View File

@ -45,6 +45,21 @@ class BookletFolder extends BookletEntry
@metaFile = "#{@path}/meta.json".asFileHandle() if @hasMeta @metaFile = "#{@path}/meta.json".asFileHandle() if @hasMeta
@descFile = "#{@path}/INTRO.md".asFileHandle() @descFile = "#{@path}/INTRO.md".asFileHandle()
up: (node) ->
return unless node
idx = @nodes.indexOf node
return unless idx > 0
@nodes.splice idx, 1
@nodes.splice idx-1, 0, node
down: (node) ->
return unless node
idx = @nodes.indexOf node
return unless idx >= 0 and idx < @nodes.length - 1
@nodes.splice idx, 1
@nodes.splice idx + 1, 0, node
add: (chap) -> add: (chap) ->
chap.parent = @ chap.parent = @
@nodes.push chap @nodes.push chap

View File

@ -19,6 +19,9 @@ class Booklet extends this.OS.application.BaseApplication
@open e @open e
@error __("Error when loading '{0}': {1}", e.text, msg.toString()), msg @error __("Error when loading '{0}': {1}", e.text, msg.toString()), msg
@tree.ondragndrop = (e) =>
@dndhandle(e)
@initEditor() @initEditor()
@resizeContent() @resizeContent()
@tree.contextmenuHandle = (e, m) => @tree.contextmenuHandle = (e, m) =>
@ -66,6 +69,16 @@ class Booklet extends this.OS.application.BaseApplication
@error e.toString(), e @error e.toString(), e
fn() fn()
goUp: () ->
return unless @currentToc and @currentToc.type isnt "Book"
@currentToc.parent.up @currentToc
@displayToc()
goDown: () ->
return unless @currentToc and @currentToc.type isnt "Book"
@currentToc.parent.down @currentToc
@displayToc()
load: (entry) -> load: (entry) ->
return new Promise (r, e) => return new Promise (r, e) =>
@ -80,27 +93,59 @@ class Booklet extends this.OS.application.BaseApplication
.catch (msg) -> e __e msg .catch (msg) -> e __e msg
dndhandle: (e) ->
return unless e and e.data
from = e.data.from.data
to = e.data.to.data
return unless from and to
return if from.type is "Book" or from.type is "Chapter"
return if from.parent is to.parent or from.parent is to
if to.type is from.type
to = to.parent
if to.type is from.parent.type
from.parent.removeChild(from).then () =>
to.add from
@displayToc()
upload: () ->
return unless @currentToc and @currentToc.type isnt "File"
@currentToc.path.asFileHandle().upload()
.then () =>
@notify __("File uploaded")
.catch (e) =>
@error __("Unable to upload file {0}", e.toString()), e
contextMenu: () -> contextMenu: () ->
return undefined unless @currentToc return undefined unless @currentToc
switch @currentToc.type switch @currentToc.type
when "Book" when "Book"
return [ return [
{ text: __("New chapter"), dataid: "newChapter" }, { text: __("New chapter"), dataid: "newChapter" },
{ text: __("Delete book"), dataid: "delete" } { text: __("Delete book"), dataid: "delete" },
{ text: __("Upload media"), dataid: "upload" }
] ]
when "Chapter" when "Chapter"
return [ return [
{ text: __("New section"), dataid: "newSection" }, { text: __("New section"), dataid: "newSection" },
{ text: __("Delete chapter"), dataid: "delete" } { text: __("Delete chapter"), dataid: "delete" },
{ text: __("Go up"), dataid: "goUp" },
{ text: __("Go down"), dataid: "goDown" },
{ text: __("Upload media"), dataid: "upload" }
] ]
when "Section" when "Section"
return [ return [
{ text: __("New file"), dataid: "newFile" }, { text: __("New file"), dataid: "newFile" },
{ text: __("Delete section"), dataid: "delete" } { text: __("Delete section"), dataid: "delete" },
{ text: __("Go up"), dataid: "goUp" },
{ text: __("Go down"), dataid: "goDown" },
{ text: __("Upload media"), dataid: "upload" }
] ]
when "File" when "File"
return [ return [
{ text: __("Delete file"), dataid: "delete" } { text: __("Delete file"), dataid: "delete" },
{ text: __("Go up"), dataid: "goUp" },
{ text: __("Go down"), dataid: "goDown" }
] ]
return undefined return undefined
@ -123,6 +168,7 @@ class Booklet extends this.OS.application.BaseApplication
@editor = new SimpleMDE @editor = new SimpleMDE
element: markarea element: markarea
autoDownloadFontAwesome: false
autofocus: true autofocus: true
tabSize: 4 tabSize: 4
indentWithTabs: true indentWithTabs: true
@ -131,38 +177,75 @@ class Booklet extends this.OS.application.BaseApplication
"unordered-list", "ordered-list", "|", "link", "unordered-list", "ordered-list", "|", "link",
"image", "table", "horizontal-rule", "image", "table", "horizontal-rule",
{ {
name: "image", name: "shared image",
className: "fa fa-file-image-o", className: "fa fa-share-square",
action: (e) => action: (e) =>
@shareFile ["image/.*"], (path) => @shareFile ["image/.*"], (path) =>
doc = @editor.codemirror.getDoc() doc = @editor.codemirror.getDoc()
doc.replaceSelection "![](#{@_api.handler.shared}/#{path})" doc.replaceSelection "![](#{@_api.handler.shared}/#{path})"
}, },
{
name: "local image",
className: "fa fa-file-image-o",
action: (e) =>
return unless @book
@openDialog "FileDialog", {
title: __("Select image file"),
mimes: ["image/.*"],
root: @book.path
}
.then (d) =>
path = d.file.path.replace @book.path, ""
doc = @editor.codemirror.getDoc()
#selectedText = @editor.codemirror.getSelection()
doc.replaceSelection "[[@book:image:#{path}]]"
.catch (e) =>
@error e.toString(), e
},
{ {
name:"Youtube", name:"Youtube",
className: "fa fa-youtube", className: "fa fa-youtube",
action: (e) => action: (e) =>
doc = @editor.codemirror.getDoc() doc = @editor.codemirror.getDoc()
doc.replaceSelection "[[youtube:]]" selectedText = @editor.codemirror.getSelection() || ""
doc.replaceSelection "[[youtube:#{selectedText}]]"
}, },
{ {
name: "3d object", name: "3d object",
className: "fa fa-file-image-o", className: "fa fa-cube",
action: (e) => action: (e) =>
@shareFile ["text/wavefront-obj"], (path) => return unless @book
@openDialog "FileDialog", {
title: __("Select 3d model"),
mimes: ["text/wavefront-obj"],
root: @book.path
}
.then (d) =>
path = d.file.path.replace @book.path, ""
doc = @editor.codemirror.getDoc() doc = @editor.codemirror.getDoc()
doc.replaceSelection "[[3DModel:#{@_api.handler.shared}/#{path}]]" doc.replaceSelection "[[@book:3dmodel:#{path}]]"
.catch (e) =>
@error e.toString(), e
}, },
"|", "|",
{ {
name: __("Preview"), name: __("Preview"),
className: "fa fa-eye no-disable", className: "fa fa-eye no-disable",
action: (e) -> action: (e) =>
SimpleMDE.togglePreview e SimpleMDE.togglePreview e
#/console.log @select ".editor-preview editor-preview-active" #/console.log @select ".editor-preview editor-preview-active"
renderMathInElement @find "mycontainer" renderMathInElement @find "mycontainer"
@renderLocalElement()
} }
] ],
previewRender: (plainText, preview) =>
if @book
plainText = plainText.replace /\[\[@book:image:([^\]]*)\]\]/g, (a, b) =>
return "![](#{@_api.handle.get}/#{@book.path}/#{b})"
html = @editor.markdown plainText
preview.innerHTML = html
@on "hboxchange", (e) => @resizeContent() @on "hboxchange", (e) => @resizeContent()
@bindKey "ALT-N", () => @actionFile "#{@name}-New" @bindKey "ALT-N", () => @actionFile "#{@name}-New"
@bindKey "ALT-O", () => @actionFile "#{@name}-Open" @bindKey "ALT-O", () => @actionFile "#{@name}-Open"
@ -271,6 +354,9 @@ class Booklet extends this.OS.application.BaseApplication
@dirty = false @dirty = false
@quit() @quit()
renderLocalElement: () ->
Booklet.dependencies = [ Booklet.dependencies = [
"os://scripts/mde/simplemde.min.js", "os://scripts/mde/simplemde.min.js",
"os://scripts/mde/simplemde.min.css" "os://scripts/mde/simplemde.min.css"

View File

@ -6,7 +6,7 @@
"author": "Xuan Sang LE", "author": "Xuan Sang LE",
"email": "mrsang@lxsang.me" "email": "mrsang@lxsang.me"
}, },
"version":"0.0.3-a", "version":"0.1.0-a",
"category":"Other", "category":"Other",
"iconclass":"fa fa-adn", "iconclass":"fa fa-adn",
"mimes":["dir"] "mimes":["dir"]

View File

@ -41,7 +41,7 @@
"description": "https://raw.githubusercontent.com/lxsang/antosdk-apps/master/Booklet/README.md", "description": "https://raw.githubusercontent.com/lxsang/antosdk-apps/master/Booklet/README.md",
"category": "Other", "category": "Other",
"author": "Xuan Sang LE", "author": "Xuan Sang LE",
"version": "0.0.3-a", "version": "0.1.0-a",
"download": "https://raw.githubusercontent.com/lxsang/antosdk-apps/master/Booklet/build/release/Booklet.zip" "download": "https://raw.githubusercontent.com/lxsang/antosdk-apps/master/Booklet/build/release/Booklet.zip"
}, },
{ {