crab it 🦀
This commit is contained in:
parent
1f100b6a24
commit
d51e965908
|
@ -14,8 +14,7 @@ NIH syndrome :3
|
|||
|
||||
```bash
|
||||
# external dependencies (unfortunately i could not reasonably replace these with racket)
|
||||
(cd ext-mathml && npm install)
|
||||
pip3 install --user pygments
|
||||
(cd ext && cargo build)
|
||||
# install the package
|
||||
raco pkg install $PWD
|
||||
# ensure your PATH has racket stuff on it. replace 8.1 with your version
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
# todo
|
||||
|
||||
- prefers-color-scheme
|
||||
- firefox alternative stylesheets too maybe
|
||||
- rss/atom
|
||||
- webmentions
|
||||
- reject brave (lol)
|
||||
- support tor and opennic
|
||||
- activitypub
|
||||
- gopher and gemini variants
|
||||
- nginx caching headers
|
|
@ -1 +0,0 @@
|
|||
node_modules
|
|
@ -1,35 +0,0 @@
|
|||
#lang racket/base
|
||||
|
||||
(require racket/list racket/match racket/runtime-path racket/string xml
|
||||
"../util.rkt")
|
||||
|
||||
(define-runtime-path *js-path* "mathml-render.js")
|
||||
|
||||
(provide transform-xexprs scss-files)
|
||||
|
||||
(define (mathtex-type? s)
|
||||
(and (string? s) (regexp-match #rx"^math/tex" s) #t))
|
||||
|
||||
(define (transform-xexprs xexprs)
|
||||
(map transform-xexpr xexprs))
|
||||
|
||||
(define (run-mathjax source block?)
|
||||
(define out-str (run-external (list "node" (path->string *js-path*)) source))
|
||||
|
||||
(match-define (list 'math attrs bodies ...) (string->xexpr out-str))
|
||||
`(math ,(cons (list 'display (if block? "block" "inline"))
|
||||
(filter (λ (x) (not (eq? (first x) 'display))) attrs))
|
||||
,@bodies))
|
||||
|
||||
(define (transform-xexpr xexpr)
|
||||
(match xexpr
|
||||
[(list 'script (list (list 'type (? mathtex-type? type)))
|
||||
bodies ...)
|
||||
(define body (apply string-append bodies))
|
||||
(define block? (> (length (string-split type " ")) 1))
|
||||
(run-mathjax body block?)]
|
||||
[(list tag attrs body ...)
|
||||
(cons tag (cons attrs (map transform-xexpr body)))]
|
||||
[(? string? str) str]))
|
||||
|
||||
(define scss-files '())
|
|
@ -1,17 +0,0 @@
|
|||
const fs = require('fs');
|
||||
const mjAPI = require("mathjax-node");
|
||||
|
||||
mjAPI.config({
|
||||
MathJax: {}
|
||||
});
|
||||
mjAPI.start();
|
||||
|
||||
let data = fs.readFileSync(0, 'utf-8');
|
||||
|
||||
mjAPI.typeset({
|
||||
math: data,
|
||||
format: "TeX",
|
||||
mml: true,
|
||||
}, function (data) {
|
||||
if (!data.errors) {console.log(data.mml)}
|
||||
});
|
File diff suppressed because it is too large
Load Diff
|
@ -1,5 +0,0 @@
|
|||
{
|
||||
"dependencies": {
|
||||
"mathjax-node": "^2.1.1"
|
||||
}
|
||||
}
|
|
@ -1,31 +0,0 @@
|
|||
|
||||
// Config -----------------------------------
|
||||
$syntax-hue: 220;
|
||||
$syntax-saturation: 13%;
|
||||
$syntax-brightness: 18%;
|
||||
|
||||
|
||||
// Monochrome -----------------------------------
|
||||
$mono-1: hsl($syntax-hue, 14%, 71%); // default text
|
||||
$mono-2: hsl($syntax-hue, 9%, 55%);
|
||||
$mono-3: hsl($syntax-hue, 10%, 40%);
|
||||
|
||||
// Colors -----------------------------------
|
||||
$hue-1: hsl(187, 47%, 55%); // <-cyan
|
||||
$hue-2: hsl(207, 82%, 66%); // <-blue
|
||||
$hue-3: hsl(286, 60%, 67%); // <-purple
|
||||
$hue-4: hsl( 95, 38%, 62%); // <-green
|
||||
|
||||
$hue-5: hsl(355, 65%, 65%); // <-red 1
|
||||
$hue-5-2: hsl( 5, 48%, 51%); // <-red 2
|
||||
|
||||
$hue-6: hsl( 29, 54%, 61%); // <-orange 1
|
||||
$hue-6-2: hsl( 39, 67%, 69%); // <-orange 2
|
||||
|
||||
|
||||
// Base colors -----------------------------------
|
||||
$syntax-fg: $mono-1;
|
||||
$syntax-bg: hsl($syntax-hue, $syntax-saturation, $syntax-brightness);
|
||||
$syntax-gutter: darken($syntax-fg, 26%);
|
||||
$syntax-guide: fade($syntax-fg, 15%);
|
||||
$syntax-accent: hsl($syntax-hue, 100%, 66% );
|
|
@ -1,20 +0,0 @@
|
|||
Copyright (c) 2011-2021 GitHub Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@ -1,56 +0,0 @@
|
|||
@import "colors.scss";
|
||||
|
||||
// Official Syntax Variables -----------------------------------
|
||||
|
||||
// General colors
|
||||
$syntax-text-color: $syntax-fg;
|
||||
$syntax-cursor-color: $syntax-accent;
|
||||
$syntax-background-color: $syntax-bg;
|
||||
$syntax-selection-color: lighten($syntax-background-color, 10%);
|
||||
$syntax-selection-flash-color: $syntax-accent;
|
||||
|
||||
// Guide colors
|
||||
$syntax-wrap-guide-color: $syntax-guide;
|
||||
$syntax-indent-guide-color: $syntax-guide;
|
||||
$syntax-invisible-character-color: $syntax-guide;
|
||||
|
||||
// For find and replace markers
|
||||
$syntax-result-marker-color: fade($syntax-accent, 24%);
|
||||
$syntax-result-marker-color-selected: $syntax-accent;
|
||||
|
||||
// Gutter colors
|
||||
$syntax-gutter-text-color: $syntax-gutter;
|
||||
$syntax-gutter-text-color-selected: $syntax-fg;
|
||||
$syntax-gutter-background-color: $syntax-bg; // unused
|
||||
$syntax-gutter-background-color-selected: lighten($syntax-bg, 2%);
|
||||
|
||||
// Git colors - For git diff info. i.e. in the gutter
|
||||
$syntax-color-renamed: hsl(208, 100%, 60%);
|
||||
$syntax-color-added: hsl(150, 60%, 54%);
|
||||
$syntax-color-modified: hsl(40, 60%, 70%);
|
||||
$syntax-color-removed: hsl(0, 70%, 60%);
|
||||
|
||||
// For language entity colors
|
||||
$syntax-color-variable: $hue-5;
|
||||
$syntax-color-constant: $hue-6;
|
||||
$syntax-color-property: $syntax-fg;
|
||||
$syntax-color-value: $syntax-fg;
|
||||
$syntax-color-function: $hue-2;
|
||||
$syntax-color-method: $hue-2;
|
||||
$syntax-color-class: $hue-6-2;
|
||||
$syntax-color-keyword: $hue-3;
|
||||
$syntax-color-tag: $hue-5;
|
||||
$syntax-color-attribute: $hue-6;
|
||||
$syntax-color-import: $hue-3;
|
||||
$syntax-color-snippet: $hue-4;
|
||||
|
||||
|
||||
// Custom Syntax Variables -----------------------------------
|
||||
// Don't use in packages
|
||||
|
||||
$syntax-cursor-line: hsla($syntax-hue, 100%, 80%, .04); // needs to be semi-transparent to show search results
|
||||
|
||||
$syntax-deprecated-fg: darken($syntax-color-modified, 50%);
|
||||
$syntax-deprecated-bg: $syntax-color-modified;
|
||||
$syntax-illegal-fg: white;
|
||||
$syntax-illegal-bg: $syntax-color-removed;
|
|
@ -1,106 +0,0 @@
|
|||
// LESS for Pygments
|
||||
|
||||
@import "syntax-variables.scss";
|
||||
|
||||
pre.highlight, .highlight {
|
||||
background: $syntax-bg;
|
||||
color: $mono-1;
|
||||
}
|
||||
|
||||
.highlighttable {
|
||||
background: $syntax-gutter-background-color;
|
||||
color: $syntax-gutter-text-color;
|
||||
|
||||
margin: 0.5em;
|
||||
|
||||
pre {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.linenos {
|
||||
user-select: none;
|
||||
}
|
||||
}
|
||||
|
||||
.highlight {
|
||||
pre { background: $syntax-bg; }
|
||||
.hll { background: $syntax-bg; }
|
||||
.c { color: $mono-3; font-style: italic; } /* Comment */
|
||||
.err { color: $syntax-illegal-fg; background-color: $syntax-illegal-bg; } /* Error */
|
||||
.k { color: $hue-3; } /* Keyword */
|
||||
.l { color: $hue-4; } /* Literal */
|
||||
.n { color: $mono-1; } /* Name */
|
||||
.o { color: $mono-1; } /* Operator */
|
||||
.p { color: $mono-1; } /* Punctuation */
|
||||
.cm { color: $mono-3; font-style: italic; } /* Comment.Multiline */
|
||||
.cp { color: $mono-3; font-style: italic; } /* Comment.Preproc */
|
||||
.c1 { color: $mono-3; font-style: italic; } /* Comment.Single */
|
||||
.cs { color: $mono-3; font-style: italic; } /* Comment.Special */
|
||||
.ge { font-style: italic } /* Generic.Emph */
|
||||
.gs { font-weight: bold } /* Generic.Strong */
|
||||
.kc { color: $hue-3; } /* Keyword.Constant */
|
||||
.kd { color: $hue-3; } /* Keyword.Declaration */
|
||||
.kn { color: $hue-3; } /* Keyword.Namespace */
|
||||
.kp { color: $hue-3; } /* Keyword.Pseudo */
|
||||
.kr { color: $hue-3; } /* Keyword.Reserved */
|
||||
.kt { color: $hue-3; } /* Keyword.Type */
|
||||
.ld { color: $hue-4; } /* Literal.Date */
|
||||
.m { color: $hue-6; } /* Literal.Number */
|
||||
.s { color: $hue-4; } /* Literal.String */
|
||||
.na { color: $hue-6; } /* Name.Attribute */
|
||||
.nb { color: $hue-6-2; } /* Name.Builtin */
|
||||
.nc { color: $hue-6-2; } /* Name.Class */
|
||||
.no { color: $hue-6-2; } /* Name.Constant */
|
||||
.nd { color: $hue-6-2; } /* Name.Decorator */
|
||||
.ni { color: $hue-6-2; } /* Name.Entity */
|
||||
.ne { color: $hue-6-2; } /* Name.Exception */
|
||||
.nf { color: $hue-2; } /* Name.Function */
|
||||
.nl { color: $hue-6-2; } /* Name.Label */
|
||||
.nn { color: $mono-1; } /* Name.Namespace */
|
||||
.nx { color: $mono-1; } /* Name.Other */
|
||||
.py { color: $hue-6-2; } /* Name.Property */
|
||||
.nt { color: $hue-5; } /* Name.Tag */
|
||||
.nv { color: $hue-6-2; } /* Name.Variable */
|
||||
.ow { font-weight: bold; } /* Operator.Word */
|
||||
.w { color: #f8f8f2 } /* Text.Whitespace */
|
||||
.mf { color: $hue-6; } /* Literal.Number.Float */
|
||||
.mh { color: $hue-6; } /* Literal.Number.Hex */
|
||||
.mi { color: $hue-6; } /* Literal.Number.Integer */
|
||||
.mo { color: $hue-6; } /* Literal.Number.Oct */
|
||||
.sb { color: $hue-4; } /* Literal.String.Backtick */
|
||||
.sc { color: $hue-4; } /* Literal.String.Char */
|
||||
.sd { color: $hue-4; } /* Literal.String.Doc */
|
||||
.s2 { color: $hue-4; } /* Literal.String.Double */
|
||||
.se { color: $hue-4; } /* Literal.String.Escape */
|
||||
.sh { color: $hue-4; } /* Literal.String.Heredoc */
|
||||
.si { color: $hue-4; } /* Literal.String.Interpol */
|
||||
.sx { color: $hue-4; } /* Literal.String.Other */
|
||||
.sr { color: $hue-1; } /* Literal.String.Regex */
|
||||
.s1 { color: $hue-4; } /* Literal.String.Single */
|
||||
.ss { color: $hue-1; } /* Literal.String.Symbol */
|
||||
.bp { color: $hue-6-2; } /* Name.Builtin.Pseudo */
|
||||
.vc { color: $hue-6-2; } /* Name.Variable.Class */
|
||||
.vg { color: $hue-6-2; } /* Name.Variable.Global */
|
||||
.vi { color: $hue-5; } /* Name.Variable.Instance */
|
||||
.il { color: $hue-6; } /* Literal.Number.Integer.Long */
|
||||
|
||||
.gh { } /* Generic Heading & Diff Header */
|
||||
.gu { color: #75715e; } /* Generic.Subheading & Diff Unified/Comment? */
|
||||
.gd { color: $syntax-color-removed; } /* Generic.Deleted & Diff Deleted */
|
||||
.gi { color: $syntax-color-added; } /* Generic.Inserted & Diff Inserted */
|
||||
|
||||
::selection { background-color: $syntax-selection-color; }
|
||||
|
||||
.language-json {
|
||||
.w + .s2 { color: $hue-5; }
|
||||
.kc { color: $hue-1; }
|
||||
}
|
||||
|
||||
.language-python {
|
||||
// python related modifications
|
||||
}
|
||||
|
||||
.language-csharp {
|
||||
// csharp related modifications
|
||||
}
|
||||
}
|
|
@ -1,36 +0,0 @@
|
|||
#lang racket/base
|
||||
|
||||
(require racket/list racket/match racket/runtime-path racket/string xml
|
||||
"../util.rkt")
|
||||
|
||||
(define-runtime-path *python-path* "syntax-render.py")
|
||||
(define-runtime-path *css-path* "css")
|
||||
|
||||
(provide transform-xexprs scss-files)
|
||||
|
||||
(define (brush-class? s)
|
||||
(and (string? s) (regexp-match #rx"^brush:" s) #t))
|
||||
|
||||
(define (transform-xexprs xexprs)
|
||||
(map transform-xexpr xexprs))
|
||||
|
||||
(define (run-pygments lang source)
|
||||
(define out-str
|
||||
(run-external (list "python3" (path->string *python-path*) lang) source))
|
||||
(string->xexpr out-str))
|
||||
|
||||
(define (transform-xexpr xexpr)
|
||||
(match xexpr
|
||||
[(list 'pre (list (list 'class (? brush-class? cls)))
|
||||
(list 'code '() bodies ...))
|
||||
(define lang (second (string-split cls " ")))
|
||||
(define body (apply string-append bodies))
|
||||
(run-pygments lang body)]
|
||||
[(list 'pre '() (list 'code '() bodies ...))
|
||||
(define body (apply string-append bodies))
|
||||
(run-pygments "text" body)]
|
||||
[(list tag attrs body ...)
|
||||
(cons tag (cons attrs (map transform-xexpr body)))]
|
||||
[(? string? str) str]))
|
||||
|
||||
(define scss-files (list (build-path *css-path* "syntax.scss")))
|
|
@ -1,17 +0,0 @@
|
|||
import sys
|
||||
|
||||
from pygments import highlight
|
||||
from pygments.lexers import get_lexer_by_name
|
||||
from pygments.util import ClassNotFound
|
||||
from pygments.formatters import HtmlFormatter
|
||||
|
||||
formatter = HtmlFormatter(linenos="table", encoding="utf-8")
|
||||
|
||||
try:
|
||||
lexer = get_lexer_by_name(sys.argv[1], encoding="utf-8")
|
||||
except IndexError:
|
||||
sys.stderr.write("must provide lexer name")
|
||||
except:
|
||||
sys.stderr.write(f"couldn't find lexer {sys.argv[1]}\n")
|
||||
|
||||
sys.stdout.write(highlight(sys.stdin.read(), lexer, formatter).decode("utf-8"))
|
|
@ -0,0 +1 @@
|
|||
target
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,7 @@
|
|||
[workspace]
|
||||
members = [
|
||||
"syntax",
|
||||
"mathml",
|
||||
"fulltext",
|
||||
"capybara-ext"
|
||||
]
|
|
@ -0,0 +1,19 @@
|
|||
[package]
|
||||
name = "capybara-ext"
|
||||
version = "0.1.0"
|
||||
authors = ["haskal <haskal@awoo.systems>"]
|
||||
edition = "2018"
|
||||
|
||||
[lib]
|
||||
name = "capybara"
|
||||
crate_type = ["dylib"]
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
serde = { version = "1.0", features = ["derive"] }
|
||||
serde-lexpr = "0.1.2"
|
||||
|
||||
syntax = { path = "../syntax" }
|
||||
mathml = { path = "../mathml" }
|
||||
fulltext = { path = "../fulltext" }
|
|
@ -0,0 +1,4 @@
|
|||
#[no_mangle]
|
||||
pub extern "C" fn meow() -> u64 {
|
||||
1337
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
use serde::{Serialize, Deserialize};
|
||||
|
||||
use syntax::{highlight, get_css};
|
||||
use mathml::convert;
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug)]
|
||||
enum Command {
|
||||
Highlight { language: String, source: String },
|
||||
HighlightCss,
|
||||
Mathml { source: String, blockp: bool }
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let stdin = std::io::stdin();
|
||||
let stdout = std::io::stdout();
|
||||
let result = (||{
|
||||
match serde_lexpr::from_reader(stdin) {
|
||||
Ok(Command::Highlight { ref language, ref source }) =>
|
||||
highlight(&language, &source),
|
||||
Ok(Command::HighlightCss) =>
|
||||
Ok(get_css()),
|
||||
Ok(Command::Mathml { ref source, blockp }) =>
|
||||
convert(&source, blockp),
|
||||
Err(err) =>
|
||||
Err(format!("parse error: {}", err))
|
||||
}
|
||||
})();
|
||||
serde_lexpr::to_writer(&stdout, &result).unwrap();
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
[package]
|
||||
name = "fulltext"
|
||||
version = "0.1.0"
|
||||
authors = ["haskal <haskal@awoo.systems>"]
|
||||
edition = "2018"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
tantivy = "0.15.0"
|
|
@ -0,0 +1,86 @@
|
|||
#[macro_use]
|
||||
extern crate tantivy;
|
||||
|
||||
use tantivy::collector::TopDocs;
|
||||
use tantivy::query::QueryParser;
|
||||
use tantivy::schema::*;
|
||||
use tantivy::Index;
|
||||
use tantivy::ReloadPolicy;
|
||||
|
||||
pub fn make_index() -> tantivy::Result<()> {
|
||||
let mut schema_builder = Schema::builder();
|
||||
schema_builder.add_text_field("title", TEXT | STORED);
|
||||
schema_builder.add_text_field("body", TEXT);
|
||||
let schema = schema_builder.build();
|
||||
|
||||
let index = Index::create_in_ram(schema.clone());
|
||||
|
||||
let mut index_writer = index.writer(50_000_000)?;
|
||||
let title = schema.get_field("title").unwrap();
|
||||
let body = schema.get_field("body").unwrap();
|
||||
|
||||
let mut old_man_doc = Document::default();
|
||||
old_man_doc.add_text(title, "The Old Man and the Sea");
|
||||
old_man_doc.add_text(
|
||||
body,
|
||||
"He was an old man who fished alone in a skiff in the Gulf Stream and \
|
||||
he had gone eighty-four days now without taking a fish.",
|
||||
);
|
||||
|
||||
index_writer.add_document(old_man_doc);
|
||||
|
||||
index_writer.add_document(doc!(
|
||||
title => "Of Mice and Men",
|
||||
body => "A few miles south of Soledad, the Salinas River drops in close to the hillside \
|
||||
bank and runs deep and green. The water is warm too, for it has slipped twinkling \
|
||||
over the yellow sands in the sunlight before reaching the narrow pool. On one \
|
||||
side of the river the golden foothill slopes curve up to the strong and rocky \
|
||||
Gabilan Mountains, but on the valley side the water is lined with trees—willows \
|
||||
fresh and green with every spring, carrying in their lower leaf junctures the \
|
||||
debris of the winter’s flooding; and sycamores with mottled, white, recumbent \
|
||||
limbs and branches that arch over the pool"
|
||||
));
|
||||
|
||||
index_writer.add_document(doc!(
|
||||
title => "Of Mice and Men",
|
||||
body => "A few miles south of Soledad, the Salinas River drops in close to the hillside \
|
||||
bank and runs deep and green. The water is warm too, for it has slipped twinkling \
|
||||
over the yellow sands in the sunlight before reaching the narrow pool. On one \
|
||||
side of the river the golden foothill slopes curve up to the strong and rocky \
|
||||
Gabilan Mountains, but on the valley side the water is lined with trees—willows \
|
||||
fresh and green with every spring, carrying in their lower leaf junctures the \
|
||||
debris of the winter’s flooding; and sycamores with mottled, white, recumbent \
|
||||
limbs and branches that arch over the pool"
|
||||
));
|
||||
|
||||
index_writer.add_document(doc!(
|
||||
title => "Frankenstein",
|
||||
title => "The Modern Prometheus",
|
||||
body => "You will rejoice to hear that no disaster has accompanied the commencement of an \
|
||||
enterprise which you have regarded with such evil forebodings. I arrived here \
|
||||
yesterday, and my first task is to assure my dear sister of my welfare and \
|
||||
increasing confidence in the success of my undertaking."
|
||||
));
|
||||
|
||||
index_writer.commit()?;
|
||||
|
||||
let reader = index
|
||||
.reader_builder()
|
||||
.reload_policy(ReloadPolicy::OnCommit)
|
||||
.try_into()?;
|
||||
|
||||
let searcher = reader.searcher();
|
||||
|
||||
let query_parser = QueryParser::for_index(&index, vec![title, body]);
|
||||
|
||||
let query = query_parser.parse_query("sea whale")?;
|
||||
|
||||
let top_docs = searcher.search(&query, &TopDocs::with_limit(10))?;
|
||||
|
||||
for (_score, doc_address) in top_docs {
|
||||
let retrieved_doc = searcher.doc(doc_address)?;
|
||||
println!("{}", schema.to_json(&retrieved_doc));
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
|
@ -0,0 +1,58 @@
|
|||
#lang racket/base
|
||||
|
||||
(require racket/list racket/match racket/runtime-path racket/string xml
|
||||
"../util.rkt")
|
||||
|
||||
(define-runtime-path *ext-path* "target/debug/capybara-ext")
|
||||
|
||||
(provide transform-xexprs get-scss-include)
|
||||
|
||||
(define (mathtex-type? s)
|
||||
(and (string? s) (regexp-match #rx"^math/tex" s) #t))
|
||||
|
||||
(define (brush-class? s)
|
||||
(and (string? s) (regexp-match #rx"^brush:" s) #t))
|
||||
|
||||
(define (transform-xexprs xexprs)
|
||||
(map transform-xexpr xexprs))
|
||||
|
||||
(define (run-highlight lang source)
|
||||
(match
|
||||
(run-external
|
||||
(path->string *ext-path*)
|
||||
`(Highlight (language . ,lang) (source . ,source)))
|
||||
[`(Ok . ,result) (string->xexpr result)]
|
||||
[`(Err . ,err) (error "syntax highlighting error:" err)]))
|
||||
|
||||
(define (run-mathml source block?)
|
||||
(match
|
||||
(run-external
|
||||
(path->string *ext-path*)
|
||||
`(Mathml (source . ,source) (blockp . ,block?)))
|
||||
[`(Ok . ,result) (string->xexpr result)]
|
||||
[`(Err . ,err) (error "mathml rendering error:" err)]))
|
||||
|
||||
(define (transform-xexpr xexpr)
|
||||
(match xexpr
|
||||
[(list 'script (list (list 'type (? mathtex-type? type)))
|
||||
bodies ...)
|
||||
(define body (apply string-append bodies))
|
||||
(define block? (> (length (string-split type " ")) 1))
|
||||
(run-mathml body block?)]
|
||||
[(list 'pre (list (list 'class (? brush-class? cls)))
|
||||
(list 'code '() bodies ...))
|
||||
(define lang (second (string-split cls " ")))
|
||||
(define body (apply string-append bodies))
|
||||
(run-highlight lang body)]
|
||||
[(list 'pre '() (list 'code '() bodies ...))
|
||||
(define body (apply string-append bodies))
|
||||
(run-highlight "txt" body)]
|
||||
[(list tag attrs body ...)
|
||||
(cons tag (cons attrs (map transform-xexpr body)))]
|
||||
[(? string? str) str]))
|
||||
|
||||
(define (get-scss-include)
|
||||
(match
|
||||
(run-external (path->string *ext-path*) '(HighlightCss))
|
||||
[`(Ok . ,result) result]
|
||||
[`(Err . ,err) (error "syntax highlighting error:" err)]))
|
|
@ -0,0 +1,10 @@
|
|||
[package]
|
||||
name = "mathml"
|
||||
version = "0.1.0"
|
||||
authors = ["haskal <haskal@awoo.systems>"]
|
||||
edition = "2018"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
latex2mathml = "0.2.3"
|
|
@ -0,0 +1,8 @@
|
|||
use std::result::Result;
|
||||
|
||||
use latex2mathml::{DisplayStyle, latex_to_mathml};
|
||||
|
||||
pub fn convert(source: &str, blockp: bool) -> Result<String, String> {
|
||||
latex_to_mathml(source, if blockp { DisplayStyle::Block } else { DisplayStyle::Inline })
|
||||
.map_err(|err| format!("latex error: {}", err))
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
[package]
|
||||
name = "syntax"
|
||||
version = "0.1.0"
|
||||
authors = ["haskal <haskal@awoo.systems>"]
|
||||
edition = "2018"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
syntect = "4.4"
|
|
@ -1,6 +1,6 @@
|
|||
MIT License
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2016 Mihály Gyöngyösi
|
||||
Copyright (c) 2016 Andres Michel
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
|
@ -0,0 +1,876 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>author</key>
|
||||
<string>IceTimux / Andres Michel</string>
|
||||
<key>name</key>
|
||||
<string>One Dark</string>
|
||||
<key>settings</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#6c7079</string>
|
||||
<key>background</key>
|
||||
<string>#2B303B</string>
|
||||
<key>invisibles</key>
|
||||
<string>#747369</string>
|
||||
<key>caret</key>
|
||||
<string>#528bff</string>
|
||||
<key>lineHighlight</key>
|
||||
<string>#8cc2fc0b</string>
|
||||
<key>bracketContentsOptions</key>
|
||||
<string>underline</string>
|
||||
<key>bracketContentsForeground</key>
|
||||
<string>#528bff</string>
|
||||
<key>bracketsOptions</key>
|
||||
<string>underline</string>
|
||||
<key>bracketsForeground</key>
|
||||
<string>#528bff</string>
|
||||
<key>tagsOptions</key>
|
||||
<string>underline</string>
|
||||
<key>tagsForeground</key>
|
||||
<string>#528bff</string>
|
||||
<key>findHighlight</key>
|
||||
<string>#314365</string>
|
||||
<key>findHighlightForeground</key>
|
||||
<string>#528bff</string>
|
||||
<key>gutter</key>
|
||||
<string>#2B303B</string>
|
||||
<key>gutterForeground</key>
|
||||
<string>#636d8388</string>
|
||||
<key>selection</key>
|
||||
<string>#bbccf51b</string>
|
||||
<key>selectionBorder</key>
|
||||
<string>#bbccf51b</string>
|
||||
<key>inactiveSelection</key>
|
||||
<string>#bbccf51b</string>
|
||||
<key>guide</key>
|
||||
<string>#464c55</string>
|
||||
<key>activeGuide</key>
|
||||
<string>#464c55</string>
|
||||
<key>stackGuide</key>
|
||||
<string>#464c55</string>
|
||||
<key>highlight</key>
|
||||
<string>#528bff80</string>
|
||||
<key>highlightForeground</key>
|
||||
<string>#528bff</string>
|
||||
<key>shadow</key>
|
||||
<string>#2B303B</string>
|
||||
<key>shadowWidth</key>
|
||||
<string>1</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Text and source</string>
|
||||
<key>scope</key>
|
||||
<string>text, source</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#abb2bf</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Text</string>
|
||||
<key>scope</key>
|
||||
<string>variable.parameter.function</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#adb7c9</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Comments</string>
|
||||
<key>scope</key>
|
||||
<string>comment, punctuation.definition.comment</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#5f697a</string>
|
||||
<key>fontStyle</key>
|
||||
<string> italic</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Delimiters</string>
|
||||
<key>scope</key>
|
||||
<string>none</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#adb7c9</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Operators</string>
|
||||
<key>scope</key>
|
||||
<string>keyword.operator</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#adb7c9</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Keywords</string>
|
||||
<key>scope</key>
|
||||
<string>keyword</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#cd74e8</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Variables</string>
|
||||
<key>scope</key>
|
||||
<string>variable</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#eb6772</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Functions</string>
|
||||
<key>scope</key>
|
||||
<string>entity.name.function, meta.require, support.function.any-method</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#5cb3fa</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Classes</string>
|
||||
<key>scope</key>
|
||||
<string>support.class, entity.name.class, entity.name.type.class</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f0c678</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Classes</string>
|
||||
<key>scope</key>
|
||||
<string>meta.class</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#adb7c9</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Methods</string>
|
||||
<key>scope</key>
|
||||
<string>keyword.other.special-method</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#5cb3fa</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Storage</string>
|
||||
<key>scope</key>
|
||||
<string>storage</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#cd74e8</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Support</string>
|
||||
<key>scope</key>
|
||||
<string>support.function</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#5ebfcc</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Strings, Inherited Class</string>
|
||||
<key>scope</key>
|
||||
<string>string, constant.other.symbol, entity.other.inherited-class</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#9acc76</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Integers</string>
|
||||
<key>scope</key>
|
||||
<string>constant.numeric</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#db9d63</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Floats</string>
|
||||
<key>scope</key>
|
||||
<string>none</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#db9d63</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Boolean</string>
|
||||
<key>scope</key>
|
||||
<string>none</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#db9d63</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Constants</string>
|
||||
<key>scope</key>
|
||||
<string>constant</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#db9d63</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Tags</string>
|
||||
<key>scope</key>
|
||||
<string>entity.name.tag</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#eb6772</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Attributes</string>
|
||||
<key>scope</key>
|
||||
<string>entity.other.attribute-name</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#db9d63</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Attribute IDs</string>
|
||||
<key>scope</key>
|
||||
<string>entity.other.attribute-name.id, punctuation.definition.entity</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#db9d63</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Selector</string>
|
||||
<key>scope</key>
|
||||
<string>meta.selector</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#cd74e8</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Values</string>
|
||||
<key>scope</key>
|
||||
<string>none</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#db9d63</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Headings</string>
|
||||
<key>scope</key>
|
||||
<string>markup.heading punctuation.definition.heading, entity.name.section</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>fontStyle</key>
|
||||
<string></string>
|
||||
<key>foreground</key>
|
||||
<string>#5cb3fa</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Units</string>
|
||||
<key>scope</key>
|
||||
<string>keyword.other.unit</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#db9d63</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Bold</string>
|
||||
<key>scope</key>
|
||||
<string>markup.bold, punctuation.definition.bold</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f0c678</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Italic</string>
|
||||
<key>scope</key>
|
||||
<string>markup.italic, punctuation.definition.italic</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#cd74e8</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Code</string>
|
||||
<key>scope</key>
|
||||
<string>markup.raw.inline</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#9acc76</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Link Text</string>
|
||||
<key>scope</key>
|
||||
<string>string.other.link, punctuation.definition.string.end.markdown</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#eb6772</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Link Url</string>
|
||||
<key>scope</key>
|
||||
<string>meta.link</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#db9d63</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Lists</string>
|
||||
<key>scope</key>
|
||||
<string>markup.list</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#eb6772</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Quotes</string>
|
||||
<key>scope</key>
|
||||
<string>markup.quote</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#db9d63</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Separator</string>
|
||||
<key>scope</key>
|
||||
<string>meta.separator</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>background</key>
|
||||
<string>#515151</string>
|
||||
<key>foreground</key>
|
||||
<string>#adb7c9</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Inserted</string>
|
||||
<key>scope</key>
|
||||
<string>markup.inserted</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#9acc76</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Deleted</string>
|
||||
<key>scope</key>
|
||||
<string>markup.deleted</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#eb6772</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Changed</string>
|
||||
<key>scope</key>
|
||||
<string>markup.changed</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#cd74e8</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Colors</string>
|
||||
<key>scope</key>
|
||||
<string>constant.other.color</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#5ebfcc</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Regular Expressions</string>
|
||||
<key>scope</key>
|
||||
<string>string.regexp</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#5ebfcc</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Escape Characters</string>
|
||||
<key>scope</key>
|
||||
<string>constant.character.escape</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#5ebfcc</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Embedded</string>
|
||||
<key>scope</key>
|
||||
<string>punctuation.section.embedded, variable.interpolation</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#c94e42</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Illegal</string>
|
||||
<key>scope</key>
|
||||
<string>invalid.illegal</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#ffffff</string>
|
||||
<key>background</key>
|
||||
<string>#e05252</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Broken</string>
|
||||
<key>scope</key>
|
||||
<string>invalid.broken</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>background</key>
|
||||
<string>#f99157</string>
|
||||
<key>foreground</key>
|
||||
<string>#2d2d2d</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Deprecated</string>
|
||||
<key>scope</key>
|
||||
<string>invalid.deprecated</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>background</key>
|
||||
<string>#d27b53</string>
|
||||
<key>foreground</key>
|
||||
<string>#2c323d</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Unimplemented</string>
|
||||
<key>scope</key>
|
||||
<string>invalid.unimplemented</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>background</key>
|
||||
<string>#747369</string>
|
||||
<key>foreground</key>
|
||||
<string>#2c323d</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Json key</string>
|
||||
<key>scope</key>
|
||||
<string>source.json meta.structure.dictionary.json string.quoted.double.json</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#eb6772</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Json value</string>
|
||||
<key>scope</key>
|
||||
<string>source.json meta.structure.dictionary.json meta.structure.dictionary.value.json string.quoted.double.json</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#9acc76</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>json sub key</string>
|
||||
<key>scope</key>
|
||||
<string>source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json string.quoted.double.json</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#eb6772</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>Json sub value</string>
|
||||
<key>scope</key>
|
||||
<string>source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json string.quoted.double.json</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#9acc76</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>laravel blade tag</string>
|
||||
<key>scope</key>
|
||||
<string>text.html.laravel-blade source.php.embedded.line.html entity.name.tag.laravel-blade</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#cd74e8</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>laravel blade @</string>
|
||||
<key>scope</key>
|
||||
<string>text.html.laravel-blade source.php.embedded.line.html support.constant.laravel-blade</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#cd74e8</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>python function parameter</string>
|
||||
<key>scope</key>
|
||||
<string>source.python meta.function.python meta.function.parameters.python variable.parameter.function.python</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#db9d63</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>python meta function</string>
|
||||
<key>scope</key>
|
||||
<string>source.python meta.function-call.python support.type.python</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#5ebfcc</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>python logical keyword</string>
|
||||
<key>scope</key>
|
||||
<string>source.python keyword.operator.logical.python</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#cd74e8</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>python class ( begin</string>
|
||||
<key>scope</key>
|
||||
<string>source.python meta.class.python punctuation.definition.inheritance.begin.python</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f0c678</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>python class ) end</string>
|
||||
<key>scope</key>
|
||||
<string>source.python meta.class.python punctuation.definition.inheritance.end.python</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f0c678</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>python function call parameter name</string>
|
||||
<key>scope</key>
|
||||
<string>source.python meta.function-call.python meta.function-call.arguments.python variable.parameter.function.python</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#db9d63</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>php fcuntion constants</string>
|
||||
<key>scope</key>
|
||||
<string>text.html.basic source.php.embedded.block.html support.constant.std.php</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#db9d63</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>php namespace name</string>
|
||||
<key>scope</key>
|
||||
<string>text.html.basic source.php.embedded.block.html meta.namespace.php entity.name.type.namespace.php</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#f0c678</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>javascript meta constant</string>
|
||||
<key>scope</key>
|
||||
<string>source.js meta.function.js support.constant.js</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#db9d63</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>php namespace in top</string>
|
||||
<key>scope</key>
|
||||
<string>text.html.basic` source.php.embedded.block.html constant.other.php</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#cd74e8</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>php namespace name in top</string>
|
||||
<key>scope</key>
|
||||
<string>text.html.basic source.php.embedded.block.html support.other.namespace.php</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#db9d63</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>latex label names</string>
|
||||
<key>scope</key>
|
||||
<string>text.tex.latex meta.function.environment.math.latex string.other.math.block.environment.latex meta.definition.label.latex variable.parameter.definition.label.latex</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#adb7c9</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>latex italic emph</string>
|
||||
<key>scope</key>
|
||||
<string>text.tex.latex meta.function.emph.latex markup.italic.emph.latex</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>fontStyle</key>
|
||||
<string> italic</string>
|
||||
<key>foreground</key>
|
||||
<string>#cd74e8</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>subl_new js vars</string>
|
||||
<key>scope</key>
|
||||
<string>source.js variable.other.readwrite.js</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#adb7c9</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>new_subl js $</string>
|
||||
<key>scope</key>
|
||||
<string>source.js meta.function-call.with-arguments.js variable.function.js</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#adb7c9</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>new_subl js call method</string>
|
||||
<key>scope</key>
|
||||
<string>source.js meta.group.braces.round meta.group.braces.curly meta.function-call.method.without-arguments.js variable.function.js</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#adb7c9</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>new_subl e js</string>
|
||||
<key>scope</key>
|
||||
<string>source.js meta.group.braces.round meta.group.braces.curly variable.other.object.js</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#adb7c9</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>new_subl js key</string>
|
||||
<key>scope</key>
|
||||
<string>source.js meta.group.braces.round meta.group.braces.curly constant.other.object.key.js string.unquoted.label.js</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#adb7c9</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>new_subl obejct key</string>
|
||||
<key>scope</key>
|
||||
<string>source.js meta.group.braces.round meta.group.braces.curly constant.other.object.key.js punctuation.separator.key-value.js</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#adb7c9</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>new_subl js method with args</string>
|
||||
<key>scope</key>
|
||||
<string>source.js meta.group.braces.round meta.group.braces.curly meta.function-call.method.with-arguments.js variable.function.js</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#adb7c9</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>new_subl js variable function</string>
|
||||
<key>scope</key>
|
||||
<string>source.js meta.function-call.method.with-arguments.js variable.function.js</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#adb7c9</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>new_subl variabel function method</string>
|
||||
<key>scope</key>
|
||||
<string>source.js meta.function-call.method.without-arguments.js variable.function.js</string>
|
||||
<key>settings</key>
|
||||
<dict>
|
||||
<key>foreground</key>
|
||||
<string>#adb7c9</string>
|
||||
</dict>
|
||||
</dict>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
|
@ -0,0 +1,29 @@
|
|||
use std::result::Result;
|
||||
|
||||
use syntect::html::{ClassedHTMLGenerator, ClassStyle, css_for_theme_with_class_style};
|
||||
use syntect::parsing::SyntaxSet;
|
||||
use syntect::highlighting::ThemeSet;
|
||||
use syntect::util::LinesWithEndings;
|
||||
|
||||
pub fn highlight(syntax_name: &str, source: &str) -> Result<String, String> {
|
||||
let syntax_set = SyntaxSet::load_defaults_newlines();
|
||||
let syntax = syntax_set.find_syntax_by_token(syntax_name)
|
||||
.ok_or(format!("couldn't find syntax {}", syntax_name))?;
|
||||
let mut html_generator =
|
||||
ClassedHTMLGenerator::new_with_class_style(&syntax, &syntax_set, ClassStyle::Spaced);
|
||||
for line in LinesWithEndings::from(source) {
|
||||
html_generator.parse_html_for_line_which_includes_newline(&line);
|
||||
}
|
||||
|
||||
let result = html_generator.finalize();
|
||||
Ok(format!("<pre class=\"code\">{}</pre>", result))
|
||||
}
|
||||
|
||||
// const ONEDARK_THEME: &'static str = include_str!("../assets/One_Dark.tmTheme");
|
||||
|
||||
pub fn get_css() -> String {
|
||||
// let mut reader = std::io::Cursor::new(ONEDARK_THEME);
|
||||
// let theme = ThemeSet::load_from_reader(&mut reader).unwrap();
|
||||
let theme = &ThemeSet::load_defaults().themes["base16-ocean.dark"];
|
||||
css_for_theme_with_class_style(&theme, ClassStyle::Spaced)
|
||||
}
|
14
render.rkt
14
render.rkt
|
@ -6,8 +6,7 @@
|
|||
"compiler.rkt" "defs.rkt" "fetch.rkt"
|
||||
threading
|
||||
(prefix-in sass: sass)
|
||||
(prefix-in mathml: "ext-mathml/main.rkt")
|
||||
(prefix-in syntax: "ext-syntax/main.rkt")
|
||||
(prefix-in ext: "ext/main.rkt")
|
||||
(prefix-in page: "templates/page.html.rkt"))
|
||||
|
||||
(provide scan-for-rules)
|
||||
|
@ -20,7 +19,9 @@
|
|||
(define *index.md* (build-path "index.md"))
|
||||
(define *config.rktd* (build-path "config.rktd"))
|
||||
|
||||
(define *reserved-slugs* (set (build-path "hashtag") (build-path "user") (build-path "tech")))
|
||||
(define *reserved-slugs*
|
||||
(apply set (map build-path '("hashtag" "user" "tech" "capybara" "dynamic" "robots.txt"
|
||||
"sitemap.xml" "feeds"))))
|
||||
|
||||
(define (read-input-doc xref-name [port (current-input-port)])
|
||||
(define metadata (read port))
|
||||
|
@ -103,7 +104,7 @@
|
|||
(match-define (input-doc md xref-name text) doc)
|
||||
(define output-raw (parse-markdown text))
|
||||
(define output-cooked
|
||||
(~> output-raw syntax:transform-xexprs mathml:transform-xexprs
|
||||
(~> output-raw ext:transform-xexprs
|
||||
(extract-text-starting-with/many *hashtag-char* 'hashtag)
|
||||
(extract-text-starting-with/many *user-char* 'user)
|
||||
(extract-prefixed-links/many *xref-char* 'xref)
|
||||
|
@ -190,10 +191,11 @@
|
|||
(with-output-to-string (λ () (display "<!doctype html>") (display-xexpr document)))))
|
||||
|
||||
(define (compile-index-scss index.scss)
|
||||
(define scss-files (cons *render.scss* (append mathml:scss-files syntax:scss-files)))
|
||||
(define scss-files (list *render.scss*))
|
||||
(define top-level-style
|
||||
(string-join
|
||||
(cons index.scss (map (λ (x) (format "@import \"~a\";" (path->string x))) scss-files))
|
||||
(apply list index.scss (ext:get-scss-include)
|
||||
(map (λ (x) (format "@import \"~a\";" (path->string x))) scss-files))
|
||||
"\n"))
|
||||
(sass:compile/string top-level-style #t))
|
||||
|
||||
|
|
16
util.rkt
16
util.rkt
|
@ -11,16 +11,16 @@
|
|||
(define (~r/pad num pad-to)
|
||||
(~r num #:min-width pad-to #:pad-string "0"))
|
||||
|
||||
(define (run-external argv source)
|
||||
(printf " running external program: ~a\n" argv)
|
||||
(define (run-external prog input)
|
||||
(printf " running external program: ~a\n" prog)
|
||||
(define-values [proc out in err]
|
||||
(apply subprocess #f #f #f "/usr/bin/env" argv))
|
||||
(define out-str #f)
|
||||
(subprocess #f #f #f prog))
|
||||
(define out-val #f)
|
||||
(define err-str "")
|
||||
(define out-reader (thread (λ () (set! out-str (port->string out)))))
|
||||
(define out-reader (thread (λ () (set! out-val (read out)))))
|
||||
(define err-reader (thread (λ () (set! err-str (port->string err)))))
|
||||
|
||||
(write-string source in)
|
||||
(write input in)
|
||||
(flush-output in)
|
||||
(close-output-port in)
|
||||
|
||||
|
@ -32,7 +32,7 @@
|
|||
(unless (string=? "" err-trimmed)
|
||||
(error "child process raised error!" err-trimmed))
|
||||
|
||||
(unless out-str
|
||||
(unless out-val
|
||||
(error "child process didn't return anything!"))
|
||||
|
||||
out-str)
|
||||
out-val)
|
||||
|
|
Loading…
Reference in New Issue