Advertisement
Guest User

pollen.rkt for "SEO Guide" project

a guest
Apr 2nd, 2023
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Racket 4.26 KB | None | 0 0
  1. #lang racket/base
  2. (require racket/date
  3.          pollen/decode
  4.          txexpr
  5.          pollen/setup)
  6.  
  7. (provide (all-defined-out))
  8.  
  9. (module setup racket/base
  10.   (provide (all-defined-out))
  11.   (define poly-targets '(html txt ltx pdf)))
  12.  
  13. (define rsquo
  14.    (case (current-poly-target)
  15.      [(ltx pdf) "\\textquoteright "]
  16.      [else "’"]))
  17.  
  18. ; BEGIN TAGS
  19.  
  20. (define (p . elements)
  21.   (case (current-poly-target)
  22.     [(ltx pdf) (apply string-append `("" ,@elements "\\par "))]
  23.     [else `(p ,@elements)]))
  24.  
  25. (define (blockquote . elements)
  26.   (case (current-poly-target)
  27.     [(ltx pdf) (apply string-append `( "\\begin{quote}" ,@(filter string? elements) "\\end{quote}"))]
  28.     [else `(blockquote ,@elements)]))
  29.  
  30. (define (ol . elements)
  31.   (case (current-poly-target)
  32.     [(ltx pdf) (apply string-append `( "\\begin{enumerate}" ,@(filter string? elements) "\\end{enumerate}"))]
  33.     [else `(ol ,@elements)]))
  34.  
  35. (define (ul . elements)
  36.   (case (current-poly-target)
  37.     [(ltx pdf) (apply string-append `( "\\begin{itemize}" ,@(filter string? elements) "\\end{itemize}"))]
  38.     [else `(ul ,@elements)]))
  39.  
  40. (define (li . elements)
  41.   (case (current-poly-target)
  42.     [(ltx pdf) (apply string-append `( "\\item " ,@elements))]
  43.     [else `(li ,@elements)]))
  44.  
  45. (define (strong . elements)
  46.   (case (current-poly-target)
  47.     [(ltx pdf) (apply string-append `( "\\textbf{" ,@(filter string? elements) "}"))]
  48.     [else `(strong ,@elements)]))
  49.  
  50. (define (em . elements)
  51.   (case (current-poly-target)
  52.     [(ltx pdf) (apply string-append `( "\\emph{" ,@(filter string? elements) "}"))]
  53.     [else `(em ,@elements)]))
  54.  
  55. (define (h1 . elements)
  56.   (case (current-poly-target)
  57.     [(ltx pdf) (apply string-append `( "\\title{" ,@(filter string? elements) "}"))]
  58.     [else `(h1 ,@elements)]))
  59.  
  60. (define (h2 . elements)
  61.   (case (current-poly-target)
  62.     [(ltx pdf) (apply string-append `( "\\section{" ,@(filter string? elements) "}"))]
  63.     [else `(h2 ,@elements)]))
  64.  
  65. (define (h3 . elements)
  66.   (case (current-poly-target)
  67.     [(ltx pdf) (apply string-append `( "\\subsection{" ,@(filter string? elements) "}"))]
  68.     [else `(h3 ,@elements)]))
  69.  
  70. (define (h4 . elements)
  71.   (case (current-poly-target)
  72.     [(ltx pdf) (apply string-append `( "\\subsubsection{" ,@(filter string? elements) "}"))]
  73.     [else `(h4 ,@elements)]))
  74.  
  75. (define (h5 . elements)
  76.   (case (current-poly-target)
  77.     [(ltx pdf) (apply string-append `( "\\paragraph{" ,@(filter string? elements) "}"))]
  78.     [else `(h5 ,@elements)]))
  79.  
  80. (define (h6 . elements)
  81.   (case (current-poly-target)
  82.     [(ltx pdf) (apply string-append `( "\\subparagraph{" ,@(filter string? elements) "}"))]
  83.     [else `(h6 ,@elements)]))
  84.  
  85. (define (a attrs . elements)
  86.   (case (current-poly-target)
  87.     [(ltx pdf) (apply string-append `( "\\href{" ,(assoc 'href attrs) "}{" ,@(filter string? elements) "}"))]
  88.     [else `(a ,attrs ,@elements)]))
  89.  
  90. (define (img attrs)
  91.   (case (current-poly-target)
  92.     [(ltx pdf) (apply string-append `( "\\includegraphics{" ,(assoc 'src attrs) "}"))]
  93.     [else `(img ,attrs)]))
  94.  
  95. (define (tabular-format rows)
  96.   (define num-cols
  97.     (apply max (map (lambda (row) (length (cdr row))) rows)))
  98.   (string-append "{" (make-string num-cols #\l) "}"))
  99.  
  100. (define (interleave lst1 lst2)
  101.   (if (or (null? lst1) (null? lst2))
  102.       '()
  103.       (cons (car lst1) (cons (car lst2) (interleave (cdr lst1) (cdr lst2))))))
  104.  
  105. (define (repeat x)
  106.   (cons x (repeat x)))
  107.  
  108. (define (table . rows)
  109.   (case (current-poly-target)
  110.     [(ltx pdf) (apply string-append `( "\\begin{tabular}{" ,(tabular-format rows) "}" ,@rows "\\end{tabular}"))]
  111.     [else `(table ,@rows)]))
  112.  
  113. (define (tr . cells)
  114.   (case (current-poly-target)
  115.     [(ltx pdf) (apply string-append `( ,(apply string-append (interleave cells (repeat "&"))) " \\\\"))]
  116.     [else `(tr ,@cells)]))
  117.  
  118. (define (td . elements)
  119.   (case (current-poly-target)
  120.     [(ltx pdf) (apply string-append `( ,@elements))]
  121.     [else `(td ,@elements)]))
  122.  
  123. (define (th . elements)
  124.   (case (current-poly-target)
  125.     [(ltx pdf) (apply string-append `( "\\textbf{" ,@(filter string? elements) "}"))]
  126.     [else `(th ,@elements)]))
  127.  
  128. (define (code . elements)
  129.   (case (current-poly-target)
  130.     [(ltx pdf) (apply string-append `( "\\texttt{" ,@(filter string? elements) "}"))]
  131.     [else `(code ,@elements)]))
  132.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement