Fix bug where multiline paragraphs weren't handled correction
[honey] / src / main / parse.lisp
index 74745bc750e392efe53821b680855b58081d5ebe..45fa1796fc29d86cc084c5ecd016850d3210b2d9 100644 (file)
@@ -49,8 +49,8 @@ DESCRIPTION:
        (append
         (list
          prev
-         (funcall function-to-call (subseq (cdr lines) 0 (or pos (length lines)))))
-        (parse-lines (nthcdr (1+ pos) (cdr lines))))))
+         (funcall function-to-call (subseq (cdr lines) 0 (or pos (1- (length lines))))))
+        (parse-lines (nthcdr (if pos (1+ pos) (length lines)) (cdr lines))))))
      (t (cons prev (parse-lines (cdr lines) parsed-line))))))))
 
 (defun parse-texts (line)
@@ -139,7 +139,11 @@ DESCRIPTION:
    ((textp prev) (values (p prev) t)))))
 
 (defun default (text)
- (lambda (prev) (declare (ignore prev)) text))
+ (lambda (prev)
+  (if
+   (textp prev)
+   (values (as-text (format nil "~A ~A" (cadr prev) (cadr text))) t)
+   text)))
 
 (defun codefence (codetype)
  (lambda (prev)
@@ -163,7 +167,17 @@ DESCRIPTION:
 (defline-parser "### *(.*)" inline-h3)
 (defline-parser "## *(.*)" inline-h2)
 (defline-parser "# *(.*)" inline-h1)
+
+; Ignore codefence
+(defline-parser "(```.*```.*)" default)
+
 (defline-parser "```(.*)" codefence)
+
+; If we start with a space after the asterisk, we really do want a list
+(defline-parser " *\\* (.*)" list-item)
+; Ignore list-tiem
+(defline-parser "(\\*\\*.*\\*\\*.*)" default)
+(defline-parser "(\\*.*\\*.*)" default)
 (defline-parser " *\\* *(.*)" list-item)
 (defline-parser " *" emptiness)
 (defline-parser "(.*)" default)
@@ -177,6 +191,11 @@ DESCRIPTION:
 (defun md-link (before text md-link after)
  (list before (a :href md-link (parse-texts text)) after))
 
+(defun inline-code (before during after)
+ (list before (code during) after))
+
 (definline-parser "(.*)\\[([^\\]]*)\\]\\(([^)]*)\\)(.*)" md-link)
 (definline-parser "(.*)\\*\\*(.*)\\*\\*(.*)" strength)
 (definline-parser "(.*)\\*(.*)\\*(.*)" emphasis)
+(definline-parser "(.*)_(.*)_(.*)" emphasis)
+(definline-parser "(.*)```(.*)```(.*)" inline-code)