diff --git a/editor/src/editor.js b/editor/src/editor.js
index 4e56ff1..f97c3d8 100644
--- a/editor/src/editor.js
+++ b/editor/src/editor.js
@@ -369,7 +369,7 @@ function Editor(holder, input) {
transformTable.call(this, editor, id, element);
return
} else if (converted.startsWith("```", 0) || converted.startsWith("$$", 0)) {
- converted = MD.render(converted)
+ converted = MD.renderInline(converted)
} else if (converted.startsWith("=", 0)) {
transformMathExpression(converted, scope)
.then(converted => {
diff --git a/editor/src/sr.js b/editor/src/sr.js
index 52cfce2..7cede12 100644
--- a/editor/src/sr.js
+++ b/editor/src/sr.js
@@ -5,18 +5,24 @@ import qs from "querystring";
function fillResult($modal, result) {
$modal.data('block-id', result.id)
$modal.data('block-original-text', result.line)
+ let visibleText = result.line.replace(/\s*#\S+/g, '').trim();
+ $modal.data('block-text-without-tags', visibleText)
$modal.find('.block-title').show().text(result.title)
- $modal.find('.block-text').show().val(result.line)
+ $modal.find('.block-text').show().val(visibleText)
}
-function replaceBlock(id, oldText) {
- return fetch('/api/block/replace', {
+async function replaceBlock(id, oldText) {
+ if (oldText === false) return false;
+
+ await fetch('/api/block/replace', {
method: 'post',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: qs.encode({id, text: oldText}),
});
+
+ return true
}
function appendBlock(id, newText) {
@@ -30,13 +36,12 @@ function appendBlock(id, newText) {
}
function resetSRBox(text) {
- let newText = text.replace(/#(?:\[\[)?sr\/(\d+)(?:\]\])?/, '#sr/1');
- return newText;
+ return text + " #review #sr/1"
}
function processSRBox(review, originalText) {
let oldText = originalText
- .replace(/#(?:\[\[)?sr\/(\d+)(?:\]\])?/, function (text, srCount) {
+ .replace(/#sr\/(\d+)/, function (text, srCount) {
if (review === 'never') return '';
let nextCount = 1;
const count = parseInt(srCount)
@@ -45,15 +50,22 @@ function processSRBox(review, originalText) {
if (review === 'later') nextCount = count + 1
return '#sr/' + nextCount;
}).trim()
- if (review === 'never') return oldText.replace(/#(?:\[\[)?review(?:\]\])?/, '')
+ if (review === 'never') return oldText.replace(/#review/, '')
+ if (oldText === originalText) return false
return oldText
}
$(function () {
let reviewBlocks = [];
+ let isSR = false;
- $('.start-review').on('click', function () {
- search.startQuery('+tag:review +tag:sr/1', {internal: false}).then((results) => {
+ $('.start-review, .start-sr').on('click', function () {
+ isSR = $(this).hasClass('start-sr')
+
+ // Use different queries for different days
+ const query = isSR ? '+tag:sr tag:"sr/1" tag:"sr/2"' : '+tag:review tag:"sr/1"'
+
+ search.startQuery(query, {internal: false}).then((results) => {
reviewBlocks = results
$('.review-modal .end-of-review').hide();
@@ -81,16 +93,21 @@ $(function () {
window.location.reload()
});
+ $('.modal .show-answer').on('click', function () {
+ $('.review-modal .block-answer').show();
+ });
+
$('.modal .review').on('click', function () {
const $modal = $(this).parents('.modal')
const review = $(this).data('review')
// NOTE: should we keep the review and sr/* tag in the editable text?
const originalText = $modal.data('block-original-text')
+ const originalTextWithoutTags = $modal.data('block-text-without-tags')
let text = $modal.find('.block-text').val()
let id = $modal.data('block-id')
- processText(review, text, originalText, id)
+ processText(review, text, originalTextWithoutTags, originalText, id)
.then(() => {
if (reviewBlocks.length > 0) {
const first = reviewBlocks.shift()
@@ -109,8 +126,8 @@ $(function () {
}).catch(e => console.log(e))
});
- async function processText(review, text, originalText, id) {
- if (text !== originalText) {
+ async function processText(review, text, originalTextWithoutTags, originalText, id) {
+ if (text !== originalTextWithoutTags) {
await appendBlock(id, resetSRBox(text))
}
await replaceBlock(id, processSRBox(review, originalText))
diff --git a/editor/src/wikilinks2.js b/editor/src/wikilinks2.js
index 788fac3..5660616 100644
--- a/editor/src/wikilinks2.js
+++ b/editor/src/wikilinks2.js
@@ -64,6 +64,10 @@ Plugin.prototype.parse = function (state, silent) {
Plugin.prototype.render = function (tokens, id, options, env) {
let {match: link, tag} = tokens[id].meta
if (tag) {
+ if (tag === 'metadata') {
+ let {key, value} = tokens[id].meta
+ return ''+key+': '+value;
+ }
if (link === 'TODO') {
return '';
} else if (link === 'DONE') {
diff --git a/file.go b/file.go
index 37bfb6c..491b410 100644
--- a/file.go
+++ b/file.go
@@ -586,7 +586,7 @@ func saveLinksIncremental(dirname, title string) error {
titles[title] = true
results = nil
- for t, _ := range titles {
+ for t := range titles {
results = append(results, Document{t})
}
diff --git a/main.go b/main.go
index 3a1fe3a..49ba2ee 100644
--- a/main.go
+++ b/main.go
@@ -1130,16 +1130,24 @@ func main() {
http.Error(w, "missing id", 400)
return
}
- repo := blockRepo{
- dirname: "data",
- }
+ repo := blockRepo{dirname: "data"}
block, err := repo.Load(id)
block.Text = r.Form.Get("text")
err = repo.Save(id, block)
+ // update search index
searchObjects, err := createSearchObjects(id)
+ batch := searchIndex.NewBatch()
for _, so := range searchObjects {
- searchIndex.Index(so.ID, so)
+ err = batch.Index(so.ID, so)
+ if err != nil {
+ log.Println(err)
+ }
}
+ err = searchIndex.Batch(batch)
+ if err != nil {
+ log.Println(err)
+ }
+ // TODO: update backlinks
return
}))
http.HandleFunc("/api/block/append", wrapAuth(func(w http.ResponseWriter, r *http.Request) {
@@ -1168,6 +1176,7 @@ func main() {
block.Children = append(block.Children, generatedID)
err = repo.Save(id, block)
+ // update search index
searchObjects, err := createSearchObjects(id)
spew.Dump("searchObjects", searchObjects)
diff --git a/search.go b/search.go
index 7b7705d..e66ae87 100644
--- a/search.go
+++ b/search.go
@@ -29,7 +29,6 @@ import (
"github.com/blevesearch/bleve/v2"
"github.com/blevesearch/bleve/v2/mapping"
- "github.com/davecgh/go-spew/spew"
"github.com/iancoleman/strcase"
)
@@ -214,7 +213,7 @@ func (s *searchHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
sr := bleve.NewSearchRequest(q)
sr.IncludeLocations = false
sr.Size = 25
- sr.Fields = []string{"page", "title", "text", "date"}
+ sr.Fields = []string{"page", "title", "text", "date", "parent"}
sr.Highlight = bleve.NewHighlightWithStyle("html")
sr.Highlight.AddField("text")
results, err := s.searchIndex.Search(sr)
@@ -230,13 +229,16 @@ func (s *searchHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
}
type pageBlock struct {
- ID string `json:"id"`
- Title string `json:"title"`
- Page string `json:"page"`
- Text string `json:"text"`
- Link []string `json:"link"`
- Tag []string `json:"tag"`
- Date []time.Time `json:"date"`
+ ID string `json:"id"`
+ Parent string `json:"parent"`
+ Title string `json:"title"`
+ Page string `json:"page"`
+ Text string `json:"text"`
+ Link []string `json:"link"`
+ Tag []string `json:"tag"`
+ Date []time.Time `json:"date"`
+ Key string `json:"key"`
+ Value string `json:"value"`
}
func (p pageBlock) Type() string {
@@ -293,23 +295,26 @@ func createSearchObjects(rootBlockID string) ([]pageBlock, error) {
dates = append(dates, pageDate)
}
- pageBlocks = append(pageBlocks, pageBlock{
- ID: current,
- Title: blocks.Texts[blocks.PageID],
- Page: blocks.PageID,
- Text: blocks.Texts[current],
- Link: linkNames,
- Tag: tags,
- Date: dates,
- })
+ block := pageBlock{
+ ID: current,
+ Parent: blocks.ParentID,
+ Title: blocks.Texts[blocks.PageID],
+ Page: blocks.PageID,
+ Text: blocks.Texts[current],
+ Link: linkNames,
+ Tag: tags,
+ Date: dates,
+ }
+
+ if kvpair := strings.SplitN(blocks.Texts[current], "::", 2); len(kvpair) == 2 {
+ block.Key = strings.TrimSpace(kvpair[0])
+ block.Value = strings.TrimSpace(kvpair[1])
+ }
+ pageBlocks = append(pageBlocks, block)
queue = append(queue, blocks.Children[current]...)
}
- if rootBlockID == "Henk_Stuifzand" {
- spew.Dump(pageBlocks)
- }
-
return pageBlocks, nil
}
diff --git a/templates/view.html b/templates/view.html
index abefd1d..f04a37c 100644
--- a/templates/view.html
+++ b/templates/view.html
@@ -58,6 +58,7 @@
Graph
Today
Review
+ SR
Logout
{{ $.Session.Me }}
{{ else }}