Command line client for Write.as https://write.as/apps/cli
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

64 lines
1.8 KiB

  1. package posts
  2. import (
  3. "github.com/microcosm-cc/bluemonday"
  4. "github.com/writeas/saturday"
  5. "regexp"
  6. "strings"
  7. "unicode"
  8. )
  9. var (
  10. blockReg = regexp.MustCompile("<(ul|ol|blockquote)>\n")
  11. endBlockReg = regexp.MustCompile("</([a-z]+)>\n</(ul|ol|blockquote)>")
  12. markeddownReg = regexp.MustCompile("<p>(.+)</p>")
  13. )
  14. func ApplyMarkdown(data []byte) string {
  15. mdExtensions := 0 |
  16. blackfriday.EXTENSION_TABLES |
  17. blackfriday.EXTENSION_FENCED_CODE |
  18. blackfriday.EXTENSION_AUTOLINK |
  19. blackfriday.EXTENSION_STRIKETHROUGH |
  20. blackfriday.EXTENSION_SPACE_HEADERS |
  21. blackfriday.EXTENSION_HEADER_IDS
  22. htmlFlags := 0 |
  23. blackfriday.HTML_USE_SMARTYPANTS |
  24. blackfriday.HTML_SMARTYPANTS_DASHES
  25. // Generate Markdown
  26. md := blackfriday.Markdown([]byte(data), blackfriday.HtmlRenderer(htmlFlags, "", ""), mdExtensions)
  27. // Strip out bad HTML
  28. policy := bluemonday.UGCPolicy()
  29. policy.AllowAttrs("class", "id").Globally()
  30. outHTML := string(policy.SanitizeBytes(md))
  31. // Strip newlines on certain block elements that render with them
  32. outHTML = blockReg.ReplaceAllString(outHTML, "<$1>")
  33. outHTML = endBlockReg.ReplaceAllString(outHTML, "</$1></$2>")
  34. return outHTML
  35. }
  36. func ApplyBasicMarkdown(data []byte) string {
  37. mdExtensions := 0 |
  38. blackfriday.EXTENSION_STRIKETHROUGH |
  39. blackfriday.EXTENSION_SPACE_HEADERS |
  40. blackfriday.EXTENSION_HEADER_IDS
  41. htmlFlags := 0 |
  42. blackfriday.HTML_SKIP_HTML |
  43. blackfriday.HTML_USE_SMARTYPANTS |
  44. blackfriday.HTML_SMARTYPANTS_DASHES
  45. // Generate Markdown
  46. md := blackfriday.Markdown([]byte(data), blackfriday.HtmlRenderer(htmlFlags, "", ""), mdExtensions)
  47. // Strip out bad HTML
  48. policy := bluemonday.UGCPolicy()
  49. policy.AllowAttrs("class", "id").Globally()
  50. outHTML := string(policy.SanitizeBytes(md))
  51. outHTML = markeddownReg.ReplaceAllString(outHTML, "$1")
  52. outHTML = strings.TrimRightFunc(outHTML, unicode.IsSpace)
  53. return outHTML
  54. }