Add stringifier
This commit is contained in:
84
src/org/org_stringifier.nim
Normal file
84
src/org/org_stringifier.nim
Normal file
@@ -0,0 +1,84 @@
|
||||
import std/[
|
||||
options,
|
||||
sequtils,
|
||||
strformat,
|
||||
strutils,
|
||||
sugar,
|
||||
]
|
||||
import fusion/matching
|
||||
import fp/[
|
||||
option,
|
||||
]
|
||||
import ./org_types as orgTypes
|
||||
|
||||
{.experimental: "caseStmtMacros".}
|
||||
|
||||
const HEADING_LEVEL_CHAR = "*"
|
||||
const BOLD_DELIMITER = "*"
|
||||
const ITALIC_DELIMITER = "/"
|
||||
const UNDERLINE_DELIMITER = "_"
|
||||
const VERBATIM_DELIMITER = "="
|
||||
const CODE_DELIMITER = "~"
|
||||
const STRIKETHROUGH_DELIMITER = "+"
|
||||
|
||||
type Env* = ref object
|
||||
|
||||
func init(): Env =
|
||||
Env()
|
||||
|
||||
let defaultEnv = init()
|
||||
|
||||
func wrap(x: string, delimiter: string): string =
|
||||
&"{delimiter}{x}{delimiter}"
|
||||
|
||||
func linkAsText*(url: string, description: Option[string]): string =
|
||||
case description:
|
||||
of (Some(@someDescription)): &"[[{url}][{someDescription}]]"
|
||||
else: &"[[{url}]]"
|
||||
|
||||
func asText*(x: OrgInlineBlock, env = defaultEnv): string =
|
||||
case x.kind:
|
||||
of orgRawText: x.content
|
||||
of orgText: x.content
|
||||
|
||||
# Formating
|
||||
of orgBoldText: x.content.wrap(BOLD_DELIMITER)
|
||||
of orgItalicText: x.content.wrap(ITALIC_DELIMITER)
|
||||
of orgUnderlineText: x.content.wrap(UNDERLINE_DELIMITER)
|
||||
of orgVerbatimText: x.content.wrap(VERBATIM_DELIMITER)
|
||||
of orgCodeText: x.content.wrap(CODE_DELIMITER)
|
||||
of orgStrikeThroughText: x.content.wrap(STRIKETHROUGH_DELIMITER)
|
||||
|
||||
# Links
|
||||
of orgLink: linkAsText(x.linkUrl, x.linkDescription)
|
||||
|
||||
func asText*(o: OrgBlock, env = defaultEnv): string =
|
||||
let stars = HEADING_LEVEL_CHAR.repeat(o.level)
|
||||
|
||||
@[
|
||||
stars.some().notEmpty(),
|
||||
o.todo,
|
||||
o.headlineContent
|
||||
.map((x: OrgInlineBlock) => x.asText())
|
||||
.some()
|
||||
.map((xs: seq[string]) => xs.join(" ")),
|
||||
]
|
||||
.filter(x => x.isSome())
|
||||
.map(x => x.get())
|
||||
.join(" ")
|
||||
|
||||
|
||||
when isMainModule:
|
||||
echo OrgBlock(
|
||||
kind: orgHeading,
|
||||
level: 1,
|
||||
todo: "TODO".some,
|
||||
headlineContent: @[
|
||||
OrgInlineBlock(
|
||||
kind: orgLink,
|
||||
linkUrl: "https://placeholder.com",
|
||||
linkDescription: "Placeholder".some(),
|
||||
),
|
||||
],
|
||||
)
|
||||
.asText()
|
||||
Reference in New Issue
Block a user