Add files

This commit is contained in:
ge 2022-08-07 14:03:38 +03:00
parent 77499a5bd8
commit 82c56a247d
25 changed files with 3814 additions and 4 deletions

8
.gitignore vendored
View File

@ -1,5 +1,5 @@
build/
assets/
content/
layouts/
settings.toml
#assets/
#content/
#layouts/
#settings.toml

33
assets/css/custom.css Normal file
View File

@ -0,0 +1,33 @@
body {
padding: 2rem;
max-width: 70ch;
font-family: 'Source Code Pro', monospace;
font-size: 18px;
line-height: 1.3;
}
ul#posts li {
list-style: none;
padding: 0;
margin: .5rem 0;
}
ul#posts {
padding: 0;
}
span.meta {
font-size: 80%;
}
header {
margin: 2rem 0;
}
footer {
margin-top: 2rem;
}
p {
text-align: justify;
}

View File

@ -0,0 +1,2 @@
Source URL:
https://docutils.sourceforge.io/docutils/writers/html5_polyglot/

View File

@ -0,0 +1,332 @@
/*
* math2html: convert LaTeX equations to HTML output.
*
* Copyright (C) 2009,2010 Alex Fernández
* 2021 Günter Milde
*
* Released under the terms of the `2-Clause BSD license'_, in short:
* Copying and distribution of this file, with or without modification,
* are permitted in any medium without royalty provided the copyright
* notice and this notice are preserved.
* This file is offered as-is, without any warranty.
*
* .. _2-Clause BSD license: http://www.spdx.org/licenses/BSD-2-Clause
*
* Based on eLyXer: convert LyX source files to HTML output.
* http://elyxer.nongnu.org/
*
*
* CSS file for LaTeX formulas.
*
* References: http://www.zipcon.net/~swhite/docs/math/math.html
* http://www.cs.tut.fi/~jkorpela/math/
*/
/* Formulas */
.formula {
text-align: center;
margin: 1.2em 0;
line-height: 1.4;
}
span.formula {
white-space: nowrap;
}
div.formula {
padding: 0.5ex;
margin-left: auto;
margin-right: auto;
}
/* Basic features */
a.eqnumber {
display: inline-block;
float: right;
clear: right;
font-weight: bold;
}
span.unknown {
color: #800000;
}
span.ignored, span.arraydef {
display: none;
}
.phantom {
visibility: hidden;
}
.formula i {
letter-spacing: 0.1ex;
}
/* Alignment */
.align-left, .align-l {
text-align: left;
}
.align-right, .align-r {
text-align: right;
}
.align-center, .align-c {
text-align: center;
}
/* Structures */
span.hspace {
display: inline-block;
}
span.overline, span.bar {
text-decoration: overline;
}
.fraction, .fullfraction, .textfraction {
display: inline-block;
vertical-align: middle;
text-align: center;
}
span.formula .fraction,
.textfraction,
span.smallmatrix {
font-size: 80%;
line-height: 1;
}
span.numerator {
display: block;
line-height: 1;
}
span.denominator {
display: block;
line-height: 1;
padding: 0ex;
border-top: thin solid;
}
.formula sub, .formula sup {
font-size: 80%;
}
sup.numerator, sup.unit {
vertical-align: 80%;
}
sub.denominator, sub.unit {
vertical-align: -20%;
}
span.smallsymbol {
font-size: 75%;
line-height: 75%;
}
span.boldsymbol {
font-weight: bold;
}
span.sqrt {
display: inline-block;
vertical-align: middle;
padding: 0.1ex;
}
sup.root {
position: relative;
left: 1.4ex;
}
span.radical {
display: inline-block;
padding: 0ex;
/* font-size: 160%; for DejaVu, not required with STIX */
line-height: 100%;
vertical-align: top;
vertical-align: middle;
}
span.root {
display: inline-block;
border-top: thin solid;
padding: 0ex;
vertical-align: middle;
}
div.formula .bigoperator,
.displaystyle .bigoperator,
.displaystyle .bigoperator {
line-height: 120%;
font-size: 140%;
padding-right: 0.2ex;
}
span.fraction .bigoperator,
span.scriptstyle .bigoperator {
line-height: inherit;
font-size: inherit;
padding-right: 0;
}
span.bigdelimiter {
display: inline-block;
}
span.bigdelimiter.size1 {
transform: scale(1, 1.2);
line-height: 1.2;
}
span.bigdelimiter.size2 {
transform: scale(1, 1.62);
line-height: 1.62%;
}
span.bigdelimiter.size3 {
transform: scale(1, 2.05);
line-height: 2.05%;
}
span.bigdelimiter.size4 {
transform: scale(1, 2.47);
line-height: 2.47%;
}
/* vertically stacked sub and superscript */
span.scripts {
display: inline-table;
vertical-align: middle;
padding-right: 0.2ex;
}
.script {
display: table-row;
text-align: left;
line-height: 150%;
}
span.limits {
display: inline-table;
vertical-align: middle;
}
.limit {
display: table-row;
line-height: 99%;
}
sup.limit, sub.limit {
line-height: 100%;
}
span.embellished,
span.embellished > .base {
display: inline-block;
}
span.embellished > sup,
span.embellished > sub {
display: inline-block;
font-size: 100%;
position: relative;
bottom: 0.3em;
width: 0px;
}
span.embellished > sub {
top: 0.4em;
}
/* Environments */
span.array, span.bracketcases, span.binomial, span.environment {
display: inline-table;
text-align: center;
vertical-align: middle;
}
span.arrayrow, span.binomrow {
display: table-row;
padding: 0;
border: 0;
}
span.arraycell, span.bracket, span.case, span.binomcell, span.environmentcell {
display: table-cell;
padding: 0ex 0.2ex;
line-height: 1; /* 99%; */
border: 0ex;
}
.environment.align > .arrayrow > .arraycell.align-l {
padding-right: 2em;
}
/* Inline binomials */
span.binom {
display: inline-block;
vertical-align: middle;
text-align: center;
font-size: 80%;
}
span.binomstack {
display: block;
padding: 0em;
}
/* Over- and underbraces */
span.overbrace {
border-top: 2pt solid;
}
span.underbrace {
border-bottom: 2pt solid;
}
/* Stackrel */
span.stackrel {
display: inline-block;
text-align: center;
}
span.upstackrel {
display: block;
padding: 0em;
font-size: 80%;
line-height: 64%;
position: relative;
top: 0.15em;
}
span.downstackrel {
display: block;
vertical-align: bottom;
padding: 0em;
}
/* Fonts */
.formula {
font-family: STIX, "DejaVu Serif", "DejaVu Math TeX Gyre", serif;
}
span.radical, /* ensure correct size of square-root sign */
span.integral { /* upright integral signs for better alignment of indices */
font-family: "STIXIntegralsUp", STIX;
/* font-size: 115%; match apparent size with DejaVu */
}
span.bracket {
/* some "STIX" and "DejaVu Math TeX Gyre" bracket pieces don't fit */
font-family: "DejaVu Serif", serif;
}
span.mathsf, span.textsf {
font-family: sans-serif;
}
span.mathrm, span.textrm {
font-family: STIX, "DejaVu Serif", "DejaVu Math TeX Gyre", serif;
}
span.mathtt, span.texttt {
font-family: monospace;
}
span.text, span.textnormal,
span.mathsf, span.mathtt, span.mathrm {
font-style: normal;
}
span.fraktur {
font-family: "Lucida Blackletter", eufm10, blackletter;
}
span.blackboard {
font-family: Blackboard, msbm10, serif;
}
span.scriptfont {
font-family: "Monotype Corsiva", "Apple Chancery", "URW Chancery L", cursive;
font-style: italic;
}
span.mathscr {
font-family: MathJax_Script, rsfs10, cursive;
font-style: italic;
}
span.textsc {
font-variant: small-caps;
}
span.textsl {
font-style: oblique;
}
/* Colors */
span.colorbox {
display: inline-block;
padding: 5px;
}
span.fbox {
display: inline-block;
border: thin solid black;
padding: 2px;
}
span.boxed, span.framebox {
display: inline-block;
border: thin solid black;
padding: 5px;
}

View File

@ -0,0 +1,276 @@
/* Minimal style sheet for the HTML output of Docutils. */
/* */
/* :Author: Günter Milde, based on html4css1.css by David Goodger */
/* :Id: $Id: minimal.css 9079 2022-06-19 14:00:56Z milde $ */
/* :Copyright: © 2015, 2021 Günter Milde. */
/* :License: Released under the terms of the `2-Clause BSD license`_, */
/* in short: */
/* */
/* Copying and distribution of this file, with or without modification, */
/* are permitted in any medium without royalty provided the copyright */
/* notice and this notice are preserved. */
/* */
/* This file is offered as-is, without any warranty. */
/* */
/* .. _2-Clause BSD license: http://www.spdx.org/licenses/BSD-2-Clause */
/* This CSS3 stylesheet defines rules for Docutils elements without */
/* HTML equivalent. It is required to make the document semantics visible. */
/* */
/* .. _validates: http://jigsaw.w3.org/css-validator/validator$link */
/* titles */
p.topic-title,
p.admonition-title,
p.system-message-title {
font-weight: bold;
}
p.sidebar-title,
p.rubric {
font-weight: bold;
font-size: larger;
}
p.rubric {
color: maroon;
}
p.subtitle,
p.section-subtitle,
p.sidebar-subtitle {
font-weight: bold;
margin-top: -0.5em;
}
h1 + p.subtitle {
font-size: 1.6em;
}
a.toc-backref {
color: inherit;
text-decoration: none;
}
/* Warnings, Errors */
.system-messages h2,
.system-message-title,
span.problematic {
color: red;
}
/* Inline Literals */
.docutils.literal {
font-family: monospace;
white-space: pre-wrap;
}
/* do not wrap at hyphens and similar: */
.literal > span.pre { white-space: nowrap; }
/* Lists */
/* compact and simple lists: no margin between items */
.simple li, .simple ul, .simple ol,
.compact li, .compact ul, .compact ol,
.simple > li p, dl.simple > dd,
.compact > li p, dl.compact > dd {
margin-top: 0;
margin-bottom: 0;
}
/* Nested Paragraphs */
p:first-child { margin-top: 0; }
p:last-child { margin-bottom: 0; }
details > p:last-child { margin-bottom: 1em; }
/* Table of Contents */
.contents ul.auto-toc { /* section numbers present */
list-style-type: none;
}
/* Enumerated Lists */
ol.arabic { list-style: decimal }
ol.loweralpha { list-style: lower-alpha }
ol.upperalpha { list-style: upper-alpha }
ol.lowerroman { list-style: lower-roman }
ol.upperroman { list-style: upper-roman }
/* Definition Lists and Derivatives */
dt .classifier { font-style: italic }
dt .classifier:before {
font-style: normal;
margin: 0.5em;
content: ":";
}
/* Field Lists and similar */
/* bold field name, content starts on the same line */
dl.field-list,
dl.option-list,
dl.docinfo {
display: flow-root;
}
dl.field-list > dt,
dl.option-list > dt,
dl.docinfo > dt {
font-weight: bold;
clear: left;
float: left;
margin: 0;
padding: 0;
padding-right: 0.2em;
}
/* Offset for field content (corresponds to the --field-name-limit option) */
dl.field-list > dd,
dl.option-list > dd,
dl.docinfo > dd {
margin-left: 9em; /* ca. 14 chars in the test examples, fit all Docinfo fields */
}
/* start nested lists on new line */
dd > dl:first-child,
dd > ul:first-child,
dd > ol:first-child {
clear: left;
}
/* start field-body on a new line after long field names */
dl.field-list > dd > *:first-child,
dl.option-list > dd > *:first-child
{
display: inline-block;
width: 100%;
margin: 0;
}
/* Bibliographic Fields (docinfo) */
dl.docinfo pre.address {
font: inherit;
margin: 0.5em 0;
}
dl.docinfo > dd.authors > p { margin: 0; }
/* Option Lists */
dl.option-list > dt { font-weight: normal; }
span.option { white-space: nowrap; }
/* Footnotes and Citations */
.footnote, .citation { margin: 1em 0; } /* default paragraph skip (Firefox) */
/* hanging indent */
.citation { padding-left: 2em; }
.footnote { padding-left: 1.7em; }
.footnote.superscript { padding-left: 1.0em; }
.citation > .label { margin-left: -2em; }
.footnote > .label { margin-left: -1.7em; }
.footnote.superscript > .label { margin-left: -1.0em; }
.footnote > .label + *,
.citation > .label + * {
display: inline-block;
margin-top: 0;
vertical-align: top;
}
.footnote > .backrefs + *,
.citation > .backrefs + * {
margin-top: 0;
}
.footnote > .label + p, .footnote > .backrefs + p,
.citation > .label + p, .citation > .backrefs + p {
display: inline;
vertical-align: inherit;
}
.backrefs { user-select: none; }
.backrefs > a { font-style: italic; }
/* superscript footnotes */
a[role="doc-noteref"].superscript,
.footnote.superscript > .label,
.footnote.superscript > .backrefs {
vertical-align: super;
font-size: smaller;
line-height: 1;
}
a[role="doc-noteref"].superscript > .fn-bracket,
.footnote.superscript > .label > .fn-bracket {
/* hide brackets in display but leave for copy/paste */
display: inline-block;
width: 0;
overflow: hidden;
}
[role="doc-noteref"].superscript + [role="doc-noteref"].superscript {
padding-left: 0.15em; /* separate consecutive footnote references */
/* TODO: unfortunately, "+" also selects with text between the references. */
}
/* Alignment */
.align-left {
text-align: left;
margin-right: auto;
}
.align-center {
text-align: center;
margin-left: auto;
margin-right: auto;
}
.align-right {
text-align: right;
margin-left: auto;
}
.align-top { vertical-align: top; }
.align-middle { vertical-align: middle; }
.align-bottom { vertical-align: bottom; }
/* reset inner alignment in figures and tables */
figure.align-left, figure.align-right,
table.align-left, table.align-center, table.align-right {
text-align: inherit;
}
/* Text Blocks */
.topic { margin: 1em 2em; }
.sidebar,
.admonition,
.system-message {
margin: 1em 2em;
border: thin solid;
padding: 0.5em 1em;
}
div.line-block { display: block; }
div.line-block div.line-block, pre { margin-left: 2em; }
/* Code line numbers: dropped when copying text from the page */
pre.code .ln { display: none; }
pre.code code:before {
content: attr(data-lineno); /* …, none) fallback not supported by any browser */
color: gray;
}
/* Tables */
table {
border-collapse: collapse;
}
td, th {
border: thin solid silver;
padding: 0 1ex;
}
.borderless td, .borderless th {
border: 0;
padding: 0;
padding-right: 0.5em /* separate table cells */
}
table > caption {
text-align: left;
margin-top: 0.2em;
margin-bottom: 0.2em;
}
table.captionbelow {
caption-side: bottom;
}
/* Document Header and Footer */
header { border-bottom: 1px solid black; }
footer { border-top: 1px solid black; }
/* Images are block-level by default in Docutils */
/* New HTML5 block elements: set display for older browsers */
img, header, footer, main, aside, nav, section, figure, video, details {
display: block;
}
/* inline images */
p img, p video, figure img, figure video {
display: inline;
}

View File

@ -0,0 +1,312 @@
/* CSS31_ style sheet for the output of Docutils HTML writers. */
/* Rules for easy reading and pre-defined style variants. */
/* */
/* :Author: Günter Milde, based on html4css1.css by David Goodger */
/* :Id: $Id: plain.css 9081 2022-06-19 20:23:12Z milde $ */
/* :Copyright: © 2015 Günter Milde. */
/* :License: Released under the terms of the `2-Clause BSD license`_, */
/* in short: */
/* */
/* Copying and distribution of this file, with or without modification, */
/* are permitted in any medium without royalty provided the copyright */
/* notice and this notice are preserved. */
/* */
/* This file is offered as-is, without any warranty. */
/* */
/* .. _2-Clause BSD license: http://www.spdx.org/licenses/BSD-2-Clause */
/* .. _CSS3: https://www.w3.org/Style/CSS/ */
/* Document Structure */
/* ****************** */
/* "page layout" */
body {
margin: 0;
background-color: #dbdbdb;
--field-indent: 9em; /* default indent of fields in field lists */
}
main, footer, header {
line-height:1.6;
/* avoid long lines --> better reading */
/* optimum is 45…75 characters/line <http://webtypography.net/2.1.2> */
/* OTOH: lines should not be too short because of missing hyphenation, */
max-width: 50rem;
padding: 1px 2%; /* 1px on top avoids grey bar above title (mozilla) */
margin: auto;
}
main {
counter-reset: table figure;
background-color: white;
}
footer, header {
font-size: smaller;
padding: 0.5em 2%;
border: none;
}
/* Table of Contents */
ul.auto-toc > li > p {
padding-left: 1em;
text-indent: -1em;
}
nav.contents ul {
padding-left: 1em;
}
main > nav.contents ul ul ul ul:not(.auto-toc) {
list-style-type: '\2B29\ ';
}
main > nav.contents ul ul ul ul ul:not(.auto-toc) {
list-style-type: '\2B1D\ ';
}
/* Transitions */
hr.docutils {
width: 80%;
margin-top: 1em;
margin-bottom: 1em;
clear: both;
}
/* Paragraphs */
/* vertical space (parskip) */
p, ol, ul, dl, li,
div.line-block,
.footnote, .citation,
div > math,
table {
margin-top: 0.5em;
margin-bottom: 0.5em;
}
h1, h2, h3, h4, h5, h6,
dd, details > p:last-child {
margin-bottom: 0.5em;
}
/* Lists */
/* ===== */
/* Definition Lists */
/* Indent lists nested in definition lists */
dd > ul:only-child, dd > ol:only-child { padding-left: 1em; }
/* Description Lists */
/* styled like in most dictionaries, encyclopedias etc. */
dl.description {
display: flow-root;
}
dl.description > dt {
font-weight: bold;
clear: left;
float: left;
margin: 0;
padding: 0;
padding-right: 0.3em;
}
dl.description > dd:after {
display: table;
content: "";
clear: left; /* clearfix for empty descriptions */
}
/* Field Lists */
dl.field-list > dd,
dl.docinfo > dd {
margin-left: var(--field-indent); /* adapted in media queries or HTML */
}
/* example for custom field-name width */
dl.field-list.narrow > dd {
--field-indent: 5em;
}
/* run-in: start field-body on same line after long field names */
dl.field-list.run-in > dd p {
display: block;
}
/* Bibliographic Fields */
/* generally, bibliographic fields use dl.docinfo */
/* but dedication and abstract are placed into divs */
div.abstract p.topic-title {
text-align: center;
}
div.dedication {
margin: 2em 5em;
text-align: center;
font-style: italic;
}
div.dedication p.topic-title {
font-style: normal;
}
/* disclosures */
details { padding-left: 1em; }
summary { margin-left: -1em; }
/* Text Blocks */
/* =========== */
/* Literal Blocks */
pre.literal-block, pre.doctest-block,
pre.math, pre.code {
font-family: monospace;
}
/* Block Quotes and Topics */
bockquote { margin: 1em 2em; }
blockquote p.attribution,
.topic p.attribution {
text-align: right;
margin-left: 20%;
}
/* Tables */
/* ====== */
/* th { vertical-align: bottom; } */
table tr { text-align: left; }
/* "booktabs" style (no vertical lines) */
table.booktabs {
border: 0;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.booktabs * {
border: 0;
}
table.booktabs th {
border-bottom: thin solid;
}
/* numbered tables (counter defined in div.document) */
table.numbered > caption:before {
counter-increment: table;
content: "Table " counter(table) ": ";
font-weight: bold;
}
/* Explicit Markup Blocks */
/* ====================== */
/* Footnotes and Citations */
/* ----------------------- */
/* line on the left */
.footnote-list {
border-left: solid thin;
padding-left: 0.25em;
}
/* Directives */
/* ---------- */
/* Body Elements */
/* ~~~~~~~~~~~~~ */
/* Images and Figures */
/* let content flow to the side of aligned images and figures */
figure.align-left,
img.align-left,
video.align-left,
object.align-left {
clear: left;
float: left;
margin-right: 1em;
}
figure.align-right,
img.align-right,
video.align-right,
object.align-right {
clear: right;
float: right;
margin-left: 1em;
}
/* Stop floating sidebars, images and figures */
h1, h2, h3, h4, footer, header { clear: both; }
/* Numbered figures */
figure.numbered > figcaption > p:before {
counter-increment: figure;
content: "Figure " counter(figure) ": ";
font-weight: bold;
}
/* Admonitions and System Messages */
.caution p.admonition-title,
.attention p.admonition-title,
.danger p.admonition-title,
.error p.admonition-title,
.warning p.admonition-title,
div.error {
color: red;
}
/* Sidebar */
/* Move right. In a layout with fixed margins, */
/* it can be moved into the margin. */
aside.sidebar {
width: 30%;
max-width: 26em;
float: right;
clear: right;
margin-left: 1em;
margin-right: -1%;
background-color: #fffffa;
}
/* Code */
pre.code { padding: 0.7ex }
pre.code, code { background-color: #eeeeee }
/* basic highlighting: for a complete scheme, see */
/* https://docutils.sourceforge.io/sandbox/stylesheets/ */
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
/* Math */
/* for math-output=MathML (for math-output=HTML, see math.css) */
math .boldsymbol {
font-weight: bold;
}
mstyle.mathscr, mi.mathscr {
font-family: STIX;
}
/* Epigraph */
/* Highlights */
/* Pull-Quote */
/* Compound Paragraph */
/* Container */
/* Inline Markup */
/* ============= */
sup, sub { line-height: 0.8; } /* do not add leading for lines with sup/sub */
/* Inline Literals */
/* possible values: normal, nowrap, pre, pre-wrap, pre-line */
/* span.docutils.literal { white-space: pre-wrap; } */
/* Hyperlink References */
a { text-decoration: none; }
/* External Targets */
/* span.target.external */
/* Internal Targets */
/* span.target.internal */
/* Footnote References */
/* a[role="doc-noteref"] */
/* Citation References */
/* a.citation-reference */

View File

@ -0,0 +1,495 @@
/* CSS3_ style sheet for the output of Docutils HTML5 writer. */
/* Generic responsive design for all screen sizes. */
/* */
/* :Author: Günter Milde */
/* */
/* :Id: $Id: responsive.css 9079 2022-06-19 14:00:56Z milde $ */
/* :Copyright: © 2021 Günter Milde. */
/* :License: Released under the terms of the `2-Clause BSD license`_, */
/* in short: */
/* */
/* Copying and distribution of this file, with or without modification, */
/* are permitted in any medium without royalty provided the copyright */
/* notice and this notice are preserved. */
/* */
/* This file is offered as-is, without any warranty. */
/* */
/* .. _2-Clause BSD license: http://www.spdx.org/licenses/BSD-2-Clause */
/* .. _CSS3: https://www.w3.org/Style/CSS/ */
/* Note: */
/* This style sheet is provisional: */
/* the API is not settled and may change with any minor Docutils version. */
/* General Settings */
/* ================ */
* { box-sizing: border-box; }
body {
background-color: #fafaf6;
margin: auto;
--field-indent: 6.6em; /* indent of fields in field lists */
--sidebar-margin-right: 0; /* adapted in media queries below */
}
main {
counter-reset: figure table;
}
body > * {
background-color: white;
line-height: 1.6;
padding: 0.5rem calc(29% - 7.2rem); /* go from 5% to 15% (8.15em/54em) */
margin: auto;
max-width: 100rem;
}
sup, sub { /* avoid additional inter-line space for lines with sup/sub */
line-height: 1;
}
/* Vertical Space (Parskip) */
p, ol, ul, dl, li,
div.line-block,
.topic,
.footnote, .citation,
div > math,
table {
margin-top: 0.5em;
margin-bottom: 0.5em;
}
h1, h2, h3, h4, h5, h6,
dl > dd, details > p:last-child {
margin-bottom: 0.5em;
}
/* Indented Blocks */
blockquote, figure, .topic {
margin: 1em 2%;
padding-left: 1em;
}
div.line-block div.line-block,
pre, dd, dl.option-list {
margin-left: calc(2% + 1em);
}
/* Object styling */
/* ============== */
footer, header {
font-size: small;
}
/* Frontmatter */
div.dedication {
padding: 0;
margin: 1.4em 0;
font-style: italic;
font-size: large;
}
.dedication p.topic-title {
display: none;
}
blockquote p.attribution,
.topic p.attribution {
text-align: right;
}
/* Table of Contents */
nav.contents ul {
padding-left: 1em;
}
ul.auto-toc > li > p { /* hanging indent */
padding-left: 1em;
text-indent: -1em;
}
main > nav.contents ul:not(.auto-toc) {
list-style-type: square;
}
main > nav.contents ul ul:not(.auto-toc) {
list-style-type: disc;
}
main > nav.contents ul ul ul:not(.auto-toc) {
list-style-type: '\2B29\ ';
}
main > nav.contents ul ul ul ul:not(.auto-toc) {
list-style-type: '\2B1D\ ';
}
main > nav.contents ul ul ul ul ul:not(.auto-toc) {
list-style-type: '\2B2A\ ';
}
nav.contents ul > li::marker {
color: grey;
}
/* Transitions */
hr {
margin: 1em 10%;
}
/* Lists */
ul, ol {
padding-left: 1.1em; /* indent by bullet width (Firefox, DejaVu fonts) */
}
dl.field-list > dd,
dl.docinfo > dd {
margin-left: var(--field-indent); /* adapted in media queries or HTML */
}
dl.option-list > dd {
margin-left: 20%;
}
/* run-in: start field-body on same line after long field names */
dl.field-list.run-in > dd p {
display: block;
}
/* "description style" like in most dictionaries, encyclopedias etc. */
dl.description {
display: flow-root;
}
dl.description > dt {
clear: left;
float: left;
margin: 0;
padding: 0;
padding-right: 0.3em;
font-weight: bold;
}
dl.description > dd:after {
display: table;
content: "";
clear: left; /* clearfix for empty descriptions */
}
/* start lists nested in description/field lists on new line */
dd > dl:first-child,
dd > ul:first-child,
dd > ol:first-child {
clear: left;
}
/* disclosures */
details { padding-left: 1em; }
summary { margin-left: -1em; }
/* Footnotes and Citations */
.footnote {
font-size: small;
}
/* Images, Figures, and Tables */
img {
display: block;
}
p > img, p > a > img,
figure > img, figure > a > img {
display: inline;
}
figcaption,
table > caption {
/* font-size: small; */
font-style: italic;
}
figcaption > .legend {
font-size: small;
font-style: initial;
}
figure.numbered > figcaption > p:before {
counter-increment: figure;
content: "Figure " counter(figure) ": ";
font-weight: bold;
font-style: initial;
}
table tr {
text-align: left;
vertical-align: baseline;
}
table.booktabs { /* "booktabs" style (no vertical lines) */
border-top: 2px solid;
border-bottom: 2px solid;
}
table.booktabs * {
border: 0;
}
table.booktabs th {
border-bottom: thin solid;
}
table.numbered > caption:before {
counter-increment: table;
content: "Table " counter(table) ": ";
font-weight: bold;
font-style: initial;
}
/* Admonitions and System Messages */
.admonition,
div.system-message {
border: thin solid silver;
margin: 1em 2%;
padding: 0.5em 1em;
}
.caution p.admonition-title,
.attention p.admonition-title,
.danger p.admonition-title,
.warning p.admonition-title,
div.error {
color: maroon;
}
div.system-message > p > span.literal {
overflow-wrap: break-word;
}
/* Literal and Code */
pre.literal-block, pre.doctest{
padding: 0.2em;
overflow-x: auto;
}
.literal-block, .doctest, span.literal {
background-color: #f6f9f8;
}
.system-message span.literal {
background-color: inherit;
}
/* basic highlighting: for a complete scheme, see */
/* https://docutils.sourceforge.io/sandbox/stylesheets/ */
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
/* Hyperlink References */
a {
text-decoration: none; /* for chromium */
/* Wrap links at any place, if this is the only way to prevent overflow */
overflow-wrap: break-word;
}
.contents a, a.toc-backref, a.citation-reference {
overflow-wrap: inherit;
}
/* Undecorated Links (see also minimal.css) */
/* a.citation-reference, */
.citation a.fn-backref {
color: inherit;
}
a:hover {
text-decoration: underline;
}
*:hover > a.toc-backref:after {
content: " \2191"; /* ↑ UPWARDS ARROW */
color: grey;
}
*:hover > a.self-link:after {
content: "\1F517"; /* LINK SYMBOL */
color: grey;
font-size: smaller;
margin-left: 0.2em;
}
/* highlight the target of the current URL */
section:target > h2, section:target > h3, section:target > h4,
section:target > h5, section:target > h6,
.contents :target,
.contents:target > .topic-title,
[role="doc-biblioentry"]:target > .label,
[role="doc-biblioref"]:target,
[role="note"]:target, /* Docutils 0.18 ... 0.19 */
[role="doc-footnote"]:target, /* Docutils >= 0.20 */
[role="doc-noteref"]:target {
background-color: #d2e6ec;
}
/* Block Alignment */
/* Let content flow to the side of aligned images and figures */
/* no floats around this elements */
footer, header, hr,
h1, h2, h3 {
clear: both;
}
img.align-left,
video.align-left,
figure.align-left,
table.align-left {
margin-left: 0;
padding-left: 0;
margin-right: 0.5em;
clear: left;
float: left;
}
img.align-right,
video.align-right,
figure.align-right,
table.align-right {
margin-left: 0.5em;
margin-right: 0;
clear: right;
float: right;
}
/* Margin Elements */
/* see below for screen size dependent rules */
.sidebar,
.marginal,
.admonition.marginal {
max-width: 40%;
border: none;
background-color: #efefea;
margin: 0.5em var(--sidebar-margin-right) 0.5em 1em;
padding: 0.5em;
padding-left: 0.7em;
clear: right;
float: right;
font-size: small;
}
.sidebar {
width: 40%;
}
/* Math */
/* for math-output=MathML (for math-output=HTML, see math.css) */
math .boldsymbol {
font-weight: bold;
}
mstyle.mathscr, mi.mathscr {
font-family: STIX;
}
/* Adaptive page layout */
/* ==================== */
@media (max-width: 30em) {
/* Smaller margins and no floating elements for small screens */
/* (main text less than 40 characters/line) */
body > * {
padding: 0.5rem 5%;
line-height: 1.4
}
.sidebar,
.marginal,
.admonition.marginal {
width: auto;
max-width: 100%;
float: none;
}
dl.option-list,
pre {
margin-left: 0;
}
body {
--field-indent: 4em;
}
dl.field-list.narrow, dl.docinfo, dl.option-list {
--field-indent: 2.4em;
}
pre, pre * {
font-size: 0.9em;
/* overflow: auto; */
}
}
@media (min-width: 54em) {
/* Move ToC to the left */
/* Main text width before: 70% ≙ 35em ≙ 75…95 chrs (Dejavu/Times) */
/* after: ≳ 30em ≙ 54…70 chrs (Dejavu/Times) */
body.with-toc {
padding-left: 8%;
}
body.with-toc > * {
margin-left: 0;
padding-left: 22rem; /* fallback for webkit */
padding-left: min(22%, 22rem);
padding-right: 7%;
}
main > nav.contents { /* global ToC */
position: fixed;
top: 0;
left: 0;
width: min(25%, 25em);
height: 100vh;
margin: 0;
background-color: #fafaf6;
padding: 1em 2% 0 2%;
overflow: auto;
}
main > nav.contents > * {
padding-left: 0;
line-height: 1.4;
}
main > nav.contents a {
color: inherit;
}
}
@media (min-width: 70em) {
body {
--field-indent: 9em;
}
}
@media (min-width: 77em) {
/* Move marginalia to 6rem from right border */
/* .sidebar, */
/* .marginal, */
/* .admonition.marginal { */
/* margin-right: calc(6rem - 15%); */
/* } */
/* BUG: margin is calculated for break point width */
/* workaround: variable + many breakpoints */
body > * {
padding-left: 18%;
padding-right: 28%; /* fallback for webkit */
padding-right: min(28%, 28rem);
--sidebar-margin-right: -20rem;
}
/* limit main text to ~ 50em ≙ 85…100 characters DejaVu rsp. …120 Times */
body.with-toc > * {
padding-left: min(22%, 22rem);
padding-right: calc(78% - 50rem); /* fallback for webkit */
padding-right: min(78% - 50rem, 28rem);
--sidebar-margin-right: 0;
}
}
@media (min-width: 85em) {
body.with-toc > * {
--sidebar-margin-right: -9rem;
}
}
@media (min-width: 90em) {
/* move marginalia into the margin */
body > * {
padding-left: min(22%, 22rem);
--sidebar-margin-right: -23rem;
}
body.with-toc > * {
--sidebar-margin-right: -14rem;
}
}
@media (min-width: 99em) {
/* move marginalia out of main text area */
body.with-toc > * {
--sidebar-margin-right: -20rem;
}
body > *, body.with-toc > * { /* for webkit */
padding-left: 22rem;
padding-right: 28rem;
}
.admonition.marginal,
.marginal {
width: 40%; /* make marginal figures, ... "full width" */
}
}
@media (min-width: 104em) {
body.with-toc > * {
--sidebar-margin-right: -23rem;
}
}

View File

@ -0,0 +1,568 @@
/* CSS3_ style sheet for the output of Docutils HTML writers. */
/* Rules inspired by Edward Tufte's layout design. */
/* */
/* :Author: Günter Milde */
/* based on tufte.css_ by Dave Liepmann */
/* and the tufte-latex_ package. */
/* */
/* :Id: $Id: tuftig.css 9081 2022-06-19 20:23:12Z milde $ */
/* :Copyright: © 2020 Günter Milde. */
/* :License: Released under the terms of the `2-Clause BSD license`_, */
/* in short: */
/* */
/* Copying and distribution of this file, with or without modification, */
/* are permitted in any medium without royalty provided the copyright */
/* notice and this notice are preserved. */
/* */
/* This file is offered as-is, without any warranty. */
/* */
/* .. _2-Clause BSD license: http://www.spdx.org/licenses/BSD-2-Clause */
/* .. _CSS3: https://www.w3.org/Style/CSS/ */
/* .. _tufte.css: https://edwardtufte.github.io/tufte-css/ */
/* .. _tufte-latex_: https://www.ctan.org/pkg/tufte-latex */
/* General Settings */
/* ================ */
body {
font-family: et-book, Palatino, Georgia, serif;
background-color: #fafaf6;
font-size: 1.2em;
line-height: 1.4;
margin: auto;
}
main {
counter-reset: figure table;
}
main, header, footer {
padding: 0.5em 5%;
background-color: #fefef8;
max-width: 100rem;
}
/* Spacing */
/* vertical space (parskip) */
p, ol, ul, dl, li,
h1, h2, h3, h4, h5, h6,
div.line-block,
.topic,
.footnote, .citation,
table {
margin-top: 0.5em;
margin-bottom: 0.5em;
}
dl > dd {
margin-bottom: 0.5em;
}
/* exceptions */
p:first-child {
margin-top: 0;
}
p:last-child {
margin-bottom: 0;
}
/* Indented Blocks */
blockquote,
.topic {
/* background-color: Honeydew; */
margin: 0.5em 2%;
padding-left: 1em;
}
div.line-block div.line-block,
dl.option-list,
figure > img,
pre.literal-block, pre.math,
pre.doctest-block, pre.code {
/* background-color: LightCyan; */
margin-left: calc(2% + 1em);
}
/* Object styling */
/* ============== */
footer, header {
font-size: smaller;
}
/* Titles and Headings */
h2, h3, h4, p.subtitle, p.section-subtitle,
p.topic-title, p.sidebar-title, p.sidebar-subtitle {
font-weight: normal;
font-style: italic;
text-align: left;
}
.sectnum {
font-style: normal;
}
h1.title {
text-align: left;
margin-top: 2.4em;
margin-bottom: 2em;
font-size: 2.4em;
}
h1 + p.subtitle {
margin-top: -2em;
margin-bottom: 2em;
font-size: 2.0em;
}
section {
margin-top: 2em;
}
h2, .contents > p.topic-title {
font-size: 2.2em;
}
h2 + p.section-subtitle {
font-size: 1.6em;
}
h3 {
font-size: 1.2em;
}
h3 + p.section-subtitle {
font-size: 1.1em;
}
h4 {
font-size: 1em;
}
p.section-subtitle {
font-size: 1em;
}
/* Dedication and Abstract */
div.dedication {
padding: 0;
margin-left: 0;
font-style: italic;
font-size: 1.2em;
}
/* div.abstract p.topic-title, */
div.dedication p.topic-title {
display: none;
}
/* Attribution */
blockquote p.attribution,
.topic p.attribution {
text-align: right;
}
/* Table of Contents */
nav.contents {
padding: 0;
font-style: italic;
}
ul.auto-toc > li > p {
padding-left: 1em;
text-indent: -1em;
}
nav.contents ul {
padding-left: 1em;
}
/* Transitions */
hr {
border: 0;
border-top: 1px solid #ccc;
margin: 1em 10%;
}
/* Lists */
/* Less indent per level */
ul, ol {
padding-left: 1.1em;
}
dd {
margin-left: 1.5em;
}
dd > dl:first-child,
dd > ul:first-child,
dd > ol:first-child {
/* lists nested in definition/description/field lists */
clear: left;
}
dl.field-list > dd,
dl.docinfo > dd,
dl.option-list > dd {
margin-left: 4em;
}
/* example for custom field-name width */
dl.field-list.narrow > dd {
margin-left: 3em;
}
/* run-in: start field-body on same line after long field names */
dl.field-list.run-in > dd p {
display: block;
}
/* italic field name */
dl.description > dt,
dl.field-list > dt,
dl.docinfo > dt {
font-weight: normal;
font-style: italic;
}
/* "description style" like in most dictionaries, encyclopedias etc. */
dl.description > dt {
clear: left;
float: left;
margin: 0;
padding: 0;
padding-right: 0.5em;
}
dl.description > dd:after {
display: block;
content: "";
clear: both;
}
/* Citation list (style as description list) */
.citation-list,
.footnote-list {
display: contents;
}
.citation {
padding-left: 1.5em;
}
.citation .label {
margin-left: -1.5em;
}
/* Images and Figures */
img {
display: block;
}
p > img, p > a > img,
figure > img, figure > a > img {
display: inline;
}
/* Caption to the left (if there is space) or below: */
figure {
display: flex;
flex-wrap: wrap;
align-items: flex-start;
margin: 0.5em 2%;
padding-left: 1em;
}
figure > img,
figure.fullwidth > img {
margin: 0 0.5em 0.5em 0;
padding: 0;
}
figcaption {
font-size: 0.8em;
}
.fullwidth > figcaption {
font-size: inherit;
}
figure.numbered > figcaption > p:before {
counter-increment: figure;
content: "Figure " counter(figure) ": ";
}
/* Tables */
table tr {
text-align: left;
}
/* th { vertical-align: bottom; } */
/* "booktabs" style (no vertical lines) */
table.booktabs {
border-top: 2px solid;
border-bottom: 2px solid;
}
table.booktabs * {
border: 0;
}
table.booktabs th {
border-bottom: thin solid;
}
table.numbered > caption:before {
counter-increment: table;
content: "Table " counter(table) ": ";
}
/* Admonitions and System Messages */
.admonition, .system-message {
border-style: solid;
border-color: silver;
border-width: thin;
margin: 1em 0;
padding: 0.5em;
}
.caution p.admonition-title,
.attention p.admonition-title,
.danger p.admonition-title,
.warning p.admonition-title,
div.error {
color: maroon;
}
/* Literal and Code */
pre.literal-block, pre.doctest-block,
pre.math, pre.code {
/* font-family: Consolas, "Liberation Mono", Menlo, monospace; */
/* font-size: 0.9em; */
overflow: auto;
}
/* basic highlighting: for a complete scheme, see */
/* https://docutils.sourceforge.io/sandbox/stylesheets/ */
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
.sans {
font-family: "Gill Sans", "Gill Sans MT", Calibri, "Lucida Sans", "Noto Sans", sans-serif;
letter-spacing: .02em;
}
/* Hyperlink References */
/* underline that clears descenders */
a {
color: inherit;
}
a:link {
text-decoration: underline;
/* text-decoration-skip-ink: auto; nonstandard selector */
}
/* undecorated links */
.contents a:link, a.toc-backref:link, a.image-reference:link,
a[role="doc-noteref"]:link, a[role="doc-backlink"]:link, .backrefs a:link,
a.citation-reference:link,
a[href^="#system-message"] {
text-decoration: none;
}
a:link:hover {
text-decoration: underline;
}
/* Block Alignment */
/* Let content flow to the side of aligned images and figures */
/* (does not work if the image/figure is a grid element). */
/* no floats around this elements */
footer, header,
hr.docutils,
h1, h2, h3, .contents > p.topic-title,
.fullwidth {
clear: both;
}
img.align-left,
figure.align-left,
table.align-left {
margin-left: 0;
padding-left: 0;
padding-right: 0.5em;
clear: left;
float: left;
}
figure.align-left > img {
margin-left: 0;
padding-left: 0;
}
img.align-right {
padding-left: 0.5em;
clear: right;
float: right;
}
figure.align-right {
clear: right;
float: right;
}
figure.align-right > img {
justify-self: right;
padding: 0;
}
table.align-right {
margin-right: 2.5%;
}
figure.align-center {
align-content: center;
justify-content: center;
}
figure.align-center > img {
padding-left: 0;
justify-self: center;
}
/* Margin Elements */
/* see below for screen size dependent rules */
aside.sidebar,
.marginal,
.admonition.marginal,
.topic.marginal {
background-color: #efefea;
box-sizing: border-box;
margin-left: 2%;
margin-right: 0;
padding: 0.5em;
font-size: 0.8em;
}
aside.sidebar {
background-color: inherit;
}
figure.marginal > figcaption {
font-size: 1em;
}
.footnote {
font-size: smaller;
overflow: auto;
}
/* Adaptive page layout */
/* no floating for very small Screens */
/* (main text up to ca. 40 characters/line) */
@media (min-width: 35em) {
main, header, footer {
padding: 0.5em calc(15% - 3rem);
line-height: 1.6
}
aside.sidebar,
.marginal,
.admonition.marginal,
.topic.marginal {
max-width: 45%;
float: right;
clear: right;
}
dl.field-list > dd,
dl.docinfo > dd {
margin-left: 6em;
}
dl.option-list > dd {
margin-left: 6em;
}
}
/* 2 column layout with wide margin */
@media (min-width: 65em) {
/* use the same grid for main, all sections, and figures */
main, section {
display: grid;
grid-template-columns: [content] minmax(0, 6fr)
[margin] 3fr [end];
grid-column-gap: calc(3em + 1%);
}
main > section, section > section {
grid-column: 1 / end;
}
main, header, footer {
padding-right: 5%; /* less padding right of margin-column */
}
section > figure {
display: contents; /* to place caption in the margin */
}
/* Main text elements */
main > *, section > *,
figure > img,
.footnote.align-left, /* override the placement in the margin */
.citation.align-left {
grid-column: content;
}
.citation.align-left {
font-size: 1em;
padding-left: 1.5em;
}
.citation.align-left .label {
margin-left: -1.5em;
}
figure > img { /* indent */
margin: 0.5em 2%;
padding-left: 1em;
}
/* Margin Elements */
/* Sidebar, Footnotes, Citations, Captions */
aside.sidebar,
.citation,
.footnote,
figcaption,
/* table > caption, does not work :(*/
.marginal,
.admonition.marginal,
.topic.marginal {
/* color: red; */
grid-column: margin;
width: auto;
max-width: 55em;
margin: 0.5em 0;
border: none;
padding: 0;
font-size: 0.8em;
text-align: initial; /* overwrite align-* */
background-color: inherit;
}
.admonition.marginal {
padding: 0.5em;
}
figure.marginal {
display: block;
margin: 0.5em 0;
}
.citation,
.footnote {
padding-left: 0;
}
.citation .label,
.footnote .label {
margin-left: 0;
}
/* Fullwidth Elements */
h1.title, p.subtitle,
dl.docinfo,
div.abstract,
div.dedication,
nav.contents,
aside.system-message,
pre,
.fullwidth,
.fullwidth img,
.fullwidth figcaption {
/* background-color: Linen; */
grid-column: content / end;
margin-right: calc(10% - 3rem);
max-width: 55em;
}
}
/* 3 column layout */
@media (min-width: 100em) {
main, header, footer {
padding-left: 30%;
}
main > nav.contents {
position: fixed;
top: 0;
left: 0;
box-sizing: border-box;
width: 25%;
height: 100vh;
margin: 0;
background-color: #fafaf6;
padding: 5.5em 2%;
overflow: auto;
}
main > nav.contents > * {
padding-left: 0;
}
}
/* wrap URLs */
/* a:link { */
/* white-space: normal; */
/* hyphens: none; */
/* } */

View File

@ -0,0 +1,349 @@
/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */
/* Document
========================================================================== */
/**
* 1. Correct the line height in all browsers.
* 2. Prevent adjustments of font size after orientation changes in iOS.
*/
html {
line-height: 1.15; /* 1 */
-webkit-text-size-adjust: 100%; /* 2 */
}
/* Sections
========================================================================== */
/**
* Remove the margin in all browsers.
*/
body {
margin: 0;
}
/**
* Render the `main` element consistently in IE.
*/
main {
display: block;
}
/**
* Correct the font size and margin on `h1` elements within `section` and
* `article` contexts in Chrome, Firefox, and Safari.
*/
h1 {
font-size: 2em;
margin: 0.67em 0;
}
/* Grouping content
========================================================================== */
/**
* 1. Add the correct box sizing in Firefox.
* 2. Show the overflow in Edge and IE.
*/
hr {
box-sizing: content-box; /* 1 */
height: 0; /* 1 */
overflow: visible; /* 2 */
}
/**
* 1. Correct the inheritance and scaling of font size in all browsers.
* 2. Correct the odd `em` font sizing in all browsers.
*/
pre {
font-family: monospace, monospace; /* 1 */
font-size: 1em; /* 2 */
}
/* Text-level semantics
========================================================================== */
/**
* Remove the gray background on active links in IE 10.
*/
a {
background-color: transparent;
}
/**
* 1. Remove the bottom border in Chrome 57-
* 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
*/
abbr[title] {
border-bottom: none; /* 1 */
text-decoration: underline; /* 2 */
text-decoration: underline dotted; /* 2 */
}
/**
* Add the correct font weight in Chrome, Edge, and Safari.
*/
b,
strong {
font-weight: bolder;
}
/**
* 1. Correct the inheritance and scaling of font size in all browsers.
* 2. Correct the odd `em` font sizing in all browsers.
*/
code,
kbd,
samp {
font-family: monospace, monospace; /* 1 */
font-size: 1em; /* 2 */
}
/**
* Add the correct font size in all browsers.
*/
small {
font-size: 80%;
}
/**
* Prevent `sub` and `sup` elements from affecting the line height in
* all browsers.
*/
sub,
sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
}
sup {
top: -0.5em;
}
/* Embedded content
========================================================================== */
/**
* Remove the border on images inside links in IE 10.
*/
img {
border-style: none;
}
/* Forms
========================================================================== */
/**
* 1. Change the font styles in all browsers.
* 2. Remove the margin in Firefox and Safari.
*/
button,
input,
optgroup,
select,
textarea {
font-family: inherit; /* 1 */
font-size: 100%; /* 1 */
line-height: 1.15; /* 1 */
margin: 0; /* 2 */
}
/**
* Show the overflow in IE.
* 1. Show the overflow in Edge.
*/
button,
input { /* 1 */
overflow: visible;
}
/**
* Remove the inheritance of text transform in Edge, Firefox, and IE.
* 1. Remove the inheritance of text transform in Firefox.
*/
button,
select { /* 1 */
text-transform: none;
}
/**
* Correct the inability to style clickable types in iOS and Safari.
*/
button,
[type="button"],
[type="reset"],
[type="submit"] {
-webkit-appearance: button;
}
/**
* Remove the inner border and padding in Firefox.
*/
button::-moz-focus-inner,
[type="button"]::-moz-focus-inner,
[type="reset"]::-moz-focus-inner,
[type="submit"]::-moz-focus-inner {
border-style: none;
padding: 0;
}
/**
* Restore the focus styles unset by the previous rule.
*/
button:-moz-focusring,
[type="button"]:-moz-focusring,
[type="reset"]:-moz-focusring,
[type="submit"]:-moz-focusring {
outline: 1px dotted ButtonText;
}
/**
* Correct the padding in Firefox.
*/
fieldset {
padding: 0.35em 0.75em 0.625em;
}
/**
* 1. Correct the text wrapping in Edge and IE.
* 2. Correct the color inheritance from `fieldset` elements in IE.
* 3. Remove the padding so developers are not caught out when they zero out
* `fieldset` elements in all browsers.
*/
legend {
box-sizing: border-box; /* 1 */
color: inherit; /* 2 */
display: table; /* 1 */
max-width: 100%; /* 1 */
padding: 0; /* 3 */
white-space: normal; /* 1 */
}
/**
* Add the correct vertical alignment in Chrome, Firefox, and Opera.
*/
progress {
vertical-align: baseline;
}
/**
* Remove the default vertical scrollbar in IE 10+.
*/
textarea {
overflow: auto;
}
/**
* 1. Add the correct box sizing in IE 10.
* 2. Remove the padding in IE 10.
*/
[type="checkbox"],
[type="radio"] {
box-sizing: border-box; /* 1 */
padding: 0; /* 2 */
}
/**
* Correct the cursor style of increment and decrement buttons in Chrome.
*/
[type="number"]::-webkit-inner-spin-button,
[type="number"]::-webkit-outer-spin-button {
height: auto;
}
/**
* 1. Correct the odd appearance in Chrome and Safari.
* 2. Correct the outline style in Safari.
*/
[type="search"] {
-webkit-appearance: textfield; /* 1 */
outline-offset: -2px; /* 2 */
}
/**
* Remove the inner padding in Chrome and Safari on macOS.
*/
[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
/**
* 1. Correct the inability to style clickable types in iOS and Safari.
* 2. Change font properties to `inherit` in Safari.
*/
::-webkit-file-upload-button {
-webkit-appearance: button; /* 1 */
font: inherit; /* 2 */
}
/* Interactive
========================================================================== */
/*
* Add the correct display in Edge, IE 10+, and Firefox.
*/
details {
display: block;
}
/*
* Add the correct display in all browsers.
*/
summary {
display: list-item;
}
/* Misc
========================================================================== */
/**
* Add the correct display in IE 10+.
*/
template {
display: none;
}
/**
* Add the correct display in IE 10.
*/
[hidden] {
display: none;
}

73
assets/css/old.css Normal file
View File

@ -0,0 +1,73 @@
/* С Bludit версии Nixhacks.
*
* Надо позаимствовать отсюда переключение тем день/ночь */
:root {
--b: #000;
--g: #888;
--w: #fff
}
body {
font: 400 18px/1.6 sans-serif;
padding: 2rem;
background: var(--w);
color: var(--b)
}
.container { max-width: 70ch }
.mbh { margin: 0 0 .5rem }
.mb1 { margin: 0 0 1rem }
.mb2 { margin: 0 0 2rem }
.g, pre { color: var(--g); overflow: auto; }
img { width: 100%; image-rendering: -moz-crisp-edges; image-rendering: pixelated }
a, a:visited { color: var(--b); text-decoration-color: var(--g) }
a:hover { text-decoration-color: var(--b) }
pre, ul, ol, blockquote { margin: 0; padding: 0 1rem }
/*pre { white-space: pre-wrap }*/
@media (prefers-color-scheme: dark) {
:root {
--b: #fff;
--g: #888;
--w: #000
}
}
.links-content {
margin: 18px 0 28px 16px;
display: inline-block;
}
.links-content ul {
padding: 0;
}
.links-content ul li {
margin: 0;
padding: 0;
padding-right: 8px;
display: inline-block;
list-style: none;
}
.links-content ul li::before {
content: '|';
position: relative;
left: -6px;
}
.links-content ul li:first-child::before {
content: none;
}
.links-label {display: inline-block;}
.separator::after {
content: '- - -';
}
.copyright {
margin-top: 28px;
}

View File

@ -0,0 +1,74 @@
pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight { background: #f8f8f8; }
.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */
.highlight .err { border: 1px solid #FF0000 } /* Error */
.highlight .k { color: #008000; font-weight: bold } /* Keyword */
.highlight .o { color: #666666 } /* Operator */
.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */
.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */
.highlight .cp { color: #9C6500 } /* Comment.Preproc */
.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */
.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */
.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */
.highlight .gd { color: #A00000 } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #E40000 } /* Generic.Error */
.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
.highlight .gi { color: #008400 } /* Generic.Inserted */
.highlight .go { color: #717171 } /* Generic.Output */
.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
.highlight .gt { color: #0044DD } /* Generic.Traceback */
.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008000 } /* Keyword.Pseudo */
.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #B00040 } /* Keyword.Type */
.highlight .m { color: #666666 } /* Literal.Number */
.highlight .s { color: #BA2121 } /* Literal.String */
.highlight .na { color: #687822 } /* Name.Attribute */
.highlight .nb { color: #008000 } /* Name.Builtin */
.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */
.highlight .no { color: #880000 } /* Name.Constant */
.highlight .nd { color: #AA22FF } /* Name.Decorator */
.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */
.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0000FF } /* Name.Function */
.highlight .nl { color: #767600 } /* Name.Label */
.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #19177C } /* Name.Variable */
.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #666666 } /* Literal.Number.Bin */
.highlight .mf { color: #666666 } /* Literal.Number.Float */
.highlight .mh { color: #666666 } /* Literal.Number.Hex */
.highlight .mi { color: #666666 } /* Literal.Number.Integer */
.highlight .mo { color: #666666 } /* Literal.Number.Oct */
.highlight .sa { color: #BA2121 } /* Literal.String.Affix */
.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */
.highlight .sc { color: #BA2121 } /* Literal.String.Char */
.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */
.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
.highlight .s2 { color: #BA2121 } /* Literal.String.Double */
.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */
.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */
.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */
.highlight .sx { color: #008000 } /* Literal.String.Other */
.highlight .sr { color: #A45A77 } /* Literal.String.Regex */
.highlight .s1 { color: #BA2121 } /* Literal.String.Single */
.highlight .ss { color: #19177C } /* Literal.String.Symbol */
.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0000FF } /* Name.Function.Magic */
.highlight .vc { color: #19177C } /* Name.Variable.Class */
.highlight .vg { color: #19177C } /* Name.Variable.Global */
.highlight .vi { color: #19177C } /* Name.Variable.Instance */
.highlight .vm { color: #19177C } /* Name.Variable.Magic */
.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */

View File

@ -0,0 +1,83 @@
pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #49483e }
.highlight { background: #272822; color: #f8f8f2 }
.highlight .c { color: #75715e } /* Comment */
.highlight .err { color: #960050; background-color: #1e0010 } /* Error */
.highlight .esc { color: #f8f8f2 } /* Escape */
.highlight .g { color: #f8f8f2 } /* Generic */
.highlight .k { color: #66d9ef } /* Keyword */
.highlight .l { color: #ae81ff } /* Literal */
.highlight .n { color: #f8f8f2 } /* Name */
.highlight .o { color: #f92672 } /* Operator */
.highlight .x { color: #f8f8f2 } /* Other */
.highlight .p { color: #f8f8f2 } /* Punctuation */
.highlight .ch { color: #75715e } /* Comment.Hashbang */
.highlight .cm { color: #75715e } /* Comment.Multiline */
.highlight .cp { color: #75715e } /* Comment.Preproc */
.highlight .cpf { color: #75715e } /* Comment.PreprocFile */
.highlight .c1 { color: #75715e } /* Comment.Single */
.highlight .cs { color: #75715e } /* Comment.Special */
.highlight .gd { color: #f92672 } /* Generic.Deleted */
.highlight .ge { color: #f8f8f2; font-style: italic } /* Generic.Emph */
.highlight .gr { color: #f8f8f2 } /* Generic.Error */
.highlight .gh { color: #f8f8f2 } /* Generic.Heading */
.highlight .gi { color: #a6e22e } /* Generic.Inserted */
.highlight .go { color: #66d9ef } /* Generic.Output */
.highlight .gp { color: #f92672; font-weight: bold } /* Generic.Prompt */
.highlight .gs { color: #f8f8f2; font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #75715e } /* Generic.Subheading */
.highlight .gt { color: #f8f8f2 } /* Generic.Traceback */
.highlight .kc { color: #66d9ef } /* Keyword.Constant */
.highlight .kd { color: #66d9ef } /* Keyword.Declaration */
.highlight .kn { color: #f92672 } /* Keyword.Namespace */
.highlight .kp { color: #66d9ef } /* Keyword.Pseudo */
.highlight .kr { color: #66d9ef } /* Keyword.Reserved */
.highlight .kt { color: #66d9ef } /* Keyword.Type */
.highlight .ld { color: #e6db74 } /* Literal.Date */
.highlight .m { color: #ae81ff } /* Literal.Number */
.highlight .s { color: #e6db74 } /* Literal.String */
.highlight .na { color: #a6e22e } /* Name.Attribute */
.highlight .nb { color: #f8f8f2 } /* Name.Builtin */
.highlight .nc { color: #a6e22e } /* Name.Class */
.highlight .no { color: #66d9ef } /* Name.Constant */
.highlight .nd { color: #a6e22e } /* Name.Decorator */
.highlight .ni { color: #f8f8f2 } /* Name.Entity */
.highlight .ne { color: #a6e22e } /* Name.Exception */
.highlight .nf { color: #a6e22e } /* Name.Function */
.highlight .nl { color: #f8f8f2 } /* Name.Label */
.highlight .nn { color: #f8f8f2 } /* Name.Namespace */
.highlight .nx { color: #a6e22e } /* Name.Other */
.highlight .py { color: #f8f8f2 } /* Name.Property */
.highlight .nt { color: #f92672 } /* Name.Tag */
.highlight .nv { color: #f8f8f2 } /* Name.Variable */
.highlight .ow { color: #f92672 } /* Operator.Word */
.highlight .w { color: #f8f8f2 } /* Text.Whitespace */
.highlight .mb { color: #ae81ff } /* Literal.Number.Bin */
.highlight .mf { color: #ae81ff } /* Literal.Number.Float */
.highlight .mh { color: #ae81ff } /* Literal.Number.Hex */
.highlight .mi { color: #ae81ff } /* Literal.Number.Integer */
.highlight .mo { color: #ae81ff } /* Literal.Number.Oct */
.highlight .sa { color: #e6db74 } /* Literal.String.Affix */
.highlight .sb { color: #e6db74 } /* Literal.String.Backtick */
.highlight .sc { color: #e6db74 } /* Literal.String.Char */
.highlight .dl { color: #e6db74 } /* Literal.String.Delimiter */
.highlight .sd { color: #e6db74 } /* Literal.String.Doc */
.highlight .s2 { color: #e6db74 } /* Literal.String.Double */
.highlight .se { color: #ae81ff } /* Literal.String.Escape */
.highlight .sh { color: #e6db74 } /* Literal.String.Heredoc */
.highlight .si { color: #e6db74 } /* Literal.String.Interpol */
.highlight .sx { color: #e6db74 } /* Literal.String.Other */
.highlight .sr { color: #e6db74 } /* Literal.String.Regex */
.highlight .s1 { color: #e6db74 } /* Literal.String.Single */
.highlight .ss { color: #e6db74 } /* Literal.String.Symbol */
.highlight .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #a6e22e } /* Name.Function.Magic */
.highlight .vc { color: #f8f8f2 } /* Name.Variable.Class */
.highlight .vg { color: #f8f8f2 } /* Name.Variable.Global */
.highlight .vi { color: #f8f8f2 } /* Name.Variable.Instance */
.highlight .vm { color: #f8f8f2 } /* Name.Variable.Magic */
.highlight .il { color: #ae81ff } /* Literal.Number.Integer.Long */

View File

@ -0,0 +1,83 @@
pre { line-height: 125%; }
td.linenos .normal { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #404040 }
.highlight { background: #202020; color: #d0d0d0 }
.highlight .c { color: #ababab; font-style: italic } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .esc { color: #d0d0d0 } /* Escape */
.highlight .g { color: #d0d0d0 } /* Generic */
.highlight .k { color: #6ebf26; font-weight: bold } /* Keyword */
.highlight .l { color: #d0d0d0 } /* Literal */
.highlight .n { color: #d0d0d0 } /* Name */
.highlight .o { color: #d0d0d0 } /* Operator */
.highlight .x { color: #d0d0d0 } /* Other */
.highlight .p { color: #d0d0d0 } /* Punctuation */
.highlight .ch { color: #ababab; font-style: italic } /* Comment.Hashbang */
.highlight .cm { color: #ababab; font-style: italic } /* Comment.Multiline */
.highlight .cp { color: #cd2828; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #ababab; font-style: italic } /* Comment.PreprocFile */
.highlight .c1 { color: #ababab; font-style: italic } /* Comment.Single */
.highlight .cs { color: #e50808; font-weight: bold; background-color: #520000 } /* Comment.Special */
.highlight .gd { color: #d22323 } /* Generic.Deleted */
.highlight .ge { color: #d0d0d0; font-style: italic } /* Generic.Emph */
.highlight .gr { color: #d22323 } /* Generic.Error */
.highlight .gh { color: #ffffff; font-weight: bold } /* Generic.Heading */
.highlight .gi { color: #589819 } /* Generic.Inserted */
.highlight .go { color: #cccccc } /* Generic.Output */
.highlight .gp { color: #aaaaaa } /* Generic.Prompt */
.highlight .gs { color: #d0d0d0; font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #ffffff; text-decoration: underline } /* Generic.Subheading */
.highlight .gt { color: #d22323 } /* Generic.Traceback */
.highlight .kc { color: #6ebf26; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #6ebf26; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #6ebf26; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #6ebf26 } /* Keyword.Pseudo */
.highlight .kr { color: #6ebf26; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #6ebf26; font-weight: bold } /* Keyword.Type */
.highlight .ld { color: #d0d0d0 } /* Literal.Date */
.highlight .m { color: #51b2fd } /* Literal.Number */
.highlight .s { color: #ed9d13 } /* Literal.String */
.highlight .na { color: #bbbbbb } /* Name.Attribute */
.highlight .nb { color: #2fbccd } /* Name.Builtin */
.highlight .nc { color: #71adff; text-decoration: underline } /* Name.Class */
.highlight .no { color: #40ffff } /* Name.Constant */
.highlight .nd { color: #ffa500 } /* Name.Decorator */
.highlight .ni { color: #d0d0d0 } /* Name.Entity */
.highlight .ne { color: #bbbbbb } /* Name.Exception */
.highlight .nf { color: #71adff } /* Name.Function */
.highlight .nl { color: #d0d0d0 } /* Name.Label */
.highlight .nn { color: #71adff; text-decoration: underline } /* Name.Namespace */
.highlight .nx { color: #d0d0d0 } /* Name.Other */
.highlight .py { color: #d0d0d0 } /* Name.Property */
.highlight .nt { color: #6ebf26; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #40ffff } /* Name.Variable */
.highlight .ow { color: #6ebf26; font-weight: bold } /* Operator.Word */
.highlight .w { color: #666666 } /* Text.Whitespace */
.highlight .mb { color: #51b2fd } /* Literal.Number.Bin */
.highlight .mf { color: #51b2fd } /* Literal.Number.Float */
.highlight .mh { color: #51b2fd } /* Literal.Number.Hex */
.highlight .mi { color: #51b2fd } /* Literal.Number.Integer */
.highlight .mo { color: #51b2fd } /* Literal.Number.Oct */
.highlight .sa { color: #ed9d13 } /* Literal.String.Affix */
.highlight .sb { color: #ed9d13 } /* Literal.String.Backtick */
.highlight .sc { color: #ed9d13 } /* Literal.String.Char */
.highlight .dl { color: #ed9d13 } /* Literal.String.Delimiter */
.highlight .sd { color: #ed9d13 } /* Literal.String.Doc */
.highlight .s2 { color: #ed9d13 } /* Literal.String.Double */
.highlight .se { color: #ed9d13 } /* Literal.String.Escape */
.highlight .sh { color: #ed9d13 } /* Literal.String.Heredoc */
.highlight .si { color: #ed9d13 } /* Literal.String.Interpol */
.highlight .sx { color: #ffa500 } /* Literal.String.Other */
.highlight .sr { color: #ed9d13 } /* Literal.String.Regex */
.highlight .s1 { color: #ed9d13 } /* Literal.String.Single */
.highlight .ss { color: #ed9d13 } /* Literal.String.Symbol */
.highlight .bp { color: #2fbccd } /* Name.Builtin.Pseudo */
.highlight .fm { color: #71adff } /* Name.Function.Magic */
.highlight .vc { color: #40ffff } /* Name.Variable.Class */
.highlight .vg { color: #40ffff } /* Name.Variable.Global */
.highlight .vi { color: #40ffff } /* Name.Variable.Instance */
.highlight .vm { color: #40ffff } /* Name.Variable.Magic */
.highlight .il { color: #51b2fd } /* Literal.Number.Integer.Long */

View File

@ -0,0 +1,73 @@
pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight { background: #ffffff; }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */

View File

@ -0,0 +1,83 @@
pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #0000ff }
.highlight { background: #000000; color: #dddddd }
.highlight .c { color: #00ff00 } /* Comment */
.highlight .err { color: #dddddd } /* Error */
.highlight .esc { color: #dddddd } /* Escape */
.highlight .g { color: #dddddd } /* Generic */
.highlight .k { color: #ff0000 } /* Keyword */
.highlight .l { color: #dddddd } /* Literal */
.highlight .n { color: #dddddd } /* Name */
.highlight .o { color: #dddddd } /* Operator */
.highlight .x { color: #dddddd } /* Other */
.highlight .p { color: #dddddd } /* Punctuation */
.highlight .ch { color: #00ff00 } /* Comment.Hashbang */
.highlight .cm { color: #00ff00 } /* Comment.Multiline */
.highlight .cp { color: #e5e5e5 } /* Comment.Preproc */
.highlight .cpf { color: #00ff00 } /* Comment.PreprocFile */
.highlight .c1 { color: #00ff00 } /* Comment.Single */
.highlight .cs { color: #00ff00 } /* Comment.Special */
.highlight .gd { color: #dddddd } /* Generic.Deleted */
.highlight .ge { color: #dddddd } /* Generic.Emph */
.highlight .gr { color: #dddddd } /* Generic.Error */
.highlight .gh { color: #dddddd } /* Generic.Heading */
.highlight .gi { color: #dddddd } /* Generic.Inserted */
.highlight .go { color: #dddddd } /* Generic.Output */
.highlight .gp { color: #dddddd } /* Generic.Prompt */
.highlight .gs { color: #dddddd } /* Generic.Strong */
.highlight .gu { color: #dddddd } /* Generic.Subheading */
.highlight .gt { color: #dddddd } /* Generic.Traceback */
.highlight .kc { color: #ff0000 } /* Keyword.Constant */
.highlight .kd { color: #ff0000 } /* Keyword.Declaration */
.highlight .kn { color: #ff0000 } /* Keyword.Namespace */
.highlight .kp { color: #ff0000 } /* Keyword.Pseudo */
.highlight .kr { color: #ff0000 } /* Keyword.Reserved */
.highlight .kt { color: #ee82ee } /* Keyword.Type */
.highlight .ld { color: #dddddd } /* Literal.Date */
.highlight .m { color: #dddddd } /* Literal.Number */
.highlight .s { color: #87ceeb } /* Literal.String */
.highlight .na { color: #dddddd } /* Name.Attribute */
.highlight .nb { color: #dddddd } /* Name.Builtin */
.highlight .nc { color: #dddddd } /* Name.Class */
.highlight .no { color: #7fffd4 } /* Name.Constant */
.highlight .nd { color: #dddddd } /* Name.Decorator */
.highlight .ni { color: #dddddd } /* Name.Entity */
.highlight .ne { color: #dddddd } /* Name.Exception */
.highlight .nf { color: #ffff00 } /* Name.Function */
.highlight .nl { color: #dddddd } /* Name.Label */
.highlight .nn { color: #dddddd } /* Name.Namespace */
.highlight .nx { color: #dddddd } /* Name.Other */
.highlight .py { color: #dddddd } /* Name.Property */
.highlight .nt { color: #dddddd } /* Name.Tag */
.highlight .nv { color: #eedd82 } /* Name.Variable */
.highlight .ow { color: #dddddd } /* Operator.Word */
.highlight .w { color: #dddddd } /* Text.Whitespace */
.highlight .mb { color: #dddddd } /* Literal.Number.Bin */
.highlight .mf { color: #dddddd } /* Literal.Number.Float */
.highlight .mh { color: #dddddd } /* Literal.Number.Hex */
.highlight .mi { color: #dddddd } /* Literal.Number.Integer */
.highlight .mo { color: #dddddd } /* Literal.Number.Oct */
.highlight .sa { color: #87ceeb } /* Literal.String.Affix */
.highlight .sb { color: #87ceeb } /* Literal.String.Backtick */
.highlight .sc { color: #87ceeb } /* Literal.String.Char */
.highlight .dl { color: #87ceeb } /* Literal.String.Delimiter */
.highlight .sd { color: #87ceeb } /* Literal.String.Doc */
.highlight .s2 { color: #87ceeb } /* Literal.String.Double */
.highlight .se { color: #87ceeb } /* Literal.String.Escape */
.highlight .sh { color: #87ceeb } /* Literal.String.Heredoc */
.highlight .si { color: #87ceeb } /* Literal.String.Interpol */
.highlight .sx { color: #87ceeb } /* Literal.String.Other */
.highlight .sr { color: #87ceeb } /* Literal.String.Regex */
.highlight .s1 { color: #87ceeb } /* Literal.String.Single */
.highlight .ss { color: #87ceeb } /* Literal.String.Symbol */
.highlight .bp { color: #dddddd } /* Name.Builtin.Pseudo */
.highlight .fm { color: #ffff00 } /* Name.Function.Magic */
.highlight .vc { color: #eedd82 } /* Name.Variable.Class */
.highlight .vg { color: #eedd82 } /* Name.Variable.Global */
.highlight .vi { color: #eedd82 } /* Name.Variable.Instance */
.highlight .vm { color: #eedd82 } /* Name.Variable.Magic */
.highlight .il { color: #dddddd } /* Literal.Number.Integer.Long */

View File

@ -0,0 +1,83 @@
pre { line-height: 125%; }
td.linenos .normal { color: #93a1a1; background-color: #eee8d5; padding-left: 5px; padding-right: 5px; }
span.linenos { color: #93a1a1; background-color: #eee8d5; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #eee8d5 }
.highlight { background: #fdf6e3; color: #657b83 }
.highlight .c { color: #93a1a1; font-style: italic } /* Comment */
.highlight .err { color: #657b83; background-color: #dc322f } /* Error */
.highlight .esc { color: #657b83 } /* Escape */
.highlight .g { color: #657b83 } /* Generic */
.highlight .k { color: #859900 } /* Keyword */
.highlight .l { color: #657b83 } /* Literal */
.highlight .n { color: #657b83 } /* Name */
.highlight .o { color: #93a1a1 } /* Operator */
.highlight .x { color: #657b83 } /* Other */
.highlight .p { color: #657b83 } /* Punctuation */
.highlight .ch { color: #93a1a1; font-style: italic } /* Comment.Hashbang */
.highlight .cm { color: #93a1a1; font-style: italic } /* Comment.Multiline */
.highlight .cp { color: #d33682 } /* Comment.Preproc */
.highlight .cpf { color: #93a1a1 } /* Comment.PreprocFile */
.highlight .c1 { color: #93a1a1; font-style: italic } /* Comment.Single */
.highlight .cs { color: #93a1a1; font-style: italic } /* Comment.Special */
.highlight .gd { color: #dc322f } /* Generic.Deleted */
.highlight .ge { color: #657b83; font-style: italic } /* Generic.Emph */
.highlight .gr { color: #dc322f } /* Generic.Error */
.highlight .gh { color: #657b83; font-weight: bold } /* Generic.Heading */
.highlight .gi { color: #859900 } /* Generic.Inserted */
.highlight .go { color: #657b83 } /* Generic.Output */
.highlight .gp { color: #268bd2; font-weight: bold } /* Generic.Prompt */
.highlight .gs { color: #657b83; font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #657b83; text-decoration: underline } /* Generic.Subheading */
.highlight .gt { color: #268bd2 } /* Generic.Traceback */
.highlight .kc { color: #2aa198 } /* Keyword.Constant */
.highlight .kd { color: #2aa198 } /* Keyword.Declaration */
.highlight .kn { color: #cb4b16 } /* Keyword.Namespace */
.highlight .kp { color: #859900 } /* Keyword.Pseudo */
.highlight .kr { color: #859900 } /* Keyword.Reserved */
.highlight .kt { color: #b58900 } /* Keyword.Type */
.highlight .ld { color: #657b83 } /* Literal.Date */
.highlight .m { color: #2aa198 } /* Literal.Number */
.highlight .s { color: #2aa198 } /* Literal.String */
.highlight .na { color: #657b83 } /* Name.Attribute */
.highlight .nb { color: #268bd2 } /* Name.Builtin */
.highlight .nc { color: #268bd2 } /* Name.Class */
.highlight .no { color: #268bd2 } /* Name.Constant */
.highlight .nd { color: #268bd2 } /* Name.Decorator */
.highlight .ni { color: #268bd2 } /* Name.Entity */
.highlight .ne { color: #268bd2 } /* Name.Exception */
.highlight .nf { color: #268bd2 } /* Name.Function */
.highlight .nl { color: #268bd2 } /* Name.Label */
.highlight .nn { color: #268bd2 } /* Name.Namespace */
.highlight .nx { color: #657b83 } /* Name.Other */
.highlight .py { color: #657b83 } /* Name.Property */
.highlight .nt { color: #268bd2 } /* Name.Tag */
.highlight .nv { color: #268bd2 } /* Name.Variable */
.highlight .ow { color: #859900 } /* Operator.Word */
.highlight .w { color: #657b83 } /* Text.Whitespace */
.highlight .mb { color: #2aa198 } /* Literal.Number.Bin */
.highlight .mf { color: #2aa198 } /* Literal.Number.Float */
.highlight .mh { color: #2aa198 } /* Literal.Number.Hex */
.highlight .mi { color: #2aa198 } /* Literal.Number.Integer */
.highlight .mo { color: #2aa198 } /* Literal.Number.Oct */
.highlight .sa { color: #2aa198 } /* Literal.String.Affix */
.highlight .sb { color: #2aa198 } /* Literal.String.Backtick */
.highlight .sc { color: #2aa198 } /* Literal.String.Char */
.highlight .dl { color: #2aa198 } /* Literal.String.Delimiter */
.highlight .sd { color: #93a1a1 } /* Literal.String.Doc */
.highlight .s2 { color: #2aa198 } /* Literal.String.Double */
.highlight .se { color: #2aa198 } /* Literal.String.Escape */
.highlight .sh { color: #2aa198 } /* Literal.String.Heredoc */
.highlight .si { color: #2aa198 } /* Literal.String.Interpol */
.highlight .sx { color: #2aa198 } /* Literal.String.Other */
.highlight .sr { color: #cb4b16 } /* Literal.String.Regex */
.highlight .s1 { color: #2aa198 } /* Literal.String.Single */
.highlight .ss { color: #2aa198 } /* Literal.String.Symbol */
.highlight .bp { color: #268bd2 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #268bd2 } /* Name.Function.Magic */
.highlight .vc { color: #268bd2 } /* Name.Variable.Class */
.highlight .vg { color: #268bd2 } /* Name.Variable.Global */
.highlight .vi { color: #268bd2 } /* Name.Variable.Instance */
.highlight .vm { color: #268bd2 } /* Name.Variable.Magic */
.highlight .il { color: #2aa198 } /* Literal.Number.Integer.Long */

View File

@ -0,0 +1,134 @@
/* Typography
*/
h1, h2, h3, h4, h5, h6 {
margin-top: 1rem;
margin-bottom: 1.2rem;
font-weight: 500;
}
h1 { font-size: 3.6rem; line-height: 1.2; letter-spacing: -.1rem;}
h2 { font-size: 3.0rem; line-height: 1.25; letter-spacing: -.1rem; }
h3 { font-size: 2.6rem; line-height: 1.3; letter-spacing: -.1rem; }
h4 { font-size: 2.0rem; line-height: 1.35; letter-spacing: -.08rem; }
h5 { font-size: 1.6rem; line-height: 1.5; letter-spacing: -.05rem; }
h6 { font-size: 1.2rem; line-height: 1.6; letter-spacing: 0; }
p { margin: 1rem 0; }
/* Links
*/
a {
color: #0b6adc;
text-decoration: none;
}
a:hover {
color: #0b6adc;
text-decoration: underline;
}
/* Code
*/
pre {
font-size: 85%;
}
code {
padding: .2rem .5rem;
margin: 0 .2rem;
white-space: nowrap;
background: #f1f1f1;
border: 1px solid #e1e1e1;
}
pre > code {
display: block;
padding: 1rem;
white-space: pre;
}
.highlight {
border-radius: 8px;
}
.highlight pre {
padding: 1rem;
overflow-x: auto;
}
span.docutils.literal { /* Inline literal */
background-color: #d0d7de;
border-radius: 4px;
padding: 0 4px 2px 4px;
font-family: monospace;
font-size: 80%;
}
/* Lists
*/
dt { /* Defenition list title */
font-weight: bold;
}
ol, ul {
margin: 0;
}
/* Blockquotes
*/
blockquote {
padding: 0 1em;
border-left: .25em solid #d0d7de;
}
/* Tables
*/
table, th, td {
border: 1px solid;
border-collapse: collapse;
border-color: #afb4b9;
padding: 0 8px;
}
th {
font-weight: 600;
background-color: #d0d7de;
}
td p {
margin: .5rem 0;
}
hr {
color: #d0d7de;
}
/* Admonitions
*/
.admonition {
padding: .5rem 1rem;
}
.admonition-title {
font-weight: bold;
}
.attention {}
.caution {}
.danger {}
.error {}
.hint {}
.important {}
.note {
color: #3171b5;
background-color: #e5f1fb;
}
.tip {}
.warning {}
.topic {}
.topic-title {
font-weight: bold;
}

49
content/bash_prompt.rst Normal file
View File

@ -0,0 +1,49 @@
:title: Функциональный и простой Bash prompt
:date: 10 Jul 2022
====================================
Функциональный и простой Bash prompt
====================================
О промптинге в Bash написано очень много, в этой заметке я просто покажу
лаконичный и функциональный вариант приглашения командной строки.
Вот фрагмент из моего **~/.bashrc**:
.. code-block:: shell
# Command line prompt
# Print a non-zero exit code
__exit_code_ps1() {
if [ "$1" -ne 0 ]; then
echo "$1 "
fi
}
PS1='\[\033[0;92m\]\w \[\033[0;31m\]$(__exit_code_ps1 $?)\[\033[0;15m\]\$ '
# Git prompt
# See /usr/share/git/completion/git-prompt.sh or download from:
# https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh
if [ -f /usr/share/git/completion/git-prompt.sh ]; then
. /usr/share/git/completion/git-prompt.sh
GIT_PS1_SHOWDIRTYSTATE=1
PS1='\[\033[0;96m\]$(__git_ps1 "(%s) ")\[\033[0;92m\]\w \[\033[0;31m\]$(__exit_code_ps1 $?)\[\033[0;15m\]\$ '
fi
На GitHub можно найти много всяких скриптов или даже целых "фремворков" типа `этого`_
или `отдельные скрипты`_ для Git. А вы знали, что скрипт для PS1 и так `поставляется`_
в пакете Git? Не вижу смысла не использовать его, если только вам не надо
как-то иначе работать с PS1.
.. _этого: https://github.com/ohmybash/oh-my-bash
.. _отдельные скрипты: https://github.com/magicmonty/bash-git-prompt
.. _поставляется: https://github.com/git/git/tree/master/contrib/completion>
Помимо **git-prompt.sh** я использую функцию ``__exit_code_ps1()``, которая просто
печатает число, если оно не равно нулю. Это очень удобно — всегда видишь код выхода
предыдущей запущенной команды, порой очень помогает при отладке скриптов.
В итоге всё это дело у меня выглядит вот так:
.. image:: https://i.nxhs.cloud/ovD.png

54
content/python_oop.rst Normal file
View File

@ -0,0 +1,54 @@
:title: Питонячье ООП на уточках
:date: 24 Jul 2021
========================
Питонячье ООП на уточках
========================
Это весьма скупая на информацию напоминалка о работе с классами. Более подробно написали на `proglib.io`_ и в `документации`_.
.. _proglib.io: https://proglib.io/p/python-oop/
.. окументации: https://docs.python.org/3/reference/compound_stmts.html#class-definitions
Создал файл ``duck.py``:
.. code-block:: python
# Объявляем класс "птица". От него в последствии будет унаследован
# класс "уточка". Здесь задаются общие характеристики для всех птиц
# и метод "летать". Аргумент `self` это ссылка на объект, в контексте
# которого вызывается метод. Она обязательна для методов классов.
class Bird(object):
can_fly = True
wings = 2
def fly(self):
print('I\'m flying!')
# Уточка это уже конкретный биологический вид (опускам породы и
# виды уточек).
# У неё есть имя и цвет (хотя цвет мог быть и у абстрактной птицы).
# Также уточка обладает уникальным методом "сказать кря".
class Duck(Bird):
name = 'Duck'
color = 'Yellow'
def say_quack(self):
print('quack!')
Как этим пользоваться:
.. code-block:: text
>>> import duck
>>> bird = duck.Bird()
>>> duck = duck.Duck()
>>> bird.fly()
I'm flying!
>>> duck.fly()
I'm flying!
>>> duck.say_quack()
quack!
>>> duck.name = 'Cool Duck'
>>> duck.name
'Cool Duck'

192
content/rst.rst Normal file
View File

@ -0,0 +1,192 @@
:title: Превью reStructuredText
:date: 5 Aug 2022
:not_a_post:
===================================
Превью *re*\ **Structured**\ *Text*
===================================
This document is the theme preview.
Sphinx provides several different types of admonitions.
.. topic:: This is a topic.
This is what admonitions are a special case of, according to the docutils
documentation.
.. admonition:: The one with the custom titles
It's got a certain charm to it.
.. attention::
Climate change is real.
.. caution::
Cliff ahead: Don't drive off it.
.. danger::
Mad scientist at work!
.. error::
Does not compute.
.. hint::
Insulators insulate, until they are subject to ______ voltage.
.. important::
Tech is not neutral, nor is it apolitical.
.. note::
This is a note.
.. tip::
25% if the service is good.
.. warning::
Reader discretion is strongly advised.
Subheading
==========
.. Press :kbd:`Ctrl+Alt+Del`.
Subsubheading
-------------
Subsububheading
```````````````
Subsubsubsubheading
'''''''''''''''''''
Subsubsubsubsubheading
~~~~~~~~~~~~~~~~~~~~~~
`Python Docs`_.
.. _Python Docs: https://docs.python.org/
The area of a circle is :math:`A_\text{c} = (\pi/4) d^2`.
.. math::
\frac{ \sum_{t=0}^{N}f(t,k) }{N}
Python code block:
.. code:: python
@app.get('/api/hello/{name}')
async def get_user_info(name: str) -> str:
return 'Hello, {}!'.format(name)
There is an ``inline literal`` and `interpreted text`
``code-block`` properties supported by Sphinx:
::
:linenos: Show line numbers
:emphasize-lines: 3,5 Highlight specific lines
------------
Bullet lists:
- This is item 1
- Sub item
- 3rd level sub item
- 4nd level
- This is item 2
- Bullets are "-", "*" or "+".
Continuing text must be aligned
after the bullet and whitespace.
Note that a blank line is required
before the first item and after the
last, but is optional between items.
Enumerated lists:
3. This is the first item
4. This is the second item
5. Enumerators are arabic numbers,
single letters, or roman numerals
6. List items should be sequentially
numbered, but need not start at 1
(although not all formatters will
honour the first index).
#. This item is auto-enumerated
Definition lists:
what
Definition lists associate a term with
a definition.
how
The term is a one-line phrase, and the
definition is one or more paragraphs or
body elements, indented relative to the
term. Blank lines are not allowed
between term and definition.
Field Lists:
:Authors:
Tony J. (Tibs) Ibbs,
David Goodger
(and sundry other good-natured folks)
:Version: 1.0 of 2001/08/08
:Dedication: To my father.
Block quotes are just:
Indented paragraphs,
and they may nest.
Grid table:
+------------+------------+-----------+
| Header 1 | Header 2 | Header 3 |
+============+============+===========+
| body row 1 | column 2 | column 3 |
+------------+------------+-----------+
| body row 2 | Cells may span columns.|
+------------+------------+-----------+
| body row 3 | Cells may | - Cells |
+------------+ span rows. | - contain |
| body row 4 | | - blocks. |
+------------+------------+-----------+
Simple table:
===== ===== ======
Inputs Output
------------ ------
A B A or B
===== ===== ======
False False False
True False True
False True True
True True True
===== ===== ======

335
content/this_blog.rst Normal file
View File

@ -0,0 +1,335 @@
:title: Как я написал этот блог
:date: 5 Aug 2022
=======================
Как я написал этот блог
=======================
Предыстория
===========
Я очень давно планировал написать блог. Именно что написать CMS для ведения
блога. Если погуглить, то CMS для этих целей сотни на разных языках с разным
позиционированием и фичами. Но мне хотелось своего.
Первые попытки создать сайт были на `Flask`_, особым успехом не увенчались,
но это была хорошая практика и я немного прокачал свой уровень программирования.
Для блога я не хотел использовать базу данных. Вместо этого я хранил статьи в
исходном Markdown, а метаданные по каждой статье писал в отдельный JSON, который
заменял мне БД. С тем же успехом я мог бы использовать SQLite, но мне нужно было
хранить контент в text/plain.
Блог даже работал, но мне хотелось сделать админку, чтобы можно было писать
прямо в браузере. На этой части разработка заглохла и я окончательно запутался в
импортах в Python)
Прошло ещё много времени, я вернулся к идее, но решил сделать ставку на простоту
и начал писать на `Bottle`_. Здесь разработка остановилась не дойдя даже до
варианта хоть как-то работающей системы. Причины скорее всего надо искать в
лени.
Устав я взял `CMS Bludit`_ и стал вести свои редкие заметки в нём. Решение не
самое плохое, но и не супер отличное. Для простой кастомизации футера пришлось
городить костыли.
.. _Flask: https://flask.palletsprojects.com/
.. _Bottle: https://bottlepy.org/
.. _CMS Bludit: https://www.bludit.com/ru/
Статика VS динамика
===================
Преимуществ у статических сайтов много. Об этом уже много написано. Мне больше
всего в статических сайтах нравится то, что:
* роутингом запросов не управляет какой-либо скрипт, я могу свободно
распоряжаться тем, что у меня есть в DocumentRoot;
* не нужно настраивать application-сервер и реверс-прокси на него.
С редактированием сайта чуть сложнее, так как сперва надо внести изменения
локально, а затем заменить изменившиеся файлы на сервере. Но и тут есть
какие-то решения.
Я рассматривал уже готовые генераторы статических сайтов, но у них всех были
фатальные недостатки:
* они сложные и требуют изучения документации чтобы начать писать;
* написать собственную тему задача весьма непростая;
* они написаны не мной.
Здесь и рождается мой велосипед, которому я не придумал названия. Буду называть
его `генератором`.
*re*\ **Structured**\ *Text*
============================
Я очень долго писал на Markdown, но в один момент понял, что возможностей языка
стало нехватать. Тут пришёлся очень кстати `Python-Markdown`_ к которому можно
было прикручивать `расширения`_. Одно даже сам `написал`_.
Постепенно я пришёл к `reStructuredText`_. Все приколюхи, которые в нём есть
существуют не за счёт расширения синтаксиса плагинами, а заложены в спецификации.
Функциональности из коробки хватает чтобы писать даже `формулы`_.
Такие вещи делаются через `роли` и `директивы`. Некоторые готовые директивы есть
в системе документации `Sphinx`_. Их я собираюсь потихоньку скопировать к себе.
Ещё одно большое преимущество перед Markdown состоит в том, что reStructuredText
поддерживает атрибуты. Вот как это выглядит:
.. code-block:: rst
:title: Как я написал этот блог
:date: 5 Aug 2022
Это нативная фича, которую можно использовать в статьях для добавления метаданных.
По сути это место, где можно сделать настройки, касающиеся отдельно взятой статьи.
Большинство генераторов статических сайтов колхозят нечно подобное в Markdown, делая
исходник статьи непригодным для парсинга другими инструментами. Это причина по
которой в старой реализации блога мне пришлось использовать JSON для метаданных.
.. _Sphinx: https://www.sphinx-doc.org/en/master/index.html
.. _Python-Markdown: https://python-markdown.github.io/
.. _расширения: https://python-markdown.github.io/extensions/
.. аписал: https://pypi.org/project/markdown-alerts/
.. _rST: https://docutils.sourceforge.io/rst.html
.. ормулы: https://docutils.sourceforge.io/docs/ref/rst/mathematics.html
Обзор
=====
Сайт состоит из следующих частей.
rst_blg.py
Непосредственно код генератора. Сейчас там всего около 200 строк без учёта
комментариев.
requirements.txt
Список зависимостей. Стараюсь держать минимум. Пока что там: `docutils`,
`jinja2`, `toml` и `pygments`.
settings.toml
Файл с настройками. Здесь можно переопределить практически всё.
Makefile
Через него запускаются команды для сборки сайта и некоторые другие. Не
является обязательным, но с ним удобнее.
layouts
Директория для шаблонов Jinja2.
assets
Директория для хранения статических файлов, будь то CSS, JS или изображения.
Всё что нужно для визуального оформления страниц. Внутренняя структура
каталога может быть произвольной.
content
Директория с исходниками статей в reStructuredText. Сюда можно также
положить любые файлы и директории.
build
В эту директорию копируются ассеты, файлы и сгенерированный HTML.
Статьи, шаблоны и ассеты могут быть оформлены абсолютно любым образом. Скрипту
безразлично что собирать. Пути и имена всех директорий можно переопределить в
settings.toml.
Написание постов
================
Тут всё предельно просто. Пишем файл и кладём в директорию `content`. В файле
должны быть указаны обязательные атрибуты ``:title:`` и ``:date:``.
Блог пока не умеет работать с вложенной структурой статей. Поэтому всё будет
свалено в кучу в корневую директорию сайта.
Все статьи добавляются в список постов и отображаются на главной странице.
Для того, чтобы сделать "отдельную" страницу, надо добавить атрибут
``:not_a_post:``.
================= ======= =========== ====================================
Атрибут Тип Умолчание Описание
================= ======= =========== ====================================
``:title:`` Строка Заголовок статьи
``:date:`` Дата Дата публикации, формат задаётся в
settings.toml
``:not_a_post:`` Флаг для одиночных страниц
================= ======= =========== ====================================
Темы оформления
===============
Никаких готовых тем. Пишем CSS вручную. Генератору сайтов всё равно что там
будет. От уровеня представления он никак не зависит. Так что можно писать любые
шаблоны и стили для них.
Отдельно можно задать тему для блоков кода. Список тем для Pygments с превью
есть на странице https://pygments.org/styles/
Чтобы поменять тему, например, на `default` надо выполнить команду:
.. code-block:: shell
make css default
# или
pygmentize -f html -S default -a .highlight > assets/css/pygments/default.css
Затем поменять значение ``theme`` в секции ``pygments`` settings.toml.
.. code-block:: toml
[pygments]
theme = 'default'
Шаблоны
========
Шаблоны можно писать какие угодно. Для этогой сайта я написал три файла.
Приведу их без лишних строк.
**base.j2**
.. code-block:: html+jinja
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="icon" href="data:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=">
<link rel="stylesheet" href="assets/css/pygments/{{ pygments_theme }}.css">
<link rel="stylesheet" href="assets/css/custom.css">
<title>{{ page_title }} | {{ site_title }}</title>
</head>
<body>
<header>
<p>
{% if posts %}
{{ site_title }}
{% else %}
<a href="/">{{ site_title }}</a> / {{ page_title }}</p>
{% endif %}
</p>
</header>
{% block content %}{% endblock %}
<footer>
<!-- Footer content -->
</footer>
</body>
</html>
**post.j2**
.. code-block:: html+jinja
{% extends "base.j2" %}
{% block content %}
<article>
{{ post | safe }}
<article>
{% endblock %}
**index.j2**
.. code-block:: html+jinja
{% extends "base.j2" %}
{% block content %}
<section>
<ul id="posts">
{% for post in posts %}
<li>
<a href="/{{ post['path'] }}">{{ post['title'] }}</a>
<span class="meta"> — {{ post['date'] }}</span>
</li>
{% endfor %}
</ul>
</section>
{% endblock %}
settings.toml
=============
Сначала я хотел использовать обычный INI, но мне нужно было получать из конфига
словарь. Немного подумал и выбрал TOML. Он отлично сериализируется в словарь,
визуально повторяет INI.
**settings.toml** разделён на несколько секций.
site
Данные касающиеся непосредственно сайта.
title
Название сайта
index_page_title
Заголовок главной страницы. Для всех остальных страниц заголовок
берётся из атрибута.
datatime_format
Формат даты для атрибута ``:date:``.
build
Параметры, используетмые при сборке.
build_dir
Директория, куда будет сохранён собранный сайт.
content_dir
Директория с исходниками статей.
templates_dir
Директория с шаблонами Jinja2.
assets_dir
Директория с ассетами.
pygments
Параметры подсветки синтаксиса в блоках кода.
theme
Стиль Pygments.
docutils
Конфигурация для docutils. Здесь можно указать любые параметры, которые
есть здесь: https://docutils.sourceforge.io/docs/user/config.html
Мне достаточно:
.. code-block:: toml
[docutils]
initial_header_level = 2
section_self_link = true
syntax_highlight = 'short'
Что ещё хочется сделать
=======================
В перспективе я планирую добавить следующие фичи.
- RSS
- OpenGraph
- Webmention
- Расширить возможности rST до уровня Sphinx
- Улучшить CSS
- Комментарии
- Кастомный лейаут для отдельных статей
- Поддержка вложенной структуры статей
.. * https://jinja.palletsprojects.com/en/3.0.x/templates/
* https://docutils.sourceforge.io/docs/user/config.html

View File

@ -0,0 +1,43 @@
:title: Менеджер задач в текстовом файле
:date: 2 Sep 2021
================================
Менеджер задач в текстовом файле
================================
Кажется, я нашёл почти идеальную формулу для ведения списка задач. По сути я
придумал новый формат разметки текста, специализированный для списков задач.
Придумать для него название оказалось тяжело. Приложение Todo это второе по
популярности приложение после Hello World и все хорошие названия уже давно
заняты. Поэтому пусть будет просто **.todo**.
Синтаксис выглядит таким образом
.. code-block:: text
- Uncompleted task (light blue)
+ Completed task (green)
x Rejected task (red)
# Comment
\Marked text (yellow background)\
`Code (magenta)`
Plain text
.. image:: https://i.nxhs.cloud/MQ9.png
Да, это все элементы синтаксиса. Предельно просто.
Какие есть возможности (сравниваю с тем, что предлагают обычные
todo-приложения):
- Не нужно устанавливать никакого дополнительного ПО или каждый раз открывать
громоздкий веб-интерфейс. Всё что надо это текстовый редактор. В моём случае
идеально подошёл **vim**. Написал для него `скрипт для подсветки синтаксиса`_.
При желании можно написать подсветку для других редакторов.
- Текстовая заметка и задача это одна сущность — один файл.
- Всё управление полностью с клавиатуры.
- Полная свобода включать в файл что угодно. Разумеется, текст, это не
специальный формат для встраивания изображений или других файлов, но можно
использовать элементы Markdown.
.. _скрипт для подсветки синтаксиса: https://git.nxhs.cloud/ge/todolist-syntax

61
layouts/base.j2 Normal file
View File

@ -0,0 +1,61 @@
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="icon" href="data:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Source+Code+Pro:ital,wght@0,400;0,700;1,400;1,700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="assets/css/normalize-8.0.1.css">
<link rel="stylesheet" href="assets/css/pygments/{{ pygments_theme }}.css">
<link rel="stylesheet" href="assets/css/html5_polyglot/math.css">
<link rel="stylesheet" href="assets/css/restructuredtext.css">
<link rel="stylesheet" href="assets/css/custom.css">
<title>{{ page_title }} | {{ site_title }}</title>
</head>
<body>
<header>
<p>
{% if posts %}
{{ site_title }}
{% else %}
<a href="/">{{ site_title }}</a> / {{ page_title }}</p>
{% endif %}
</p>
</header>
{% block content %}{% endblock %}
<footer>
<p>
<span>- - -</span>
</p>
<p>
<a href="/">home</a> |
<a href="/projects">projects</a> |
<a href="https://git.nxhs.cloud/">code</a> |
<a href="/kb/">knowledge base</a> |
<a href="/writing">writing</a> |
<a href="/cgi-bin/ip.cgi">my ip</a>
</p>
<h3>About</h3>
<p>
Ещё один сайт про cисадмиство и программирование.
Пишу про софт, GNU/Linux и на смежные айтишные темы.
</p>
<p>
Copyright © 2021-2022 Материалы и исходные коды программ, представленные
на этом сайте, если не указано иное, распространяются по лицензии
<a href="https://creativecommons.org/publicdomain/zero/1.0/deed.en"
target="_blank">CC0 1.0</a>.
Вы можете свободно копировать и использовать их.
</p>
</footer>
</body>
</html>

15
layouts/index.j2 Normal file
View File

@ -0,0 +1,15 @@
{% extends "base.j2" %}
{% block content %}
<section>
<ul id="posts">
{% for post in posts %}
<li>
<a href="/{{ post['path'] }}">{{post['title'] }}</a>
<span class="meta"> — {{ post['date'] }}</span>
</li>
{% endfor %}
</ul>
</section>
{% endblock %}

8
layouts/post.j2 Normal file
View File

@ -0,0 +1,8 @@
{% extends "base.j2" %}
{% block content %}
<article>
{{ post | safe }}
<article>
{% endblock %}