patched https://github.com/niklasfasching/go-org for orgwiki
Since writers are normally only used synchronously (i.e. to write one document at a time), we don't guard modifications to their internal state (e.g. temporarily replacing the string.Builder in WriteNodesAsString) against race conditions. The package global `orgWriter` and corresponding use cases of it (`org.String`, `$node.String`) break that pattern - the writer is potentially used from multiple go routines at the same time. This results in race conditions that manifest as error messages like e.g. could not write output: runtime error: invalid memory address or nil pointer dereference. Using unrendered content. Additionally, since we catch panics in `Document.Write`, the corresponding stack trace is lost and dependents of go-org never know what hit them. As using a writer across simultaneously across go routines is not a standard pattern, we'll sync the use of the global `orgWriter` instead of trying to make the actual writer threadsafe; less code noise for the common use case. |
||
---|---|---|
.github/workflows | ||
blorg | ||
etc | ||
org | ||
.gitignore | ||
go.mod | ||
go.sum | ||
LICENSE | ||
main.go | ||
Makefile | ||
README.org |
go-org
An Org mode parser and static site generator in go. Take a look at github pages
- for org to html conversion examples
- for a static site generated by blorg
- to try it out live in your browser
Please note
- the goal for the html export is to produce sensible html output, not to exactly reproduce the output of
org-html-export
. - the goal for the parser is to support a reasonable subset of Org mode. Org mode is huge and I like to follow the 80/20 rule.
usage
command line
$ go-org
Usage: go-org COMMAND [ARGS]...
Commands:
- render [FILE] FORMAT
FORMAT: org, html, html-chroma
Instead of specifying a file, org mode content can also be passed on stdin
- blorg
- blorg init
- blorg build
- blorg serve
as a library
see main.go and hugo org/convert.go
development
make setup
- change things
make preview
(regenerates fixtures & shows output in a browser)
in general, have a look at the Makefile - it's short enough.
resources
-
test files
- https://orgmode.org/manual/
- https://orgmode.org/worg/dev/org-syntax.html
-
https://code.orgmode.org/bzg/org-mode/src/master/lisp/org.el
- https://code.orgmode.org/bzg/org-mode/src/master/lisp/org-element.el
- mostly those & ox-html.el, but yeah, all of https://code.orgmode.org/bzg/org-mode/src/master/lisp/
- existing Org mode implementations: org, org-ruby, goorgeous, pandoc