From d58ebeab5223100b673f320d864f88e7ef7bde37 Mon Sep 17 00:00:00 2001 From: Gibheer Date: Fri, 25 Mar 2022 14:41:22 +0100 Subject: [PATCH] update to new generator --- Makefile | 5 +- config.toml | 11 - content/about.md | 11 - content/author/gibheer.md | 5 +- content/author/stormwind.md | 1 + content/index.md | 135 + content/post/40.md | 4 +- content/post/64.md | 12 +- content/post/65.md | 24 +- content/post/66.md | 16 +- content/post/67.md | 4 +- content/post/68.md | 12 +- content/post/69.md | 8 +- content/post/70.md | 18 +- content/post/71.md | 24 +- content/post/72.md | 48 +- content/post/73.md | 116 +- content/post/74.md | 178 +- content/post/75.md | 8 +- content/post/77.md | 258 +- content/post/78.md | 18 +- content/post/79.md | 182 +- content/post/80.md | 28 +- content/post/81.md | 2 +- content/post/82.md | 34 +- content/post/83.md | 166 +- content/post/84.md | 28 +- content/post/85.md | 52 +- content/post/86.md | 12 +- content/post/87.md | 8 +- content/post/88.md | 16 +- content/post/89.md | 56 +- content/post/90.md | 32 +- content/post/91.md | 20 +- content/post/92.md | 172 +- content/post/93.md | 90 +- content/post/94.md | 112 +- content/post/95.md | 36 +- content/post/96.md | 272 +- content/post/97.md | 50 +- go.mod | 5 + go.sum | 2 + main.go | 217 ++ static/go-mono/Go-Mono-Bold-Italic.ttf | Bin 0 -> 173600 bytes static/go-mono/Go-Mono-Bold.ttf | Bin 0 -> 164936 bytes static/go-mono/Go-Mono-Italic.ttf | Bin 0 -> 169824 bytes static/go-mono/Go-Mono.ttf | Bin 0 -> 160760 bytes static/go-mono/README | 36 + .../static/img => static}/zero-knowledge.png | Bin templates/content.html | 14 + templates/footer.html | 1 + templates/header.html | 37 + templates/index.html | 8 + themes/zero/layouts/_default/list.html | 3 - themes/zero/layouts/_default/si.html | 28 - themes/zero/layouts/_default/single.html | 3 - themes/zero/layouts/_default/summary.html | 11 - themes/zero/layouts/index.html | 3 - themes/zero/layouts/partials/footer.html | 2 - themes/zero/layouts/partials/header.html | 15 - themes/zero/layouts/partials/li.html | 21 - themes/zero/layouts/post/summary.html | 15 - themes/zero/static/css/style.css | 154 -- themes/zero/static/img/background.png | Bin 85937 -> 0 bytes themes/zero/static/img/grunge_readme.txt | 8 - .../russross/blackfriday/v2/.gitignore | 8 + .../russross/blackfriday/v2/.travis.yml | 17 + .../russross/blackfriday/v2/LICENSE.txt | 29 + .../russross/blackfriday/v2/README.md | 335 +++ .../russross/blackfriday/v2/block.go | 1612 ++++++++++++ .../github.com/russross/blackfriday/v2/doc.go | 46 + .../russross/blackfriday/v2/entities.go | 2236 +++++++++++++++++ .../github.com/russross/blackfriday/v2/esc.go | 70 + .../russross/blackfriday/v2/html.go | 952 +++++++ .../russross/blackfriday/v2/inline.go | 1228 +++++++++ .../russross/blackfriday/v2/markdown.go | 950 +++++++ .../russross/blackfriday/v2/node.go | 360 +++ .../russross/blackfriday/v2/smartypants.go | 457 ++++ vendor/modules.txt | 3 + 79 files changed, 9824 insertions(+), 1346 deletions(-) delete mode 100644 config.toml delete mode 100644 content/about.md create mode 100644 content/index.md create mode 100644 go.mod create mode 100644 go.sum create mode 100644 main.go create mode 100644 static/go-mono/Go-Mono-Bold-Italic.ttf create mode 100644 static/go-mono/Go-Mono-Bold.ttf create mode 100644 static/go-mono/Go-Mono-Italic.ttf create mode 100644 static/go-mono/Go-Mono.ttf create mode 100644 static/go-mono/README rename {themes/zero/static/img => static}/zero-knowledge.png (100%) create mode 100644 templates/content.html create mode 100644 templates/footer.html create mode 100644 templates/header.html create mode 100644 templates/index.html delete mode 100644 themes/zero/layouts/_default/list.html delete mode 100644 themes/zero/layouts/_default/si.html delete mode 100644 themes/zero/layouts/_default/single.html delete mode 100644 themes/zero/layouts/_default/summary.html delete mode 100644 themes/zero/layouts/index.html delete mode 100644 themes/zero/layouts/partials/footer.html delete mode 100644 themes/zero/layouts/partials/header.html delete mode 100644 themes/zero/layouts/partials/li.html delete mode 100644 themes/zero/layouts/post/summary.html delete mode 100644 themes/zero/static/css/style.css delete mode 100644 themes/zero/static/img/background.png delete mode 100644 themes/zero/static/img/grunge_readme.txt create mode 100644 vendor/github.com/russross/blackfriday/v2/.gitignore create mode 100644 vendor/github.com/russross/blackfriday/v2/.travis.yml create mode 100644 vendor/github.com/russross/blackfriday/v2/LICENSE.txt create mode 100644 vendor/github.com/russross/blackfriday/v2/README.md create mode 100644 vendor/github.com/russross/blackfriday/v2/block.go create mode 100644 vendor/github.com/russross/blackfriday/v2/doc.go create mode 100644 vendor/github.com/russross/blackfriday/v2/entities.go create mode 100644 vendor/github.com/russross/blackfriday/v2/esc.go create mode 100644 vendor/github.com/russross/blackfriday/v2/html.go create mode 100644 vendor/github.com/russross/blackfriday/v2/inline.go create mode 100644 vendor/github.com/russross/blackfriday/v2/markdown.go create mode 100644 vendor/github.com/russross/blackfriday/v2/node.go create mode 100644 vendor/github.com/russross/blackfriday/v2/smartypants.go create mode 100644 vendor/modules.txt diff --git a/Makefile b/Makefile index 0ab243f..8fa2c64 100644 --- a/Makefile +++ b/Makefile @@ -13,8 +13,11 @@ FILEMODE = 444 all: clean build +dev: + go run main.go --content-dir content --template-dir templates --static-dir static --listen "127.0.0.1:8080" + build: - hugo + go run main.go --content-dir content --template-dir templates --static-dir static --output-dir $(HTTPDIR) clean: -rm -r public/* diff --git a/config.toml b/config.toml deleted file mode 100644 index 93bf53d..0000000 --- a/config.toml +++ /dev/null @@ -1,11 +0,0 @@ -baseurl = "" -languageCode = "en-us" -title = "zero-knowledge" -theme = "zero" -SectionPagesMenu = "main" -Paginate = 12 -disableRSS = false - -[taxonomies] - author = "author" - tag = "tags" diff --git a/content/about.md b/content/about.md deleted file mode 100644 index 0cfdd1e..0000000 --- a/content/about.md +++ /dev/null @@ -1,11 +0,0 @@ -+++ -date = "2015-10-11T20:00:29+02:00" -draft = true -title = "about" - -+++ - -## about zero-knowledge - -This blog is the personal blog of Gibheer and Stormwind, where we write about -any topic from IT which keeps us working at the moment. diff --git a/content/author/gibheer.md b/content/author/gibheer.md index 4b73ddd..f44f58f 100644 --- a/content/author/gibheer.md +++ b/content/author/gibheer.md @@ -1,6 +1,7 @@ +++ title = "Gibheer" date = "2015-11-04T12:23:00+02:00" +url = "/author/Gibheer" +++ ## about me @@ -17,8 +18,8 @@ learn from it and try it another way next time. Most of the stuff I try in private are online either on github or my own git server. What isn't code, I try to write down on the blog. -As for social media, I'm on [freenode](irc://irc.freenode.org/) under the nick -Gibheer. +As for social media, I'm on [libera.chat](ircs://irc.libera.chat:6697) with the nick +'Gibheer'. ## links diff --git a/content/author/stormwind.md b/content/author/stormwind.md index 06bde06..85c970a 100644 --- a/content/author/stormwind.md +++ b/content/author/stormwind.md @@ -1,6 +1,7 @@ +++ title = "Stormwind" date = "2015-11-04T12:40:00+02:00" +url = "/author/Stormwind" +++ introduction diff --git a/content/index.md b/content/index.md new file mode 100644 index 0000000..95e8a51 --- /dev/null +++ b/content/index.md @@ -0,0 +1,135 @@ ++++ +title = "blog" +author = "gibheer" +url = "/" +template = "index.html" ++++ + +This blog is maintained by [Gibheer](/author/Gibheer) and [Stormwind](/author/Stormwind) +about various topics. + + * [link summary 2016/07/08](post/127.md) + * [poudriere in jails with zfs](post/126.md) + * [gotchas with IPs and Jails](post/125.md) + * [link summary 2016/04/09](post/124.md) + * [json/curl to go](post/123.md) + * [configuring raids on freebsd](post/122.md) + * [fast application locks](post/121.md) + * [new blog engine](post/120.md) + * [ssh certificates part 2](post/119.md) + * [ssh certificates part 1](post/118.md) + * [S.M.A.R.T. values](post/117.md) + * [minimal nginx configuration](post/115.md) + * [pgstats - vmstat like stats for postgres](post/114.md) + * [setting zpool features](post/113.md) + * [using unbound and dnsmasq](post/112.md) + * [common table expressions in postgres](post/111.md) + * [range types in postgres](post/110.md) + * [learning the ansible way](post/109.md) + * [playing with go](post/108.md) + * [no cfengine anymore](post/107.md) + * [scan to samba share with HP Officejet pro 8600](post/106.md) + * [\[cfengine\] log to syslog](post/105.md) + * [overhaul of the blog](post/104.md) + * [block mails for unknown users](post/103.md) + * [choosing a firewall on freebsd](post/102.md) + * [use dovecot to store mails with lmtp](post/100.md) + * [grub can't read zpool](post/99.md) + * [sysidcfg replacement on omnios](post/98.md) + * [filter program logs in freebsd syslog](post/97.md) + * [moving a zone between zpools](post/96.md) + * [compile errors on omnios with llvm](post/95.md) + * [inner and natural joins](post/94.md) + * [release of zero 0.1.0](post/93.md) + * [building a multi instance postgres systemd service](post/92.md) + * [automatic locking of the screen](post/91.md) + * [rotate log files with logadm](post/90.md) + * [Solaris SMF on linux with systemd](post/89.md) + * [create encrypted password for postgresql](post/88.md) + * [extend PATH in Makefile](post/87.md) + * [touchpad keeps scrolling](post/86.md) + * [Schwarze Seelen brauchen bunte Socken 2012.1](post/85.md) + * [Backups with ZFS over the wire](post/84.md) + * [the Illumos eco system](post/83.md) + * [archlinux + rubygems = gem executables will not run](post/82.md) + * [Lustige Gehversuche mit... verschlüsselten Festplatten](post/81.md) + * [find cycle detected](post/80.md) + * [openindiana - getting rubinius to work](post/79.md) + * [openindiana - curl CA failure](post/78.md) + * [openindiana - set up ssh with kerberos authentication](post/77.md) + * [great resource to ipfilter](post/76.md) + * [openindiana - ntpd does not start](post/75.md) + * [openindiana - how to configure a zone](post/74.md) + * [openindiana - how to get routing working](post/73.md) + * [How to use sysidcfg for zone deployment](post/72.md) + * [set environment variables in smf manifests](post/71.md) + * [get pfexec back in Solaris](post/70.md) + * [Solaris - a new way to 'ifconfig'](post/69.md) + * [OpenIndiana 151a released](post/68.md) + * [PostgreSQL 9.1 was released](post/67.md) + * [SmartOS - hype and a demo iso](post/66.md) + * [SmartOS - a new Solaris](post/65.md) + * [neues Lebenszeichen - neuer Blog](post/64.md) + * [Accesslogs in die Datenbank](post/63.md) + * [Schwarze Seelen brauchen bunte Socken - Teil 3](post/62.md) + * [Technik hinter dem neuen Blog](post/61.md) + * [jede Menge Umzuege](post/60.md) + * [DTrace fuer den Linuxlator in FreeBSD](post/59.md) + * [daily zfs snapshots](post/58.md) + * [Dokumentation in Textile schreiben](post/57.md) + * [Shells in anderen Sprachen](post/56.md) + * [ZFS Versionen](post/55.md) + * [Spielwahn mit Wasser](post/54.md) + * [FreeBSD Status Report Juli - September 2010](post/53.md) + * [Spass mit test-driven development](post/52.md) + * [dtrace userland in FreeBSD head](post/51.md) + * [Alle Tabellen einer DB loeschen mit PostgreSQL 9.0](post/50.md) + * [Shellbefehle im Vim ausfuehren](post/49.md) + * [zero-knowledge mit IPv6 Teil 2](post/48.md) + * [[Rubyconf 2009] Worst Ideas Ever](post/47.md) + * [Nachfolger von Tex](post/46.md) + * [Linux und Windows im Auto](post/45.md) + * [zero-knowledge jetzt auch per IPv6](post/44.md) + * [Der Drackenzackenschal](post/43.md) + * [Kalender auf der Konsole](post/42.md) + * [NetBeans 6.9 released](post/41.md) + * [Das Wollefest in Nierstein](post/40.md) + * [PostgreSQL - mehrere Werte aus einer Funktion](post/39.md) + * [Schwarze Seelen brauchen bunte Socken - Teil 2](post/38.md) + * [Serverumzug vollendet](post/37.md) + * [MySQL kann Datensaetze \"zerreissen\"](post/36.md) + * [Umzug mit OpenSolaris 20x0.xx](post/35.md) + * [Blub gibt es ab sofort auch fuer unterwegs](post/34.md) + * [OpenSolaris Zones mit statischer IP](post/33.md) + * [Blog nicht da](post/32.md) + * [gefaehrliches Spiel fuer das n900](post/31.md) + * [neuer CLI-Client fuer XMMS2](post/30.md) + * [Claws Mail laeuft auf OpenSolaris](post/29.md) + * [publisher contains only packages from other publisher](post/28.md) + * [PostgreSQL 8.4 in OpenSolaris](post/27.md) + * [mit PHP Mailadressen validieren](post/26.md) + * [Lustige Gehversuche mit ...](post/25.md) + * [Performance, Programme und viel Musik](post/24.md) + * [von Linux zu OpenSolaris](post/23.md) + * [Gibheers zsh-config](post/22.md) + * [Crossbow mit Solaris Containern](post/21.md) + * [Lustige Gehversuche mit Gentoo/FreeBSD](post/20.md) + * [Heidelbeertigerarmstulpen](post/19.md) + * [OpenVPN unter OpenSolaris](post/18.md) + * [OpenSolaris Wiki](post/17.md) + * [OpenSolaris ohne Reboot updaten](post/16.md) + * [einzelne Pakete unter OpenSolaris updaten](post/15.md) + * [Rails mit Problemen unter OpenSolaris](post/14.md) + * [Wie wenig braucht OpenSolaris?](post/13.md) + * [das eklige Gesicht XMLs](post/12.md) + * [Dokumentation fuer (Open)Solaris](post/11.md) + * [Woche der Updates](post/10.md) + * [Was ist XMMS2?](post/9.md) + * [Rack und XMMS2](post/8.md) + * [Webserver unter Ruby](post/7.md) + * [Symbole in Ruby](post/6.md) + * [Schwarze Seelen brauchen bunte Socken](post/5.md) + * [Zero-knowledge spielt wieder Icewars](post/4.md) + * [Serendipity als Blog?](post/3.md) + * [Indizes statt Tabellen](post/2.md) + * [zero-knowledge ohne Forum](post/1.md) diff --git a/content/post/40.md b/content/post/40.md index 6e23f8b..e168171 100644 --- a/content/post/40.md +++ b/content/post/40.md @@ -36,8 +36,8 @@ naja, jetzt brauche ich unbedingt ganz viel Wolle. Hier nochmal ein Dank an Nathalie und ihre Mutter, die beide den Workshop betreut haben. Das hat echt Spaß gemacht und ich denke ich werde auch in Zukunft noch ganz viel zumspinnen. :)\ -!(float\_right)/images/wolle4.jpg(4 Knaeule bunte Wolle vom -Wolldrachen)!\ +![4 Knaeule bunte Wolle vom Wolldrachen](/static/pics/wolle4.jpg) + Desweiteren muss ich erzählen, dass der [Wolldrache](http://drachenwolle.de/) auch hier mit ihrem Stand zu finden war. Und das gemeinerweise direkt am Anfang des Festplatzes. diff --git a/content/post/64.md b/content/post/64.md index d975959..d3f5a56 100644 --- a/content/post/64.md +++ b/content/post/64.md @@ -5,10 +5,10 @@ author = "Gibheer" draft = false +++ -Nachdem es hier lange Still war, gibt es mal wieder ein Update. In der zwischenzeit haben wir den Blog auf eine eigene Software umgezogen, weil uns Jekyll nicht gepasst hat. Fuer mich war es zwar einfach von der Konsole aus die Beitraege zu verfassen, allerdings fehlte die Moeglichkeit auch mal von unterwegs "schnell" etwas zu verfassen. - -Nun haben wir eine eigene Blogsoftware (die auch auf github liegt). Mal schauen wie gut wir damit zurecht kommen. Im Gegensatz zu jekyll generieren wir keine statischen Files, sondern der Content wird in der Datenbank gespeichert und bei jedem Request neu generiert. Das ist im Moment noch etwas langsam, aber da werd ich noch was bauen, damit das besser passt. - -Es wird noch eine Kommentarfunktion hinzukommen und es ist geplant unterschiedliche Typen von Blogposts machen zu koennen. Ersteres wird wahrscheinlich recht einfach werden, letztes ist im Moment nur eine grobe Idee in meinem Kopf. - +Nachdem es hier lange Still war, gibt es mal wieder ein Update. In der zwischenzeit haben wir den Blog auf eine eigene Software umgezogen, weil uns Jekyll nicht gepasst hat. Fuer mich war es zwar einfach von der Konsole aus die Beitraege zu verfassen, allerdings fehlte die Moeglichkeit auch mal von unterwegs "schnell" etwas zu verfassen. + +Nun haben wir eine eigene Blogsoftware (die auch auf github liegt). Mal schauen wie gut wir damit zurecht kommen. Im Gegensatz zu jekyll generieren wir keine statischen Files, sondern der Content wird in der Datenbank gespeichert und bei jedem Request neu generiert. Das ist im Moment noch etwas langsam, aber da werd ich noch was bauen, damit das besser passt. + +Es wird noch eine Kommentarfunktion hinzukommen und es ist geplant unterschiedliche Typen von Blogposts machen zu koennen. Ersteres wird wahrscheinlich recht einfach werden, letztes ist im Moment nur eine grobe Idee in meinem Kopf. + Es ist auf jeden Fall ein nettes Experiment und mal schauen, wie es sich in Zukunft weiter entwickeln wird. diff --git a/content/post/65.md b/content/post/65.md index 64a1e0a..01a70a1 100644 --- a/content/post/65.md +++ b/content/post/65.md @@ -5,16 +5,16 @@ author = "Gibheer" draft = false +++ -Some minutes ago I saw on [hacker news](http://news.ycombinator.com/) the following line [Joyent Open Sources SmartOS: Zones, ZFS, DTrace and KVM (smartos.org)](http://smartos.org/). -Who is behind SmartOS? -====================== - -What does that mean? I took a look and it seems, that Joyent, the company behind [node.js](http://nodejs.org/), has released their distribution of [Illumos](https://www.illumos.org/). -After the merge of sun and oracle, OpenSolaris as a project was closed in favor of Solaris11. As OpenSolaris was OpenSource the project Illumos emerged from the remains of OpenSolaris, but there was no release of the Illumos kernel in any project till now. - -So what is different? -===================== - -The first things I saw on their page are dtrace zfs and zones. So it's a standard solaris. But there is more: *KVM*! If the existence of zones means also, that it has crossbow and resource limits, then it would be absolutely gorgeous! It would be possible to build the core services on solaris zones and on top of that multiple dev or production machines with linux, windows or whatever you want. - +Some minutes ago I saw on [hacker news](http://news.ycombinator.com/) the following line [Joyent Open Sources SmartOS: Zones, ZFS, DTrace and KVM (smartos.org)](http://smartos.org/). +Who is behind SmartOS? +====================== + +What does that mean? I took a look and it seems, that Joyent, the company behind [node.js](http://nodejs.org/), has released their distribution of [Illumos](https://www.illumos.org/). +After the merge of sun and oracle, OpenSolaris as a project was closed in favor of Solaris11. As OpenSolaris was OpenSource the project Illumos emerged from the remains of OpenSolaris, but there was no release of the Illumos kernel in any project till now. + +So what is different? +===================== + +The first things I saw on their page are dtrace zfs and zones. So it's a standard solaris. But there is more: *KVM*! If the existence of zones means also, that it has crossbow and resource limits, then it would be absolutely gorgeous! It would be possible to build the core services on solaris zones and on top of that multiple dev or production machines with linux, windows or whatever you want. + I will test it first in a virtual box to see, how stable and usable it really is, as there is no documentation on the website yet. After my test I will report back. diff --git a/content/post/66.md b/content/post/66.md index f898e00..875f024 100644 --- a/content/post/66.md +++ b/content/post/66.md @@ -5,12 +5,12 @@ author = "Gibheer" draft = false +++ -So, there is this new distribution of Illumos, [SmartOS](http://smartos.org) but it's not as ready as they claimed. Sure, there is an ISO but that ISO has no installer and no package manager. So one of the crucial part for using SmartOS is missing. - -As Joyent wrote on the [blog](http://blog.smartos.org) they are working on a wiki and the documentation and this night, they showed the [wiki](http://wiki.smartos.org). Until now there is only a documentation on how to use the usb image which got released the same time. But i think, that there will be much more coming. - -At the same time I found out, that kvm was released into the Illumos core too, so that kvm will be available with every other distribution too. And [OpenIndiana](http://openindiana.org) said, they want it in their 151 release too. 151 was planned to be released some months ago, so let's see, how fast they can get that out to the users. - -Joyent too should release a real distribution as fast as they can, because they created a large hype for SmartOS, but have nothing to use it in production. The ports are missing and an upgrade path is missing too. They wrote, that they are already using it in production, so why did they not release that? - +So, there is this new distribution of Illumos, [SmartOS](http://smartos.org) but it's not as ready as they claimed. Sure, there is an ISO but that ISO has no installer and no package manager. So one of the crucial part for using SmartOS is missing. + +As Joyent wrote on the [blog](http://blog.smartos.org) they are working on a wiki and the documentation and this night, they showed the [wiki](http://wiki.smartos.org). Until now there is only a documentation on how to use the usb image which got released the same time. But i think, that there will be much more coming. + +At the same time I found out, that kvm was released into the Illumos core too, so that kvm will be available with every other distribution too. And [OpenIndiana](http://openindiana.org) said, they want it in their 151 release too. 151 was planned to be released some months ago, so let's see, how fast they can get that out to the users. + +Joyent too should release a real distribution as fast as they can, because they created a large hype for SmartOS, but have nothing to use it in production. The ports are missing and an upgrade path is missing too. They wrote, that they are already using it in production, so why did they not release that? + Illumos, OpenIndiana and Joyent with SmartOS are missing a big chance here to make that fork of OpenSolaris popular. They created much traction, but without having something, which could be used in production. We will see, how fast they can react. Hopefully, the release of either OpenIndiana or SmartOS, will be useable and stable in production. Then, they have a chance of getting me as an user. diff --git a/content/post/67.md b/content/post/67.md index 1de80eb..6be6061 100644 --- a/content/post/67.md +++ b/content/post/67.md @@ -5,6 +5,6 @@ author = "Gibheer" draft = false +++ -Yesterday PostgreSQL 9.1 was released. It has some neat features included, like writable common table expressions, synchronized replication and unlogged tables. Apart from that, some performance tuning was included as well. - +Yesterday PostgreSQL 9.1 was released. It has some neat features included, like writable common table expressions, synchronized replication and unlogged tables. Apart from that, some performance tuning was included as well. + If you are interested, take a look yourself at the [release notes](http://www.postgresql.org/about/news.1349) diff --git a/content/post/68.md b/content/post/68.md index b56debe..61d072e 100644 --- a/content/post/68.md +++ b/content/post/68.md @@ -5,10 +5,10 @@ author = "Gibheer" draft = false +++ -After the release of [PostgreSQL 9.1](http://www.postgresql.org/about/news.1349), today another great open source project released a new version - [OpenIndiana](http://wiki.openindiana.org/oi/oi_151a+Release+Notes). - -OpenIndiana is based on a fork of OpenSolaris, named [Illumos](http://illumos.org). It was announced in august 2010. OpenIndiana has evolved since that time and got a stable release 148 and today 151a. That release is very solid and got one thing, which Solaris 11 has and most likely will never have: *KVM*. - -So from today you get a Solaris fork with crossbow, resource containers, zones and the kernel virtual machine, converted from linux to Illumos from the developers of [Joyent](http://joyent.com). They built there own distribution, [SmartOS](http://smartos.org), which is a bootable OS for managing a cloud like setup but without the zones. - +After the release of [PostgreSQL 9.1](http://www.postgresql.org/about/news.1349), today another great open source project released a new version - [OpenIndiana](http://wiki.openindiana.org/oi/oi_151a+Release+Notes). + +OpenIndiana is based on a fork of OpenSolaris, named [Illumos](http://illumos.org). It was announced in august 2010. OpenIndiana has evolved since that time and got a stable release 148 and today 151a. That release is very solid and got one thing, which Solaris 11 has and most likely will never have: *KVM*. + +So from today you get a Solaris fork with crossbow, resource containers, zones and the kernel virtual machine, converted from linux to Illumos from the developers of [Joyent](http://joyent.com). They built there own distribution, [SmartOS](http://smartos.org), which is a bootable OS for managing a cloud like setup but without the zones. + So if you have a large Infrastructure and want to seperate some programs from each other or have some old infrastructure, try OpenIndiana and it's zones and kvm. diff --git a/content/post/69.md b/content/post/69.md index e803e2e..f68cf80 100644 --- a/content/post/69.md +++ b/content/post/69.md @@ -5,8 +5,8 @@ author = "Gibheer" draft = true +++ -kleinere Hilfestellungen zu ipadm - -http://192.9.164.72/bin/view/Project+brussels/ifconfig_ipadm_feature_mapping -http://arc.opensolaris.org/caselog/PSARC/2010/080/materials/ipadm.1m.txt +kleinere Hilfestellungen zu ipadm + +http://192.9.164.72/bin/view/Project+brussels/ifconfig_ipadm_feature_mapping +http://arc.opensolaris.org/caselog/PSARC/2010/080/materials/ipadm.1m.txt http://blog.allanglesit.com/2011/03/solaris-11-network-configuration-basics/ diff --git a/content/post/70.md b/content/post/70.md index e7c6834..70f9744 100644 --- a/content/post/70.md +++ b/content/post/70.md @@ -5,13 +5,13 @@ author = "Gibheer" draft = false +++ -If you tried Solaris 11 or OpenIndiana in a fresh installation, you may have noticed, that pfexec may not work the way you are used to. I asked in #openindiana on `irc.freenode.org` and I was told, that the behavior was changed. OpenSolaris was used to have an `Primary Administrator` profile which got assigned to the first account created on the installation. The problem with that is the same as on Windows - you are doing everything with the administrator or root account. To avoid that, sudo was introduced, which needs the password of your account with the default settings. What both tools are very different at what they do and at what they are good at. So it's up to the administrator to define secure roles where appropriate and use sudo rules for the parts, which have to be more secured. - -If you want back the old behavior, these two steps should be enough. But keep in mind, that it is important that you secure your system, to avoid misuse. - -* there should be line like the following in `/etc/security/prof_attr` -`Primary Administrator:::Can perform all administrative tasks:auths=solaris.*,solaris.grant;help=RtPriAdmin.html` -* if there is, then you can add that profile to your user with -`usermod -P'Primary Administrator` - +If you tried Solaris 11 or OpenIndiana in a fresh installation, you may have noticed, that pfexec may not work the way you are used to. I asked in #openindiana on `irc.freenode.org` and I was told, that the behavior was changed. OpenSolaris was used to have an `Primary Administrator` profile which got assigned to the first account created on the installation. The problem with that is the same as on Windows - you are doing everything with the administrator or root account. To avoid that, sudo was introduced, which needs the password of your account with the default settings. What both tools are very different at what they do and at what they are good at. So it's up to the administrator to define secure roles where appropriate and use sudo rules for the parts, which have to be more secured. + +If you want back the old behavior, these two steps should be enough. But keep in mind, that it is important that you secure your system, to avoid misuse. + +* there should be line like the following in `/etc/security/prof_attr` +`Primary Administrator:::Can perform all administrative tasks:auths=solaris.*,solaris.grant;help=RtPriAdmin.html` +* if there is, then you can add that profile to your user with +`usermod -P'Primary Administrator` + It is possible to combine these two mechanics too. You could build a zone to ssh into the box with a key and from there, ssh with sudo and a password into the internal systems. diff --git a/content/post/71.md b/content/post/71.md index 9f55752..3124aa5 100644 --- a/content/post/71.md +++ b/content/post/71.md @@ -5,16 +5,16 @@ author = "Gibheer" draft = false +++ -If you are in the need to set an environment variable for an smf service, you are looking for envvar. It get's set in the `service` scope or in the `exec_method` scope. Here is a small example, how it's used. - -``` - - - - - - - -``` - +If you are in the need to set an environment variable for an smf service, you are looking for envvar. It get's set in the `service` scope or in the `exec_method` scope. Here is a small example, how it's used. + +``` + + + + + + + +``` + This example sets the environment variable `FOO` to bar. This is espacially useful, when you have to modify `PATH` or `LD_LIBRARY_PATH`. Just don't forget, that you did it. diff --git a/content/post/72.md b/content/post/72.md index 28c3642..27b7686 100644 --- a/content/post/72.md +++ b/content/post/72.md @@ -5,28 +5,28 @@ author = "Gibheer" draft = false +++ -This is mostly for myself that I can remember how to use the least documented feature of Solaris and openindiana - the `sysidcfg` files. - -These files help deploying new zones faster, as you don't have to configure them by hand afterwards. But what is the syntax and how can you use them? - -Here is an example file - - name_service=NONE - # name_service=DNS {domain_name= name_server=} - nfs4_domain=dynamic - timezone=Europe/Stockholm - terminal=xterms - root_password= - security_policy=NONE - network_interface= {primary hostname= default_route= ip_address= netmask= protocol_ipv6=yes} - network_interface= {hostname= ip_address= netmask= protocol_ipv6=yes default_route=NONE}` - -The most important thing first: you don't need system_locale after openindiana 151 anymore. If you have it in your config, even with C, delete it or else the setup will not work! - -If you don't have a dns record for your zone yet, set the @name_service@ to NONE. If you have already a record set, use the commented syntax. - -The next interesting setting is root_password. Here you don't input the password in cleartext but crypted. I wrote a little script to generate this string. You can find the code [here](https://github.com/Gibheer/zero-pwcrypter). - -The network_interface part is pretty easy, if you take these lines as a dummy. If you have only one interface, you can name the first interface PRIMARY. That way, you have a bit less to write. - +This is mostly for myself that I can remember how to use the least documented feature of Solaris and openindiana - the `sysidcfg` files. + +These files help deploying new zones faster, as you don't have to configure them by hand afterwards. But what is the syntax and how can you use them? + +Here is an example file + + name_service=NONE + # name_service=DNS {domain_name= name_server=} + nfs4_domain=dynamic + timezone=Europe/Stockholm + terminal=xterms + root_password= + security_policy=NONE + network_interface= {primary hostname= default_route= ip_address= netmask= protocol_ipv6=yes} + network_interface= {hostname= ip_address= netmask= protocol_ipv6=yes default_route=NONE}` + +The most important thing first: you don't need system_locale after openindiana 151 anymore. If you have it in your config, even with C, delete it or else the setup will not work! + +If you don't have a dns record for your zone yet, set the @name_service@ to NONE. If you have already a record set, use the commented syntax. + +The next interesting setting is root_password. Here you don't input the password in cleartext but crypted. I wrote a little script to generate this string. You can find the code [here](https://github.com/Gibheer/zero-pwcrypter). + +The network_interface part is pretty easy, if you take these lines as a dummy. If you have only one interface, you can name the first interface PRIMARY. That way, you have a bit less to write. + That's all so far. I will update this post, when I have figured out, what to fill into nfs4_domain and security_policy. diff --git a/content/post/73.md b/content/post/73.md index b328c5f..d0ea642 100644 --- a/content/post/73.md +++ b/content/post/73.md @@ -5,62 +5,62 @@ author = "Gibheer" draft = false +++ -This time, we are going to get routing working on the global zone for our other zones. You can replace the global zone with another zone too, as the setup is the same. - -What's needed? -============== - -First, we need to install ipfilter, if it isn't already installed. To do that, just invoke - - # pkg install ipfilter - -This will install the package filter and NAT engine. Latter is the part, we want to use now. - -We will asume, that the global zone has to interfaces with the following setup - -* bge0 -> 192.168.4.1/24 -* bge1 -> 192.168.5.1/24 - -configure ipnat -=============== - -With `ipnat` installed, we need to write a small configuration. For this example, we set up routing for every machine in the subnet. - -For that, open the file `/etc/ipf/ipnat.conf` and write the following lines: - - map bge0 192.168.5.0/24 -> 0/32 portmap tcp/udp auto - map bge0 192.168.5.0/24 -> 0/32 - -These two lines say, that all packages from the subnet to the rest shall be relabeled and forwarded. - -After that, all we need to do is enable the ipfilter and the routing deamons with the following commands. - - # svcadm enable ipfilter - # routeadm -e ipv4-forwarding - # routeadm -e ipv4-routing - # routeadm -u - -The last command checks if all deamons are running according to the settings. To see, which settings are set and what the deamons are doing, run the `routeadm` command without any arguments. - -configure the zone -================== - -Now we fire up the zone to test, if we can get anywhere near routing. In our case, the zone only has one interface, so that it detects the router itself per icmp. - -We can prove that very easy with - - # netstat -rn - -The default gateway should point to our global zone. To make a last test, you can ping an ip in another subnet. If the global zone says, this host is alive, the zone should do too. - -A good IP to test is 8.8.8.8, as it is really easy to remember. - -That was all. Have fun with your access - -links and hints -=============== - -You can get some more documentation to ipfilter and routing in the man pages of ipnat, ipf and routeadm. Some example rule sets for ipf can be found in `/usr/share/ipfilter/examples/nat.eg`. - -* [a rough setup of routing](http://blog.kevinvandervlist.nl/2011/06/openindiana-zone-with-nat/) +This time, we are going to get routing working on the global zone for our other zones. You can replace the global zone with another zone too, as the setup is the same. + +What's needed? +============== + +First, we need to install ipfilter, if it isn't already installed. To do that, just invoke + + # pkg install ipfilter + +This will install the package filter and NAT engine. Latter is the part, we want to use now. + +We will asume, that the global zone has to interfaces with the following setup + +* bge0 -> 192.168.4.1/24 +* bge1 -> 192.168.5.1/24 + +configure ipnat +=============== + +With `ipnat` installed, we need to write a small configuration. For this example, we set up routing for every machine in the subnet. + +For that, open the file `/etc/ipf/ipnat.conf` and write the following lines: + + map bge0 192.168.5.0/24 -> 0/32 portmap tcp/udp auto + map bge0 192.168.5.0/24 -> 0/32 + +These two lines say, that all packages from the subnet to the rest shall be relabeled and forwarded. + +After that, all we need to do is enable the ipfilter and the routing deamons with the following commands. + + # svcadm enable ipfilter + # routeadm -e ipv4-forwarding + # routeadm -e ipv4-routing + # routeadm -u + +The last command checks if all deamons are running according to the settings. To see, which settings are set and what the deamons are doing, run the `routeadm` command without any arguments. + +configure the zone +================== + +Now we fire up the zone to test, if we can get anywhere near routing. In our case, the zone only has one interface, so that it detects the router itself per icmp. + +We can prove that very easy with + + # netstat -rn + +The default gateway should point to our global zone. To make a last test, you can ping an ip in another subnet. If the global zone says, this host is alive, the zone should do too. + +A good IP to test is 8.8.8.8, as it is really easy to remember. + +That was all. Have fun with your access + +links and hints +=============== + +You can get some more documentation to ipfilter and routing in the man pages of ipnat, ipf and routeadm. Some example rule sets for ipf can be found in `/usr/share/ipfilter/examples/nat.eg`. + +* [a rough setup of routing](http://blog.kevinvandervlist.nl/2011/06/openindiana-zone-with-nat/) * [NAT on solaris](http://www.rite-group.com/rich/solaris_nat.html) diff --git a/content/post/74.md b/content/post/74.md index 1c89b53..96f5bdd 100644 --- a/content/post/74.md +++ b/content/post/74.md @@ -5,93 +5,93 @@ author = "Gibheer" draft = false +++ -In this short post, we will get a container running on a openindiana host. We will do some things in crossbow, but of the following stuff is just configuring the zone. At the end of this blog post, you will find some links to related pages. - -some preparations -================= - -Make sure, that you have a free vnic created with dladm to use in the zone or else, we will have no network available. Further, we need a place on the filesystem, where our zone can be created. We need 500MB to 1.5GB of free space. - -writing a zone configuration -============================ - -In the first step, we have to write a zone configuration. You can use zonecfg directly, but it's better to write it into a textfile and let zonecfg read that file. That way, you can check the configuration into a vcs of your choice. - -The config should look like this. - - create -b - set zonepath=/zones/zone1 - set ip-type=exclusive - set autoboot=false - add net - set physical=zone1 - end - commit - -With this configuration, we build a zone, which get's saved in `/zones`. `/zones` has to be a zfs partition or else the zone can not be created. - -The sixth line sets the network device for the zone to the vnic `zone1`. - -Now we feed the file to zonecfg and let it create *zone1*. - - # zonecfg -z zone1 -f zone1.conf - - -installation of the zone -======================== - -The next step is to install the zone with the command: - - # zoneadm -z zone1 install - -or clone it from a template with - - # zoneadm -z zone1 clone template_name - -Now we have to wait a bit and can write the next configuration file. - -writing a sysidcfg -================== - -I wrote a rough post about the [sysidcfg](http://zero-knowledge.org/post/72) already, so take a look there, if you are interested in further details. - -For this example, we use the following content. - - name_service=NONE - nfs4_domain=dynamic - terminal=xterms - # the password is foobar - root_password=0WMBUdFzAu6qU - security_policy=NONE - network_interface=zone1 { - primary - hostname=zone1 - default_route=NONE - ip_address=192.168.5.3 - netmask=255.255.255.0 - protocol_ipv6=no - } - - -booting the zone -================ - -When the installation process has ended, copy the file to `/zones/zone1/root/etc/sysidcfg`. This way, the zone can read the file on the first boot and set most of the stuff. - - # zoneadm -z zone1 boot - -To check if everything gets configured, log into the zone and check the output. - - # zlogin -e ! -C zone1 - -It will take some time until the zone is ready to use, but it should not ask for further details. When the prompt shows, the configuration completed. - -Now you can login into the zone and make further adjustments. Some topics will get their own blog entries here, so take a look at the other entries for help too. - -links -===== - -Here are some links for further details to this topic: - -* [crossbow example from c0t0d0s0](http://www.c0t0d0s0.org/archives/5355-Upcoming-Solaris-Features-Crossbow-Part-1-Virtualisation.html) +In this short post, we will get a container running on a openindiana host. We will do some things in crossbow, but of the following stuff is just configuring the zone. At the end of this blog post, you will find some links to related pages. + +some preparations +================= + +Make sure, that you have a free vnic created with dladm to use in the zone or else, we will have no network available. Further, we need a place on the filesystem, where our zone can be created. We need 500MB to 1.5GB of free space. + +writing a zone configuration +============================ + +In the first step, we have to write a zone configuration. You can use zonecfg directly, but it's better to write it into a textfile and let zonecfg read that file. That way, you can check the configuration into a vcs of your choice. + +The config should look like this. + + create -b + set zonepath=/zones/zone1 + set ip-type=exclusive + set autoboot=false + add net + set physical=zone1 + end + commit + +With this configuration, we build a zone, which get's saved in `/zones`. `/zones` has to be a zfs partition or else the zone can not be created. + +The sixth line sets the network device for the zone to the vnic `zone1`. + +Now we feed the file to zonecfg and let it create *zone1*. + + # zonecfg -z zone1 -f zone1.conf + + +installation of the zone +======================== + +The next step is to install the zone with the command: + + # zoneadm -z zone1 install + +or clone it from a template with + + # zoneadm -z zone1 clone template_name + +Now we have to wait a bit and can write the next configuration file. + +writing a sysidcfg +================== + +I wrote a rough post about the [sysidcfg](http://zero-knowledge.org/post/72) already, so take a look there, if you are interested in further details. + +For this example, we use the following content. + + name_service=NONE + nfs4_domain=dynamic + terminal=xterms + # the password is foobar + root_password=0WMBUdFzAu6qU + security_policy=NONE + network_interface=zone1 { + primary + hostname=zone1 + default_route=NONE + ip_address=192.168.5.3 + netmask=255.255.255.0 + protocol_ipv6=no + } + + +booting the zone +================ + +When the installation process has ended, copy the file to `/zones/zone1/root/etc/sysidcfg`. This way, the zone can read the file on the first boot and set most of the stuff. + + # zoneadm -z zone1 boot + +To check if everything gets configured, log into the zone and check the output. + + # zlogin -e ! -C zone1 + +It will take some time until the zone is ready to use, but it should not ask for further details. When the prompt shows, the configuration completed. + +Now you can login into the zone and make further adjustments. Some topics will get their own blog entries here, so take a look at the other entries for help too. + +links +===== + +Here are some links for further details to this topic: + +* [crossbow example from c0t0d0s0](http://www.c0t0d0s0.org/archives/5355-Upcoming-Solaris-Features-Crossbow-Part-1-Virtualisation.html) * [howto sysidcfg](http://zero-knowledge.org/post/72) diff --git a/content/post/75.md b/content/post/75.md index 7006ab2..5d4df7c 100644 --- a/content/post/75.md +++ b/content/post/75.md @@ -5,8 +5,8 @@ author = "Gibheer" draft = true +++ -Here comes a small hint for everybody else, who wants to run a ntp server in a zone: It does not work! - -The reason for that is, that ntp needs access to the time facility of the kernel. But only global zones are allowed to access this part of the kernel. But don't worry, you don't need a ntp client on the zones, as they get their time information from the global zone. - +Here comes a small hint for everybody else, who wants to run a ntp server in a zone: It does not work! + +The reason for that is, that ntp needs access to the time facility of the kernel. But only global zones are allowed to access this part of the kernel. But don't worry, you don't need a ntp client on the zones, as they get their time information from the global zone. + That cost me about 4 hours to find out. I hope, this could save you some time. diff --git a/content/post/77.md b/content/post/77.md index 1d59848..5db4932 100644 --- a/content/post/77.md +++ b/content/post/77.md @@ -5,133 +5,133 @@ author = "Gibheer" draft = false +++ -This time, we will build a base kerberos setup. At the end, you will be able to login into another machine using kerberos only. - -You need the following things, to make kerberos work: - -* a working dns server -* 2 servers - -I will explain this setup on an openindiana system with 2 zones. `kerberosp1` will be my kerberos machine and `sshp1` will be my ssh server with kerberos support. - -setup of kerberos -================= - -The setup of kerberos was pretty easy, after reading 3 tutorials about it. The essential part here is to decide, how the realm and the admin account should be called. - -To start the setup, call `kdcmgr`. At first, it asks your realm, which you should name like your domain. -After that, you have to generate an admin principal.A principal is like an account for a user or admin. But it's also used for services. I named mine `kerberosp1/admin`. Give it a safe password and you are done. - -Now you should have an populated `/etc/krb5/` directory. Open the file `kdc.conf` in that directory and search for `max_life`. It was set to 8 hours for me, which was too long. Adjust the value to 4h or 16h, like you want. I did the same with `max_renewable_life`. - -Edit: You should add the following option in the realms section to your realm. - - kpasswd_protocol = SET_CHANGE - -Kerberos uses a separate protocol for changing the password of principals. A RPC like protocol is used in the solaris version and microsoft has another one too. So the only option compatible on all is `SET_CHANGE`. But to make things worse, the solaris default does not even work in an internal network. So just add this entry and save some stress from trying to find out, why this is not working. - -setting up some accounts -======================== - -To use the kerberos service, check first, if the kdc is running and start it, if it's not. For openindiana, the check is - -`svcs krb5kdc` - -which should return online. - -After that, as root start the kerberos shell with `kadmin.local`. This is a management shell to create, delete and modify principals. -Here we are going to create some policies. With these, we can set some minimal standards, like the minimum password length. - -I created three policies. An `admin`, `user` and a `service` policy. These got the following settings: - -* admin - * minlength 8 - * minclasses 3 -* user - * minlength 8 - * minclasses 2 -* service - * minlength 12 - * minclasses 4 - -This sets some password limitations for every principal group I have. `minclasses` is used for different types of characters. There are lower case, upper case, numbers, punctation and other characters. -The create a new policy use the command `addpol` or `add_policy` with `-minlength` and `-minclasses`. You can simply type the command to get some help or read the man page. - -After creating the policies, we have to create some principals. First, we should create one for ourselves. You can do this with the command `addprinc` or `add_principal`. Give it a policy with the argument `-policy` and a name. You will have to input a password for this principal according to the policies. - -You can use this scheme to create user accounts too. For that, you can generate a password for them with the program `pwgen`. It's pretty helpful and can generate pretty complex passwords, so that should be best. - -Now we need a principal for our ssh server. The name of this principal should be `host/name_of_service.your.domain.name`, so in my case, it is `host/sshp1.prod.lan`. But I did not want to generate any password and added the argument `-randkey` which generates a password according to the policies we set. - -Now we have to export the key of the last principal into a keytab file, that can be read by the service, which wants to use it. This is done with the command `ktadd` like this - -`ktadd -k /etc/krb5.keytab host/sshp1.prod.lan` - -This generates our file in /etc/krb5.keytab. Copy this file into the kerberos directory (on openindiana it's `/etc/krb5/`) and delete the one on the kerberos host. This is important, as another execution of ktadd will append the next key to that file. - -setting up ssh -============== - -For making ssh work with kerberos, we need `/etc/krb5/krb5.conf` and `/etc/krb5/krb5.keytab`. In the step before, we already moved the `krb5.keytab`. We can copy the `krb5.conf` from the kerberos server to the ssh server. - -Now you can start the ssh deamon. - -try to log in -============= - -For the test, we will try to connect to the ssh host from the kerberos host. So start a shell on the kerberos server and type `kinit`. This should ask for your password. If it was correct, `klist` should show you, that you have been granted a ticket. - -Now try to open a ssh session to the server, with `-v` set for more informations and it should work. - -problems that can occur -======================= - -no default realm ----------------- - -The is the message - - kinit(v5): Configuration file does not specify default realm when parsing name gibheer - -which hints, that your `/etc/krb5/krb5.conf` is missing. - -client/principal not found --------------------------- - -The message - - kinit(v5): Client 'foo@PROD.LAN' not found in Kerberos database while getting initial credentials - -is a hint, that you forgot to add the principal or that your username could not be found. Just add the principal with `kadmin` and it should work. - -ssh does not use kerberos -------------------------- - -If ssh does not want to use kerberos at all, check for the GSSAPI options. These should be enabled by default, but can be disabled. If that's the case, add the following line to your `sshd_config`. - - GSSAPIAuthentication yes - -After a restart, ssh should use kerberos for authentication. - -links -===== - -* [setup of kerberos on opensolaris](http://www.linuxtopia.org/online_books/opensolaris_2008/SYSADV6/html/setup-148.html) -* [MIT kerberos page](http://web.mit.edu/kerberos/krb5-1.5/krb5-1.5.4/doc/krb5-admin/krb5_002econf.html) -* [KDC Setup on Solaris](http://wiki.creatica.org/cgi-bin/wiki.pl/Kerberos_KDC_server_on_Solaris) -* [Kerberos password](http://fnal.gov/docs/strongauth/princ_pw.html#46115) -* [Kerberos policies](http://pig.made-it.com/kerberos-policy.html) -* [Administrative Guide to Kerberos](http://techpubs.spinlocksolutions.com/dklar/kerberos.html#err_server_not_found) - -one last word -============= - -I have one last word for you: Kerberos does not do authorization! - -That means, that kerberos can not say, if one principal is allowed to use a service or not. It just manages the authentication for you. -If you want to manage the access, there are some possibilities for that. One is to use ldap, often used in conjunction with kerberos. Or you manage the `passwd` files or any other file yourself or you use a service like [chef](http://wiki.opscode.com/display/chef/Home) or [puppet](http://puppetlabs.com/). - -changelog -========= - +This time, we will build a base kerberos setup. At the end, you will be able to login into another machine using kerberos only. + +You need the following things, to make kerberos work: + +* a working dns server +* 2 servers + +I will explain this setup on an openindiana system with 2 zones. `kerberosp1` will be my kerberos machine and `sshp1` will be my ssh server with kerberos support. + +setup of kerberos +================= + +The setup of kerberos was pretty easy, after reading 3 tutorials about it. The essential part here is to decide, how the realm and the admin account should be called. + +To start the setup, call `kdcmgr`. At first, it asks your realm, which you should name like your domain. +After that, you have to generate an admin principal.A principal is like an account for a user or admin. But it's also used for services. I named mine `kerberosp1/admin`. Give it a safe password and you are done. + +Now you should have an populated `/etc/krb5/` directory. Open the file `kdc.conf` in that directory and search for `max_life`. It was set to 8 hours for me, which was too long. Adjust the value to 4h or 16h, like you want. I did the same with `max_renewable_life`. + +Edit: You should add the following option in the realms section to your realm. + + kpasswd_protocol = SET_CHANGE + +Kerberos uses a separate protocol for changing the password of principals. A RPC like protocol is used in the solaris version and microsoft has another one too. So the only option compatible on all is `SET_CHANGE`. But to make things worse, the solaris default does not even work in an internal network. So just add this entry and save some stress from trying to find out, why this is not working. + +setting up some accounts +======================== + +To use the kerberos service, check first, if the kdc is running and start it, if it's not. For openindiana, the check is + +`svcs krb5kdc` + +which should return online. + +After that, as root start the kerberos shell with `kadmin.local`. This is a management shell to create, delete and modify principals. +Here we are going to create some policies. With these, we can set some minimal standards, like the minimum password length. + +I created three policies. An `admin`, `user` and a `service` policy. These got the following settings: + +* admin + * minlength 8 + * minclasses 3 +* user + * minlength 8 + * minclasses 2 +* service + * minlength 12 + * minclasses 4 + +This sets some password limitations for every principal group I have. `minclasses` is used for different types of characters. There are lower case, upper case, numbers, punctation and other characters. +The create a new policy use the command `addpol` or `add_policy` with `-minlength` and `-minclasses`. You can simply type the command to get some help or read the man page. + +After creating the policies, we have to create some principals. First, we should create one for ourselves. You can do this with the command `addprinc` or `add_principal`. Give it a policy with the argument `-policy` and a name. You will have to input a password for this principal according to the policies. + +You can use this scheme to create user accounts too. For that, you can generate a password for them with the program `pwgen`. It's pretty helpful and can generate pretty complex passwords, so that should be best. + +Now we need a principal for our ssh server. The name of this principal should be `host/name_of_service.your.domain.name`, so in my case, it is `host/sshp1.prod.lan`. But I did not want to generate any password and added the argument `-randkey` which generates a password according to the policies we set. + +Now we have to export the key of the last principal into a keytab file, that can be read by the service, which wants to use it. This is done with the command `ktadd` like this + +`ktadd -k /etc/krb5.keytab host/sshp1.prod.lan` + +This generates our file in /etc/krb5.keytab. Copy this file into the kerberos directory (on openindiana it's `/etc/krb5/`) and delete the one on the kerberos host. This is important, as another execution of ktadd will append the next key to that file. + +setting up ssh +============== + +For making ssh work with kerberos, we need `/etc/krb5/krb5.conf` and `/etc/krb5/krb5.keytab`. In the step before, we already moved the `krb5.keytab`. We can copy the `krb5.conf` from the kerberos server to the ssh server. + +Now you can start the ssh deamon. + +try to log in +============= + +For the test, we will try to connect to the ssh host from the kerberos host. So start a shell on the kerberos server and type `kinit`. This should ask for your password. If it was correct, `klist` should show you, that you have been granted a ticket. + +Now try to open a ssh session to the server, with `-v` set for more informations and it should work. + +problems that can occur +======================= + +no default realm +---------------- + +The is the message + + kinit(v5): Configuration file does not specify default realm when parsing name gibheer + +which hints, that your `/etc/krb5/krb5.conf` is missing. + +client/principal not found +-------------------------- + +The message + + kinit(v5): Client 'foo@PROD.LAN' not found in Kerberos database while getting initial credentials + +is a hint, that you forgot to add the principal or that your username could not be found. Just add the principal with `kadmin` and it should work. + +ssh does not use kerberos +------------------------- + +If ssh does not want to use kerberos at all, check for the GSSAPI options. These should be enabled by default, but can be disabled. If that's the case, add the following line to your `sshd_config`. + + GSSAPIAuthentication yes + +After a restart, ssh should use kerberos for authentication. + +links +===== + +* [setup of kerberos on opensolaris](http://www.linuxtopia.org/online_books/opensolaris_2008/SYSADV6/html/setup-148.html) +* [MIT kerberos page](http://web.mit.edu/kerberos/krb5-1.5/krb5-1.5.4/doc/krb5-admin/krb5_002econf.html) +* [KDC Setup on Solaris](http://wiki.creatica.org/cgi-bin/wiki.pl/Kerberos_KDC_server_on_Solaris) +* [Kerberos password](http://fnal.gov/docs/strongauth/princ_pw.html#46115) +* [Kerberos policies](http://pig.made-it.com/kerberos-policy.html) +* [Administrative Guide to Kerberos](http://techpubs.spinlocksolutions.com/dklar/kerberos.html#err_server_not_found) + +one last word +============= + +I have one last word for you: Kerberos does not do authorization! + +That means, that kerberos can not say, if one principal is allowed to use a service or not. It just manages the authentication for you. +If you want to manage the access, there are some possibilities for that. One is to use ldap, often used in conjunction with kerberos. Or you manage the `passwd` files or any other file yourself or you use a service like [chef](http://wiki.opscode.com/display/chef/Home) or [puppet](http://puppetlabs.com/). + +changelog +========= + * added some explanation to `kpasswd_protocol` diff --git a/content/post/78.md b/content/post/78.md index fcd6ba5..83164c8 100644 --- a/content/post/78.md +++ b/content/post/78.md @@ -5,13 +5,13 @@ author = "Gibheer" draft = false +++ -There is a bug in openindiana that does not let you get the content of a page with curl, when it's secured with ssl. The cause of this is an option set on compile time. This option is the the path to the certificate storage. -In the case of openindiana this is set to `/etc/curl/curlCA`, but all certificates reside in `/etc/certs/CA/`. This leads to the following error message, when you try it: - - curl: (77) error setting certificate verify locations - -To fix this, run the following script. - - mkdir /etc/curl && cat /etc/certs/CA/*.pem > /etc/curl/curlCA - +There is a bug in openindiana that does not let you get the content of a page with curl, when it's secured with ssl. The cause of this is an option set on compile time. This option is the the path to the certificate storage. +In the case of openindiana this is set to `/etc/curl/curlCA`, but all certificates reside in `/etc/certs/CA/`. This leads to the following error message, when you try it: + + curl: (77) error setting certificate verify locations + +To fix this, run the following script. + + mkdir /etc/curl && cat /etc/certs/CA/*.pem > /etc/curl/curlCA + This writes all certificates of the default CA in the file curl is looking for and after that, it works. diff --git a/content/post/79.md b/content/post/79.md index f05a7c0..f7feafd 100644 --- a/content/post/79.md +++ b/content/post/79.md @@ -5,95 +5,95 @@ author = "Gibheer" draft = true +++ -Hey there! This time, we will get rubinius running on openindiana. As there is not package for llvm yet, it get's compiled within the build. - -I got it this far because of crsd. He told me how to get llvm running, so that we could get rubinius to compile. -After that [dbussink](https://twitter.com/#!/dbussink) got rbx to compile within two days! He found some really strange things, but in the end, rubinius can run on a solaris platform! - -requirements -============ - -But first, you have to fulfill some requirements. First you have to add the sfe publisher to get the gcc4. -You can do that with the command - - pkg set-publisher -O http://pkg.openindiana.org/sfe sfe - -After that install the following packages - -* developer/gcc-3 -* system/header -* system/library/math/header-math -* gnu-tar -* gnu-make -* gnu-binutils -* gnu-coreutils -* gnu-findutils -* gnu-diffutils -* gnu-grep -* gnu-patch -* gnu-sed -* gawk -* gnu-m4 -* bison -* git - -Yeah, that's alot of gnu, but we need it to get everything going. The cause of this are the old versions of solaris software, which do not support many features. The default compiler is even gcc 3.4.3! - -After you have installed these packages, install the following package from sfe. - -* runtime/gcc - -The order is important, as gcc3 and gcc4 set symlinks in /usr/bin. If you install them in another order, the symlink is not correct and you end up having a lot of work. - -some patching -============= - -After that, we have to fix a small bug in gcc with editing the file `/usr/include/spawn.h`. - - 73,76d72 - < #ifdef __cplusplus - < char *const *_RESTRICT_KYWD argv, - < char *const *_RESTRICT_KYWD envp); - < #else - 79d74 - < #endif - 86,89d80 - < #ifdef __cplusplus - < char *const *_RESTRICT_KYWD argv, - < char *const *_RESTRICT_KYWD envp); - < #else - 92d82 - < #endif - -This fixes a bug in gcc with [the __restrict key word](http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49347). - -fix the path -============ - -Now that we installed and fix a bunch of things, we need to include the gnu path into our own. Use the following command to get this done - - export PATH="/usr/gnu/bin:$PATH" - -Yes, it needs to be at the first place or else one of the old solaris binaries get's chosen and then, nothing works and produces weired errors. - -getting rbx to compile -====================== - -with an own build ------------------ - -If you want to build rbx yourself, get the code from [https://github.com/rubinius/rubinius.git](https://github.com/rubinius/rubinius.git). After that, configure and rake and everything should be fine. - -with rvm ---------- - -If you want to get it working with rvm, install rvm like normal. After that you can simply install rbx with - - rvm install rbx - -That's all you need. - -conclusion -========== - +Hey there! This time, we will get rubinius running on openindiana. As there is not package for llvm yet, it get's compiled within the build. + +I got it this far because of crsd. He told me how to get llvm running, so that we could get rubinius to compile. +After that [dbussink](https://twitter.com/#!/dbussink) got rbx to compile within two days! He found some really strange things, but in the end, rubinius can run on a solaris platform! + +requirements +============ + +But first, you have to fulfill some requirements. First you have to add the sfe publisher to get the gcc4. +You can do that with the command + + pkg set-publisher -O http://pkg.openindiana.org/sfe sfe + +After that install the following packages + +* developer/gcc-3 +* system/header +* system/library/math/header-math +* gnu-tar +* gnu-make +* gnu-binutils +* gnu-coreutils +* gnu-findutils +* gnu-diffutils +* gnu-grep +* gnu-patch +* gnu-sed +* gawk +* gnu-m4 +* bison +* git + +Yeah, that's alot of gnu, but we need it to get everything going. The cause of this are the old versions of solaris software, which do not support many features. The default compiler is even gcc 3.4.3! + +After you have installed these packages, install the following package from sfe. + +* runtime/gcc + +The order is important, as gcc3 and gcc4 set symlinks in /usr/bin. If you install them in another order, the symlink is not correct and you end up having a lot of work. + +some patching +============= + +After that, we have to fix a small bug in gcc with editing the file `/usr/include/spawn.h`. + + 73,76d72 + < #ifdef __cplusplus + < char *const *_RESTRICT_KYWD argv, + < char *const *_RESTRICT_KYWD envp); + < #else + 79d74 + < #endif + 86,89d80 + < #ifdef __cplusplus + < char *const *_RESTRICT_KYWD argv, + < char *const *_RESTRICT_KYWD envp); + < #else + 92d82 + < #endif + +This fixes a bug in gcc with [the \_\_restrict key word](http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49347). + +fix the path +============ + +Now that we installed and fix a bunch of things, we need to include the gnu path into our own. Use the following command to get this done + + export PATH="/usr/gnu/bin:$PATH" + +Yes, it needs to be at the first place or else one of the old solaris binaries get's chosen and then, nothing works and produces weired errors. + +getting rbx to compile +====================== + +with an own build +----------------- + +If you want to build rbx yourself, get the code from [https://github.com/rubinius/rubinius.git](https://github.com/rubinius/rubinius.git). After that, configure and rake and everything should be fine. + +with rvm +--------- + +If you want to get it working with rvm, install rvm like normal. After that you can simply install rbx with + + rvm install rbx + +That's all you need. + +conclusion +========== + After dbussink fixed all the errors, rbx compiles fine, when the toolchain is there. To get to this point was not easy, but we did it. So have a lot of fun with hacking on and using rubinius! diff --git a/content/post/80.md b/content/post/80.md index dbc9b3d..a63cbab 100644 --- a/content/post/80.md +++ b/content/post/80.md @@ -5,18 +5,18 @@ author = "Gibheer" draft = false +++ -If you encounter the following error with `make install` - - find: cycle detected for /lib/secure/32/ - find: cycle detected for /lib/crypto/32/ - find: cycle detected for /lib/32/ - find: cycle detected for /usr/lib/elfedit/32/ - find: cycle detected for /usr/lib/secure/32/ - find: cycle detected for /usr/lib/link_audit/32/ - find: cycle detected for /usr/lib/lwp/32/ - find: cycle detected for /usr/lib/locale/en_US.UTF-8/32/ - find: cycle detected for /usr/lib/locale/en_US.UTF-8/LO_LTYPE/32/ - find: cycle detected for /usr/lib/locale/en_US.UTF-8/LC_CTYPE/32/ - find: cycle detected for /usr/lib/32/ - +If you encounter the following error with `make install` + + find: cycle detected for /lib/secure/32/ + find: cycle detected for /lib/crypto/32/ + find: cycle detected for /lib/32/ + find: cycle detected for /usr/lib/elfedit/32/ + find: cycle detected for /usr/lib/secure/32/ + find: cycle detected for /usr/lib/link_audit/32/ + find: cycle detected for /usr/lib/lwp/32/ + find: cycle detected for /usr/lib/locale/en_US.UTF-8/32/ + find: cycle detected for /usr/lib/locale/en_US.UTF-8/LO_LTYPE/32/ + find: cycle detected for /usr/lib/locale/en_US.UTF-8/LC_CTYPE/32/ + find: cycle detected for /usr/lib/32/ + use `ginstall` in your Makefile instead of `install`. It seems just broken on solaris. diff --git a/content/post/81.md b/content/post/81.md index 8e86406..27bbe61 100644 --- a/content/post/81.md +++ b/content/post/81.md @@ -9,7 +9,7 @@ draft = true mein letztes System hat also über zwei Jahre gehalten. Ihr werdet euch vielleicht (noch/nicht) erinnern an:\ -http://zero-knowledge.org/post/25 +[Lustige Gehversuche mit ...](/post/25.md) Nun brachten mit die (un)glücklichen Umstände eines sterbenden Monitorkabels dazu mein geliebtes Hermelin gegen die Grinsekatze diff --git a/content/post/82.md b/content/post/82.md index 6b53729..445eac9 100644 --- a/content/post/82.md +++ b/content/post/82.md @@ -5,21 +5,21 @@ author = "Gibheer" draft = false +++ -Two weeks ago, I had a problem with installing rubygems on my laptop. Yesterday, another person had the same problem, so I will document what is wrong here. - -The problem itself manifests in the way, that it installs gems with the error message - - WARNING: You don't have /home/steven/.gem/rbx/1.8/bin in your PATH, - gem executables will not run. - -If you then want to use the binary provided with the gem, it will not work and it happens with all ruby versions, be it rubinius, jruby or 1.9. What makes it worse is the fact, that it only occurs on archlinux installations, till now. And it is not a problem of rvm! - -So if you are on archlinux, look into `/etc/gemrc`. There will be a line saying - - gemrc: --user-install - -To solve the problem, create a file `~/.gemrc` and put the line - - gemrc: - +Two weeks ago, I had a problem with installing rubygems on my laptop. Yesterday, another person had the same problem, so I will document what is wrong here. + +The problem itself manifests in the way, that it installs gems with the error message + + WARNING: You don't have /home/steven/.gem/rbx/1.8/bin in your PATH, + gem executables will not run. + +If you then want to use the binary provided with the gem, it will not work and it happens with all ruby versions, be it rubinius, jruby or 1.9. What makes it worse is the fact, that it only occurs on archlinux installations, till now. And it is not a problem of rvm! + +So if you are on archlinux, look into `/etc/gemrc`. There will be a line saying + + gemrc: --user-install + +To solve the problem, create a file `~/.gemrc` and put the line + + gemrc: + in it. By doing that, the file `/etc/gemrc` will be ignored. And if you are manipulating that file, look into [all the other options](http://docs.rubygems.org/read/chapter/11) you can set. diff --git a/content/post/83.md b/content/post/83.md index f4fee88..68bb04c 100644 --- a/content/post/83.md +++ b/content/post/83.md @@ -5,87 +5,87 @@ author = "Gibheer" draft = false +++ -After my openindiana server is already running for 4 months straight, I thought, I write a bit about the ecosystem of Illumos and its state. - -Illumos ecosystem -================= - -Illumos is the base system of which every distribution uses. It's more or less -the base system, like FreeBSD. With Solaris 11 being the original OpenSolaris, -Illumos is a fork of what was open source of OpenSolaris in 2010. - -The development on Illumos is pretty active and at the moment, there is no merge with the Solaris code base planned. Oracle distributed code after the Solaris 11 release, but it was mostly code which had to be distributed either way. So there were no updates on kernel or ZFS code. - -This has a huge impact on the future development of Illumos as everything has to be developed by contributors like Joyent, Nexenta and others. But it also has implications for most of the core features of Solaris, the most important ZFS. These are already noticeable with Solaris 11 having ZFS version 31 and FreeBSD and Illumos having version 28. This means, that neither FreeBSD nor Illumos can do something with a zpool created on a Solaris 11. This already makes a switch from one system to another difficult. - -But nevertheless the contributors to Illumos work to make it better. The largest part at the moment is to get Illumos compiling with GCC 4.6.1. At the first look, it seems like a minor problem, but OpenSolaris was not written to be built with GCC but with the proprietary SunStudio. As far as I could see, this has some major implications and raised huge holes in the code, which has to get fixed. -With that the base system is also upgraded from older versions of Perl and python, which also will be a longer process. - -Another huge part is the process of building packages. Solaris 10 and older used the SVR4 format. That was pretty simple and looked like rpm. OpenSolaris introduced a new format named IPS - Image Packaging System. This is also compatible with the SVR4 format. OpenSolaris had a pretty big infrastructure for building IPS packages, but it was lost when oracle acquired sun and shut it down. -The problem now is, how to build new packages. Some are using SVR4 to build the IPS packages, which works good and the repository already has a bunch of newer releases of many projects. -Another attempt was to use pkgsrc. This is a project of NetBSD and already supports Solaris. This attempt died pretty fast. They were not used like FreeBSD ports and also not for compiling the packages. -The third approach is to build a packing system on top of dpkg/apt. It is a collaboration between Nexenta, OpenIndiana and others. There is also a plan to build a new distribution out of it - named illumian. - -One major difference between Solaris 11 and Illumos is that Illumos has KVM. It got ported from Linux by Joyent and works pretty good. With this step, Illumos not only had Zones for virtualization but also a full virtualization to get Linux running. - -distribution ecosystem -====================== - -There are a bunch of distributions out there, trying to solve different problems. - -[Solaris 11 - the first cloud os][solaris11] ----------- - -Not so much a distribution of Illumos, but of the old OpenSolaris. Solaris 11 is a pretty good allround distribution. It is used from small systems to huge ones, running one application or some hundred on one machine. Some use it for storage and others to virtualize the hell out of it with zones and crossbow. - -[OpenIndiana - open source and enterprise][openindiana] ------------ - -OpenIndiana was one of the first distributions using the Illumos core. It is available as a server distribution and a desktop one. The server one is targeted for the same usage as Solaris 11. As OpenIndiana uses Illumos it also has support for KVM and therefore can be used as a platform to host many fully virtualized instances on top of ZFS and crossbow infrastructure. - -A problem at the moment is the pretty old software it offers. Most of the packages are from OpenSolaris and therefore nearly 2 years old. Most of them don't even get security patches. The reason for that is the packaging topic mentioned above. As long as they don't have a strategy, nothing will change here. The only option is to use the sfe repo at the moment. - -This may change in the future, because of the joint effort with Nexenta of packaging releases. - -OpenIndiana also has a desktop part which is targeted at ubuntu users wanting ZFS and time machine. As I used OpenSolaris already on a laptop I can only say "Yes, it works". But you have to decide yourself, if you can live with pretty old but stable software. And many projects are not even available in package form, so that one would have to compile it yourself. - -[Nexenta - enterprise storage for everyone][nexenta] -------- - -Nexenta is another distribution who switched to Illumos core pretty fast. It is intended to be used for storage systems, but can also be used for other kinds of servers. It also uses the debian package system and a gnu userland. It is available as a community edition and "enterprise" edition. - -The packages are a bit more up to date than the OpenIndiana ones. With the combined effort of both projects, they may keep closer to the actual releases. - -[illumian - illumos + debian package management][illumian] --------- - -Illumian is a new project and collaboration work between Nexenta and OpenIndiana. It will provide packages through the debian package management dpkg/apt. The target audience seems to be the same as OpenIndiana. The plan at the moment is to release all packages in the same version as in OpenIndiana, so that the ultimate choice will just be, if you want to use dpkg or IPS. - -[SmartOS - the complete modern operating system][smartos] -------- - -This is not so much a distribution as a live image. Its purpose is to use all disks in the server to create a zpool and use that to provide storage for virtual machines, be it zones or KVM instances. The KVM instances are also put into zones to attach dtrace to the virtual instances to see, what's going on in that instance. -SmartOS offers also pretty nice wrappers around the VM operating to get new instances up fast. - -The company behind SmartOS is Joyent, more known for building node.js. They use SmartOS as the central pillar of their own JoyentCloud, where they host node.js applications, databases and also Linux machines. - -[omnios][omnios] ------- - -OmniOS is a very new distribution and from OmniIT. It offers not much at the moment apart from an ISO image and a small wiki. -It is intended to be used much like FreeBSD. They provide a very stripped down Illumos core with updated packages as far as possible and nothing more. Every other package one might need has to be built and distributed through a package repository. The reason behind this is, that they only want to provide the basic image, which everybody needs, but not the packages needed only by themselves. And even these packages may be one or two versions behind. -And let me tell you - the packages they already updated may be considered bleeding edge by many debian stable users. - -What next? -========== - -This was the excursion into the world of Illumos based distributions. I myself will switch away from OpenIndiana. It's great, that Illumos lives and breathes more than 4 months ago, but there is much work left to do. SmartOS had a huge impact for me and others and Joyent and Nexenta do great work on improving the Ecosystem. -But it will be hard to get back to the times where OpenSolaris was. Too much time went by unused. But I'm looking forward what else might come up of Illumos land. - -[solaris11]: http://www.oracle.com/us/products/servers-storage/solaris/solaris11/overview/index.html "Solaris 11" -[illumos]: http://illumos.org/ "the illumos project" -[openindiana]: http://openindiana.org/ "OpenIndiana" -[smartos]: http://smartos.org/ "SmartOS - the complete modern operating system" -[illumian]: http://illumian.org/ "illumian" -[nexenta]: http://nexentastor.org/ "Nexenta - the storage platform" +After my openindiana server is already running for 4 months straight, I thought, I write a bit about the ecosystem of Illumos and its state. + +Illumos ecosystem +================= + +Illumos is the base system of which every distribution uses. It's more or less +the base system, like FreeBSD. With Solaris 11 being the original OpenSolaris, +Illumos is a fork of what was open source of OpenSolaris in 2010. + +The development on Illumos is pretty active and at the moment, there is no merge with the Solaris code base planned. Oracle distributed code after the Solaris 11 release, but it was mostly code which had to be distributed either way. So there were no updates on kernel or ZFS code. + +This has a huge impact on the future development of Illumos as everything has to be developed by contributors like Joyent, Nexenta and others. But it also has implications for most of the core features of Solaris, the most important ZFS. These are already noticeable with Solaris 11 having ZFS version 31 and FreeBSD and Illumos having version 28. This means, that neither FreeBSD nor Illumos can do something with a zpool created on a Solaris 11. This already makes a switch from one system to another difficult. + +But nevertheless the contributors to Illumos work to make it better. The largest part at the moment is to get Illumos compiling with GCC 4.6.1. At the first look, it seems like a minor problem, but OpenSolaris was not written to be built with GCC but with the proprietary SunStudio. As far as I could see, this has some major implications and raised huge holes in the code, which has to get fixed. +With that the base system is also upgraded from older versions of Perl and python, which also will be a longer process. + +Another huge part is the process of building packages. Solaris 10 and older used the SVR4 format. That was pretty simple and looked like rpm. OpenSolaris introduced a new format named IPS - Image Packaging System. This is also compatible with the SVR4 format. OpenSolaris had a pretty big infrastructure for building IPS packages, but it was lost when oracle acquired sun and shut it down. +The problem now is, how to build new packages. Some are using SVR4 to build the IPS packages, which works good and the repository already has a bunch of newer releases of many projects. +Another attempt was to use pkgsrc. This is a project of NetBSD and already supports Solaris. This attempt died pretty fast. They were not used like FreeBSD ports and also not for compiling the packages. +The third approach is to build a packing system on top of dpkg/apt. It is a collaboration between Nexenta, OpenIndiana and others. There is also a plan to build a new distribution out of it - named illumian. + +One major difference between Solaris 11 and Illumos is that Illumos has KVM. It got ported from Linux by Joyent and works pretty good. With this step, Illumos not only had Zones for virtualization but also a full virtualization to get Linux running. + +distribution ecosystem +====================== + +There are a bunch of distributions out there, trying to solve different problems. + +[Solaris 11 - the first cloud os][solaris11] +---------- + +Not so much a distribution of Illumos, but of the old OpenSolaris. Solaris 11 is a pretty good allround distribution. It is used from small systems to huge ones, running one application or some hundred on one machine. Some use it for storage and others to virtualize the hell out of it with zones and crossbow. + +[OpenIndiana - open source and enterprise][openindiana] +----------- + +OpenIndiana was one of the first distributions using the Illumos core. It is available as a server distribution and a desktop one. The server one is targeted for the same usage as Solaris 11. As OpenIndiana uses Illumos it also has support for KVM and therefore can be used as a platform to host many fully virtualized instances on top of ZFS and crossbow infrastructure. + +A problem at the moment is the pretty old software it offers. Most of the packages are from OpenSolaris and therefore nearly 2 years old. Most of them don't even get security patches. The reason for that is the packaging topic mentioned above. As long as they don't have a strategy, nothing will change here. The only option is to use the sfe repo at the moment. + +This may change in the future, because of the joint effort with Nexenta of packaging releases. + +OpenIndiana also has a desktop part which is targeted at ubuntu users wanting ZFS and time machine. As I used OpenSolaris already on a laptop I can only say "Yes, it works". But you have to decide yourself, if you can live with pretty old but stable software. And many projects are not even available in package form, so that one would have to compile it yourself. + +[Nexenta - enterprise storage for everyone][nexenta] +------- + +Nexenta is another distribution who switched to Illumos core pretty fast. It is intended to be used for storage systems, but can also be used for other kinds of servers. It also uses the debian package system and a gnu userland. It is available as a community edition and "enterprise" edition. + +The packages are a bit more up to date than the OpenIndiana ones. With the combined effort of both projects, they may keep closer to the actual releases. + +[illumian - illumos + debian package management][illumian] +-------- + +Illumian is a new project and collaboration work between Nexenta and OpenIndiana. It will provide packages through the debian package management dpkg/apt. The target audience seems to be the same as OpenIndiana. The plan at the moment is to release all packages in the same version as in OpenIndiana, so that the ultimate choice will just be, if you want to use dpkg or IPS. + +[SmartOS - the complete modern operating system][smartos] +------- + +This is not so much a distribution as a live image. Its purpose is to use all disks in the server to create a zpool and use that to provide storage for virtual machines, be it zones or KVM instances. The KVM instances are also put into zones to attach dtrace to the virtual instances to see, what's going on in that instance. +SmartOS offers also pretty nice wrappers around the VM operating to get new instances up fast. + +The company behind SmartOS is Joyent, more known for building node.js. They use SmartOS as the central pillar of their own JoyentCloud, where they host node.js applications, databases and also Linux machines. + +[omnios][omnios] +------ + +OmniOS is a very new distribution and from OmniIT. It offers not much at the moment apart from an ISO image and a small wiki. +It is intended to be used much like FreeBSD. They provide a very stripped down Illumos core with updated packages as far as possible and nothing more. Every other package one might need has to be built and distributed through a package repository. The reason behind this is, that they only want to provide the basic image, which everybody needs, but not the packages needed only by themselves. And even these packages may be one or two versions behind. +And let me tell you - the packages they already updated may be considered bleeding edge by many debian stable users. + +What next? +========== + +This was the excursion into the world of Illumos based distributions. I myself will switch away from OpenIndiana. It's great, that Illumos lives and breathes more than 4 months ago, but there is much work left to do. SmartOS had a huge impact for me and others and Joyent and Nexenta do great work on improving the Ecosystem. +But it will be hard to get back to the times where OpenSolaris was. Too much time went by unused. But I'm looking forward what else might come up of Illumos land. + +[solaris11]: http://www.oracle.com/us/products/servers-storage/solaris/solaris11/overview/index.html "Solaris 11" +[illumos]: http://illumos.org/ "the illumos project" +[openindiana]: http://openindiana.org/ "OpenIndiana" +[smartos]: http://smartos.org/ "SmartOS - the complete modern operating system" +[illumian]: http://illumian.org/ "illumian" +[nexenta]: http://nexentastor.org/ "Nexenta - the storage platform" [omnios]: http://omnios.omniti.com "OmniOS from OmniTI" diff --git a/content/post/84.md b/content/post/84.md index 7067449..ddfa3c8 100644 --- a/content/post/84.md +++ b/content/post/84.md @@ -5,18 +5,18 @@ author = "Gibheer" draft = false +++ -Okay, let's say you are a proud owner of a system and use ZFS. Now lets assume that you lost a disk from your storage and want a fast backup of your data without the hassle of packing up everything, checking for permissions and so on. If the target system has ZFS too, then this will be fun for you, because I will show you, how to make a backup of a ZFS partition and all its descendants in some small steps. - -First, you have to build a recursive snapshot for the backup. This can be done with - - zfs snapshot -r tank/testpartition@backup-today - -After that the real magic happens. We send this snapshot over ssh and import it on the other side. - - zfs send -R tank/testpartition@backup-today | ssh target.machine "zfs recv -u tank/backup-machine" - -Now all partitions from =tank/testpartition= will be put in =tank/backup-machine= and everything will be preserved. Links will be links, permissions will be the same. The flag =-u= is to prevent mounting the partitions on the target machine or else all partitions will be mounted as they were before. - -As this sends the complete dataset over the wire, it is not that usable for backups every day. For this use case, use incremental sends (with the option =-i=). On the receiving side, nothing changes. - +Okay, let's say you are a proud owner of a system and use ZFS. Now lets assume that you lost a disk from your storage and want a fast backup of your data without the hassle of packing up everything, checking for permissions and so on. If the target system has ZFS too, then this will be fun for you, because I will show you, how to make a backup of a ZFS partition and all its descendants in some small steps. + +First, you have to build a recursive snapshot for the backup. This can be done with + + zfs snapshot -r tank/testpartition@backup-today + +After that the real magic happens. We send this snapshot over ssh and import it on the other side. + + zfs send -R tank/testpartition@backup-today | ssh target.machine "zfs recv -u tank/backup-machine" + +Now all partitions from =tank/testpartition= will be put in =tank/backup-machine= and everything will be preserved. Links will be links, permissions will be the same. The flag =-u= is to prevent mounting the partitions on the target machine or else all partitions will be mounted as they were before. + +As this sends the complete dataset over the wire, it is not that usable for backups every day. For this use case, use incremental sends (with the option =-i=). On the receiving side, nothing changes. + Thanks at this point to [shl](http://blogs.interdose.com/sebastian/) for showing me ZFS. diff --git a/content/post/85.md b/content/post/85.md index 2d65fc8..89b2d30 100644 --- a/content/post/85.md +++ b/content/post/85.md @@ -5,30 +5,30 @@ author = "Stormwind" draft = false +++ -Hallo ihr, -========== - - -da habe ich es doch tatsächlich völlig verschwitzt letztes Jahr auch von dem Wollfest in Nierstein zu berichten. Also habe ich nun kurz entschlossen die Nummerierung etwas angepasst. - -Dieses Jahr bin ich schon ganz früh dran mit Wollfesten. (Im Übrigen nicht zu verwechseln mit dem bösen Wollfasten.) -In Backnang fand nämlich vorgestern und gestern das [2. Backnanger Wollfest](http://www.backnanger-wollfest.de/) statt und an dem Samstag war ich dann auch dabei. - -
-Wollbeute Teil 1

-
- -Somit konnte ich meine schon vorhandenen Wollvorräten mit noch mehr Wolle weiter aufstocken, wie man auf den Bildern unschwer erkennen kann. -Aus dem Hause Zitron gibt es jetzt ein tolles 4-fach Sockengarn, was aus zwei normalen weißen und zwei schon vorgefärbt schwarzen Fäden besteht, was bedeutet, dass es jetzt auch wunderschön dunkle Sockenwolle vom Wolldrachen gibt, die nicht zum Teil komplett Schwarz sein muss. War ja klar, dass ich mir da wieder zwei Stränge unter den Nagel reißen musste. - -Auch sehr schön, die beiden Kammzüge aus Seide einmal in grün und einmal in orange aus 100% Tussah Seide. (Ich schmachte dahin, es ist so wundervoll weich.) Da habe ich auch schon eine Idee was es werden soll, jetzt müsste es also nur noch versponnen und verzwirnt werden. Aber dazu fehlt mir noch den Faden, den ich zum verzwirnen benutzen möchte, den habe ich aber schon bestellt. Jetzt muss er nur noch hier ankommen. Ihr dürft also gespannt sein. Und ich bin es auch, obs am Ende so wird, wie ich das möchte. -Ich habe auch noch zwei weitere Kammzüge mitgebracht, allerdings sieht man den zweiten auf dem Foto nicht, da er schon zu 50% meinem Spinnrad zum Opfer gefallen ist. - -
-Wollbeute Teil 2 -
- -Und auch meinen Kater habe ich eine Freude gemacht, weil er nun einen neuen - wenngleich auch toten - Freund hat. Das Schaffell, was man im Hintergrund der Bilder sieht. Wobei er sich erst noch ein Bisschen daran gewöhnen muss. Ich glaube er hat vorher noch nie ein Fell gesehen und fand es erstmal gruselig bis er endlich einen Fuß bzw. Pfote darauf gesetzt hat. - -Bis denne, +Hallo ihr, +========== + + +da habe ich es doch tatsächlich völlig verschwitzt letztes Jahr auch von dem Wollfest in Nierstein zu berichten. Also habe ich nun kurz entschlossen die Nummerierung etwas angepasst. + +Dieses Jahr bin ich schon ganz früh dran mit Wollfesten. (Im Übrigen nicht zu verwechseln mit dem bösen Wollfasten.) +In Backnang fand nämlich vorgestern und gestern das [2. Backnanger Wollfest](http://www.backnanger-wollfest.de/) statt und an dem Samstag war ich dann auch dabei. + +
+Wollbeute Teil 1

+
+ +Somit konnte ich meine schon vorhandenen Wollvorräten mit noch mehr Wolle weiter aufstocken, wie man auf den Bildern unschwer erkennen kann. +Aus dem Hause Zitron gibt es jetzt ein tolles 4-fach Sockengarn, was aus zwei normalen weißen und zwei schon vorgefärbt schwarzen Fäden besteht, was bedeutet, dass es jetzt auch wunderschön dunkle Sockenwolle vom Wolldrachen gibt, die nicht zum Teil komplett Schwarz sein muss. War ja klar, dass ich mir da wieder zwei Stränge unter den Nagel reißen musste. + +Auch sehr schön, die beiden Kammzüge aus Seide einmal in grün und einmal in orange aus 100% Tussah Seide. (Ich schmachte dahin, es ist so wundervoll weich.) Da habe ich auch schon eine Idee was es werden soll, jetzt müsste es also nur noch versponnen und verzwirnt werden. Aber dazu fehlt mir noch den Faden, den ich zum verzwirnen benutzen möchte, den habe ich aber schon bestellt. Jetzt muss er nur noch hier ankommen. Ihr dürft also gespannt sein. Und ich bin es auch, obs am Ende so wird, wie ich das möchte. +Ich habe auch noch zwei weitere Kammzüge mitgebracht, allerdings sieht man den zweiten auf dem Foto nicht, da er schon zu 50% meinem Spinnrad zum Opfer gefallen ist. + +
+Wollbeute Teil 2 +
+ +Und auch meinen Kater habe ich eine Freude gemacht, weil er nun einen neuen - wenngleich auch toten - Freund hat. Das Schaffell, was man im Hintergrund der Bilder sieht. Wobei er sich erst noch ein Bisschen daran gewöhnen muss. Ich glaube er hat vorher noch nie ein Fell gesehen und fand es erstmal gruselig bis er endlich einen Fuß bzw. Pfote darauf gesetzt hat. + +Bis denne, Stormwind diff --git a/content/post/86.md b/content/post/86.md index 47718a0..2c291fd 100644 --- a/content/post/86.md +++ b/content/post/86.md @@ -5,10 +5,10 @@ author = "Gibheer" draft = false +++ -If you have synaptics and your application just keeps scrolling even after you stopped then put the following in your xorg.conf and it should stop that: - - Section "InputClass" - Option "CoastingSpeed" "0" - EndSection - +If you have synaptics and your application just keeps scrolling even after you stopped then put the following in your xorg.conf and it should stop that: + + Section "InputClass" + Option "CoastingSpeed" "0" + EndSection + That should help. diff --git a/content/post/87.md b/content/post/87.md index 077a465..ba4cd15 100644 --- a/content/post/87.md +++ b/content/post/87.md @@ -5,8 +5,8 @@ author = "Gibheer" draft = false +++ -Whenever you have the need to "patch" the path in a Makefile, you can do that with the following line. - - PATH := $(PATH):/optional/path - +Whenever you have the need to "patch" the path in a Makefile, you can do that with the following line. + + PATH := $(PATH):/optional/path + Use $(PATH) to get the PATH variable from the environment. `:=` is used to avoid circular dependencies in the form, that PATH gets reassigned over and over again. If you leave the colon, then make will inform you about this. diff --git a/content/post/88.md b/content/post/88.md index 670001e..43fd777 100644 --- a/content/post/88.md +++ b/content/post/88.md @@ -5,12 +5,12 @@ author = "Gibheer" draft = false +++ -If you ever have the need to generate an encrypted password to put it into scripts or anything else, then you can use the following SQL command to generate it: - - select 'md5'||md5('password'||'rolename'); - -or in shell - - echo -n 'passwordrolename' | md5sum | awk '{ print "md5" $1 }' - +If you ever have the need to generate an encrypted password to put it into scripts or anything else, then you can use the following SQL command to generate it: + + select 'md5'||md5('password'||'rolename'); + +or in shell + + echo -n 'passwordrolename' | md5sum | awk '{ print "md5" $1 }' + Important is, that your rolename is appended to your password and this construct then put into md5. The important piece in the source is [pg_md5_encrypt()](http://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/backend/libpq/md5.c) diff --git a/content/post/89.md b/content/post/89.md index 97ef33f..895653c 100644 --- a/content/post/89.md +++ b/content/post/89.md @@ -5,32 +5,32 @@ author = "Gibheer" draft = true +++ -One of the nicer things on Solaris is SMF, the service management facility. It is a replacement for the SysV init system. It's major features were parallel starting of services, built in service dependencies and pretty good reporting functionality. It also could pretty exactly report, which service failed and what other services were failing over that one. So the dependencies worked in starting and stopping direction. -One of the worst parts of it was the horrible XML file you had to write for a service to work. I never found them very intuitive and too complex to "just" start and stop a service. - -It was a pretty good experience and I found it confusing on linux, that no init system was the same. On gentoo all init scripts have a status, only some have on debian. One has to take care of logging yourself and dependencies were either managed through a start order (in archlinux in /etc/rc.conf), by alphabetical order and runlevels (in gentoo) or they built their own system into the init scripts as comments (the debian way). - -Then came ubuntu und built their own init system named upstart. It is a bit between the old SysV init system as it uses init like script files but extended them for some further information, like when to start a service. But most of the file still is mostly script code and gets executed by a shell. -One of the largest change for old users is, that this system can't make use of `/etc/init.d/scriptname start` anymore. Instead you use `start service` or `stop service`. I think, this is a pretty good API and much better for new users to learn. -It can react on events to start and stop services and also can try to restart failed services. Services can also communicate with upstart over dbus. - -Systemd on the other hand is a very different to SysV. At first I was a bit skeptical because of all the negativity. But now I run 3 systems with systemd and till now, it feels good. These three systems are all archlinux boxes and there the migrations is very easy. You can take a look at the [wiki page][archlinux-wiki-systemd]. You can run systemd parallel to SysV init and start it with a parameter in grub. If you feel confident enough you can uninstall the old system and use only systemd in the future. - -So what exactly has systemd, what SysV is missing? - -It uses udev (or udev systemd?) pretty intensive, so that it can show you information about your hardware. -Another thing is, that it can start the daemons in parallel. This alone cut my boot time in half. But it is not that important to me. It was just a wow effect. -Next is the management of the service themselves. The command `systemctl` is the API to everything in systemd, so not as nice as upstart. But with just `systemctl` you already get an overview which services are currently loaded, running and which failed (here is a [gist of what it looks like][github-systemctl-output]). You can start and stop services with `systemctl start` or `systemctl stop` but this will make it not permanent. If you come from solaris and SMF you will find it confusing, as an _enable_ or _disable_ will activate and start the service, or disable and stop the service. But I found it pretty helpful when switchting from one thing to another and I just don't want to stop the service. -Think about switching the login manager. You may have installed the new one, enable it to start at boot time and disable the old one. Now you can still do other things and wait with the restart or you switch to the terminal and stop the old one and start the new one. I waited and did some configuration and afterwards, restarted the hole machine. Did not take me any longer than switching to the console. -Another feature is, that systemd has an included logger. For some it may be not a feature as they already use a configured syslog-ng and don't worry, you can still use it. The program is called journalctl and is bundled with systemd. Systemd starts every deamon within the logger context, so that every program does not have to worry about logging anymore but can just spout it onto STDOUT and systemd takes care of the rest. Yes, it sounds pretty retarded, but with it comes a pretty neat feature. If you now call `systemctl status service` you get an overview of the status of the service including the last couple log entries! As systemd builds automatic cgroups it can also show our the daemon dependencies. You can see how it looks like for [net-auto-wireless][github-systemctl-status] on my laptop. - -And I would say, that this is by far the best systemd could give me. If a service dies, I need to know all these things and this is the first system, which can show me. Not even SMF could do that. It would just tell me that my service died and others died of it as well, but it could not tell me exactly why or show me the logs. - -Yes, my machines all boot faster and I profit from it. I shut down my pcs now. But that is nothing in comparison to the context I get when looking at a service. I can only recommend for everyone to try systemd and look for yourself, if it may help you get your work done faster. - -At the moment fedora, Suse and Mandriva seem to be only one using systemd by default. There are other distributions having packages for them. From debian I know, that you [can't replace][debian-systemd] the SysV as easy as on archlinux. But it seems to work. There are already many service files out there for various daemons so it seems to get moving pretty fast. It will be interesting how fast it will be adopted by various distributions. - -[archlinux-wiki-systemd]: https://wiki.archlinux.org/index.php/Systemd -[github-systemctl-output]: https://gist.github.com/3180643#file_gistfile1.txt -[github-systemctl-status]: https://gist.github.com/3180643#file_systemctl_status_net_auto_wireless +One of the nicer things on Solaris is SMF, the service management facility. It is a replacement for the SysV init system. It's major features were parallel starting of services, built in service dependencies and pretty good reporting functionality. It also could pretty exactly report, which service failed and what other services were failing over that one. So the dependencies worked in starting and stopping direction. +One of the worst parts of it was the horrible XML file you had to write for a service to work. I never found them very intuitive and too complex to "just" start and stop a service. + +It was a pretty good experience and I found it confusing on linux, that no init system was the same. On gentoo all init scripts have a status, only some have on debian. One has to take care of logging yourself and dependencies were either managed through a start order (in archlinux in /etc/rc.conf), by alphabetical order and runlevels (in gentoo) or they built their own system into the init scripts as comments (the debian way). + +Then came ubuntu und built their own init system named upstart. It is a bit between the old SysV init system as it uses init like script files but extended them for some further information, like when to start a service. But most of the file still is mostly script code and gets executed by a shell. +One of the largest change for old users is, that this system can't make use of `/etc/init.d/scriptname start` anymore. Instead you use `start service` or `stop service`. I think, this is a pretty good API and much better for new users to learn. +It can react on events to start and stop services and also can try to restart failed services. Services can also communicate with upstart over dbus. + +Systemd on the other hand is a very different to SysV. At first I was a bit skeptical because of all the negativity. But now I run 3 systems with systemd and till now, it feels good. These three systems are all archlinux boxes and there the migrations is very easy. You can take a look at the [wiki page][archlinux-wiki-systemd]. You can run systemd parallel to SysV init and start it with a parameter in grub. If you feel confident enough you can uninstall the old system and use only systemd in the future. + +So what exactly has systemd, what SysV is missing? + +It uses udev (or udev systemd?) pretty intensive, so that it can show you information about your hardware. +Another thing is, that it can start the daemons in parallel. This alone cut my boot time in half. But it is not that important to me. It was just a wow effect. +Next is the management of the service themselves. The command `systemctl` is the API to everything in systemd, so not as nice as upstart. But with just `systemctl` you already get an overview which services are currently loaded, running and which failed (here is a [gist of what it looks like][github-systemctl-output]). You can start and stop services with `systemctl start` or `systemctl stop` but this will make it not permanent. If you come from solaris and SMF you will find it confusing, as an _enable_ or _disable_ will activate and start the service, or disable and stop the service. But I found it pretty helpful when switchting from one thing to another and I just don't want to stop the service. +Think about switching the login manager. You may have installed the new one, enable it to start at boot time and disable the old one. Now you can still do other things and wait with the restart or you switch to the terminal and stop the old one and start the new one. I waited and did some configuration and afterwards, restarted the hole machine. Did not take me any longer than switching to the console. +Another feature is, that systemd has an included logger. For some it may be not a feature as they already use a configured syslog-ng and don't worry, you can still use it. The program is called journalctl and is bundled with systemd. Systemd starts every deamon within the logger context, so that every program does not have to worry about logging anymore but can just spout it onto STDOUT and systemd takes care of the rest. Yes, it sounds pretty retarded, but with it comes a pretty neat feature. If you now call `systemctl status service` you get an overview of the status of the service including the last couple log entries! As systemd builds automatic cgroups it can also show our the daemon dependencies. You can see how it looks like for [net-auto-wireless][github-systemctl-status] on my laptop. + +And I would say, that this is by far the best systemd could give me. If a service dies, I need to know all these things and this is the first system, which can show me. Not even SMF could do that. It would just tell me that my service died and others died of it as well, but it could not tell me exactly why or show me the logs. + +Yes, my machines all boot faster and I profit from it. I shut down my pcs now. But that is nothing in comparison to the context I get when looking at a service. I can only recommend for everyone to try systemd and look for yourself, if it may help you get your work done faster. + +At the moment fedora, Suse and Mandriva seem to be only one using systemd by default. There are other distributions having packages for them. From debian I know, that you [can't replace][debian-systemd] the SysV as easy as on archlinux. But it seems to work. There are already many service files out there for various daemons so it seems to get moving pretty fast. It will be interesting how fast it will be adopted by various distributions. + +[archlinux-wiki-systemd]: https://wiki.archlinux.org/index.php/Systemd +[github-systemctl-output]: https://gist.github.com/3180643#file_gistfile1.txt +[github-systemctl-status]: https://gist.github.com/3180643#file_systemctl_status_net_auto_wireless [debian-systemd]: http://wiki.debian.org/systemd#Issue_.231:_sysvinit_vs._systemd-sysv diff --git a/content/post/90.md b/content/post/90.md index e382623..6db369a 100644 --- a/content/post/90.md +++ b/content/post/90.md @@ -5,20 +5,20 @@ author = "Gibheer" draft = false +++ -To rotate logs on a Solaris system you have to configure logadm to do it. - -This is a small example on how it could look like for lighttpd. - -Execute the two following statements to create two log entries - - logadm -w /var/lighttpd/1.4/logs/access.log -p 1d -C 8 -a 'pkill -HUP lighttpd; true' - logadm -w /var/lighttpd/1.4/logs/error.log -p 1d -C 8 -a 'pkill -HUP lighttpd; true' - -After that, there should be two new entries in `/etc/logadm.conf` with all parameters you gave to logadm. The parameters mean, that the logs will be rotated once a day and 8 old logfiles will be stored. With every rotation lighttpd will be reloaded to use the new empty log file. For more parameters read the man page of logadm. there are also some nice examples at the bottom. - -To try it out and see if it runs, create enough log entries and then call logadm with the logfile. In this case it would be - - logadm /var/lighttpd/1.4/logs/access.log - logadm /var/lighttpd/1.4/logs/error.log - +To rotate logs on a Solaris system you have to configure logadm to do it. + +This is a small example on how it could look like for lighttpd. + +Execute the two following statements to create two log entries + + logadm -w /var/lighttpd/1.4/logs/access.log -p 1d -C 8 -a 'pkill -HUP lighttpd; true' + logadm -w /var/lighttpd/1.4/logs/error.log -p 1d -C 8 -a 'pkill -HUP lighttpd; true' + +After that, there should be two new entries in `/etc/logadm.conf` with all parameters you gave to logadm. The parameters mean, that the logs will be rotated once a day and 8 old logfiles will be stored. With every rotation lighttpd will be reloaded to use the new empty log file. For more parameters read the man page of logadm. there are also some nice examples at the bottom. + +To try it out and see if it runs, create enough log entries and then call logadm with the logfile. In this case it would be + + logadm /var/lighttpd/1.4/logs/access.log + logadm /var/lighttpd/1.4/logs/error.log + After that, it should have created new log files and reloaded lighttpd. diff --git a/content/post/91.md b/content/post/91.md index c97daf5..4d2aefd 100644 --- a/content/post/91.md +++ b/content/post/91.md @@ -5,14 +5,14 @@ author = "Gibheer" draft = false +++ -After I switched everywhere to a tiling wm, I wondered how everybody else locks his screen. Sure, you can lock the screen with a keybinding, but what when you leave the pc for talking and then leave it be? - -The tool I found is [xautolock][xautolock] and works pretty good. After a configurable time span it starts the lock and after another time it can also start suspend, hibernate or whatever. I use it with the following settings: - - xautolock -locker slock -time 2 -killer "systemctl suspend" -killtime 10 & - -This starts slock, the simple locker, after two minutes and sends the pc into suspend after 10 minutes in activity. As it runs in the background, you can either start it through .xinitrc or with your wm of choice. - -To lock the screen by command, bind `xautolock -locknow` to your keys and it calls the deamon which then calls the locker. - +After I switched everywhere to a tiling wm, I wondered how everybody else locks his screen. Sure, you can lock the screen with a keybinding, but what when you leave the pc for talking and then leave it be? + +The tool I found is [xautolock][xautolock] and works pretty good. After a configurable time span it starts the lock and after another time it can also start suspend, hibernate or whatever. I use it with the following settings: + + xautolock -locker slock -time 2 -killer "systemctl suspend" -killtime 10 & + +This starts slock, the simple locker, after two minutes and sends the pc into suspend after 10 minutes in activity. As it runs in the background, you can either start it through .xinitrc or with your wm of choice. + +To lock the screen by command, bind `xautolock -locknow` to your keys and it calls the deamon which then calls the locker. + [xautolock]: http://freecode.com/projects/xautolock diff --git a/content/post/92.md b/content/post/92.md index 0dc268d..d3612a2 100644 --- a/content/post/92.md +++ b/content/post/92.md @@ -5,90 +5,90 @@ author = "Gibheer" draft = false +++ -Just out of curiosity I tried to build a service for PostgreSQL and the systemd init system. Before that, I only read the service files of postgres and dhcp delivered with Archlinux. What I wanted to build is a service file able to start multiple instances of postgres with separate configuration files. - -This was much easier than I thought it would be. - -Systemd supports that pretty well and the only thing to do, is add an '@' to the service file name. Everything after '@' is then put into a variable `%I`, which can be used in the service file. So my service file was named 'pg@.service' and I put it into `/etc/systemd/system`. Another possible location is `/usr/lib/systemd/system/`. - -The service file looks like an `.ini` file. It has the three sections Unit, Service and Install. The section Install in which target the service is installed. Targets are like run levels in other init systems. The postgres service gets installed into the multi-user target, which is started after the network: - - [Install] - WantedBy=multi-user.target - -The next part is Unit. This section describes the service with a short description and a description of the dependencies. Postgres just needs the network up, so this section looks like this: - - [Unit] - Description=run PostgreSQL instance %I - After=network.target - -There you can also see the %I, which is replaced with the part after '@' from the name in systemd. - -The next section is a bit larger and describes everything needed to manage the service itself, like start, stop and reload. - - [Service] - User=postgres - Group=postgres - TimeoutSec=120 - Type=forking - - EnvironmentFile=/etc/conf.d/pg.%I - - SyslogIdentifier=postgres-%i - - ExecStartPre=/usr/bin/postgresql-check-db-dir ${pgdata} - ExecStart= /usr/bin/pg_ctl -s -D ${pgdata} start -w -t 120 - ExecReload=/usr/bin/pg_ctl -s -D ${pgdata} reload - ExecStop= /usr/bin/pg_ctl -s -D ${pgdata} stop -m fast - - OOMScoreAdjust=-200 - -Okay, this is a bit longer than the other parts. The first Couple of options handle the user to start with and he startup timeout. The timeout can't be replaced with a variable because all options from the config will be loaded as environment variables on execution. The Type option is very important, because it can't be set to anything else as forking for postgres, because it will fork to the background. So if you start it as a simple service systemd would loose the handler to postgres and stop it immediately. - -The next options are EnvironmentFile and SyslogIdentifier. The first is for a small config file in `/etc/conf.d/pg.instance` where you replace instance with the instance name. As you can see with the %I in place, it will fill up the full name with the instance identifier. So you can use different config files for different instances. The same happens to the SyslogIdentifier. I thought it would be awesome if the log can be showed per instance and this is what you need to make it happen. - -The option OOMScoreAdjust is just an option for the OOMKiller, that it should leave postgres alone as much as possible. - -The option ExecStartPre calls a script which is delivered with postgres on Archlinux and does a check for the data dir. If it does not exist, it will log a line on how to create it. Pretty neat. ExecStart, ExecStop and ExecReload describe the actions to be done, when the service should be started, stopped or reloaded. As you can see, the script uses `${pgdata}` to determine where to look and that variable comes from the EnvironmentFile, which looks for my first instance like this - - pgdata=/tmp/ins1 - -The file is saved as `/etc/conf.d/pg.ins1` and is really nothing more than this. The rest can handle postgres itself. - -Now how do we get the service file into systemd? You do a - - systemctl --system daemon-reload - -and then - - systemctl start pg@ins1.service - -This creates your first service and tries to start it. You will get an error message like the following - - Job for pg@ins1.service failed. See 'systemctl status pg@ins1.service' and 'journalctl' for details. - -If you run the status, you will see that it failed, how it failed and the log message from the check script. After that, you can create the instance and start it anew there it is. - - # systemctl status pg@ins1.service - pg@ins1.service - PostgreSQL database server - Loaded: loaded (/etc/systemd/system/pg@ins1.service; disabled) - Active: active (running) since Tue, 25 Sep 2012 09:27:54 +0200; 3 days ago - Process: 372 ExecStop=/usr/bin/pg_ctl -s -D ${PGROOT}/data stop -m fast (code=exited, status=0/SUCCESS) - Process: 624 ExecStart=/usr/bin/pg_ctl -s -D ${PGROOT}/data start -w -t 120 (code=exited, status=0/SUCCESS) - Process: 619 ExecStartPre=/usr/bin/postgresql-check-db-dir ${PGROOT}/data (code=exited, status=0/SUCCESS) - Main PID: 627 (postgres) - CGroup: name=systemd:/system/postgresql.service - ├ 627 /usr/bin/postgres -D /var/lib/postgres/data - ├ 629 postgres: checkpointer process - ├ 630 postgres: writer process - ├ 631 postgres: wal writer process - ├ 632 postgres: autovacuum launcher process - └ 633 postgres: stats collector process - -Now if you want to see some logging, you can ask `journcalctl` and give it the log string. - - journcalctl SYSLOG_IDENTIFIER=postgres-instance1 - -That's all there is to multi instance services on syslog. To figure everything out actually took not even much time, as the documentation is pretty good. Just a hint, don't look in the web for documentation but in the man pages. The best starting point to look for documentation is `man systemd` and then take a look at the _SEE ALSO_ section. - +Just out of curiosity I tried to build a service for PostgreSQL and the systemd init system. Before that, I only read the service files of postgres and dhcp delivered with Archlinux. What I wanted to build is a service file able to start multiple instances of postgres with separate configuration files. + +This was much easier than I thought it would be. + +Systemd supports that pretty well and the only thing to do, is add an '@' to the service file name. Everything after '@' is then put into a variable `%I`, which can be used in the service file. So my service file was named 'pg@.service' and I put it into `/etc/systemd/system`. Another possible location is `/usr/lib/systemd/system/`. + +The service file looks like an `.ini` file. It has the three sections Unit, Service and Install. The section Install in which target the service is installed. Targets are like run levels in other init systems. The postgres service gets installed into the multi-user target, which is started after the network: + + [Install] + WantedBy=multi-user.target + +The next part is Unit. This section describes the service with a short description and a description of the dependencies. Postgres just needs the network up, so this section looks like this: + + [Unit] + Description=run PostgreSQL instance %I + After=network.target + +There you can also see the %I, which is replaced with the part after '@' from the name in systemd. + +The next section is a bit larger and describes everything needed to manage the service itself, like start, stop and reload. + + [Service] + User=postgres + Group=postgres + TimeoutSec=120 + Type=forking + + EnvironmentFile=/etc/conf.d/pg.%I + + SyslogIdentifier=postgres-%i + + ExecStartPre=/usr/bin/postgresql-check-db-dir ${pgdata} + ExecStart= /usr/bin/pg_ctl -s -D ${pgdata} start -w -t 120 + ExecReload=/usr/bin/pg_ctl -s -D ${pgdata} reload + ExecStop= /usr/bin/pg_ctl -s -D ${pgdata} stop -m fast + + OOMScoreAdjust=-200 + +Okay, this is a bit longer than the other parts. The first Couple of options handle the user to start with and he startup timeout. The timeout can't be replaced with a variable because all options from the config will be loaded as environment variables on execution. The Type option is very important, because it can't be set to anything else as forking for postgres, because it will fork to the background. So if you start it as a simple service systemd would loose the handler to postgres and stop it immediately. + +The next options are EnvironmentFile and SyslogIdentifier. The first is for a small config file in `/etc/conf.d/pg.instance` where you replace instance with the instance name. As you can see with the %I in place, it will fill up the full name with the instance identifier. So you can use different config files for different instances. The same happens to the SyslogIdentifier. I thought it would be awesome if the log can be showed per instance and this is what you need to make it happen. + +The option OOMScoreAdjust is just an option for the OOMKiller, that it should leave postgres alone as much as possible. + +The option ExecStartPre calls a script which is delivered with postgres on Archlinux and does a check for the data dir. If it does not exist, it will log a line on how to create it. Pretty neat. ExecStart, ExecStop and ExecReload describe the actions to be done, when the service should be started, stopped or reloaded. As you can see, the script uses `${pgdata}` to determine where to look and that variable comes from the EnvironmentFile, which looks for my first instance like this + + pgdata=/tmp/ins1 + +The file is saved as `/etc/conf.d/pg.ins1` and is really nothing more than this. The rest can handle postgres itself. + +Now how do we get the service file into systemd? You do a + + systemctl --system daemon-reload + +and then + + systemctl start pg@ins1.service + +This creates your first service and tries to start it. You will get an error message like the following + + Job for pg@ins1.service failed. See 'systemctl status pg@ins1.service' and 'journalctl' for details. + +If you run the status, you will see that it failed, how it failed and the log message from the check script. After that, you can create the instance and start it anew there it is. + + # systemctl status pg@ins1.service + pg@ins1.service - PostgreSQL database server + Loaded: loaded (/etc/systemd/system/pg@ins1.service; disabled) + Active: active (running) since Tue, 25 Sep 2012 09:27:54 +0200; 3 days ago + Process: 372 ExecStop=/usr/bin/pg_ctl -s -D ${PGROOT}/data stop -m fast (code=exited, status=0/SUCCESS) + Process: 624 ExecStart=/usr/bin/pg_ctl -s -D ${PGROOT}/data start -w -t 120 (code=exited, status=0/SUCCESS) + Process: 619 ExecStartPre=/usr/bin/postgresql-check-db-dir ${PGROOT}/data (code=exited, status=0/SUCCESS) + Main PID: 627 (postgres) + CGroup: name=systemd:/system/postgresql.service + ├ 627 /usr/bin/postgres -D /var/lib/postgres/data + ├ 629 postgres: checkpointer process + ├ 630 postgres: writer process + ├ 631 postgres: wal writer process + ├ 632 postgres: autovacuum launcher process + └ 633 postgres: stats collector process + +Now if you want to see some logging, you can ask `journcalctl` and give it the log string. + + journcalctl SYSLOG_IDENTIFIER=postgres-instance1 + +That's all there is to multi instance services on syslog. To figure everything out actually took not even much time, as the documentation is pretty good. Just a hint, don't look in the web for documentation but in the man pages. The best starting point to look for documentation is `man systemd` and then take a look at the _SEE ALSO_ section. + Have fun! diff --git a/content/post/93.md b/content/post/93.md index 9c48d0e..a21cb69 100644 --- a/content/post/93.md +++ b/content/post/93.md @@ -5,49 +5,49 @@ author = "Gibheer" draft = false +++ -Today we release a small project from me - [zero][zero-github] 0.1.0. - -It is aimed at being a toolkit for building web services. It is build around the idea of abstracting away what is tedious work and work with the information clearer. With that in mind, some modules are already included. These are the following. - -Request -------- - -This class provides an interface to information regarding the request and making them available grouped together in other parts. - -One example is the grouping of parameters in one attribute `request.params` which makes *get* and *post* parameters available separately. As many developers also regard URLs as some kind of parameters it is possible to define custom key/value pairs. - -Another example is the grouping of all accept headers under `#accept`, which makes accessing type information nice to read: `request.accept.types`. - -Response --------- - -The response class helps in building responses in a easy way. It provides similar interface as the `Rack::Response`. It also does a small check already for status code correctness and will probably get more helpers in the future to set common headers and status codes. - -Router ------- - -Zero has a small router which takes routes and pushes the request to other applications. A similar implementation is Rack::URLMap, but this router is also able to extract variables from the URL and puts them into the Request. - -Renderer --------- - -The renderer is a facility to render templates according to the accept type wanted by the client. That is possible by providing a map of short type names to the actual mimetypes which is then used internally to search for the right template. With this, developers have only to provide the template and mapping and then the rendering takes care of actually using it. - -The router does not take care of the actual method of the request. This can be done before the router with a small application defining routers for every possible method or working with the method in the applications called by the routers. - -Controller ----------- - -This component is still a "Work in Progress" but can already be used to glue all these parts together. It splits the work into two steps - processing the request and rendering the resulting data. If that workflow does not fit, it is also possible to extend or modify the controller to adapt other work flows. - -Status and Future of the toolset --------------------------------- - -The idea is to make web service development easier than before and this is only the beginning of zero. The plan is to extend the toolkit with more modules and make all modules possibly available as stand alone modules. That way, zero can be used in other projects to replace parts or help in making developing easier. It is a Work in Progress at the moment but the results so far are very promising. - -We also have a [repository for example applications][zero-examples] and we will extend it with the time to show as many aspects of the toolkit as possible. - -If you are interested, checkout [zero on github][zero-github] or have a look at the [examples][zero-examples]. - -[zero-github]: https://github.com/Gibheer/zero +Today we release a small project from me - [zero][zero-github] 0.1.0. + +It is aimed at being a toolkit for building web services. It is build around the idea of abstracting away what is tedious work and work with the information clearer. With that in mind, some modules are already included. These are the following. + +Request +------- + +This class provides an interface to information regarding the request and making them available grouped together in other parts. + +One example is the grouping of parameters in one attribute `request.params` which makes *get* and *post* parameters available separately. As many developers also regard URLs as some kind of parameters it is possible to define custom key/value pairs. + +Another example is the grouping of all accept headers under `#accept`, which makes accessing type information nice to read: `request.accept.types`. + +Response +-------- + +The response class helps in building responses in a easy way. It provides similar interface as the `Rack::Response`. It also does a small check already for status code correctness and will probably get more helpers in the future to set common headers and status codes. + +Router +------ + +Zero has a small router which takes routes and pushes the request to other applications. A similar implementation is Rack::URLMap, but this router is also able to extract variables from the URL and puts them into the Request. + +Renderer +-------- + +The renderer is a facility to render templates according to the accept type wanted by the client. That is possible by providing a map of short type names to the actual mimetypes which is then used internally to search for the right template. With this, developers have only to provide the template and mapping and then the rendering takes care of actually using it. + +The router does not take care of the actual method of the request. This can be done before the router with a small application defining routers for every possible method or working with the method in the applications called by the routers. + +Controller +---------- + +This component is still a "Work in Progress" but can already be used to glue all these parts together. It splits the work into two steps - processing the request and rendering the resulting data. If that workflow does not fit, it is also possible to extend or modify the controller to adapt other work flows. + +Status and Future of the toolset +-------------------------------- + +The idea is to make web service development easier than before and this is only the beginning of zero. The plan is to extend the toolkit with more modules and make all modules possibly available as stand alone modules. That way, zero can be used in other projects to replace parts or help in making developing easier. It is a Work in Progress at the moment but the results so far are very promising. + +We also have a [repository for example applications][zero-examples] and we will extend it with the time to show as many aspects of the toolkit as possible. + +If you are interested, checkout [zero on github][zero-github] or have a look at the [examples][zero-examples]. + +[zero-github]: https://github.com/Gibheer/zero [zero-examples]: https://github.com/Gibheer/zero-examples diff --git a/content/post/94.md b/content/post/94.md index 1b4e2e9..c33d46e 100644 --- a/content/post/94.md +++ b/content/post/94.md @@ -5,60 +5,60 @@ author = "Gibheer" draft = false +++ -Today someone told me about natural and inner joins. As I'm using SQL for many years already, I was a bit puzzled at first. I heard of the terms, but thought till now, that they were meaning the same. - -The first thing I did was looking in the [PostgreSQL documentation][pg-doc] and yes, they are not the same. But they are also the same. - -The inner join is the default for doing joins. It just joins two tables using the on clause. - - # select * - from tableA A - join tableB B - on A.id = B.id; - - | a.id | b.id | - |------|------| - | 3 | 3 | - -Now an interesting thing is, that the on clause can be replaced by a using clause when both tables provide the same columns. This not only makes the select a bit shorter, but also reduces the number of columns in the result. All columns listed in the using clause will be left out from the result and replaced with a new column with the name used in the using clause. The select from above would then look like this - - # select * - from tableA A - join tableB B - using (id); - - | id | - |----| - | 3 | - -The natural join goes one step further and tries to search for common columns itself and generate a using clause itself. The resulting query then looks like this - - # select * - from tableA A - natural join tableB B; - - | id | - |----| - | 3 | - -As nice as this seems it can backfire pretty fast, when one has two tables with a column of the same name, but completely different content not meant to be joined. Then it is possible just to get nothing. - - # select * from foo limit 1; - id | test | bar - ----+------+----- - 1 | 1 | 3 - - # select * from baz limit 1; - id | test | bar - ----+------+----- - 1 | 1 | 20 - - # select * from foo natural join baz - id | test | bar - ----+------+----- - -As all columns are named the same, but the content is different in column bar, no common row is found and therefore returned. - -For further information, the [PostgreSQL documentation][pg-doc] is pretty good. - +Today someone told me about natural and inner joins. As I'm using SQL for many years already, I was a bit puzzled at first. I heard of the terms, but thought till now, that they were meaning the same. + +The first thing I did was looking in the [PostgreSQL documentation][pg-doc] and yes, they are not the same. But they are also the same. + +The inner join is the default for doing joins. It just joins two tables using the on clause. + + # select * + from tableA A + join tableB B + on A.id = B.id; + + | a.id | b.id | + |------|------| + | 3 | 3 | + +Now an interesting thing is, that the on clause can be replaced by a using clause when both tables provide the same columns. This not only makes the select a bit shorter, but also reduces the number of columns in the result. All columns listed in the using clause will be left out from the result and replaced with a new column with the name used in the using clause. The select from above would then look like this + + # select * + from tableA A + join tableB B + using (id); + + | id | + |----| + | 3 | + +The natural join goes one step further and tries to search for common columns itself and generate a using clause itself. The resulting query then looks like this + + # select * + from tableA A + natural join tableB B; + + | id | + |----| + | 3 | + +As nice as this seems it can backfire pretty fast, when one has two tables with a column of the same name, but completely different content not meant to be joined. Then it is possible just to get nothing. + + # select * from foo limit 1; + id | test | bar + ----+------+----- + 1 | 1 | 3 + + # select * from baz limit 1; + id | test | bar + ----+------+----- + 1 | 1 | 20 + + # select * from foo natural join baz + id | test | bar + ----+------+----- + +As all columns are named the same, but the content is different in column bar, no common row is found and therefore returned. + +For further information, the [PostgreSQL documentation][pg-doc] is pretty good. + [pg-doc]: http://www.postgresql.org/docs/current/static/queries-table-expressions.html diff --git a/content/post/95.md b/content/post/95.md index ddb454f..0c95577 100644 --- a/content/post/95.md +++ b/content/post/95.md @@ -5,22 +5,22 @@ author = "Gibheer" draft = false +++ -This is some kind of hint for others, which may have the same problems I had. - -I wanted to compile [llvm](http://llvm.org/) 3.1 on omnios, an illumos distribution but it did not work out like I wanted it to. One of the first errors I got was a linking error. - - Text relocation remains referenced - against symbol offset in file - llvm::LoopBase::getLoopPredecessor() const 0x149a /tmp/build_gibheer/llvm-3.1.src/Release/lib/libLLVMCodeGen.a(MachineLICM.o) - llvm::LoopBase::getExitBlocks(llvm::SmallVectorImpl&) const 0x6200 /tmp/build_gibheer/llvm-3.1.src/Release/lib/libLLVMCodeGen.a(MachineLICM.o) - ld: fatal: relocations remain against allocatable but non-writable sections - -The problem in this case is, that parts of the llvm code are not compiled position independent (PIC). As I learned, this can be solved with the following setting. - - LDFLAGS="-mimpure-text -Wl,-ztextwarn" - -This changes the way of linking to only warn about position independent code, but still link it all together. It is not a nice solution, but with this, it is possible to find out, where it is gooing wrong. - -After that problem partially solved, I had another problem. Solaris supports 32bit and 64bit programs on the same environment, just like you can do on linux with multilib. The first compile of llvm produced 32bit binaries. When trying to compile llvm for 64bit, it was just impossible. I tried different things, like setting `CFLAGS`, `LDFLAGS`, `OTHER_OPTIONS` whatever there was and the only thing to get it compiled for 64bit is to overwrite `CC` and `CXX`. It seems like the Makefile just ignores the CFLAGS and therefore does only compile the code for the hostsystem seemingly bitness. - +This is some kind of hint for others, which may have the same problems I had. + +I wanted to compile [llvm](http://llvm.org/) 3.1 on omnios, an illumos distribution but it did not work out like I wanted it to. One of the first errors I got was a linking error. + + Text relocation remains referenced + against symbol offset in file + llvm::LoopBase::getLoopPredecessor() const 0x149a /tmp/build_gibheer/llvm-3.1.src/Release/lib/libLLVMCodeGen.a(MachineLICM.o) + llvm::LoopBase::getExitBlocks(llvm::SmallVectorImpl&) const 0x6200 /tmp/build_gibheer/llvm-3.1.src/Release/lib/libLLVMCodeGen.a(MachineLICM.o) + ld: fatal: relocations remain against allocatable but non-writable sections + +The problem in this case is, that parts of the llvm code are not compiled position independent (PIC). As I learned, this can be solved with the following setting. + + LDFLAGS="-mimpure-text -Wl,-ztextwarn" + +This changes the way of linking to only warn about position independent code, but still link it all together. It is not a nice solution, but with this, it is possible to find out, where it is gooing wrong. + +After that problem partially solved, I had another problem. Solaris supports 32bit and 64bit programs on the same environment, just like you can do on linux with multilib. The first compile of llvm produced 32bit binaries. When trying to compile llvm for 64bit, it was just impossible. I tried different things, like setting `CFLAGS`, `LDFLAGS`, `OTHER_OPTIONS` whatever there was and the only thing to get it compiled for 64bit is to overwrite `CC` and `CXX`. It seems like the Makefile just ignores the CFLAGS and therefore does only compile the code for the hostsystem seemingly bitness. + But both of these problems got solved with 3.2, which I tried from svn and they work. The release date of 3.2 is only 7 days away, so hopefully it will still work by then. Nice thing is, [Rubinius](https://github.com/rubinius/rubinius) can already use it :D diff --git a/content/post/96.md b/content/post/96.md index 826a0bf..0e42e60 100644 --- a/content/post/96.md +++ b/content/post/96.md @@ -5,140 +5,140 @@ author = "Gibheer" draft = false +++ -I got an interesting question regarding zones on Solaris in #omnios. - -> scarcry: Does anyone know how to move a zone from one zpool to another? - -There are some guides out there on how to move a zone from one machine to -another, but most of them install the zone in the same place as before. - -But instead of moving it from one machine to another, this small guide will just -show what to do, when only the location is chaning. - -preparations ------------- - -First, we need to setup the partitions and zones for our little experiment. For -this example, I will use the pool `rpool` and the following partitions - -* `rpool/zones/old` mounted to `/zones/old/` -* `rpool/zones/new` mounted to `/zones/new/` - -We also need the zone config, so here is it. - - create -b - set zonepath=/zones/old/zone1 - set ip-type=exclusive - set autoboot=false - add net - set physical=zone1 - end - commit - -Just install the zone with the normal commands - - $ zonecfg -z zone1 < zone.config - $ zoneadm -z zone1 install - $ zoneadm -z zone1 boot - -Check if the zone is running and write a file, just to make sure, we have the -same zone at the end. - -moving the zone ---------------- - -For this guide, we will assume, that the zone is in production use and can't be -offline too long. For that to work, we will do a first snapshot, when the zone -is still running. - - $ zfs snapshot -r rpool/zones/old/zone1@move1 - -After that, we can replay that snapshot into the new location. - - $ zfs send -R rpool/zones/old/zone1@move1 | zfs recv rpool/zones/new/zone1 - -This step will take some time, depending on the size of your zone. Now we stop -the the zone and detach it. - - $ zoneadm -z zone1 halt - $ zoneadm -z zone1 detach - -This frees the zfs partition from the zone and makes it accessible. We need that -a bit later. -Now we need an incremental snapshot and move that data to the new location. - - $ zfs snapshot -r rpool/zones/old/zone1@move2 - $ zfs send -R -i move1 rpool/zones/old/zone1@move2 | zfs recv rpool/zones/new/zone1 - -When we now list all zfs partitions, we see, that a partition zbe is mounted two -times into the same location. - - rpool/zones/old/zone1/ROOT/zbe 724M 1.59T 723M /zones/old/zone1/root - rpool/zones/new/zone1/ROOT/zbe 724M 1.59T 723M /zones/old/zone1/root - -To fix that, issue the following command. - - zfs set mountpoint=/zones/new/zone1/root rpool/zones/new/zone1/ROOT/zbe - -Now the partition has to be mounted, so that zoneadm can find it for the attach. -You can do that with the following command - - zfs mount rpool/zones/new/zone1/ROOT/zbe - -Now with the partition in the correct place, we have to tell the zone, where to -look for its new partition. - - $ zonecfg -z zone1 - zonecfg:zone1> set zonepath=/zones/new/zone1 - zonecfg:zone1> verify - zonecfg:zone1> commit - zonecfg:zone1> exit - -With the zone reconfigured, attach the zone. - - $ zoneadm -z zone1 attach - -This may take a bit of time, as the content of the zone gets checked for -compatibility. When it is back, check the zone is installed. - - $ zoneadm list -cv - ID NAME STATUS PATH BRAND IP - - zone1 installed /zones/new/zone1 ipkg excl - -Now boot the zone and we are done. - - $ zoneadm -z zone1 boot - -Now check if everything is where you expect it to be and start your services and -everything is good. - -ideas ------ - -Here are some ideas, what can be done differently in the process. - -### **iterative snapshots** - -If you zone has a lot of traffic, where many changes aggregate between the first -snapshot and the second, do some more iterative snapshots before taking down the -zone. -This has the advantage, that you can close the gap of changes to a minimum size -and therefore make the move at the end a bit faster. But check the available -disk space in the process to avoid a full disk. - -### **create a new zone** - -Instead of chaning the old zone and therefore making a rollback more complicated, -create a new zone, which looks exactly like the old one. -Instead of chaning the old one, do instead - - $ zonecfg -z zone2 - zonecfg:zone2> create -a /zones/new/zone1 - -This will set everything from the old zone with the new zonepath. Keep in mind, -that this will also use the old interface. If you don't want that, create a new -interface before and change it in the config step. - -You can also restore that zfs partition in a partition which has the correct. - +I got an interesting question regarding zones on Solaris in #omnios. + +> scarcry: Does anyone know how to move a zone from one zpool to another? + +There are some guides out there on how to move a zone from one machine to +another, but most of them install the zone in the same place as before. + +But instead of moving it from one machine to another, this small guide will just +show what to do, when only the location is chaning. + +preparations +------------ + +First, we need to setup the partitions and zones for our little experiment. For +this example, I will use the pool `rpool` and the following partitions + +* `rpool/zones/old` mounted to `/zones/old/` +* `rpool/zones/new` mounted to `/zones/new/` + +We also need the zone config, so here is it. + + create -b + set zonepath=/zones/old/zone1 + set ip-type=exclusive + set autoboot=false + add net + set physical=zone1 + end + commit + +Just install the zone with the normal commands + + $ zonecfg -z zone1 < zone.config + $ zoneadm -z zone1 install + $ zoneadm -z zone1 boot + +Check if the zone is running and write a file, just to make sure, we have the +same zone at the end. + +moving the zone +--------------- + +For this guide, we will assume, that the zone is in production use and can't be +offline too long. For that to work, we will do a first snapshot, when the zone +is still running. + + $ zfs snapshot -r rpool/zones/old/zone1@move1 + +After that, we can replay that snapshot into the new location. + + $ zfs send -R rpool/zones/old/zone1@move1 | zfs recv rpool/zones/new/zone1 + +This step will take some time, depending on the size of your zone. Now we stop +the the zone and detach it. + + $ zoneadm -z zone1 halt + $ zoneadm -z zone1 detach + +This frees the zfs partition from the zone and makes it accessible. We need that +a bit later. +Now we need an incremental snapshot and move that data to the new location. + + $ zfs snapshot -r rpool/zones/old/zone1@move2 + $ zfs send -R -i move1 rpool/zones/old/zone1@move2 | zfs recv rpool/zones/new/zone1 + +When we now list all zfs partitions, we see, that a partition zbe is mounted two +times into the same location. + + rpool/zones/old/zone1/ROOT/zbe 724M 1.59T 723M /zones/old/zone1/root + rpool/zones/new/zone1/ROOT/zbe 724M 1.59T 723M /zones/old/zone1/root + +To fix that, issue the following command. + + zfs set mountpoint=/zones/new/zone1/root rpool/zones/new/zone1/ROOT/zbe + +Now the partition has to be mounted, so that zoneadm can find it for the attach. +You can do that with the following command + + zfs mount rpool/zones/new/zone1/ROOT/zbe + +Now with the partition in the correct place, we have to tell the zone, where to +look for its new partition. + + $ zonecfg -z zone1 + zonecfg:zone1> set zonepath=/zones/new/zone1 + zonecfg:zone1> verify + zonecfg:zone1> commit + zonecfg:zone1> exit + +With the zone reconfigured, attach the zone. + + $ zoneadm -z zone1 attach + +This may take a bit of time, as the content of the zone gets checked for +compatibility. When it is back, check the zone is installed. + + $ zoneadm list -cv + ID NAME STATUS PATH BRAND IP + - zone1 installed /zones/new/zone1 ipkg excl + +Now boot the zone and we are done. + + $ zoneadm -z zone1 boot + +Now check if everything is where you expect it to be and start your services and +everything is good. + +ideas +----- + +Here are some ideas, what can be done differently in the process. + +### **iterative snapshots** + +If you zone has a lot of traffic, where many changes aggregate between the first +snapshot and the second, do some more iterative snapshots before taking down the +zone. +This has the advantage, that you can close the gap of changes to a minimum size +and therefore make the move at the end a bit faster. But check the available +disk space in the process to avoid a full disk. + +### **create a new zone** + +Instead of chaning the old zone and therefore making a rollback more complicated, +create a new zone, which looks exactly like the old one. +Instead of chaning the old one, do instead + + $ zonecfg -z zone2 + zonecfg:zone2> create -a /zones/new/zone1 + +This will set everything from the old zone with the new zonepath. Keep in mind, +that this will also use the old interface. If you don't want that, create a new +interface before and change it in the config step. + +You can also restore that zfs partition in a partition which has the correct. + I hope it helps and you have some fun playing with it. diff --git a/content/post/97.md b/content/post/97.md index d085e5f..91a70ba 100644 --- a/content/post/97.md +++ b/content/post/97.md @@ -5,29 +5,29 @@ author = "Gibheer" draft = false +++ -I had the need to filter logs from different programs into different places - in this case the postgres and nginx logs. The man page of `syslog.conf` describes it pretty good, but misses some examples to make it more clear. So here is how I configured it, to make it easier. - -First, I edited the `syslog.conf` - - # filter everything apart from postgres and nginx - !-postgres,nginx - *.err;kern.warning;auth.notice;mail.crit /dev/console - # and all the other stuff - - # filter only postgres - !postgres - *.* /var/log/postgresql.log - - # filter only nginx - !nginx - *.* /var/log/nginx.log - -The next step is to setup the log rotate. This happens in `/etc/newsyslog.conf`. The man page is very helpful, so if you want to adjust something, take a peek into it. - - # postgresql - /var/log/postgresql.log 640 5 100 * JC - - # nginx - /var/log/nginx.log 640 5 100 * JC - +I had the need to filter logs from different programs into different places - in this case the postgres and nginx logs. The man page of `syslog.conf` describes it pretty good, but misses some examples to make it more clear. So here is how I configured it, to make it easier. + +First, I edited the `syslog.conf` + + # filter everything apart from postgres and nginx + !-postgres,nginx + *.err;kern.warning;auth.notice;mail.crit /dev/console + # and all the other stuff + + # filter only postgres + !postgres + *.* /var/log/postgresql.log + + # filter only nginx + !nginx + *.* /var/log/nginx.log + +The next step is to setup the log rotate. This happens in `/etc/newsyslog.conf`. The man page is very helpful, so if you want to adjust something, take a peek into it. + + # postgresql + /var/log/postgresql.log 640 5 100 * JC + + # nginx + /var/log/nginx.log 640 5 100 * JC + And that is all. If you want to add more program filtes, you have to define them in the `syslog.conf` as *notfilter* and *filter* and add the rotate to `newsyslog.conf`. diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..14883b2 --- /dev/null +++ b/go.mod @@ -0,0 +1,5 @@ +module git.zero-knowledge.org/gibheer/zblog + +go 1.18 + +require github.com/russross/blackfriday/v2 v2.1.0 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..502a072 --- /dev/null +++ b/go.sum @@ -0,0 +1,2 @@ +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= diff --git a/main.go b/main.go new file mode 100644 index 0000000..6e75326 --- /dev/null +++ b/main.go @@ -0,0 +1,217 @@ +package main + +import ( + "bytes" + "flag" + "fmt" + "html/template" + "io" + "io/fs" + "log" + "net/http" + "os" + "path" + "path/filepath" + "time" + + "github.com/russross/blackfriday/v2" +) + +var ( + contentDir = flag.String("content-dir", "content", "path to the content directory") + staticDir = flag.String("static-dir", "static", "path to the static files") + templateDir = flag.String("template-dir", "templates", "path to the template directory") + outputDir = flag.String("output-dir", "", "path to output all files from the render process") + listen = flag.String("listen", "", "When provided with a listen port, start serving the content") +) + +type ( + Metadata struct { + URLPath string + FilePath string + Template string + Title string + Date time.Time + Author string + Draft bool + } +) + +func main() { + flag.Parse() + var err error + + tmplDirFS := os.DirFS(*templateDir) + templates := template.New("") + templates = templates.Funcs(template.FuncMap( + map[string]interface{}{ + "formatTime": func(t time.Time) string { + return t.Format("2006-01-02") + }, + }, + )) + templates, err = templates.ParseFS(tmplDirFS, "*") + if err != nil { + log.Fatalf("could not parse template files: %s", err) + } + + content := []Metadata{} + if err := filepath.Walk(*contentDir, func(path string, info fs.FileInfo, err error) error { + if err != nil { + return err + } + if info.IsDir() { + return nil + } + m, err := MetadataFromFile(*contentDir, path) + if err != nil { + return fmt.Errorf("could not parse metadata from '%s': %w", path, err) + } + content = append(content, m) + return nil + }); err != nil { + log.Fatalf("could not read content: %s", err) + } + + if *outputDir != "" { + for _, metadata := range content { + p := *outputDir + metadata.URLPath + if p[len(p)-1] == '/' { + p = path.Join(p, "index.html") + } + + // create directory + if _, err := os.Stat(path.Dir(p)); os.IsNotExist(err) { + if err := os.MkdirAll(path.Dir(p), 0755); err != nil { + log.Fatalf("could not create directory '%s': %s", path.Dir(p), err) + } + } + + f, err := os.Create(p) + if err != nil { + log.Fatalf("could not create new file '%s': %s", p, err) + } + defer f.Close() + if err := metadata.Render(f, templates); err != nil { + log.Fatalf("could not render '%s': %s", metadata.FilePath, err) + } + f.Close() + } + } + + if *listen != "" { + http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir(*staticDir)))) + for _, metadata := range content { + func(m Metadata) { + http.HandleFunc(m.URLPath, func(w http.ResponseWriter, r *http.Request) { + log.Printf("%s -> %s", r.URL, m.URLPath) + w.Header()["Content-Type"] = []string{"text/html"} + if err := m.Render(w, templates); err != nil { + log.Printf("could not render '%s': %s", m.FilePath, err) + } + }) + }(metadata) + } + log.Fatalf("stopped listening: %s", http.ListenAndServe(*listen, nil)) + } + + if *outputDir == "" && *listen == "" { + log.Printf("neither output-dir nor listen are requested - doing nothing") + } +} + +var ( + metadataStart = []byte("+++\n") + metadataEnd = []byte("\n+++\n") + + headerTitle = "title" + headerDate = "date" + headerAuthor = "author" + headerURLPath = "url" + headerDraft = "draft" + headerTemplate = "template" +) + +// ContentFromFile reads the header of the file to create the metadata. +// +// basePath is stripped from the path when generating the default URL path. +func MetadataFromFile(basePath string, path string) (Metadata, error) { + m := Metadata{ + FilePath: path, + URLPath: path[len(basePath):], + Template: "content.html", + } + raw, err := os.ReadFile(m.FilePath) + if err != nil { + return m, err + } + if !bytes.HasPrefix(raw, metadataStart) { + return m, fmt.Errorf("missing metadata header, must start with +++") + } + last := bytes.Index(raw, metadataEnd) + if last == -1 { + return m, fmt.Errorf("missing metadata header, must end with +++ on a single line") + } + rawHeader := raw[len(metadataStart):last] + lineNum := 0 + for _, headerLine := range bytes.Split(rawHeader, []byte("\n")) { + if len(headerLine) == 0 { + continue + } + line := bytes.SplitN(headerLine, []byte("="), 2) + if len(line) != 2 { + return m, fmt.Errorf("line %d: format must be 'key = value'", lineNum) + } + key := string(bytes.Trim(line[0], " ")) + val := string(bytes.Trim(line[1], ` "'`)) + switch string(key) { + case headerTitle: + m.Title = val + case headerAuthor: + m.Author = val + case headerDraft: + if headerDraft == "true" { + m.Draft = true + } + case headerTemplate: + m.Template = val + case headerDate: + m.Date, err = time.Parse(time.RFC3339, val) + if err != nil { + log.Printf("line %d: date must match RFC3339 format", lineNum) + } + case headerURLPath: + m.URLPath = val + default: + log.Printf("line %d: unknown header %s found in %s", lineNum, key, path) + } + lineNum += 1 + } + + return m, nil +} + +func (m Metadata) Content() template.HTML { + result := "" + raw, err := os.ReadFile(m.FilePath) + if err != nil { + log.Printf("error reading file: %w", err) + return template.HTML("") + } + + end := bytes.Index(raw, metadataEnd) + if end == -1 { + log.Printf("could not find metadata end") + return template.HTML("") + } + + result = string(blackfriday.Run(raw[end+len(metadataEnd):])) + return template.HTML(result) +} + +func (m Metadata) Render(w io.Writer, tmpl *template.Template) error { + if err := tmpl.ExecuteTemplate(w, m.Template, m); err != nil { + return fmt.Errorf("could not render content path '%s': %w", m.FilePath, err) + } + return nil +} diff --git a/static/go-mono/Go-Mono-Bold-Italic.ttf b/static/go-mono/Go-Mono-Bold-Italic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..0884406191b5dceabf109cb3b05ef746e92d6724 GIT binary patch literal 173600 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 literal 0 HcmV?d00001 diff --git a/static/go-mono/Go-Mono-Italic.ttf b/static/go-mono/Go-Mono-Italic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ec2713320c884891dec3572b80b1b5a4d367ea4f GIT binary patch literal 169824 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 Yp61UyVfVfnt8nZoPag03i9zK51fuVGmH+?% literal 0 HcmV?d00001 diff --git a/static/go-mono/README b/static/go-mono/README new file mode 100644 index 0000000..7043c36 --- /dev/null +++ b/static/go-mono/README @@ -0,0 +1,36 @@ +These fonts were created by the Bigelow & Holmes foundry specifically for the +Go project. See https://blog.golang.org/go-fonts for details. + +They are licensed under the same open source license as the rest of the Go +project's software: + +Copyright (c) 2016 Bigelow & Holmes Inc.. All rights reserved. + +Distribution of this font is governed by the following license. If you do not +agree to this license, including the disclaimer, do not distribute or modify +this font. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of Google Inc. nor the names of its contributors may be + used to endorse or promote products derived from this software without + specific prior written permission. + +DISCLAIMER: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/themes/zero/static/img/zero-knowledge.png b/static/zero-knowledge.png similarity index 100% rename from themes/zero/static/img/zero-knowledge.png rename to static/zero-knowledge.png diff --git a/templates/content.html b/templates/content.html new file mode 100644 index 0000000..daecbfa --- /dev/null +++ b/templates/content.html @@ -0,0 +1,14 @@ +{{ template "header.html" . }} +

+ +{{ template "footer.html" . }} diff --git a/templates/footer.html b/templates/footer.html new file mode 100644 index 0000000..62b274f --- /dev/null +++ b/templates/footer.html @@ -0,0 +1 @@ + diff --git a/templates/header.html b/templates/header.html new file mode 100644 index 0000000..8fec42c --- /dev/null +++ b/templates/header.html @@ -0,0 +1,37 @@ + + + + zero-knowledge - {{ .Title }} + + + +
+ +
diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..131837b --- /dev/null +++ b/templates/index.html @@ -0,0 +1,8 @@ +{{ template "header.html" . }} +
+ {{ .Content }} +
+ +{{ template "footer.html" . }} diff --git a/themes/zero/layouts/_default/list.html b/themes/zero/layouts/_default/list.html deleted file mode 100644 index 8733fbe..0000000 --- a/themes/zero/layouts/_default/list.html +++ /dev/null @@ -1,3 +0,0 @@ -{{ partial "header.html" . }} - {{ partial "li" .Paginator }} -{{ partial "footer.html" . }} diff --git a/themes/zero/layouts/_default/si.html b/themes/zero/layouts/_default/si.html deleted file mode 100644 index bf06144..0000000 --- a/themes/zero/layouts/_default/si.html +++ /dev/null @@ -1,28 +0,0 @@ -
- -
-

{{ .Title }}

-
- -
- {{ .Content }} -
- -
diff --git a/themes/zero/layouts/_default/single.html b/themes/zero/layouts/_default/single.html deleted file mode 100644 index c41b37b..0000000 --- a/themes/zero/layouts/_default/single.html +++ /dev/null @@ -1,3 +0,0 @@ -{{ partial "header.html" . }} - {{ .Render "si" }} -{{ partial "footer.html" . }} diff --git a/themes/zero/layouts/_default/summary.html b/themes/zero/layouts/_default/summary.html deleted file mode 100644 index 35840f2..0000000 --- a/themes/zero/layouts/_default/summary.html +++ /dev/null @@ -1,11 +0,0 @@ -
-
-

{{ .Title }}

-
- -
- {{ .Content }} -
-
diff --git a/themes/zero/layouts/index.html b/themes/zero/layouts/index.html deleted file mode 100644 index 7c958ec..0000000 --- a/themes/zero/layouts/index.html +++ /dev/null @@ -1,3 +0,0 @@ -{{ partial "header.html" . }} -{{ partial "li.html" (.Paginate (where .Data.Pages "Section" "post")) }} -{{ partial "footer.html" . }} diff --git a/themes/zero/layouts/partials/footer.html b/themes/zero/layouts/partials/footer.html deleted file mode 100644 index b605728..0000000 --- a/themes/zero/layouts/partials/footer.html +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/themes/zero/layouts/partials/header.html b/themes/zero/layouts/partials/header.html deleted file mode 100644 index 2681ccb..0000000 --- a/themes/zero/layouts/partials/header.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - {{ if eq .URL "/" }}{{ .Site.Title }}{{ else }}{{ .Title }} - {{ .Site.Title }}{{ end }} - - - {{ if .RSSlink }} - - {{ end }} - - - -
-

{{ .Site.Title }}

-
diff --git a/themes/zero/layouts/partials/li.html b/themes/zero/layouts/partials/li.html deleted file mode 100644 index a561c55..0000000 --- a/themes/zero/layouts/partials/li.html +++ /dev/null @@ -1,21 +0,0 @@ - -
    - {{ range .Pages }} -
  • - {{ .Render "summary" }} -
  • - {{ end }} -
- diff --git a/themes/zero/layouts/post/summary.html b/themes/zero/layouts/post/summary.html deleted file mode 100644 index e7404cf..0000000 --- a/themes/zero/layouts/post/summary.html +++ /dev/null @@ -1,15 +0,0 @@ -
-
-

{{ .Title }}

-
- - -
- {{ .Summary }} -
- diff --git a/themes/zero/static/css/style.css b/themes/zero/static/css/style.css deleted file mode 100644 index e0a7fe9..0000000 --- a/themes/zero/static/css/style.css +++ /dev/null @@ -1,154 +0,0 @@ -* { - box-sizing: border-box; - margin: 0; - padding: 0; -} - -body > header > h1 { - margin: 1em; -} -body > header > h1 > a { - color: transparent; - display: block; - width: 465px; - height: 117px; - background: url('/img/zero-knowledge.png'); -} - -.entries { - list-style-type: none; - display: flex; - flex-flow: row wrap; - justify-content: space-around; - align-items: stretch; -} -.entries > li { - margin-top: 0.5em; - margin-bottom: 0.5em; - padding: 1em; -} - -body { - background-image: url('/img/background.png'); -} - -@media screen and ((max-width: 750px) or (orientation: portait)) { - .entries > li { - width: 100%; - } -} -@media screen and (min-width: 750px) and (orientation: landscape) { - .entries > li { - width: 49%; - } -} -@media screen and (min-width: 1000px) and (orientation: landscape) { - .entries > li { - width: 32%; - } -} -@media screen and (min-width: 1450px) and (orientation: landscape) { - .entries > li { - width: 24%; - } -} - -nav.pagination > a { - display: block; - width: 100%; - text-align: center; - padding: 0.5em; - - font-weight: bold; - color: #ff9900; - - background-color: #3a5f78; -} -nav.pagination > a.deactivated { - color: transparent; -} - -article { - display: flex; - flex-direction: column; -} -article > header { - order: 1; -} -article > nav { - order: 4; -} -article > aside { - order: 2; -} -article > section { - order: 3; -} - -article > header > h1, .entry > header > h1 { - border-bottom: 0.1em solid #ff9900; -} -article > header > h1 > *, .entry > header > h1 > * { - text-decoration: none; - font-size: 1.25rem; - color: #ff9900; -} - -article > aside, .entry > aside { - margin-bottom: 0.5em; -} -article > aside > *, .entry > aside > * { - color: #3a5f78; - font-weight: bold; - font-size: 0.8rem; -} -article > aside > .author::before, .entry > aside > .author::before { - content: 'by '; -} -article > aside > .date::before, .entry > aside > .date::before { - content: 'on '; -} - -article > section { -} - -article > nav > a { - font-size: 0.8rem; - color: #3a5f78; - font-weight: bold; -} -article > nav > .more::after { - content: ' >'; -} - -body > .entry > header { - margin-top: 2em; -} -.entry > header > h1, .entry > aside { - padding-left: 1em; -} -.entry > section { - margin: auto; - max-width: 50rem; - margin-bottom: 1em; -} -.entry > section h1, .entry > section h2 { - margin-top: 1em; - margin-bottom: 0.5em; - font-size: 1.25rem; - color: #3a5f78; - border-bottom: 0.1em solid #3a5f78; -} -.entry > section pre { - margin: 0.5em; - padding: 0.5em; - background-color: rgba(58, 95, 120, 0.3); - overflow-x: auto; -} -.entry > section ul, .entry > section dl, .entry > section ol { - margin: 0.5em; - margin-left: 1.5em; -} -section > p { - margin-bottom: 1.00rem; -} diff --git a/themes/zero/static/img/background.png b/themes/zero/static/img/background.png deleted file mode 100644 index a08606e60a4199df35480cdb76d8472e11ad787f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85937 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 z
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 QkN^Mx07*qoM6N<$f+E14!vFvP diff --git a/themes/zero/static/img/grunge_readme.txt b/themes/zero/static/img/grunge_readme.txt deleted file mode 100644 index 0fc2a1f..0000000 --- a/themes/zero/static/img/grunge_readme.txt +++ /dev/null @@ -1,8 +0,0 @@ - - -======================================================== - This pattern is downloaded from www.subtlepatterns.com - If you need more, that's where to get'em. - ======================================================== - - \ No newline at end of file diff --git a/vendor/github.com/russross/blackfriday/v2/.gitignore b/vendor/github.com/russross/blackfriday/v2/.gitignore new file mode 100644 index 0000000..75623dc --- /dev/null +++ b/vendor/github.com/russross/blackfriday/v2/.gitignore @@ -0,0 +1,8 @@ +*.out +*.swp +*.8 +*.6 +_obj +_test* +markdown +tags diff --git a/vendor/github.com/russross/blackfriday/v2/.travis.yml b/vendor/github.com/russross/blackfriday/v2/.travis.yml new file mode 100644 index 0000000..b0b525a --- /dev/null +++ b/vendor/github.com/russross/blackfriday/v2/.travis.yml @@ -0,0 +1,17 @@ +sudo: false +language: go +go: + - "1.10.x" + - "1.11.x" + - tip +matrix: + fast_finish: true + allow_failures: + - go: tip +install: + - # Do nothing. This is needed to prevent default install action "go get -t -v ./..." from happening here (we want it to happen inside script step). +script: + - go get -t -v ./... + - diff -u <(echo -n) <(gofmt -d -s .) + - go tool vet . + - go test -v ./... diff --git a/vendor/github.com/russross/blackfriday/v2/LICENSE.txt b/vendor/github.com/russross/blackfriday/v2/LICENSE.txt new file mode 100644 index 0000000..2885af3 --- /dev/null +++ b/vendor/github.com/russross/blackfriday/v2/LICENSE.txt @@ -0,0 +1,29 @@ +Blackfriday is distributed under the Simplified BSD License: + +> Copyright © 2011 Russ Ross +> All rights reserved. +> +> Redistribution and use in source and binary forms, with or without +> modification, are permitted provided that the following conditions +> are met: +> +> 1. Redistributions of source code must retain the above copyright +> notice, this list of conditions and the following disclaimer. +> +> 2. Redistributions in binary form must reproduce the above +> copyright notice, this list of conditions and the following +> disclaimer in the documentation and/or other materials provided with +> the distribution. +> +> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +> "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +> LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +> FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +> COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +> INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +> BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +> LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +> CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +> LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +> ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +> POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/russross/blackfriday/v2/README.md b/vendor/github.com/russross/blackfriday/v2/README.md new file mode 100644 index 0000000..d9c08a2 --- /dev/null +++ b/vendor/github.com/russross/blackfriday/v2/README.md @@ -0,0 +1,335 @@ +Blackfriday +[![Build Status][BuildV2SVG]][BuildV2URL] +[![PkgGoDev][PkgGoDevV2SVG]][PkgGoDevV2URL] +=========== + +Blackfriday is a [Markdown][1] processor implemented in [Go][2]. It +is paranoid about its input (so you can safely feed it user-supplied +data), it is fast, it supports common extensions (tables, smart +punctuation substitutions, etc.), and it is safe for all utf-8 +(unicode) input. + +HTML output is currently supported, along with Smartypants +extensions. + +It started as a translation from C of [Sundown][3]. + + +Installation +------------ + +Blackfriday is compatible with modern Go releases in module mode. +With Go installed: + + go get github.com/russross/blackfriday/v2 + +will resolve and add the package to the current development module, +then build and install it. Alternatively, you can achieve the same +if you import it in a package: + + import "github.com/russross/blackfriday/v2" + +and `go get` without parameters. + +Legacy GOPATH mode is unsupported. + + +Versions +-------- + +Currently maintained and recommended version of Blackfriday is `v2`. It's being +developed on its own branch: https://github.com/russross/blackfriday/tree/v2 and the +documentation is available at +https://pkg.go.dev/github.com/russross/blackfriday/v2. + +It is `go get`-able in module mode at `github.com/russross/blackfriday/v2`. + +Version 2 offers a number of improvements over v1: + +* Cleaned up API +* A separate call to [`Parse`][4], which produces an abstract syntax tree for + the document +* Latest bug fixes +* Flexibility to easily add your own rendering extensions + +Potential drawbacks: + +* Our benchmarks show v2 to be slightly slower than v1. Currently in the + ballpark of around 15%. +* API breakage. If you can't afford modifying your code to adhere to the new API + and don't care too much about the new features, v2 is probably not for you. +* Several bug fixes are trailing behind and still need to be forward-ported to + v2. See issue [#348](https://github.com/russross/blackfriday/issues/348) for + tracking. + +If you are still interested in the legacy `v1`, you can import it from +`github.com/russross/blackfriday`. Documentation for the legacy v1 can be found +here: https://pkg.go.dev/github.com/russross/blackfriday. + + +Usage +----- + +For the most sensible markdown processing, it is as simple as getting your input +into a byte slice and calling: + +```go +output := blackfriday.Run(input) +``` + +Your input will be parsed and the output rendered with a set of most popular +extensions enabled. If you want the most basic feature set, corresponding with +the bare Markdown specification, use: + +```go +output := blackfriday.Run(input, blackfriday.WithNoExtensions()) +``` + +### Sanitize untrusted content + +Blackfriday itself does nothing to protect against malicious content. If you are +dealing with user-supplied markdown, we recommend running Blackfriday's output +through HTML sanitizer such as [Bluemonday][5]. + +Here's an example of simple usage of Blackfriday together with Bluemonday: + +```go +import ( + "github.com/microcosm-cc/bluemonday" + "github.com/russross/blackfriday/v2" +) + +// ... +unsafe := blackfriday.Run(input) +html := bluemonday.UGCPolicy().SanitizeBytes(unsafe) +``` + +### Custom options + +If you want to customize the set of options, use `blackfriday.WithExtensions`, +`blackfriday.WithRenderer` and `blackfriday.WithRefOverride`. + +### `blackfriday-tool` + +You can also check out `blackfriday-tool` for a more complete example +of how to use it. Download and install it using: + + go get github.com/russross/blackfriday-tool + +This is a simple command-line tool that allows you to process a +markdown file using a standalone program. You can also browse the +source directly on github if you are just looking for some example +code: + +* + +Note that if you have not already done so, installing +`blackfriday-tool` will be sufficient to download and install +blackfriday in addition to the tool itself. The tool binary will be +installed in `$GOPATH/bin`. This is a statically-linked binary that +can be copied to wherever you need it without worrying about +dependencies and library versions. + +### Sanitized anchor names + +Blackfriday includes an algorithm for creating sanitized anchor names +corresponding to a given input text. This algorithm is used to create +anchors for headings when `AutoHeadingIDs` extension is enabled. The +algorithm has a specification, so that other packages can create +compatible anchor names and links to those anchors. + +The specification is located at https://pkg.go.dev/github.com/russross/blackfriday/v2#hdr-Sanitized_Anchor_Names. + +[`SanitizedAnchorName`](https://pkg.go.dev/github.com/russross/blackfriday/v2#SanitizedAnchorName) exposes this functionality, and can be used to +create compatible links to the anchor names generated by blackfriday. +This algorithm is also implemented in a small standalone package at +[`github.com/shurcooL/sanitized_anchor_name`](https://pkg.go.dev/github.com/shurcooL/sanitized_anchor_name). It can be useful for clients +that want a small package and don't need full functionality of blackfriday. + + +Features +-------- + +All features of Sundown are supported, including: + +* **Compatibility**. The Markdown v1.0.3 test suite passes with + the `--tidy` option. Without `--tidy`, the differences are + mostly in whitespace and entity escaping, where blackfriday is + more consistent and cleaner. + +* **Common extensions**, including table support, fenced code + blocks, autolinks, strikethroughs, non-strict emphasis, etc. + +* **Safety**. Blackfriday is paranoid when parsing, making it safe + to feed untrusted user input without fear of bad things + happening. The test suite stress tests this and there are no + known inputs that make it crash. If you find one, please let me + know and send me the input that does it. + + NOTE: "safety" in this context means *runtime safety only*. In order to + protect yourself against JavaScript injection in untrusted content, see + [this example](https://github.com/russross/blackfriday#sanitize-untrusted-content). + +* **Fast processing**. It is fast enough to render on-demand in + most web applications without having to cache the output. + +* **Thread safety**. You can run multiple parsers in different + goroutines without ill effect. There is no dependence on global + shared state. + +* **Minimal dependencies**. Blackfriday only depends on standard + library packages in Go. The source code is pretty + self-contained, so it is easy to add to any project, including + Google App Engine projects. + +* **Standards compliant**. Output successfully validates using the + W3C validation tool for HTML 4.01 and XHTML 1.0 Transitional. + + +Extensions +---------- + +In addition to the standard markdown syntax, this package +implements the following extensions: + +* **Intra-word emphasis supression**. The `_` character is + commonly used inside words when discussing code, so having + markdown interpret it as an emphasis command is usually the + wrong thing. Blackfriday lets you treat all emphasis markers as + normal characters when they occur inside a word. + +* **Tables**. Tables can be created by drawing them in the input + using a simple syntax: + + ``` + Name | Age + --------|------ + Bob | 27 + Alice | 23 + ``` + +* **Fenced code blocks**. In addition to the normal 4-space + indentation to mark code blocks, you can explicitly mark them + and supply a language (to make syntax highlighting simple). Just + mark it like this: + + ```go + func getTrue() bool { + return true + } + ``` + + You can use 3 or more backticks to mark the beginning of the + block, and the same number to mark the end of the block. + + To preserve classes of fenced code blocks while using the bluemonday + HTML sanitizer, use the following policy: + + ```go + p := bluemonday.UGCPolicy() + p.AllowAttrs("class").Matching(regexp.MustCompile("^language-[a-zA-Z0-9]+$")).OnElements("code") + html := p.SanitizeBytes(unsafe) + ``` + +* **Definition lists**. A simple definition list is made of a single-line + term followed by a colon and the definition for that term. + + Cat + : Fluffy animal everyone likes + + Internet + : Vector of transmission for pictures of cats + + Terms must be separated from the previous definition by a blank line. + +* **Footnotes**. A marker in the text that will become a superscript number; + a footnote definition that will be placed in a list of footnotes at the + end of the document. A footnote looks like this: + + This is a footnote.[^1] + + [^1]: the footnote text. + +* **Autolinking**. Blackfriday can find URLs that have not been + explicitly marked as links and turn them into links. + +* **Strikethrough**. Use two tildes (`~~`) to mark text that + should be crossed out. + +* **Hard line breaks**. With this extension enabled newlines in the input + translate into line breaks in the output. This extension is off by default. + +* **Smart quotes**. Smartypants-style punctuation substitution is + supported, turning normal double- and single-quote marks into + curly quotes, etc. + +* **LaTeX-style dash parsing** is an additional option, where `--` + is translated into `–`, and `---` is translated into + `—`. This differs from most smartypants processors, which + turn a single hyphen into an ndash and a double hyphen into an + mdash. + +* **Smart fractions**, where anything that looks like a fraction + is translated into suitable HTML (instead of just a few special + cases like most smartypant processors). For example, `4/5` + becomes `45`, which renders as + 45. + + +Other renderers +--------------- + +Blackfriday is structured to allow alternative rendering engines. Here +are a few of note: + +* [github_flavored_markdown](https://pkg.go.dev/github.com/shurcooL/github_flavored_markdown): + provides a GitHub Flavored Markdown renderer with fenced code block + highlighting, clickable heading anchor links. + + It's not customizable, and its goal is to produce HTML output + equivalent to the [GitHub Markdown API endpoint](https://developer.github.com/v3/markdown/#render-a-markdown-document-in-raw-mode), + except the rendering is performed locally. + +* [markdownfmt](https://github.com/shurcooL/markdownfmt): like gofmt, + but for markdown. + +* [LaTeX output](https://gitlab.com/ambrevar/blackfriday-latex): + renders output as LaTeX. + +* [bfchroma](https://github.com/Depado/bfchroma/): provides convenience + integration with the [Chroma](https://github.com/alecthomas/chroma) code + highlighting library. bfchroma is only compatible with v2 of Blackfriday and + provides a drop-in renderer ready to use with Blackfriday, as well as + options and means for further customization. + +* [Blackfriday-Confluence](https://github.com/kentaro-m/blackfriday-confluence): provides a [Confluence Wiki Markup](https://confluence.atlassian.com/doc/confluence-wiki-markup-251003035.html) renderer. + +* [Blackfriday-Slack](https://github.com/karriereat/blackfriday-slack): converts markdown to slack message style + + +TODO +---- + +* More unit testing +* Improve Unicode support. It does not understand all Unicode + rules (about what constitutes a letter, a punctuation symbol, + etc.), so it may fail to detect word boundaries correctly in + some instances. It is safe on all UTF-8 input. + + +License +------- + +[Blackfriday is distributed under the Simplified BSD License](LICENSE.txt) + + + [1]: https://daringfireball.net/projects/markdown/ "Markdown" + [2]: https://golang.org/ "Go Language" + [3]: https://github.com/vmg/sundown "Sundown" + [4]: https://pkg.go.dev/github.com/russross/blackfriday/v2#Parse "Parse func" + [5]: https://github.com/microcosm-cc/bluemonday "Bluemonday" + + [BuildV2SVG]: https://travis-ci.org/russross/blackfriday.svg?branch=v2 + [BuildV2URL]: https://travis-ci.org/russross/blackfriday + [PkgGoDevV2SVG]: https://pkg.go.dev/badge/github.com/russross/blackfriday/v2 + [PkgGoDevV2URL]: https://pkg.go.dev/github.com/russross/blackfriday/v2 diff --git a/vendor/github.com/russross/blackfriday/v2/block.go b/vendor/github.com/russross/blackfriday/v2/block.go new file mode 100644 index 0000000..dcd61e6 --- /dev/null +++ b/vendor/github.com/russross/blackfriday/v2/block.go @@ -0,0 +1,1612 @@ +// +// Blackfriday Markdown Processor +// Available at http://github.com/russross/blackfriday +// +// Copyright © 2011 Russ Ross . +// Distributed under the Simplified BSD License. +// See README.md for details. +// + +// +// Functions to parse block-level elements. +// + +package blackfriday + +import ( + "bytes" + "html" + "regexp" + "strings" + "unicode" +) + +const ( + charEntity = "&(?:#x[a-f0-9]{1,8}|#[0-9]{1,8}|[a-z][a-z0-9]{1,31});" + escapable = "[!\"#$%&'()*+,./:;<=>?@[\\\\\\]^_`{|}~-]" +) + +var ( + reBackslashOrAmp = regexp.MustCompile("[\\&]") + reEntityOrEscapedChar = regexp.MustCompile("(?i)\\\\" + escapable + "|" + charEntity) +) + +// Parse block-level data. +// Note: this function and many that it calls assume that +// the input buffer ends with a newline. +func (p *Markdown) block(data []byte) { + // this is called recursively: enforce a maximum depth + if p.nesting >= p.maxNesting { + return + } + p.nesting++ + + // parse out one block-level construct at a time + for len(data) > 0 { + // prefixed heading: + // + // # Heading 1 + // ## Heading 2 + // ... + // ###### Heading 6 + if p.isPrefixHeading(data) { + data = data[p.prefixHeading(data):] + continue + } + + // block of preformatted HTML: + // + //
+ // ... + //
+ if data[0] == '<' { + if i := p.html(data, true); i > 0 { + data = data[i:] + continue + } + } + + // title block + // + // % stuff + // % more stuff + // % even more stuff + if p.extensions&Titleblock != 0 { + if data[0] == '%' { + if i := p.titleBlock(data, true); i > 0 { + data = data[i:] + continue + } + } + } + + // blank lines. note: returns the # of bytes to skip + if i := p.isEmpty(data); i > 0 { + data = data[i:] + continue + } + + // indented code block: + // + // func max(a, b int) int { + // if a > b { + // return a + // } + // return b + // } + if p.codePrefix(data) > 0 { + data = data[p.code(data):] + continue + } + + // fenced code block: + // + // ``` go + // func fact(n int) int { + // if n <= 1 { + // return n + // } + // return n * fact(n-1) + // } + // ``` + if p.extensions&FencedCode != 0 { + if i := p.fencedCodeBlock(data, true); i > 0 { + data = data[i:] + continue + } + } + + // horizontal rule: + // + // ------ + // or + // ****** + // or + // ______ + if p.isHRule(data) { + p.addBlock(HorizontalRule, nil) + var i int + for i = 0; i < len(data) && data[i] != '\n'; i++ { + } + data = data[i:] + continue + } + + // block quote: + // + // > A big quote I found somewhere + // > on the web + if p.quotePrefix(data) > 0 { + data = data[p.quote(data):] + continue + } + + // table: + // + // Name | Age | Phone + // ------|-----|--------- + // Bob | 31 | 555-1234 + // Alice | 27 | 555-4321 + if p.extensions&Tables != 0 { + if i := p.table(data); i > 0 { + data = data[i:] + continue + } + } + + // an itemized/unordered list: + // + // * Item 1 + // * Item 2 + // + // also works with + or - + if p.uliPrefix(data) > 0 { + data = data[p.list(data, 0):] + continue + } + + // a numbered/ordered list: + // + // 1. Item 1 + // 2. Item 2 + if p.oliPrefix(data) > 0 { + data = data[p.list(data, ListTypeOrdered):] + continue + } + + // definition lists: + // + // Term 1 + // : Definition a + // : Definition b + // + // Term 2 + // : Definition c + if p.extensions&DefinitionLists != 0 { + if p.dliPrefix(data) > 0 { + data = data[p.list(data, ListTypeDefinition):] + continue + } + } + + // anything else must look like a normal paragraph + // note: this finds underlined headings, too + data = data[p.paragraph(data):] + } + + p.nesting-- +} + +func (p *Markdown) addBlock(typ NodeType, content []byte) *Node { + p.closeUnmatchedBlocks() + container := p.addChild(typ, 0) + container.content = content + return container +} + +func (p *Markdown) isPrefixHeading(data []byte) bool { + if data[0] != '#' { + return false + } + + if p.extensions&SpaceHeadings != 0 { + level := 0 + for level < 6 && level < len(data) && data[level] == '#' { + level++ + } + if level == len(data) || data[level] != ' ' { + return false + } + } + return true +} + +func (p *Markdown) prefixHeading(data []byte) int { + level := 0 + for level < 6 && level < len(data) && data[level] == '#' { + level++ + } + i := skipChar(data, level, ' ') + end := skipUntilChar(data, i, '\n') + skip := end + id := "" + if p.extensions&HeadingIDs != 0 { + j, k := 0, 0 + // find start/end of heading id + for j = i; j < end-1 && (data[j] != '{' || data[j+1] != '#'); j++ { + } + for k = j + 1; k < end && data[k] != '}'; k++ { + } + // extract heading id iff found + if j < end && k < end { + id = string(data[j+2 : k]) + end = j + skip = k + 1 + for end > 0 && data[end-1] == ' ' { + end-- + } + } + } + for end > 0 && data[end-1] == '#' { + if isBackslashEscaped(data, end-1) { + break + } + end-- + } + for end > 0 && data[end-1] == ' ' { + end-- + } + if end > i { + if id == "" && p.extensions&AutoHeadingIDs != 0 { + id = SanitizedAnchorName(string(data[i:end])) + } + block := p.addBlock(Heading, data[i:end]) + block.HeadingID = id + block.Level = level + } + return skip +} + +func (p *Markdown) isUnderlinedHeading(data []byte) int { + // test of level 1 heading + if data[0] == '=' { + i := skipChar(data, 1, '=') + i = skipChar(data, i, ' ') + if i < len(data) && data[i] == '\n' { + return 1 + } + return 0 + } + + // test of level 2 heading + if data[0] == '-' { + i := skipChar(data, 1, '-') + i = skipChar(data, i, ' ') + if i < len(data) && data[i] == '\n' { + return 2 + } + return 0 + } + + return 0 +} + +func (p *Markdown) titleBlock(data []byte, doRender bool) int { + if data[0] != '%' { + return 0 + } + splitData := bytes.Split(data, []byte("\n")) + var i int + for idx, b := range splitData { + if !bytes.HasPrefix(b, []byte("%")) { + i = idx // - 1 + break + } + } + + data = bytes.Join(splitData[0:i], []byte("\n")) + consumed := len(data) + data = bytes.TrimPrefix(data, []byte("% ")) + data = bytes.Replace(data, []byte("\n% "), []byte("\n"), -1) + block := p.addBlock(Heading, data) + block.Level = 1 + block.IsTitleblock = true + + return consumed +} + +func (p *Markdown) html(data []byte, doRender bool) int { + var i, j int + + // identify the opening tag + if data[0] != '<' { + return 0 + } + curtag, tagfound := p.htmlFindTag(data[1:]) + + // handle special cases + if !tagfound { + // check for an HTML comment + if size := p.htmlComment(data, doRender); size > 0 { + return size + } + + // check for an
tag + if size := p.htmlHr(data, doRender); size > 0 { + return size + } + + // no special case recognized + return 0 + } + + // look for an unindented matching closing tag + // followed by a blank line + found := false + /* + closetag := []byte("\n") + j = len(curtag) + 1 + for !found { + // scan for a closing tag at the beginning of a line + if skip := bytes.Index(data[j:], closetag); skip >= 0 { + j += skip + len(closetag) + } else { + break + } + + // see if it is the only thing on the line + if skip := p.isEmpty(data[j:]); skip > 0 { + // see if it is followed by a blank line/eof + j += skip + if j >= len(data) { + found = true + i = j + } else { + if skip := p.isEmpty(data[j:]); skip > 0 { + j += skip + found = true + i = j + } + } + } + } + */ + + // if not found, try a second pass looking for indented match + // but not if tag is "ins" or "del" (following original Markdown.pl) + if !found && curtag != "ins" && curtag != "del" { + i = 1 + for i < len(data) { + i++ + for i < len(data) && !(data[i-1] == '<' && data[i] == '/') { + i++ + } + + if i+2+len(curtag) >= len(data) { + break + } + + j = p.htmlFindEnd(curtag, data[i-1:]) + + if j > 0 { + i += j - 1 + found = true + break + } + } + } + + if !found { + return 0 + } + + // the end of the block has been found + if doRender { + // trim newlines + end := i + for end > 0 && data[end-1] == '\n' { + end-- + } + finalizeHTMLBlock(p.addBlock(HTMLBlock, data[:end])) + } + + return i +} + +func finalizeHTMLBlock(block *Node) { + block.Literal = block.content + block.content = nil +} + +// HTML comment, lax form +func (p *Markdown) htmlComment(data []byte, doRender bool) int { + i := p.inlineHTMLComment(data) + // needs to end with a blank line + if j := p.isEmpty(data[i:]); j > 0 { + size := i + j + if doRender { + // trim trailing newlines + end := size + for end > 0 && data[end-1] == '\n' { + end-- + } + block := p.addBlock(HTMLBlock, data[:end]) + finalizeHTMLBlock(block) + } + return size + } + return 0 +} + +// HR, which is the only self-closing block tag considered +func (p *Markdown) htmlHr(data []byte, doRender bool) int { + if len(data) < 4 { + return 0 + } + if data[0] != '<' || (data[1] != 'h' && data[1] != 'H') || (data[2] != 'r' && data[2] != 'R') { + return 0 + } + if data[3] != ' ' && data[3] != '/' && data[3] != '>' { + // not an
tag after all; at least not a valid one + return 0 + } + i := 3 + for i < len(data) && data[i] != '>' && data[i] != '\n' { + i++ + } + if i < len(data) && data[i] == '>' { + i++ + if j := p.isEmpty(data[i:]); j > 0 { + size := i + j + if doRender { + // trim newlines + end := size + for end > 0 && data[end-1] == '\n' { + end-- + } + finalizeHTMLBlock(p.addBlock(HTMLBlock, data[:end])) + } + return size + } + } + return 0 +} + +func (p *Markdown) htmlFindTag(data []byte) (string, bool) { + i := 0 + for i < len(data) && isalnum(data[i]) { + i++ + } + key := string(data[:i]) + if _, ok := blockTags[key]; ok { + return key, true + } + return "", false +} + +func (p *Markdown) htmlFindEnd(tag string, data []byte) int { + // assume data[0] == '<' && data[1] == '/' already tested + if tag == "hr" { + return 2 + } + // check if tag is a match + closetag := []byte("") + if !bytes.HasPrefix(data, closetag) { + return 0 + } + i := len(closetag) + + // check that the rest of the line is blank + skip := 0 + if skip = p.isEmpty(data[i:]); skip == 0 { + return 0 + } + i += skip + skip = 0 + + if i >= len(data) { + return i + } + + if p.extensions&LaxHTMLBlocks != 0 { + return i + } + if skip = p.isEmpty(data[i:]); skip == 0 { + // following line must be blank + return 0 + } + + return i + skip +} + +func (*Markdown) isEmpty(data []byte) int { + // it is okay to call isEmpty on an empty buffer + if len(data) == 0 { + return 0 + } + + var i int + for i = 0; i < len(data) && data[i] != '\n'; i++ { + if data[i] != ' ' && data[i] != '\t' { + return 0 + } + } + if i < len(data) && data[i] == '\n' { + i++ + } + return i +} + +func (*Markdown) isHRule(data []byte) bool { + i := 0 + + // skip up to three spaces + for i < 3 && data[i] == ' ' { + i++ + } + + // look at the hrule char + if data[i] != '*' && data[i] != '-' && data[i] != '_' { + return false + } + c := data[i] + + // the whole line must be the char or whitespace + n := 0 + for i < len(data) && data[i] != '\n' { + switch { + case data[i] == c: + n++ + case data[i] != ' ': + return false + } + i++ + } + + return n >= 3 +} + +// isFenceLine checks if there's a fence line (e.g., ``` or ``` go) at the beginning of data, +// and returns the end index if so, or 0 otherwise. It also returns the marker found. +// If info is not nil, it gets set to the syntax specified in the fence line. +func isFenceLine(data []byte, info *string, oldmarker string) (end int, marker string) { + i, size := 0, 0 + + // skip up to three spaces + for i < len(data) && i < 3 && data[i] == ' ' { + i++ + } + + // check for the marker characters: ~ or ` + if i >= len(data) { + return 0, "" + } + if data[i] != '~' && data[i] != '`' { + return 0, "" + } + + c := data[i] + + // the whole line must be the same char or whitespace + for i < len(data) && data[i] == c { + size++ + i++ + } + + // the marker char must occur at least 3 times + if size < 3 { + return 0, "" + } + marker = string(data[i-size : i]) + + // if this is the end marker, it must match the beginning marker + if oldmarker != "" && marker != oldmarker { + return 0, "" + } + + // TODO(shurcooL): It's probably a good idea to simplify the 2 code paths here + // into one, always get the info string, and discard it if the caller doesn't care. + if info != nil { + infoLength := 0 + i = skipChar(data, i, ' ') + + if i >= len(data) { + if i == len(data) { + return i, marker + } + return 0, "" + } + + infoStart := i + + if data[i] == '{' { + i++ + infoStart++ + + for i < len(data) && data[i] != '}' && data[i] != '\n' { + infoLength++ + i++ + } + + if i >= len(data) || data[i] != '}' { + return 0, "" + } + + // strip all whitespace at the beginning and the end + // of the {} block + for infoLength > 0 && isspace(data[infoStart]) { + infoStart++ + infoLength-- + } + + for infoLength > 0 && isspace(data[infoStart+infoLength-1]) { + infoLength-- + } + i++ + i = skipChar(data, i, ' ') + } else { + for i < len(data) && !isverticalspace(data[i]) { + infoLength++ + i++ + } + } + + *info = strings.TrimSpace(string(data[infoStart : infoStart+infoLength])) + } + + if i == len(data) { + return i, marker + } + if i > len(data) || data[i] != '\n' { + return 0, "" + } + return i + 1, marker // Take newline into account. +} + +// fencedCodeBlock returns the end index if data contains a fenced code block at the beginning, +// or 0 otherwise. It writes to out if doRender is true, otherwise it has no side effects. +// If doRender is true, a final newline is mandatory to recognize the fenced code block. +func (p *Markdown) fencedCodeBlock(data []byte, doRender bool) int { + var info string + beg, marker := isFenceLine(data, &info, "") + if beg == 0 || beg >= len(data) { + return 0 + } + fenceLength := beg - 1 + + var work bytes.Buffer + work.Write([]byte(info)) + work.WriteByte('\n') + + for { + // safe to assume beg < len(data) + + // check for the end of the code block + fenceEnd, _ := isFenceLine(data[beg:], nil, marker) + if fenceEnd != 0 { + beg += fenceEnd + break + } + + // copy the current line + end := skipUntilChar(data, beg, '\n') + 1 + + // did we reach the end of the buffer without a closing marker? + if end >= len(data) { + return 0 + } + + // verbatim copy to the working buffer + if doRender { + work.Write(data[beg:end]) + } + beg = end + } + + if doRender { + block := p.addBlock(CodeBlock, work.Bytes()) // TODO: get rid of temp buffer + block.IsFenced = true + block.FenceLength = fenceLength + finalizeCodeBlock(block) + } + + return beg +} + +func unescapeChar(str []byte) []byte { + if str[0] == '\\' { + return []byte{str[1]} + } + return []byte(html.UnescapeString(string(str))) +} + +func unescapeString(str []byte) []byte { + if reBackslashOrAmp.Match(str) { + return reEntityOrEscapedChar.ReplaceAllFunc(str, unescapeChar) + } + return str +} + +func finalizeCodeBlock(block *Node) { + if block.IsFenced { + newlinePos := bytes.IndexByte(block.content, '\n') + firstLine := block.content[:newlinePos] + rest := block.content[newlinePos+1:] + block.Info = unescapeString(bytes.Trim(firstLine, "\n")) + block.Literal = rest + } else { + block.Literal = block.content + } + block.content = nil +} + +func (p *Markdown) table(data []byte) int { + table := p.addBlock(Table, nil) + i, columns := p.tableHeader(data) + if i == 0 { + p.tip = table.Parent + table.Unlink() + return 0 + } + + p.addBlock(TableBody, nil) + + for i < len(data) { + pipes, rowStart := 0, i + for ; i < len(data) && data[i] != '\n'; i++ { + if data[i] == '|' { + pipes++ + } + } + + if pipes == 0 { + i = rowStart + break + } + + // include the newline in data sent to tableRow + if i < len(data) && data[i] == '\n' { + i++ + } + p.tableRow(data[rowStart:i], columns, false) + } + + return i +} + +// check if the specified position is preceded by an odd number of backslashes +func isBackslashEscaped(data []byte, i int) bool { + backslashes := 0 + for i-backslashes-1 >= 0 && data[i-backslashes-1] == '\\' { + backslashes++ + } + return backslashes&1 == 1 +} + +func (p *Markdown) tableHeader(data []byte) (size int, columns []CellAlignFlags) { + i := 0 + colCount := 1 + for i = 0; i < len(data) && data[i] != '\n'; i++ { + if data[i] == '|' && !isBackslashEscaped(data, i) { + colCount++ + } + } + + // doesn't look like a table header + if colCount == 1 { + return + } + + // include the newline in the data sent to tableRow + j := i + if j < len(data) && data[j] == '\n' { + j++ + } + header := data[:j] + + // column count ignores pipes at beginning or end of line + if data[0] == '|' { + colCount-- + } + if i > 2 && data[i-1] == '|' && !isBackslashEscaped(data, i-1) { + colCount-- + } + + columns = make([]CellAlignFlags, colCount) + + // move on to the header underline + i++ + if i >= len(data) { + return + } + + if data[i] == '|' && !isBackslashEscaped(data, i) { + i++ + } + i = skipChar(data, i, ' ') + + // each column header is of form: / *:?-+:? *|/ with # dashes + # colons >= 3 + // and trailing | optional on last column + col := 0 + for i < len(data) && data[i] != '\n' { + dashes := 0 + + if data[i] == ':' { + i++ + columns[col] |= TableAlignmentLeft + dashes++ + } + for i < len(data) && data[i] == '-' { + i++ + dashes++ + } + if i < len(data) && data[i] == ':' { + i++ + columns[col] |= TableAlignmentRight + dashes++ + } + for i < len(data) && data[i] == ' ' { + i++ + } + if i == len(data) { + return + } + // end of column test is messy + switch { + case dashes < 3: + // not a valid column + return + + case data[i] == '|' && !isBackslashEscaped(data, i): + // marker found, now skip past trailing whitespace + col++ + i++ + for i < len(data) && data[i] == ' ' { + i++ + } + + // trailing junk found after last column + if col >= colCount && i < len(data) && data[i] != '\n' { + return + } + + case (data[i] != '|' || isBackslashEscaped(data, i)) && col+1 < colCount: + // something else found where marker was required + return + + case data[i] == '\n': + // marker is optional for the last column + col++ + + default: + // trailing junk found after last column + return + } + } + if col != colCount { + return + } + + p.addBlock(TableHead, nil) + p.tableRow(header, columns, true) + size = i + if size < len(data) && data[size] == '\n' { + size++ + } + return +} + +func (p *Markdown) tableRow(data []byte, columns []CellAlignFlags, header bool) { + p.addBlock(TableRow, nil) + i, col := 0, 0 + + if data[i] == '|' && !isBackslashEscaped(data, i) { + i++ + } + + for col = 0; col < len(columns) && i < len(data); col++ { + for i < len(data) && data[i] == ' ' { + i++ + } + + cellStart := i + + for i < len(data) && (data[i] != '|' || isBackslashEscaped(data, i)) && data[i] != '\n' { + i++ + } + + cellEnd := i + + // skip the end-of-cell marker, possibly taking us past end of buffer + i++ + + for cellEnd > cellStart && cellEnd-1 < len(data) && data[cellEnd-1] == ' ' { + cellEnd-- + } + + cell := p.addBlock(TableCell, data[cellStart:cellEnd]) + cell.IsHeader = header + cell.Align = columns[col] + } + + // pad it out with empty columns to get the right number + for ; col < len(columns); col++ { + cell := p.addBlock(TableCell, nil) + cell.IsHeader = header + cell.Align = columns[col] + } + + // silently ignore rows with too many cells +} + +// returns blockquote prefix length +func (p *Markdown) quotePrefix(data []byte) int { + i := 0 + for i < 3 && i < len(data) && data[i] == ' ' { + i++ + } + if i < len(data) && data[i] == '>' { + if i+1 < len(data) && data[i+1] == ' ' { + return i + 2 + } + return i + 1 + } + return 0 +} + +// blockquote ends with at least one blank line +// followed by something without a blockquote prefix +func (p *Markdown) terminateBlockquote(data []byte, beg, end int) bool { + if p.isEmpty(data[beg:]) <= 0 { + return false + } + if end >= len(data) { + return true + } + return p.quotePrefix(data[end:]) == 0 && p.isEmpty(data[end:]) == 0 +} + +// parse a blockquote fragment +func (p *Markdown) quote(data []byte) int { + block := p.addBlock(BlockQuote, nil) + var raw bytes.Buffer + beg, end := 0, 0 + for beg < len(data) { + end = beg + // Step over whole lines, collecting them. While doing that, check for + // fenced code and if one's found, incorporate it altogether, + // irregardless of any contents inside it + for end < len(data) && data[end] != '\n' { + if p.extensions&FencedCode != 0 { + if i := p.fencedCodeBlock(data[end:], false); i > 0 { + // -1 to compensate for the extra end++ after the loop: + end += i - 1 + break + } + } + end++ + } + if end < len(data) && data[end] == '\n' { + end++ + } + if pre := p.quotePrefix(data[beg:]); pre > 0 { + // skip the prefix + beg += pre + } else if p.terminateBlockquote(data, beg, end) { + break + } + // this line is part of the blockquote + raw.Write(data[beg:end]) + beg = end + } + p.block(raw.Bytes()) + p.finalize(block) + return end +} + +// returns prefix length for block code +func (p *Markdown) codePrefix(data []byte) int { + if len(data) >= 1 && data[0] == '\t' { + return 1 + } + if len(data) >= 4 && data[0] == ' ' && data[1] == ' ' && data[2] == ' ' && data[3] == ' ' { + return 4 + } + return 0 +} + +func (p *Markdown) code(data []byte) int { + var work bytes.Buffer + + i := 0 + for i < len(data) { + beg := i + for i < len(data) && data[i] != '\n' { + i++ + } + if i < len(data) && data[i] == '\n' { + i++ + } + + blankline := p.isEmpty(data[beg:i]) > 0 + if pre := p.codePrefix(data[beg:i]); pre > 0 { + beg += pre + } else if !blankline { + // non-empty, non-prefixed line breaks the pre + i = beg + break + } + + // verbatim copy to the working buffer + if blankline { + work.WriteByte('\n') + } else { + work.Write(data[beg:i]) + } + } + + // trim all the \n off the end of work + workbytes := work.Bytes() + eol := len(workbytes) + for eol > 0 && workbytes[eol-1] == '\n' { + eol-- + } + if eol != len(workbytes) { + work.Truncate(eol) + } + + work.WriteByte('\n') + + block := p.addBlock(CodeBlock, work.Bytes()) // TODO: get rid of temp buffer + block.IsFenced = false + finalizeCodeBlock(block) + + return i +} + +// returns unordered list item prefix +func (p *Markdown) uliPrefix(data []byte) int { + i := 0 + // start with up to 3 spaces + for i < len(data) && i < 3 && data[i] == ' ' { + i++ + } + if i >= len(data)-1 { + return 0 + } + // need one of {'*', '+', '-'} followed by a space or a tab + if (data[i] != '*' && data[i] != '+' && data[i] != '-') || + (data[i+1] != ' ' && data[i+1] != '\t') { + return 0 + } + return i + 2 +} + +// returns ordered list item prefix +func (p *Markdown) oliPrefix(data []byte) int { + i := 0 + + // start with up to 3 spaces + for i < 3 && i < len(data) && data[i] == ' ' { + i++ + } + + // count the digits + start := i + for i < len(data) && data[i] >= '0' && data[i] <= '9' { + i++ + } + if start == i || i >= len(data)-1 { + return 0 + } + + // we need >= 1 digits followed by a dot and a space or a tab + if data[i] != '.' || !(data[i+1] == ' ' || data[i+1] == '\t') { + return 0 + } + return i + 2 +} + +// returns definition list item prefix +func (p *Markdown) dliPrefix(data []byte) int { + if len(data) < 2 { + return 0 + } + i := 0 + // need a ':' followed by a space or a tab + if data[i] != ':' || !(data[i+1] == ' ' || data[i+1] == '\t') { + return 0 + } + for i < len(data) && data[i] == ' ' { + i++ + } + return i + 2 +} + +// parse ordered or unordered list block +func (p *Markdown) list(data []byte, flags ListType) int { + i := 0 + flags |= ListItemBeginningOfList + block := p.addBlock(List, nil) + block.ListFlags = flags + block.Tight = true + + for i < len(data) { + skip := p.listItem(data[i:], &flags) + if flags&ListItemContainsBlock != 0 { + block.ListData.Tight = false + } + i += skip + if skip == 0 || flags&ListItemEndOfList != 0 { + break + } + flags &= ^ListItemBeginningOfList + } + + above := block.Parent + finalizeList(block) + p.tip = above + return i +} + +// Returns true if the list item is not the same type as its parent list +func (p *Markdown) listTypeChanged(data []byte, flags *ListType) bool { + if p.dliPrefix(data) > 0 && *flags&ListTypeDefinition == 0 { + return true + } else if p.oliPrefix(data) > 0 && *flags&ListTypeOrdered == 0 { + return true + } else if p.uliPrefix(data) > 0 && (*flags&ListTypeOrdered != 0 || *flags&ListTypeDefinition != 0) { + return true + } + return false +} + +// Returns true if block ends with a blank line, descending if needed +// into lists and sublists. +func endsWithBlankLine(block *Node) bool { + // TODO: figure this out. Always false now. + for block != nil { + //if block.lastLineBlank { + //return true + //} + t := block.Type + if t == List || t == Item { + block = block.LastChild + } else { + break + } + } + return false +} + +func finalizeList(block *Node) { + block.open = false + item := block.FirstChild + for item != nil { + // check for non-final list item ending with blank line: + if endsWithBlankLine(item) && item.Next != nil { + block.ListData.Tight = false + break + } + // recurse into children of list item, to see if there are spaces + // between any of them: + subItem := item.FirstChild + for subItem != nil { + if endsWithBlankLine(subItem) && (item.Next != nil || subItem.Next != nil) { + block.ListData.Tight = false + break + } + subItem = subItem.Next + } + item = item.Next + } +} + +// Parse a single list item. +// Assumes initial prefix is already removed if this is a sublist. +func (p *Markdown) listItem(data []byte, flags *ListType) int { + // keep track of the indentation of the first line + itemIndent := 0 + if data[0] == '\t' { + itemIndent += 4 + } else { + for itemIndent < 3 && data[itemIndent] == ' ' { + itemIndent++ + } + } + + var bulletChar byte = '*' + i := p.uliPrefix(data) + if i == 0 { + i = p.oliPrefix(data) + } else { + bulletChar = data[i-2] + } + if i == 0 { + i = p.dliPrefix(data) + // reset definition term flag + if i > 0 { + *flags &= ^ListTypeTerm + } + } + if i == 0 { + // if in definition list, set term flag and continue + if *flags&ListTypeDefinition != 0 { + *flags |= ListTypeTerm + } else { + return 0 + } + } + + // skip leading whitespace on first line + for i < len(data) && data[i] == ' ' { + i++ + } + + // find the end of the line + line := i + for i > 0 && i < len(data) && data[i-1] != '\n' { + i++ + } + + // get working buffer + var raw bytes.Buffer + + // put the first line into the working buffer + raw.Write(data[line:i]) + line = i + + // process the following lines + containsBlankLine := false + sublist := 0 + codeBlockMarker := "" + +gatherlines: + for line < len(data) { + i++ + + // find the end of this line + for i < len(data) && data[i-1] != '\n' { + i++ + } + + // if it is an empty line, guess that it is part of this item + // and move on to the next line + if p.isEmpty(data[line:i]) > 0 { + containsBlankLine = true + line = i + continue + } + + // calculate the indentation + indent := 0 + indentIndex := 0 + if data[line] == '\t' { + indentIndex++ + indent += 4 + } else { + for indent < 4 && line+indent < i && data[line+indent] == ' ' { + indent++ + indentIndex++ + } + } + + chunk := data[line+indentIndex : i] + + if p.extensions&FencedCode != 0 { + // determine if in or out of codeblock + // if in codeblock, ignore normal list processing + _, marker := isFenceLine(chunk, nil, codeBlockMarker) + if marker != "" { + if codeBlockMarker == "" { + // start of codeblock + codeBlockMarker = marker + } else { + // end of codeblock. + codeBlockMarker = "" + } + } + // we are in a codeblock, write line, and continue + if codeBlockMarker != "" || marker != "" { + raw.Write(data[line+indentIndex : i]) + line = i + continue gatherlines + } + } + + // evaluate how this line fits in + switch { + // is this a nested list item? + case (p.uliPrefix(chunk) > 0 && !p.isHRule(chunk)) || + p.oliPrefix(chunk) > 0 || + p.dliPrefix(chunk) > 0: + + // to be a nested list, it must be indented more + // if not, it is either a different kind of list + // or the next item in the same list + if indent <= itemIndent { + if p.listTypeChanged(chunk, flags) { + *flags |= ListItemEndOfList + } else if containsBlankLine { + *flags |= ListItemContainsBlock + } + + break gatherlines + } + + if containsBlankLine { + *flags |= ListItemContainsBlock + } + + // is this the first item in the nested list? + if sublist == 0 { + sublist = raw.Len() + } + + // is this a nested prefix heading? + case p.isPrefixHeading(chunk): + // if the heading is not indented, it is not nested in the list + // and thus ends the list + if containsBlankLine && indent < 4 { + *flags |= ListItemEndOfList + break gatherlines + } + *flags |= ListItemContainsBlock + + // anything following an empty line is only part + // of this item if it is indented 4 spaces + // (regardless of the indentation of the beginning of the item) + case containsBlankLine && indent < 4: + if *flags&ListTypeDefinition != 0 && i < len(data)-1 { + // is the next item still a part of this list? + next := i + for next < len(data) && data[next] != '\n' { + next++ + } + for next < len(data)-1 && data[next] == '\n' { + next++ + } + if i < len(data)-1 && data[i] != ':' && data[next] != ':' { + *flags |= ListItemEndOfList + } + } else { + *flags |= ListItemEndOfList + } + break gatherlines + + // a blank line means this should be parsed as a block + case containsBlankLine: + raw.WriteByte('\n') + *flags |= ListItemContainsBlock + } + + // if this line was preceded by one or more blanks, + // re-introduce the blank into the buffer + if containsBlankLine { + containsBlankLine = false + raw.WriteByte('\n') + } + + // add the line into the working buffer without prefix + raw.Write(data[line+indentIndex : i]) + + line = i + } + + rawBytes := raw.Bytes() + + block := p.addBlock(Item, nil) + block.ListFlags = *flags + block.Tight = false + block.BulletChar = bulletChar + block.Delimiter = '.' // Only '.' is possible in Markdown, but ')' will also be possible in CommonMark + + // render the contents of the list item + if *flags&ListItemContainsBlock != 0 && *flags&ListTypeTerm == 0 { + // intermediate render of block item, except for definition term + if sublist > 0 { + p.block(rawBytes[:sublist]) + p.block(rawBytes[sublist:]) + } else { + p.block(rawBytes) + } + } else { + // intermediate render of inline item + if sublist > 0 { + child := p.addChild(Paragraph, 0) + child.content = rawBytes[:sublist] + p.block(rawBytes[sublist:]) + } else { + child := p.addChild(Paragraph, 0) + child.content = rawBytes + } + } + return line +} + +// render a single paragraph that has already been parsed out +func (p *Markdown) renderParagraph(data []byte) { + if len(data) == 0 { + return + } + + // trim leading spaces + beg := 0 + for data[beg] == ' ' { + beg++ + } + + end := len(data) + // trim trailing newline + if data[len(data)-1] == '\n' { + end-- + } + + // trim trailing spaces + for end > beg && data[end-1] == ' ' { + end-- + } + + p.addBlock(Paragraph, data[beg:end]) +} + +func (p *Markdown) paragraph(data []byte) int { + // prev: index of 1st char of previous line + // line: index of 1st char of current line + // i: index of cursor/end of current line + var prev, line, i int + tabSize := TabSizeDefault + if p.extensions&TabSizeEight != 0 { + tabSize = TabSizeDouble + } + // keep going until we find something to mark the end of the paragraph + for i < len(data) { + // mark the beginning of the current line + prev = line + current := data[i:] + line = i + + // did we find a reference or a footnote? If so, end a paragraph + // preceding it and report that we have consumed up to the end of that + // reference: + if refEnd := isReference(p, current, tabSize); refEnd > 0 { + p.renderParagraph(data[:i]) + return i + refEnd + } + + // did we find a blank line marking the end of the paragraph? + if n := p.isEmpty(current); n > 0 { + // did this blank line followed by a definition list item? + if p.extensions&DefinitionLists != 0 { + if i < len(data)-1 && data[i+1] == ':' { + return p.list(data[prev:], ListTypeDefinition) + } + } + + p.renderParagraph(data[:i]) + return i + n + } + + // an underline under some text marks a heading, so our paragraph ended on prev line + if i > 0 { + if level := p.isUnderlinedHeading(current); level > 0 { + // render the paragraph + p.renderParagraph(data[:prev]) + + // ignore leading and trailing whitespace + eol := i - 1 + for prev < eol && data[prev] == ' ' { + prev++ + } + for eol > prev && data[eol-1] == ' ' { + eol-- + } + + id := "" + if p.extensions&AutoHeadingIDs != 0 { + id = SanitizedAnchorName(string(data[prev:eol])) + } + + block := p.addBlock(Heading, data[prev:eol]) + block.Level = level + block.HeadingID = id + + // find the end of the underline + for i < len(data) && data[i] != '\n' { + i++ + } + return i + } + } + + // if the next line starts a block of HTML, then the paragraph ends here + if p.extensions&LaxHTMLBlocks != 0 { + if data[i] == '<' && p.html(current, false) > 0 { + // rewind to before the HTML block + p.renderParagraph(data[:i]) + return i + } + } + + // if there's a prefixed heading or a horizontal rule after this, paragraph is over + if p.isPrefixHeading(current) || p.isHRule(current) { + p.renderParagraph(data[:i]) + return i + } + + // if there's a fenced code block, paragraph is over + if p.extensions&FencedCode != 0 { + if p.fencedCodeBlock(current, false) > 0 { + p.renderParagraph(data[:i]) + return i + } + } + + // if there's a definition list item, prev line is a definition term + if p.extensions&DefinitionLists != 0 { + if p.dliPrefix(current) != 0 { + ret := p.list(data[prev:], ListTypeDefinition) + return ret + } + } + + // if there's a list after this, paragraph is over + if p.extensions&NoEmptyLineBeforeBlock != 0 { + if p.uliPrefix(current) != 0 || + p.oliPrefix(current) != 0 || + p.quotePrefix(current) != 0 || + p.codePrefix(current) != 0 { + p.renderParagraph(data[:i]) + return i + } + } + + // otherwise, scan to the beginning of the next line + nl := bytes.IndexByte(data[i:], '\n') + if nl >= 0 { + i += nl + 1 + } else { + i += len(data[i:]) + } + } + + p.renderParagraph(data[:i]) + return i +} + +func skipChar(data []byte, start int, char byte) int { + i := start + for i < len(data) && data[i] == char { + i++ + } + return i +} + +func skipUntilChar(text []byte, start int, char byte) int { + i := start + for i < len(text) && text[i] != char { + i++ + } + return i +} + +// SanitizedAnchorName returns a sanitized anchor name for the given text. +// +// It implements the algorithm specified in the package comment. +func SanitizedAnchorName(text string) string { + var anchorName []rune + futureDash := false + for _, r := range text { + switch { + case unicode.IsLetter(r) || unicode.IsNumber(r): + if futureDash && len(anchorName) > 0 { + anchorName = append(anchorName, '-') + } + futureDash = false + anchorName = append(anchorName, unicode.ToLower(r)) + default: + futureDash = true + } + } + return string(anchorName) +} diff --git a/vendor/github.com/russross/blackfriday/v2/doc.go b/vendor/github.com/russross/blackfriday/v2/doc.go new file mode 100644 index 0000000..57ff152 --- /dev/null +++ b/vendor/github.com/russross/blackfriday/v2/doc.go @@ -0,0 +1,46 @@ +// Package blackfriday is a markdown processor. +// +// It translates plain text with simple formatting rules into an AST, which can +// then be further processed to HTML (provided by Blackfriday itself) or other +// formats (provided by the community). +// +// The simplest way to invoke Blackfriday is to call the Run function. It will +// take a text input and produce a text output in HTML (or other format). +// +// A slightly more sophisticated way to use Blackfriday is to create a Markdown +// processor and to call Parse, which returns a syntax tree for the input +// document. You can leverage Blackfriday's parsing for content extraction from +// markdown documents. You can assign a custom renderer and set various options +// to the Markdown processor. +// +// If you're interested in calling Blackfriday from command line, see +// https://github.com/russross/blackfriday-tool. +// +// Sanitized Anchor Names +// +// Blackfriday includes an algorithm for creating sanitized anchor names +// corresponding to a given input text. This algorithm is used to create +// anchors for headings when AutoHeadingIDs extension is enabled. The +// algorithm is specified below, so that other packages can create +// compatible anchor names and links to those anchors. +// +// The algorithm iterates over the input text, interpreted as UTF-8, +// one Unicode code point (rune) at a time. All runes that are letters (category L) +// or numbers (category N) are considered valid characters. They are mapped to +// lower case, and included in the output. All other runes are considered +// invalid characters. Invalid characters that precede the first valid character, +// as well as invalid character that follow the last valid character +// are dropped completely. All other sequences of invalid characters +// between two valid characters are replaced with a single dash character '-'. +// +// SanitizedAnchorName exposes this functionality, and can be used to +// create compatible links to the anchor names generated by blackfriday. +// This algorithm is also implemented in a small standalone package at +// github.com/shurcooL/sanitized_anchor_name. It can be useful for clients +// that want a small package and don't need full functionality of blackfriday. +package blackfriday + +// NOTE: Keep Sanitized Anchor Name algorithm in sync with package +// github.com/shurcooL/sanitized_anchor_name. +// Otherwise, users of sanitized_anchor_name will get anchor names +// that are incompatible with those generated by blackfriday. diff --git a/vendor/github.com/russross/blackfriday/v2/entities.go b/vendor/github.com/russross/blackfriday/v2/entities.go new file mode 100644 index 0000000..a2c3edb --- /dev/null +++ b/vendor/github.com/russross/blackfriday/v2/entities.go @@ -0,0 +1,2236 @@ +package blackfriday + +// Extracted from https://html.spec.whatwg.org/multipage/entities.json +var entities = map[string]bool{ + "Æ": true, + "Æ": true, + "&": true, + "&": true, + "Á": true, + "Á": true, + "Ă": true, + "Â": true, + "Â": true, + "А": true, + "𝔄": true, + "À": true, + "À": true, + "Α": true, + "Ā": true, + "⩓": true, + "Ą": true, + "𝔸": true, + "⁡": true, + "Å": true, + "Å": true, + "𝒜": true, + "≔": true, + "Ã": true, + "Ã": true, + "Ä": true, + "Ä": true, + "∖": true, + "⫧": true, + "⌆": true, + "Б": true, + "∵": true, + "ℬ": true, + "Β": true, + "𝔅": true, + "𝔹": true, + "˘": true, + "ℬ": true, + "≎": true, + "Ч": true, + "©": true, + "©": true, + "Ć": true, + "⋒": true, + "ⅅ": true, + "ℭ": true, + "Č": true, + "Ç": true, + "Ç": true, + "Ĉ": true, + "∰": true, + "Ċ": true, + "¸": true, + "·": true, + "ℭ": true, + "Χ": true, + "⊙": true, + "⊖": true, + "⊕": true, + "⊗": true, + "∲": true, + "”": true, + "’": true, + "∷": true, + "⩴": true, + "≡": true, + "∯": true, + "∮": true, + "ℂ": true, + "∐": true, + "∳": true, + "⨯": true, + "𝒞": true, + "⋓": true, + "≍": true, + "ⅅ": true, + "⤑": true, + "Ђ": true, + "Ѕ": true, + "Џ": true, + "‡": true, + "↡": true, + "⫤": true, + "Ď": true, + "Д": true, + "∇": true, + "Δ": true, + "𝔇": true, + "´": true, + "˙": true, + "˝": true, + "`": true, + "˜": true, + "⋄": true, + "ⅆ": true, + "𝔻": true, + "¨": true, + "⃜": true, + "≐": true, + "∯": true, + "¨": true, + "⇓": true, + "⇐": true, + "⇔": true, + "⫤": true, + "⟸": true, + "⟺": true, + "⟹": true, + "⇒": true, + "⊨": true, + "⇑": true, + "⇕": true, + "∥": true, + "↓": true, + "⤓": true, + "⇵": true, + "̑": true, + "⥐": true, + "⥞": true, + "↽": true, + "⥖": true, + "⥟": true, + "⇁": true, + "⥗": true, + "⊤": true, + "↧": true, + "⇓": true, + "𝒟": true, + "Đ": true, + "Ŋ": true, + "Ð": true, + "Ð": true, + "É": true, + "É": true, + "Ě": true, + "Ê": true, + "Ê": true, + "Э": true, + "Ė": true, + "𝔈": true, + "È": true, + "È": true, + "∈": true, + "Ē": true, + "◻": true, + "▫": true, + "Ę": true, + "𝔼": true, + "Ε": true, + "⩵": true, + "≂": true, + "⇌": true, + "ℰ": true, + "⩳": true, + "Η": true, + "Ë": true, + "Ë": true, + "∃": true, + "ⅇ": true, + "Ф": true, + "𝔉": true, + "◼": true, + "▪": true, + "𝔽": true, + "∀": true, + "ℱ": true, + "ℱ": true, + "Ѓ": true, + ">": true, + ">": true, + "Γ": true, + "Ϝ": true, + "Ğ": true, + "Ģ": true, + "Ĝ": true, + "Г": true, + "Ġ": true, + "𝔊": true, + "⋙": true, + "𝔾": true, + "≥": true, + "⋛": true, + "≧": true, + "⪢": true, + "≷": true, + "⩾": true, + "≳": true, + "𝒢": true, + "≫": true, + "Ъ": true, + "ˇ": true, + "^": true, + "Ĥ": true, + "ℌ": true, + "ℋ": true, + "ℍ": true, + "─": true, + "ℋ": true, + "Ħ": true, + "≎": true, + "≏": true, + "Е": true, + "IJ": true, + "Ё": true, + "Í": true, + "Í": true, + "Î": true, + "Î": true, + "И": true, + "İ": true, + "ℑ": true, + "Ì": true, + "Ì": true, + "ℑ": true, + "Ī": true, + "ⅈ": true, + "⇒": true, + "∬": true, + "∫": true, + "⋂": true, + "⁣": true, + "⁢": true, + "Į": true, + "𝕀": true, + "Ι": true, + "ℐ": true, + "Ĩ": true, + "І": true, + "Ï": true, + "Ï": true, + "Ĵ": true, + "Й": true, + "𝔍": true, + "𝕁": true, + "𝒥": true, + "Ј": true, + "Є": true, + "Х": true, + "Ќ": true, + "Κ": true, + "Ķ": true, + "К": true, + "𝔎": true, + "𝕂": true, + "𝒦": true, + "Љ": true, + "<": true, + "<": true, + "Ĺ": true, + "Λ": true, + "⟪": true, + "ℒ": true, + "↞": true, + "Ľ": true, + "Ļ": true, + "Л": true, + "⟨": true, + "←": true, + "⇤": true, + "⇆": true, + "⌈": true, + "⟦": true, + "⥡": true, + "⇃": true, + "⥙": true, + "⌊": true, + "↔": true, + "⥎": true, + "⊣": true, + "↤": true, + "⥚": true, + "⊲": true, + "⧏": true, + "⊴": true, + "⥑": true, + "⥠": true, + "↿": true, + "⥘": true, + "↼": true, + "⥒": true, + "⇐": true, + "⇔": true, + "⋚": true, + "≦": true, + "≶": true, + "⪡": true, + "⩽": true, + "≲": true, + "𝔏": true, + "⋘": true, + "⇚": true, + "Ŀ": true, + "⟵": true, + "⟷": true, + "⟶": true, + "⟸": true, + "⟺": true, + "⟹": true, + "𝕃": true, + "↙": true, + "↘": true, + "ℒ": true, + "↰": true, + "Ł": true, + "≪": true, + "⤅": true, + "М": true, + " ": true, + "ℳ": true, + "𝔐": true, + "∓": true, + "𝕄": true, + "ℳ": true, + "Μ": true, + "Њ": true, + "Ń": true, + "Ň": true, + "Ņ": true, + "Н": true, + "​": true, + "​": true, + "​": true, + "​": true, + "≫": true, + "≪": true, + " ": true, + "𝔑": true, + "⁠": true, + " ": true, + "ℕ": true, + "⫬": true, + "≢": true, + "≭": true, + "∦": true, + "∉": true, + "≠": true, + "≂̸": true, + "∄": true, + "≯": true, + "≱": true, + "≧̸": true, + "≫̸": true, + "≹": true, + "⩾̸": true, + "≵": true, + "≎̸": true, + "≏̸": true, + "⋪": true, + "⧏̸": true, + "⋬": true, + "≮": true, + "≰": true, + "≸": true, + "≪̸": true, + "⩽̸": true, + "≴": true, + "⪢̸": true, + "⪡̸": true, + "⊀": true, + "⪯̸": true, + "⋠": true, + "∌": true, + "⋫": true, + "⧐̸": true, + "⋭": true, + "⊏̸": true, + "⋢": true, + "⊐̸": true, + "⋣": true, + "⊂⃒": true, + "⊈": true, + "⊁": true, + "⪰̸": true, + "⋡": true, + "≿̸": true, + "⊃⃒": true, + "⊉": true, + "≁": true, + "≄": true, + "≇": true, + "≉": true, + "∤": true, + "𝒩": true, + "Ñ": true, + "Ñ": true, + "Ν": true, + "Œ": true, + "Ó": true, + "Ó": true, + "Ô": true, + "Ô": true, + "О": true, + "Ő": true, + "𝔒": true, + "Ò": true, + "Ò": true, + "Ō": true, + "Ω": true, + "Ο": true, + "𝕆": true, + "“": true, + "‘": true, + "⩔": true, + "𝒪": true, + "Ø": true, + "Ø": true, + "Õ": true, + "Õ": true, + "⨷": true, + "Ö": true, + "Ö": true, + "‾": true, + "⏞": true, + "⎴": true, + "⏜": true, + "∂": true, + "П": true, + "𝔓": true, + "Φ": true, + "Π": true, + "±": true, + "ℌ": true, + "ℙ": true, + "⪻": true, + "≺": true, + "⪯": true, + "≼": true, + "≾": true, + "″": true, + "∏": true, + "∷": true, + "∝": true, + "𝒫": true, + "Ψ": true, + """: true, + """: true, + "𝔔": true, + "ℚ": true, + "𝒬": true, + "⤐": true, + "®": true, + "®": true, + "Ŕ": true, + "⟫": true, + "↠": true, + "⤖": true, + "Ř": true, + "Ŗ": true, + "Р": true, + "ℜ": true, + "∋": true, + "⇋": true, + "⥯": true, + "ℜ": true, + "Ρ": true, + "⟩": true, + "→": true, + "⇥": true, + "⇄": true, + "⌉": true, + "⟧": true, + "⥝": true, + "⇂": true, + "⥕": true, + "⌋": true, + "⊢": true, + "↦": true, + "⥛": true, + "⊳": true, + "⧐": true, + "⊵": true, + "⥏": true, + "⥜": true, + "↾": true, + "⥔": true, + "⇀": true, + "⥓": true, + "⇒": true, + "ℝ": true, + "⥰": true, + "⇛": true, + "ℛ": true, + "↱": true, + "⧴": true, + "Щ": true, + "Ш": true, + "Ь": true, + "Ś": true, + "⪼": true, + "Š": true, + "Ş": true, + "Ŝ": true, + "С": true, + "𝔖": true, + "↓": true, + "←": true, + "→": true, + "↑": true, + "Σ": true, + "∘": true, + "𝕊": true, + "√": true, + "□": true, + "⊓": true, + "⊏": true, + "⊑": true, + "⊐": true, + "⊒": true, + "⊔": true, + "𝒮": true, + "⋆": true, + "⋐": true, + "⋐": true, + "⊆": true, + "≻": true, + "⪰": true, + "≽": true, + "≿": true, + "∋": true, + "∑": true, + "⋑": true, + "⊃": true, + "⊇": true, + "⋑": true, + "Þ": true, + "Þ": true, + "™": true, + "Ћ": true, + "Ц": true, + " ": true, + "Τ": true, + "Ť": true, + "Ţ": true, + "Т": true, + "𝔗": true, + "∴": true, + "Θ": true, + "  ": true, + " ": true, + "∼": true, + "≃": true, + "≅": true, + "≈": true, + "𝕋": true, + "⃛": true, + "𝒯": true, + "Ŧ": true, + "Ú": true, + "Ú": true, + "↟": true, + "⥉": true, + "Ў": true, + "Ŭ": true, + "Û": true, + "Û": true, + "У": true, + "Ű": true, + "𝔘": true, + "Ù": true, + "Ù": true, + "Ū": true, + "_": true, + "⏟": true, + "⎵": true, + "⏝": true, + "⋃": true, + "⊎": true, + "Ų": true, + "𝕌": true, + "↑": true, + "⤒": true, + "⇅": true, + "↕": true, + "⥮": true, + "⊥": true, + "↥": true, + "⇑": true, + "⇕": true, + "↖": true, + "↗": true, + "ϒ": true, + "Υ": true, + "Ů": true, + "𝒰": true, + "Ũ": true, + "Ü": true, + "Ü": true, + "⊫": true, + "⫫": true, + "В": true, + "⊩": true, + "⫦": true, + "⋁": true, + "‖": true, + "‖": true, + "∣": true, + "|": true, + "❘": true, + "≀": true, + " ": true, + "𝔙": true, + "𝕍": true, + "𝒱": true, + "⊪": true, + "Ŵ": true, + "⋀": true, + "𝔚": true, + "𝕎": true, + "𝒲": true, + "𝔛": true, + "Ξ": true, + "𝕏": true, + "𝒳": true, + "Я": true, + "Ї": true, + "Ю": true, + "Ý": true, + "Ý": true, + "Ŷ": true, + "Ы": true, + "𝔜": true, + "𝕐": true, + "𝒴": true, + "Ÿ": true, + "Ж": true, + "Ź": true, + "Ž": true, + "З": true, + "Ż": true, + "​": true, + "Ζ": true, + "ℨ": true, + "ℤ": true, + "𝒵": true, + "á": true, + "á": true, + "ă": true, + "∾": true, + "∾̳": true, + "∿": true, + "â": true, + "â": true, + "´": true, + "´": true, + "а": true, + "æ": true, + "æ": true, + "⁡": true, + "𝔞": true, + "à": true, + "à": true, + "ℵ": true, + "ℵ": true, + "α": true, + "ā": true, + "⨿": true, + "&": true, + "&": true, + "∧": true, + "⩕": true, + "⩜": true, + "⩘": true, + "⩚": true, + "∠": true, + "⦤": true, + "∠": true, + "∡": true, + "⦨": true, + "⦩": true, + "⦪": true, + "⦫": true, + "⦬": true, + "⦭": true, + "⦮": true, + "⦯": true, + "∟": true, + "⊾": true, + "⦝": true, + "∢": true, + "Å": true, + "⍼": true, + "ą": true, + "𝕒": true, + "≈": true, + "⩰": true, + "⩯": true, + "≊": true, + "≋": true, + "'": true, + "≈": true, + "≊": true, + "å": true, + "å": true, + "𝒶": true, + "*": true, + "≈": true, + "≍": true, + "ã": true, + "ã": true, + "ä": true, + "ä": true, + "∳": true, + "⨑": true, + "⫭": true, + "≌": true, + "϶": true, + "‵": true, + "∽": true, + "⋍": true, + "⊽": true, + "⌅": true, + "⌅": true, + "⎵": true, + "⎶": true, + "≌": true, + "б": true, + "„": true, + "∵": true, + "∵": true, + "⦰": true, + "϶": true, + "ℬ": true, + "β": true, + "ℶ": true, + "≬": true, + "𝔟": true, + "⋂": true, + "◯": true, + "⋃": true, + "⨀": true, + "⨁": true, + "⨂": true, + "⨆": true, + "★": true, + "▽": true, + "△": true, + "⨄": true, + "⋁": true, + "⋀": true, + "⤍": true, + "⧫": true, + "▪": true, + "▴": true, + "▾": true, + "◂": true, + "▸": true, + "␣": true, + "▒": true, + "░": true, + "▓": true, + "█": true, + "=⃥": true, + "≡⃥": true, + "⌐": true, + "𝕓": true, + "⊥": true, + "⊥": true, + "⋈": true, + "╗": true, + "╔": true, + "╖": true, + "╓": true, + "═": true, + "╦": true, + "╩": true, + "╤": true, + "╧": true, + "╝": true, + "╚": true, + "╜": true, + "╙": true, + "║": true, + "╬": true, + "╣": true, + "╠": true, + "╫": true, + "╢": true, + "╟": true, + "⧉": true, + "╕": true, + "╒": true, + "┐": true, + "┌": true, + "─": true, + "╥": true, + "╨": true, + "┬": true, + "┴": true, + "⊟": true, + "⊞": true, + "⊠": true, + "╛": true, + "╘": true, + "┘": true, + "└": true, + "│": true, + "╪": true, + "╡": true, + "╞": true, + "┼": true, + "┤": true, + "├": true, + "‵": true, + "˘": true, + "¦": true, + "¦": true, + "𝒷": true, + "⁏": true, + "∽": true, + "⋍": true, + "\": true, + "⧅": true, + "⟈": true, + "•": true, + "•": true, + "≎": true, + "⪮": true, + "≏": true, + "≏": true, + "ć": true, + "∩": true, + "⩄": true, + "⩉": true, + "⩋": true, + "⩇": true, + "⩀": true, + "∩︀": true, + "⁁": true, + "ˇ": true, + "⩍": true, + "č": true, + "ç": true, + "ç": true, + "ĉ": true, + "⩌": true, + "⩐": true, + "ċ": true, + "¸": true, + "¸": true, + "⦲": true, + "¢": true, + "¢": true, + "·": true, + "𝔠": true, + "ч": true, + "✓": true, + "✓": true, + "χ": true, + "○": true, + "⧃": true, + "ˆ": true, + "≗": true, + "↺": true, + "↻": true, + "®": true, + "Ⓢ": true, + "⊛": true, + "⊚": true, + "⊝": true, + "≗": true, + "⨐": true, + "⫯": true, + "⧂": true, + "♣": true, + "♣": true, + ":": true, + "≔": true, + "≔": true, + ",": true, + "@": true, + "∁": true, + "∘": true, + "∁": true, + "ℂ": true, + "≅": true, + "⩭": true, + "∮": true, + "𝕔": true, + "∐": true, + "©": true, + "©": true, + "℗": true, + "↵": true, + "✗": true, + "𝒸": true, + "⫏": true, + "⫑": true, + "⫐": true, + "⫒": true, + "⋯": true, + "⤸": true, + "⤵": true, + "⋞": true, + "⋟": true, + "↶": true, + "⤽": true, + "∪": true, + "⩈": true, + "⩆": true, + "⩊": true, + "⊍": true, + "⩅": true, + "∪︀": true, + "↷": true, + "⤼": true, + "⋞": true, + "⋟": true, + "⋎": true, + "⋏": true, + "¤": true, + "¤": true, + "↶": true, + "↷": true, + "⋎": true, + "⋏": true, + "∲": true, + "∱": true, + "⌭": true, + "⇓": true, + "⥥": true, + "†": true, + "ℸ": true, + "↓": true, + "‐": true, + "⊣": true, + "⤏": true, + "˝": true, + "ď": true, + "д": true, + "ⅆ": true, + "‡": true, + "⇊": true, + "⩷": true, + "°": true, + "°": true, + "δ": true, + "⦱": true, + "⥿": true, + "𝔡": true, + "⇃": true, + "⇂": true, + "⋄": true, + "⋄": true, + "♦": true, + "♦": true, + "¨": true, + "ϝ": true, + "⋲": true, + "÷": true, + "÷": true, + "÷": true, + "⋇": true, + "⋇": true, + "ђ": true, + "⌞": true, + "⌍": true, + "$": true, + "𝕕": true, + "˙": true, + "≐": true, + "≑": true, + "∸": true, + "∔": true, + "⊡": true, + "⌆": true, + "↓": true, + "⇊": true, + "⇃": true, + "⇂": true, + "⤐": true, + "⌟": true, + "⌌": true, + "𝒹": true, + "ѕ": true, + "⧶": true, + "đ": true, + "⋱": true, + "▿": true, + "▾": true, + "⇵": true, + "⥯": true, + "⦦": true, + "џ": true, + "⟿": true, + "⩷": true, + "≑": true, + "é": true, + "é": true, + "⩮": true, + "ě": true, + "≖": true, + "ê": true, + "ê": true, + "≕": true, + "э": true, + "ė": true, + "ⅇ": true, + "≒": true, + "𝔢": true, + "⪚": true, + "è": true, + "è": true, + "⪖": true, + "⪘": true, + "⪙": true, + "⏧": true, + "ℓ": true, + "⪕": true, + "⪗": true, + "ē": true, + "∅": true, + "∅": true, + "∅": true, + " ": true, + " ": true, + " ": true, + "ŋ": true, + " ": true, + "ę": true, + "𝕖": true, + "⋕": true, + "⧣": true, + "⩱": true, + "ε": true, + "ε": true, + "ϵ": true, + "≖": true, + "≕": true, + "≂": true, + "⪖": true, + "⪕": true, + "=": true, + "≟": true, + "≡": true, + "⩸": true, + "⧥": true, + "≓": true, + "⥱": true, + "ℯ": true, + "≐": true, + "≂": true, + "η": true, + "ð": true, + "ð": true, + "ë": true, + "ë": true, + "€": true, + "!": true, + "∃": true, + "ℰ": true, + "ⅇ": true, + "≒": true, + "ф": true, + "♀": true, + "ffi": true, + "ff": true, + "ffl": true, + "𝔣": true, + "fi": true, + "fj": true, + "♭": true, + "fl": true, + "▱": true, + "ƒ": true, + "𝕗": true, + "∀": true, + "⋔": true, + "⫙": true, + "⨍": true, + "½": true, + "½": true, + "⅓": true, + "¼": true, + "¼": true, + "⅕": true, + "⅙": true, + "⅛": true, + "⅔": true, + "⅖": true, + "¾": true, + "¾": true, + "⅗": true, + "⅜": true, + "⅘": true, + "⅚": true, + "⅝": true, + "⅞": true, + "⁄": true, + "⌢": true, + "𝒻": true, + "≧": true, + "⪌": true, + "ǵ": true, + "γ": true, + "ϝ": true, + "⪆": true, + "ğ": true, + "ĝ": true, + "г": true, + "ġ": true, + "≥": true, + "⋛": true, + "≥": true, + "≧": true, + "⩾": true, + "⩾": true, + "⪩": true, + "⪀": true, + "⪂": true, + "⪄": true, + "⋛︀": true, + "⪔": true, + "𝔤": true, + "≫": true, + "⋙": true, + "ℷ": true, + "ѓ": true, + "≷": true, + "⪒": true, + "⪥": true, + "⪤": true, + "≩": true, + "⪊": true, + "⪊": true, + "⪈": true, + "⪈": true, + "≩": true, + "⋧": true, + "𝕘": true, + "`": true, + "ℊ": true, + "≳": true, + "⪎": true, + "⪐": true, + ">": true, + ">": true, + "⪧": true, + "⩺": true, + "⋗": true, + "⦕": true, + "⩼": true, + "⪆": true, + "⥸": true, + "⋗": true, + "⋛": true, + "⪌": true, + "≷": true, + "≳": true, + "≩︀": true, + "≩︀": true, + "⇔": true, + " ": true, + "½": true, + "ℋ": true, + "ъ": true, + "↔": true, + "⥈": true, + "↭": true, + "ℏ": true, + "ĥ": true, + "♥": true, + "♥": true, + "…": true, + "⊹": true, + "𝔥": true, + "⤥": true, + "⤦": true, + "⇿": true, + "∻": true, + "↩": true, + "↪": true, + "𝕙": true, + "―": true, + "𝒽": true, + "ℏ": true, + "ħ": true, + "⁃": true, + "‐": true, + "í": true, + "í": true, + "⁣": true, + "î": true, + "î": true, + "и": true, + "е": true, + "¡": true, + "¡": true, + "⇔": true, + "𝔦": true, + "ì": true, + "ì": true, + "ⅈ": true, + "⨌": true, + "∭": true, + "⧜": true, + "℩": true, + "ij": true, + "ī": true, + "ℑ": true, + "ℐ": true, + "ℑ": true, + "ı": true, + "⊷": true, + "Ƶ": true, + "∈": true, + "℅": true, + "∞": true, + "⧝": true, + "ı": true, + "∫": true, + "⊺": true, + "ℤ": true, + "⊺": true, + "⨗": true, + "⨼": true, + "ё": true, + "į": true, + "𝕚": true, + "ι": true, + "⨼": true, + "¿": true, + "¿": true, + "𝒾": true, + "∈": true, + "⋹": true, + "⋵": true, + "⋴": true, + "⋳": true, + "∈": true, + "⁢": true, + "ĩ": true, + "і": true, + "ï": true, + "ï": true, + "ĵ": true, + "й": true, + "𝔧": true, + "ȷ": true, + "𝕛": true, + "𝒿": true, + "ј": true, + "є": true, + "κ": true, + "ϰ": true, + "ķ": true, + "к": true, + "𝔨": true, + "ĸ": true, + "х": true, + "ќ": true, + "𝕜": true, + "𝓀": true, + "⇚": true, + "⇐": true, + "⤛": true, + "⤎": true, + "≦": true, + "⪋": true, + "⥢": true, + "ĺ": true, + "⦴": true, + "ℒ": true, + "λ": true, + "⟨": true, + "⦑": true, + "⟨": true, + "⪅": true, + "«": true, + "«": true, + "←": true, + "⇤": true, + "⤟": true, + "⤝": true, + "↩": true, + "↫": true, + "⤹": true, + "⥳": true, + "↢": true, + "⪫": true, + "⤙": true, + "⪭": true, + "⪭︀": true, + "⤌": true, + "❲": true, + "{": true, + "[": true, + "⦋": true, + "⦏": true, + "⦍": true, + "ľ": true, + "ļ": true, + "⌈": true, + "{": true, + "л": true, + "⤶": true, + "“": true, + "„": true, + "⥧": true, + "⥋": true, + "↲": true, + "≤": true, + "←": true, + "↢": true, + "↽": true, + "↼": true, + "⇇": true, + "↔": true, + "⇆": true, + "⇋": true, + "↭": true, + "⋋": true, + "⋚": true, + "≤": true, + "≦": true, + "⩽": true, + "⩽": true, + "⪨": true, + "⩿": true, + "⪁": true, + "⪃": true, + "⋚︀": true, + "⪓": true, + "⪅": true, + "⋖": true, + "⋚": true, + "⪋": true, + "≶": true, + "≲": true, + "⥼": true, + "⌊": true, + "𝔩": true, + "≶": true, + "⪑": true, + "↽": true, + "↼": true, + "⥪": true, + "▄": true, + "љ": true, + "≪": true, + "⇇": true, + "⌞": true, + "⥫": true, + "◺": true, + "ŀ": true, + "⎰": true, + "⎰": true, + "≨": true, + "⪉": true, + "⪉": true, + "⪇": true, + "⪇": true, + "≨": true, + "⋦": true, + "⟬": true, + "⇽": true, + "⟦": true, + "⟵": true, + "⟷": true, + "⟼": true, + "⟶": true, + "↫": true, + "↬": true, + "⦅": true, + "𝕝": true, + "⨭": true, + "⨴": true, + "∗": true, + "_": true, + "◊": true, + "◊": true, + "⧫": true, + "(": true, + "⦓": true, + "⇆": true, + "⌟": true, + "⇋": true, + "⥭": true, + "‎": true, + "⊿": true, + "‹": true, + "𝓁": true, + "↰": true, + "≲": true, + "⪍": true, + "⪏": true, + "[": true, + "‘": true, + "‚": true, + "ł": true, + "<": true, + "<": true, + "⪦": true, + "⩹": true, + "⋖": true, + "⋋": true, + "⋉": true, + "⥶": true, + "⩻": true, + "⦖": true, + "◃": true, + "⊴": true, + "◂": true, + "⥊": true, + "⥦": true, + "≨︀": true, + "≨︀": true, + "∺": true, + "¯": true, + "¯": true, + "♂": true, + "✠": true, + "✠": true, + "↦": true, + "↦": true, + "↧": true, + "↤": true, + "↥": true, + "▮": true, + "⨩": true, + "м": true, + "—": true, + "∡": true, + "𝔪": true, + "℧": true, + "µ": true, + "µ": true, + "∣": true, + "*": true, + "⫰": true, + "·": true, + "·": true, + "−": true, + "⊟": true, + "∸": true, + "⨪": true, + "⫛": true, + "…": true, + "∓": true, + "⊧": true, + "𝕞": true, + "∓": true, + "𝓂": true, + "∾": true, + "μ": true, + "⊸": true, + "⊸": true, + "⋙̸": true, + "≫⃒": true, + "≫̸": true, + "⇍": true, + "⇎": true, + "⋘̸": true, + "≪⃒": true, + "≪̸": true, + "⇏": true, + "⊯": true, + "⊮": true, + "∇": true, + "ń": true, + "∠⃒": true, + "≉": true, + "⩰̸": true, + "≋̸": true, + "ʼn": true, + "≉": true, + "♮": true, + "♮": true, + "ℕ": true, + " ": true, + " ": true, + "≎̸": true, + "≏̸": true, + "⩃": true, + "ň": true, + "ņ": true, + "≇": true, + "⩭̸": true, + "⩂": true, + "н": true, + "–": true, + "≠": true, + "⇗": true, + "⤤": true, + "↗": true, + "↗": true, + "≐̸": true, + "≢": true, + "⤨": true, + "≂̸": true, + "∄": true, + "∄": true, + "𝔫": true, + "≧̸": true, + "≱": true, + "≱": true, + "≧̸": true, + "⩾̸": true, + "⩾̸": true, + "≵": true, + "≯": true, + "≯": true, + "⇎": true, + "↮": true, + "⫲": true, + "∋": true, + "⋼": true, + "⋺": true, + "∋": true, + "њ": true, + "⇍": true, + "≦̸": true, + "↚": true, + "‥": true, + "≰": true, + "↚": true, + "↮": true, + "≰": true, + "≦̸": true, + "⩽̸": true, + "⩽̸": true, + "≮": true, + "≴": true, + "≮": true, + "⋪": true, + "⋬": true, + "∤": true, + "𝕟": true, + "¬": true, + "¬": true, + "∉": true, + "⋹̸": true, + "⋵̸": true, + "∉": true, + "⋷": true, + "⋶": true, + "∌": true, + "∌": true, + "⋾": true, + "⋽": true, + "∦": true, + "∦": true, + "⫽⃥": true, + "∂̸": true, + "⨔": true, + "⊀": true, + "⋠": true, + "⪯̸": true, + "⊀": true, + "⪯̸": true, + "⇏": true, + "↛": true, + "⤳̸": true, + "↝̸": true, + "↛": true, + "⋫": true, + "⋭": true, + "⊁": true, + "⋡": true, + "⪰̸": true, + "𝓃": true, + "∤": true, + "∦": true, + "≁": true, + "≄": true, + "≄": true, + "∤": true, + "∦": true, + "⋢": true, + "⋣": true, + "⊄": true, + "⫅̸": true, + "⊈": true, + "⊂⃒": true, + "⊈": true, + "⫅̸": true, + "⊁": true, + "⪰̸": true, + "⊅": true, + "⫆̸": true, + "⊉": true, + "⊃⃒": true, + "⊉": true, + "⫆̸": true, + "≹": true, + "ñ": true, + "ñ": true, + "≸": true, + "⋪": true, + "⋬": true, + "⋫": true, + "⋭": true, + "ν": true, + "#": true, + "№": true, + " ": true, + "⊭": true, + "⤄": true, + "≍⃒": true, + "⊬": true, + "≥⃒": true, + ">⃒": true, + "⧞": true, + "⤂": true, + "≤⃒": true, + "<⃒": true, + "⊴⃒": true, + "⤃": true, + "⊵⃒": true, + "∼⃒": true, + "⇖": true, + "⤣": true, + "↖": true, + "↖": true, + "⤧": true, + "Ⓢ": true, + "ó": true, + "ó": true, + "⊛": true, + "⊚": true, + "ô": true, + "ô": true, + "о": true, + "⊝": true, + "ő": true, + "⨸": true, + "⊙": true, + "⦼": true, + "œ": true, + "⦿": true, + "𝔬": true, + "˛": true, + "ò": true, + "ò": true, + "⧁": true, + "⦵": true, + "Ω": true, + "∮": true, + "↺": true, + "⦾": true, + "⦻": true, + "‾": true, + "⧀": true, + "ō": true, + "ω": true, + "ο": true, + "⦶": true, + "⊖": true, + "𝕠": true, + "⦷": true, + "⦹": true, + "⊕": true, + "∨": true, + "↻": true, + "⩝": true, + "ℴ": true, + "ℴ": true, + "ª": true, + "ª": true, + "º": true, + "º": true, + "⊶": true, + "⩖": true, + "⩗": true, + "⩛": true, + "ℴ": true, + "ø": true, + "ø": true, + "⊘": true, + "õ": true, + "õ": true, + "⊗": true, + "⨶": true, + "ö": true, + "ö": true, + "⌽": true, + "∥": true, + "¶": true, + "¶": true, + "∥": true, + "⫳": true, + "⫽": true, + "∂": true, + "п": true, + "%": true, + ".": true, + "‰": true, + "⊥": true, + "‱": true, + "𝔭": true, + "φ": true, + "ϕ": true, + "ℳ": true, + "☎": true, + "π": true, + "⋔": true, + "ϖ": true, + "ℏ": true, + "ℎ": true, + "ℏ": true, + "+": true, + "⨣": true, + "⊞": true, + "⨢": true, + "∔": true, + "⨥": true, + "⩲": true, + "±": true, + "±": true, + "⨦": true, + "⨧": true, + "±": true, + "⨕": true, + "𝕡": true, + "£": true, + "£": true, + "≺": true, + "⪳": true, + "⪷": true, + "≼": true, + "⪯": true, + "≺": true, + "⪷": true, + "≼": true, + "⪯": true, + "⪹": true, + "⪵": true, + "⋨": true, + "≾": true, + "′": true, + "ℙ": true, + "⪵": true, + "⪹": true, + "⋨": true, + "∏": true, + "⌮": true, + "⌒": true, + "⌓": true, + "∝": true, + "∝": true, + "≾": true, + "⊰": true, + "𝓅": true, + "ψ": true, + " ": true, + "𝔮": true, + "⨌": true, + "𝕢": true, + "⁗": true, + "𝓆": true, + "ℍ": true, + "⨖": true, + "?": true, + "≟": true, + """: true, + """: true, + "⇛": true, + "⇒": true, + "⤜": true, + "⤏": true, + "⥤": true, + "∽̱": true, + "ŕ": true, + "√": true, + "⦳": true, + "⟩": true, + "⦒": true, + "⦥": true, + "⟩": true, + "»": true, + "»": true, + "→": true, + "⥵": true, + "⇥": true, + "⤠": true, + "⤳": true, + "⤞": true, + "↪": true, + "↬": true, + "⥅": true, + "⥴": true, + "↣": true, + "↝": true, + "⤚": true, + "∶": true, + "ℚ": true, + "⤍": true, + "❳": true, + "}": true, + "]": true, + "⦌": true, + "⦎": true, + "⦐": true, + "ř": true, + "ŗ": true, + "⌉": true, + "}": true, + "р": true, + "⤷": true, + "⥩": true, + "”": true, + "”": true, + "↳": true, + "ℜ": true, + "ℛ": true, + "ℜ": true, + "ℝ": true, + "▭": true, + "®": true, + "®": true, + "⥽": true, + "⌋": true, + "𝔯": true, + "⇁": true, + "⇀": true, + "⥬": true, + "ρ": true, + "ϱ": true, + "→": true, + "↣": true, + "⇁": true, + "⇀": true, + "⇄": true, + "⇌": true, + "⇉": true, + "↝": true, + "⋌": true, + "˚": true, + "≓": true, + "⇄": true, + "⇌": true, + "‏": true, + "⎱": true, + "⎱": true, + "⫮": true, + "⟭": true, + "⇾": true, + "⟧": true, + "⦆": true, + "𝕣": true, + "⨮": true, + "⨵": true, + ")": true, + "⦔": true, + "⨒": true, + "⇉": true, + "›": true, + "𝓇": true, + "↱": true, + "]": true, + "’": true, + "’": true, + "⋌": true, + "⋊": true, + "▹": true, + "⊵": true, + "▸": true, + "⧎": true, + "⥨": true, + "℞": true, + "ś": true, + "‚": true, + "≻": true, + "⪴": true, + "⪸": true, + "š": true, + "≽": true, + "⪰": true, + "ş": true, + "ŝ": true, + "⪶": true, + "⪺": true, + "⋩": true, + "⨓": true, + "≿": true, + "с": true, + "⋅": true, + "⊡": true, + "⩦": true, + "⇘": true, + "⤥": true, + "↘": true, + "↘": true, + "§": true, + "§": true, + ";": true, + "⤩": true, + "∖": true, + "∖": true, + "✶": true, + "𝔰": true, + "⌢": true, + "♯": true, + "щ": true, + "ш": true, + "∣": true, + "∥": true, + "­": true, + "­": true, + "σ": true, + "ς": true, + "ς": true, + "∼": true, + "⩪": true, + "≃": true, + "≃": true, + "⪞": true, + "⪠": true, + "⪝": true, + "⪟": true, + "≆": true, + "⨤": true, + "⥲": true, + "←": true, + "∖": true, + "⨳": true, + "⧤": true, + "∣": true, + "⌣": true, + "⪪": true, + "⪬": true, + "⪬︀": true, + "ь": true, + "/": true, + "⧄": true, + "⌿": true, + "𝕤": true, + "♠": true, + "♠": true, + "∥": true, + "⊓": true, + "⊓︀": true, + "⊔": true, + "⊔︀": true, + "⊏": true, + "⊑": true, + "⊏": true, + "⊑": true, + "⊐": true, + "⊒": true, + "⊐": true, + "⊒": true, + "□": true, + "□": true, + "▪": true, + "▪": true, + "→": true, + "𝓈": true, + "∖": true, + "⌣": true, + "⋆": true, + "☆": true, + "★": true, + "ϵ": true, + "ϕ": true, + "¯": true, + "⊂": true, + "⫅": true, + "⪽": true, + "⊆": true, + "⫃": true, + "⫁": true, + "⫋": true, + "⊊": true, + "⪿": true, + "⥹": true, + "⊂": true, + "⊆": true, + "⫅": true, + "⊊": true, + "⫋": true, + "⫇": true, + "⫕": true, + "⫓": true, + "≻": true, + "⪸": true, + "≽": true, + "⪰": true, + "⪺": true, + "⪶": true, + "⋩": true, + "≿": true, + "∑": true, + "♪": true, + "¹": true, + "¹": true, + "²": true, + "²": true, + "³": true, + "³": true, + "⊃": true, + "⫆": true, + "⪾": true, + "⫘": true, + "⊇": true, + "⫄": true, + "⟉": true, + "⫗": true, + "⥻": true, + "⫂": true, + "⫌": true, + "⊋": true, + "⫀": true, + "⊃": true, + "⊇": true, + "⫆": true, + "⊋": true, + "⫌": true, + "⫈": true, + "⫔": true, + "⫖": true, + "⇙": true, + "⤦": true, + "↙": true, + "↙": true, + "⤪": true, + "ß": true, + "ß": true, + "⌖": true, + "τ": true, + "⎴": true, + "ť": true, + "ţ": true, + "т": true, + "⃛": true, + "⌕": true, + "𝔱": true, + "∴": true, + "∴": true, + "θ": true, + "ϑ": true, + "ϑ": true, + "≈": true, + "∼": true, + " ": true, + "≈": true, + "∼": true, + "þ": true, + "þ": true, + "˜": true, + "×": true, + "×": true, + "⊠": true, + "⨱": true, + "⨰": true, + "∭": true, + "⤨": true, + "⊤": true, + "⌶": true, + "⫱": true, + "𝕥": true, + "⫚": true, + "⤩": true, + "‴": true, + "™": true, + "▵": true, + "▿": true, + "◃": true, + "⊴": true, + "≜": true, + "▹": true, + "⊵": true, + "◬": true, + "≜": true, + "⨺": true, + "⨹": true, + "⧍": true, + "⨻": true, + "⏢": true, + "𝓉": true, + "ц": true, + "ћ": true, + "ŧ": true, + "≬": true, + "↞": true, + "↠": true, + "⇑": true, + "⥣": true, + "ú": true, + "ú": true, + "↑": true, + "ў": true, + "ŭ": true, + "û": true, + "û": true, + "у": true, + "⇅": true, + "ű": true, + "⥮": true, + "⥾": true, + "𝔲": true, + "ù": true, + "ù": true, + "↿": true, + "↾": true, + "▀": true, + "⌜": true, + "⌜": true, + "⌏": true, + "◸": true, + "ū": true, + "¨": true, + "¨": true, + "ų": true, + "𝕦": true, + "↑": true, + "↕": true, + "↿": true, + "↾": true, + "⊎": true, + "υ": true, + "ϒ": true, + "υ": true, + "⇈": true, + "⌝": true, + "⌝": true, + "⌎": true, + "ů": true, + "◹": true, + "𝓊": true, + "⋰": true, + "ũ": true, + "▵": true, + "▴": true, + "⇈": true, + "ü": true, + "ü": true, + "⦧": true, + "⇕": true, + "⫨": true, + "⫩": true, + "⊨": true, + "⦜": true, + "ϵ": true, + "ϰ": true, + "∅": true, + "ϕ": true, + "ϖ": true, + "∝": true, + "↕": true, + "ϱ": true, + "ς": true, + "⊊︀": true, + "⫋︀": true, + "⊋︀": true, + "⫌︀": true, + "ϑ": true, + "⊲": true, + "⊳": true, + "в": true, + "⊢": true, + "∨": true, + "⊻": true, + "≚": true, + "⋮": true, + "|": true, + "|": true, + "𝔳": true, + "⊲": true, + "⊂⃒": true, + "⊃⃒": true, + "𝕧": true, + "∝": true, + "⊳": true, + "𝓋": true, + "⫋︀": true, + "⊊︀": true, + "⫌︀": true, + "⊋︀": true, + "⦚": true, + "ŵ": true, + "⩟": true, + "∧": true, + "≙": true, + "℘": true, + "𝔴": true, + "𝕨": true, + "℘": true, + "≀": true, + "≀": true, + "𝓌": true, + "⋂": true, + "◯": true, + "⋃": true, + "▽": true, + "𝔵": true, + "⟺": true, + "⟷": true, + "ξ": true, + "⟸": true, + "⟵": true, + "⟼": true, + "⋻": true, + "⨀": true, + "𝕩": true, + "⨁": true, + "⨂": true, + "⟹": true, + "⟶": true, + "𝓍": true, + "⨆": true, + "⨄": true, + "△": true, + "⋁": true, + "⋀": true, + "ý": true, + "ý": true, + "я": true, + "ŷ": true, + "ы": true, + "¥": true, + "¥": true, + "𝔶": true, + "ї": true, + "𝕪": true, + "𝓎": true, + "ю": true, + "ÿ": true, + "ÿ": true, + "ź": true, + "ž": true, + "з": true, + "ż": true, + "ℨ": true, + "ζ": true, + "𝔷": true, + "ж": true, + "⇝": true, + "𝕫": true, + "𝓏": true, + "‍": true, + "‌": true, +} diff --git a/vendor/github.com/russross/blackfriday/v2/esc.go b/vendor/github.com/russross/blackfriday/v2/esc.go new file mode 100644 index 0000000..6ab6010 --- /dev/null +++ b/vendor/github.com/russross/blackfriday/v2/esc.go @@ -0,0 +1,70 @@ +package blackfriday + +import ( + "html" + "io" +) + +var htmlEscaper = [256][]byte{ + '&': []byte("&"), + '<': []byte("<"), + '>': []byte(">"), + '"': []byte("""), +} + +func escapeHTML(w io.Writer, s []byte) { + escapeEntities(w, s, false) +} + +func escapeAllHTML(w io.Writer, s []byte) { + escapeEntities(w, s, true) +} + +func escapeEntities(w io.Writer, s []byte, escapeValidEntities bool) { + var start, end int + for end < len(s) { + escSeq := htmlEscaper[s[end]] + if escSeq != nil { + isEntity, entityEnd := nodeIsEntity(s, end) + if isEntity && !escapeValidEntities { + w.Write(s[start : entityEnd+1]) + start = entityEnd + 1 + } else { + w.Write(s[start:end]) + w.Write(escSeq) + start = end + 1 + } + } + end++ + } + if start < len(s) && end <= len(s) { + w.Write(s[start:end]) + } +} + +func nodeIsEntity(s []byte, end int) (isEntity bool, endEntityPos int) { + isEntity = false + endEntityPos = end + 1 + + if s[end] == '&' { + for endEntityPos < len(s) { + if s[endEntityPos] == ';' { + if entities[string(s[end:endEntityPos+1])] { + isEntity = true + break + } + } + if !isalnum(s[endEntityPos]) && s[endEntityPos] != '&' && s[endEntityPos] != '#' { + break + } + endEntityPos++ + } + } + + return isEntity, endEntityPos +} + +func escLink(w io.Writer, text []byte) { + unesc := html.UnescapeString(string(text)) + escapeHTML(w, []byte(unesc)) +} diff --git a/vendor/github.com/russross/blackfriday/v2/html.go b/vendor/github.com/russross/blackfriday/v2/html.go new file mode 100644 index 0000000..cb4f26e --- /dev/null +++ b/vendor/github.com/russross/blackfriday/v2/html.go @@ -0,0 +1,952 @@ +// +// Blackfriday Markdown Processor +// Available at http://github.com/russross/blackfriday +// +// Copyright © 2011 Russ Ross . +// Distributed under the Simplified BSD License. +// See README.md for details. +// + +// +// +// HTML rendering backend +// +// + +package blackfriday + +import ( + "bytes" + "fmt" + "io" + "regexp" + "strings" +) + +// HTMLFlags control optional behavior of HTML renderer. +type HTMLFlags int + +// HTML renderer configuration options. +const ( + HTMLFlagsNone HTMLFlags = 0 + SkipHTML HTMLFlags = 1 << iota // Skip preformatted HTML blocks + SkipImages // Skip embedded images + SkipLinks // Skip all links + Safelink // Only link to trusted protocols + NofollowLinks // Only link with rel="nofollow" + NoreferrerLinks // Only link with rel="noreferrer" + NoopenerLinks // Only link with rel="noopener" + HrefTargetBlank // Add a blank target + CompletePage // Generate a complete HTML page + UseXHTML // Generate XHTML output instead of HTML + FootnoteReturnLinks // Generate a link at the end of a footnote to return to the source + Smartypants // Enable smart punctuation substitutions + SmartypantsFractions // Enable smart fractions (with Smartypants) + SmartypantsDashes // Enable smart dashes (with Smartypants) + SmartypantsLatexDashes // Enable LaTeX-style dashes (with Smartypants) + SmartypantsAngledQuotes // Enable angled double quotes (with Smartypants) for double quotes rendering + SmartypantsQuotesNBSP // Enable « French guillemets » (with Smartypants) + TOC // Generate a table of contents +) + +var ( + htmlTagRe = regexp.MustCompile("(?i)^" + htmlTag) +) + +const ( + htmlTag = "(?:" + openTag + "|" + closeTag + "|" + htmlComment + "|" + + processingInstruction + "|" + declaration + "|" + cdata + ")" + closeTag = "]" + openTag = "<" + tagName + attribute + "*" + "\\s*/?>" + attribute = "(?:" + "\\s+" + attributeName + attributeValueSpec + "?)" + attributeValue = "(?:" + unquotedValue + "|" + singleQuotedValue + "|" + doubleQuotedValue + ")" + attributeValueSpec = "(?:" + "\\s*=" + "\\s*" + attributeValue + ")" + attributeName = "[a-zA-Z_:][a-zA-Z0-9:._-]*" + cdata = "" + declaration = "]*>" + doubleQuotedValue = "\"[^\"]*\"" + htmlComment = "|" + processingInstruction = "[<][?].*?[?][>]" + singleQuotedValue = "'[^']*'" + tagName = "[A-Za-z][A-Za-z0-9-]*" + unquotedValue = "[^\"'=<>`\\x00-\\x20]+" +) + +// HTMLRendererParameters is a collection of supplementary parameters tweaking +// the behavior of various parts of HTML renderer. +type HTMLRendererParameters struct { + // Prepend this text to each relative URL. + AbsolutePrefix string + // Add this text to each footnote anchor, to ensure uniqueness. + FootnoteAnchorPrefix string + // Show this text inside the tag for a footnote return link, if the + // HTML_FOOTNOTE_RETURN_LINKS flag is enabled. If blank, the string + // [return] is used. + FootnoteReturnLinkContents string + // If set, add this text to the front of each Heading ID, to ensure + // uniqueness. + HeadingIDPrefix string + // If set, add this text to the back of each Heading ID, to ensure uniqueness. + HeadingIDSuffix string + // Increase heading levels: if the offset is 1,

becomes

etc. + // Negative offset is also valid. + // Resulting levels are clipped between 1 and 6. + HeadingLevelOffset int + + Title string // Document title (used if CompletePage is set) + CSS string // Optional CSS file URL (used if CompletePage is set) + Icon string // Optional icon file URL (used if CompletePage is set) + + Flags HTMLFlags // Flags allow customizing this renderer's behavior +} + +// HTMLRenderer is a type that implements the Renderer interface for HTML output. +// +// Do not create this directly, instead use the NewHTMLRenderer function. +type HTMLRenderer struct { + HTMLRendererParameters + + closeTag string // how to end singleton tags: either " />" or ">" + + // Track heading IDs to prevent ID collision in a single generation. + headingIDs map[string]int + + lastOutputLen int + disableTags int + + sr *SPRenderer +} + +const ( + xhtmlClose = " />" + htmlClose = ">" +) + +// NewHTMLRenderer creates and configures an HTMLRenderer object, which +// satisfies the Renderer interface. +func NewHTMLRenderer(params HTMLRendererParameters) *HTMLRenderer { + // configure the rendering engine + closeTag := htmlClose + if params.Flags&UseXHTML != 0 { + closeTag = xhtmlClose + } + + if params.FootnoteReturnLinkContents == "" { + // U+FE0E is VARIATION SELECTOR-15. + // It suppresses automatic emoji presentation of the preceding + // U+21A9 LEFTWARDS ARROW WITH HOOK on iOS and iPadOS. + params.FootnoteReturnLinkContents = "↩\ufe0e" + } + + return &HTMLRenderer{ + HTMLRendererParameters: params, + + closeTag: closeTag, + headingIDs: make(map[string]int), + + sr: NewSmartypantsRenderer(params.Flags), + } +} + +func isHTMLTag(tag []byte, tagname string) bool { + found, _ := findHTMLTagPos(tag, tagname) + return found +} + +// Look for a character, but ignore it when it's in any kind of quotes, it +// might be JavaScript +func skipUntilCharIgnoreQuotes(html []byte, start int, char byte) int { + inSingleQuote := false + inDoubleQuote := false + inGraveQuote := false + i := start + for i < len(html) { + switch { + case html[i] == char && !inSingleQuote && !inDoubleQuote && !inGraveQuote: + return i + case html[i] == '\'': + inSingleQuote = !inSingleQuote + case html[i] == '"': + inDoubleQuote = !inDoubleQuote + case html[i] == '`': + inGraveQuote = !inGraveQuote + } + i++ + } + return start +} + +func findHTMLTagPos(tag []byte, tagname string) (bool, int) { + i := 0 + if i < len(tag) && tag[0] != '<' { + return false, -1 + } + i++ + i = skipSpace(tag, i) + + if i < len(tag) && tag[i] == '/' { + i++ + } + + i = skipSpace(tag, i) + j := 0 + for ; i < len(tag); i, j = i+1, j+1 { + if j >= len(tagname) { + break + } + + if strings.ToLower(string(tag[i]))[0] != tagname[j] { + return false, -1 + } + } + + if i == len(tag) { + return false, -1 + } + + rightAngle := skipUntilCharIgnoreQuotes(tag, i, '>') + if rightAngle >= i { + return true, rightAngle + } + + return false, -1 +} + +func skipSpace(tag []byte, i int) int { + for i < len(tag) && isspace(tag[i]) { + i++ + } + return i +} + +func isRelativeLink(link []byte) (yes bool) { + // a tag begin with '#' + if link[0] == '#' { + return true + } + + // link begin with '/' but not '//', the second maybe a protocol relative link + if len(link) >= 2 && link[0] == '/' && link[1] != '/' { + return true + } + + // only the root '/' + if len(link) == 1 && link[0] == '/' { + return true + } + + // current directory : begin with "./" + if bytes.HasPrefix(link, []byte("./")) { + return true + } + + // parent directory : begin with "../" + if bytes.HasPrefix(link, []byte("../")) { + return true + } + + return false +} + +func (r *HTMLRenderer) ensureUniqueHeadingID(id string) string { + for count, found := r.headingIDs[id]; found; count, found = r.headingIDs[id] { + tmp := fmt.Sprintf("%s-%d", id, count+1) + + if _, tmpFound := r.headingIDs[tmp]; !tmpFound { + r.headingIDs[id] = count + 1 + id = tmp + } else { + id = id + "-1" + } + } + + if _, found := r.headingIDs[id]; !found { + r.headingIDs[id] = 0 + } + + return id +} + +func (r *HTMLRenderer) addAbsPrefix(link []byte) []byte { + if r.AbsolutePrefix != "" && isRelativeLink(link) && link[0] != '.' { + newDest := r.AbsolutePrefix + if link[0] != '/' { + newDest += "/" + } + newDest += string(link) + return []byte(newDest) + } + return link +} + +func appendLinkAttrs(attrs []string, flags HTMLFlags, link []byte) []string { + if isRelativeLink(link) { + return attrs + } + val := []string{} + if flags&NofollowLinks != 0 { + val = append(val, "nofollow") + } + if flags&NoreferrerLinks != 0 { + val = append(val, "noreferrer") + } + if flags&NoopenerLinks != 0 { + val = append(val, "noopener") + } + if flags&HrefTargetBlank != 0 { + attrs = append(attrs, "target=\"_blank\"") + } + if len(val) == 0 { + return attrs + } + attr := fmt.Sprintf("rel=%q", strings.Join(val, " ")) + return append(attrs, attr) +} + +func isMailto(link []byte) bool { + return bytes.HasPrefix(link, []byte("mailto:")) +} + +func needSkipLink(flags HTMLFlags, dest []byte) bool { + if flags&SkipLinks != 0 { + return true + } + return flags&Safelink != 0 && !isSafeLink(dest) && !isMailto(dest) +} + +func isSmartypantable(node *Node) bool { + pt := node.Parent.Type + return pt != Link && pt != CodeBlock && pt != Code +} + +func appendLanguageAttr(attrs []string, info []byte) []string { + if len(info) == 0 { + return attrs + } + endOfLang := bytes.IndexAny(info, "\t ") + if endOfLang < 0 { + endOfLang = len(info) + } + return append(attrs, fmt.Sprintf("class=\"language-%s\"", info[:endOfLang])) +} + +func (r *HTMLRenderer) tag(w io.Writer, name []byte, attrs []string) { + w.Write(name) + if len(attrs) > 0 { + w.Write(spaceBytes) + w.Write([]byte(strings.Join(attrs, " "))) + } + w.Write(gtBytes) + r.lastOutputLen = 1 +} + +func footnoteRef(prefix string, node *Node) []byte { + urlFrag := prefix + string(slugify(node.Destination)) + anchor := fmt.Sprintf(`%d`, urlFrag, node.NoteID) + return []byte(fmt.Sprintf(`%s`, urlFrag, anchor)) +} + +func footnoteItem(prefix string, slug []byte) []byte { + return []byte(fmt.Sprintf(`
  • `, prefix, slug)) +} + +func footnoteReturnLink(prefix, returnLink string, slug []byte) []byte { + const format = ` %s` + return []byte(fmt.Sprintf(format, prefix, slug, returnLink)) +} + +func itemOpenCR(node *Node) bool { + if node.Prev == nil { + return false + } + ld := node.Parent.ListData + return !ld.Tight && ld.ListFlags&ListTypeDefinition == 0 +} + +func skipParagraphTags(node *Node) bool { + grandparent := node.Parent.Parent + if grandparent == nil || grandparent.Type != List { + return false + } + tightOrTerm := grandparent.Tight || node.Parent.ListFlags&ListTypeTerm != 0 + return grandparent.Type == List && tightOrTerm +} + +func cellAlignment(align CellAlignFlags) string { + switch align { + case TableAlignmentLeft: + return "left" + case TableAlignmentRight: + return "right" + case TableAlignmentCenter: + return "center" + default: + return "" + } +} + +func (r *HTMLRenderer) out(w io.Writer, text []byte) { + if r.disableTags > 0 { + w.Write(htmlTagRe.ReplaceAll(text, []byte{})) + } else { + w.Write(text) + } + r.lastOutputLen = len(text) +} + +func (r *HTMLRenderer) cr(w io.Writer) { + if r.lastOutputLen > 0 { + r.out(w, nlBytes) + } +} + +var ( + nlBytes = []byte{'\n'} + gtBytes = []byte{'>'} + spaceBytes = []byte{' '} +) + +var ( + brTag = []byte("
    ") + brXHTMLTag = []byte("
    ") + emTag = []byte("") + emCloseTag = []byte("") + strongTag = []byte("") + strongCloseTag = []byte("") + delTag = []byte("") + delCloseTag = []byte("") + ttTag = []byte("") + ttCloseTag = []byte("") + aTag = []byte("") + preTag = []byte("
    ")
    +	preCloseTag        = []byte("
    ") + codeTag = []byte("") + codeCloseTag = []byte("") + pTag = []byte("

    ") + pCloseTag = []byte("

    ") + blockquoteTag = []byte("
    ") + blockquoteCloseTag = []byte("
    ") + hrTag = []byte("
    ") + hrXHTMLTag = []byte("
    ") + ulTag = []byte("
      ") + ulCloseTag = []byte("
    ") + olTag = []byte("
      ") + olCloseTag = []byte("
    ") + dlTag = []byte("
    ") + dlCloseTag = []byte("
    ") + liTag = []byte("
  • ") + liCloseTag = []byte("
  • ") + ddTag = []byte("
    ") + ddCloseTag = []byte("
    ") + dtTag = []byte("
    ") + dtCloseTag = []byte("
    ") + tableTag = []byte("") + tableCloseTag = []byte("
    ") + tdTag = []byte("") + thTag = []byte("") + theadTag = []byte("") + theadCloseTag = []byte("") + tbodyTag = []byte("") + tbodyCloseTag = []byte("") + trTag = []byte("") + trCloseTag = []byte("") + h1Tag = []byte("") + h2Tag = []byte("") + h3Tag = []byte("") + h4Tag = []byte("") + h5Tag = []byte("") + h6Tag = []byte("") + + footnotesDivBytes = []byte("\n
    \n\n") + footnotesCloseDivBytes = []byte("\n
    \n") +) + +func headingTagsFromLevel(level int) ([]byte, []byte) { + if level <= 1 { + return h1Tag, h1CloseTag + } + switch level { + case 2: + return h2Tag, h2CloseTag + case 3: + return h3Tag, h3CloseTag + case 4: + return h4Tag, h4CloseTag + case 5: + return h5Tag, h5CloseTag + } + return h6Tag, h6CloseTag +} + +func (r *HTMLRenderer) outHRTag(w io.Writer) { + if r.Flags&UseXHTML == 0 { + r.out(w, hrTag) + } else { + r.out(w, hrXHTMLTag) + } +} + +// RenderNode is a default renderer of a single node of a syntax tree. For +// block nodes it will be called twice: first time with entering=true, second +// time with entering=false, so that it could know when it's working on an open +// tag and when on close. It writes the result to w. +// +// The return value is a way to tell the calling walker to adjust its walk +// pattern: e.g. it can terminate the traversal by returning Terminate. Or it +// can ask the walker to skip a subtree of this node by returning SkipChildren. +// The typical behavior is to return GoToNext, which asks for the usual +// traversal to the next node. +func (r *HTMLRenderer) RenderNode(w io.Writer, node *Node, entering bool) WalkStatus { + attrs := []string{} + switch node.Type { + case Text: + if r.Flags&Smartypants != 0 { + var tmp bytes.Buffer + escapeHTML(&tmp, node.Literal) + r.sr.Process(w, tmp.Bytes()) + } else { + if node.Parent.Type == Link { + escLink(w, node.Literal) + } else { + escapeHTML(w, node.Literal) + } + } + case Softbreak: + r.cr(w) + // TODO: make it configurable via out(renderer.softbreak) + case Hardbreak: + if r.Flags&UseXHTML == 0 { + r.out(w, brTag) + } else { + r.out(w, brXHTMLTag) + } + r.cr(w) + case Emph: + if entering { + r.out(w, emTag) + } else { + r.out(w, emCloseTag) + } + case Strong: + if entering { + r.out(w, strongTag) + } else { + r.out(w, strongCloseTag) + } + case Del: + if entering { + r.out(w, delTag) + } else { + r.out(w, delCloseTag) + } + case HTMLSpan: + if r.Flags&SkipHTML != 0 { + break + } + r.out(w, node.Literal) + case Link: + // mark it but don't link it if it is not a safe link: no smartypants + dest := node.LinkData.Destination + if needSkipLink(r.Flags, dest) { + if entering { + r.out(w, ttTag) + } else { + r.out(w, ttCloseTag) + } + } else { + if entering { + dest = r.addAbsPrefix(dest) + var hrefBuf bytes.Buffer + hrefBuf.WriteString("href=\"") + escLink(&hrefBuf, dest) + hrefBuf.WriteByte('"') + attrs = append(attrs, hrefBuf.String()) + if node.NoteID != 0 { + r.out(w, footnoteRef(r.FootnoteAnchorPrefix, node)) + break + } + attrs = appendLinkAttrs(attrs, r.Flags, dest) + if len(node.LinkData.Title) > 0 { + var titleBuff bytes.Buffer + titleBuff.WriteString("title=\"") + escapeHTML(&titleBuff, node.LinkData.Title) + titleBuff.WriteByte('"') + attrs = append(attrs, titleBuff.String()) + } + r.tag(w, aTag, attrs) + } else { + if node.NoteID != 0 { + break + } + r.out(w, aCloseTag) + } + } + case Image: + if r.Flags&SkipImages != 0 { + return SkipChildren + } + if entering { + dest := node.LinkData.Destination + dest = r.addAbsPrefix(dest) + if r.disableTags == 0 { + //if options.safe && potentiallyUnsafe(dest) { + //out(w, ``)
+				//} else {
+				r.out(w, []byte(`<img src=`)) + } + } + case Code: + r.out(w, codeTag) + escapeAllHTML(w, node.Literal) + r.out(w, codeCloseTag) + case Document: + break + case Paragraph: + if skipParagraphTags(node) { + break + } + if entering { + // TODO: untangle this clusterfuck about when the newlines need + // to be added and when not. + if node.Prev != nil { + switch node.Prev.Type { + case HTMLBlock, List, Paragraph, Heading, CodeBlock, BlockQuote, HorizontalRule: + r.cr(w) + } + } + if node.Parent.Type == BlockQuote && node.Prev == nil { + r.cr(w) + } + r.out(w, pTag) + } else { + r.out(w, pCloseTag) + if !(node.Parent.Type == Item && node.Next == nil) { + r.cr(w) + } + } + case BlockQuote: + if entering { + r.cr(w) + r.out(w, blockquoteTag) + } else { + r.out(w, blockquoteCloseTag) + r.cr(w) + } + case HTMLBlock: + if r.Flags&SkipHTML != 0 { + break + } + r.cr(w) + r.out(w, node.Literal) + r.cr(w) + case Heading: + headingLevel := r.HTMLRendererParameters.HeadingLevelOffset + node.Level + openTag, closeTag := headingTagsFromLevel(headingLevel) + if entering { + if node.IsTitleblock { + attrs = append(attrs, `class="title"`) + } + if node.HeadingID != "" { + id := r.ensureUniqueHeadingID(node.HeadingID) + if r.HeadingIDPrefix != "" { + id = r.HeadingIDPrefix + id + } + if r.HeadingIDSuffix != "" { + id = id + r.HeadingIDSuffix + } + attrs = append(attrs, fmt.Sprintf(`id="%s"`, id)) + } + r.cr(w) + r.tag(w, openTag, attrs) + } else { + r.out(w, closeTag) + if !(node.Parent.Type == Item && node.Next == nil) { + r.cr(w) + } + } + case HorizontalRule: + r.cr(w) + r.outHRTag(w) + r.cr(w) + case List: + openTag := ulTag + closeTag := ulCloseTag + if node.ListFlags&ListTypeOrdered != 0 { + openTag = olTag + closeTag = olCloseTag + } + if node.ListFlags&ListTypeDefinition != 0 { + openTag = dlTag + closeTag = dlCloseTag + } + if entering { + if node.IsFootnotesList { + r.out(w, footnotesDivBytes) + r.outHRTag(w) + r.cr(w) + } + r.cr(w) + if node.Parent.Type == Item && node.Parent.Parent.Tight { + r.cr(w) + } + r.tag(w, openTag[:len(openTag)-1], attrs) + r.cr(w) + } else { + r.out(w, closeTag) + //cr(w) + //if node.parent.Type != Item { + // cr(w) + //} + if node.Parent.Type == Item && node.Next != nil { + r.cr(w) + } + if node.Parent.Type == Document || node.Parent.Type == BlockQuote { + r.cr(w) + } + if node.IsFootnotesList { + r.out(w, footnotesCloseDivBytes) + } + } + case Item: + openTag := liTag + closeTag := liCloseTag + if node.ListFlags&ListTypeDefinition != 0 { + openTag = ddTag + closeTag = ddCloseTag + } + if node.ListFlags&ListTypeTerm != 0 { + openTag = dtTag + closeTag = dtCloseTag + } + if entering { + if itemOpenCR(node) { + r.cr(w) + } + if node.ListData.RefLink != nil { + slug := slugify(node.ListData.RefLink) + r.out(w, footnoteItem(r.FootnoteAnchorPrefix, slug)) + break + } + r.out(w, openTag) + } else { + if node.ListData.RefLink != nil { + slug := slugify(node.ListData.RefLink) + if r.Flags&FootnoteReturnLinks != 0 { + r.out(w, footnoteReturnLink(r.FootnoteAnchorPrefix, r.FootnoteReturnLinkContents, slug)) + } + } + r.out(w, closeTag) + r.cr(w) + } + case CodeBlock: + attrs = appendLanguageAttr(attrs, node.Info) + r.cr(w) + r.out(w, preTag) + r.tag(w, codeTag[:len(codeTag)-1], attrs) + escapeAllHTML(w, node.Literal) + r.out(w, codeCloseTag) + r.out(w, preCloseTag) + if node.Parent.Type != Item { + r.cr(w) + } + case Table: + if entering { + r.cr(w) + r.out(w, tableTag) + } else { + r.out(w, tableCloseTag) + r.cr(w) + } + case TableCell: + openTag := tdTag + closeTag := tdCloseTag + if node.IsHeader { + openTag = thTag + closeTag = thCloseTag + } + if entering { + align := cellAlignment(node.Align) + if align != "" { + attrs = append(attrs, fmt.Sprintf(`align="%s"`, align)) + } + if node.Prev == nil { + r.cr(w) + } + r.tag(w, openTag, attrs) + } else { + r.out(w, closeTag) + r.cr(w) + } + case TableHead: + if entering { + r.cr(w) + r.out(w, theadTag) + } else { + r.out(w, theadCloseTag) + r.cr(w) + } + case TableBody: + if entering { + r.cr(w) + r.out(w, tbodyTag) + // XXX: this is to adhere to a rather silly test. Should fix test. + if node.FirstChild == nil { + r.cr(w) + } + } else { + r.out(w, tbodyCloseTag) + r.cr(w) + } + case TableRow: + if entering { + r.cr(w) + r.out(w, trTag) + } else { + r.out(w, trCloseTag) + r.cr(w) + } + default: + panic("Unknown node type " + node.Type.String()) + } + return GoToNext +} + +// RenderHeader writes HTML document preamble and TOC if requested. +func (r *HTMLRenderer) RenderHeader(w io.Writer, ast *Node) { + r.writeDocumentHeader(w) + if r.Flags&TOC != 0 { + r.writeTOC(w, ast) + } +} + +// RenderFooter writes HTML document footer. +func (r *HTMLRenderer) RenderFooter(w io.Writer, ast *Node) { + if r.Flags&CompletePage == 0 { + return + } + io.WriteString(w, "\n\n\n") +} + +func (r *HTMLRenderer) writeDocumentHeader(w io.Writer) { + if r.Flags&CompletePage == 0 { + return + } + ending := "" + if r.Flags&UseXHTML != 0 { + io.WriteString(w, "\n") + io.WriteString(w, "\n") + ending = " /" + } else { + io.WriteString(w, "\n") + io.WriteString(w, "\n") + } + io.WriteString(w, "\n") + io.WriteString(w, " ") + if r.Flags&Smartypants != 0 { + r.sr.Process(w, []byte(r.Title)) + } else { + escapeHTML(w, []byte(r.Title)) + } + io.WriteString(w, "\n") + io.WriteString(w, " \n") + io.WriteString(w, " \n") + if r.CSS != "" { + io.WriteString(w, " \n") + } + if r.Icon != "" { + io.WriteString(w, " \n") + } + io.WriteString(w, "\n") + io.WriteString(w, "\n\n") +} + +func (r *HTMLRenderer) writeTOC(w io.Writer, ast *Node) { + buf := bytes.Buffer{} + + inHeading := false + tocLevel := 0 + headingCount := 0 + + ast.Walk(func(node *Node, entering bool) WalkStatus { + if node.Type == Heading && !node.HeadingData.IsTitleblock { + inHeading = entering + if entering { + node.HeadingID = fmt.Sprintf("toc_%d", headingCount) + if node.Level == tocLevel { + buf.WriteString("\n\n
  • ") + } else if node.Level < tocLevel { + for node.Level < tocLevel { + tocLevel-- + buf.WriteString("
  • \n") + } + buf.WriteString("\n\n
  • ") + } else { + for node.Level > tocLevel { + tocLevel++ + buf.WriteString("\n") + } + + if buf.Len() > 0 { + io.WriteString(w, "\n") + } + r.lastOutputLen = buf.Len() +} diff --git a/vendor/github.com/russross/blackfriday/v2/inline.go b/vendor/github.com/russross/blackfriday/v2/inline.go new file mode 100644 index 0000000..d45bd94 --- /dev/null +++ b/vendor/github.com/russross/blackfriday/v2/inline.go @@ -0,0 +1,1228 @@ +// +// Blackfriday Markdown Processor +// Available at http://github.com/russross/blackfriday +// +// Copyright © 2011 Russ Ross . +// Distributed under the Simplified BSD License. +// See README.md for details. +// + +// +// Functions to parse inline elements. +// + +package blackfriday + +import ( + "bytes" + "regexp" + "strconv" +) + +var ( + urlRe = `((https?|ftp):\/\/|\/)[-A-Za-z0-9+&@#\/%?=~_|!:,.;\(\)]+` + anchorRe = regexp.MustCompile(`^(]+")?\s?>` + urlRe + `<\/a>)`) + + // https://www.w3.org/TR/html5/syntax.html#character-references + // highest unicode code point in 17 planes (2^20): 1,114,112d = + // 7 dec digits or 6 hex digits + // named entity references can be 2-31 characters with stuff like < + // at one end and ∳ at the other. There + // are also sometimes numbers at the end, although this isn't inherent + // in the specification; there are never numbers anywhere else in + // current character references, though; see ¾ and ▒, etc. + // https://www.w3.org/TR/html5/syntax.html#named-character-references + // + // entity := "&" (named group | number ref) ";" + // named group := [a-zA-Z]{2,31}[0-9]{0,2} + // number ref := "#" (dec ref | hex ref) + // dec ref := [0-9]{1,7} + // hex ref := ("x" | "X") [0-9a-fA-F]{1,6} + htmlEntityRe = regexp.MustCompile(`&([a-zA-Z]{2,31}[0-9]{0,2}|#([0-9]{1,7}|[xX][0-9a-fA-F]{1,6}));`) +) + +// Functions to parse text within a block +// Each function returns the number of chars taken care of +// data is the complete block being rendered +// offset is the number of valid chars before the current cursor + +func (p *Markdown) inline(currBlock *Node, data []byte) { + // handlers might call us recursively: enforce a maximum depth + if p.nesting >= p.maxNesting || len(data) == 0 { + return + } + p.nesting++ + beg, end := 0, 0 + for end < len(data) { + handler := p.inlineCallback[data[end]] + if handler != nil { + if consumed, node := handler(p, data, end); consumed == 0 { + // No action from the callback. + end++ + } else { + // Copy inactive chars into the output. + currBlock.AppendChild(text(data[beg:end])) + if node != nil { + currBlock.AppendChild(node) + } + // Skip past whatever the callback used. + beg = end + consumed + end = beg + } + } else { + end++ + } + } + if beg < len(data) { + if data[end-1] == '\n' { + end-- + } + currBlock.AppendChild(text(data[beg:end])) + } + p.nesting-- +} + +// single and double emphasis parsing +func emphasis(p *Markdown, data []byte, offset int) (int, *Node) { + data = data[offset:] + c := data[0] + + if len(data) > 2 && data[1] != c { + // whitespace cannot follow an opening emphasis; + // strikethrough only takes two characters '~~' + if c == '~' || isspace(data[1]) { + return 0, nil + } + ret, node := helperEmphasis(p, data[1:], c) + if ret == 0 { + return 0, nil + } + + return ret + 1, node + } + + if len(data) > 3 && data[1] == c && data[2] != c { + if isspace(data[2]) { + return 0, nil + } + ret, node := helperDoubleEmphasis(p, data[2:], c) + if ret == 0 { + return 0, nil + } + + return ret + 2, node + } + + if len(data) > 4 && data[1] == c && data[2] == c && data[3] != c { + if c == '~' || isspace(data[3]) { + return 0, nil + } + ret, node := helperTripleEmphasis(p, data, 3, c) + if ret == 0 { + return 0, nil + } + + return ret + 3, node + } + + return 0, nil +} + +func codeSpan(p *Markdown, data []byte, offset int) (int, *Node) { + data = data[offset:] + + nb := 0 + + // count the number of backticks in the delimiter + for nb < len(data) && data[nb] == '`' { + nb++ + } + + // find the next delimiter + i, end := 0, 0 + for end = nb; end < len(data) && i < nb; end++ { + if data[end] == '`' { + i++ + } else { + i = 0 + } + } + + // no matching delimiter? + if i < nb && end >= len(data) { + return 0, nil + } + + // trim outside whitespace + fBegin := nb + for fBegin < end && data[fBegin] == ' ' { + fBegin++ + } + + fEnd := end - nb + for fEnd > fBegin && data[fEnd-1] == ' ' { + fEnd-- + } + + // render the code span + if fBegin != fEnd { + code := NewNode(Code) + code.Literal = data[fBegin:fEnd] + return end, code + } + + return end, nil +} + +// newline preceded by two spaces becomes
    +func maybeLineBreak(p *Markdown, data []byte, offset int) (int, *Node) { + origOffset := offset + for offset < len(data) && data[offset] == ' ' { + offset++ + } + + if offset < len(data) && data[offset] == '\n' { + if offset-origOffset >= 2 { + return offset - origOffset + 1, NewNode(Hardbreak) + } + return offset - origOffset, nil + } + return 0, nil +} + +// newline without two spaces works when HardLineBreak is enabled +func lineBreak(p *Markdown, data []byte, offset int) (int, *Node) { + if p.extensions&HardLineBreak != 0 { + return 1, NewNode(Hardbreak) + } + return 0, nil +} + +type linkType int + +const ( + linkNormal linkType = iota + linkImg + linkDeferredFootnote + linkInlineFootnote +) + +func isReferenceStyleLink(data []byte, pos int, t linkType) bool { + if t == linkDeferredFootnote { + return false + } + return pos < len(data)-1 && data[pos] == '[' && data[pos+1] != '^' +} + +func maybeImage(p *Markdown, data []byte, offset int) (int, *Node) { + if offset < len(data)-1 && data[offset+1] == '[' { + return link(p, data, offset) + } + return 0, nil +} + +func maybeInlineFootnote(p *Markdown, data []byte, offset int) (int, *Node) { + if offset < len(data)-1 && data[offset+1] == '[' { + return link(p, data, offset) + } + return 0, nil +} + +// '[': parse a link or an image or a footnote +func link(p *Markdown, data []byte, offset int) (int, *Node) { + // no links allowed inside regular links, footnote, and deferred footnotes + if p.insideLink && (offset > 0 && data[offset-1] == '[' || len(data)-1 > offset && data[offset+1] == '^') { + return 0, nil + } + + var t linkType + switch { + // special case: ![^text] == deferred footnote (that follows something with + // an exclamation point) + case p.extensions&Footnotes != 0 && len(data)-1 > offset && data[offset+1] == '^': + t = linkDeferredFootnote + // ![alt] == image + case offset >= 0 && data[offset] == '!': + t = linkImg + offset++ + // ^[text] == inline footnote + // [^refId] == deferred footnote + case p.extensions&Footnotes != 0: + if offset >= 0 && data[offset] == '^' { + t = linkInlineFootnote + offset++ + } else if len(data)-1 > offset && data[offset+1] == '^' { + t = linkDeferredFootnote + } + // [text] == regular link + default: + t = linkNormal + } + + data = data[offset:] + + var ( + i = 1 + noteID int + title, link, altContent []byte + textHasNl = false + ) + + if t == linkDeferredFootnote { + i++ + } + + // look for the matching closing bracket + for level := 1; level > 0 && i < len(data); i++ { + switch { + case data[i] == '\n': + textHasNl = true + + case isBackslashEscaped(data, i): + continue + + case data[i] == '[': + level++ + + case data[i] == ']': + level-- + if level <= 0 { + i-- // compensate for extra i++ in for loop + } + } + } + + if i >= len(data) { + return 0, nil + } + + txtE := i + i++ + var footnoteNode *Node + + // skip any amount of whitespace or newline + // (this is much more lax than original markdown syntax) + for i < len(data) && isspace(data[i]) { + i++ + } + + // inline style link + switch { + case i < len(data) && data[i] == '(': + // skip initial whitespace + i++ + + for i < len(data) && isspace(data[i]) { + i++ + } + + linkB := i + + // look for link end: ' " ) + findlinkend: + for i < len(data) { + switch { + case data[i] == '\\': + i += 2 + + case data[i] == ')' || data[i] == '\'' || data[i] == '"': + break findlinkend + + default: + i++ + } + } + + if i >= len(data) { + return 0, nil + } + linkE := i + + // look for title end if present + titleB, titleE := 0, 0 + if data[i] == '\'' || data[i] == '"' { + i++ + titleB = i + + findtitleend: + for i < len(data) { + switch { + case data[i] == '\\': + i += 2 + + case data[i] == ')': + break findtitleend + + default: + i++ + } + } + + if i >= len(data) { + return 0, nil + } + + // skip whitespace after title + titleE = i - 1 + for titleE > titleB && isspace(data[titleE]) { + titleE-- + } + + // check for closing quote presence + if data[titleE] != '\'' && data[titleE] != '"' { + titleB, titleE = 0, 0 + linkE = i + } + } + + // remove whitespace at the end of the link + for linkE > linkB && isspace(data[linkE-1]) { + linkE-- + } + + // remove optional angle brackets around the link + if data[linkB] == '<' { + linkB++ + } + if data[linkE-1] == '>' { + linkE-- + } + + // build escaped link and title + if linkE > linkB { + link = data[linkB:linkE] + } + + if titleE > titleB { + title = data[titleB:titleE] + } + + i++ + + // reference style link + case isReferenceStyleLink(data, i, t): + var id []byte + altContentConsidered := false + + // look for the id + i++ + linkB := i + for i < len(data) && data[i] != ']' { + i++ + } + if i >= len(data) { + return 0, nil + } + linkE := i + + // find the reference + if linkB == linkE { + if textHasNl { + var b bytes.Buffer + + for j := 1; j < txtE; j++ { + switch { + case data[j] != '\n': + b.WriteByte(data[j]) + case data[j-1] != ' ': + b.WriteByte(' ') + } + } + + id = b.Bytes() + } else { + id = data[1:txtE] + altContentConsidered = true + } + } else { + id = data[linkB:linkE] + } + + // find the reference with matching id + lr, ok := p.getRef(string(id)) + if !ok { + return 0, nil + } + + // keep link and title from reference + link = lr.link + title = lr.title + if altContentConsidered { + altContent = lr.text + } + i++ + + // shortcut reference style link or reference or inline footnote + default: + var id []byte + + // craft the id + if textHasNl { + var b bytes.Buffer + + for j := 1; j < txtE; j++ { + switch { + case data[j] != '\n': + b.WriteByte(data[j]) + case data[j-1] != ' ': + b.WriteByte(' ') + } + } + + id = b.Bytes() + } else { + if t == linkDeferredFootnote { + id = data[2:txtE] // get rid of the ^ + } else { + id = data[1:txtE] + } + } + + footnoteNode = NewNode(Item) + if t == linkInlineFootnote { + // create a new reference + noteID = len(p.notes) + 1 + + var fragment []byte + if len(id) > 0 { + if len(id) < 16 { + fragment = make([]byte, len(id)) + } else { + fragment = make([]byte, 16) + } + copy(fragment, slugify(id)) + } else { + fragment = append([]byte("footnote-"), []byte(strconv.Itoa(noteID))...) + } + + ref := &reference{ + noteID: noteID, + hasBlock: false, + link: fragment, + title: id, + footnote: footnoteNode, + } + + p.notes = append(p.notes, ref) + + link = ref.link + title = ref.title + } else { + // find the reference with matching id + lr, ok := p.getRef(string(id)) + if !ok { + return 0, nil + } + + if t == linkDeferredFootnote { + lr.noteID = len(p.notes) + 1 + lr.footnote = footnoteNode + p.notes = append(p.notes, lr) + } + + // keep link and title from reference + link = lr.link + // if inline footnote, title == footnote contents + title = lr.title + noteID = lr.noteID + } + + // rewind the whitespace + i = txtE + 1 + } + + var uLink []byte + if t == linkNormal || t == linkImg { + if len(link) > 0 { + var uLinkBuf bytes.Buffer + unescapeText(&uLinkBuf, link) + uLink = uLinkBuf.Bytes() + } + + // links need something to click on and somewhere to go + if len(uLink) == 0 || (t == linkNormal && txtE <= 1) { + return 0, nil + } + } + + // call the relevant rendering function + var linkNode *Node + switch t { + case linkNormal: + linkNode = NewNode(Link) + linkNode.Destination = normalizeURI(uLink) + linkNode.Title = title + if len(altContent) > 0 { + linkNode.AppendChild(text(altContent)) + } else { + // links cannot contain other links, so turn off link parsing + // temporarily and recurse + insideLink := p.insideLink + p.insideLink = true + p.inline(linkNode, data[1:txtE]) + p.insideLink = insideLink + } + + case linkImg: + linkNode = NewNode(Image) + linkNode.Destination = uLink + linkNode.Title = title + linkNode.AppendChild(text(data[1:txtE])) + i++ + + case linkInlineFootnote, linkDeferredFootnote: + linkNode = NewNode(Link) + linkNode.Destination = link + linkNode.Title = title + linkNode.NoteID = noteID + linkNode.Footnote = footnoteNode + if t == linkInlineFootnote { + i++ + } + + default: + return 0, nil + } + + return i, linkNode +} + +func (p *Markdown) inlineHTMLComment(data []byte) int { + if len(data) < 5 { + return 0 + } + if data[0] != '<' || data[1] != '!' || data[2] != '-' || data[3] != '-' { + return 0 + } + i := 5 + // scan for an end-of-comment marker, across lines if necessary + for i < len(data) && !(data[i-2] == '-' && data[i-1] == '-' && data[i] == '>') { + i++ + } + // no end-of-comment marker + if i >= len(data) { + return 0 + } + return i + 1 +} + +func stripMailto(link []byte) []byte { + if bytes.HasPrefix(link, []byte("mailto://")) { + return link[9:] + } else if bytes.HasPrefix(link, []byte("mailto:")) { + return link[7:] + } else { + return link + } +} + +// autolinkType specifies a kind of autolink that gets detected. +type autolinkType int + +// These are the possible flag values for the autolink renderer. +const ( + notAutolink autolinkType = iota + normalAutolink + emailAutolink +) + +// '<' when tags or autolinks are allowed +func leftAngle(p *Markdown, data []byte, offset int) (int, *Node) { + data = data[offset:] + altype, end := tagLength(data) + if size := p.inlineHTMLComment(data); size > 0 { + end = size + } + if end > 2 { + if altype != notAutolink { + var uLink bytes.Buffer + unescapeText(&uLink, data[1:end+1-2]) + if uLink.Len() > 0 { + link := uLink.Bytes() + node := NewNode(Link) + node.Destination = link + if altype == emailAutolink { + node.Destination = append([]byte("mailto:"), link...) + } + node.AppendChild(text(stripMailto(link))) + return end, node + } + } else { + htmlTag := NewNode(HTMLSpan) + htmlTag.Literal = data[:end] + return end, htmlTag + } + } + + return end, nil +} + +// '\\' backslash escape +var escapeChars = []byte("\\`*_{}[]()#+-.!:|&<>~") + +func escape(p *Markdown, data []byte, offset int) (int, *Node) { + data = data[offset:] + + if len(data) > 1 { + if p.extensions&BackslashLineBreak != 0 && data[1] == '\n' { + return 2, NewNode(Hardbreak) + } + if bytes.IndexByte(escapeChars, data[1]) < 0 { + return 0, nil + } + + return 2, text(data[1:2]) + } + + return 2, nil +} + +func unescapeText(ob *bytes.Buffer, src []byte) { + i := 0 + for i < len(src) { + org := i + for i < len(src) && src[i] != '\\' { + i++ + } + + if i > org { + ob.Write(src[org:i]) + } + + if i+1 >= len(src) { + break + } + + ob.WriteByte(src[i+1]) + i += 2 + } +} + +// '&' escaped when it doesn't belong to an entity +// valid entities are assumed to be anything matching &#?[A-Za-z0-9]+; +func entity(p *Markdown, data []byte, offset int) (int, *Node) { + data = data[offset:] + + end := 1 + + if end < len(data) && data[end] == '#' { + end++ + } + + for end < len(data) && isalnum(data[end]) { + end++ + } + + if end < len(data) && data[end] == ';' { + end++ // real entity + } else { + return 0, nil // lone '&' + } + + ent := data[:end] + // undo & escaping or it will be converted to &amp; by another + // escaper in the renderer + if bytes.Equal(ent, []byte("&")) { + ent = []byte{'&'} + } + + return end, text(ent) +} + +func linkEndsWithEntity(data []byte, linkEnd int) bool { + entityRanges := htmlEntityRe.FindAllIndex(data[:linkEnd], -1) + return entityRanges != nil && entityRanges[len(entityRanges)-1][1] == linkEnd +} + +// hasPrefixCaseInsensitive is a custom implementation of +// strings.HasPrefix(strings.ToLower(s), prefix) +// we rolled our own because ToLower pulls in a huge machinery of lowercasing +// anything from Unicode and that's very slow. Since this func will only be +// used on ASCII protocol prefixes, we can take shortcuts. +func hasPrefixCaseInsensitive(s, prefix []byte) bool { + if len(s) < len(prefix) { + return false + } + delta := byte('a' - 'A') + for i, b := range prefix { + if b != s[i] && b != s[i]+delta { + return false + } + } + return true +} + +var protocolPrefixes = [][]byte{ + []byte("http://"), + []byte("https://"), + []byte("ftp://"), + []byte("file://"), + []byte("mailto:"), +} + +const shortestPrefix = 6 // len("ftp://"), the shortest of the above + +func maybeAutoLink(p *Markdown, data []byte, offset int) (int, *Node) { + // quick check to rule out most false hits + if p.insideLink || len(data) < offset+shortestPrefix { + return 0, nil + } + for _, prefix := range protocolPrefixes { + endOfHead := offset + 8 // 8 is the len() of the longest prefix + if endOfHead > len(data) { + endOfHead = len(data) + } + if hasPrefixCaseInsensitive(data[offset:endOfHead], prefix) { + return autoLink(p, data, offset) + } + } + return 0, nil +} + +func autoLink(p *Markdown, data []byte, offset int) (int, *Node) { + // Now a more expensive check to see if we're not inside an anchor element + anchorStart := offset + offsetFromAnchor := 0 + for anchorStart > 0 && data[anchorStart] != '<' { + anchorStart-- + offsetFromAnchor++ + } + + anchorStr := anchorRe.Find(data[anchorStart:]) + if anchorStr != nil { + anchorClose := NewNode(HTMLSpan) + anchorClose.Literal = anchorStr[offsetFromAnchor:] + return len(anchorStr) - offsetFromAnchor, anchorClose + } + + // scan backward for a word boundary + rewind := 0 + for offset-rewind > 0 && rewind <= 7 && isletter(data[offset-rewind-1]) { + rewind++ + } + if rewind > 6 { // longest supported protocol is "mailto" which has 6 letters + return 0, nil + } + + origData := data + data = data[offset-rewind:] + + if !isSafeLink(data) { + return 0, nil + } + + linkEnd := 0 + for linkEnd < len(data) && !isEndOfLink(data[linkEnd]) { + linkEnd++ + } + + // Skip punctuation at the end of the link + if (data[linkEnd-1] == '.' || data[linkEnd-1] == ',') && data[linkEnd-2] != '\\' { + linkEnd-- + } + + // But don't skip semicolon if it's a part of escaped entity: + if data[linkEnd-1] == ';' && data[linkEnd-2] != '\\' && !linkEndsWithEntity(data, linkEnd) { + linkEnd-- + } + + // See if the link finishes with a punctuation sign that can be closed. + var copen byte + switch data[linkEnd-1] { + case '"': + copen = '"' + case '\'': + copen = '\'' + case ')': + copen = '(' + case ']': + copen = '[' + case '}': + copen = '{' + default: + copen = 0 + } + + if copen != 0 { + bufEnd := offset - rewind + linkEnd - 2 + + openDelim := 1 + + /* Try to close the final punctuation sign in this same line; + * if we managed to close it outside of the URL, that means that it's + * not part of the URL. If it closes inside the URL, that means it + * is part of the URL. + * + * Examples: + * + * foo http://www.pokemon.com/Pikachu_(Electric) bar + * => http://www.pokemon.com/Pikachu_(Electric) + * + * foo (http://www.pokemon.com/Pikachu_(Electric)) bar + * => http://www.pokemon.com/Pikachu_(Electric) + * + * foo http://www.pokemon.com/Pikachu_(Electric)) bar + * => http://www.pokemon.com/Pikachu_(Electric)) + * + * (foo http://www.pokemon.com/Pikachu_(Electric)) bar + * => foo http://www.pokemon.com/Pikachu_(Electric) + */ + + for bufEnd >= 0 && origData[bufEnd] != '\n' && openDelim != 0 { + if origData[bufEnd] == data[linkEnd-1] { + openDelim++ + } + + if origData[bufEnd] == copen { + openDelim-- + } + + bufEnd-- + } + + if openDelim == 0 { + linkEnd-- + } + } + + var uLink bytes.Buffer + unescapeText(&uLink, data[:linkEnd]) + + if uLink.Len() > 0 { + node := NewNode(Link) + node.Destination = uLink.Bytes() + node.AppendChild(text(uLink.Bytes())) + return linkEnd, node + } + + return linkEnd, nil +} + +func isEndOfLink(char byte) bool { + return isspace(char) || char == '<' +} + +var validUris = [][]byte{[]byte("http://"), []byte("https://"), []byte("ftp://"), []byte("mailto://")} +var validPaths = [][]byte{[]byte("/"), []byte("./"), []byte("../")} + +func isSafeLink(link []byte) bool { + for _, path := range validPaths { + if len(link) >= len(path) && bytes.Equal(link[:len(path)], path) { + if len(link) == len(path) { + return true + } else if isalnum(link[len(path)]) { + return true + } + } + } + + for _, prefix := range validUris { + // TODO: handle unicode here + // case-insensitive prefix test + if len(link) > len(prefix) && bytes.Equal(bytes.ToLower(link[:len(prefix)]), prefix) && isalnum(link[len(prefix)]) { + return true + } + } + + return false +} + +// return the length of the given tag, or 0 is it's not valid +func tagLength(data []byte) (autolink autolinkType, end int) { + var i, j int + + // a valid tag can't be shorter than 3 chars + if len(data) < 3 { + return notAutolink, 0 + } + + // begins with a '<' optionally followed by '/', followed by letter or number + if data[0] != '<' { + return notAutolink, 0 + } + if data[1] == '/' { + i = 2 + } else { + i = 1 + } + + if !isalnum(data[i]) { + return notAutolink, 0 + } + + // scheme test + autolink = notAutolink + + // try to find the beginning of an URI + for i < len(data) && (isalnum(data[i]) || data[i] == '.' || data[i] == '+' || data[i] == '-') { + i++ + } + + if i > 1 && i < len(data) && data[i] == '@' { + if j = isMailtoAutoLink(data[i:]); j != 0 { + return emailAutolink, i + j + } + } + + if i > 2 && i < len(data) && data[i] == ':' { + autolink = normalAutolink + i++ + } + + // complete autolink test: no whitespace or ' or " + switch { + case i >= len(data): + autolink = notAutolink + case autolink != notAutolink: + j = i + + for i < len(data) { + if data[i] == '\\' { + i += 2 + } else if data[i] == '>' || data[i] == '\'' || data[i] == '"' || isspace(data[i]) { + break + } else { + i++ + } + + } + + if i >= len(data) { + return autolink, 0 + } + if i > j && data[i] == '>' { + return autolink, i + 1 + } + + // one of the forbidden chars has been found + autolink = notAutolink + } + i += bytes.IndexByte(data[i:], '>') + if i < 0 { + return autolink, 0 + } + return autolink, i + 1 +} + +// look for the address part of a mail autolink and '>' +// this is less strict than the original markdown e-mail address matching +func isMailtoAutoLink(data []byte) int { + nb := 0 + + // address is assumed to be: [-@._a-zA-Z0-9]+ with exactly one '@' + for i := 0; i < len(data); i++ { + if isalnum(data[i]) { + continue + } + + switch data[i] { + case '@': + nb++ + + case '-', '.', '_': + break + + case '>': + if nb == 1 { + return i + 1 + } + return 0 + default: + return 0 + } + } + + return 0 +} + +// look for the next emph char, skipping other constructs +func helperFindEmphChar(data []byte, c byte) int { + i := 0 + + for i < len(data) { + for i < len(data) && data[i] != c && data[i] != '`' && data[i] != '[' { + i++ + } + if i >= len(data) { + return 0 + } + // do not count escaped chars + if i != 0 && data[i-1] == '\\' { + i++ + continue + } + if data[i] == c { + return i + } + + if data[i] == '`' { + // skip a code span + tmpI := 0 + i++ + for i < len(data) && data[i] != '`' { + if tmpI == 0 && data[i] == c { + tmpI = i + } + i++ + } + if i >= len(data) { + return tmpI + } + i++ + } else if data[i] == '[' { + // skip a link + tmpI := 0 + i++ + for i < len(data) && data[i] != ']' { + if tmpI == 0 && data[i] == c { + tmpI = i + } + i++ + } + i++ + for i < len(data) && (data[i] == ' ' || data[i] == '\n') { + i++ + } + if i >= len(data) { + return tmpI + } + if data[i] != '[' && data[i] != '(' { // not a link + if tmpI > 0 { + return tmpI + } + continue + } + cc := data[i] + i++ + for i < len(data) && data[i] != cc { + if tmpI == 0 && data[i] == c { + return i + } + i++ + } + if i >= len(data) { + return tmpI + } + i++ + } + } + return 0 +} + +func helperEmphasis(p *Markdown, data []byte, c byte) (int, *Node) { + i := 0 + + // skip one symbol if coming from emph3 + if len(data) > 1 && data[0] == c && data[1] == c { + i = 1 + } + + for i < len(data) { + length := helperFindEmphChar(data[i:], c) + if length == 0 { + return 0, nil + } + i += length + if i >= len(data) { + return 0, nil + } + + if i+1 < len(data) && data[i+1] == c { + i++ + continue + } + + if data[i] == c && !isspace(data[i-1]) { + + if p.extensions&NoIntraEmphasis != 0 { + if !(i+1 == len(data) || isspace(data[i+1]) || ispunct(data[i+1])) { + continue + } + } + + emph := NewNode(Emph) + p.inline(emph, data[:i]) + return i + 1, emph + } + } + + return 0, nil +} + +func helperDoubleEmphasis(p *Markdown, data []byte, c byte) (int, *Node) { + i := 0 + + for i < len(data) { + length := helperFindEmphChar(data[i:], c) + if length == 0 { + return 0, nil + } + i += length + + if i+1 < len(data) && data[i] == c && data[i+1] == c && i > 0 && !isspace(data[i-1]) { + nodeType := Strong + if c == '~' { + nodeType = Del + } + node := NewNode(nodeType) + p.inline(node, data[:i]) + return i + 2, node + } + i++ + } + return 0, nil +} + +func helperTripleEmphasis(p *Markdown, data []byte, offset int, c byte) (int, *Node) { + i := 0 + origData := data + data = data[offset:] + + for i < len(data) { + length := helperFindEmphChar(data[i:], c) + if length == 0 { + return 0, nil + } + i += length + + // skip whitespace preceded symbols + if data[i] != c || isspace(data[i-1]) { + continue + } + + switch { + case i+2 < len(data) && data[i+1] == c && data[i+2] == c: + // triple symbol found + strong := NewNode(Strong) + em := NewNode(Emph) + strong.AppendChild(em) + p.inline(em, data[:i]) + return i + 3, strong + case (i+1 < len(data) && data[i+1] == c): + // double symbol found, hand over to emph1 + length, node := helperEmphasis(p, origData[offset-2:], c) + if length == 0 { + return 0, nil + } + return length - 2, node + default: + // single symbol found, hand over to emph2 + length, node := helperDoubleEmphasis(p, origData[offset-1:], c) + if length == 0 { + return 0, nil + } + return length - 1, node + } + } + return 0, nil +} + +func text(s []byte) *Node { + node := NewNode(Text) + node.Literal = s + return node +} + +func normalizeURI(s []byte) []byte { + return s // TODO: implement +} diff --git a/vendor/github.com/russross/blackfriday/v2/markdown.go b/vendor/github.com/russross/blackfriday/v2/markdown.go new file mode 100644 index 0000000..58d2e45 --- /dev/null +++ b/vendor/github.com/russross/blackfriday/v2/markdown.go @@ -0,0 +1,950 @@ +// Blackfriday Markdown Processor +// Available at http://github.com/russross/blackfriday +// +// Copyright © 2011 Russ Ross . +// Distributed under the Simplified BSD License. +// See README.md for details. + +package blackfriday + +import ( + "bytes" + "fmt" + "io" + "strings" + "unicode/utf8" +) + +// +// Markdown parsing and processing +// + +// Version string of the package. Appears in the rendered document when +// CompletePage flag is on. +const Version = "2.0" + +// Extensions is a bitwise or'ed collection of enabled Blackfriday's +// extensions. +type Extensions int + +// These are the supported markdown parsing extensions. +// OR these values together to select multiple extensions. +const ( + NoExtensions Extensions = 0 + NoIntraEmphasis Extensions = 1 << iota // Ignore emphasis markers inside words + Tables // Render tables + FencedCode // Render fenced code blocks + Autolink // Detect embedded URLs that are not explicitly marked + Strikethrough // Strikethrough text using ~~test~~ + LaxHTMLBlocks // Loosen up HTML block parsing rules + SpaceHeadings // Be strict about prefix heading rules + HardLineBreak // Translate newlines into line breaks + TabSizeEight // Expand tabs to eight spaces instead of four + Footnotes // Pandoc-style footnotes + NoEmptyLineBeforeBlock // No need to insert an empty line to start a (code, quote, ordered list, unordered list) block + HeadingIDs // specify heading IDs with {#id} + Titleblock // Titleblock ala pandoc + AutoHeadingIDs // Create the heading ID from the text + BackslashLineBreak // Translate trailing backslashes into line breaks + DefinitionLists // Render definition lists + + CommonHTMLFlags HTMLFlags = UseXHTML | Smartypants | + SmartypantsFractions | SmartypantsDashes | SmartypantsLatexDashes + + CommonExtensions Extensions = NoIntraEmphasis | Tables | FencedCode | + Autolink | Strikethrough | SpaceHeadings | HeadingIDs | + BackslashLineBreak | DefinitionLists +) + +// ListType contains bitwise or'ed flags for list and list item objects. +type ListType int + +// These are the possible flag values for the ListItem renderer. +// Multiple flag values may be ORed together. +// These are mostly of interest if you are writing a new output format. +const ( + ListTypeOrdered ListType = 1 << iota + ListTypeDefinition + ListTypeTerm + + ListItemContainsBlock + ListItemBeginningOfList // TODO: figure out if this is of any use now + ListItemEndOfList +) + +// CellAlignFlags holds a type of alignment in a table cell. +type CellAlignFlags int + +// These are the possible flag values for the table cell renderer. +// Only a single one of these values will be used; they are not ORed together. +// These are mostly of interest if you are writing a new output format. +const ( + TableAlignmentLeft CellAlignFlags = 1 << iota + TableAlignmentRight + TableAlignmentCenter = (TableAlignmentLeft | TableAlignmentRight) +) + +// The size of a tab stop. +const ( + TabSizeDefault = 4 + TabSizeDouble = 8 +) + +// blockTags is a set of tags that are recognized as HTML block tags. +// Any of these can be included in markdown text without special escaping. +var blockTags = map[string]struct{}{ + "blockquote": {}, + "del": {}, + "div": {}, + "dl": {}, + "fieldset": {}, + "form": {}, + "h1": {}, + "h2": {}, + "h3": {}, + "h4": {}, + "h5": {}, + "h6": {}, + "iframe": {}, + "ins": {}, + "math": {}, + "noscript": {}, + "ol": {}, + "pre": {}, + "p": {}, + "script": {}, + "style": {}, + "table": {}, + "ul": {}, + + // HTML5 + "address": {}, + "article": {}, + "aside": {}, + "canvas": {}, + "figcaption": {}, + "figure": {}, + "footer": {}, + "header": {}, + "hgroup": {}, + "main": {}, + "nav": {}, + "output": {}, + "progress": {}, + "section": {}, + "video": {}, +} + +// Renderer is the rendering interface. This is mostly of interest if you are +// implementing a new rendering format. +// +// Only an HTML implementation is provided in this repository, see the README +// for external implementations. +type Renderer interface { + // RenderNode is the main rendering method. It will be called once for + // every leaf node and twice for every non-leaf node (first with + // entering=true, then with entering=false). The method should write its + // rendition of the node to the supplied writer w. + RenderNode(w io.Writer, node *Node, entering bool) WalkStatus + + // RenderHeader is a method that allows the renderer to produce some + // content preceding the main body of the output document. The header is + // understood in the broad sense here. For example, the default HTML + // renderer will write not only the HTML document preamble, but also the + // table of contents if it was requested. + // + // The method will be passed an entire document tree, in case a particular + // implementation needs to inspect it to produce output. + // + // The output should be written to the supplied writer w. If your + // implementation has no header to write, supply an empty implementation. + RenderHeader(w io.Writer, ast *Node) + + // RenderFooter is a symmetric counterpart of RenderHeader. + RenderFooter(w io.Writer, ast *Node) +} + +// Callback functions for inline parsing. One such function is defined +// for each character that triggers a response when parsing inline data. +type inlineParser func(p *Markdown, data []byte, offset int) (int, *Node) + +// Markdown is a type that holds extensions and the runtime state used by +// Parse, and the renderer. You can not use it directly, construct it with New. +type Markdown struct { + renderer Renderer + referenceOverride ReferenceOverrideFunc + refs map[string]*reference + inlineCallback [256]inlineParser + extensions Extensions + nesting int + maxNesting int + insideLink bool + + // Footnotes need to be ordered as well as available to quickly check for + // presence. If a ref is also a footnote, it's stored both in refs and here + // in notes. Slice is nil if footnotes not enabled. + notes []*reference + + doc *Node + tip *Node // = doc + oldTip *Node + lastMatchedContainer *Node // = doc + allClosed bool +} + +func (p *Markdown) getRef(refid string) (ref *reference, found bool) { + if p.referenceOverride != nil { + r, overridden := p.referenceOverride(refid) + if overridden { + if r == nil { + return nil, false + } + return &reference{ + link: []byte(r.Link), + title: []byte(r.Title), + noteID: 0, + hasBlock: false, + text: []byte(r.Text)}, true + } + } + // refs are case insensitive + ref, found = p.refs[strings.ToLower(refid)] + return ref, found +} + +func (p *Markdown) finalize(block *Node) { + above := block.Parent + block.open = false + p.tip = above +} + +func (p *Markdown) addChild(node NodeType, offset uint32) *Node { + return p.addExistingChild(NewNode(node), offset) +} + +func (p *Markdown) addExistingChild(node *Node, offset uint32) *Node { + for !p.tip.canContain(node.Type) { + p.finalize(p.tip) + } + p.tip.AppendChild(node) + p.tip = node + return node +} + +func (p *Markdown) closeUnmatchedBlocks() { + if !p.allClosed { + for p.oldTip != p.lastMatchedContainer { + parent := p.oldTip.Parent + p.finalize(p.oldTip) + p.oldTip = parent + } + p.allClosed = true + } +} + +// +// +// Public interface +// +// + +// Reference represents the details of a link. +// See the documentation in Options for more details on use-case. +type Reference struct { + // Link is usually the URL the reference points to. + Link string + // Title is the alternate text describing the link in more detail. + Title string + // Text is the optional text to override the ref with if the syntax used was + // [refid][] + Text string +} + +// ReferenceOverrideFunc is expected to be called with a reference string and +// return either a valid Reference type that the reference string maps to or +// nil. If overridden is false, the default reference logic will be executed. +// See the documentation in Options for more details on use-case. +type ReferenceOverrideFunc func(reference string) (ref *Reference, overridden bool) + +// New constructs a Markdown processor. You can use the same With* functions as +// for Run() to customize parser's behavior and the renderer. +func New(opts ...Option) *Markdown { + var p Markdown + for _, opt := range opts { + opt(&p) + } + p.refs = make(map[string]*reference) + p.maxNesting = 16 + p.insideLink = false + docNode := NewNode(Document) + p.doc = docNode + p.tip = docNode + p.oldTip = docNode + p.lastMatchedContainer = docNode + p.allClosed = true + // register inline parsers + p.inlineCallback[' '] = maybeLineBreak + p.inlineCallback['*'] = emphasis + p.inlineCallback['_'] = emphasis + if p.extensions&Strikethrough != 0 { + p.inlineCallback['~'] = emphasis + } + p.inlineCallback['`'] = codeSpan + p.inlineCallback['\n'] = lineBreak + p.inlineCallback['['] = link + p.inlineCallback['<'] = leftAngle + p.inlineCallback['\\'] = escape + p.inlineCallback['&'] = entity + p.inlineCallback['!'] = maybeImage + p.inlineCallback['^'] = maybeInlineFootnote + if p.extensions&Autolink != 0 { + p.inlineCallback['h'] = maybeAutoLink + p.inlineCallback['m'] = maybeAutoLink + p.inlineCallback['f'] = maybeAutoLink + p.inlineCallback['H'] = maybeAutoLink + p.inlineCallback['M'] = maybeAutoLink + p.inlineCallback['F'] = maybeAutoLink + } + if p.extensions&Footnotes != 0 { + p.notes = make([]*reference, 0) + } + return &p +} + +// Option customizes the Markdown processor's default behavior. +type Option func(*Markdown) + +// WithRenderer allows you to override the default renderer. +func WithRenderer(r Renderer) Option { + return func(p *Markdown) { + p.renderer = r + } +} + +// WithExtensions allows you to pick some of the many extensions provided by +// Blackfriday. You can bitwise OR them. +func WithExtensions(e Extensions) Option { + return func(p *Markdown) { + p.extensions = e + } +} + +// WithNoExtensions turns off all extensions and custom behavior. +func WithNoExtensions() Option { + return func(p *Markdown) { + p.extensions = NoExtensions + p.renderer = NewHTMLRenderer(HTMLRendererParameters{ + Flags: HTMLFlagsNone, + }) + } +} + +// WithRefOverride sets an optional function callback that is called every +// time a reference is resolved. +// +// In Markdown, the link reference syntax can be made to resolve a link to +// a reference instead of an inline URL, in one of the following ways: +// +// * [link text][refid] +// * [refid][] +// +// Usually, the refid is defined at the bottom of the Markdown document. If +// this override function is provided, the refid is passed to the override +// function first, before consulting the defined refids at the bottom. If +// the override function indicates an override did not occur, the refids at +// the bottom will be used to fill in the link details. +func WithRefOverride(o ReferenceOverrideFunc) Option { + return func(p *Markdown) { + p.referenceOverride = o + } +} + +// Run is the main entry point to Blackfriday. It parses and renders a +// block of markdown-encoded text. +// +// The simplest invocation of Run takes one argument, input: +// output := Run(input) +// This will parse the input with CommonExtensions enabled and render it with +// the default HTMLRenderer (with CommonHTMLFlags). +// +// Variadic arguments opts can customize the default behavior. Since Markdown +// type does not contain exported fields, you can not use it directly. Instead, +// use the With* functions. For example, this will call the most basic +// functionality, with no extensions: +// output := Run(input, WithNoExtensions()) +// +// You can use any number of With* arguments, even contradicting ones. They +// will be applied in order of appearance and the latter will override the +// former: +// output := Run(input, WithNoExtensions(), WithExtensions(exts), +// WithRenderer(yourRenderer)) +func Run(input []byte, opts ...Option) []byte { + r := NewHTMLRenderer(HTMLRendererParameters{ + Flags: CommonHTMLFlags, + }) + optList := []Option{WithRenderer(r), WithExtensions(CommonExtensions)} + optList = append(optList, opts...) + parser := New(optList...) + ast := parser.Parse(input) + var buf bytes.Buffer + parser.renderer.RenderHeader(&buf, ast) + ast.Walk(func(node *Node, entering bool) WalkStatus { + return parser.renderer.RenderNode(&buf, node, entering) + }) + parser.renderer.RenderFooter(&buf, ast) + return buf.Bytes() +} + +// Parse is an entry point to the parsing part of Blackfriday. It takes an +// input markdown document and produces a syntax tree for its contents. This +// tree can then be rendered with a default or custom renderer, or +// analyzed/transformed by the caller to whatever non-standard needs they have. +// The return value is the root node of the syntax tree. +func (p *Markdown) Parse(input []byte) *Node { + p.block(input) + // Walk the tree and finish up some of unfinished blocks + for p.tip != nil { + p.finalize(p.tip) + } + // Walk the tree again and process inline markdown in each block + p.doc.Walk(func(node *Node, entering bool) WalkStatus { + if node.Type == Paragraph || node.Type == Heading || node.Type == TableCell { + p.inline(node, node.content) + node.content = nil + } + return GoToNext + }) + p.parseRefsToAST() + return p.doc +} + +func (p *Markdown) parseRefsToAST() { + if p.extensions&Footnotes == 0 || len(p.notes) == 0 { + return + } + p.tip = p.doc + block := p.addBlock(List, nil) + block.IsFootnotesList = true + block.ListFlags = ListTypeOrdered + flags := ListItemBeginningOfList + // Note: this loop is intentionally explicit, not range-form. This is + // because the body of the loop will append nested footnotes to p.notes and + // we need to process those late additions. Range form would only walk over + // the fixed initial set. + for i := 0; i < len(p.notes); i++ { + ref := p.notes[i] + p.addExistingChild(ref.footnote, 0) + block := ref.footnote + block.ListFlags = flags | ListTypeOrdered + block.RefLink = ref.link + if ref.hasBlock { + flags |= ListItemContainsBlock + p.block(ref.title) + } else { + p.inline(block, ref.title) + } + flags &^= ListItemBeginningOfList | ListItemContainsBlock + } + above := block.Parent + finalizeList(block) + p.tip = above + block.Walk(func(node *Node, entering bool) WalkStatus { + if node.Type == Paragraph || node.Type == Heading { + p.inline(node, node.content) + node.content = nil + } + return GoToNext + }) +} + +// +// Link references +// +// This section implements support for references that (usually) appear +// as footnotes in a document, and can be referenced anywhere in the document. +// The basic format is: +// +// [1]: http://www.google.com/ "Google" +// [2]: http://www.github.com/ "Github" +// +// Anywhere in the document, the reference can be linked by referring to its +// label, i.e., 1 and 2 in this example, as in: +// +// This library is hosted on [Github][2], a git hosting site. +// +// Actual footnotes as specified in Pandoc and supported by some other Markdown +// libraries such as php-markdown are also taken care of. They look like this: +// +// This sentence needs a bit of further explanation.[^note] +// +// [^note]: This is the explanation. +// +// Footnotes should be placed at the end of the document in an ordered list. +// Finally, there are inline footnotes such as: +// +// Inline footnotes^[Also supported.] provide a quick inline explanation, +// but are rendered at the bottom of the document. +// + +// reference holds all information necessary for a reference-style links or +// footnotes. +// +// Consider this markdown with reference-style links: +// +// [link][ref] +// +// [ref]: /url/ "tooltip title" +// +// It will be ultimately converted to this HTML: +// +//

    link

    +// +// And a reference structure will be populated as follows: +// +// p.refs["ref"] = &reference{ +// link: "/url/", +// title: "tooltip title", +// } +// +// Alternatively, reference can contain information about a footnote. Consider +// this markdown: +// +// Text needing a footnote.[^a] +// +// [^a]: This is the note +// +// A reference structure will be populated as follows: +// +// p.refs["a"] = &reference{ +// link: "a", +// title: "This is the note", +// noteID: , +// } +// +// TODO: As you can see, it begs for splitting into two dedicated structures +// for refs and for footnotes. +type reference struct { + link []byte + title []byte + noteID int // 0 if not a footnote ref + hasBlock bool + footnote *Node // a link to the Item node within a list of footnotes + + text []byte // only gets populated by refOverride feature with Reference.Text +} + +func (r *reference) String() string { + return fmt.Sprintf("{link: %q, title: %q, text: %q, noteID: %d, hasBlock: %v}", + r.link, r.title, r.text, r.noteID, r.hasBlock) +} + +// Check whether or not data starts with a reference link. +// If so, it is parsed and stored in the list of references +// (in the render struct). +// Returns the number of bytes to skip to move past it, +// or zero if the first line is not a reference. +func isReference(p *Markdown, data []byte, tabSize int) int { + // up to 3 optional leading spaces + if len(data) < 4 { + return 0 + } + i := 0 + for i < 3 && data[i] == ' ' { + i++ + } + + noteID := 0 + + // id part: anything but a newline between brackets + if data[i] != '[' { + return 0 + } + i++ + if p.extensions&Footnotes != 0 { + if i < len(data) && data[i] == '^' { + // we can set it to anything here because the proper noteIds will + // be assigned later during the second pass. It just has to be != 0 + noteID = 1 + i++ + } + } + idOffset := i + for i < len(data) && data[i] != '\n' && data[i] != '\r' && data[i] != ']' { + i++ + } + if i >= len(data) || data[i] != ']' { + return 0 + } + idEnd := i + // footnotes can have empty ID, like this: [^], but a reference can not be + // empty like this: []. Break early if it's not a footnote and there's no ID + if noteID == 0 && idOffset == idEnd { + return 0 + } + // spacer: colon (space | tab)* newline? (space | tab)* + i++ + if i >= len(data) || data[i] != ':' { + return 0 + } + i++ + for i < len(data) && (data[i] == ' ' || data[i] == '\t') { + i++ + } + if i < len(data) && (data[i] == '\n' || data[i] == '\r') { + i++ + if i < len(data) && data[i] == '\n' && data[i-1] == '\r' { + i++ + } + } + for i < len(data) && (data[i] == ' ' || data[i] == '\t') { + i++ + } + if i >= len(data) { + return 0 + } + + var ( + linkOffset, linkEnd int + titleOffset, titleEnd int + lineEnd int + raw []byte + hasBlock bool + ) + + if p.extensions&Footnotes != 0 && noteID != 0 { + linkOffset, linkEnd, raw, hasBlock = scanFootnote(p, data, i, tabSize) + lineEnd = linkEnd + } else { + linkOffset, linkEnd, titleOffset, titleEnd, lineEnd = scanLinkRef(p, data, i) + } + if lineEnd == 0 { + return 0 + } + + // a valid ref has been found + + ref := &reference{ + noteID: noteID, + hasBlock: hasBlock, + } + + if noteID > 0 { + // reusing the link field for the id since footnotes don't have links + ref.link = data[idOffset:idEnd] + // if footnote, it's not really a title, it's the contained text + ref.title = raw + } else { + ref.link = data[linkOffset:linkEnd] + ref.title = data[titleOffset:titleEnd] + } + + // id matches are case-insensitive + id := string(bytes.ToLower(data[idOffset:idEnd])) + + p.refs[id] = ref + + return lineEnd +} + +func scanLinkRef(p *Markdown, data []byte, i int) (linkOffset, linkEnd, titleOffset, titleEnd, lineEnd int) { + // link: whitespace-free sequence, optionally between angle brackets + if data[i] == '<' { + i++ + } + linkOffset = i + for i < len(data) && data[i] != ' ' && data[i] != '\t' && data[i] != '\n' && data[i] != '\r' { + i++ + } + linkEnd = i + if data[linkOffset] == '<' && data[linkEnd-1] == '>' { + linkOffset++ + linkEnd-- + } + + // optional spacer: (space | tab)* (newline | '\'' | '"' | '(' ) + for i < len(data) && (data[i] == ' ' || data[i] == '\t') { + i++ + } + if i < len(data) && data[i] != '\n' && data[i] != '\r' && data[i] != '\'' && data[i] != '"' && data[i] != '(' { + return + } + + // compute end-of-line + if i >= len(data) || data[i] == '\r' || data[i] == '\n' { + lineEnd = i + } + if i+1 < len(data) && data[i] == '\r' && data[i+1] == '\n' { + lineEnd++ + } + + // optional (space|tab)* spacer after a newline + if lineEnd > 0 { + i = lineEnd + 1 + for i < len(data) && (data[i] == ' ' || data[i] == '\t') { + i++ + } + } + + // optional title: any non-newline sequence enclosed in '"() alone on its line + if i+1 < len(data) && (data[i] == '\'' || data[i] == '"' || data[i] == '(') { + i++ + titleOffset = i + + // look for EOL + for i < len(data) && data[i] != '\n' && data[i] != '\r' { + i++ + } + if i+1 < len(data) && data[i] == '\n' && data[i+1] == '\r' { + titleEnd = i + 1 + } else { + titleEnd = i + } + + // step back + i-- + for i > titleOffset && (data[i] == ' ' || data[i] == '\t') { + i-- + } + if i > titleOffset && (data[i] == '\'' || data[i] == '"' || data[i] == ')') { + lineEnd = titleEnd + titleEnd = i + } + } + + return +} + +// The first bit of this logic is the same as Parser.listItem, but the rest +// is much simpler. This function simply finds the entire block and shifts it +// over by one tab if it is indeed a block (just returns the line if it's not). +// blockEnd is the end of the section in the input buffer, and contents is the +// extracted text that was shifted over one tab. It will need to be rendered at +// the end of the document. +func scanFootnote(p *Markdown, data []byte, i, indentSize int) (blockStart, blockEnd int, contents []byte, hasBlock bool) { + if i == 0 || len(data) == 0 { + return + } + + // skip leading whitespace on first line + for i < len(data) && data[i] == ' ' { + i++ + } + + blockStart = i + + // find the end of the line + blockEnd = i + for i < len(data) && data[i-1] != '\n' { + i++ + } + + // get working buffer + var raw bytes.Buffer + + // put the first line into the working buffer + raw.Write(data[blockEnd:i]) + blockEnd = i + + // process the following lines + containsBlankLine := false + +gatherLines: + for blockEnd < len(data) { + i++ + + // find the end of this line + for i < len(data) && data[i-1] != '\n' { + i++ + } + + // if it is an empty line, guess that it is part of this item + // and move on to the next line + if p.isEmpty(data[blockEnd:i]) > 0 { + containsBlankLine = true + blockEnd = i + continue + } + + n := 0 + if n = isIndented(data[blockEnd:i], indentSize); n == 0 { + // this is the end of the block. + // we don't want to include this last line in the index. + break gatherLines + } + + // if there were blank lines before this one, insert a new one now + if containsBlankLine { + raw.WriteByte('\n') + containsBlankLine = false + } + + // get rid of that first tab, write to buffer + raw.Write(data[blockEnd+n : i]) + hasBlock = true + + blockEnd = i + } + + if data[blockEnd-1] != '\n' { + raw.WriteByte('\n') + } + + contents = raw.Bytes() + + return +} + +// +// +// Miscellaneous helper functions +// +// + +// Test if a character is a punctuation symbol. +// Taken from a private function in regexp in the stdlib. +func ispunct(c byte) bool { + for _, r := range []byte("!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~") { + if c == r { + return true + } + } + return false +} + +// Test if a character is a whitespace character. +func isspace(c byte) bool { + return ishorizontalspace(c) || isverticalspace(c) +} + +// Test if a character is a horizontal whitespace character. +func ishorizontalspace(c byte) bool { + return c == ' ' || c == '\t' +} + +// Test if a character is a vertical character. +func isverticalspace(c byte) bool { + return c == '\n' || c == '\r' || c == '\f' || c == '\v' +} + +// Test if a character is letter. +func isletter(c byte) bool { + return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') +} + +// Test if a character is a letter or a digit. +// TODO: check when this is looking for ASCII alnum and when it should use unicode +func isalnum(c byte) bool { + return (c >= '0' && c <= '9') || isletter(c) +} + +// Replace tab characters with spaces, aligning to the next TAB_SIZE column. +// always ends output with a newline +func expandTabs(out *bytes.Buffer, line []byte, tabSize int) { + // first, check for common cases: no tabs, or only tabs at beginning of line + i, prefix := 0, 0 + slowcase := false + for i = 0; i < len(line); i++ { + if line[i] == '\t' { + if prefix == i { + prefix++ + } else { + slowcase = true + break + } + } + } + + // no need to decode runes if all tabs are at the beginning of the line + if !slowcase { + for i = 0; i < prefix*tabSize; i++ { + out.WriteByte(' ') + } + out.Write(line[prefix:]) + return + } + + // the slow case: we need to count runes to figure out how + // many spaces to insert for each tab + column := 0 + i = 0 + for i < len(line) { + start := i + for i < len(line) && line[i] != '\t' { + _, size := utf8.DecodeRune(line[i:]) + i += size + column++ + } + + if i > start { + out.Write(line[start:i]) + } + + if i >= len(line) { + break + } + + for { + out.WriteByte(' ') + column++ + if column%tabSize == 0 { + break + } + } + + i++ + } +} + +// Find if a line counts as indented or not. +// Returns number of characters the indent is (0 = not indented). +func isIndented(data []byte, indentSize int) int { + if len(data) == 0 { + return 0 + } + if data[0] == '\t' { + return 1 + } + if len(data) < indentSize { + return 0 + } + for i := 0; i < indentSize; i++ { + if data[i] != ' ' { + return 0 + } + } + return indentSize +} + +// Create a url-safe slug for fragments +func slugify(in []byte) []byte { + if len(in) == 0 { + return in + } + out := make([]byte, 0, len(in)) + sym := false + + for _, ch := range in { + if isalnum(ch) { + sym = false + out = append(out, ch) + } else if sym { + continue + } else { + out = append(out, '-') + sym = true + } + } + var a, b int + var ch byte + for a, ch = range out { + if ch != '-' { + break + } + } + for b = len(out) - 1; b > 0; b-- { + if out[b] != '-' { + break + } + } + return out[a : b+1] +} diff --git a/vendor/github.com/russross/blackfriday/v2/node.go b/vendor/github.com/russross/blackfriday/v2/node.go new file mode 100644 index 0000000..04e6050 --- /dev/null +++ b/vendor/github.com/russross/blackfriday/v2/node.go @@ -0,0 +1,360 @@ +package blackfriday + +import ( + "bytes" + "fmt" +) + +// NodeType specifies a type of a single node of a syntax tree. Usually one +// node (and its type) corresponds to a single markdown feature, e.g. emphasis +// or code block. +type NodeType int + +// Constants for identifying different types of nodes. See NodeType. +const ( + Document NodeType = iota + BlockQuote + List + Item + Paragraph + Heading + HorizontalRule + Emph + Strong + Del + Link + Image + Text + HTMLBlock + CodeBlock + Softbreak + Hardbreak + Code + HTMLSpan + Table + TableCell + TableHead + TableBody + TableRow +) + +var nodeTypeNames = []string{ + Document: "Document", + BlockQuote: "BlockQuote", + List: "List", + Item: "Item", + Paragraph: "Paragraph", + Heading: "Heading", + HorizontalRule: "HorizontalRule", + Emph: "Emph", + Strong: "Strong", + Del: "Del", + Link: "Link", + Image: "Image", + Text: "Text", + HTMLBlock: "HTMLBlock", + CodeBlock: "CodeBlock", + Softbreak: "Softbreak", + Hardbreak: "Hardbreak", + Code: "Code", + HTMLSpan: "HTMLSpan", + Table: "Table", + TableCell: "TableCell", + TableHead: "TableHead", + TableBody: "TableBody", + TableRow: "TableRow", +} + +func (t NodeType) String() string { + return nodeTypeNames[t] +} + +// ListData contains fields relevant to a List and Item node type. +type ListData struct { + ListFlags ListType + Tight bool // Skip

    s around list item data if true + BulletChar byte // '*', '+' or '-' in bullet lists + Delimiter byte // '.' or ')' after the number in ordered lists + RefLink []byte // If not nil, turns this list item into a footnote item and triggers different rendering + IsFootnotesList bool // This is a list of footnotes +} + +// LinkData contains fields relevant to a Link node type. +type LinkData struct { + Destination []byte // Destination is what goes into a href + Title []byte // Title is the tooltip thing that goes in a title attribute + NoteID int // NoteID contains a serial number of a footnote, zero if it's not a footnote + Footnote *Node // If it's a footnote, this is a direct link to the footnote Node. Otherwise nil. +} + +// CodeBlockData contains fields relevant to a CodeBlock node type. +type CodeBlockData struct { + IsFenced bool // Specifies whether it's a fenced code block or an indented one + Info []byte // This holds the info string + FenceChar byte + FenceLength int + FenceOffset int +} + +// TableCellData contains fields relevant to a TableCell node type. +type TableCellData struct { + IsHeader bool // This tells if it's under the header row + Align CellAlignFlags // This holds the value for align attribute +} + +// HeadingData contains fields relevant to a Heading node type. +type HeadingData struct { + Level int // This holds the heading level number + HeadingID string // This might hold heading ID, if present + IsTitleblock bool // Specifies whether it's a title block +} + +// Node is a single element in the abstract syntax tree of the parsed document. +// It holds connections to the structurally neighboring nodes and, for certain +// types of nodes, additional information that might be needed when rendering. +type Node struct { + Type NodeType // Determines the type of the node + Parent *Node // Points to the parent + FirstChild *Node // Points to the first child, if any + LastChild *Node // Points to the last child, if any + Prev *Node // Previous sibling; nil if it's the first child + Next *Node // Next sibling; nil if it's the last child + + Literal []byte // Text contents of the leaf nodes + + HeadingData // Populated if Type is Heading + ListData // Populated if Type is List + CodeBlockData // Populated if Type is CodeBlock + LinkData // Populated if Type is Link + TableCellData // Populated if Type is TableCell + + content []byte // Markdown content of the block nodes + open bool // Specifies an open block node that has not been finished to process yet +} + +// NewNode allocates a node of a specified type. +func NewNode(typ NodeType) *Node { + return &Node{ + Type: typ, + open: true, + } +} + +func (n *Node) String() string { + ellipsis := "" + snippet := n.Literal + if len(snippet) > 16 { + snippet = snippet[:16] + ellipsis = "..." + } + return fmt.Sprintf("%s: '%s%s'", n.Type, snippet, ellipsis) +} + +// Unlink removes node 'n' from the tree. +// It panics if the node is nil. +func (n *Node) Unlink() { + if n.Prev != nil { + n.Prev.Next = n.Next + } else if n.Parent != nil { + n.Parent.FirstChild = n.Next + } + if n.Next != nil { + n.Next.Prev = n.Prev + } else if n.Parent != nil { + n.Parent.LastChild = n.Prev + } + n.Parent = nil + n.Next = nil + n.Prev = nil +} + +// AppendChild adds a node 'child' as a child of 'n'. +// It panics if either node is nil. +func (n *Node) AppendChild(child *Node) { + child.Unlink() + child.Parent = n + if n.LastChild != nil { + n.LastChild.Next = child + child.Prev = n.LastChild + n.LastChild = child + } else { + n.FirstChild = child + n.LastChild = child + } +} + +// InsertBefore inserts 'sibling' immediately before 'n'. +// It panics if either node is nil. +func (n *Node) InsertBefore(sibling *Node) { + sibling.Unlink() + sibling.Prev = n.Prev + if sibling.Prev != nil { + sibling.Prev.Next = sibling + } + sibling.Next = n + n.Prev = sibling + sibling.Parent = n.Parent + if sibling.Prev == nil { + sibling.Parent.FirstChild = sibling + } +} + +// IsContainer returns true if 'n' can contain children. +func (n *Node) IsContainer() bool { + switch n.Type { + case Document: + fallthrough + case BlockQuote: + fallthrough + case List: + fallthrough + case Item: + fallthrough + case Paragraph: + fallthrough + case Heading: + fallthrough + case Emph: + fallthrough + case Strong: + fallthrough + case Del: + fallthrough + case Link: + fallthrough + case Image: + fallthrough + case Table: + fallthrough + case TableHead: + fallthrough + case TableBody: + fallthrough + case TableRow: + fallthrough + case TableCell: + return true + default: + return false + } +} + +// IsLeaf returns true if 'n' is a leaf node. +func (n *Node) IsLeaf() bool { + return !n.IsContainer() +} + +func (n *Node) canContain(t NodeType) bool { + if n.Type == List { + return t == Item + } + if n.Type == Document || n.Type == BlockQuote || n.Type == Item { + return t != Item + } + if n.Type == Table { + return t == TableHead || t == TableBody + } + if n.Type == TableHead || n.Type == TableBody { + return t == TableRow + } + if n.Type == TableRow { + return t == TableCell + } + return false +} + +// WalkStatus allows NodeVisitor to have some control over the tree traversal. +// It is returned from NodeVisitor and different values allow Node.Walk to +// decide which node to go to next. +type WalkStatus int + +const ( + // GoToNext is the default traversal of every node. + GoToNext WalkStatus = iota + // SkipChildren tells walker to skip all children of current node. + SkipChildren + // Terminate tells walker to terminate the traversal. + Terminate +) + +// NodeVisitor is a callback to be called when traversing the syntax tree. +// Called twice for every node: once with entering=true when the branch is +// first visited, then with entering=false after all the children are done. +type NodeVisitor func(node *Node, entering bool) WalkStatus + +// Walk is a convenience method that instantiates a walker and starts a +// traversal of subtree rooted at n. +func (n *Node) Walk(visitor NodeVisitor) { + w := newNodeWalker(n) + for w.current != nil { + status := visitor(w.current, w.entering) + switch status { + case GoToNext: + w.next() + case SkipChildren: + w.entering = false + w.next() + case Terminate: + return + } + } +} + +type nodeWalker struct { + current *Node + root *Node + entering bool +} + +func newNodeWalker(root *Node) *nodeWalker { + return &nodeWalker{ + current: root, + root: root, + entering: true, + } +} + +func (nw *nodeWalker) next() { + if (!nw.current.IsContainer() || !nw.entering) && nw.current == nw.root { + nw.current = nil + return + } + if nw.entering && nw.current.IsContainer() { + if nw.current.FirstChild != nil { + nw.current = nw.current.FirstChild + nw.entering = true + } else { + nw.entering = false + } + } else if nw.current.Next == nil { + nw.current = nw.current.Parent + nw.entering = false + } else { + nw.current = nw.current.Next + nw.entering = true + } +} + +func dump(ast *Node) { + fmt.Println(dumpString(ast)) +} + +func dumpR(ast *Node, depth int) string { + if ast == nil { + return "" + } + indent := bytes.Repeat([]byte("\t"), depth) + content := ast.Literal + if content == nil { + content = ast.content + } + result := fmt.Sprintf("%s%s(%q)\n", indent, ast.Type, content) + for n := ast.FirstChild; n != nil; n = n.Next { + result += dumpR(n, depth+1) + } + return result +} + +func dumpString(ast *Node) string { + return dumpR(ast, 0) +} diff --git a/vendor/github.com/russross/blackfriday/v2/smartypants.go b/vendor/github.com/russross/blackfriday/v2/smartypants.go new file mode 100644 index 0000000..3a220e9 --- /dev/null +++ b/vendor/github.com/russross/blackfriday/v2/smartypants.go @@ -0,0 +1,457 @@ +// +// Blackfriday Markdown Processor +// Available at http://github.com/russross/blackfriday +// +// Copyright © 2011 Russ Ross . +// Distributed under the Simplified BSD License. +// See README.md for details. +// + +// +// +// SmartyPants rendering +// +// + +package blackfriday + +import ( + "bytes" + "io" +) + +// SPRenderer is a struct containing state of a Smartypants renderer. +type SPRenderer struct { + inSingleQuote bool + inDoubleQuote bool + callbacks [256]smartCallback +} + +func wordBoundary(c byte) bool { + return c == 0 || isspace(c) || ispunct(c) +} + +func tolower(c byte) byte { + if c >= 'A' && c <= 'Z' { + return c - 'A' + 'a' + } + return c +} + +func isdigit(c byte) bool { + return c >= '0' && c <= '9' +} + +func smartQuoteHelper(out *bytes.Buffer, previousChar byte, nextChar byte, quote byte, isOpen *bool, addNBSP bool) bool { + // edge of the buffer is likely to be a tag that we don't get to see, + // so we treat it like text sometimes + + // enumerate all sixteen possibilities for (previousChar, nextChar) + // each can be one of {0, space, punct, other} + switch { + case previousChar == 0 && nextChar == 0: + // context is not any help here, so toggle + *isOpen = !*isOpen + case isspace(previousChar) && nextChar == 0: + // [ "] might be [ "foo...] + *isOpen = true + case ispunct(previousChar) && nextChar == 0: + // [!"] hmm... could be [Run!"] or [("...] + *isOpen = false + case /* isnormal(previousChar) && */ nextChar == 0: + // [a"] is probably a close + *isOpen = false + case previousChar == 0 && isspace(nextChar): + // [" ] might be [...foo" ] + *isOpen = false + case isspace(previousChar) && isspace(nextChar): + // [ " ] context is not any help here, so toggle + *isOpen = !*isOpen + case ispunct(previousChar) && isspace(nextChar): + // [!" ] is probably a close + *isOpen = false + case /* isnormal(previousChar) && */ isspace(nextChar): + // [a" ] this is one of the easy cases + *isOpen = false + case previousChar == 0 && ispunct(nextChar): + // ["!] hmm... could be ["$1.95] or ["!...] + *isOpen = false + case isspace(previousChar) && ispunct(nextChar): + // [ "!] looks more like [ "$1.95] + *isOpen = true + case ispunct(previousChar) && ispunct(nextChar): + // [!"!] context is not any help here, so toggle + *isOpen = !*isOpen + case /* isnormal(previousChar) && */ ispunct(nextChar): + // [a"!] is probably a close + *isOpen = false + case previousChar == 0 /* && isnormal(nextChar) */ : + // ["a] is probably an open + *isOpen = true + case isspace(previousChar) /* && isnormal(nextChar) */ : + // [ "a] this is one of the easy cases + *isOpen = true + case ispunct(previousChar) /* && isnormal(nextChar) */ : + // [!"a] is probably an open + *isOpen = true + default: + // [a'b] maybe a contraction? + *isOpen = false + } + + // Note that with the limited lookahead, this non-breaking + // space will also be appended to single double quotes. + if addNBSP && !*isOpen { + out.WriteString(" ") + } + + out.WriteByte('&') + if *isOpen { + out.WriteByte('l') + } else { + out.WriteByte('r') + } + out.WriteByte(quote) + out.WriteString("quo;") + + if addNBSP && *isOpen { + out.WriteString(" ") + } + + return true +} + +func (r *SPRenderer) smartSingleQuote(out *bytes.Buffer, previousChar byte, text []byte) int { + if len(text) >= 2 { + t1 := tolower(text[1]) + + if t1 == '\'' { + nextChar := byte(0) + if len(text) >= 3 { + nextChar = text[2] + } + if smartQuoteHelper(out, previousChar, nextChar, 'd', &r.inDoubleQuote, false) { + return 1 + } + } + + if (t1 == 's' || t1 == 't' || t1 == 'm' || t1 == 'd') && (len(text) < 3 || wordBoundary(text[2])) { + out.WriteString("’") + return 0 + } + + if len(text) >= 3 { + t2 := tolower(text[2]) + + if ((t1 == 'r' && t2 == 'e') || (t1 == 'l' && t2 == 'l') || (t1 == 'v' && t2 == 'e')) && + (len(text) < 4 || wordBoundary(text[3])) { + out.WriteString("’") + return 0 + } + } + } + + nextChar := byte(0) + if len(text) > 1 { + nextChar = text[1] + } + if smartQuoteHelper(out, previousChar, nextChar, 's', &r.inSingleQuote, false) { + return 0 + } + + out.WriteByte(text[0]) + return 0 +} + +func (r *SPRenderer) smartParens(out *bytes.Buffer, previousChar byte, text []byte) int { + if len(text) >= 3 { + t1 := tolower(text[1]) + t2 := tolower(text[2]) + + if t1 == 'c' && t2 == ')' { + out.WriteString("©") + return 2 + } + + if t1 == 'r' && t2 == ')' { + out.WriteString("®") + return 2 + } + + if len(text) >= 4 && t1 == 't' && t2 == 'm' && text[3] == ')' { + out.WriteString("™") + return 3 + } + } + + out.WriteByte(text[0]) + return 0 +} + +func (r *SPRenderer) smartDash(out *bytes.Buffer, previousChar byte, text []byte) int { + if len(text) >= 2 { + if text[1] == '-' { + out.WriteString("—") + return 1 + } + + if wordBoundary(previousChar) && wordBoundary(text[1]) { + out.WriteString("–") + return 0 + } + } + + out.WriteByte(text[0]) + return 0 +} + +func (r *SPRenderer) smartDashLatex(out *bytes.Buffer, previousChar byte, text []byte) int { + if len(text) >= 3 && text[1] == '-' && text[2] == '-' { + out.WriteString("—") + return 2 + } + if len(text) >= 2 && text[1] == '-' { + out.WriteString("–") + return 1 + } + + out.WriteByte(text[0]) + return 0 +} + +func (r *SPRenderer) smartAmpVariant(out *bytes.Buffer, previousChar byte, text []byte, quote byte, addNBSP bool) int { + if bytes.HasPrefix(text, []byte(""")) { + nextChar := byte(0) + if len(text) >= 7 { + nextChar = text[6] + } + if smartQuoteHelper(out, previousChar, nextChar, quote, &r.inDoubleQuote, addNBSP) { + return 5 + } + } + + if bytes.HasPrefix(text, []byte("�")) { + return 3 + } + + out.WriteByte('&') + return 0 +} + +func (r *SPRenderer) smartAmp(angledQuotes, addNBSP bool) func(*bytes.Buffer, byte, []byte) int { + var quote byte = 'd' + if angledQuotes { + quote = 'a' + } + + return func(out *bytes.Buffer, previousChar byte, text []byte) int { + return r.smartAmpVariant(out, previousChar, text, quote, addNBSP) + } +} + +func (r *SPRenderer) smartPeriod(out *bytes.Buffer, previousChar byte, text []byte) int { + if len(text) >= 3 && text[1] == '.' && text[2] == '.' { + out.WriteString("…") + return 2 + } + + if len(text) >= 5 && text[1] == ' ' && text[2] == '.' && text[3] == ' ' && text[4] == '.' { + out.WriteString("…") + return 4 + } + + out.WriteByte(text[0]) + return 0 +} + +func (r *SPRenderer) smartBacktick(out *bytes.Buffer, previousChar byte, text []byte) int { + if len(text) >= 2 && text[1] == '`' { + nextChar := byte(0) + if len(text) >= 3 { + nextChar = text[2] + } + if smartQuoteHelper(out, previousChar, nextChar, 'd', &r.inDoubleQuote, false) { + return 1 + } + } + + out.WriteByte(text[0]) + return 0 +} + +func (r *SPRenderer) smartNumberGeneric(out *bytes.Buffer, previousChar byte, text []byte) int { + if wordBoundary(previousChar) && previousChar != '/' && len(text) >= 3 { + // is it of the form digits/digits(word boundary)?, i.e., \d+/\d+\b + // note: check for regular slash (/) or fraction slash (⁄, 0x2044, or 0xe2 81 84 in utf-8) + // and avoid changing dates like 1/23/2005 into fractions. + numEnd := 0 + for len(text) > numEnd && isdigit(text[numEnd]) { + numEnd++ + } + if numEnd == 0 { + out.WriteByte(text[0]) + return 0 + } + denStart := numEnd + 1 + if len(text) > numEnd+3 && text[numEnd] == 0xe2 && text[numEnd+1] == 0x81 && text[numEnd+2] == 0x84 { + denStart = numEnd + 3 + } else if len(text) < numEnd+2 || text[numEnd] != '/' { + out.WriteByte(text[0]) + return 0 + } + denEnd := denStart + for len(text) > denEnd && isdigit(text[denEnd]) { + denEnd++ + } + if denEnd == denStart { + out.WriteByte(text[0]) + return 0 + } + if len(text) == denEnd || wordBoundary(text[denEnd]) && text[denEnd] != '/' { + out.WriteString("") + out.Write(text[:numEnd]) + out.WriteString("") + out.Write(text[denStart:denEnd]) + out.WriteString("") + return denEnd - 1 + } + } + + out.WriteByte(text[0]) + return 0 +} + +func (r *SPRenderer) smartNumber(out *bytes.Buffer, previousChar byte, text []byte) int { + if wordBoundary(previousChar) && previousChar != '/' && len(text) >= 3 { + if text[0] == '1' && text[1] == '/' && text[2] == '2' { + if len(text) < 4 || wordBoundary(text[3]) && text[3] != '/' { + out.WriteString("½") + return 2 + } + } + + if text[0] == '1' && text[1] == '/' && text[2] == '4' { + if len(text) < 4 || wordBoundary(text[3]) && text[3] != '/' || (len(text) >= 5 && tolower(text[3]) == 't' && tolower(text[4]) == 'h') { + out.WriteString("¼") + return 2 + } + } + + if text[0] == '3' && text[1] == '/' && text[2] == '4' { + if len(text) < 4 || wordBoundary(text[3]) && text[3] != '/' || (len(text) >= 6 && tolower(text[3]) == 't' && tolower(text[4]) == 'h' && tolower(text[5]) == 's') { + out.WriteString("¾") + return 2 + } + } + } + + out.WriteByte(text[0]) + return 0 +} + +func (r *SPRenderer) smartDoubleQuoteVariant(out *bytes.Buffer, previousChar byte, text []byte, quote byte) int { + nextChar := byte(0) + if len(text) > 1 { + nextChar = text[1] + } + if !smartQuoteHelper(out, previousChar, nextChar, quote, &r.inDoubleQuote, false) { + out.WriteString(""") + } + + return 0 +} + +func (r *SPRenderer) smartDoubleQuote(out *bytes.Buffer, previousChar byte, text []byte) int { + return r.smartDoubleQuoteVariant(out, previousChar, text, 'd') +} + +func (r *SPRenderer) smartAngledDoubleQuote(out *bytes.Buffer, previousChar byte, text []byte) int { + return r.smartDoubleQuoteVariant(out, previousChar, text, 'a') +} + +func (r *SPRenderer) smartLeftAngle(out *bytes.Buffer, previousChar byte, text []byte) int { + i := 0 + + for i < len(text) && text[i] != '>' { + i++ + } + + out.Write(text[:i+1]) + return i +} + +type smartCallback func(out *bytes.Buffer, previousChar byte, text []byte) int + +// NewSmartypantsRenderer constructs a Smartypants renderer object. +func NewSmartypantsRenderer(flags HTMLFlags) *SPRenderer { + var ( + r SPRenderer + + smartAmpAngled = r.smartAmp(true, false) + smartAmpAngledNBSP = r.smartAmp(true, true) + smartAmpRegular = r.smartAmp(false, false) + smartAmpRegularNBSP = r.smartAmp(false, true) + + addNBSP = flags&SmartypantsQuotesNBSP != 0 + ) + + if flags&SmartypantsAngledQuotes == 0 { + r.callbacks['"'] = r.smartDoubleQuote + if !addNBSP { + r.callbacks['&'] = smartAmpRegular + } else { + r.callbacks['&'] = smartAmpRegularNBSP + } + } else { + r.callbacks['"'] = r.smartAngledDoubleQuote + if !addNBSP { + r.callbacks['&'] = smartAmpAngled + } else { + r.callbacks['&'] = smartAmpAngledNBSP + } + } + r.callbacks['\''] = r.smartSingleQuote + r.callbacks['('] = r.smartParens + if flags&SmartypantsDashes != 0 { + if flags&SmartypantsLatexDashes == 0 { + r.callbacks['-'] = r.smartDash + } else { + r.callbacks['-'] = r.smartDashLatex + } + } + r.callbacks['.'] = r.smartPeriod + if flags&SmartypantsFractions == 0 { + r.callbacks['1'] = r.smartNumber + r.callbacks['3'] = r.smartNumber + } else { + for ch := '1'; ch <= '9'; ch++ { + r.callbacks[ch] = r.smartNumberGeneric + } + } + r.callbacks['<'] = r.smartLeftAngle + r.callbacks['`'] = r.smartBacktick + return &r +} + +// Process is the entry point of the Smartypants renderer. +func (r *SPRenderer) Process(w io.Writer, text []byte) { + mark := 0 + for i := 0; i < len(text); i++ { + if action := r.callbacks[text[i]]; action != nil { + if i > mark { + w.Write(text[mark:i]) + } + previousChar := byte(0) + if i > 0 { + previousChar = text[i-1] + } + var tmp bytes.Buffer + i += action(&tmp, previousChar, text[i:]) + w.Write(tmp.Bytes()) + mark = i + 1 + } + } + if mark < len(text) { + w.Write(text[mark:]) + } +} diff --git a/vendor/modules.txt b/vendor/modules.txt new file mode 100644 index 0000000..58e0c37 --- /dev/null +++ b/vendor/modules.txt @@ -0,0 +1,3 @@ +# github.com/russross/blackfriday/v2 v2.1.0 +## explicit +github.com/russross/blackfriday/v2

  • +

    {{ .Title }}

    +
    + {{ .Content }} +