mirror of
https://github.com/schollz/cowyo.git
synced 2023-08-10 21:13:00 +03:00
Storing DIffs now...might not be compatible?
Former-commit-id: ce50508705b9727b310059116a2c07d2154d7a80 [formerly 5a63af13359b5a8a3d963c014517c709151312cc] [formerly 0703fe06fc408947ca4d70b97cba99e02c75879f [formerly 965989530c
]]
Former-commit-id: 9575b9b87113bd6a2ff0186464671666bbac18cf [formerly f825477fd790918e8d9247e3a540da391dbc687a]
Former-commit-id: 0c1e92517cc0e5ad864135711535021b4c170f19
This commit is contained in:
parent
8b0511b0e7
commit
021e5d5a8e
25
db.go
25
db.go
@ -7,6 +7,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/boltdb/bolt"
|
"github.com/boltdb/bolt"
|
||||||
|
"github.com/sergi/go-diff/diffmatchpatch"
|
||||||
)
|
)
|
||||||
|
|
||||||
var db *bolt.DB
|
var db *bolt.DB
|
||||||
@ -33,11 +34,13 @@ func Close() {
|
|||||||
|
|
||||||
// Data for storing in DB
|
// Data for storing in DB
|
||||||
type CowyoData struct {
|
type CowyoData struct {
|
||||||
Title string
|
Title string
|
||||||
Text string
|
CurrentText string
|
||||||
|
Diffs []string
|
||||||
|
Timestamps []string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *CowyoData) load() error {
|
func (p *CowyoData) load(title string) error {
|
||||||
if !open {
|
if !open {
|
||||||
return fmt.Errorf("db must be opened before saving!")
|
return fmt.Errorf("db must be opened before saving!")
|
||||||
}
|
}
|
||||||
@ -47,9 +50,14 @@ func (p *CowyoData) load() error {
|
|||||||
if b == nil {
|
if b == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
k := []byte(p.Title)
|
k := []byte(title)
|
||||||
val := b.Get(k)
|
val := b.Get(k)
|
||||||
if val == nil {
|
if val == nil {
|
||||||
|
// make new one
|
||||||
|
p.Title = title
|
||||||
|
p.CurrentText = ""
|
||||||
|
p.Diffs = []string{}
|
||||||
|
p.Timestamps = []string{}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
err = p.decode(val)
|
err = p.decode(val)
|
||||||
@ -65,7 +73,7 @@ func (p *CowyoData) load() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *CowyoData) save() error {
|
func (p *CowyoData) save(newText string) error {
|
||||||
if !open {
|
if !open {
|
||||||
return fmt.Errorf("db must be opened before saving")
|
return fmt.Errorf("db must be opened before saving")
|
||||||
}
|
}
|
||||||
@ -74,6 +82,13 @@ func (p *CowyoData) save() error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("create bucket: %s", err)
|
return fmt.Errorf("create bucket: %s", err)
|
||||||
}
|
}
|
||||||
|
// find diffs
|
||||||
|
dmp := diffmatchpatch.New()
|
||||||
|
diffs := dmp.DiffMain(p.CurrentText, newText, true)
|
||||||
|
delta := dmp.DiffToDelta(diffs)
|
||||||
|
p.CurrentText = newText
|
||||||
|
p.Timestamps = append(p.Timestamps, time.Now().String())
|
||||||
|
p.Diffs = append(p.Diffs, delta)
|
||||||
enc, err := p.encode()
|
enc, err := p.encode()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("could not encode CowyoData: %s", err)
|
return fmt.Errorf("could not encode CowyoData: %s", err)
|
||||||
|
8
main.go
8
main.go
@ -55,10 +55,14 @@ Options:`)
|
|||||||
defer Close()
|
defer Close()
|
||||||
|
|
||||||
// Default page
|
// Default page
|
||||||
p := CowyoData{"about", about_page}
|
p := CowyoData{"about", about_page, []string{}, []string{}}
|
||||||
p.save()
|
p.save(about_page)
|
||||||
fmt.Println(about_page)
|
fmt.Println(about_page)
|
||||||
|
|
||||||
|
var q CowyoData
|
||||||
|
q.load("SpikySeaSlug")
|
||||||
|
rebuildTexts(q)
|
||||||
|
|
||||||
r := gin.Default()
|
r := gin.Default()
|
||||||
r.LoadHTMLGlob("templates/*")
|
r.LoadHTMLGlob("templates/*")
|
||||||
r.GET("/", newNote)
|
r.GET("/", newNote)
|
||||||
|
26
routes.go
26
routes.go
@ -56,12 +56,12 @@ func serveStaticFile(c *gin.Context, option string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func renderMarkdown(c *gin.Context, title string) {
|
func renderMarkdown(c *gin.Context, title string) {
|
||||||
p := CowyoData{strings.ToLower(title), ""}
|
var p CowyoData
|
||||||
err := p.load()
|
err := p.load(strings.ToLower(title))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
unsafe := blackfriday.MarkdownCommon([]byte(p.Text))
|
unsafe := blackfriday.MarkdownCommon([]byte(p.CurrentText))
|
||||||
html := bluemonday.UGCPolicy().SanitizeBytes(unsafe)
|
html := bluemonday.UGCPolicy().SanitizeBytes(unsafe)
|
||||||
html2 := string(html)
|
html2 := string(html)
|
||||||
|
|
||||||
@ -126,13 +126,13 @@ func renderList(c *gin.Context, title string) {
|
|||||||
if strings.ToLower(title) == "about" { //}&& strings.Contains(AllowedIPs, c.ClientIP()) != true {
|
if strings.ToLower(title) == "about" { //}&& strings.Contains(AllowedIPs, c.ClientIP()) != true {
|
||||||
c.Redirect(302, "/about/view")
|
c.Redirect(302, "/about/view")
|
||||||
}
|
}
|
||||||
p := CowyoData{strings.ToLower(title), ""}
|
var p CowyoData
|
||||||
err := p.load()
|
err := p.load(strings.ToLower(title))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
listItems, _ := reorderList(p.Text)
|
listItems, _ := reorderList(p.CurrentText)
|
||||||
|
|
||||||
c.HTML(http.StatusOK, "list.tmpl", gin.H{
|
c.HTML(http.StatusOK, "list.tmpl", gin.H{
|
||||||
"Title": title,
|
"Title": title,
|
||||||
@ -144,25 +144,25 @@ func deleteListItem(c *gin.Context) {
|
|||||||
lineNum, err := strconv.Atoi(c.DefaultQuery("lineNum", "None"))
|
lineNum, err := strconv.Atoi(c.DefaultQuery("lineNum", "None"))
|
||||||
title := c.Query("title") // shortcut for c.Request.URL.Query().Get("lastname")
|
title := c.Query("title") // shortcut for c.Request.URL.Query().Get("lastname")
|
||||||
if err == nil {
|
if err == nil {
|
||||||
p := CowyoData{strings.ToLower(title), ""}
|
var p CowyoData
|
||||||
err := p.load()
|
err := p.load(strings.ToLower(title))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
_, listItems := reorderList(p.Text)
|
_, listItems := reorderList(p.CurrentText)
|
||||||
|
newText := p.CurrentText
|
||||||
for i, lineString := range listItems {
|
for i, lineString := range listItems {
|
||||||
// fmt.Println(i, lineString, lineNum)
|
// fmt.Println(i, lineString, lineNum)
|
||||||
if i+1 == lineNum {
|
if i+1 == lineNum {
|
||||||
// fmt.Println("MATCHED")
|
// fmt.Println("MATCHED")
|
||||||
if strings.Contains(lineString, "~~") == false {
|
if strings.Contains(lineString, "~~") == false {
|
||||||
// fmt.Println(p.Text, "("+lineString[2:]+"\n"+")", "~~"+lineString[2:]+"~~"+"\n")
|
// fmt.Println(p.Text, "("+lineString[2:]+"\n"+")", "~~"+lineString[2:]+"~~"+"\n")
|
||||||
p.Text = strings.Replace(p.Text+"\n", lineString[2:]+"\n", "~~"+lineString[2:]+"~~"+"\n", 1)
|
newText = strings.Replace(newText+"\n", lineString[2:]+"\n", "~~"+lineString[2:]+"~~"+"\n", 1)
|
||||||
} else {
|
} else {
|
||||||
p.Text = strings.Replace(p.Text+"\n", lineString[2:]+"\n", lineString[4:len(lineString)-2]+"\n", 1)
|
newText = strings.Replace(newText+"\n", lineString[2:]+"\n", lineString[4:len(lineString)-2]+"\n", 1)
|
||||||
}
|
}
|
||||||
p.save()
|
p.save(newText)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
BIN
static/img/gomascot.png
Executable file
BIN
static/img/gomascot.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 10 KiB |
BIN
static/img/raspberrypi.png
Executable file
BIN
static/img/raspberrypi.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 8.6 KiB |
30
utils.go
30
utils.go
@ -1,9 +1,12 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/sergi/go-diff/diffmatchpatch"
|
||||||
)
|
)
|
||||||
|
|
||||||
var animals []string
|
var animals []string
|
||||||
@ -30,7 +33,7 @@ Be cautious about writing sensitive information in the notes as anyone with the
|
|||||||
|
|
||||||
Have fun.
|
Have fun.
|
||||||
|
|
||||||
**Powered by Raspberry Pi 2** ![jk](http://kodi.tv/wp-content/uploads/DL_Icons_RaspberryPi-new.png)`
|
**Powered by Raspberry Pi and Go** ![Raspberry Pi](/static/img/raspberrypi.png) ![Go Mascot](/static/img/gomascot.png)`
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -70,3 +73,28 @@ func contentType(filename string) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var about_page string
|
var about_page string
|
||||||
|
|
||||||
|
func diffRebuildtexts(diffs []diffmatchpatch.Diff) []string {
|
||||||
|
text := []string{"", ""}
|
||||||
|
for _, myDiff := range diffs {
|
||||||
|
if myDiff.Type != diffmatchpatch.DiffInsert {
|
||||||
|
text[0] += myDiff.Text
|
||||||
|
}
|
||||||
|
if myDiff.Type != diffmatchpatch.DiffDelete {
|
||||||
|
text[1] += myDiff.Text
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return text
|
||||||
|
}
|
||||||
|
|
||||||
|
func rebuildTexts(p CowyoData) {
|
||||||
|
dmp := diffmatchpatch.New()
|
||||||
|
current := ""
|
||||||
|
for i, diff := range p.Diffs {
|
||||||
|
seq1, _ := dmp.DiffFromDelta(current, diff)
|
||||||
|
texts_linemode := diffRebuildtexts(seq1)
|
||||||
|
rebuilt := texts_linemode[len(texts_linemode)-1]
|
||||||
|
fmt.Println(i, p.Timestamps[i], rebuilt)
|
||||||
|
current = rebuilt
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -4,7 +4,6 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/gorilla/websocket"
|
"github.com/gorilla/websocket"
|
||||||
)
|
)
|
||||||
@ -40,21 +39,24 @@ func wshandler(w http.ResponseWriter, r *http.Request) {
|
|||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var p CowyoData
|
||||||
|
err = p.load(m.Title)
|
||||||
|
fmt.Println("LOADED")
|
||||||
|
fmt.Println(p)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
if m.UpdateServer {
|
if m.UpdateServer {
|
||||||
p := CowyoData{strings.ToLower(m.Title), m.TextData}
|
err := p.save(m.TextData)
|
||||||
err := p.save()
|
fmt.Println("SAVED")
|
||||||
|
fmt.Println(p)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if m.UpdateClient {
|
if m.UpdateClient {
|
||||||
p := CowyoData{strings.ToLower(m.Title), ""}
|
m.UpdateClient = len(m.TextData) != len(p.CurrentText)
|
||||||
err := p.load()
|
m.TextData = p.CurrentText
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
m.UpdateClient = len(m.TextData) != len(p.Text)
|
|
||||||
m.TextData = p.Text
|
|
||||||
}
|
}
|
||||||
newMsg, err := json.Marshal(m)
|
newMsg, err := json.Marshal(m)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
Loading…
Reference in New Issue
Block a user