Posting from the Desktop
While I have a web interface for manipulating the web site, I've felt having a permanent app running in the systray for posting wherever would remove friction from posting. Time to scratch another code itch and pull up VSCode.
Code
My source code is up at https://github.com/colinmo/vonblog-gui. Breaking it down:
src/bitbucket.go
has the Bitbucket API interaction codesrc/httpclient.go
has the generic http interaction override code, so test scripts can mock Bitbucket APIsrc/main.go
is the base code, where I also included thefyne
code for making a GUI executablesrc/markdown-template.go
has HTML snippets to wrap around HTML-ified markdown to see what the post looks likesrc/parse-file.go
has code I snagged from myvonblog
app to parse Markdown to HTMLsrc/post-struct.go
has the structure of a post (frontmatter, etc.)src/validator.go
validates submitted code, and has some parse-guesses to convert weird date formats
Application



The gui can currently:
- Browse folders in Bitbucket/blog to find a file to edit
- Create a new markdown file for editing locally
- Save (commit+push) a markdown file to Bitbucket - any selected media files go too
- Preview the markdown
- Popup a window with extended post metadata (e.g. a Resume or Review have additional types; indieweb posts have specific codes)
- Browse local folders for media to upload.
- Create my
gallery
tag around media selected to upload automatically - I keep forgetting how to do blockquotes, so I added a blockquote button
Learnings
To adjust selected text in the widget.Entry
you manipulate the clipboard.
1oldClipboard := mainWindow.Clipboard().Content()
2mainWindow.Clipboard().SetContent(string(textToAdd))
3s := &fyne.ShortcutPaste{Clipboard: mainWindow.Clipboard()}
4markdownInput.TypedShortcut(s)
5mainWindow.Clipboard().SetContent(oldClipboard)
The multipart
library is a must use for multipart uploading. It makes file uploads much easier.
I have to remember to use omitentry
in structs
to stop blank entries showing everywhere.
1type FrontMatter struct {
2 Created string `yaml:"Created"`
3 Updated string `yaml:"Updated,omitempty"`
I will have to extract some of my common Markdown and Frontmatter handling functions to another library, so I can include that in both vonblog
the blog builder and vonpost
the GUI post system. Duplication is problematic.
By adding contenteditable="true" spellcheck="true"
to the HTML preview template, my browser will highlight spelling issues for me to look at. Without me needing to add a spell checker to my code. Cheating!
The authorisation is now using BitBucket's OAuth interface for the APIs rather than username/ password plugging into the interface, which makes me feel safer at least.