Use wiki-list-editor
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Peter Stuifzand 2020-05-11 23:34:10 +02:00
parent 6c04d9871f
commit d6ad4e7a18
6 changed files with 710 additions and 310 deletions

793
editor/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,29 +1,20 @@
{
"devDependencies": {
"@editorjs/attaches": "^1.0.1",
"clean-webpack-plugin": "^3.0.0",
"html-webpack-plugin": "^3.2.0",
"scss-loader": "0.0.1",
"webpack": "^4.39.2",
"webpack-cli": "^3.3.7"
"webpack-cli": "^3.3.7",
"webpack-dev-server": "^3.8.0"
},
"dependencies": {
"@editorjs/checklist": "^1.1.0",
"@editorjs/code": "^2.4.1",
"@editorjs/editorjs": "^2.15.0",
"@editorjs/header": "^2.3.0",
"@editorjs/image": "^2.3.1",
"@editorjs/link": "^2.1.3",
"@editorjs/list": "^1.4.0",
"@editorjs/marker": "^1.2.1",
"@editorjs/table": "^1.2.0",
"axios": "^0.19.0",
"bulma": "^0.7.5",
"css-loader": "^3.2.0",
"node-sass": "^4.12.0",
"sass-loader": "^7.3.1",
"style-loader": "^1.0.0",
"webpack-dev-server": "^3.8.0"
"wiki-list-editor": "^0.3.0"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",

View File

@ -1,15 +1,4 @@
import EditorJS from '@editorjs/editorjs';
import Header from '@editorjs/header';
import List from '@editorjs/list';
import Table from '@editorjs/table';
import Checklist from '@editorjs/checklist';
import Code from '@editorjs/code';
import Marker from '@editorjs/marker';
import Link from '@editorjs/link';
import Attaches from '@editorjs/attaches';
import Image from '@editorjs/image';
import listEditor from 'wiki-list-editor';
import axios from 'axios';
import qs from 'querystring'
@ -64,31 +53,11 @@ function addIndicator(editor, indicator) {
}
}
const editor = new EditorJS({
holder: 'editor',
tools: {
header: {
class: Header
},
list: List,
table: Table,
checklist: Checklist,
code: Code,
marker: Marker,
link: {
class: Link,
config: {
endpoint: '/fetchLink'
}
},
attaches: {
class: Attaches
},
image: {
class: Image
}
},
onChange() {
let holder = document.getElementById('editor');
let editor = listEditor(holder, JSON.parse(holder.dataset.input));
editor.on('change', function () {
let element = document.getElementById('editor');
let indicator = Indicator(document.getElementById('save-indicator'), 2);
let saveUrl = element.dataset.saveurl;
@ -99,11 +68,4 @@ const editor = new EditorJS({
addSaver(editor, saveUrl, page, () => indicator.setText('saving...')),
indicator
).save()
},
onReady() {
let data = document.getElementById('editor').dataset.input;
if (data) {
editor.blocks.render(JSON.parse(data));
}
}
});
})

View File

@ -1,8 +1,6 @@
@import "~bulma";
#editor {
max-width: 650px;
margin: 0 auto;
}
#save-indicator {

20
main.go
View File

@ -348,7 +348,7 @@ func (h *editHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
mpPage := mp.Get(page)
pageText := mpPage.Content
jsonEditor := pageText != "" && pageText[0] == '{'
jsonEditor := pageText != "" && (pageText[0] == '{' || pageText[0] == '[')
var editor template.HTML
if jsonEditor {
@ -419,17 +419,28 @@ func (h *indexHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
return
}
jsonPage := pageText != "" && pageText[0] == '{'
jsonPage := pageText != "" && (pageText[0] == '[' || pageText[0] == '{')
if jsonPage {
pageText, err = renderJSON(pageText)
//pageText, err = renderJSON(pageText)
var listItems []struct {
Id int
Indented int
Text string
}
err = json.NewDecoder(strings.NewReader(pageText)).Decode(&listItems)
if err != nil {
http.Error(w, err.Error(), 500)
return
}
pageText = ""
for _, item := range listItems {
pageText += strings.Repeat(" ", item.Indented) + "* " + item.Text + "\n"
}
}
if !jsonPage {
hrefRE := regexp.MustCompile(`#?\[\[\s*([\w.\- ]+)\s*\]\]`)
pageText = hrefRE.ReplaceAllStringFunc(pageText, func(s string) string {
@ -453,7 +464,6 @@ func (h *indexHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
markdown.XHTMLOutput(true),
)
pageText = md.RenderToString([]byte(pageText))
}
data := indexPage{
Session: sess,

View File

@ -33,6 +33,84 @@
align-self: center;
}
</style>
<style>
@import url('https://rsms.me/inter/inter.css');
html { font-family: 'Inter', sans-serif; }
input.input { font-family: 'Inter', sans-serif; }
@supports (font-variation-settings: normal) {
html { font-family: 'Inter var', sans-serif; }
input.input { font-family: 'Inter var', sans-serif; }
}
.list-item {
padding: 3px;
display: flex;
cursor: pointer;
margin-left: 32px;
flex-direction: column;
}
.line {
display: flex;
flex-direction: row;
align-items: center;
}
.marker {
border-radius: 50%;
background: black;
width: 6px;
height: 6px;
display: inline-block;
margin-right: 4px;
}
textarea {
border: none;
resize: none;
}
.selected {
background: lightblue;
}
.editor.selected {
background: none;
}
input.input {
border: none;
outline: none;
margin: 0;
padding: 0;
width: 100%;
font-size: 16px;
}
.gu-mirror {
position: fixed !important;
margin: 0 !important;
z-index: 9999 !important;
opacity: 0.8;
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)";
filter: alpha(opacity=80);
}
.gu-hide {
display: none !important;
}
.gu-unselectable {
-webkit-user-select: none !important;
-moz-user-select: none !important;
-ms-user-select: none !important;
user-select: none !important;
}
.gu-transit {
opacity: 0.2;
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=20)";
filter: alpha(opacity=20);
}
</style>
</head>
<body>
<div class="container">