improving code styling
This commit is contained in:
parent
c508c20e86
commit
7a3c532b86
6 changed files with 74 additions and 17675 deletions
15
README.md
15
README.md
|
@ -10,20 +10,9 @@ Posts are markdown files stored under `priv/content` and parsed by [Earmark](htt
|
|||
|
||||
For the challenge of it, and to keep user's browsers from having to run javascript just to highlight some code, I chose to do server-side syntax highlighting.
|
||||
|
||||
Due to the lexer limitations of elixir-native solutions, the highlighter uses [Pygments](https://pygments.org/) by calling [pygmentize](https://pygments.org/docs/cmdline/) via [System.cmd](https://hexdocs.pm/elixir/System.html#cmd/3)
|
||||
Due to the lexer limitations of elixir-native solutions, the highlighter uses [Chroma](https://github.com/alecthomas/chroma) by calling its command-linie-interface via [System.cmd](https://hexdocs.pm/elixir/System.html#cmd/3)
|
||||
|
||||
However, this requires installing python3 & Pygments. Best way to do this is with a venv (virtual python environment), so you'll also want `python3-venv` installed on a debian system, for example.
|
||||
|
||||
By default, Home73k is configured to look for pygmentize in a venv at `priv/pygments/bin/pygmentize` -- here's a quick howto for how to set that up:
|
||||
|
||||
```shell
|
||||
cd priv
|
||||
python3 -m venv pygments
|
||||
source pygments/bin/activate
|
||||
pip3 install Pygments
|
||||
```
|
||||
|
||||
The location of bin/pygmentize can be configured in `config.exs` under `config :home73k, :app_global_vars, pygmentize_bin: "path/to/bin/pygmentize"`
|
||||
However, this requires installing [golang](https://golang.org/doc/install) as well as chroma. You can add go to your path, but once chroma is installed, just make sure Home73k's `config.exs` is configured to point directly to the chroma binary under `config :home73k, :app_global_vars, chroma_bin: "path/to/bin/chroma"` -- `"priv/go/bin/chroma"` by default.
|
||||
|
||||
## Deploying
|
||||
|
||||
|
|
|
@ -1,60 +1,65 @@
|
|||
/* Background */ .chroma { color: #8a8a8a; background-color: #1c1c1c }
|
||||
/* Other */ .chroma .x { color: #d75f00 }
|
||||
/* Background */ .chroma { color: #e2e4e5; background-color: #282a36 }
|
||||
/* Error */ .chroma .err { color: #ff5c57 }
|
||||
/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; }
|
||||
/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; width: auto; overflow: auto; display: block; }
|
||||
/* LineHighlight */ .chroma .hl { display: block; width: 100%;background-color: #323232 }
|
||||
/* LineNumbersTable */ .chroma .lnt { margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #454545 }
|
||||
/* LineNumbers */ .chroma .ln { margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #454545 }
|
||||
/* Keyword */ .chroma .k { color: #5f8700 }
|
||||
/* KeywordConstant */ .chroma .kc { color: #d75f00 }
|
||||
/* KeywordDeclaration */ .chroma .kd { color: #0087ff }
|
||||
/* KeywordNamespace */ .chroma .kn { color: #d75f00 }
|
||||
/* KeywordPseudo */ .chroma .kp { color: #5f8700 }
|
||||
/* KeywordReserved */ .chroma .kr { color: #0087ff }
|
||||
/* KeywordType */ .chroma .kt { color: #af0000 }
|
||||
/* NameBuiltin */ .chroma .nb { color: #0087ff }
|
||||
/* NameBuiltinPseudo */ .chroma .bp { color: #0087ff }
|
||||
/* NameClass */ .chroma .nc { color: #0087ff }
|
||||
/* NameConstant */ .chroma .no { color: #d75f00 }
|
||||
/* NameDecorator */ .chroma .nd { color: #0087ff }
|
||||
/* NameEntity */ .chroma .ni { color: #d75f00 }
|
||||
/* NameException */ .chroma .ne { color: #af8700 }
|
||||
/* NameFunction */ .chroma .nf { color: #0087ff }
|
||||
/* NameTag */ .chroma .nt { color: #0087ff }
|
||||
/* NameVariable */ .chroma .nv { color: #0087ff }
|
||||
/* LiteralString */ .chroma .s { color: #00afaf }
|
||||
/* LiteralStringAffix */ .chroma .sa { color: #00afaf }
|
||||
/* LiteralStringBacktick */ .chroma .sb { color: #4e4e4e }
|
||||
/* LiteralStringChar */ .chroma .sc { color: #00afaf }
|
||||
/* LiteralStringDelimiter */ .chroma .dl { color: #00afaf }
|
||||
/* LiteralStringDoc */ .chroma .sd { color: #00afaf }
|
||||
/* LiteralStringDouble */ .chroma .s2 { color: #00afaf }
|
||||
/* LiteralStringEscape */ .chroma .se { color: #af0000 }
|
||||
/* LiteralStringHeredoc */ .chroma .sh { color: #00afaf }
|
||||
/* LiteralStringInterpol */ .chroma .si { color: #00afaf }
|
||||
/* LiteralStringOther */ .chroma .sx { color: #00afaf }
|
||||
/* LiteralStringRegex */ .chroma .sr { color: #af0000 }
|
||||
/* LiteralStringSingle */ .chroma .s1 { color: #00afaf }
|
||||
/* LiteralStringSymbol */ .chroma .ss { color: #00afaf }
|
||||
/* LiteralNumber */ .chroma .m { color: #00afaf }
|
||||
/* LiteralNumberBin */ .chroma .mb { color: #00afaf }
|
||||
/* LiteralNumberFloat */ .chroma .mf { color: #00afaf }
|
||||
/* LiteralNumberHex */ .chroma .mh { color: #00afaf }
|
||||
/* LiteralNumberInteger */ .chroma .mi { color: #00afaf }
|
||||
/* LiteralNumberIntegerLong */ .chroma .il { color: #00afaf }
|
||||
/* LiteralNumberOct */ .chroma .mo { color: #00afaf }
|
||||
/* OperatorWord */ .chroma .ow { color: #5f8700 }
|
||||
/* Comment */ .chroma .c { color: #4e4e4e }
|
||||
/* CommentHashbang */ .chroma .ch { color: #4e4e4e }
|
||||
/* CommentMultiline */ .chroma .cm { color: #4e4e4e }
|
||||
/* CommentSingle */ .chroma .c1 { color: #4e4e4e }
|
||||
/* CommentSpecial */ .chroma .cs { color: #5f8700 }
|
||||
/* CommentPreproc */ .chroma .cp { color: #5f8700 }
|
||||
/* CommentPreprocFile */ .chroma .cpf { color: #5f8700 }
|
||||
/* GenericDeleted */ .chroma .gd { color: #af0000 }
|
||||
/* GenericEmph */ .chroma .ge { font-style: italic }
|
||||
/* GenericError */ .chroma .gr { color: #af0000; font-weight: bold }
|
||||
/* GenericHeading */ .chroma .gh { color: #d75f00 }
|
||||
/* GenericInserted */ .chroma .gi { color: #5f8700 }
|
||||
/* GenericStrong */ .chroma .gs { font-weight: bold }
|
||||
/* GenericSubheading */ .chroma .gu { color: #0087ff }
|
||||
/* LineHighlight */ .chroma .hl { display: block; width: 100%;background-color: #3d3f4a }
|
||||
/* LineNumbersTable */ .chroma .lnt { margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f }
|
||||
/* LineNumbers */ .chroma .ln { margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f }
|
||||
/* Keyword */ .chroma .k { color: #ff6ac1 }
|
||||
/* KeywordConstant */ .chroma .kc { color: #ff6ac1 }
|
||||
/* KeywordDeclaration */ .chroma .kd { color: #ff5c57 }
|
||||
/* KeywordNamespace */ .chroma .kn { color: #ff6ac1 }
|
||||
/* KeywordPseudo */ .chroma .kp { color: #ff6ac1 }
|
||||
/* KeywordReserved */ .chroma .kr { color: #ff6ac1 }
|
||||
/* KeywordType */ .chroma .kt { color: #9aedfe }
|
||||
/* NameAttribute */ .chroma .na { color: #57c7ff }
|
||||
/* NameBuiltin */ .chroma .nb { color: #ff5c57 }
|
||||
/* NameClass */ .chroma .nc { color: #f3f99d }
|
||||
/* NameConstant */ .chroma .no { color: #ff9f43 }
|
||||
/* NameDecorator */ .chroma .nd { color: #ff9f43 }
|
||||
/* NameFunction */ .chroma .nf { color: #57c7ff }
|
||||
/* NameLabel */ .chroma .nl { color: #ff5c57 }
|
||||
/* NameTag */ .chroma .nt { color: #ff6ac1 }
|
||||
/* NameVariable */ .chroma .nv { color: #ff5c57 }
|
||||
/* NameVariableClass */ .chroma .vc { color: #ff5c57 }
|
||||
/* NameVariableGlobal */ .chroma .vg { color: #ff5c57 }
|
||||
/* NameVariableInstance */ .chroma .vi { color: #ff5c57 }
|
||||
/* LiteralString */ .chroma .s { color: #5af78e }
|
||||
/* LiteralStringAffix */ .chroma .sa { color: #5af78e }
|
||||
/* LiteralStringBacktick */ .chroma .sb { color: #5af78e }
|
||||
/* LiteralStringChar */ .chroma .sc { color: #5af78e }
|
||||
/* LiteralStringDelimiter */ .chroma .dl { color: #5af78e }
|
||||
/* LiteralStringDoc */ .chroma .sd { color: #5af78e }
|
||||
/* LiteralStringDouble */ .chroma .s2 { color: #5af78e }
|
||||
/* LiteralStringEscape */ .chroma .se { color: #5af78e }
|
||||
/* LiteralStringHeredoc */ .chroma .sh { color: #5af78e }
|
||||
/* LiteralStringInterpol */ .chroma .si { color: #5af78e }
|
||||
/* LiteralStringOther */ .chroma .sx { color: #5af78e }
|
||||
/* LiteralStringRegex */ .chroma .sr { color: #5af78e }
|
||||
/* LiteralStringSingle */ .chroma .s1 { color: #5af78e }
|
||||
/* LiteralStringSymbol */ .chroma .ss { color: #5af78e }
|
||||
/* LiteralNumber */ .chroma .m { color: #ff9f43 }
|
||||
/* LiteralNumberBin */ .chroma .mb { color: #ff9f43 }
|
||||
/* LiteralNumberFloat */ .chroma .mf { color: #ff9f43 }
|
||||
/* LiteralNumberHex */ .chroma .mh { color: #ff9f43 }
|
||||
/* LiteralNumberInteger */ .chroma .mi { color: #ff9f43 }
|
||||
/* LiteralNumberIntegerLong */ .chroma .il { color: #ff9f43 }
|
||||
/* LiteralNumberOct */ .chroma .mo { color: #ff9f43 }
|
||||
/* Operator */ .chroma .o { color: #ff6ac1 }
|
||||
/* OperatorWord */ .chroma .ow { color: #ff6ac1 }
|
||||
/* Comment */ .chroma .c { color: #78787e }
|
||||
/* CommentHashbang */ .chroma .ch { color: #78787e }
|
||||
/* CommentMultiline */ .chroma .cm { color: #78787e }
|
||||
/* CommentSingle */ .chroma .c1 { color: #78787e }
|
||||
/* CommentSpecial */ .chroma .cs { color: #78787e }
|
||||
/* CommentPreproc */ .chroma .cp { color: #78787e }
|
||||
/* CommentPreprocFile */ .chroma .cpf { color: #78787e }
|
||||
/* GenericDeleted */ .chroma .gd { color: #ff5c57 }
|
||||
/* GenericEmph */ .chroma .ge { text-decoration: underline }
|
||||
/* GenericError */ .chroma .gr { color: #ff5c57 }
|
||||
/* GenericHeading */ .chroma .gh { font-weight: bold }
|
||||
/* GenericInserted */ .chroma .gi { font-weight: bold }
|
||||
/* GenericOutput */ .chroma .go { color: #43454f }
|
||||
/* GenericStrong */ .chroma .gs { font-style: italic }
|
||||
/* GenericSubheading */ .chroma .gu { font-weight: bold }
|
||||
/* GenericUnderline */ .chroma .gl { text-decoration: underline }
|
||||
|
|
|
@ -27,11 +27,15 @@
|
|||
pre.chroma {
|
||||
padding: 0.75rem 1rem;
|
||||
border-radius: .5em;
|
||||
color: $gray-300;
|
||||
background-color: #1c1c1c;
|
||||
// color: $gray-300;
|
||||
// span.c1 {
|
||||
// color: $gray-600;
|
||||
// }
|
||||
}
|
||||
code.inline {
|
||||
background-color: #1c1c1c;
|
||||
color: $gray-300;
|
||||
color: #e2e4e5;
|
||||
padding: .1em .25em;
|
||||
border-radius: .25em;
|
||||
display: inline;
|
||||
|
|
17598
assets/package-lock.json
generated
17598
assets/package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
@ -6,7 +6,6 @@ defmodule Home73k.Highlighter do
|
|||
alias Home73k.Temp
|
||||
|
||||
@chroma_bin Home73k.app_chroma_bin() |> Path.expand()
|
||||
@style "solarized-dark256"
|
||||
|
||||
@doc """
|
||||
Highlights all code block in an already generated HTML document.
|
||||
|
@ -25,7 +24,7 @@ defmodule Home73k.Highlighter do
|
|||
File.write!(tmp_file, unescaped_code)
|
||||
|
||||
# use chroma to highlight the code via temp file
|
||||
bin_args = ["-l", lang, "-f", "html", "-s", @style, "--html-only", "--html-prevent-surrounding-pre", tmp_file]
|
||||
bin_args = ["-l", lang, "-f", "html", "--html-only", "--html-prevent-surrounding-pre", tmp_file]
|
||||
{highlighted, _} = System.cmd(@chroma_bin, bin_args)
|
||||
|
||||
# return properly wrapped highlighted code
|
||||
|
|
|
@ -35,7 +35,7 @@ end
|
|||
|
||||
Following that change, new markdown files are recognized and included as expected.
|
||||
|
||||
And, FWIW, here's the meat of my modified highlighter using chroma (NOTE: the CSS styles were exported separately (like so: `~/go/bin/chroma -s base16-snazzy --html-styles > _chroma.css`) and are included in my app.scss file. And since I use purgecss, I had to add the chroma class to the safelist for the webpack plugin: `safelist: {greedy: [/phx/, /topbar/, /inline/, /chroma/]}` .)
|
||||
And, FWIW, here's the meat of my modified highlighter using chroma (NOTE: the CSS styles can be exported separately (like so: `~/go/bin/chroma -s base16-snazzy --html-styles > _chroma.css`), or you can use styles from Pygments, including custom styles like [nord_pygments](https://github.com/sbrisard/nord_pygments)). Once included in your app.scss, if you use purgecss like me, you'll need to add the chroma class (or whatever class you're using) to the safelist for the webpack plugin: `safelist: {greedy: [/phx/, /topbar/, /inline/, /chroma/]}` .)
|
||||
|
||||
```elixir
|
||||
def highlight_code_blocks(html) do
|
||||
|
@ -52,7 +52,7 @@ defp highlight_code_block(_full_block, lang, code) do
|
|||
File.write!(tmp_file, unescaped_code)
|
||||
|
||||
# use chroma to highlight the code via temp file
|
||||
bin_args = ["-l", lang, "-f", "html", "-s", @style, "--html-only", "--html-prevent-surrounding-pre", tmp_file]
|
||||
bin_args = ["-l", lang, "-f", "html", "--html-only", "--html-prevent-surrounding-pre", tmp_file]
|
||||
# The '@chroma_bin' module attribute retrieves the configured
|
||||
# location of the chroma cli binary from the application config.
|
||||
{highlighted, _} = System.cmd(@chroma_bin, bin_args)
|
||||
|
|
Loading…
Reference in a new issue