Implemented quotes.
This commit is contained in:
parent
bb494f0b65
commit
f6f4e5c888
2 changed files with 66 additions and 1 deletions
62
forum.nim
62
forum.nim
|
|
@ -9,7 +9,7 @@
|
||||||
import
|
import
|
||||||
os, strutils, times, md5, strtabs, cgi, math, db_sqlite, matchers,
|
os, strutils, times, md5, strtabs, cgi, math, db_sqlite, matchers,
|
||||||
rst, rstgen, captchas, scgi, jester, asyncdispatch, asyncnet, cache, sequtils,
|
rst, rstgen, captchas, scgi, jester, asyncdispatch, asyncnet, cache, sequtils,
|
||||||
parseutils, utils
|
parseutils, utils, htmlparser, xmltree, streams
|
||||||
|
|
||||||
when not defined(windows):
|
when not defined(windows):
|
||||||
import bcrypt # TODO
|
import bcrypt # TODO
|
||||||
|
|
@ -419,9 +419,69 @@ proc isPreview(c: TForumData): bool =
|
||||||
proc isDelete(c: TForumData): bool =
|
proc isDelete(c: TForumData): bool =
|
||||||
result = c.req.params.hasKey("delete")
|
result = c.req.params.hasKey("delete")
|
||||||
|
|
||||||
|
proc processGT(n: XmlNode, tag: string): (int, XmlNode, string) =
|
||||||
|
result = (0, newElement(tag), tag)
|
||||||
|
if n.kind == xnElement and len(n) == 1 and n[0].kind == xnElement:
|
||||||
|
return processGT(n[0], if n[0].kind == xnElement: n[0].tag else: tag)
|
||||||
|
|
||||||
|
var countGT = true
|
||||||
|
for c in items(n):
|
||||||
|
case c.kind
|
||||||
|
of xnText:
|
||||||
|
if c.text == ">" and countGT:
|
||||||
|
result[0].inc()
|
||||||
|
else:
|
||||||
|
countGT = false
|
||||||
|
result[1].add(newText(c.text))
|
||||||
|
else:
|
||||||
|
result[1].add(c)
|
||||||
|
|
||||||
|
proc blockquoteFinish(currentBlockquote, newNode: var XmlNode, n: XmlNode) =
|
||||||
|
if currentBlockquote.len > 0:
|
||||||
|
#echo(currentBlockquote.repr)
|
||||||
|
newNode.add(currentBlockquote)
|
||||||
|
currentBlockquote = newElement("blockquote")
|
||||||
|
newNode.add(n)
|
||||||
|
|
||||||
proc rstToHtml(content: string): string =
|
proc rstToHtml(content: string): string =
|
||||||
result = rstgen.rstToHtml(content, {roSupportSmilies, roSupportMarkdown},
|
result = rstgen.rstToHtml(content, {roSupportSmilies, roSupportMarkdown},
|
||||||
docConfig)
|
docConfig)
|
||||||
|
# Bolt on quotes.
|
||||||
|
# TODO: Yes, this is ugly. I wrote it quickly. PRs welcome ;)
|
||||||
|
try:
|
||||||
|
var node = parseHtml(newStringStream(result))
|
||||||
|
var newNode = newElement("document")
|
||||||
|
if node.kind == xnElement:
|
||||||
|
var currentBlockquote = newElement("blockquote")
|
||||||
|
for n in items(node):
|
||||||
|
case n.kind
|
||||||
|
of xnElement:
|
||||||
|
case n.tag
|
||||||
|
of "p":
|
||||||
|
let (nesting, contentNode, tag) = processGT(n, "p")
|
||||||
|
if nesting > 0:
|
||||||
|
var bq = currentBlockquote
|
||||||
|
for i in 1 .. <nesting:
|
||||||
|
var newBq = bq.child("blockquote")
|
||||||
|
if newBq.isNil:
|
||||||
|
newBq = newElement("blockquote")
|
||||||
|
bq.add(newBq)
|
||||||
|
bq = newBq
|
||||||
|
bq.insert(contentNode, if bq.len == 0: 0 else: bq.len)
|
||||||
|
else:
|
||||||
|
blockquoteFinish(currentBlockquote, newNode, n)
|
||||||
|
else:
|
||||||
|
blockquoteFinish(currentBlockquote, newNode, n)
|
||||||
|
of xnText:
|
||||||
|
if n.text[0] == '\10':
|
||||||
|
newNode.add(n)
|
||||||
|
else:
|
||||||
|
blockquoteFinish(currentBlockquote, newNode, n)
|
||||||
|
else:
|
||||||
|
blockquoteFinish(currentBlockquote, newNode, n)
|
||||||
|
result = $newNode
|
||||||
|
except:
|
||||||
|
echo("[WARNING] Could not parse rst html.")
|
||||||
|
|
||||||
proc validateRst(c: var TForumData, content: string): bool =
|
proc validateRst(c: var TForumData, content: string): bool =
|
||||||
result = true
|
result = true
|
||||||
|
|
|
||||||
|
|
@ -706,3 +706,8 @@ blockquote {
|
||||||
border-left: 2px solid rgb(61, 61, 61);
|
border-left: 2px solid rgb(61, 61, 61);
|
||||||
color: rgb(109, 109, 109);
|
color: rgb(109, 109, 109);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
blockquote p {
|
||||||
|
color: rgb(109, 109, 109) !important;
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue