From 86029698902cc6b3b9a2717ba368fdfd4e110975 Mon Sep 17 00:00:00 2001 From: squidfunk Date: Sun, 19 Jul 2020 22:23:26 +0200 Subject: [PATCH] Finished syntax highlighter docs and moved overrides to CSS --- MANIFEST.in | 1 + docs/extensions/codehilite.md | 966 ------------------ docs/guides/adding-a-git-repository.md | 34 + docs/guides/changing-colors.md | 123 +-- docs/guides/changing-the-fonts.md | 4 +- docs/guides/changing-the-language.md | 33 +- docs/guides/navigation.md | 19 +- docs/guides/syntax-highlighting.md | 204 +++- docs/guides/third-party-integrations.md | 0 .../assets/javascripts/bundle.2a81e305.min.js | 2 - .../assets/javascripts/bundle.b49b2592.min.js | 2 + ....min.js.map => bundle.b49b2592.min.js.map} | 2 +- ...568ba93b.min.js => vendor.877163d5.min.js} | 4 +- ....min.js.map => vendor.877163d5.min.js.map} | 2 +- material/assets/manifest.json | 18 +- ...04aed59c.min.css => main.d49d26fc.min.css} | 2 +- ....min.css.map => main.d49d26fc.min.css.map} | 2 +- .../stylesheets/overrides.0ad0ad40.min.css | 3 + .../overrides.0ad0ad40.min.css.map | 1 + ...5632b.min.css => palette.87445083.min.css} | 2 +- ...n.css.map => palette.87445083.min.css.map} | 2 +- material/base.html | 8 +- material/overrides/main.html | 2 +- mkdocs.yml | 7 +- .../stylesheets/extensions/_admonition.scss | 2 +- src/assets/stylesheets/overrides.scss | 41 + .../stylesheets/overrides/_admonition.scss | 83 ++ .../stylesheets/overrides/_announce.scss | 47 + .../stylesheets/overrides/_typeset.scss | 57 ++ src/overrides/main.html | 26 +- webpack.config.ts | 26 +- 31 files changed, 578 insertions(+), 1147 deletions(-) delete mode 100644 docs/extensions/codehilite.md delete mode 100644 docs/guides/third-party-integrations.md delete mode 100644 material/assets/javascripts/bundle.2a81e305.min.js create mode 100644 material/assets/javascripts/bundle.b49b2592.min.js rename material/assets/javascripts/{bundle.2a81e305.min.js.map => bundle.b49b2592.min.js.map} (99%) rename material/assets/javascripts/{vendor.568ba93b.min.js => vendor.877163d5.min.js} (70%) rename material/assets/javascripts/{vendor.568ba93b.min.js.map => vendor.877163d5.min.js.map} (99%) rename material/assets/stylesheets/{main.04aed59c.min.css => main.d49d26fc.min.css} (99%) rename material/assets/stylesheets/{main.04aed59c.min.css.map => main.d49d26fc.min.css.map} (99%) create mode 100644 material/assets/stylesheets/overrides.0ad0ad40.min.css create mode 100644 material/assets/stylesheets/overrides.0ad0ad40.min.css.map rename material/assets/stylesheets/{palette.e185632b.min.css => palette.87445083.min.css} (99%) rename material/assets/stylesheets/{palette.e185632b.min.css.map => palette.87445083.min.css.map} (99%) create mode 100644 src/assets/stylesheets/overrides.scss create mode 100644 src/assets/stylesheets/overrides/_admonition.scss create mode 100644 src/assets/stylesheets/overrides/_announce.scss create mode 100644 src/assets/stylesheets/overrides/_typeset.scss diff --git a/MANIFEST.in b/MANIFEST.in index 50ff2bbc9..7ac8c7116 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,5 +1,6 @@ recursive-include material *.js *.css *.map *.html *.svg *.png *.yml recursive-include material *.ttf *.woff *.woff2 LICENSE* +recursive-exclude material/assets overrides* recursive-exclude material/overrides * recursive-exclude site * recursive-exclude src * diff --git a/docs/extensions/codehilite.md b/docs/extensions/codehilite.md deleted file mode 100644 index 4640389a5..000000000 --- a/docs/extensions/codehilite.md +++ /dev/null @@ -1,966 +0,0 @@ ---- -template: overrides/main.html ---- - -# CodeHilite - -[CodeHilite][1] is an extension that adds syntax highlighting to code blocks -and is included in the standard Markdown library. It uses [Pygments][2] during -the compilation of the Markdown file to provide syntax highlighting for over -[300 languages][3] and has no JavaScript runtime dependency. - - [1]: https://python-markdown.github.io/extensions/code_hilite/ - [2]: https://pygments.org - [3]: http://pygments.org/languages - -## Configuration - -Add the following lines to `mkdocs.yml`: - -``` yaml -markdown_extensions: - - codehilite -``` - -## Usage - -### Specifying the language - -The CodeHilite extension uses the same syntax as regular Markdown code blocks, -but needs to know the language of the code block. This can be done in three -different ways. - -#### via Markdown syntax recommended - -In Markdown, code blocks can be opened and closed by writing three backticks on -separate lines. To add code highlighting to those blocks, the easiest way is -to specify the language identifier directly after the opening block. - -Example: - -```` markdown -``` python -import tensorflow as tf -``` -```` - -Result: - -``` python -import tensorflow as tf -``` - -#### via Shebang - -Alternatively, if the first line of a code block contains a shebang, the -language is derived from the path referenced in the shebang. This will only -work for code blocks that are indented using four spaces, not for those -encapsulated in three backticks. - -Example: - -```` markdown - #!/usr/bin/python - import tensorflow as tf -```` - -Result: - -``` python -#!/usr/bin/python -import tensorflow as tf -``` - -#### via three colons - -If the first line starts with three colons followed by a language identifier, -the first line is stripped. This will only work for code blocks that are -indented using four spaces, not for those encapsulated in three backticks. - -Example: - -``` markdown - :::python - import tensorflow as tf -``` - -Result: - - :::python - import tensorflow as tf - -### Adding line numbers - -Line numbers can be added to a code block by enabling the `linenums` flag in -`mkdocs.yml` or adding `linenums=1` right after the language identifier: - -``` yaml -markdown_extensions: - - codehilite: - linenums: true -``` - -Example: - -```` markdown -``` python linenums="1" -""" Bubble sort """ -def bubble_sort(items): - for i in range(len(items)): - for j in range(len(items) - 1 - i): - if items[j] > items[j + 1]: - items[j], items[j + 1] = items[j + 1], items[j] -``` -```` - -Result: - -``` python linenums="1" -""" Bubble sort """ -def bubble_sort(items): - for i in range(len(items)): - for j in range(len(items) - 1 - i): - if items[j] > items[j + 1]: - items[j], items[j + 1] = items[j + 1], items[j] -``` - -### Grouping code blocks - -The [Tabbed][4] extension which is part of the [PyMdown Extensions][5] -package adds support for grouping Markdown blocks with tabs. This is especially -useful for documenting projects with multiple language bindings. - -Add the Tabbed and SuperFences extensions to `mkdocs.yml`: - -``` yaml -markdown_extensions: - - codehilite - - pymdownx.tabbed - - pymdownx.superfences -``` - -Add your tabbed code to your markdown file. Example: - -```` -=== "Bash" - ``` bash - #!/bin/bash - - echo "Hello world!" - ``` - -=== "C" - ``` c - #include - - int main(void) { - printf("Hello world!\n"); - return 0; - } - ``` - -=== "C++" - ``` c++ - #include - - int main(void) { - std::cout << "Hello world!" << std::endl; - return 0; - } - ``` - -=== "C#" - ``` c# - using System; - - class Program { - static void Main(string[] args) { - Console.WriteLine("Hello world!"); - } - } - ``` -```` - -Result: - -=== "Bash" - ``` bash - #!/bin/bash - - echo "Hello world!" - ``` - -=== "C" - ``` c - #include - - int main(void) { - printf("Hello world!\n"); - return 0; - } - ``` - -=== "C++" - ``` c++ - #include - - int main(void) { - std::cout << "Hello world!" << std::endl; - return 0; - } - ``` - -=== "C#" - ``` c# - using System; - - class Program { - static void Main(string[] args) { - Console.WriteLine("Hello world!"); - } - } - ``` - - [4]: https://facelessuser.github.io/pymdown-extensions/extensions/tabbed/ - [5]: https://facelessuser.github.io/pymdown-extensions - -### Highlighting specific lines - -Specific lines can be highlighted by passing the line numbers to the `hl_lines` -argument placed right after the language identifier. Line counts start at 1. - -Example: - -```` markdown -``` python hl_lines="3 4" -""" Bubble sort """ -def bubble_sort(items): - for i in range(len(items)): - for j in range(len(items) - 1 - i): - if items[j] > items[j + 1]: - items[j], items[j + 1] = items[j + 1], items[j] -``` -```` - -Result: - -``` python linenums="1" hl_lines="3 4" -""" Bubble sort """ -def bubble_sort(items): - for i in range(len(items)): - for j in range(len(items) - 1 - i): - if items[j] > items[j + 1]: - items[j], items[j + 1] = items[j + 1], items[j] -``` - -## Supported languages excerpt - -CodeHilite uses [Pygments][2], a generic syntax highlighter with support for -over [300 languages][3], so the following list of examples is just an excerpt. - -### Bash - -``` bash -#!/bin/bash - -for OPT in "$@" -do - case "$OPT" in - '-f' ) canonicalize=1 ;; - '-n' ) switchlf="-n" ;; - esac -done - -# readlink -f -function __readlink_f { - target="$1" - while test -n "$target"; do - filepath="$target" - cd `dirname "$filepath"` - target=`readlink "$filepath"` - done - /bin/echo $switchlf `pwd -P`/`basename "$filepath"` -} - -if [ ! "$canonicalize" ]; then - readlink $switchlf "$@" -else - for file in "$@" - do - case "$file" in - -* ) ;; - * ) __readlink_f "$file" ;; - esac - done -fi - -exit $? -``` - -### C - -``` c -extern size_t -pb_varint_scan(const uint8_t data[], size_t left) { - assert(data && left); - left = left > 10 ? 10 : left; - -#ifdef __SSE2__ - - /* Mapping: remaining bytes ==> bitmask */ - static const int mask_map[] = { - 0x0000, 0x0001, 0x0003, 0x0007, - 0x000F, 0x001F, 0x003F, 0x007F, - 0x00FF, 0x01FF, 0x03FF - }; - - /* Load buffer into 128-bit integer and create high-bit mask */ - __m128i temp = _mm_loadu_si128((const __m128i *)data); - __m128i high = _mm_set1_epi8(0x80); - - /* Intersect and extract mask with high-bits set */ - int mask = _mm_movemask_epi8(_mm_and_si128(temp, high)); - mask = (mask & mask_map[left]) ^ mask_map[left]; - - /* Count trailing zeroes */ - return mask ? __builtin_ctz(mask) + 1 : 0; - -#else - - /* Linear scan */ - size_t size = 0; - while (data[size++] & 0x80) - if (!--left) - return 0; - return size; - -#endif /* __SSE2__ */ - -} -``` - -### C++ - -``` cpp -Extension:: -Extension(const Descriptor *descriptor, const Descriptor *scope) : - descriptor_(descriptor), - scope_(scope) { - - /* Extract full name for signature */ - variables_["signature"] = descriptor_->full_name(); - - /* Prepare message symbol */ - variables_["message"] = StringReplace( - variables_["signature"], ".", "_", true); - LowerString(&(variables_["message"])); - - /* Suffix scope to identifiers, if given */ - string suffix (""); - if (scope_) { - suffix = scope_->full_name(); - - /* Check if the base and extension types are in the same package */ - if (!scope_->file()->package().compare(descriptor_->file()->package())) - suffix = StripPrefixString(suffix, - scope_->file()->package() + "."); - - /* Append to signature */ - variables_["signature"] += ".[" + suffix +"]"; - suffix = "_" + suffix; - } - - /* Prepare extension symbol */ - variables_["extension"] = StringReplace( - suffix, ".", "_", true); - LowerString(&(variables_["extension"])); -} -``` - -### C# - -``` csharp -public static void Send( - Socket socket, byte[] buffer, int offset, int size, int timeout) { - int startTickCount = Environment.TickCount; - int sent = 0; - do { - if (Environment.TickCount > startTickCount + timeout) - throw new Exception("Timeout."); - try { - sent += socket.Send(buffer, offset + sent, - size - sent, SocketFlags.None); - } catch (SocketException ex) { - if (ex.SocketErrorCode == SocketError.WouldBlock || - ex.SocketErrorCode == SocketError.IOPending || - ex.SocketErrorCode == SocketError.NoBufferSpaceAvailable) { - /* Socket buffer is probably full, wait and try again */ - Thread.Sleep(30); - } else { - throw ex; - } - } - } while (sent < size); -} -``` - -### Clojure - -``` clojure -(clojure-version) - -(defn partition-when - [f] - (fn [rf] - (let [a (java.util.ArrayList.) - fval (volatile! false)] - (fn - ([] (rf)) - ([result] - (let [result (if (.isEmpty a) - result - (let [v (vec (.toArray a))] - ;; Clear first - (.clear a) - (unreduced (rf result v))))] - (rf result))) - ([result input] - (if-not (and (f input) @fval) - (do - (vreset! fval true) - (.add a input) - result) - (let [v (vec (.toArray a))] - (.clear a) - (let [ret (rf result v)] - (when-not (reduced? ret) - (.add a input)) - ret)))))))) - - -(into [] (partition-when - #(.startsWith % ">>")) - ["1d" "33" ">> 1" ">> 2" "22" ">> 3"]) -``` - -### Diff - -``` diff -Index: grunt.js -=================================================================== ---- grunt.js (revision 31200) -+++ grunt.js (working copy) -@@ -12,6 +12,7 @@ - - module.exports = function (grunt) { - -+ console.log('hello world'); - // Project configuration. - grunt.initConfig({ - lint: { -@@ -19,10 +20,6 @@ - 'packages/services.web/{!(test)/**/,}*.js', - 'packages/error/**/*.js' - ], -- scripts: [ -- 'grunt.js', -- 'db/**/*.js' -- ], - browser: [ - 'packages/web/server.js', - 'packages/web/server/**/*.js', -``` - -### Docker - -``` docker -FROM ubuntu - -# Install vnc, xvfb in order to create a 'fake' display and firefox -RUN apt-get update && apt-get install -y x11vnc xvfb firefox -RUN mkdir ~/.vnc - -# Setup a password -RUN x11vnc -storepasswd 1234 ~/.vnc/passwd - -# Autostart firefox (might not be the best way, but it does the trick) -RUN bash -c 'echo "firefox" >> /.bashrc' - -EXPOSE 5900 -CMD ["x11vnc", "-forever", "-usepw", "-create"] -``` - -### Elixir - -``` elixir -require Logger - -def accept(port) do - {:ok, socket} = :gen_tcp.listen(port, - [:binary, packet: :line, active: false, reuseaddr: true]) - Logger.info "Accepting connections on port #{port}" - loop_acceptor(socket) -end - -defp loop_acceptor(socket) do - {:ok, client} = :gen_tcp.accept(socket) - serve(client) - loop_acceptor(socket) -end - -defp serve(socket) do - socket - |> read_line() - |> write_line(socket) - - serve(socket) -end - -defp read_line(socket) do - {:ok, data} = :gen_tcp.recv(socket, 0) - data -end - -defp write_line(line, socket) do - :gen_tcp.send(socket, line) -end -``` - -### Erlang - -``` erlang -circular(Defs) -> - [ { { Type, Base }, Fields } || - { { Type, Base }, Fields } <- Defs, Type == msg, circular(Base, Defs) ]. - -circular(Base, Defs) -> - Fields = proplists:get_value({ msg, Base }, Defs), - circular(Defs, Fields, [Base]). - -circular(_Defs, [], _Path) -> - false; -circular(Defs, [Field | Fields], Path) -> - case Field#field.type of - { msg, Type } -> - case lists:member(Type, Path) of - false -> - Children = proplists:get_value({ msg, Type }, Defs), - case circular(Defs, Children, [Type | Path]) of - false -> circular(Defs, Fields, Path); - true -> true - end; - true -> - Type == lists:last(Path) andalso - (length(Path) == 1 orelse not is_tree(Path)) - end; - _ -> - circular(Defs, Fields, Path) - end. -``` - -### F# - -``` fsharp -/// Asynchronously download retangles from the server -/// and decode the JSON format to F# Rectangle record -let [] getRectangles () : Async = async { - let req = XMLHttpRequest() - req.Open("POST", "/get", true) - let! resp = req.AsyncSend() - return JSON.parse(resp) } - -/// Repeatedly update rectangles after 0.5 sec -let [] updateLoop () = async { - while true do - do! Async.Sleep(500) - let! rects = getRectangles() - cleanRectangles() - rects |> Array.iter createRectangle } -``` - -### Go - -``` go -package main - -import "fmt" - -func counter(id int, channel chan int, closer bool) { - for i := 0; i < 10000000; i++ { - fmt.Println("process", id," send", i) - channel <- 1 - } - if closer { close(channel ) } -} - -func main() { - channel := make(chan int) - go counter(1, channel, false) - go counter(2, channel, true) - - x := 0 - - // receiving data from channel - for i := range channel { - fmt.Println("receiving") - x += i - } - - fmt.Println(x) -} -``` - -### HTML - -``` html - - - - - - HTML5 Boilerplate - - - - - - - - - -

Hello world! This is HTML5 Boilerplate.

- - -``` - -### Java - -``` java -import java.util.LinkedList; -import java.lang.reflect.Array; - -public class UnsortedHashSet { - - private static final double LOAD_FACTOR_LIMIT = 0.7; - - private int size; - private LinkedList[] con; - - public UnsortedHashSet() { - con = (LinkedList[])(new LinkedList[10]); - } - - public boolean add(E obj) { - int oldSize = size; - int index = Math.abs(obj.hashCode()) % con.length; - if (con[index] == null) - con[index] = new LinkedList(); - if (!con[index].contains(obj)) { - con[index].add(obj); - size++; - } - if (1.0 * size / con.length > LOAD_FACTOR_LIMIT) - resize(); - return oldSize != size; - } - - private void resize() { - UnsortedHashSet temp = new UnsortedHashSet(); - temp.con = (LinkedList[])(new LinkedList[con.length * 2 + 1]); - for (int i = 0; i < con.length; i++) { - if (con[i] != null) - for (E e : con[i]) - temp.add(e); - } - con = temp.con; - } - - public int size() { - return size; - } -} -``` - -### JavaScript - -``` javascript -var Math = require('lib/math'); - -var _extends = function (target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) { - target[key] = source[key]; - } - } - - return target; -}; - -var e = exports.e = 2.71828182846; -exports['default'] = function (x) { - return Math.exp(x); -}; - -module.exports = _extends(exports['default'], exports); -``` - -### JSON - -``` json -{ - "name": "mkdocs-material", - "version": "0.2.4", - "description": "A Material Design theme for MkDocs", - "homepage": "http://squidfunk.github.io/mkdocs-material/", - "authors": [ - "squidfunk " - ], - "license": "MIT", - "main": "Gulpfile.js", - "scripts": { - "start": "./node_modules/.bin/gulp watch --mkdocs", - "build": "./node_modules/.bin/gulp build --production" - } - ... -} -``` - -### Julia - -``` julia -using MXNet - -mlp = @mx.chain mx.Variable(:data) => - mx.FullyConnected(name=:fc1, num_hidden=128) => - mx.Activation(name=:relu1, act_type=:relu) => - mx.FullyConnected(name=:fc2, num_hidden=64) => - mx.Activation(name=:relu2, act_type=:relu) => - mx.FullyConnected(name=:fc3, num_hidden=10) => - mx.SoftmaxOutput(name=:softmax) - -# data provider -batch_size = 100 -include(Pkg.dir("MXNet", "examples", "mnist", "mnist-data.jl")) -train_provider, eval_provider = get_mnist_providers(batch_size) - -# setup model -model = mx.FeedForward(mlp, context=mx.cpu()) - -# optimization algorithm -optimizer = mx.SGD(lr=0.1, momentum=0.9) - -# fit parameters -mx.fit(model, optimizer, train_provider, n_epoch=20, eval_data=eval_provider) -``` - -### Lua - -``` lua -local ffi = require("ffi") - -ffi.cdef[[ - void Sleep(int ms); - int poll(struct pollfd *fds, unsigned long nfds, int timeout); -]] - -local sleep -if ffi.os == "Windows" then - function sleep(s) - ffi.C.Sleep(s*1000) - end -else - function sleep(s) - ffi.C.poll(nil, 0, s * 1000) - end -end - -for i = 1,160 do - io.write("."); io.flush() - sleep(0.01) -end -io.write("\n") -``` - -### MySQL - -``` mysql -SELECT - Employees.EmployeeID, - Employees.Name, - Employees.Salary, - Manager.Name AS Manager -FROM - Employees -LEFT JOIN - Employees AS Manager -ON - Employees.ManagerID = Manager.EmployeeID -WHERE - Employees.EmployeeID = '087652'; -``` - -### PHP - -``` php -Lucky number: '.$number.'' - ); - } -} -``` - -### Protocol Buffers - -``` proto -syntax = "proto2"; - -package caffe; - -// Specifies the shape (dimensions) of a Blob. -message BlobShape { - repeated int64 dim = 1 [packed = true]; -} - -message BlobProto { - optional BlobShape shape = 7; - repeated float data = 5 [packed = true]; - repeated float diff = 6 [packed = true]; - - // 4D dimensions -- deprecated. Use "shape" instead. - optional int32 num = 1 [default = 0]; - optional int32 channels = 2 [default = 0]; - optional int32 height = 3 [default = 0]; - optional int32 width = 4 [default = 0]; -} -``` - -### Python - -``` python - -""" - A very simple MNIST classifier. - See extensive documentation at - http://tensorflow.org/tutorials/mnist/beginners/index.md -""" -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function - -# Import data -from tensorflow.examples.tutorials.mnist import input_data - -import tensorflow as tf - -flags = tf.app.flags -FLAGS = flags.FLAGS -flags.DEFINE_string('data_dir', '/tmp/data/', 'Directory for storing data') - -mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True) - -sess = tf.InteractiveSession() - -# Create the model -x = tf.placeholder(tf.float32, [None, 784]) -W = tf.Variable(tf.zeros([784, 10])) -b = tf.Variable(tf.zeros([10])) -y = tf.nn.softmax(tf.matmul(x, W) + b) -``` - -### Ruby - -``` ruby -require 'finity/event' -require 'finity/machine' -require 'finity/state' -require 'finity/transition' -require 'finity/version' - -module Finity - class InvalidCallback < StandardError; end - class MissingCallback < StandardError; end - class InvalidState < StandardError; end - - # Class methods to be injected into the including class upon inclusion. - module ClassMethods - - # Instantiate a new state machine for the including class by accepting a - # block with state and event (and subsequent transition) definitions. - def finity options = {}, &block - @finity ||= Machine.new self, options, &block - end - - # Return the names of all registered states. - def states - @finity.states.map { |name, _| name } - end - - # Return the names of all registered events. - def events - @finity.events.map { |name, _| name } - end - end - - # Inject methods into the including class upon inclusion. - def self.included base - base.extend ClassMethods - end -end -``` - -### Scala - -```scala -// Every record of this DataFrame contains the label and -// features represented by a vector. -val df = sqlContext.createDataFrame(data).toDF("label", "features") - -// Set parameters for the algorithm. -// Here, we limit the number of iterations to 10. -val lr = new LogisticRegression().setMaxIter(10) - -// Fit the model to the data. -val model = lr.fit(df) - -// Inspect the model: get the feature weights. -val weights = model.weights - -// Given a dataset, predict each point's label, and show the results. -model.transform(df).show()g -``` - -### XML - -``` xml - - - - - - - Some text content - Some text content with <entities> and - mentioning uint8_t and int32_t - - - - -``` diff --git a/docs/guides/adding-a-git-repository.md b/docs/guides/adding-a-git-repository.md index e69de29bb..3225705ea 100644 --- a/docs/guides/adding-a-git-repository.md +++ b/docs/guides/adding-a-git-repository.md @@ -0,0 +1,34 @@ +--- +template: overrides/main.html +--- + +# Adding a git repository + +- link edit button +- link related source file (via metadata) + +## Configuration + +To include a link to the repository of your project within your documentation, +set the following variables via your project's `mkdocs.yml`: + +``` yaml +repo_name: squidfunk/mkdocs-material +repo_url: https://github.com/squidfunk/mkdocs-material +``` + +The name of the repository will be rendered next to the search bar on big +screens and as part of the main navigation drawer on smaller screen sizes. +Additionally, for GitHub and GitLab, the number of stars and forks is shown. +Note that the repository icon can be explicitly set through `theme.icon.repo`. + +!!! question "Why is there an edit button at the top of every article?" + + If the `repo_url` is set to a GitHub or BitBucket repository, and the + `repo_name` is set to *GitHub* or *BitBucket* (implied by default), an + edit button will appear at the top of every article. This is the automatic + behavior that MkDocs implements. See the [MkDocs documentation][20] on more + guidance regarding the `edit_uri` attribute, which defines whether the edit + button is shown or not. + + [20]: https://www.mkdocs.org/user-guide/configuration/#edit_uri diff --git a/docs/guides/changing-colors.md b/docs/guides/changing-colors.md index a3e695758..a932a27c2 100644 --- a/docs/guides/changing-colors.md +++ b/docs/guides/changing-colors.md @@ -31,23 +31,10 @@ theme: :material-cursor-default-click-outline: click on a tile to change the color scheme: - - - - +
+ + +
- + + {%- set translations = {} -%} {%- for key in [ "clipboard.copy", diff --git a/material/overrides/main.html b/material/overrides/main.html index 4e9fbe620..bdade8095 100644 --- a/material/overrides/main.html +++ b/material/overrides/main.html @@ -22,9 +22,9 @@ + {% endblock %} {% block announce %} - For updates follow @squidfunk on For updates follow @squidfunk on