Initial commit
This commit is contained in:
commit
51f5e862a3
8 changed files with 467 additions and 0 deletions
7
.gitignore
vendored
Normal file
7
.gitignore
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
*\~
|
||||||
|
*.so
|
||||||
|
*.link
|
||||||
|
*.static.o
|
||||||
|
*.import.scm
|
||||||
|
*.build.sh
|
||||||
|
*.install.sh
|
21
LICENSE
Normal file
21
LICENSE
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2021 Dimitri Lozeve
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
18
README.org
Normal file
18
README.org
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
* Fancy
|
||||||
|
|
||||||
|
Fancy pretty-printing utilities for [[http://call-cc.org/][CHICKEN Scheme]].
|
||||||
|
|
||||||
|
#+ATTR_HTML: :width 100% :style margin-left: auto; margin-right: auto;
|
||||||
|
[[./demo.png]]
|
||||||
|
|
||||||
|
** Features
|
||||||
|
|
||||||
|
- [[https://en.wikipedia.org/wiki/ANSI_escape_code#CSI_(Control_Sequence_Introducer)_sequences][ANSI control codes]] for styling and cursor movement
|
||||||
|
- Table formatting with [[https://unicode-table.com/en/blocks/box-drawing/][Unicode box drawing characters]]
|
||||||
|
- Horizontal rules
|
||||||
|
- Spinners
|
||||||
|
|
||||||
|
** References
|
||||||
|
|
||||||
|
- [[https://notes.burke.libbey.me/ansi-escape-codes/][Everything you never wanted to know about ANSI escape codes]]
|
||||||
|
- [[https://github.com/willmcgugan/rich][Rich]] for Python, especially for their [[https://rich.readthedocs.io/en/latest/markup.html][console markup]] language
|
272
colors.scm
Normal file
272
colors.scm
Normal file
|
@ -0,0 +1,272 @@
|
||||||
|
(define +colors+
|
||||||
|
;; Basic palette
|
||||||
|
'((black . "0")
|
||||||
|
(red . "1")
|
||||||
|
(green . "2")
|
||||||
|
(yellow . "3")
|
||||||
|
(blue . "4")
|
||||||
|
(magenta . "5")
|
||||||
|
(cyan . "6")
|
||||||
|
(white . "7")
|
||||||
|
;; 256-color palette
|
||||||
|
(Black . "8;5;0")
|
||||||
|
(Maroon . "8;5;1")
|
||||||
|
(Green . "8;5;2")
|
||||||
|
(Olive . "8;5;3")
|
||||||
|
(Navy . "8;5;4")
|
||||||
|
(Purple . "8;5;5")
|
||||||
|
(Teal . "8;5;6")
|
||||||
|
(Silver . "8;5;7")
|
||||||
|
(Grey . "8;5;8")
|
||||||
|
(Red . "8;5;9")
|
||||||
|
(Lime . "8;5;10")
|
||||||
|
(Yellow . "8;5;11")
|
||||||
|
(Blue . "8;5;12")
|
||||||
|
(Fuchsia . "8;5;13")
|
||||||
|
(Aqua . "8;5;14")
|
||||||
|
(White . "8;5;15")
|
||||||
|
(Grey0 . "8;5;16")
|
||||||
|
(NavyBlue . "8;5;17")
|
||||||
|
(DarkBlue . "8;5;18")
|
||||||
|
(Blue3 . "8;5;19")
|
||||||
|
(Blue3 . "8;5;20")
|
||||||
|
(Blue1 . "8;5;21")
|
||||||
|
(DarkGreen . "8;5;22")
|
||||||
|
(DeepSkyBlue4 . "8;5;23")
|
||||||
|
(DeepSkyBlue4 . "8;5;24")
|
||||||
|
(DeepSkyBlue4 . "8;5;25")
|
||||||
|
(DodgerBlue3 . "8;5;26")
|
||||||
|
(DodgerBlue2 . "8;5;27")
|
||||||
|
(Green4 . "8;5;28")
|
||||||
|
(SpringGreen4 . "8;5;29")
|
||||||
|
(Turquoise4 . "8;5;30")
|
||||||
|
(DeepSkyBlue3 . "8;5;31")
|
||||||
|
(DeepSkyBlue3 . "8;5;32")
|
||||||
|
(DodgerBlue1 . "8;5;33")
|
||||||
|
(Green3 . "8;5;34")
|
||||||
|
(SpringGreen3 . "8;5;35")
|
||||||
|
(DarkCyan . "8;5;36")
|
||||||
|
(LightSeaGreen . "8;5;37")
|
||||||
|
(DeepSkyBlue2 . "8;5;38")
|
||||||
|
(DeepSkyBlue1 . "8;5;39")
|
||||||
|
(Green3 . "8;5;40")
|
||||||
|
(SpringGreen3 . "8;5;41")
|
||||||
|
(SpringGreen2 . "8;5;42")
|
||||||
|
(Cyan3 . "8;5;43")
|
||||||
|
(DarkTurquoise . "8;5;44")
|
||||||
|
(Turquoise2 . "8;5;45")
|
||||||
|
(Green1 . "8;5;46")
|
||||||
|
(SpringGreen2 . "8;5;47")
|
||||||
|
(SpringGreen1 . "8;5;48")
|
||||||
|
(MediumSpringGreen . "8;5;49")
|
||||||
|
(Cyan2 . "8;5;50")
|
||||||
|
(Cyan1 . "8;5;51")
|
||||||
|
(DarkRed . "8;5;52")
|
||||||
|
(DeepPink4 . "8;5;53")
|
||||||
|
(Purple4 . "8;5;54")
|
||||||
|
(Purple4 . "8;5;55")
|
||||||
|
(Purple3 . "8;5;56")
|
||||||
|
(BlueViolet . "8;5;57")
|
||||||
|
(Orange4 . "8;5;58")
|
||||||
|
(Grey37 . "8;5;59")
|
||||||
|
(MediumPurple4 . "8;5;60")
|
||||||
|
(SlateBlue3 . "8;5;61")
|
||||||
|
(SlateBlue3 . "8;5;62")
|
||||||
|
(RoyalBlue1 . "8;5;63")
|
||||||
|
(Chartreuse4 . "8;5;64")
|
||||||
|
(DarkSeaGreen4 . "8;5;65")
|
||||||
|
(PaleTurquoise4 . "8;5;66")
|
||||||
|
(SteelBlue . "8;5;67")
|
||||||
|
(SteelBlue3 . "8;5;68")
|
||||||
|
(CornflowerBlue . "8;5;69")
|
||||||
|
(Chartreuse3 . "8;5;70")
|
||||||
|
(DarkSeaGreen4 . "8;5;71")
|
||||||
|
(CadetBlue . "8;5;72")
|
||||||
|
(CadetBlue . "8;5;73")
|
||||||
|
(SkyBlue3 . "8;5;74")
|
||||||
|
(SteelBlue1 . "8;5;75")
|
||||||
|
(Chartreuse3 . "8;5;76")
|
||||||
|
(PaleGreen3 . "8;5;77")
|
||||||
|
(SeaGreen3 . "8;5;78")
|
||||||
|
(Aquamarine3 . "8;5;79")
|
||||||
|
(MediumTurquoise . "8;5;80")
|
||||||
|
(SteelBlue1 . "8;5;81")
|
||||||
|
(Chartreuse2 . "8;5;82")
|
||||||
|
(SeaGreen2 . "8;5;83")
|
||||||
|
(SeaGreen1 . "8;5;84")
|
||||||
|
(SeaGreen1 . "8;5;85")
|
||||||
|
(Aquamarine1 . "8;5;86")
|
||||||
|
(DarkSlateGray2 . "8;5;87")
|
||||||
|
(DarkRed . "8;5;88")
|
||||||
|
(DeepPink4 . "8;5;89")
|
||||||
|
(DarkMagenta . "8;5;90")
|
||||||
|
(DarkMagenta . "8;5;91")
|
||||||
|
(DarkViolet . "8;5;92")
|
||||||
|
(Purple . "8;5;93")
|
||||||
|
(Orange4 . "8;5;94")
|
||||||
|
(LightPink4 . "8;5;95")
|
||||||
|
(Plum4 . "8;5;96")
|
||||||
|
(MediumPurple3 . "8;5;97")
|
||||||
|
(MediumPurple3 . "8;5;98")
|
||||||
|
(SlateBlue1 . "8;5;99")
|
||||||
|
(Yellow4 . "8;5;100")
|
||||||
|
(Wheat4 . "8;5;101")
|
||||||
|
(Grey53 . "8;5;102")
|
||||||
|
(LightSlateGrey . "8;5;103")
|
||||||
|
(MediumPurple . "8;5;104")
|
||||||
|
(LightSlateBlue . "8;5;105")
|
||||||
|
(Yellow4 . "8;5;106")
|
||||||
|
(DarkOliveGreen3 . "8;5;107")
|
||||||
|
(DarkSeaGreen . "8;5;108")
|
||||||
|
(LightSkyBlue3 . "8;5;109")
|
||||||
|
(LightSkyBlue3 . "8;5;110")
|
||||||
|
(SkyBlue2 . "8;5;111")
|
||||||
|
(Chartreuse2 . "8;5;112")
|
||||||
|
(DarkOliveGreen3 . "8;5;113")
|
||||||
|
(PaleGreen3 . "8;5;114")
|
||||||
|
(DarkSeaGreen3 . "8;5;115")
|
||||||
|
(DarkSlateGray3 . "8;5;116")
|
||||||
|
(SkyBlue1 . "8;5;117")
|
||||||
|
(Chartreuse1 . "8;5;118")
|
||||||
|
(LightGreen . "8;5;119")
|
||||||
|
(LightGreen . "8;5;120")
|
||||||
|
(PaleGreen1 . "8;5;121")
|
||||||
|
(Aquamarine1 . "8;5;122")
|
||||||
|
(DarkSlateGray1 . "8;5;123")
|
||||||
|
(Red3 . "8;5;124")
|
||||||
|
(DeepPink4 . "8;5;125")
|
||||||
|
(MediumVioletRed . "8;5;126")
|
||||||
|
(Magenta3 . "8;5;127")
|
||||||
|
(DarkViolet . "8;5;128")
|
||||||
|
(Purple . "8;5;129")
|
||||||
|
(DarkOrange3 . "8;5;130")
|
||||||
|
(IndianRed . "8;5;131")
|
||||||
|
(HotPink3 . "8;5;132")
|
||||||
|
(MediumOrchid3 . "8;5;133")
|
||||||
|
(MediumOrchid . "8;5;134")
|
||||||
|
(MediumPurple2 . "8;5;135")
|
||||||
|
(DarkGoldenrod . "8;5;136")
|
||||||
|
(LightSalmon3 . "8;5;137")
|
||||||
|
(RosyBrown . "8;5;138")
|
||||||
|
(Grey63 . "8;5;139")
|
||||||
|
(MediumPurple2 . "8;5;140")
|
||||||
|
(MediumPurple1 . "8;5;141")
|
||||||
|
(Gold3 . "8;5;142")
|
||||||
|
(DarkKhaki . "8;5;143")
|
||||||
|
(NavajoWhite3 . "8;5;144")
|
||||||
|
(Grey69 . "8;5;145")
|
||||||
|
(LightSteelBlue3 . "8;5;146")
|
||||||
|
(LightSteelBlue . "8;5;147")
|
||||||
|
(Yellow3 . "8;5;148")
|
||||||
|
(DarkOliveGreen3 . "8;5;149")
|
||||||
|
(DarkSeaGreen3 . "8;5;150")
|
||||||
|
(DarkSeaGreen2 . "8;5;151")
|
||||||
|
(LightCyan3 . "8;5;152")
|
||||||
|
(LightSkyBlue1 . "8;5;153")
|
||||||
|
(GreenYellow . "8;5;154")
|
||||||
|
(DarkOliveGreen2 . "8;5;155")
|
||||||
|
(PaleGreen1 . "8;5;156")
|
||||||
|
(DarkSeaGreen2 . "8;5;157")
|
||||||
|
(DarkSeaGreen1 . "8;5;158")
|
||||||
|
(PaleTurquoise1 . "8;5;159")
|
||||||
|
(Red3 . "8;5;160")
|
||||||
|
(DeepPink3 . "8;5;161")
|
||||||
|
(DeepPink3 . "8;5;162")
|
||||||
|
(Magenta3 . "8;5;163")
|
||||||
|
(Magenta3 . "8;5;164")
|
||||||
|
(Magenta2 . "8;5;165")
|
||||||
|
(DarkOrange3 . "8;5;166")
|
||||||
|
(IndianRed . "8;5;167")
|
||||||
|
(HotPink3 . "8;5;168")
|
||||||
|
(HotPink2 . "8;5;169")
|
||||||
|
(Orchid . "8;5;170")
|
||||||
|
(MediumOrchid1 . "8;5;171")
|
||||||
|
(Orange3 . "8;5;172")
|
||||||
|
(LightSalmon3 . "8;5;173")
|
||||||
|
(LightPink3 . "8;5;174")
|
||||||
|
(Pink3 . "8;5;175")
|
||||||
|
(Plum3 . "8;5;176")
|
||||||
|
(Violet . "8;5;177")
|
||||||
|
(Gold3 . "8;5;178")
|
||||||
|
(LightGoldenrod3 . "8;5;179")
|
||||||
|
(Tan . "8;5;180")
|
||||||
|
(MistyRose3 . "8;5;181")
|
||||||
|
(Thistle3 . "8;5;182")
|
||||||
|
(Plum2 . "8;5;183")
|
||||||
|
(Yellow3 . "8;5;184")
|
||||||
|
(Khaki3 . "8;5;185")
|
||||||
|
(LightGoldenrod2 . "8;5;186")
|
||||||
|
(LightYellow3 . "8;5;187")
|
||||||
|
(Grey84 . "8;5;188")
|
||||||
|
(LightSteelBlue1 . "8;5;189")
|
||||||
|
(Yellow2 . "8;5;190")
|
||||||
|
(DarkOliveGreen1 . "8;5;191")
|
||||||
|
(DarkOliveGreen1 . "8;5;192")
|
||||||
|
(DarkSeaGreen1 . "8;5;193")
|
||||||
|
(Honeydew2 . "8;5;194")
|
||||||
|
(LightCyan1 . "8;5;195")
|
||||||
|
(Red1 . "8;5;196")
|
||||||
|
(DeepPink2 . "8;5;197")
|
||||||
|
(DeepPink1 . "8;5;198")
|
||||||
|
(DeepPink1 . "8;5;199")
|
||||||
|
(Magenta2 . "8;5;200")
|
||||||
|
(Magenta1 . "8;5;201")
|
||||||
|
(OrangeRed1 . "8;5;202")
|
||||||
|
(IndianRed1 . "8;5;203")
|
||||||
|
(IndianRed1 . "8;5;204")
|
||||||
|
(HotPink . "8;5;205")
|
||||||
|
(HotPink . "8;5;206")
|
||||||
|
(MediumOrchid1 . "8;5;207")
|
||||||
|
(DarkOrange . "8;5;208")
|
||||||
|
(Salmon1 . "8;5;209")
|
||||||
|
(LightCoral . "8;5;210")
|
||||||
|
(PaleVioletRed1 . "8;5;211")
|
||||||
|
(Orchid2 . "8;5;212")
|
||||||
|
(Orchid1 . "8;5;213")
|
||||||
|
(Orange1 . "8;5;214")
|
||||||
|
(SandyBrown . "8;5;215")
|
||||||
|
(LightSalmon1 . "8;5;216")
|
||||||
|
(LightPink1 . "8;5;217")
|
||||||
|
(Pink1 . "8;5;218")
|
||||||
|
(Plum1 . "8;5;219")
|
||||||
|
(Gold1 . "8;5;220")
|
||||||
|
(LightGoldenrod2 . "8;5;221")
|
||||||
|
(LightGoldenrod2 . "8;5;222")
|
||||||
|
(NavajoWhite1 . "8;5;223")
|
||||||
|
(MistyRose1 . "8;5;224")
|
||||||
|
(Thistle1 . "8;5;225")
|
||||||
|
(Yellow1 . "8;5;226")
|
||||||
|
(LightGoldenrod1 . "8;5;227")
|
||||||
|
(Khaki1 . "8;5;228")
|
||||||
|
(Wheat1 . "8;5;229")
|
||||||
|
(Cornsilk1 . "8;5;230")
|
||||||
|
(Grey100 . "8;5;231")
|
||||||
|
(Grey3 . "8;5;232")
|
||||||
|
(Grey7 . "8;5;233")
|
||||||
|
(Grey11 . "8;5;234")
|
||||||
|
(Grey15 . "8;5;235")
|
||||||
|
(Grey19 . "8;5;236")
|
||||||
|
(Grey23 . "8;5;237")
|
||||||
|
(Grey27 . "8;5;238")
|
||||||
|
(Grey30 . "8;5;239")
|
||||||
|
(Grey35 . "8;5;240")
|
||||||
|
(Grey39 . "8;5;241")
|
||||||
|
(Grey42 . "8;5;242")
|
||||||
|
(Grey46 . "8;5;243")
|
||||||
|
(Grey50 . "8;5;244")
|
||||||
|
(Grey54 . "8;5;245")
|
||||||
|
(Grey58 . "8;5;246")
|
||||||
|
(Grey62 . "8;5;247")
|
||||||
|
(Grey66 . "8;5;248")
|
||||||
|
(Grey70 . "8;5;249")
|
||||||
|
(Grey74 . "8;5;250")
|
||||||
|
(Grey78 . "8;5;251")
|
||||||
|
(Grey82 . "8;5;252")
|
||||||
|
(Grey85 . "8;5;253")
|
||||||
|
(Grey89 . "8;5;254")
|
||||||
|
(Grey93 . "8;5;255")))
|
||||||
|
|
||||||
|
(define +bg-colors+
|
||||||
|
(map (lambda (c) `(,(string->symbol (string-append "on-" (symbol->string (car c))))
|
||||||
|
. ,(cdr c)))
|
||||||
|
+colors+))
|
5
fancy.egg
Normal file
5
fancy.egg
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
((author "Dimitri Lozeve")
|
||||||
|
(synopsis "Fancy pretty-printing utilities for CHICKEN Scheme")
|
||||||
|
(license "MIT")
|
||||||
|
(dependencies srfi-1 utf8 srfi-152)
|
||||||
|
(components (extension fancy)))
|
35
fancy.scm
Normal file
35
fancy.scm
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
(module fancy
|
||||||
|
(cursor-up
|
||||||
|
cursor-down
|
||||||
|
cursor-forward
|
||||||
|
cursor-back
|
||||||
|
cursor-next
|
||||||
|
cursor-previous
|
||||||
|
cursor-hor
|
||||||
|
cursor-pos
|
||||||
|
erase-in-display
|
||||||
|
erase-in-line
|
||||||
|
scroll-up
|
||||||
|
scroll-down
|
||||||
|
save-pos
|
||||||
|
restore-pos
|
||||||
|
graphics-rendition-code
|
||||||
|
graphics-style
|
||||||
|
parse-tag
|
||||||
|
parse-markup
|
||||||
|
remove-markup
|
||||||
|
rule)
|
||||||
|
|
||||||
|
(import scheme
|
||||||
|
(chicken base)
|
||||||
|
(chicken format)
|
||||||
|
(chicken irregex)
|
||||||
|
srfi-1
|
||||||
|
utf8
|
||||||
|
srfi-152)
|
||||||
|
|
||||||
|
(include "colors.scm")
|
||||||
|
(include "format.scm")
|
||||||
|
(include "rule.scm")
|
||||||
|
|
||||||
|
)
|
93
format.scm
Normal file
93
format.scm
Normal file
|
@ -0,0 +1,93 @@
|
||||||
|
;; ========================= Constants =========================
|
||||||
|
|
||||||
|
(define +CSI+ "\033[")
|
||||||
|
|
||||||
|
(define +basic-colors+
|
||||||
|
'((black . 0)
|
||||||
|
(red . 1)
|
||||||
|
(green . 2)
|
||||||
|
(yellow . 3)
|
||||||
|
(blue . 4)
|
||||||
|
(magenta . 5)
|
||||||
|
(cyan . 6)
|
||||||
|
(white . 7)))
|
||||||
|
|
||||||
|
(define +basic-bg-colors+
|
||||||
|
'((on-black . 0)
|
||||||
|
(on-red . 1)
|
||||||
|
(on-green . 2)
|
||||||
|
(on-yellow . 3)
|
||||||
|
(on-blue . 4)
|
||||||
|
(on-magenta . 5)
|
||||||
|
(on-cyan . 6)
|
||||||
|
(on-white . 7)))
|
||||||
|
|
||||||
|
(define +re-tags+ (irregex "\\[(/?[a-z ]*?)\\]"))
|
||||||
|
|
||||||
|
|
||||||
|
;; ========================= Control sequences =========================
|
||||||
|
|
||||||
|
(define (cursor-up #!optional (n 1)) (format "~a~aA" +CSI+ n))
|
||||||
|
(define (cursor-down #!optional (n 1)) (format "~a~aB" +CSI+ n))
|
||||||
|
(define (cursor-forward #!optional (n 1)) (format "~a~aC" +CSI+ n))
|
||||||
|
(define (cursor-back #!optional (n 1)) (format "~a~aD" +CSI+ n))
|
||||||
|
(define (cursor-next #!optional (n 1)) (format "~a~aE" +CSI+ n))
|
||||||
|
(define (cursor-previous #!optional (n 1)) (format "~a~aF" +CSI+ n))
|
||||||
|
(define (cursor-hor #!optional (n 1)) (format "~a~aG" +CSI+ n))
|
||||||
|
(define (cursor-pos #!optional (n 1) (m 1)) (format "~a~a;~aH" +CSI+ n m))
|
||||||
|
(define (erase-in-display #!optional (n 0)) (format "~a~aJ" +CSI+ n))
|
||||||
|
(define (erase-in-line #!optional (n 0)) (format "~a~aK" +CSI+ n))
|
||||||
|
(define (scroll-up #!optional (n 1)) (format "~a~aS" +CSI+ n))
|
||||||
|
(define (scroll-down #!optional (n 1)) (format "~a~aT" +CSI+ n))
|
||||||
|
(define (save-pos) (format "~as" +CSI+))
|
||||||
|
(define (restore-pos) (format "~au" +CSI+))
|
||||||
|
|
||||||
|
|
||||||
|
;; ========================= Graphics rendition parameters =========================
|
||||||
|
|
||||||
|
(define (graphics-rendition-code tag)
|
||||||
|
(define basic-color (assoc tag +basic-colors+))
|
||||||
|
(define basic-bg-color (assoc tag +basic-bg-colors+))
|
||||||
|
(cond
|
||||||
|
((eq? tag 'bold) "2")
|
||||||
|
((eq? tag 'italic) "3")
|
||||||
|
((eq? tag 'underline) "4")
|
||||||
|
(basic-color (format "3~a" (cdr basic-color)))
|
||||||
|
(basic-bg-color (format "4~a" (cdr basic-bg-color)))))
|
||||||
|
|
||||||
|
(define (graphics-style #!optional (style '()))
|
||||||
|
(define colors (lset-intersection eq? style (map car +basic-colors+)))
|
||||||
|
(define bg-colors (lset-intersection eq? style (map car +basic-bg-colors+)))
|
||||||
|
(define style-without-colors (lset-difference eq? style
|
||||||
|
(map car +basic-colors+)
|
||||||
|
(map car +basic-bg-colors+)))
|
||||||
|
(define final-style (cons* (unless (null? colors) (car colors))
|
||||||
|
(unless (null? bg-colors) (car bg-colors))
|
||||||
|
style-without-colors))
|
||||||
|
(format "~a~am" +CSI+
|
||||||
|
(string-join (filter string? (map graphics-rendition-code final-style)) ";")))
|
||||||
|
|
||||||
|
|
||||||
|
;; ========================= Console markup =========================
|
||||||
|
|
||||||
|
(define (parse-tag contents #!optional (style '()))
|
||||||
|
(define closing (eq? #\/ (string-ref contents 0)))
|
||||||
|
(define clean-contents (if closing (string-drop contents 1) contents))
|
||||||
|
(define clean-contents (irregex-replace/all "on " clean-contents "on-"))
|
||||||
|
(define tags (map string->symbol (string-split clean-contents " ")))
|
||||||
|
(define new-style (if closing
|
||||||
|
(lset-difference eq? style tags)
|
||||||
|
(lset-union eq? style tags)))
|
||||||
|
(define control-seq (graphics-style new-style))
|
||||||
|
(values control-seq new-style))
|
||||||
|
|
||||||
|
(define (parse-markup text #!optional (style '()))
|
||||||
|
(define match (irregex-search +re-tags+ text))
|
||||||
|
(if match
|
||||||
|
(let-values (((control-seq new-style) (parse-tag (irregex-match-substring match 1) style)))
|
||||||
|
(parse-markup (irregex-replace +re-tags+ text control-seq) new-style))
|
||||||
|
(string-join (list text (graphics-style '())))))
|
||||||
|
|
||||||
|
(define (remove-markup text)
|
||||||
|
(irregex-replace/all +re-tags+ text ""))
|
||||||
|
|
16
rule.scm
Normal file
16
rule.scm
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
(define (rule text #!key (width 80) (style 'simple))
|
||||||
|
(define rule-len (- width (+ 2 (string-length (remove-markup text)))))
|
||||||
|
(define left-len (sub1 (quotient rule-len 2)))
|
||||||
|
(define right-len (sub1 (+ (remainder rule-len 2) (quotient rule-len 2))))
|
||||||
|
(define c (cond
|
||||||
|
((eq? style 'simple) #\━)
|
||||||
|
((eq? style 'double) #\═)
|
||||||
|
((eq? style 'dashed) #\╌)))
|
||||||
|
(string-join
|
||||||
|
(list (make-string left-len c)
|
||||||
|
" "
|
||||||
|
(parse-markup text)
|
||||||
|
" "
|
||||||
|
(make-string right-len c)
|
||||||
|
"\n")))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue