From 486a445c852834d8ec7b9835c17e90e0742cf2df Mon Sep 17 00:00:00 2001 From: ekzyis Date: Fri, 7 Nov 2025 16:58:39 +0100 Subject: [PATCH] Template with echo, htmx, tailwindcss, templ --- .gitignore | 4 + Makefile | 6 + db/db.go | 44 + env/env.go | 55 + flake.lock | 61 + flake.nix | 32 + fonts/chunky.flf | 512 ++++ fonts/drpepper.flf | 569 ++++ fonts/graffiti.flf | 617 ++++ fonts/rectangles.flf | 614 ++++ fonts/slant.flf | 1295 ++++++++ fonts/standard.flf | 2227 ++++++++++++++ go.mod | 25 + go.sum | 43 + lib/figlet.go | 38 + main.go | 42 + pages/components/body.templ | 9 + pages/components/content.templ | 14 + pages/components/figlet.templ | 13 + pages/components/head.templ | 25 + pages/components/modal.templ | 25 + pages/context/context.go | 23 + pages/error.templ | 19 + pages/index.templ | 14 + pages/render.go | 46 + public/css/htmx.css | 25 + public/js/htmx.js | 5130 ++++++++++++++++++++++++++++++++ server/context.go | 16 + server/handler.go | 14 + server/server.go | 72 + tailwind.config.js | 3 + tailwind.css | 27 + template.env | 3 + 33 files changed, 11662 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 db/db.go create mode 100644 env/env.go create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 fonts/chunky.flf create mode 100644 fonts/drpepper.flf create mode 100644 fonts/graffiti.flf create mode 100644 fonts/rectangles.flf create mode 100644 fonts/slant.flf create mode 100644 fonts/standard.flf create mode 100644 go.mod create mode 100644 go.sum create mode 100644 lib/figlet.go create mode 100644 main.go create mode 100644 pages/components/body.templ create mode 100644 pages/components/content.templ create mode 100644 pages/components/figlet.templ create mode 100644 pages/components/head.templ create mode 100644 pages/components/modal.templ create mode 100644 pages/context/context.go create mode 100644 pages/error.templ create mode 100644 pages/index.templ create mode 100644 pages/render.go create mode 100644 public/css/htmx.css create mode 100644 public/js/htmx.js create mode 100644 server/context.go create mode 100644 server/handler.go create mode 100644 server/server.go create mode 100644 tailwind.config.js create mode 100644 tailwind.css create mode 100644 template.env diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..50e5dcf --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.env +template +*_templ.go +public/css/tailwind.css diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..c25502c --- /dev/null +++ b/Makefile @@ -0,0 +1,6 @@ +.PHONY: build + +build: + templ generate + tailwindcss -i ./tailwind.css -o ./public/css/tailwind.css + go build -o template main.go diff --git a/db/db.go b/db/db.go new file mode 100644 index 0000000..851ddd8 --- /dev/null +++ b/db/db.go @@ -0,0 +1,44 @@ +package db + +import ( + "context" + "database/sql" + "log" + + _ "github.com/lib/pq" +) + +type Db struct { + *sql.DB +} + +type Tx struct { + *sql.Tx +} + +func New(url string) (*Db, error) { + db, err := sql.Open("postgres", url) + if err != nil { + return nil, err + } + + // test connection + _, err = db.Exec("SELECT 1") + if err != nil { + log.Printf("failed to connect to database: %v", err) + } + + return &Db{db}, nil +} + +func (d *Db) Migrate() error { + return nil +} + +func (d *Db) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error) { + tx, err := d.DB.BeginTx(ctx, opts) + if err != nil { + return nil, err + } + return &Tx{tx}, nil +} diff --git a/env/env.go b/env/env.go new file mode 100644 index 0000000..a831d7e --- /dev/null +++ b/env/env.go @@ -0,0 +1,55 @@ +package env + +import ( + "fmt" + "log" + "net/url" + "os/exec" + "strings" + + "github.com/joho/godotenv" + "github.com/namsral/flag" +) + +var ( + Port int + Env string + PublicUrl string + CommitShortSha string + CommitLongSha string + PostgresUrl string + PostgresUrlWithoutPassword string +) + +func Load(filenames ...string) error { + if err := godotenv.Load(); err != nil { + return err + } + flag.IntVar(&Port, "PORT", 4444, "Server port") + flag.StringVar(&PublicUrl, "PUBLIC_URL", "", "Base URL") + flag.StringVar(&PostgresUrl, "POSTGRES_DB", "", "PostgreSQL connection URL") + flag.StringVar(&Env, "ENV", "development", "Build environment") + return nil +} + +func Parse() { + flag.Parse() + CommitLongSha = execCmd("git", "rev-parse", "HEAD") + CommitShortSha = execCmd("git", "rev-parse", "--short", "HEAD") + if u, err := url.Parse(PostgresUrl); err == nil { + if pw, ok := u.User.Password(); ok { + PostgresUrlWithoutPassword = strings.Replace(PostgresUrl, fmt.Sprintf(":%s@", pw), ":*****@", 1) + } else { + PostgresUrlWithoutPassword = PostgresUrl + } + } +} + +func execCmd(name string, args ...string) string { + cmd := exec.Command(name, args...) + stdout, err := cmd.Output() + if err != nil { + log.Fatal(err) + } + return strings.TrimSpace(string(stdout)) +} diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..c9941bd --- /dev/null +++ b/flake.lock @@ -0,0 +1,61 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1764316264, + "narHash": "sha256-82L+EJU+40+FIdeG4gmUlOF1jeSwlf2AwMarrpdHF6o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "9a7b80b6f82a71ea04270d7ba11b48855681c4b0", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-25.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..174e232 --- /dev/null +++ b/flake.nix @@ -0,0 +1,32 @@ +{ + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.05"; + flake-utils.url = "github:numtide/flake-utils"; + }; + + outputs = { self, nixpkgs, flake-utils }: + flake-utils.lib.eachDefaultSystem (system: + let + pkgs = nixpkgs.legacyPackages.${system}; + in + { + devShells.default = pkgs.mkShell { + buildInputs = with pkgs; [ + go + tailwindcss_4 + gnumake + postgresql_17 + ]; + }; + + apps.default = { + type = "app"; + program = toString (pkgs.writeShellScript "serve" '' + # install templ if not already installed + command -v templ > /dev/null || go install github.com/a-h/templ/cmd/templ@latest + ${pkgs.make}/bin/make build + ''); + }; + } + ); +} \ No newline at end of file diff --git a/fonts/chunky.flf b/fonts/chunky.flf new file mode 100644 index 0000000..ca98f34 --- /dev/null +++ b/fonts/chunky.flf @@ -0,0 +1,512 @@ +flf2a$ 5 4 20 15 1 +Square by Chris Gill, 30-JUN-94 -- based on .sig of Jeb Hagan. +$@ +$@ +$@ +$@ +$@@ + __ @ +| |@ +|__|@ +|__|@ + @@ + ____ @ +| | |@ + |_|_|@ + @ + @@ + _____ @ + _| | |_ @ +|_ _|@ +|_ _|@ + |__|__| @@ + __,-,__ @ +| ' '__|@ +|__ |@ +|_______|@ + |_| @@ + __ ___ @ +|__| |@ +| __|@ +|___|__|@ + @@ + __,-,__ @ +| ' '__|@ +| __|@ +|_______|@ + |_| @@ + __ @ +| |@ + |_|@ + @ + @@ + ___ @ +,' _|@ +| | @ +| |_ @ +`.___|@@ + ___ @ +|_ `.@ + | |@ + _| |@ +|___,'@@ + __ _ __ @ +| | | |@ + > < @ +|__|_|__|@ + @@ + __ @ + _| |_ @ +|_ _|@ + |__| @ + @@ + @ + @ + __ @ +| |@ + |_|@@ + @ + ______ @ +|______|@ + @ + @@ + @ + @ + __ @ +|__|@ + @@ + ___@ + / /@ + ,' ,' @ +/__/ @ + @@ + ______ @ +| |@ +| -- |@ +|______|@ + @@ + ____ @ +|_ | @ + _| |_ @ +|______|@ + @@ + ______ @ +|__ |@ +| __|@ +|______|@ + @@ + ______ @ +|__ |@ +|__ |@ +|______|@ + @@ + _____ @ +| | | @ +|__ |@ + |__| @ + @@ + ______ @ +| __|@ +|__ |@ +|______|@ + @@ + ______ @ +| __|@ +| __ |@ +|______|@ + @@ + ______ @ +| |@ +|_ |@ + |____|@ + @@ + ______ @ +| __ |@ +| __ |@ +|______|@ + @@ + ______ @ +| __ |@ +|__ |@ +|______|@ + @@ + __ @ +|__|@ + __ @ +|__|@ + @@ + __ @ +|__|@ + __ @ +| |@ + |_|@@ + __ @ + ,' _|@ +/ / @ +\ \_ @ + `.__|@@ + @ + ______ @ +|______|@ +|______|@ + @@ + __ @ +|_ `. @ + \ \@ + _/ /@ +|__,' @@ + _____ @ + |__ |@ + ', ,-'@ + |--| @ + '--' @@ + _________ @ +| ___ |@ +| | _ |@ +| |______|@ +|_________|@@ + _______ @ +| _ |@ +| |@ +|___|___|@ + @@ + ______ @ +| __ \@ +| __ <@ +|______/@ + @@ + ______ @ +| |@ +| ---|@ +|______|@ + @@ + _____ @ +| \ @ +| -- |@ +|_____/ @ + @@ + _______ @ +| ___|@ +| ___|@ +|_______|@ + @@ + _______ @ +| ___|@ +| ___|@ +|___| @ + @@ + _______ @ +| __|@ +| | |@ +|_______|@ + @@ + _______ @ +| | |@ +| |@ +|___|___|@ + @@ + _______ @ +|_ _|@ + _| |_ @ +|_______|@ + @@ + _____ @ + _| |@ +| |@ +|_______|@ + @@ + __ __ @ +| |/ |@ +| < @ +|__|\__|@ + @@ + _____ @ +| |_ @ +| |@ +|_______|@ + @@ + _______ @ +| | |@ +| |@ +|__|_|__|@ + @@ + _______ @ +| | |@ +| |@ +|__|____|@ + @@ + _______ @ +| |@ +| - |@ +|_______|@ + @@ + ______ @ +| __ \@ +| __/@ +|___| @ + @@ + _______ @ +| |@ +| - _|@ +|_______|@ + @@ + ______ @ +| __ \@ +| <@ +|___|__|@ + @@ + _______ @ +| __|@ +|__ |@ +|_______|@ + @@ + _______ @ +|_ _|@ + | | @ + |___| @ + @@ + _______ @ +| | |@ +| | |@ +|_______|@ + @@ + ___ ___ @ +| | |@ +| | |@ + \_____/ @ + @@ + ________ @ +| | | |@ +| | | |@ +|________|@ + @@ + ___ ___ @ +| | |@ +|- -|@ +|___|___|@ + @@ + ___ ___ @ +| | |@ + \ / @ + |___| @ + @@ + _______ @ +|__ |@ +| __|@ +|_______|@ + @@ + ____ @ +| _|@ +| | @ +| |_ @ +|____|@@ +___ @ +\ \ @ + `. `. @ + \__\@ + @@ + ____ @ +|_ |@ + | |@ + _| |@ +|____|@@ + ____ @ +| |@ +|_/\_|@ + @ + @@ + @ + @ + @ + ______ @ +|______|@@ + __ @ +| |@ +|_| @ + @ + @@ + @ +.---.-.@ +| _ |@ +|___._|@ + @@ + __ @ +| |--.@ +| _ |@ +|_____|@ + @@ + @ +.----.@ +| __|@ +|____|@ + @@ + __ @ +.--| |@ +| _ |@ +|_____|@ + @@ + @ +.-----.@ +| -__|@ +|_____|@ + @@ + ___ @ +.' _|@ +| _|@ +|__| @ + @@ + @ +.-----.@ +| _ |@ +|___ |@ +|_____|@@ + __ @ +| |--.@ +| |@ +|__|__|@ + @@ + __ @ +|__|@ +| |@ +|__|@ + @@ + __ @ + |__|@ + | |@ + | |@ +|___|@@ + __ @ +| |--.@ +| < @ +|__|__|@ + @@ + __ @ +| |@ +| |@ +|__|@ + @@ + @ +.--------.@ +| |@ +|__|__|__|@ + @@ + @ +.-----.@ +| |@ +|__|__|@ + @@ + @ +.-----.@ +| _ |@ +|_____|@ + @@ + @ +.-----.@ +| _ |@ +| __|@ +|__| @@ + @ +.-----.@ +| _ |@ +|__ |@ + |__|@@ + @ +.----.@ +| _|@ +|__| @ + @@ + @ +.-----.@ +|__ --|@ +|_____|@ + @@ + __ @ +| |_ @ +| _|@ +|____|@ + @@ + @ +.--.--.@ +| | |@ +|_____|@ + @@ + @ +.--.--.@ +| | |@ + \___/ @ + @@ + @ +.--.--.--.@ +| | | |@ +|________|@ + @@ + @ +.--.--.@ +|_ _|@ +|__.__|@ + @@ + @ +.--.--.@ +| | |@ +|___ |@ +|_____|@@ + @ +.-----.@ +|-- __|@ +|_____|@ + @@ + ___ @ + | _|@ +/ / @ +\ \_ @ + |___|@@ + __ @ +| |@ +| |@ +| |@ +|__|@@ + ___ @ +|_ | @ + \ \@ + _/ /@ +|___| @@ + ___ @ + | ' |@ +|_,_| @ + @ + @@ +.--.--.@ +|-----|@ +| - |@ +|__|__|@ + @@ +.--.--.@ +|-----|@ +| _ |@ +|_____|@ + @@ +.--.--.@ +|--|--|@ +| | |@ +|_____|@ + @@ +.--.--.@ +|---.-|@ +| _ |@ +|___._|@ + @@ +.--.--.@ +|-----|@ +| _ |@ +|_____|@ + @@ +.--.--.@ +|--|--|@ +| | |@ +|_____|@ + @@ + _______ @ +| __ \@ +| __ <@ +| |____/@ +|__| @@ diff --git a/fonts/drpepper.flf b/fonts/drpepper.flf new file mode 100644 index 0000000..901160b --- /dev/null +++ b/fonts/drpepper.flf @@ -0,0 +1,569 @@ +flf2a$ 5 4 20 0 16 +Font : Dr. Pepper (after a name in one sig done in this style). +Author: Eero Tamminen, t150315@cc.tut.fi. + +Characters '#' and '&' are lousy and I'm not very satisfied +with the '$' or 't'... Suggestions? + +Explanation of first line: +flf2 - "magic number" for file identifiction +a - should always be `a', for now +$ - the "hardblank" -- prints s a blank, but can't be smushed +5 - height of a character +4 - height of a character, not including descenders +20 - max line length (excluding comment lines) + fudge factor +0 - default smushmode for this font +16 - number of comment lines + +$@ +$@ +$@ +$@ +$@@ + _ @ +| |@ +|_/@ +<_>@ + @@ + _ _@ +|/|/@ + @ + @ + @@ + @ +$_|_|_$@ +$_|_|_$@ + | | @ + @@ + @ + ||_@ +<_-<@ +/__/@ + || @@ + __@ +<>/ /@ + / / @ +/_/<>@ + @@ + _ @ +< > @ +/.\/$@ +\_/\$@ + @@ + _@ +|/@ + @ + @ + @@ + __@ + / /@ +| | @ +| | @ + \_\@@ +__ @ +\ \ @ + | |@ + | |@ +/_/ @@ + @ +_/\_@ +> <@ + \/ @ + @@ + _ @ + _| |_ @ +|_ _|@ + |_| @ + @@ + @ + @ + _@ +|/@ + @@ + @ + ___ @ +|___|@ + @ + @@ + @ + @ + _ @ +<_>@ + @@ + __@ + / /@ + / / @ +/_/ @ + @@ + ___ @ +| |@ +| / |@ +`___'@ + @@ + _ @ +/ |@ +| |@ +|_|@ + @@ + ___ @ +<_ >@ + / / @ +<___>@ + @@ + ____@ +<__ /@ + <_ \@ +<___/@ + @@ + __ @ + /. | @ +/_ .|@ + |_| @ + @@ + ___ @ +| __|@ +`__ \@ +|___/@ + @@ + ___ @ +| __>@ +| . \@ +`___/@ + @@ + ___ @ +|_ |@ + / / @ +/_/ @ + @@ + ___ @ +< . >@ +/ . \@ +\___/@ + @@ + ___ @ +| . |@ +`_ /@ + /_/ @ + @@ + _ @ +<_>@ + _ @ +<_>@ + @@ + _ @ +<_>@ + _ @ +|/ @ + @@ + __@ + / /@ +< < @ + \_\@ + @@ + ___ @ +|___|@ + ___ @ +|___|@ + @@ +__ @ +\ \ @ + > >@ +/_/ @ + @@ + ___ @ +<_. >@ + /_/ @ + <_> @ + @@ + ___ @ +| "|@ +| \_|@ +`___/@ + @@ + ___ @ +| . |@ +| |@ +|_|_|@ + @@ + ___ @ +| . >@ +| . \@ +|___/@ + @@ + ___ @ +| _>@ +| <__@ +`___/@ + @@ + ___ @ +| . \@ +| | |@ +|___/@ + @@ + ___ @ +| __>@ +| _> @ +|___>@ + @@ + ___ @ +| __>@ +| _> @ +|_| @ + @@ + ___ @ +/ _> @ +| <_/\@ +`____/@ + @@ + _ _ @ +| | |@ +| |@ +|_|_|@ + @@ + _ @ +| |@ +| |@ +|_|@ + @@ + _ @ + | |@ +_| |@ +\__/@ + @@ + _ __@ +| / /@ +| \ @ +|_\_\@ + @@ + _ @ +| | @ +| |_ @ +|___|@ + @@ + __ __ @ +| \ \@ +| |@ +|_|_|_|@ + @@ + _ _ @ +| \ |@ +| |@ +|_\_|@ + @@ + ___ @ +| . |@ +| | |@ +`___'@ + @@ + ___ @ +| . \@ +| _/@ +|_| @ + @@ + ___ @ +| . |@ +| | |@ +`___\@ + @@ + ___ @ +| . \@ +| /@ +|_\_\@ + @@ + ___ @ +/ __>@ +\__ \@ +<___/@ + @@ + ___ @ +|_ _|@ + | | @ + |_| @ + @@ + _ _ @ +| | |@ +| ' |@ +`___'@ + @@ + _ _ @ +| | |@ +| ' |@ +|__/ @ + @@ + _ _ _ @ +| | | |@ +| | | |@ +|__/_/ @ + @@ +__ _$@ +\ \/ @ + \ \ @ +_/\_\ @ + @@ + _ _ @ +| | |@ +\ /@ + |_| @ + @@ + ____@ +|_ /@ + / / @ +/___|@ + @@ + ___ @ +| _|@ +| | @ +| |_ @ +|___|@@ +__ @ +\ \ @ + \ \ @ + \_\@ + @@ + ___ @ +|_ |@ + | |@ + _| |@ +|___|@@ + /\ @ +@ + @ + @ + @@ + @ + @ + ___ @ +|___|@ + @@ +_ @ +\|@ + @ + @ + @@ + @ + ___ @ +<_> |@ +<___|@ + @@ + _ @ +| |_ @ +| . \@ +|___/@ + @@ + @ + ___ @ +/ | '@ +\_|_.@ + @@ + _ @ + _| |@ +/ . |@ +\___|@ + @@ + @ + ___ @ +/ ._>@ +\___.@ + @@ + ___ @ +| | '@ +| |- @ +|_| @ + @@ + @ + ___ @ +/ . |@ +\_. |@ +<___'@@ + _ @ +| |_ @ +| . |@ +|_|_|@ + @@ + _ @ +<_>@ +| |@ +|_|@ + @@ + _ @ + <_>@ + | |@ + | |@ +<__'@@ + _ @ +| |__@ +| / /@ +|_\_\@ + @@ + _ @ +| |@ +| |@ +|_|@ + @@ + @ +._ _ _ @ +| ' ' |@ +|_|_|_|@ + @@ + @ +._ _ @ +| ' |@ +|_|_|@ + @@ + @ + ___ @ +/ . \@ +\___/@ + @@ + @ + ___ @ +| . \@ +| _/@ +|_| @@ + @ + ___ @ +/ . |@ +\_ |@ + |_|@@ + @ + _ _ @ +| '_>@ +|_| @ + @@ + @ + ___@ +<_-<@ +/__/@ + @@ + _ @ +$_| |_$@ + | | @ + |_| @ + @@ + @ + _ _ @ +| | |@ +`___|@ + @@ + @ + _ _ @ +| | |@ +|__/ @ + @@ + @ + _ _ _ @ +| | | |@ +|__/_/ @ + @@ + @ +__ @ +\ \/@ +/\_\@ + @@ + @ + _ _ @ +| | |@ +`_. |@ +<___'@@ + @ +.___@ + / /@ +/___@ + @@ + __@ + / /@ +/ | @ +\ | @ + \_\@@ +||@ +||@ +||@ +||@ + @@ +__ @ +\ \ @ + | \@ + | /@ +/_/ @@ + @ + /\/|@ +|/\/ @ + @ + @@ +<>_<>@ +| . |@ +| |@ +|_|_|@ + @@ +<>_<>@ +| . |@ +| | |@ +`___'@ + @@ +<>_<>@ +| | |@ +| ' |@ +`___'@ + @@ + @ +<>_<>@ +`_> |@ +<___|@ + @@ + @ +<>_<>@ +/ . \@ +\___/@ + @@ + @ +<>_<>@ +| | |@ +`___|@ + @@ + ___ @ +| . >@ +| . \@ +| ._/@ +|_| @@ +196 +<>_<>@ +| . |@ +| |@ +|_|_|@ + @@ +214 +<>_<>@ +| . |@ +| | |@ +`___'@ + @@ +220 +<>_<>@ +| | |@ +| ' |@ +`___'@ + @@ +223 + ___ @ +| . >@ +| . \@ +| ._/@ +|_| @@ +228 + @ +<>_<>@ +`_> |@ +<___|@ + @@ +246 + @ +<>_<>@ +/ . \@ +\___/@ + @@ +252 + @ +<>_<>@ +| | |@ +`___|@ + @@ diff --git a/fonts/graffiti.flf b/fonts/graffiti.flf new file mode 100644 index 0000000..fea27a8 --- /dev/null +++ b/fonts/graffiti.flf @@ -0,0 +1,617 @@ +flf2a$ 6 5 32 15 4 +Font name is graffiti.flf +This figlet font designed by Leigh Purdie (purdie@zeus.usq.edu.au) +'fig-fonted' by Leigh Purdie and Tim Maggio (tim@claremont.com) +Date: 5 Mar 1994 +$@ +$@ +$@ +$@ +$@ +$@@ +._.@ +| |@ +| |@ + \|@ + __@ + \/@@ +/\/\@ +)/)/@ + @ + @ + @ + @@ + _ _ @ +__| || |__@ +\ __ /@ + | || | @ +/_ ~~ _\@ + |_||_| @@ + ____/\__@ + / / /_/@ + \__/ / \ @ + / / / \@ +/_/ /__ /@ + \/ \/ @@ + _ /\ @ +/ \ / / @ +\_// /_ @ + / // \@ + / / \_/@ + \/ @@ + ____ @ + / _ \ @ + > _ < @ +/ -- \@ +\______ /@ + \/ @@ + ________ @ +/ __ \@ +\____ /@ + / / @ + /____/ @ + @@ +$ $@ +$/\$@ +$\/$@ +$/\$@ +$\/$@ +$ $@@ +$ $@ +$/\$@ +$\/$@ +$/\$@ +$)/$@ +$ $@@ +$ __$@ +$ / /$@ +$/ / $@ +$\ \ $@ +$ \_\$@ +$ $@@ +$ $@ +$ ______$@ +$/_____/$@ +$/_____/$@ +$ $@ +$ $@@ +$__ $@ +$\ \ $@ +$ \ \$@ +$ / /$@ +$/_/ $@ +$ $@@ +_________ @ +\_____ \@ + / __/@ + | | @ + |___| @ + <___> @@ + _____ @ + / ___ \ @ + / / ._\ \@ +< \_____/@ + \_____\ @ + @@ + _____ @ + / _ \ @ + / /_\ \ @ +/ | \@ +\____|__ /@ + \/ @@ +__________ @ +\______ \@ + | | _/@ + | | \@ + |______ /@ + \/ @@ +_________ @ +\_ ___ \ @ +/ \ \/ @ +\ \____@ + \______ /@ + \/ @@ +________ @ +\______ \ @ + | | \ @ + | ` \@ +/_______ /@ + \/ @@ +___________@ +\_ _____/@ + | __)_ @ + | \@ +/_______ /@ + \/ @@ +___________@ +\_ _____/@ + | __) @ + | \ @ + \___ / @ + \/ @@ + ________ @ + / _____/ @ +/ \ ___ @ +\ \_\ \@ + \______ /@ + \/ @@ + ___ ___ @ + / | \ @ +/ ~ \@ +\ Y /@ + \___|_ / @ + \/ @@ +.___ @ +| |@ +| |@ +| |@ +|___|@ + @@ + ____.@ + | |@ + | |@ +/\__| |@ +\________|@ + @@ + ____ __.@ +| |/ _|@ +| < @ +| | \ @ +|____|__ \@ + \/@@ +.____ @ +| | @ +| | @ +| |___ @ +|_______ \@ + \/@@ + _____ @ + / \ @ + / \ / \ @ +/ Y \@ +\____|__ /@ + \/ @@ + _______ @ + \ \ @ + / | \ @ +/ | \@ +\____|__ /@ + \/ @@ +________ @ +\_____ \ @ + / | \ @ +/ | \@ +\_______ /@ + \/ @@ +__________ @ +\______ \@ + | ___/@ + | | @ + |____| @ + @@ +________ @ +\_____ \ @ + / / \ \ @ +/ \_/. \@ +\_____\ \_/@ + \__>@@ +__________ @ +\______ \@ + | _/@ + | | \@ + |____|_ /@ + \/ @@ + _________@ + / _____/@ + \_____ \ @ + / \@ +/_______ /@ + \/ @@ +___________@ +\__ ___/@ + | | @ + | | @ + |____| @ + @@ + ____ ___ @ +| | \@ +| | /@ +| | / @ +|______/ @ + @@ +____ ____@ +\ \ / /@ + \ Y / @ + \ / @ + \___/ @ + @@ + __ __ @ +/ \ / \@ +\ \/\/ /@ + \ / @ + \__/\ / @ + \/ @@ +____ ___@ +\ \/ /@ + \ / @ + / \ @ +/___/\ \@ + \_/@@ +_____.___.@ +\__ | |@ + / | |@ + \____ |@ + / ______|@ + \/ @@ +__________@ +\____ /@ + / / @ + / /_ @ +/_______ \@ + \/@@ +$.____ $@ +$| _|$@ +$| | $@ +$| | $@ +$| |_ $@ +$|____|$@@ +/\ @ +\ \ @ + \ \ @ + \ \ @ + \ \@ + \/@@ +$ ____.$@ +$|_ |$@ +$ | |$@ +$ | |$@ +$ _| |$@ +$|____|$@@ +$ /\ $@ +$/ \$@ +$\/\/$@ +$ $@ +$ $@ +$ $@@ + @ + @ + @ + @ + ______@ +/_____/@@ +/\@ +\(@ + @ + @ + @ + @@ + @ +_____ @ +\__ \ @ + / __ \_@ +(____ /@ + \/ @@ +___. @ +\_ |__ @ + | __ \ @ + | \_\ \@ + |___ /@ + \/ @@ + @ + ____ @ +_/ ___\ @ +\ \___ @ + \___ >@ + \/ @@ + .___@ + __| _/@ + / __ | @ +/ /_/ | @ +\____ | @ + \/ @@ + @ + ____ @ +_/ __ \ @ +\ ___/ @ + \___ >@ + \/ @@ + _____ @ +_/ ____\@ +\ __\ @ + | | @ + |__| @ + @@ + @ + ____ @ + / ___\ @ + / /_/ >@ + \___ / @ +/_____/ @@ +.__ @ +| |__ @ +| | \ @ +| Y \@ +|___| /@ + \/ @@ +.__ @ +|__|@ +| |@ +| |@ +|__|@ + @@ + __ @ + |__|@ + | |@ + | |@ +/\__| |@ +\______|@@ + __ @ +| | __@ +| |/ /@ +| < @ +|__|_ \@ + \/@@ +.__ @ +| | @ +| | @ +| |__@ +|____/@ + @@ + @ + _____ @ + / \ @ +| Y Y \@ +|__|_| /@ + \/ @@ + @ + ____ @ + / \ @ +| | \@ +|___| /@ + \/ @@ + @ + ____ @ + / _ \ @ +( <_> )@ + \____/ @ + @@ + @ +______ @ +\____ \ @ +| |_> >@ +| __/ @ +|__| @@ + @ + ______@ + / ____/@ +< <_| |@ + \__ |@ + |__|@@ + @ +_______ @ +\_ __ \@ + | | \/@ + |__| @ + @@ + @ + ______@ + / ___/@ + \___ \ @ +/____ >@ + \/ @@ + __ @ +_/ |_ @ +\ __\@ + | | @ + |__| @ + @@ + @ + __ __ @ +| | \@ +| | /@ +|____/ @ + @@ + @ +___ __@ +\ \/ /@ + \ / @ + \_/ @ + @@ + @ +__ _ __@ +\ \/ \/ /@ + \ / @ + \/\_/ @ + @@ + @ +___ ___@ +\ \/ /@ + > < @ +/__/\_ \@ + \/@@ + @ + ___.__.@ +< | |@ + \___ |@ + / ____|@ + \/ @@ + @ +________@ +\___ /@ + / / @ +/_____ \@ + \/@@ +$ ___$@ +$/ / $@ +$\ \ $@ +$< < $@ +$/ / $@ +$\_\_$@@ +$._.$@ +$| |$@ +$|_|$@ +$|-|$@ +$| |$@ +$|_|$@@ +$___ $@ +$ \ \$@ +$ / /$@ +$ > >$@ +$ \ \$@ +$_/_/$@@ +$ ___ $@ +$/ _ \_/\$@ +$\/ \___/$@ +$ $@ +$ $@ +$ $@@ +@ +@ +@ +@ +@ +@@ +@ +@ +@ +@ +@ +@@ +@ +@ +@ +@ +@ +@@ +@ +@ +@ +@ +@ +@@ +@ +@ +@ +@ +@ +@@ +@ +@ +@ +@ +@ +@@ +@ +@ +@ +@ +@ +@@ diff --git a/fonts/rectangles.flf b/fonts/rectangles.flf new file mode 100644 index 0000000..b6501e1 --- /dev/null +++ b/fonts/rectangles.flf @@ -0,0 +1,614 @@ +flf2a$ 6 5 15 1 1 +rectangles.flf by David Villegas 12/94 +$$@ +$$@ +$$@ +$$@ +$$@ +$$@@ + __ @ +| |@ +| |@ +|__|@ +|__|@ + @@ + _ _ @ +| | |@ +|_|_|@ + $$$ @ + $$$ @ + $$$ @@ + _ _ @ + _| | |_ @ +|_ _|@ +|_ _|@ + |_|_| @ + @@ + _ @ + _| |_ @ +| __|@ +|__ |@ +|_ _|@ + |_| @@ + @ + __ __ @ +|__| |@ +| __|@ +|__|__|@ + @@ + _ @ + _| |_ @ +| __|@ +| __|@ +|_ _|@ + |_| @@ + _ @ +| |@ +|_|@ + $ @ + $ @ + $ @@ + _ @ + _|_|@ +| | @ +| | @ +|_|_ @ + |_|@@ + _ @ +|_|_ @ + | |@ + | |@ + _|_|@ +|_| @@ + @ + _____ @ +| | | |@ +|- -|@ +|_|_|_|@ + @@ + @ + _ @ + _| |_ @ +|_ _|@ + |_| @ + @@ + $ @ + $ @ + $ @ + _ @ +| |@ +|_|@@ + $$$ @ + $$$ @ + ___ @ +|___|@ + $$$ @ + $$$ @@ + $ @ + $ @ + $ @ + _ @ +|_|@ + $ @@ + @ + _ @ + / |@ + / / @ +|_/ @ + @@ + @ + ___ @ +| |@ +| | |@ +|___|@ + @@ + @ + ___ @ +|_ | @ + _| |_ @ +|_____|@ + @@ + @ + ___ @ +|_ |@ +| _|@ +|___|@ + @@ + @ + ___ @ +|_ |@ +|_ |@ +|___|@ + @@ + @ + ___ @ +| | |@ +|_ |@ + |_|@ + @@ + @ + ___ @ +| _|@ +|_ |@ +|___|@ + @@ + @ + ___ @ +| _|@ +| . |@ +|___|@ + @@ + @ + ___ @ +|_ |@ + | |@ + |_|@ + @@ + @ + ___ @ +| . |@ +| . |@ +|___|@ + @@ + @ + ___ @ +| . |@ +|_ |@ +|___|@ + @@ + @ + _ @ +|_|@ + _ @ +|_|@ + @@ + @ + _ @ +|_|@ + _ @ +| |@ +|_|@@ + __@ + / /@ + / / @ +< < @ + \ \ @ + \_\@@ + $$$$$ @ + $$$$$ @ + _____ @ +|_____|@ +|_____|@ + $$$$$ @@ +__ @ +\ \ @ + \ \ @ + > >@ + / / @ +/_/ @@ + _____ @ +|___ |@ + | _|@ + |_| @ + |_| @ + @@ + @ + _____ @ +| __ |@ +| |___|@ +|_____|@ + @@ + @ + _____ @ +| _ |@ +| |@ +|__|__|@ + @@ + @ + _____ @ +| __ |@ +| __ -|@ +|_____|@ + @@ + @ + _____ @ +| |@ +| --|@ +|_____|@ + @@ + @ + ____ @ +| \ @ +| | |@ +|____/ @ + @@ + @ + _____ @ +| __|@ +| __|@ +|_____|@ + @@ + @ + _____ @ +| __|@ +| __|@ +|__| @ + @@ + @ + _____ @ +| __|@ +| | |@ +|_____|@ + @@ + @ + _____ @ +| | |@ +| |@ +|__|__|@ + @@ + @ + _____ @ +| |@ +|- -|@ +|_____|@ + @@ + @ + __ @ + __| |@ +| | |@ +|_____|@ + @@ + @ + _____ @ +| | |@ +| -|@ +|__|__|@ + @@ + @ + __ @ +| | @ +| |__ @ +|_____|@ + @@ + @ + _____ @ +| |@ +| | | |@ +|_|_|_|@ + @@ + @ + _____ @ +| | |@ +| | | |@ +|_|___|@ + @@ + @ + _____ @ +| |@ +| | |@ +|_____|@ + @@ + @ + _____ @ +| _ |@ +| __|@ +|__| @ + @@ + @ + _____ @ +| |@ +| | |@ +|__ _|@ + |__|@@ + @ + _____ @ +| __ |@ +| -|@ +|__|__|@ + @@ + @ + _____ @ +| __|@ +|__ |@ +|_____|@ + @@ + @ + _____ @ +|_ _|@ + | | @ + |_| @ + @@ + @ + _____ @ +| | |@ +| | |@ +|_____|@ + @@ + @ + _____ @ +| | |@ +| | |@ + \___/ @ + @@ + @ + _ _ _ @ +| | | |@ +| | | |@ +|_____|@ + @@ + @ + __ __ @ +| | |@ +|- -|@ +|__|__|@ + @@ + @ + __ __ @ +| | |@ +|_ _|@ + |_| @ + @@ + @ + _____ @ +|__ |@ +| __|@ +|_____|@ + @@ + ___ @ +| _|@ +| | @ +| | @ +| |_ @ +|___|@@ + @ + _ @ +| \ @ + \ \ @ + \_|@ + @@ + ___ @ +|_ |@ + | |@ + | |@ + _| |@ +|___|@@ + _____ @ +| _ |@ +|_| |_|@ + $$$$$ @ + $$$$$ @ + $$$$$ @@ + $$$$$ @ + $$$$$ @ + $$$$$ @ + $$$$$ @ + _____ @ +|_____|@@ + ___ @ +|_ |@ + |_|@ + $$$ @ + $$$ @ + $$$ @@ + @ + @ + ___ @ +| .'|@ +|__,|@ + @@ + @ + _ @ +| |_ @ +| . |@ +|___|@ + @@ + @ + @ + ___ @ +| _|@ +|___|@ + @@ + @ + _ @ + _| |@ +| . |@ +|___|@ + @@ + @ + @ + ___ @ +| -_|@ +|___|@ + @@ + @ + ___ @ +| _|@ +| _|@ +|_| @ + @@ + @ + @ + ___ @ +| . |@ +|_ |@ +|___|@@ + @ + _ @ +| |_ @ +| |@ +|_|_|@ + @@ + @ + _ @ +|_|@ +| |@ +|_|@ + @@ + @ + _ @ + |_|@ + | |@ + _| |@ +|___|@@ + @ + _ @ +| |_ @ +| '_|@ +|_,_|@ + @@ + @ + _ @ +| |@ +| |@ +|_|@ + @@ + @ + @ + _____ @ +| |@ +|_|_|_|@ + @@ + @ + @ + ___ @ +| |@ +|_|_|@ + @@ + @ + @ + ___ @ +| . |@ +|___|@ + @@ + @ + @ + ___ @ +| . |@ +| _|@ +|_| @@ + @ + @ + ___ @ +| . |@ +|_ |@ + |_|@@ + @ + @ + ___ @ +| _|@ +|_| @ + @@ + @ + @ + ___ @ +|_ -|@ +|___|@ + @@ + @ + _ @ +| |_ @ +| _|@ +|_| @ + @@ + @ + @ + _ _ @ +| | |@ +|___|@ + @@ + @ + @ + _ _ @ +| | |@ + \_/ @ + @@ + @ + @ + _ _ _ @ +| | | |@ +|_____|@ + @@ + @ + @ + _ _ @ +|_'_|@ +|_,_|@ + @@ + @ + @ + _ _ @ +| | |@ +|_ |@ +|___|@@ + @ + @ + ___ @ +|- _|@ +|___|@ + @@ + ___ @ + | _|@ + _| | @ +|_ | @ + | |_ @ + |___|@@ + _ @ +| |@ +| |@ +| |@ +| |@ +|_|@@ + ___ @ +|_ | @ + | |_ @ + | _|@ + _| | @ +|___| @@ + _____ @ +| | |@ +|_|___|@ + $$$$$ @ + $$$$$ @ + $$$$$ @@ + __ __ @ +|__|__|@ +| _ |@ +| |@ +|__|__|@ + @@ + __ __ @ +|__|__|@ +| |@ +| | |@ +|_____|@ + @@ + __ __ @ +|__|__|@ +| | |@ +| | |@ +|_____|@ + @@ + _ _ @ +|_|_|@ + ___ @ +| .'|@ +|__,|@ + @@ + _ _ @ +|_|_|@ + ___ @ +| . |@ +|___|@ + @@ + _ _ @ +|_|_|@ + _ _ @ +| | |@ +|___|@ + @@ + @ + _____ @ +| __ |@ +| __ -|@ +| ___|@ +|_| @@ diff --git a/fonts/slant.flf b/fonts/slant.flf new file mode 100644 index 0000000..ea27b6e --- /dev/null +++ b/fonts/slant.flf @@ -0,0 +1,1295 @@ +flf2a$ 6 5 16 15 10 0 18319 +Slant by Glenn Chappell 3/93 -- based on Standard +Includes ISO Latin-1 +figlet release 2.1 -- 12 Aug 1994 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + + $$@ + $$ @ + $$ @ + $$ @ + $$ @ +$$ @@ + __@ + / /@ + / / @ + /_/ @ +(_) @ + @@ + _ _ @ +( | )@ +|/|/ @ + $ @ +$ @ + @@ + __ __ @ + __/ // /_@ + /_ _ __/@ +/_ _ __/ @ + /_//_/ @ + @@ + __@ + _/ /@ + / __/@ + (_ ) @ +/ _/ @ +/_/ @@ + _ __@ + (_)_/_/@ + _/_/ @ + _/_/_ @ +/_/ (_) @ + @@ + ___ @ + ( _ ) @ + / __ \/|@ +/ /_/ < @ +\____/\/ @ + @@ + _ @ + ( )@ + |/ @ + $ @ +$ @ + @@ + __@ + _/_/@ + / / @ + / / @ +/ / @ +|_| @@ + _ @ + | |@ + / /@ + / / @ + _/_/ @ +/_/ @@ + @ + __/|_@ + | /@ +/_ __| @ + |/ @ + @@ + @ + __ @ + __/ /_@ +/_ __/@ + /_/ @ + @@ + @ + @ + @ + _ @ +( )@ +|/ @@ + @ + @ + ______@ +/_____/@ + $ @ + @@ + @ + @ + @ + _ @ +(_)@ + @@ + __@ + _/_/@ + _/_/ @ + _/_/ @ +/_/ @ + @@ + ____ @ + / __ \@ + / / / /@ +/ /_/ / @ +\____/ @ + @@ + ___@ + < /@ + / / @ + / / @ +/_/ @ + @@ + ___ @ + |__ \@ + __/ /@ + / __/ @ +/____/ @ + @@ + _____@ + |__ /@ + /_ < @ + ___/ / @ +/____/ @ + @@ + __ __@ + / // /@ + / // /_@ +/__ __/@ + /_/ @ + @@ + ______@ + / ____/@ + /___ \ @ + ____/ / @ +/_____/ @ + @@ + _____@ + / ___/@ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ + _____@ +/__ /@ + / / @ + / / @ +/_/ @ + @@ + ____ @ + ( __ )@ + / __ |@ +/ /_/ / @ +\____/ @ + @@ + ____ @ + / __ \@ + / /_/ /@ + \__, / @ +/____/ @ + @@ + @ + _ @ + (_)@ + _ @ +(_) @ + @@ + @ + _ @ + (_)@ + _ @ +( ) @ +|/ @@ + __@ + / /@ +/ / @ +\ \ @ + \_\@ + @@ + @ + _____@ + /____/@ +/____/ @ + $ @ + @@ +__ @ +\ \ @ + \ \@ + / /@ +/_/ @ + @@ + ___ @ + /__ \@ + / _/@ + /_/ @ +(_) @ + @@ + ______ @ + / ____ \@ + / / __ `/@ +/ / /_/ / @ +\ \__,_/ @ + \____/ @@ + ___ @ + / |@ + / /| |@ + / ___ |@ +/_/ |_|@ + @@ + ____ @ + / __ )@ + / __ |@ + / /_/ / @ +/_____/ @ + @@ + ______@ + / ____/@ + / / @ +/ /___ @ +\____/ @ + @@ + ____ @ + / __ \@ + / / / /@ + / /_/ / @ +/_____/ @ + @@ + ______@ + / ____/@ + / __/ @ + / /___ @ +/_____/ @ + @@ + ______@ + / ____/@ + / /_ @ + / __/ @ +/_/ @ + @@ + ______@ + / ____/@ + / / __ @ +/ /_/ / @ +\____/ @ + @@ + __ __@ + / / / /@ + / /_/ / @ + / __ / @ +/_/ /_/ @ + @@ + ____@ + / _/@ + / / @ + _/ / @ +/___/ @ + @@ + __@ + / /@ + __ / / @ +/ /_/ / @ +\____/ @ + @@ + __ __@ + / //_/@ + / ,< @ + / /| | @ +/_/ |_| @ + @@ + __ @ + / / @ + / / @ + / /___@ +/_____/@ + @@ + __ ___@ + / |/ /@ + / /|_/ / @ + / / / / @ +/_/ /_/ @ + @@ + _ __@ + / | / /@ + / |/ / @ + / /| / @ +/_/ |_/ @ + @@ + ____ @ + / __ \@ + / / / /@ +/ /_/ / @ +\____/ @ + @@ + ____ @ + / __ \@ + / /_/ /@ + / ____/ @ +/_/ @ + @@ + ____ @ + / __ \@ + / / / /@ +/ /_/ / @ +\___\_\ @ + @@ + ____ @ + / __ \@ + / /_/ /@ + / _, _/ @ +/_/ |_| @ + @@ + _____@ + / ___/@ + \__ \ @ + ___/ / @ +/____/ @ + @@ + ______@ + /_ __/@ + / / @ + / / @ +/_/ @ + @@ + __ __@ + / / / /@ + / / / / @ +/ /_/ / @ +\____/ @ + @@ + _ __@ +| | / /@ +| | / / @ +| |/ / @ +|___/ @ + @@ + _ __@ +| | / /@ +| | /| / / @ +| |/ |/ / @ +|__/|__/ @ + @@ + _ __@ + | |/ /@ + | / @ + / | @ +/_/|_| @ + @@ +__ __@ +\ \/ /@ + \ / @ + / / @ +/_/ @ + @@ + _____@ +/__ /@ + / / @ + / /__@ +/____/@ + @@ + ___@ + / _/@ + / / @ + / / @ + / / @ +/__/ @@ +__ @ +\ \ @ + \ \ @ + \ \ @ + \_\@ + @@ + ___@ + / /@ + / / @ + / / @ + _/ / @ +/__/ @@ + //|@ + |/||@ + $ @ + $ @ +$ @ + @@ + @ + @ + @ + @ + ______@ +/_____/@@ + _ @ + ( )@ + V @ + $ @ +$ @ + @@ + @ + ____ _@ + / __ `/@ +/ /_/ / @ +\__,_/ @ + @@ + __ @ + / /_ @ + / __ \@ + / /_/ /@ +/_.___/ @ + @@ + @ + _____@ + / ___/@ +/ /__ @ +\___/ @ + @@ + __@ + ____/ /@ + / __ / @ +/ /_/ / @ +\__,_/ @ + @@ + @ + ___ @ + / _ \@ +/ __/@ +\___/ @ + @@ + ____@ + / __/@ + / /_ @ + / __/ @ +/_/ @ + @@ + @ + ____ _@ + / __ `/@ + / /_/ / @ + \__, / @ +/____/ @@ + __ @ + / /_ @ + / __ \@ + / / / /@ +/_/ /_/ @ + @@ + _ @ + (_)@ + / / @ + / / @ +/_/ @ + @@ + _ @ + (_)@ + / / @ + / / @ + __/ / @ +/___/ @@ + __ @ + / /__@ + / //_/@ + / ,< @ +/_/|_| @ + @@ + __@ + / /@ + / / @ + / / @ +/_/ @ + @@ + @ + ____ ___ @ + / __ `__ \@ + / / / / / /@ +/_/ /_/ /_/ @ + @@ + @ + ____ @ + / __ \@ + / / / /@ +/_/ /_/ @ + @@ + @ + ____ @ + / __ \@ +/ /_/ /@ +\____/ @ + @@ + @ + ____ @ + / __ \@ + / /_/ /@ + / .___/ @ +/_/ @@ + @ + ____ _@ + / __ `/@ +/ /_/ / @ +\__, / @ + /_/ @@ + @ + _____@ + / ___/@ + / / @ +/_/ @ + @@ + @ + _____@ + / ___/@ + (__ ) @ +/____/ @ + @@ + __ @ + / /_@ + / __/@ +/ /_ @ +\__/ @ + @@ + @ + __ __@ + / / / /@ +/ /_/ / @ +\__,_/ @ + @@ + @ + _ __@ +| | / /@ +| |/ / @ +|___/ @ + @@ + @ + _ __@ +| | /| / /@ +| |/ |/ / @ +|__/|__/ @ + @@ + @ + _ __@ + | |/_/@ + _> < @ +/_/|_| @ + @@ + @ + __ __@ + / / / /@ + / /_/ / @ + \__, / @ +/____/ @@ + @ + ____@ +/_ /@ + / /_@ +/___/@ + @@ + __@ + _/_/@ + _/_/ @ +< < @ +/ / @ +\_\ @@ + __@ + / /@ + / / @ + / / @ + / / @ +/_/ @@ + _ @ + | |@ + / /@ + _>_>@ + _/_/ @ +/_/ @@ + /\//@ + //\/ @ + $ @ + $ @ +$ @ + @@ + _ _ @ + (_)(_)@ + / _ | @ + / __ | @ +/_/ |_| @ + @@ + _ _ @ + (_)_(_)@ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ + _ _ @ + (_) (_)@ + / / / / @ +/ /_/ / @ +\____/ @ + @@ + _ _ @ + (_)_(_)@ + / __ `/ @ +/ /_/ / @ +\__,_/ @ + @@ + _ _ @ + (_)_(_)@ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ + _ _ @ + (_) (_)@ + / / / / @ +/ /_/ / @ +\__,_/ @ + @@ + ____ @ + / __ \@ + / / / /@ + / /_| | @ + / //__/ @ +/_/ @@ +160 NO-BREAK SPACE + $$@ + $$ @ + $$ @ + $$ @ + $$ @ +$$ @@ +161 INVERTED EXCLAMATION MARK + _ @ + (_)@ + / / @ + / / @ +/_/ @ + @@ +162 CENT SIGN + __@ + __/ /@ + / ___/@ +/ /__ @ +\ _/ @ +/_/ @@ +163 POUND SIGN + ____ @ + / ,__\@ + __/ /_ @ + _/ /___ @ +(_,____/ @ + @@ +164 CURRENCY SIGN + /|___/|@ + | __ / @ + / /_/ / @ + /___ | @ +|/ |/ @ + @@ +165 YEN SIGN + ____@ + _| / /@ + /_ __/@ +/_ __/ @ + /_/ @ + @@ +166 BROKEN BAR + __@ + / /@ + /_/ @ + __ @ + / / @ +/_/ @@ +167 SECTION SIGN + __ @ + _/ _)@ + / | | @ + | || | @ + | |_/ @ +(__/ @@ +168 DIAERESIS + _ _ @ + (_) (_)@ + $ $ @ + $ $ @ +$ $ @ + @@ +169 COPYRIGHT SIGN + ______ @ + / _____\ @ + / / ___/ |@ + / / /__ / @ +| \___/ / @ + \______/ @@ +170 FEMININE ORDINAL INDICATOR + ___ _@ + / _ `/@ + _\_,_/ @ +/____/ @ + $ @ + @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + ____@ + / / /@ +/ / / @ +\ \ \ @ + \_\_\@ + @@ +172 NOT SIGN + @ + ______@ +/___ /@ + /_/ @ + $ @ + @@ +173 SOFT HYPHEN + @ + @ + _____@ +/____/@ + $ @ + @@ +174 REGISTERED SIGN + ______ @ + / ___ \ @ + / / _ \ |@ + / / , _/ / @ +| /_/|_| / @ + \______/ @@ +175 MACRON + ______@ +/_____/@ + $ @ + $ @ +$ @ + @@ +176 DEGREE SIGN + ___ @ + / _ \@ +/ // /@ +\___/ @ + $ @ + @@ +177 PLUS-MINUS SIGN + __ @ + __/ /_@ + /_ __/@ + __/_/_ @ +/_____/ @ + @@ +178 SUPERSCRIPT TWO + ___ @ + |_ |@ + / __/ @ +/____/ @ + $ @ + @@ +179 SUPERSCRIPT THREE + ____@ + |_ /@ + _/_ < @ +/____/ @ + $ @ + @@ +180 ACUTE ACCENT + __@ + /_/@ + $ @ + $ @ +$ @ + @@ +181 MICRO SIGN + @ + __ __@ + / / / /@ + / /_/ / @ + / ._,_/ @ +/_/ @@ +182 PILCROW SIGN + _______@ + / _ /@ +/ (/ / / @ +\_ / / @ + /_/_/ @ + @@ +183 MIDDLE DOT + @ + _ @ +(_)@ + $ @ +$ @ + @@ +184 CEDILLA + @ + @ + @ + @ + _ @ +/_)@@ +185 SUPERSCRIPT ONE + ___@ + < /@ + / / @ +/_/ @ +$ @ + @@ +186 MASCULINE ORDINAL INDICATOR + ___ @ + / _ \@ + _\___/@ +/____/ @ + $ @ + @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +____ @ +\ \ \ @ + \ \ \@ + / / /@ +/_/_/ @ + @@ +188 VULGAR FRACTION ONE QUARTER + ___ __ @ + < / _/_/ @ + / /_/_/___@ +/_//_// / /@ + /_/ /_ _/@ + /_/ @@ +189 VULGAR FRACTION ONE HALF + ___ __ @ + < / _/_/__ @ + / /_/_/|_ |@ +/_//_/ / __/ @ + /_/ /____/ @ + @@ +190 VULGAR FRACTION THREE QUARTERS + ____ __ @ + |_ / _/_/ @ + _/_ < _/_/___@ +/____//_// / /@ + /_/ /_ _/@ + /_/ @@ +191 INVERTED QUESTION MARK + _ @ + (_)@ + _/ / @ +/ _/_ @ +\___/ @ + @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + __ @ + _\_\@ + / _ |@ + / __ |@ +/_/ |_|@ + @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + __@ + _/_/@ + / _ |@ + / __ |@ +/_/ |_|@ + @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + //|@ + _|/||@ + / _ | @ + / __ | @ +/_/ |_| @ + @@ +195 LATIN CAPITAL LETTER A WITH TILDE + /\//@ + _//\/ @ + / _ | @ + / __ | @ +/_/ |_| @ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + _ _ @ + (_)(_)@ + / _ | @ + / __ | @ +/_/ |_| @ + @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + (())@ + / |@ + / /| |@ + / ___ |@ +/_/ |_|@ + @@ +198 LATIN CAPITAL LETTER AE + __________@ + / ____/@ + / /| __/ @ + / __ /___ @ +/_/ /_____/ @ + @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + ______@ + / ____/@ + / / @ +/ /___ @ +\____/ @ + /_) @@ +200 LATIN CAPITAL LETTER E WITH GRAVE + __ @ + _\_\@ + / __/@ + / _/ @ +/___/ @ + @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + __@ + _/_/@ + / __/@ + / _/ @ +/___/ @ + @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + //|@ + _|/||@ + / __/ @ + / _/ @ +/___/ @ + @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + _ _ @ + (_)(_)@ + / __/ @ + / _/ @ +/___/ @ + @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + __ @ + _\_\@ + / _/@ + _/ / @ +/___/ @ + @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + __@ + _/_/@ + / _/@ + _/ / @ +/___/ @ + @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + //|@ + _|/||@ + / _/ @ + _/ / @ +/___/ @ + @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + _ _ @ + (_)(_)@ + / _/ @ + _/ / @ +/___/ @ + @@ +208 LATIN CAPITAL LETTER ETH + ____ @ + / __ \@ + __/ /_/ /@ +/_ __/ / @ + /_____/ @ + @@ +209 LATIN CAPITAL LETTER N WITH TILDE + /\//@ + _//\/ @ + / |/ / @ + / / @ +/_/|_/ @ + @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + __ @ + __\_\@ + / __ \@ +/ /_/ /@ +\____/ @ + @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + __@ + __/_/@ + / __ \@ +/ /_/ /@ +\____/ @ + @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + //|@ + _|/||@ + / __ \@ +/ /_/ /@ +\____/ @ + @@ +213 LATIN CAPITAL LETTER O WITH TILDE + /\//@ + _//\/ @ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + _ _ @ + (_)_(_)@ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ +215 MULTIPLICATION SIGN + @ + @ + /|/|@ + > < @ +|/|/ @ + @@ +216 LATIN CAPITAL LETTER O WITH STROKE + _____ @ + / _// \@ + / //// /@ +/ //// / @ +\_//__/ @ + @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + __ @ + __\_\_@ + / / / /@ +/ /_/ / @ +\____/ @ + @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + __ @ + __/_/_@ + / / / /@ +/ /_/ / @ +\____/ @ + @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + //| @ + _|/||_@ + / / / /@ +/ /_/ / @ +\____/ @ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + _ _ @ + (_) (_)@ + / / / / @ +/ /_/ / @ +\____/ @ + @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + __ @ +__/_/_@ +\ \/ /@ + \ / @ + /_/ @ + @@ +222 LATIN CAPITAL LETTER THORN + __ @ + / /_ @ + / __ \@ + / ____/@ +/_/ @ + @@ +223 LATIN SMALL LETTER SHARP S + ____ @ + / __ \@ + / / / /@ + / /_| | @ + / //__/ @ +/_/ @@ +224 LATIN SMALL LETTER A WITH GRAVE + __ @ + __\_\_@ + / __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +225 LATIN SMALL LETTER A WITH ACUTE + __ @ + __/_/_@ + / __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + //| @ + _|/||_@ + / __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +227 LATIN SMALL LETTER A WITH TILDE + /\//@ + _//\/_@ + / __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + _ _ @ + (_)_(_)@ + / __ `/ @ +/ /_/ / @ +\__,_/ @ + @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + __ @ + __(())@ + / __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +230 LATIN SMALL LETTER AE + @ + ____ ___ @ + / __ ` _ \@ +/ /_/ __/@ +\__,_____/ @ + @@ +231 LATIN SMALL LETTER C WITH CEDILLA + @ + _____@ + / ___/@ +/ /__ @ +\___/ @ +/_) @@ +232 LATIN SMALL LETTER E WITH GRAVE + __ @ + _\_\@ + / _ \@ +/ __/@ +\___/ @ + @@ +233 LATIN SMALL LETTER E WITH ACUTE + __@ + _/_/@ + / _ \@ +/ __/@ +\___/ @ + @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + //|@ + _|/||@ + / _ \ @ +/ __/ @ +\___/ @ + @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + _ _ @ + (_)(_)@ + / _ \ @ +/ __/ @ +\___/ @ + @@ +236 LATIN SMALL LETTER I WITH GRAVE + __ @ + \_\@ + / / @ + / / @ +/_/ @ + @@ +237 LATIN SMALL LETTER I WITH ACUTE + __@ + /_/@ + / / @ + / / @ +/_/ @ + @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + //|@ + |/||@ + / / @ + / / @ +/_/ @ + @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + _ _ @ + (_)_(_)@ + / / @ + / / @ +/_/ @ + @@ +240 LATIN SMALL LETTER ETH + || @ + =||=@ + ___ || @ +/ __` | @ +\____/ @ + @@ +241 LATIN SMALL LETTER N WITH TILDE + /\//@ + _//\/ @ + / __ \ @ + / / / / @ +/_/ /_/ @ + @@ +242 LATIN SMALL LETTER O WITH GRAVE + __ @ + __\_\@ + / __ \@ +/ /_/ /@ +\____/ @ + @@ +243 LATIN SMALL LETTER O WITH ACUTE + __@ + __/_/@ + / __ \@ +/ /_/ /@ +\____/ @ + @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + //|@ + _|/||@ + / __ \@ +/ /_/ /@ +\____/ @ + @@ +245 LATIN SMALL LETTER O WITH TILDE + /\//@ + _//\/ @ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + _ _ @ + (_)_(_)@ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ +247 DIVISION SIGN + @ + _ @ + __(_)_@ +/_____/@ + (_) @ + @@ +248 LATIN SMALL LETTER O WITH STROKE + @ + _____ @ + / _// \@ +/ //// /@ +\_//__/ @ + @@ +249 LATIN SMALL LETTER U WITH GRAVE + __ @ + __\_\_@ + / / / /@ +/ /_/ / @ +\__,_/ @ + @@ +250 LATIN SMALL LETTER U WITH ACUTE + __ @ + __/_/_@ + / / / /@ +/ /_/ / @ +\__,_/ @ + @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + //| @ + _|/||_@ + / / / /@ +/ /_/ / @ +\__,_/ @ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + _ _ @ + (_) (_)@ + / / / / @ +/ /_/ / @ +\__,_/ @ + @@ +253 LATIN SMALL LETTER Y WITH ACUTE + __ @ + __/_/_@ + / / / /@ + / /_/ / @ + \__, / @ +/____/ @@ +254 LATIN SMALL LETTER THORN + __ @ + / /_ @ + / __ \@ + / /_/ /@ + / .___/ @ +/_/ @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + _ _ @ + (_) (_)@ + / / / / @ + / /_/ / @ + \__, / @ +/____/ @@ diff --git a/fonts/standard.flf b/fonts/standard.flf new file mode 100644 index 0000000..4fd2b11 --- /dev/null +++ b/fonts/standard.flf @@ -0,0 +1,2227 @@ +flf2a$ 6 5 16 15 11 0 24463 +Standard by Glenn Chappell & Ian Chai 3/93 -- based on Frank's .sig +Includes ISO Latin-1 +figlet release 2.1 -- 12 Aug 1994 +Modified for figlet 2.2 by John Cowan + to add Latin-{2,3,4,5} support (Unicode U+0100-017F). +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + $@ + $@ + $@ + $@ + $@ + $@@ + _ @ + | |@ + | |@ + |_|@ + (_)@ + @@ + _ _ @ + ( | )@ + V V @ + $ @ + $ @ + @@ + _ _ @ + _| || |_ @ + |_ .. _|@ + |_ _|@ + |_||_| @ + @@ + _ @ + | | @ + / __)@ + \__ \@ + ( /@ + |_| @@ + _ __@ + (_)/ /@ + / / @ + / /_ @ + /_/(_)@ + @@ + ___ @ + ( _ ) @ + / _ \/\@ + | (_> <@ + \___/\/@ + @@ + _ @ + ( )@ + |/ @ + $ @ + $ @ + @@ + __@ + / /@ + | | @ + | | @ + | | @ + \_\@@ + __ @ + \ \ @ + | |@ + | |@ + | |@ + /_/ @@ + @ + __/\__@ + \ /@ + /_ _\@ + \/ @ + @@ + @ + _ @ + _| |_ @ + |_ _|@ + |_| @ + @@ + @ + @ + @ + _ @ + ( )@ + |/ @@ + @ + @ + _____ @ + |_____|@ + $ @ + @@ + @ + @ + @ + _ @ + (_)@ + @@ + __@ + / /@ + / / @ + / / @ + /_/ @ + @@ + ___ @ + / _ \ @ + | | | |@ + | |_| |@ + \___/ @ + @@ + _ @ + / |@ + | |@ + | |@ + |_|@ + @@ + ____ @ + |___ \ @ + __) |@ + / __/ @ + |_____|@ + @@ + _____ @ + |___ / @ + |_ \ @ + ___) |@ + |____/ @ + @@ + _ _ @ + | || | @ + | || |_ @ + |__ _|@ + |_| @ + @@ + ____ @ + | ___| @ + |___ \ @ + ___) |@ + |____/ @ + @@ + __ @ + / /_ @ + | '_ \ @ + | (_) |@ + \___/ @ + @@ + _____ @ + |___ |@ + / / @ + / / @ + /_/ @ + @@ + ___ @ + ( _ ) @ + / _ \ @ + | (_) |@ + \___/ @ + @@ + ___ @ + / _ \ @ + | (_) |@ + \__, |@ + /_/ @ + @@ + @ + _ @ + (_)@ + _ @ + (_)@ + @@ + @ + _ @ + (_)@ + _ @ + ( )@ + |/ @@ + __@ + / /@ + / / @ + \ \ @ + \_\@ + @@ + @ + _____ @ + |_____|@ + |_____|@ + $ @ + @@ + __ @ + \ \ @ + \ \@ + / /@ + /_/ @ + @@ + ___ @ + |__ \@ + / /@ + |_| @ + (_) @ + @@ + ____ @ + / __ \ @ + / / _` |@ + | | (_| |@ + \ \__,_|@ + \____/ @@ + _ @ + / \ @ + / _ \ @ + / ___ \ @ + /_/ \_\@ + @@ + ____ @ + | __ ) @ + | _ \ @ + | |_) |@ + |____/ @ + @@ + ____ @ + / ___|@ + | | @ + | |___ @ + \____|@ + @@ + ____ @ + | _ \ @ + | | | |@ + | |_| |@ + |____/ @ + @@ + _____ @ + | ____|@ + | _| @ + | |___ @ + |_____|@ + @@ + _____ @ + | ___|@ + | |_ @ + | _| @ + |_| @ + @@ + ____ @ + / ___|@ + | | _ @ + | |_| |@ + \____|@ + @@ + _ _ @ + | | | |@ + | |_| |@ + | _ |@ + |_| |_|@ + @@ + ___ @ + |_ _|@ + | | @ + | | @ + |___|@ + @@ + _ @ + | |@ + _ | |@ + | |_| |@ + \___/ @ + @@ + _ __@ + | |/ /@ + | ' / @ + | . \ @ + |_|\_\@ + @@ + _ @ + | | @ + | | @ + | |___ @ + |_____|@ + @@ + __ __ @ + | \/ |@ + | |\/| |@ + | | | |@ + |_| |_|@ + @@ + _ _ @ + | \ | |@ + | \| |@ + | |\ |@ + |_| \_|@ + @@ + ___ @ + / _ \ @ + | | | |@ + | |_| |@ + \___/ @ + @@ + ____ @ + | _ \ @ + | |_) |@ + | __/ @ + |_| @ + @@ + ___ @ + / _ \ @ + | | | |@ + | |_| |@ + \__\_\@ + @@ + ____ @ + | _ \ @ + | |_) |@ + | _ < @ + |_| \_\@ + @@ + ____ @ + / ___| @ + \___ \ @ + ___) |@ + |____/ @ + @@ + _____ @ + |_ _|@ + | | @ + | | @ + |_| @ + @@ + _ _ @ + | | | |@ + | | | |@ + | |_| |@ + \___/ @ + @@ + __ __@ + \ \ / /@ + \ \ / / @ + \ V / @ + \_/ @ + @@ + __ __@ + \ \ / /@ + \ \ /\ / / @ + \ V V / @ + \_/\_/ @ + @@ + __ __@ + \ \/ /@ + \ / @ + / \ @ + /_/\_\@ + @@ + __ __@ + \ \ / /@ + \ V / @ + | | @ + |_| @ + @@ + _____@ + |__ /@ + / / @ + / /_ @ + /____|@ + @@ + __ @ + | _|@ + | | @ + | | @ + | | @ + |__|@@ + __ @ + \ \ @ + \ \ @ + \ \ @ + \_\@ + @@ + __ @ + |_ |@ + | |@ + | |@ + | |@ + |__|@@ + /\ @ + |/\|@ + $ @ + $ @ + $ @ + @@ + @ + @ + @ + @ + _____ @ + |_____|@@ + _ @ + ( )@ + \|@ + $ @ + $ @ + @@ + @ + __ _ @ + / _` |@ + | (_| |@ + \__,_|@ + @@ + _ @ + | |__ @ + | '_ \ @ + | |_) |@ + |_.__/ @ + @@ + @ + ___ @ + / __|@ + | (__ @ + \___|@ + @@ + _ @ + __| |@ + / _` |@ + | (_| |@ + \__,_|@ + @@ + @ + ___ @ + / _ \@ + | __/@ + \___|@ + @@ + __ @ + / _|@ + | |_ @ + | _|@ + |_| @ + @@ + @ + __ _ @ + / _` |@ + | (_| |@ + \__, |@ + |___/ @@ + _ @ + | |__ @ + | '_ \ @ + | | | |@ + |_| |_|@ + @@ + _ @ + (_)@ + | |@ + | |@ + |_|@ + @@ + _ @ + (_)@ + | |@ + | |@ + _/ |@ + |__/ @@ + _ @ + | | __@ + | |/ /@ + | < @ + |_|\_\@ + @@ + _ @ + | |@ + | |@ + | |@ + |_|@ + @@ + @ + _ __ ___ @ + | '_ ` _ \ @ + | | | | | |@ + |_| |_| |_|@ + @@ + @ + _ __ @ + | '_ \ @ + | | | |@ + |_| |_|@ + @@ + @ + ___ @ + / _ \ @ + | (_) |@ + \___/ @ + @@ + @ + _ __ @ + | '_ \ @ + | |_) |@ + | .__/ @ + |_| @@ + @ + __ _ @ + / _` |@ + | (_| |@ + \__, |@ + |_|@@ + @ + _ __ @ + | '__|@ + | | @ + |_| @ + @@ + @ + ___ @ + / __|@ + \__ \@ + |___/@ + @@ + _ @ + | |_ @ + | __|@ + | |_ @ + \__|@ + @@ + @ + _ _ @ + | | | |@ + | |_| |@ + \__,_|@ + @@ + @ + __ __@ + \ \ / /@ + \ V / @ + \_/ @ + @@ + @ + __ __@ + \ \ /\ / /@ + \ V V / @ + \_/\_/ @ + @@ + @ + __ __@ + \ \/ /@ + > < @ + /_/\_\@ + @@ + @ + _ _ @ + | | | |@ + | |_| |@ + \__, |@ + |___/ @@ + @ + ____@ + |_ /@ + / / @ + /___|@ + @@ + __@ + / /@ + | | @ + < < @ + | | @ + \_\@@ + _ @ + | |@ + | |@ + | |@ + | |@ + |_|@@ + __ @ + \ \ @ + | | @ + > >@ + | | @ + /_/ @@ + /\/|@ + |/\/ @ + $ @ + $ @ + $ @ + @@ + _ _ @ + (_)_(_)@ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ + _ _ @ + (_)_(_)@ + / _ \ @ + | |_| |@ + \___/ @ + @@ + _ _ @ + (_) (_)@ + | | | |@ + | |_| |@ + \___/ @ + @@ + _ _ @ + (_)_(_)@ + / _` |@ + | (_| |@ + \__,_|@ + @@ + _ _ @ + (_)_(_)@ + / _ \ @ + | (_) |@ + \___/ @ + @@ + _ _ @ + (_) (_)@ + | | | |@ + | |_| |@ + \__,_|@ + @@ + ___ @ + / _ \@ + | |/ /@ + | |\ \@ + | ||_/@ + |_| @@ +160 NO-BREAK SPACE + $@ + $@ + $@ + $@ + $@ + $@@ +161 INVERTED EXCLAMATION MARK + _ @ + (_)@ + | |@ + | |@ + |_|@ + @@ +162 CENT SIGN + _ @ + | | @ + / __)@ + | (__ @ + \ )@ + |_| @@ +163 POUND SIGN + ___ @ + / ,_\ @ + _| |_ @ + | |___ @ + (_,____|@ + @@ +164 CURRENCY SIGN + /\___/\@ + \ _ /@ + | (_) |@ + / ___ \@ + \/ \/@ + @@ +165 YEN SIGN + __ __ @ + \ V / @ + |__ __|@ + |__ __|@ + |_| @ + @@ +166 BROKEN BAR + _ @ + | |@ + |_|@ + _ @ + | |@ + |_|@@ +167 SECTION SIGN + __ @ + _/ _)@ + / \ \ @ + \ \\ \@ + \ \_/@ + (__/ @@ +168 DIAERESIS + _ _ @ + (_) (_)@ + $ $ @ + $ $ @ + $ $ @ + @@ +169 COPYRIGHT SIGN + _____ @ + / ___ \ @ + / / __| \ @ + | | (__ |@ + \ \___| / @ + \_____/ @@ +170 FEMININE ORDINAL INDICATOR + __ _ @ + / _` |@ + \__,_|@ + |____|@ + $ @ + @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + ____@ + / / /@ + / / / @ + \ \ \ @ + \_\_\@ + @@ +172 NOT SIGN + @ + _____ @ + |___ |@ + |_|@ + $ @ + @@ +173 SOFT HYPHEN + @ + @ + ____ @ + |____|@ + $ @ + @@ +174 REGISTERED SIGN + _____ @ + / ___ \ @ + / | _ \ \ @ + | | / |@ + \ |_|_\ / @ + \_____/ @@ +175 MACRON + _____ @ + |_____|@ + $ @ + $ @ + $ @ + @@ +176 DEGREE SIGN + __ @ + / \ @ + | () |@ + \__/ @ + $ @ + @@ +177 PLUS-MINUS SIGN + _ @ + _| |_ @ + |_ _|@ + _|_|_ @ + |_____|@ + @@ +178 SUPERSCRIPT TWO + ___ @ + |_ )@ + / / @ + /___|@ + $ @ + @@ +179 SUPERSCRIPT THREE + ____@ + |__ /@ + |_ \@ + |___/@ + $ @ + @@ +180 ACUTE ACCENT + __@ + /_/@ + $ @ + $ @ + $ @ + @@ +181 MICRO SIGN + @ + _ _ @ + | | | |@ + | |_| |@ + | ._,_|@ + |_| @@ +182 PILCROW SIGN + _____ @ + / |@ + | (| | |@ + \__ | |@ + |_|_|@ + @@ +183 MIDDLE DOT + @ + _ @ + (_)@ + $ @ + $ @ + @@ +184 CEDILLA + @ + @ + @ + @ + _ @ + )_)@@ +185 SUPERSCRIPT ONE + _ @ + / |@ + | |@ + |_|@ + $ @ + @@ +186 MASCULINE ORDINAL INDICATOR + ___ @ + / _ \@ + \___/@ + |___|@ + $ @ + @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + ____ @ + \ \ \ @ + \ \ \@ + / / /@ + /_/_/ @ + @@ +188 VULGAR FRACTION ONE QUARTER + _ __ @ + / | / / _ @ + | |/ / | | @ + |_/ /|_ _|@ + /_/ |_| @ + @@ +189 VULGAR FRACTION ONE HALF + _ __ @ + / | / /__ @ + | |/ /_ )@ + |_/ / / / @ + /_/ /___|@ + @@ +190 VULGAR FRACTION THREE QUARTERS + ____ __ @ + |__ / / / _ @ + |_ \/ / | | @ + |___/ /|_ _|@ + /_/ |_| @ + @@ +191 INVERTED QUESTION MARK + _ @ + (_) @ + | | @ + / /_ @ + \___|@ + @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + __ @ + \_\ @ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + __ @ + /_/ @ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + //\ @ + |/_\| @ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ +195 LATIN CAPITAL LETTER A WITH TILDE + /\/| @ + |/\/ @ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + _ _ @ + (_)_(_)@ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + _ @ + (o) @ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ +198 LATIN CAPITAL LETTER AE + ______ @ + / ____|@ + / _ _| @ + / __ |___ @ + /_/ |_____|@ + @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + ____ @ + / ___|@ + | | @ + | |___ @ + \____|@ + )_) @@ +200 LATIN CAPITAL LETTER E WITH GRAVE + __ @ + _\_\_ @ + | ____|@ + | _|_ @ + |_____|@ + @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + __ @ + _/_/_ @ + | ____|@ + | _|_ @ + |_____|@ + @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + //\ @ + |/_\| @ + | ____|@ + | _|_ @ + |_____|@ + @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + _ _ @ + (_)_(_)@ + | ____|@ + | _|_ @ + |_____|@ + @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + __ @ + \_\ @ + |_ _|@ + | | @ + |___|@ + @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + __ @ + /_/ @ + |_ _|@ + | | @ + |___|@ + @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + //\ @ + |/_\|@ + |_ _|@ + | | @ + |___|@ + @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + _ _ @ + (_)_(_)@ + |_ _| @ + | | @ + |___| @ + @@ +208 LATIN CAPITAL LETTER ETH + ____ @ + | _ \ @ + _| |_| |@ + |__ __| |@ + |____/ @ + @@ +209 LATIN CAPITAL LETTER N WITH TILDE + /\/|@ + |/\/ @ + | \| |@ + | .` |@ + |_|\_|@ + @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + __ @ + \_\ @ + / _ \ @ + | |_| |@ + \___/ @ + @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + __ @ + /_/ @ + / _ \ @ + | |_| |@ + \___/ @ + @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + //\ @ + |/_\| @ + / _ \ @ + | |_| |@ + \___/ @ + @@ +213 LATIN CAPITAL LETTER O WITH TILDE + /\/| @ + |/\/ @ + / _ \ @ + | |_| |@ + \___/ @ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + _ _ @ + (_)_(_)@ + / _ \ @ + | |_| |@ + \___/ @ + @@ +215 MULTIPLICATION SIGN + @ + @ + /\/\@ + > <@ + \/\/@ + @@ +216 LATIN CAPITAL LETTER O WITH STROKE + ____ @ + / _// @ + | |// |@ + | //| |@ + //__/ @ + @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + __ @ + _\_\_ @ + | | | |@ + | |_| |@ + \___/ @ + @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + __ @ + _/_/_ @ + | | | |@ + | |_| |@ + \___/ @ + @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + //\ @ + |/ \| @ + | | | |@ + | |_| |@ + \___/ @ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + _ _ @ + (_) (_)@ + | | | |@ + | |_| |@ + \___/ @ + @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + __ @ + __/_/__@ + \ \ / /@ + \ V / @ + |_| @ + @@ +222 LATIN CAPITAL LETTER THORN + _ @ + | |___ @ + | __ \@ + | ___/@ + |_| @ + @@ +223 LATIN SMALL LETTER SHARP S + ___ @ + / _ \@ + | |/ /@ + | |\ \@ + | ||_/@ + |_| @@ +224 LATIN SMALL LETTER A WITH GRAVE + __ @ + \_\_ @ + / _` |@ + | (_| |@ + \__,_|@ + @@ +225 LATIN SMALL LETTER A WITH ACUTE + __ @ + /_/_ @ + / _` |@ + | (_| |@ + \__,_|@ + @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + //\ @ + |/_\| @ + / _` |@ + | (_| |@ + \__,_|@ + @@ +227 LATIN SMALL LETTER A WITH TILDE + /\/| @ + |/\/_ @ + / _` |@ + | (_| |@ + \__,_|@ + @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + _ _ @ + (_)_(_)@ + / _` |@ + | (_| |@ + \__,_|@ + @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + __ @ + (()) @ + / _ '|@ + | (_| |@ + \__,_|@ + @@ +230 LATIN SMALL LETTER AE + @ + __ ____ @ + / _` _ \@ + | (_| __/@ + \__,____|@ + @@ +231 LATIN SMALL LETTER C WITH CEDILLA + @ + ___ @ + / __|@ + | (__ @ + \___|@ + )_) @@ +232 LATIN SMALL LETTER E WITH GRAVE + __ @ + \_\ @ + / _ \@ + | __/@ + \___|@ + @@ +233 LATIN SMALL LETTER E WITH ACUTE + __ @ + /_/ @ + / _ \@ + | __/@ + \___|@ + @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + //\ @ + |/_\|@ + / _ \@ + | __/@ + \___|@ + @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + _ _ @ + (_)_(_)@ + / _ \ @ + | __/ @ + \___| @ + @@ +236 LATIN SMALL LETTER I WITH GRAVE + __ @ + \_\@ + | |@ + | |@ + |_|@ + @@ +237 LATIN SMALL LETTER I WITH ACUTE + __@ + /_/@ + | |@ + | |@ + |_|@ + @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + //\ @ + |/_\|@ + | | @ + | | @ + |_| @ + @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + _ _ @ + (_)_(_)@ + | | @ + | | @ + |_| @ + @@ +240 LATIN SMALL LETTER ETH + /\/\ @ + > < @ + _\/\ |@ + / __` |@ + \____/ @ + @@ +241 LATIN SMALL LETTER N WITH TILDE + /\/| @ + |/\/ @ + | '_ \ @ + | | | |@ + |_| |_|@ + @@ +242 LATIN SMALL LETTER O WITH GRAVE + __ @ + \_\ @ + / _ \ @ + | (_) |@ + \___/ @ + @@ +243 LATIN SMALL LETTER O WITH ACUTE + __ @ + /_/ @ + / _ \ @ + | (_) |@ + \___/ @ + @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + //\ @ + |/_\| @ + / _ \ @ + | (_) |@ + \___/ @ + @@ +245 LATIN SMALL LETTER O WITH TILDE + /\/| @ + |/\/ @ + / _ \ @ + | (_) |@ + \___/ @ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + _ _ @ + (_)_(_)@ + / _ \ @ + | (_) |@ + \___/ @ + @@ +247 DIVISION SIGN + @ + _ @ + _(_)_ @ + |_____|@ + (_) @ + @@ +248 LATIN SMALL LETTER O WITH STROKE + @ + ____ @ + / _//\ @ + | (//) |@ + \//__/ @ + @@ +249 LATIN SMALL LETTER U WITH GRAVE + __ @ + _\_\_ @ + | | | |@ + | |_| |@ + \__,_|@ + @@ +250 LATIN SMALL LETTER U WITH ACUTE + __ @ + _/_/_ @ + | | | |@ + | |_| |@ + \__,_|@ + @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + //\ @ + |/ \| @ + | | | |@ + | |_| |@ + \__,_|@ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + _ _ @ + (_) (_)@ + | | | |@ + | |_| |@ + \__,_|@ + @@ +253 LATIN SMALL LETTER Y WITH ACUTE + __ @ + _/_/_ @ + | | | |@ + | |_| |@ + \__, |@ + |___/ @@ +254 LATIN SMALL LETTER THORN + _ @ + | |__ @ + | '_ \ @ + | |_) |@ + | .__/ @ + |_| @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + _ _ @ + (_) (_)@ + | | | |@ + | |_| |@ + \__, |@ + |___/ @@ +0x0100 LATIN CAPITAL LETTER A WITH MACRON + ____ @ + /___/ @ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ +0x0101 LATIN SMALL LETTER A WITH MACRON + ___ @ + /_ _/@ + / _` |@ + | (_| |@ + \__,_|@ + @@ +0x0102 LATIN CAPITAL LETTER A WITH BREVE + _ _ @ + \\_// @ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ +0x0103 LATIN SMALL LETTER A WITH BREVE + \_/ @ + ___ @ + / _` |@ + | (_| |@ + \__,_|@ + @@ +0x0104 LATIN CAPITAL LETTER A WITH OGONEK + @ + _ @ + /_\ @ + / _ \ @ + /_/ \_\@ + (_(@@ +0x0105 LATIN SMALL LETTER A WITH OGONEK + @ + __ _ @ + / _` |@ + | (_| |@ + \__,_|@ + (_(@@ +0x0106 LATIN CAPITAL LETTER C WITH ACUTE + __ @ + _/_/ @ + / ___|@ + | |___ @ + \____|@ + @@ +0x0107 LATIN SMALL LETTER C WITH ACUTE + __ @ + /__/@ + / __|@ + | (__ @ + \___|@ + @@ +0x0108 LATIN CAPITAL LETTER C WITH CIRCUMFLEX + /\ @ + _//\\@ + / ___|@ + | |___ @ + \____|@ + @@ +0x0109 LATIN SMALL LETTER C WITH CIRCUMFLEX + /\ @ + /_\ @ + / __|@ + | (__ @ + \___|@ + @@ +0x010A LATIN CAPITAL LETTER C WITH DOT ABOVE + [] @ + ____ @ + / ___|@ + | |___ @ + \____|@ + @@ +0x010B LATIN SMALL LETTER C WITH DOT ABOVE + [] @ + ___ @ + / __|@ + | (__ @ + \___|@ + @@ +0x010C LATIN CAPITAL LETTER C WITH CARON + \\// @ + _\/_ @ + / ___|@ + | |___ @ + \____|@ + @@ +0x010D LATIN SMALL LETTER C WITH CARON + \\//@ + _\/ @ + / __|@ + | (__ @ + \___|@ + @@ +0x010E LATIN CAPITAL LETTER D WITH CARON + \\// @ + __\/ @ + | _ \ @ + | |_| |@ + |____/ @ + @@ +0x010F LATIN SMALL LETTER D WITH CARON + \/ _ @ + __| |@ + / _` |@ + | (_| |@ + \__,_|@ + @@ +0x0110 LATIN CAPITAL LETTER D WITH STROKE + ____ @ + |_ __ \ @ + /| |/ | |@ + /|_|/_| |@ + |_____/ @ + @@ +0x0111 LATIN SMALL LETTER D WITH STROKE + ---|@ + __| |@ + / _` |@ + | (_| |@ + \__,_|@ + @@ +0x0112 LATIN CAPITAL LETTER E WITH MACRON + ____ @ + /___/ @ + | ____|@ + | _|_ @ + |_____|@ + @@ +0x0113 LATIN SMALL LETTER E WITH MACRON + ____@ + /_ _/@ + / _ \ @ + | __/ @ + \___| @ + @@ +0x0114 LATIN CAPITAL LETTER E WITH BREVE + _ _ @ + \\_// @ + | ____|@ + | _|_ @ + |_____|@ + @@ +0x0115 LATIN SMALL LETTER E WITH BREVE + \\ //@ + -- @ + / _ \ @ + | __/ @ + \___| @ + @@ +0x0116 LATIN CAPITAL LETTER E WITH DOT ABOVE + [] @ + _____ @ + | ____|@ + | _|_ @ + |_____|@ + @@ +0x0117 LATIN SMALL LETTER E WITH DOT ABOVE + [] @ + __ @ + / _ \@ + | __/@ + \___|@ + @@ +0x0118 LATIN CAPITAL LETTER E WITH OGONEK + @ + _____ @ + | ____|@ + | _|_ @ + |_____|@ + (__(@@ +0x0119 LATIN SMALL LETTER E WITH OGONEK + @ + ___ @ + / _ \@ + | __/@ + \___|@ + (_(@@ +0x011A LATIN CAPITAL LETTER E WITH CARON + \\// @ + __\/_ @ + | ____|@ + | _|_ @ + |_____|@ + @@ +0x011B LATIN SMALL LETTER E WITH CARON + \\//@ + \/ @ + / _ \@ + | __/@ + \___|@ + @@ +0x011C LATIN CAPITAL LETTER G WITH CIRCUMFLEX + _/\_ @ + / ___|@ + | | _ @ + | |_| |@ + \____|@ + @@ +0x011D LATIN SMALL LETTER G WITH CIRCUMFLEX + /\ @ + _/_ \@ + / _` |@ + | (_| |@ + \__, |@ + |___/ @@ +0x011E LATIN CAPITAL LETTER G WITH BREVE + _\/_ @ + / ___|@ + | | _ @ + | |_| |@ + \____|@ + @@ +0x011F LATIN SMALL LETTER G WITH BREVE + \___/ @ + __ _ @ + / _` |@ + | (_| |@ + \__, |@ + |___/ @@ +0x0120 LATIN CAPITAL LETTER G WITH DOT ABOVE + _[]_ @ + / ___|@ + | | _ @ + | |_| |@ + \____|@ + @@ +0x0121 LATIN SMALL LETTER G WITH DOT ABOVE + [] @ + __ _ @ + / _` |@ + | (_| |@ + \__, |@ + |___/ @@ +0x0122 LATIN CAPITAL LETTER G WITH CEDILLA + ____ @ + / ___|@ + | | _ @ + | |_| |@ + \____|@ + )__) @@ +0x0123 LATIN SMALL LETTER G WITH CEDILLA + @ + __ _ @ + / _` |@ + | (_| |@ + \__, |@ + |_))))@@ +0x0124 LATIN CAPITAL LETTER H WITH CIRCUMFLEX + _/ \_ @ + | / \ |@ + | |_| |@ + | _ |@ + |_| |_|@ + @@ +0x0125 LATIN SMALL LETTER H WITH CIRCUMFLEX + _ /\ @ + | |//\ @ + | '_ \ @ + | | | |@ + |_| |_|@ + @@ +0x0126 LATIN CAPITAL LETTER H WITH STROKE + _ _ @ + | |=| |@ + | |_| |@ + | _ |@ + |_| |_|@ + @@ +0x0127 LATIN SMALL LETTER H WITH STROKE + _ @ + |=|__ @ + | '_ \ @ + | | | |@ + |_| |_|@ + @@ +0x0128 LATIN CAPITAL LETTER I WITH TILDE + /\//@ + |_ _|@ + | | @ + | | @ + |___|@ + @@ +0x0129 LATIN SMALL LETTER I WITH TILDE + @ + /\/@ + | |@ + | |@ + |_|@ + @@ +0x012A LATIN CAPITAL LETTER I WITH MACRON + /___/@ + |_ _|@ + | | @ + | | @ + |___|@ + @@ +0x012B LATIN SMALL LETTER I WITH MACRON + ____@ + /___/@ + | | @ + | | @ + |_| @ + @@ +0x012C LATIN CAPITAL LETTER I WITH BREVE + \__/@ + |_ _|@ + | | @ + | | @ + |___|@ + @@ +0x012D LATIN SMALL LETTER I WITH BREVE + @ + \_/@ + | |@ + | |@ + |_|@ + @@ +0x012E LATIN CAPITAL LETTER I WITH OGONEK + ___ @ + |_ _|@ + | | @ + | | @ + |___|@ + (__(@@ +0x012F LATIN SMALL LETTER I WITH OGONEK + _ @ + (_) @ + | | @ + | | @ + |_|_@ + (_(@@ +0x0130 LATIN CAPITAL LETTER I WITH DOT ABOVE + _[] @ + |_ _|@ + | | @ + | | @ + |___|@ + @@ +0x0131 LATIN SMALL LETTER DOTLESS I + @ + _ @ + | |@ + | |@ + |_|@ + @@ +0x0132 LATIN CAPITAL LIGATURE IJ + ___ _ @ + |_ _|| |@ + | | | |@ + | |_| |@ + |__|__/ @ + @@ +0x0133 LATIN SMALL LIGATURE IJ + _ _ @ + (_) (_)@ + | | | |@ + | | | |@ + |_|_/ |@ + |__/ @@ +0x0134 LATIN CAPITAL LETTER J WITH CIRCUMFLEX + /\ @ + /_\|@ + _ | | @ + | |_| | @ + \___/ @ + @@ +0x0135 LATIN SMALL LETTER J WITH CIRCUMFLEX + /\@ + /_\@ + | |@ + | |@ + _/ |@ + |__/ @@ +0x0136 LATIN CAPITAL LETTER K WITH CEDILLA + _ _ @ + | |/ / @ + | ' / @ + | . \ @ + |_|\_\ @ + )__)@@ +0x0137 LATIN SMALL LETTER K WITH CEDILLA + _ @ + | | __@ + | |/ /@ + | < @ + |_|\_\@ + )_)@@ +0x0138 LATIN SMALL LETTER KRA + @ + _ __ @ + | |/ \@ + | < @ + |_|\_\@ + @@ +0x0139 LATIN CAPITAL LETTER L WITH ACUTE + _ //@ + | | // @ + | | @ + | |___ @ + |_____|@ + @@ +0x013A LATIN SMALL LETTER L WITH ACUTE + //@ + | |@ + | |@ + | |@ + |_|@ + @@ +0x013B LATIN CAPITAL LETTER L WITH CEDILLA + _ @ + | | @ + | | @ + | |___ @ + |_____|@ + )__)@@ +0x013C LATIN SMALL LETTER L WITH CEDILLA + _ @ + | | @ + | | @ + | | @ + |_| @ + )_)@@ +0x013D LATIN CAPITAL LETTER L WITH CARON + _ \\//@ + | | \/ @ + | | @ + | |___ @ + |_____|@ + @@ +0x013E LATIN SMALL LETTER L WITH CARON + _ \\//@ + | | \/ @ + | | @ + | | @ + |_| @ + @@ +0x013F LATIN CAPITAL LETTER L WITH MIDDLE DOT + _ @ + | | @ + | | [] @ + | |___ @ + |_____|@ + @@ +0x0140 LATIN SMALL LETTER L WITH MIDDLE DOT + _ @ + | | @ + | | []@ + | | @ + |_| @ + @@ +0x0141 LATIN CAPITAL LETTER L WITH STROKE + __ @ + | // @ + |//| @ + // |__ @ + |_____|@ + @@ +0x0142 LATIN SMALL LETTER L WITH STROKE + _ @ + | |@ + |//@ + //|@ + |_|@ + @@ +0x0143 LATIN CAPITAL LETTER N WITH ACUTE + _/ /_ @ + | \ | |@ + | \| |@ + | |\ |@ + |_| \_|@ + @@ +0x0144 LATIN SMALL LETTER N WITH ACUTE + _ @ + _ /_/ @ + | '_ \ @ + | | | |@ + |_| |_|@ + @@ +0x0145 LATIN CAPITAL LETTER N WITH CEDILLA + _ _ @ + | \ | |@ + | \| |@ + | |\ |@ + |_| \_|@ + )_) @@ +0x0146 LATIN SMALL LETTER N WITH CEDILLA + @ + _ __ @ + | '_ \ @ + | | | |@ + |_| |_|@ + )_) @@ +0x0147 LATIN CAPITAL LETTER N WITH CARON + _\/ _ @ + | \ | |@ + | \| |@ + | |\ |@ + |_| \_|@ + @@ +0x0148 LATIN SMALL LETTER N WITH CARON + \\// @ + _\/_ @ + | '_ \ @ + | | | |@ + |_| |_|@ + @@ +0x0149 LATIN SMALL LETTER N PRECEDED BY APOSTROPHE + @ + _ __ @ + ( )| '_\ @ + |/| | | |@ + |_| |_|@ + @@ +0x014A LATIN CAPITAL LETTER ENG + _ _ @ + | \ | |@ + | \| |@ + | |\ |@ + |_| \ |@ + )_)@@ +0x014B LATIN SMALL LETTER ENG + _ __ @ + | '_ \ @ + | | | |@ + |_| | |@ + | |@ + |__ @@ +0x014C LATIN CAPITAL LETTER O WITH MACRON + ____ @ + /_ _/ @ + / _ \ @ + | (_) |@ + \___/ @ + @@ +0x014D LATIN SMALL LETTER O WITH MACRON + ____ @ + /_ _/ @ + / _ \ @ + | (_) |@ + \___/ @ + @@ +0x014E LATIN CAPITAL LETTER O WITH BREVE + \ / @ + _-_ @ + / _ \ @ + | |_| |@ + \___/ @ + @@ +0x014F LATIN SMALL LETTER O WITH BREVE + \ / @ + _-_ @ + / _ \ @ + | |_| |@ + \___/ @ + @@ +0x0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + ___ @ + /_/_/@ + / _ \ @ + | |_| |@ + \___/ @ + @@ +0x0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE + ___ @ + /_/_/@ + / _ \ @ + | |_| |@ + \___/ @ + @@ +0x0152 LATIN CAPITAL LIGATURE OE + ___ ___ @ + / _ \| __|@ + | | | | | @ + | |_| | |__@ + \___/|____@ + @@ +0x0153 LATIN SMALL LIGATURE OE + @ + ___ ___ @ + / _ \ / _ \@ + | (_) | __/@ + \___/ \___|@ + @@ +0x0154 LATIN CAPITAL LETTER R WITH ACUTE + _/_/ @ + | _ \ @ + | |_) |@ + | _ < @ + |_| \_\@ + @@ +0x0155 LATIN SMALL LETTER R WITH ACUTE + __@ + _ /_/@ + | '__|@ + | | @ + |_| @ + @@ +0x0156 LATIN CAPITAL LETTER R WITH CEDILLA + ____ @ + | _ \ @ + | |_) |@ + | _ < @ + |_| \_\@ + )_) @@ +0x0157 LATIN SMALL LETTER R WITH CEDILLA + @ + _ __ @ + | '__|@ + | | @ + |_| @ + )_) @@ +0x0158 LATIN CAPITAL LETTER R WITH CARON + _\_/ @ + | _ \ @ + | |_) |@ + | _ < @ + |_| \_\@ + @@ +0x0159 LATIN SMALL LETTER R WITH CARON + \\// @ + _\/_ @ + | '__|@ + | | @ + |_| @ + @@ +0x015A LATIN CAPITAL LETTER S WITH ACUTE + _/_/ @ + / ___| @ + \___ \ @ + ___) |@ + |____/ @ + @@ +0x015B LATIN SMALL LETTER S WITH ACUTE + __@ + _/_/@ + / __|@ + \__ \@ + |___/@ + @@ +0x015C LATIN CAPITAL LETTER S WITH CIRCUMFLEX + _/\_ @ + / ___| @ + \___ \ @ + ___) |@ + |____/ @ + @@ +0x015D LATIN SMALL LETTER S WITH CIRCUMFLEX + @ + /_\_@ + / __|@ + \__ \@ + |___/@ + @@ +0x015E LATIN CAPITAL LETTER S WITH CEDILLA + ____ @ + / ___| @ + \___ \ @ + ___) |@ + |____/ @ + )__)@@ +0x015F LATIN SMALL LETTER S WITH CEDILLA + @ + ___ @ + / __|@ + \__ \@ + |___/@ + )_)@@ +0x0160 LATIN CAPITAL LETTER S WITH CARON + _\_/ @ + / ___| @ + \___ \ @ + ___) |@ + |____/ @ + @@ +0x0161 LATIN SMALL LETTER S WITH CARON + \\//@ + _\/ @ + / __|@ + \__ \@ + |___/@ + @@ +0x0162 LATIN CAPITAL LETTER T WITH CEDILLA + _____ @ + |_ _|@ + | | @ + | | @ + |_| @ + )__)@@ +0x0163 LATIN SMALL LETTER T WITH CEDILLA + _ @ + | |_ @ + | __|@ + | |_ @ + \__|@ + )_)@@ +0x0164 LATIN CAPITAL LETTER T WITH CARON + _____ @ + |_ _|@ + | | @ + | | @ + |_| @ + @@ +0x0165 LATIN SMALL LETTER T WITH CARON + \/ @ + | |_ @ + | __|@ + | |_ @ + \__|@ + @@ +0x0166 LATIN CAPITAL LETTER T WITH STROKE + _____ @ + |_ _|@ + | | @ + -|-|- @ + |_| @ + @@ +0x0167 LATIN SMALL LETTER T WITH STROKE + _ @ + | |_ @ + | __|@ + |-|_ @ + \__|@ + @@ +0x0168 LATIN CAPITAL LETTER U WITH TILDE + @ + _/\/_ @ + | | | |@ + | |_| |@ + \___/ @ + @@ +0x0169 LATIN SMALL LETTER U WITH TILDE + @ + _/\/_ @ + | | | |@ + | |_| |@ + \__,_|@ + @@ +0x016A LATIN CAPITAL LETTER U WITH MACRON + ____ @ + /__ _/@ + | | | |@ + | |_| |@ + \___/ @ + @@ +0x016B LATIN SMALL LETTER U WITH MACRON + ____ @ + / _ /@ + | | | |@ + | |_| |@ + \__,_|@ + @@ +0x016C LATIN CAPITAL LETTER U WITH BREVE + @ + \_/_ @ + | | | |@ + | |_| |@ + \____|@ + @@ +0x016D LATIN SMALL LETTER U WITH BREVE + @ + \_/_ @ + | | | |@ + | |_| |@ + \__,_|@ + @@ +0x016E LATIN CAPITAL LETTER U WITH RING ABOVE + O @ + __ _ @ + | | | |@ + | |_| |@ + \___/ @ + @@ +0x016F LATIN SMALL LETTER U WITH RING ABOVE + O @ + __ __ @ + | | | |@ + | |_| |@ + \__,_|@ + @@ +0x0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + -- --@ + /_//_/@ + | | | |@ + | |_| |@ + \___/ @ + @@ +0x0171 LATIN SMALL LETTER U WITH DOUBLE ACUTE + ____@ + _/_/_/@ + | | | |@ + | |_| |@ + \__,_|@ + @@ +0x0172 LATIN CAPITAL LETTER U WITH OGONEK + _ _ @ + | | | |@ + | | | |@ + | |_| |@ + \___/ @ + (__(@@ +0x0173 LATIN SMALL LETTER U WITH OGONEK + @ + _ _ @ + | | | |@ + | |_| |@ + \__,_|@ + (_(@@ +0x0174 LATIN CAPITAL LETTER W WITH CIRCUMFLEX + __ /\ __@ + \ \ //\\/ /@ + \ \ /\ / / @ + \ V V / @ + \_/\_/ @ + @@ +0x0175 LATIN SMALL LETTER W WITH CIRCUMFLEX + /\ @ + __ //\\__@ + \ \ /\ / /@ + \ V V / @ + \_/\_/ @ + @@ +0x0176 LATIN CAPITAL LETTER Y WITH CIRCUMFLEX + /\ @ + __//\\ @ + \ \ / /@ + \ V / @ + |_| @ + @@ +0x0177 LATIN SMALL LETTER Y WITH CIRCUMFLEX + /\ @ + //\\ @ + | | | |@ + | |_| |@ + \__, |@ + |___/ @@ +0x0178 LATIN CAPITAL LETTER Y WITH DIAERESIS + [] []@ + __ _@ + \ \ / /@ + \ V / @ + |_| @ + @@ +0x0179 LATIN CAPITAL LETTER Z WITH ACUTE + __/_/@ + |__ /@ + / / @ + / /_ @ + /____|@ + @@ +0x017A LATIN SMALL LETTER Z WITH ACUTE + _ @ + _/_/@ + |_ /@ + / / @ + /___|@ + @@ +0x017B LATIN CAPITAL LETTER Z WITH DOT ABOVE + __[]_@ + |__ /@ + / / @ + / /_ @ + /____|@ + @@ +0x017C LATIN SMALL LETTER Z WITH DOT ABOVE + [] @ + ____@ + |_ /@ + / / @ + /___|@ + @@ +0x017D LATIN CAPITAL LETTER Z WITH CARON + _\_/_@ + |__ /@ + / / @ + / /_ @ + /____|@ + @@ +0x017E LATIN SMALL LETTER Z WITH CARON + \\//@ + _\/_@ + |_ /@ + / / @ + /___|@ + @@ +0x017F LATIN SMALL LETTER LONG S + __ @ + / _|@ + |-| | @ + |-| | @ + |_| @ + @@ +0x02C7 CARON + \\//@ + \/ @ + $@ + $@ + $@ + $@@ +0x02D8 BREVE + \\_//@ + \_/ @ + $@ + $@ + $@ + $@@ +0x02D9 DOT ABOVE + []@ + $@ + $@ + $@ + $@ + $@@ +0x02DB OGONEK + $@ + $@ + $@ + $@ + $@ + )_) @@ +0x02DD DOUBLE ACUTE ACCENT + _ _ @ + /_/_/@ + $@ + $@ + $@ + $@@ diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..3584e2a --- /dev/null +++ b/go.mod @@ -0,0 +1,25 @@ +module github.com/ekzyis/echo-htmx-templ-tailwindcss + +go 1.24.6 + +require ( + github.com/a-h/templ v0.3.960 + github.com/joho/godotenv v1.5.1 + github.com/labstack/echo/v4 v4.13.4 + github.com/lib/pq v1.10.9 + github.com/lukesampson/figlet v0.0.0-20190211215653-8a3ef4a6ac42 + github.com/namsral/flag v1.7.4-pre +) + +require ( + github.com/labstack/gommon v0.4.2 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/valyala/fasttemplate v1.2.2 // indirect + golang.org/x/crypto v0.40.0 // indirect + golang.org/x/net v0.42.0 // indirect + golang.org/x/sys v0.34.0 // indirect + golang.org/x/text v0.27.0 // indirect + golang.org/x/time v0.11.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..c3d2d7d --- /dev/null +++ b/go.sum @@ -0,0 +1,43 @@ +github.com/a-h/templ v0.3.960 h1:trshEpGa8clF5cdI39iY4ZrZG8Z/QixyzEyUnA7feTM= +github.com/a-h/templ v0.3.960/go.mod h1:oCZcnKRf5jjsGpf2yELzQfodLphd2mwecwG4Crk5HBo= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/labstack/echo/v4 v4.13.4 h1:oTZZW+T3s9gAu5L8vmzihV7/lkXGZuITzTQkTEhcXEA= +github.com/labstack/echo/v4 v4.13.4/go.mod h1:g63b33BZ5vZzcIUF8AtRH40DrTlXnx4UMC8rBdndmjQ= +github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0= +github.com/labstack/gommon v0.4.2/go.mod h1:QlUFxVM+SNXhDL/Z7YhocGIBYOiwB0mXm1+1bAPHPyU= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lukesampson/figlet v0.0.0-20190211215653-8a3ef4a6ac42 h1:UtyD+eBVdLYSj5/pjfSR6mtnzMgIiOVcFT024G2l4CY= +github.com/lukesampson/figlet v0.0.0-20190211215653-8a3ef4a6ac42/go.mod h1:/peI0OaxVYh7fzA72CD7rUsyGVdF7sCiFw7GcYqOcCw= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/namsral/flag v1.7.4-pre h1:b2ScHhoCUkbsq0d2C15Mv+VU8bl8hAXV8arnWiOHNZs= +github.com/namsral/flag v1.7.4-pre/go.mod h1:OXldTctbM6SWH1K899kPZcf65KxJiD7MsceFUpB5yDo= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= +github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= +golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY= +golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs= +golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= +golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= +golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= +golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= +golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/lib/figlet.go b/lib/figlet.go new file mode 100644 index 0000000..5283ac5 --- /dev/null +++ b/lib/figlet.go @@ -0,0 +1,38 @@ +package lib + +import ( + "log" + "os" + "strings" + + "math/rand/v2" + + "github.com/lukesampson/figlet/figletlib" +) + +func Figlet(fontName string, text string) string { + var ( + fontsDir = "fonts" + // download figlet fonts from http://www.figlet.org/ + font *figletlib.Font + err error + ) + + if fontName == "random" { + if files, err := os.ReadDir(fontsDir); err != nil { + log.Printf("error reading directory %s: %v\n", fontsDir, err) + return "" + } else { + fontName = files[rand.IntN(len(files))].Name() + } + } + + if font, err = figletlib.GetFontByName(fontsDir, fontName); err != nil { + log.Printf("could not find font %s: %v\n", fontName, err) + return "" + } + + b := new(strings.Builder) + figletlib.FPrintMsg(b, text, font, 80, font.Settings(), "left") + return b.String() +} diff --git a/main.go b/main.go new file mode 100644 index 0000000..94fb34d --- /dev/null +++ b/main.go @@ -0,0 +1,42 @@ +package main + +import ( + "fmt" + "log" + + "github.com/ekzyis/echo-htmx-templ-tailwindcss/db" + "github.com/ekzyis/echo-htmx-templ-tailwindcss/env" + "github.com/ekzyis/echo-htmx-templ-tailwindcss/server" +) + +func main() { + if err := env.Load(); err != nil { + log.Fatalf("error loading env: %v", err) + } + env.Parse() + + log.Printf("url: %s", env.PublicUrl) + log.Printf("commit: %s", env.CommitShortSha) + log.Printf("postgres: %s", env.PostgresUrlWithoutPassword) + + db, err := db.New(env.PostgresUrl) + if err != nil { + log.Fatal(err) + } + + if err := db.Migrate(); err != nil { + log.Fatal(err) + } + + s := server.New(server.Context{ + Env: env.Env, + PublicURL: env.PublicUrl, + CommitShortSha: env.CommitShortSha, + CommitLongSha: env.CommitLongSha, + Db: db, + }) + + if err := s.Start(fmt.Sprintf(":%d", env.Port)); err != nil { + log.Fatal(err) + } +} diff --git a/pages/components/body.templ b/pages/components/body.templ new file mode 100644 index 0000000..7f2ad5c --- /dev/null +++ b/pages/components/body.templ @@ -0,0 +1,9 @@ +package components + +templ Body() { + +
+ { children... } + @Modal(false) + +} \ No newline at end of file diff --git a/pages/components/content.templ b/pages/components/content.templ new file mode 100644 index 0000000..7c94d0d --- /dev/null +++ b/pages/components/content.templ @@ -0,0 +1,14 @@ +package components + +templ Content() { +
+ { children... } +
+} \ No newline at end of file diff --git a/pages/components/figlet.templ b/pages/components/figlet.templ new file mode 100644 index 0000000..b65ad3a --- /dev/null +++ b/pages/components/figlet.templ @@ -0,0 +1,13 @@ +package components + +import "github.com/ekzyis/echo-htmx-templ-tailwindcss/lib" + +templ Figlet(font string, text string) { + + +
+				{ lib.Figlet(font, text) }
+			
+
+
+} diff --git a/pages/components/head.templ b/pages/components/head.templ new file mode 100644 index 0000000..2cec0aa --- /dev/null +++ b/pages/components/head.templ @@ -0,0 +1,25 @@ +package components + +templ Head() { + + template + + + + + + + + + + +} diff --git a/pages/components/modal.templ b/pages/components/modal.templ new file mode 100644 index 0000000..1f67fe3 --- /dev/null +++ b/pages/components/modal.templ @@ -0,0 +1,25 @@ +package components + +templ Modal(show bool) { + +} diff --git a/pages/context/context.go b/pages/context/context.go new file mode 100644 index 0000000..d61a0f2 --- /dev/null +++ b/pages/context/context.go @@ -0,0 +1,23 @@ +package context + +import ( + "context" + + "github.com/ekzyis/echo-htmx-templ-tailwindcss/env" +) + +type ContextKey string + +var ( + Env ContextKey = "env" + Session ContextKey = "session" + Commit ContextKey = "commit" + Origin ContextKey = "origin" +) + +func GetOrigin(ctx context.Context) string { + if u, ok := ctx.Value(Origin).(string); ok { + return u + } + return env.PublicUrl +} diff --git a/pages/error.templ b/pages/error.templ new file mode 100644 index 0000000..28097af --- /dev/null +++ b/pages/error.templ @@ -0,0 +1,19 @@ +package pages + +import ( + "net/http" + "strconv" + "github.com/ekzyis/echo-htmx-templ-tailwindcss/pages/components" +) + +templ Error(code int) { + + @components.Head() + @components.Body() { + @components.Content() { + @components.Figlet("random", strconv.Itoa(code)) +
{ http.StatusText(code) }
+ } + } + +} diff --git a/pages/index.templ b/pages/index.templ new file mode 100644 index 0000000..9ba0ce8 --- /dev/null +++ b/pages/index.templ @@ -0,0 +1,14 @@ +package pages + +import "github.com/ekzyis/echo-htmx-templ-tailwindcss/pages/components" + +templ Index() { + + @components.Head() + @components.Body() { + @components.Content() { +
hello world
+ } + } + +} \ No newline at end of file diff --git a/pages/render.go b/pages/render.go new file mode 100644 index 0000000..3d7dedf --- /dev/null +++ b/pages/render.go @@ -0,0 +1,46 @@ +package pages + +import ( + "context" + + "github.com/a-h/templ" + "github.com/ekzyis/echo-htmx-templ-tailwindcss/env" + "github.com/ekzyis/echo-htmx-templ-tailwindcss/pages/components" + pCtx "github.com/ekzyis/echo-htmx-templ-tailwindcss/pages/context" + "github.com/labstack/echo/v4" +) + +func GetEnv(ctx context.Context) string { + if u, ok := ctx.Value(pCtx.Env).(string); ok { + return u + } + return "development" +} + +func Render(t templ.Component, statusCode int, eCtx echo.Context) error { + buf := templ.GetBuffer() + defer templ.ReleaseBuffer(buf) + + rCtx := context.WithValue(eCtx.Request().Context(), pCtx.Env, env.Env) + req := eCtx.Request() + rCtx = context.WithValue(rCtx, pCtx.Origin, req.Pattern+req.Host) + + if err := t.Render(rCtx, buf); err != nil { + return err + } + + return eCtx.HTML(statusCode, buf.String()) +} + +func RenderModal(child templ.Component, statusCode int, eCtx echo.Context) error { + buf := templ.GetBuffer() + defer templ.ReleaseBuffer(buf) + + rCtx := templ.WithChildren(eCtx.Request().Context(), child) + + if err := components.Modal(true).Render(rCtx, buf); err != nil { + return err + } + + return eCtx.HTML(statusCode, buf.String()) +} diff --git a/public/css/htmx.css b/public/css/htmx.css new file mode 100644 index 0000000..659a409 --- /dev/null +++ b/public/css/htmx.css @@ -0,0 +1,25 @@ +.htmx-indicator { + opacity: 0; + height: .5vh; + left: 0; + width: 100%; + background-color: var(--color); + transition: opacity .2s ease-out, width .2s ease-out; +} + +.htmx-indicator.htmx-request { + opacity: 1; + /* if I'd be smart, I would use the Content-Length header in some way to determine the duration */ + animation: progressbar 1s ease-in-out; +} + +@keyframes progressbar { + from { + left: 0; + width: 0; + } + to { + left: 0; + width: 100%; + } +} diff --git a/public/js/htmx.js b/public/js/htmx.js new file mode 100644 index 0000000..34f0a47 --- /dev/null +++ b/public/js/htmx.js @@ -0,0 +1,5130 @@ +var htmx = (function() { + 'use strict' + + // Public API + const htmx = { + // Tsc madness here, assigning the functions directly results in an invalid TypeScript output, but reassigning is fine + /* Event processing */ + /** @type {typeof onLoadHelper} */ + onLoad: null, + /** @type {typeof processNode} */ + process: null, + /** @type {typeof addEventListenerImpl} */ + on: null, + /** @type {typeof removeEventListenerImpl} */ + off: null, + /** @type {typeof triggerEvent} */ + trigger: null, + /** @type {typeof ajaxHelper} */ + ajax: null, + /* DOM querying helpers */ + /** @type {typeof find} */ + find: null, + /** @type {typeof findAll} */ + findAll: null, + /** @type {typeof closest} */ + closest: null, + /** + * Returns the input values that would resolve for a given element via the htmx value resolution mechanism + * + * @see https://htmx.org/api/#values + * + * @param {Element} elt the element to resolve values on + * @param {HttpVerb} type the request type (e.g. **get** or **post**) non-GET's will include the enclosing form of the element. Defaults to **post** + * @returns {Object} + */ + values: function(elt, type) { + const inputValues = getInputValues(elt, type || 'post') + return inputValues.values + }, + /* DOM manipulation helpers */ + /** @type {typeof removeElement} */ + remove: null, + /** @type {typeof addClassToElement} */ + addClass: null, + /** @type {typeof removeClassFromElement} */ + removeClass: null, + /** @type {typeof toggleClassOnElement} */ + toggleClass: null, + /** @type {typeof takeClassForElement} */ + takeClass: null, + /** @type {typeof swap} */ + swap: null, + /* Extension entrypoints */ + /** @type {typeof defineExtension} */ + defineExtension: null, + /** @type {typeof removeExtension} */ + removeExtension: null, + /* Debugging */ + /** @type {typeof logAll} */ + logAll: null, + /** @type {typeof logNone} */ + logNone: null, + /* Debugging */ + /** + * The logger htmx uses to log with + * + * @see https://htmx.org/api/#logger + */ + logger: null, + /** + * A property holding the configuration htmx uses at runtime. + * + * Note that using a [meta tag](https://htmx.org/docs/#config) is the preferred mechanism for setting these properties. + * + * @see https://htmx.org/api/#config + */ + config: { + /** + * Whether to use history. + * @type boolean + * @default true + */ + historyEnabled: true, + /** + * The number of pages to keep in **localStorage** for history support. + * @type number + * @default 10 + */ + historyCacheSize: 10, + /** + * @type boolean + * @default false + */ + refreshOnHistoryMiss: false, + /** + * The default swap style to use if **[hx-swap](https://htmx.org/attributes/hx-swap)** is omitted. + * @type HtmxSwapStyle + * @default 'innerHTML' + */ + defaultSwapStyle: 'innerHTML', + /** + * The default delay between receiving a response from the server and doing the swap. + * @type number + * @default 0 + */ + defaultSwapDelay: 0, + /** + * The default delay between completing the content swap and settling attributes. + * @type number + * @default 20 + */ + defaultSettleDelay: 20, + /** + * If true, htmx will inject a small amount of CSS into the page to make indicators invisible unless the **htmx-indicator** class is present. + * @type boolean + * @default true + */ + includeIndicatorStyles: true, + /** + * The class to place on indicators when a request is in flight. + * @type string + * @default 'htmx-indicator' + */ + indicatorClass: 'htmx-indicator', + /** + * The class to place on triggering elements when a request is in flight. + * @type string + * @default 'htmx-request' + */ + requestClass: 'htmx-request', + /** + * The class to temporarily place on elements that htmx has added to the DOM. + * @type string + * @default 'htmx-added' + */ + addedClass: 'htmx-added', + /** + * The class to place on target elements when htmx is in the settling phase. + * @type string + * @default 'htmx-settling' + */ + settlingClass: 'htmx-settling', + /** + * The class to place on target elements when htmx is in the swapping phase. + * @type string + * @default 'htmx-swapping' + */ + swappingClass: 'htmx-swapping', + /** + * Allows the use of eval-like functionality in htmx, to enable **hx-vars**, trigger conditions & script tag evaluation. Can be set to **false** for CSP compatibility. + * @type boolean + * @default true + */ + allowEval: true, + /** + * If set to false, disables the interpretation of script tags. + * @type boolean + * @default true + */ + allowScriptTags: true, + /** + * If set, the nonce will be added to inline scripts. + * @type string + * @default '' + */ + inlineScriptNonce: '', + /** + * If set, the nonce will be added to inline styles. + * @type string + * @default '' + */ + inlineStyleNonce: '', + /** + * The attributes to settle during the settling phase. + * @type string[] + * @default ['class', 'style', 'width', 'height'] + */ + attributesToSettle: ['class', 'style', 'width', 'height'], + /** + * Allow cross-site Access-Control requests using credentials such as cookies, authorization headers or TLS client certificates. + * @type boolean + * @default false + */ + withCredentials: false, + /** + * @type number + * @default 0 + */ + timeout: 0, + /** + * The default implementation of **getWebSocketReconnectDelay** for reconnecting after unexpected connection loss by the event code **Abnormal Closure**, **Service Restart** or **Try Again Later**. + * @type {'full-jitter' | ((retryCount:number) => number)} + * @default "full-jitter" + */ + wsReconnectDelay: 'full-jitter', + /** + * The type of binary data being received over the WebSocket connection + * @type BinaryType + * @default 'blob' + */ + wsBinaryType: 'blob', + /** + * @type string + * @default '[hx-disable], [data-hx-disable]' + */ + disableSelector: '[hx-disable], [data-hx-disable]', + /** + * @type {'auto' | 'instant' | 'smooth'} + * @default 'smooth' + */ + scrollBehavior: 'instant', + /** + * If the focused element should be scrolled into view. + * @type boolean + * @default false + */ + defaultFocusScroll: false, + /** + * If set to true htmx will include a cache-busting parameter in GET requests to avoid caching partial responses by the browser + * @type boolean + * @default false + */ + getCacheBusterParam: false, + /** + * If set to true, htmx will use the View Transition API when swapping in new content. + * @type boolean + * @default false + */ + globalViewTransitions: false, + /** + * htmx will format requests with these methods by encoding their parameters in the URL, not the request body + * @type {(HttpVerb)[]} + * @default ['get', 'delete'] + */ + methodsThatUseUrlParams: ['get', 'delete'], + /** + * If set to true, disables htmx-based requests to non-origin hosts. + * @type boolean + * @default false + */ + selfRequestsOnly: true, + /** + * If set to true htmx will not update the title of the document when a title tag is found in new content + * @type boolean + * @default false + */ + ignoreTitle: false, + /** + * Whether the target of a boosted element is scrolled into the viewport. + * @type boolean + * @default true + */ + scrollIntoViewOnBoost: true, + /** + * The cache to store evaluated trigger specifications into. + * You may define a simple object to use a never-clearing cache, or implement your own system using a [proxy object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Proxy) + * @type {Object|null} + * @default null + */ + triggerSpecsCache: null, + /** @type boolean */ + disableInheritance: false, + /** @type HtmxResponseHandlingConfig[] */ + responseHandling: [ + { code: '204', swap: false }, + { code: '[23]..', swap: true }, + { code: '[45]..', swap: false, error: true } + ], + /** + * Whether to process OOB swaps on elements that are nested within the main response element. + * @type boolean + * @default true + */ + allowNestedOobSwaps: true + }, + /** @type {typeof parseInterval} */ + parseInterval: null, + /** @type {typeof internalEval} */ + _: null, + version: '2.0.0' + } + // Tsc madness part 2 + htmx.onLoad = onLoadHelper + htmx.process = processNode + htmx.on = addEventListenerImpl + htmx.off = removeEventListenerImpl + htmx.trigger = triggerEvent + htmx.ajax = ajaxHelper + htmx.find = find + htmx.findAll = findAll + htmx.closest = closest + htmx.remove = removeElement + htmx.addClass = addClassToElement + htmx.removeClass = removeClassFromElement + htmx.toggleClass = toggleClassOnElement + htmx.takeClass = takeClassForElement + htmx.swap = swap + htmx.defineExtension = defineExtension + htmx.removeExtension = removeExtension + htmx.logAll = logAll + htmx.logNone = logNone + htmx.parseInterval = parseInterval + htmx._ = internalEval + + const internalAPI = { + addTriggerHandler, + bodyContains, + canAccessLocalStorage, + findThisElement, + filterValues, + swap, + hasAttribute, + getAttributeValue, + getClosestAttributeValue, + getClosestMatch, + getExpressionVars, + getHeaders, + getInputValues, + getInternalData, + getSwapSpecification, + getTriggerSpecs, + getTarget, + makeFragment, + mergeObjects, + makeSettleInfo, + oobSwap, + querySelectorExt, + settleImmediately, + shouldCancel, + triggerEvent, + triggerErrorEvent, + withExtensions + } + + const VERBS = ['get', 'post', 'put', 'delete', 'patch'] + const VERB_SELECTOR = VERBS.map(function(verb) { + return '[hx-' + verb + '], [data-hx-' + verb + ']' + }).join(', ') + + const HEAD_TAG_REGEX = makeTagRegEx('head') + + //= =================================================================== + // Utilities + //= =================================================================== + + /** + * @param {string} tag + * @param {boolean} global + * @returns {RegExp} + */ + function makeTagRegEx(tag, global = false) { + return new RegExp(`<${tag}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${tag}>`, + global ? 'gim' : 'im') + } + + /** + * Parses an interval string consistent with the way htmx does. Useful for plugins that have timing-related attributes. + * + * Caution: Accepts an int followed by either **s** or **ms**. All other values use **parseFloat** + * + * @see https://htmx.org/api/#parseInterval + * + * @param {string} str timing string + * @returns {number|undefined} + */ + function parseInterval(str) { + if (str == undefined) { + return undefined + } + + let interval = NaN + if (str.slice(-2) == 'ms') { + interval = parseFloat(str.slice(0, -2)) + } else if (str.slice(-1) == 's') { + interval = parseFloat(str.slice(0, -1)) * 1000 + } else if (str.slice(-1) == 'm') { + interval = parseFloat(str.slice(0, -1)) * 1000 * 60 + } else { + interval = parseFloat(str) + } + return isNaN(interval) ? undefined : interval + } + + /** + * @param {Node} elt + * @param {string} name + * @returns {(string | null)} + */ + function getRawAttribute(elt, name) { + return elt instanceof Element && elt.getAttribute(name) + } + + /** + * @param {Element} elt + * @param {string} qualifiedName + * @returns {boolean} + */ + // resolve with both hx and data-hx prefixes + function hasAttribute(elt, qualifiedName) { + return !!elt.hasAttribute && (elt.hasAttribute(qualifiedName) || + elt.hasAttribute('data-' + qualifiedName)) + } + + /** + * + * @param {Node} elt + * @param {string} qualifiedName + * @returns {(string | null)} + */ + function getAttributeValue(elt, qualifiedName) { + return getRawAttribute(elt, qualifiedName) || getRawAttribute(elt, 'data-' + qualifiedName) + } + + /** + * @param {Node} elt + * @returns {Node | null} + */ + function parentElt(elt) { + const parent = elt.parentElement + if (!parent && elt.parentNode instanceof ShadowRoot) return elt.parentNode + return parent + } + + /** + * @returns {Document} + */ + function getDocument() { + return document + } + + /** + * @param {Node} elt + * @param {boolean} global + * @returns {Node|Document} + */ + function getRootNode(elt, global) { + return elt.getRootNode ? elt.getRootNode({ composed: global }) : getDocument() + } + + /** + * @param {Node} elt + * @param {(e:Node) => boolean} condition + * @returns {Node | null} + */ + function getClosestMatch(elt, condition) { + while (elt && !condition(elt)) { + elt = parentElt(elt) + } + + return elt || null + } + + /** + * @param {Element} initialElement + * @param {Element} ancestor + * @param {string} attributeName + * @returns {string|null} + */ + function getAttributeValueWithDisinheritance(initialElement, ancestor, attributeName) { + const attributeValue = getAttributeValue(ancestor, attributeName) + const disinherit = getAttributeValue(ancestor, 'hx-disinherit') + var inherit = getAttributeValue(ancestor, 'hx-inherit') + if (initialElement !== ancestor) { + if (htmx.config.disableInheritance) { + if (inherit && (inherit === '*' || inherit.split(' ').indexOf(attributeName) >= 0)) { + return attributeValue + } else { + return null + } + } + if (disinherit && (disinherit === '*' || disinherit.split(' ').indexOf(attributeName) >= 0)) { + return 'unset' + } + } + return attributeValue + } + + /** + * @param {Element} elt + * @param {string} attributeName + * @returns {string | null} + */ + function getClosestAttributeValue(elt, attributeName) { + let closestAttr = null + getClosestMatch(elt, function(e) { + return !!(closestAttr = getAttributeValueWithDisinheritance(elt, asElement(e), attributeName)) + }) + if (closestAttr !== 'unset') { + return closestAttr + } + } + + /** + * @param {Node} elt + * @param {string} selector + * @returns {boolean} + */ + function matches(elt, selector) { + // @ts-ignore: non-standard properties for browser compatibility + // noinspection JSUnresolvedVariable + const matchesFunction = elt instanceof Element && (elt.matches || elt.matchesSelector || elt.msMatchesSelector || elt.mozMatchesSelector || elt.webkitMatchesSelector || elt.oMatchesSelector) + return !!matchesFunction && matchesFunction.call(elt, selector) + } + + /** + * @param {string} str + * @returns {string} + */ + function getStartTag(str) { + const tagMatcher = /<([a-z][^\/\0>\x20\t\r\n\f]*)/i + const match = tagMatcher.exec(str) + if (match) { + return match[1].toLowerCase() + } else { + return '' + } + } + + /** + * @param {string} resp + * @returns {Document} + */ + function parseHTML(resp) { + const parser = new DOMParser() + return parser.parseFromString(resp, 'text/html') + } + + /** + * @param {DocumentFragment} fragment + * @param {Node} elt + */ + function takeChildrenFor(fragment, elt) { + while (elt.childNodes.length > 0) { + fragment.append(elt.childNodes[0]) + } + } + + /** + * @param {HTMLScriptElement} script + * @returns {HTMLScriptElement} + */ + function duplicateScript(script) { + const newScript = getDocument().createElement('script') + forEach(script.attributes, function(attr) { + newScript.setAttribute(attr.name, attr.value) + }) + newScript.textContent = script.textContent + newScript.async = false + if (htmx.config.inlineScriptNonce) { + newScript.nonce = htmx.config.inlineScriptNonce + } + return newScript + } + + /** + * @param {HTMLScriptElement} script + * @returns {boolean} + */ + function isJavaScriptScriptNode(script) { + return script.matches('script') && (script.type === 'text/javascript' || script.type === 'module' || script.type === '') + } + + /** + * we have to make new copies of script tags that we are going to insert because + * SOME browsers (not saying who, but it involves an element and an animal) don't + * execute scripts created in