diff --git a/website/blog/migrations/0016_blogcollectionpage_blogcollectionlistpage.py b/website/blog/migrations/0016_blogcollectionpage_blogcollectionlistpage.py
new file mode 100644
index 0000000..4743444
--- /dev/null
+++ b/website/blog/migrations/0016_blogcollectionpage_blogcollectionlistpage.py
@@ -0,0 +1,1935 @@
+# Generated by Django 4.0.5 on 2022-07-16 14:30
+
+import django.db.models.deletion
+import wagtail.blocks
+import wagtail.embeds.blocks
+import wagtail.fields
+import wagtail.images.blocks
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("images", "0001_initial"),
+ ("wagtailcore", "0069_log_entry_jsonfield"),
+ ("unsplash", "0002_unsplashphoto_created_and_more"),
+ ("blog", "0015_blogpostpage_tags"),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name="BlogCollectionPage",
+ fields=[
+ (
+ "page_ptr",
+ models.OneToOneField(
+ auto_created=True,
+ on_delete=django.db.models.deletion.CASCADE,
+ parent_link=True,
+ primary_key=True,
+ serialize=False,
+ to="wagtailcore.page",
+ ),
+ ),
+ ("subtitle", models.CharField(blank=True, max_length=255)),
+ (
+ "body",
+ wagtail.fields.StreamField(
+ [
+ ("embed", wagtail.embeds.blocks.EmbedBlock()),
+ (
+ "rich_text",
+ wagtail.blocks.RichTextBlock(
+ features=[
+ "h2",
+ "h3",
+ "h4",
+ "h5",
+ "h6",
+ "bold",
+ "italic",
+ "ol",
+ "ul",
+ "link",
+ "document-link",
+ "code",
+ "strikethrough",
+ "snippet-link",
+ "snippet-embed",
+ ]
+ ),
+ ),
+ (
+ "lorem",
+ wagtail.blocks.StructBlock(
+ [
+ (
+ "paragraphs",
+ wagtail.blocks.IntegerBlock(min_value=1),
+ )
+ ]
+ ),
+ ),
+ ("html", wagtail.blocks.RawHTMLBlock()),
+ (
+ "image",
+ wagtail.blocks.StructBlock(
+ [
+ (
+ "image",
+ wagtail.images.blocks.ImageChooserBlock(),
+ ),
+ (
+ "caption",
+ wagtail.blocks.RichTextBlock(
+ features=[
+ "bold",
+ "italic",
+ "link",
+ "document-link",
+ "code",
+ "strikethrough",
+ "snippet-link",
+ ]
+ ),
+ ),
+ ]
+ ),
+ ),
+ (
+ "code",
+ wagtail.blocks.StructBlock(
+ [
+ (
+ "language",
+ wagtail.blocks.ChoiceBlock(
+ choices=[
+ ("ABAP", "ABAP"),
+ ("ABNF", "ABNF"),
+ ("ADL", "ADL"),
+ ("AMDGPU", "AMDGPU"),
+ (
+ "ANSYS parametric design language",
+ "ANSYS parametric design language",
+ ),
+ ("ANTLR", "ANTLR"),
+ (
+ "ANTLR With ActionScript Target",
+ "ANTLR With ActionScript Target",
+ ),
+ (
+ "ANTLR With C# Target",
+ "ANTLR With C# Target",
+ ),
+ (
+ "ANTLR With CPP Target",
+ "ANTLR With CPP Target",
+ ),
+ (
+ "ANTLR With Java Target",
+ "ANTLR With Java Target",
+ ),
+ (
+ "ANTLR With ObjectiveC Target",
+ "ANTLR With ObjectiveC Target",
+ ),
+ (
+ "ANTLR With Perl Target",
+ "ANTLR With Perl Target",
+ ),
+ (
+ "ANTLR With Python Target",
+ "ANTLR With Python Target",
+ ),
+ (
+ "ANTLR With Ruby Target",
+ "ANTLR With Ruby Target",
+ ),
+ ("APL", "APL"),
+ ("ASCII armored", "ASCII armored"),
+ ("ActionScript", "ActionScript"),
+ (
+ "ActionScript 3",
+ "ActionScript 3",
+ ),
+ ("Ada", "Ada"),
+ ("Agda", "Agda"),
+ ("Aheui", "Aheui"),
+ ("Alloy", "Alloy"),
+ ("AmbientTalk", "AmbientTalk"),
+ ("Ampl", "Ampl"),
+ ("Angular2", "Angular2"),
+ ("ApacheConf", "ApacheConf"),
+ ("AppleScript", "AppleScript"),
+ ("Arduino", "Arduino"),
+ ("Arrow", "Arrow"),
+ ("AspectJ", "AspectJ"),
+ ("Asymptote", "Asymptote"),
+ ("Augeas", "Augeas"),
+ ("AutoIt", "AutoIt"),
+ ("Awk", "Awk"),
+ ("BARE", "BARE"),
+ ("BBC Basic", "BBC Basic"),
+ ("BBCode", "BBCode"),
+ ("BC", "BC"),
+ ("BNF", "BNF"),
+ ("BST", "BST"),
+ ("BUGS", "BUGS"),
+ ("Base Makefile", "Base Makefile"),
+ ("Bash", "Bash"),
+ ("Bash Session", "Bash Session"),
+ ("Batchfile", "Batchfile"),
+ ("Bdd", "Bdd"),
+ ("Befunge", "Befunge"),
+ ("Berry", "Berry"),
+ ("BibTeX", "BibTeX"),
+ ("BlitzBasic", "BlitzBasic"),
+ ("BlitzMax", "BlitzMax"),
+ ("Boa", "Boa"),
+ ("Boo", "Boo"),
+ ("Boogie", "Boogie"),
+ ("Brainfuck", "Brainfuck"),
+ ("C", "C"),
+ ("C#", "C#"),
+ ("C++", "C++"),
+ ("CAmkES", "CAmkES"),
+ ("CBM BASIC V2", "CBM BASIC V2"),
+ ("CDDL", "CDDL"),
+ ("CFEngine3", "CFEngine3"),
+ ("CMake", "CMake"),
+ ("COBOL", "COBOL"),
+ ("COBOLFree", "COBOLFree"),
+ ("CPSA", "CPSA"),
+ ("CSS", "CSS"),
+ (
+ "CSS+Django/Jinja",
+ "CSS+Django/Jinja",
+ ),
+ (
+ "CSS+Genshi Text",
+ "CSS+Genshi Text",
+ ),
+ ("CSS+Lasso", "CSS+Lasso"),
+ ("CSS+Mako", "CSS+Mako"),
+ ("CSS+Myghty", "CSS+Myghty"),
+ ("CSS+PHP", "CSS+PHP"),
+ ("CSS+Ruby", "CSS+Ruby"),
+ ("CSS+Smarty", "CSS+Smarty"),
+ ("CSS+UL4", "CSS+UL4"),
+ (
+ "CSS+mozpreproc",
+ "CSS+mozpreproc",
+ ),
+ ("CUDA", "CUDA"),
+ ("Cap'n Proto", "Cap'n Proto"),
+ ("CapDL", "CapDL"),
+ ("Ceylon", "Ceylon"),
+ ("ChaiScript", "ChaiScript"),
+ ("Chapel", "Chapel"),
+ ("Charmci", "Charmci"),
+ ("Cheetah", "Cheetah"),
+ ("Cirru", "Cirru"),
+ ("Clay", "Clay"),
+ ("Clean", "Clean"),
+ ("Clojure", "Clojure"),
+ ("ClojureScript", "ClojureScript"),
+ ("CoffeeScript", "CoffeeScript"),
+ (
+ "Coldfusion CFC",
+ "Coldfusion CFC",
+ ),
+ (
+ "Coldfusion HTML",
+ "Coldfusion HTML",
+ ),
+ ("Common Lisp", "Common Lisp"),
+ (
+ "Component Pascal",
+ "Component Pascal",
+ ),
+ ("Coq", "Coq"),
+ ("Crmsh", "Crmsh"),
+ ("Croc", "Croc"),
+ ("Cryptol", "Cryptol"),
+ ("Crystal", "Crystal"),
+ (
+ "Csound Document",
+ "Csound Document",
+ ),
+ (
+ "Csound Orchestra",
+ "Csound Orchestra",
+ ),
+ ("Csound Score", "Csound Score"),
+ ("Cypher", "Cypher"),
+ ("Cython", "Cython"),
+ ("D", "D"),
+ ("DASM16", "DASM16"),
+ ("DTD", "DTD"),
+ ("Darcs Patch", "Darcs Patch"),
+ ("Dart", "Dart"),
+ (
+ "Debian Control file",
+ "Debian Control file",
+ ),
+ (
+ "Debian Sourcelist",
+ "Debian Sourcelist",
+ ),
+ ("Delphi", "Delphi"),
+ ("Devicetree", "Devicetree"),
+ ("Diff", "Diff"),
+ ("Django/Jinja", "Django/Jinja"),
+ ("Docker", "Docker"),
+ ("Duel", "Duel"),
+ ("Dylan", "Dylan"),
+ ("Dylan session", "Dylan session"),
+ ("DylanLID", "DylanLID"),
+ ("E-mail", "E-mail"),
+ ("EBNF", "EBNF"),
+ ("ECL", "ECL"),
+ ("ERB", "ERB"),
+ ("Earl Grey", "Earl Grey"),
+ ("Easytrieve", "Easytrieve"),
+ ("Eiffel", "Eiffel"),
+ ("Elixir", "Elixir"),
+ (
+ "Elixir iex session",
+ "Elixir iex session",
+ ),
+ ("Elm", "Elm"),
+ ("Elpi", "Elpi"),
+ ("EmacsLisp", "EmacsLisp"),
+ (
+ "Embedded Ragel",
+ "Embedded Ragel",
+ ),
+ ("Erlang", "Erlang"),
+ (
+ "Erlang erl session",
+ "Erlang erl session",
+ ),
+ ("Evoque", "Evoque"),
+ ("Ezhil", "Ezhil"),
+ ("F#", "F#"),
+ ("FStar", "FStar"),
+ ("Factor", "Factor"),
+ ("Fancy", "Fancy"),
+ ("Fantom", "Fantom"),
+ ("Felix", "Felix"),
+ ("Fennel", "Fennel"),
+ ("Fish", "Fish"),
+ ("Flatline", "Flatline"),
+ ("FloScript", "FloScript"),
+ ("Forth", "Forth"),
+ ("Fortran", "Fortran"),
+ ("FortranFixed", "FortranFixed"),
+ ("FoxPro", "FoxPro"),
+ ("Freefem", "Freefem"),
+ ("Futhark", "Futhark"),
+ ("GAP", "GAP"),
+ ("GAS", "GAS"),
+ ("GDScript", "GDScript"),
+ ("GLSL", "GLSL"),
+ ("GSQL", "GSQL"),
+ ("Genshi", "Genshi"),
+ ("Genshi Text", "Genshi Text"),
+ (
+ "Gettext Catalog",
+ "Gettext Catalog",
+ ),
+ ("Gherkin", "Gherkin"),
+ ("Gnuplot", "Gnuplot"),
+ ("Go", "Go"),
+ ("Golo", "Golo"),
+ ("GoodData-CL", "GoodData-CL"),
+ ("Gosu", "Gosu"),
+ ("Gosu Template", "Gosu Template"),
+ ("Graphviz", "Graphviz"),
+ ("Groff", "Groff"),
+ ("Groovy", "Groovy"),
+ ("HLSL", "HLSL"),
+ ("HSAIL", "HSAIL"),
+ ("HTML", "HTML"),
+ (
+ "HTML + Angular2",
+ "HTML + Angular2",
+ ),
+ ("HTML+Cheetah", "HTML+Cheetah"),
+ (
+ "HTML+Django/Jinja",
+ "HTML+Django/Jinja",
+ ),
+ ("HTML+Evoque", "HTML+Evoque"),
+ ("HTML+Genshi", "HTML+Genshi"),
+ (
+ "HTML+Handlebars",
+ "HTML+Handlebars",
+ ),
+ ("HTML+Lasso", "HTML+Lasso"),
+ ("HTML+Mako", "HTML+Mako"),
+ ("HTML+Myghty", "HTML+Myghty"),
+ ("HTML+PHP", "HTML+PHP"),
+ ("HTML+Smarty", "HTML+Smarty"),
+ ("HTML+Twig", "HTML+Twig"),
+ ("HTML+UL4", "HTML+UL4"),
+ ("HTML+Velocity", "HTML+Velocity"),
+ ("HTTP", "HTTP"),
+ ("Haml", "Haml"),
+ ("Handlebars", "Handlebars"),
+ ("Haskell", "Haskell"),
+ ("Haxe", "Haxe"),
+ ("Hexdump", "Hexdump"),
+ ("Hspec", "Hspec"),
+ ("Hxml", "Hxml"),
+ ("Hy", "Hy"),
+ ("Hybris", "Hybris"),
+ ("IDL", "IDL"),
+ ("INI", "INI"),
+ ("IRC logs", "IRC logs"),
+ ("Icon", "Icon"),
+ ("Idris", "Idris"),
+ ("Igor", "Igor"),
+ ("Inform 6", "Inform 6"),
+ (
+ "Inform 6 template",
+ "Inform 6 template",
+ ),
+ ("Inform 7", "Inform 7"),
+ ("Io", "Io"),
+ ("Ioke", "Ioke"),
+ ("Isabelle", "Isabelle"),
+ ("J", "J"),
+ ("JAGS", "JAGS"),
+ ("JCL", "JCL"),
+ ("JSGF", "JSGF"),
+ ("JSLT", "JSLT"),
+ ("JSON", "JSON"),
+ ("JSON-LD", "JSON-LD"),
+ (
+ "JSONBareObject",
+ "JSONBareObject",
+ ),
+ ("Jasmin", "Jasmin"),
+ ("Java", "Java"),
+ (
+ "Java Server Page",
+ "Java Server Page",
+ ),
+ ("JavaScript", "JavaScript"),
+ (
+ "JavaScript+Cheetah",
+ "JavaScript+Cheetah",
+ ),
+ (
+ "JavaScript+Django/Jinja",
+ "JavaScript+Django/Jinja",
+ ),
+ (
+ "JavaScript+Genshi Text",
+ "JavaScript+Genshi Text",
+ ),
+ (
+ "JavaScript+Lasso",
+ "JavaScript+Lasso",
+ ),
+ (
+ "JavaScript+Mako",
+ "JavaScript+Mako",
+ ),
+ (
+ "JavaScript+Myghty",
+ "JavaScript+Myghty",
+ ),
+ (
+ "JavaScript+PHP",
+ "JavaScript+PHP",
+ ),
+ (
+ "JavaScript+Ruby",
+ "JavaScript+Ruby",
+ ),
+ (
+ "JavaScript+Smarty",
+ "JavaScript+Smarty",
+ ),
+ (
+ "Javascript+UL4",
+ "Javascript+UL4",
+ ),
+ (
+ "Javascript+mozpreproc",
+ "Javascript+mozpreproc",
+ ),
+ ("Julia", "Julia"),
+ ("Julia console", "Julia console"),
+ ("Juttle", "Juttle"),
+ ("K", "K"),
+ ("Kal", "Kal"),
+ ("Kconfig", "Kconfig"),
+ ("Kernel log", "Kernel log"),
+ ("Koka", "Koka"),
+ ("Kotlin", "Kotlin"),
+ ("Kuin", "Kuin"),
+ ("LLVM", "LLVM"),
+ ("LLVM-MIR", "LLVM-MIR"),
+ ("LLVM-MIR Body", "LLVM-MIR Body"),
+ ("LSL", "LSL"),
+ ("Lasso", "Lasso"),
+ ("Lean", "Lean"),
+ ("LessCss", "LessCss"),
+ (
+ "Lighttpd configuration file",
+ "Lighttpd configuration file",
+ ),
+ ("LilyPond", "LilyPond"),
+ ("Limbo", "Limbo"),
+ ("Literate Agda", "Literate Agda"),
+ (
+ "Literate Cryptol",
+ "Literate Cryptol",
+ ),
+ (
+ "Literate Haskell",
+ "Literate Haskell",
+ ),
+ (
+ "Literate Idris",
+ "Literate Idris",
+ ),
+ ("LiveScript", "LiveScript"),
+ ("Logos", "Logos"),
+ ("Logtalk", "Logtalk"),
+ ("Lua", "Lua"),
+ ("MAQL", "MAQL"),
+ ("MCFunction", "MCFunction"),
+ ("MIME", "MIME"),
+ ("MOOCode", "MOOCode"),
+ ("MQL", "MQL"),
+ ("MSDOS Session", "MSDOS Session"),
+ ("MXML", "MXML"),
+ ("Macaulay2", "Macaulay2"),
+ ("Makefile", "Makefile"),
+ ("Mako", "Mako"),
+ ("Markdown", "Markdown"),
+ ("Mask", "Mask"),
+ ("Mason", "Mason"),
+ ("Mathematica", "Mathematica"),
+ ("Matlab", "Matlab"),
+ (
+ "Matlab session",
+ "Matlab session",
+ ),
+ ("Maxima", "Maxima"),
+ ("Meson", "Meson"),
+ ("MiniD", "MiniD"),
+ ("MiniScript", "MiniScript"),
+ ("Modelica", "Modelica"),
+ ("Modula-2", "Modula-2"),
+ (
+ "MoinMoin/Trac Wiki markup",
+ "MoinMoin/Trac Wiki markup",
+ ),
+ ("Monkey", "Monkey"),
+ ("Monte", "Monte"),
+ ("MoonScript", "MoonScript"),
+ ("Mosel", "Mosel"),
+ ("Mscgen", "Mscgen"),
+ ("MuPAD", "MuPAD"),
+ ("MySQL", "MySQL"),
+ ("Myghty", "Myghty"),
+ ("NASM", "NASM"),
+ ("NCL", "NCL"),
+ ("NSIS", "NSIS"),
+ ("Nemerle", "Nemerle"),
+ ("NestedText", "NestedText"),
+ ("NewLisp", "NewLisp"),
+ ("Newspeak", "Newspeak"),
+ (
+ "Nginx configuration file",
+ "Nginx configuration file",
+ ),
+ ("Nimrod", "Nimrod"),
+ ("Nit", "Nit"),
+ ("Nix", "Nix"),
+ (
+ "Node.js REPL console session",
+ "Node.js REPL console session",
+ ),
+ ("Notmuch", "Notmuch"),
+ ("NuSMV", "NuSMV"),
+ ("NumPy", "NumPy"),
+ ("OCaml", "OCaml"),
+ ("ODIN", "ODIN"),
+ (
+ "OMG Interface Definition Language",
+ "OMG Interface Definition Language",
+ ),
+ ("Objective-C", "Objective-C"),
+ ("Objective-C++", "Objective-C++"),
+ ("Objective-J", "Objective-J"),
+ ("Octave", "Octave"),
+ ("Ooc", "Ooc"),
+ ("Opa", "Opa"),
+ ("OpenEdge ABL", "OpenEdge ABL"),
+ ("PEG", "PEG"),
+ ("PHP", "PHP"),
+ ("PL/pgSQL", "PL/pgSQL"),
+ ("POVRay", "POVRay"),
+ ("PacmanConf", "PacmanConf"),
+ ("Pan", "Pan"),
+ ("ParaSail", "ParaSail"),
+ ("Pawn", "Pawn"),
+ ("Perl", "Perl"),
+ ("Perl6", "Perl6"),
+ ("Pig", "Pig"),
+ ("Pike", "Pike"),
+ ("PkgConfig", "PkgConfig"),
+ ("Pointless", "Pointless"),
+ ("Pony", "Pony"),
+ ("PostScript", "PostScript"),
+ (
+ "PostgreSQL SQL dialect",
+ "PostgreSQL SQL dialect",
+ ),
+ (
+ "PostgreSQL console (psql)",
+ "PostgreSQL console (psql)",
+ ),
+ ("PowerShell", "PowerShell"),
+ (
+ "PowerShell Session",
+ "PowerShell Session",
+ ),
+ ("Praat", "Praat"),
+ ("Procfile", "Procfile"),
+ ("Prolog", "Prolog"),
+ ("PromQL", "PromQL"),
+ ("Properties", "Properties"),
+ (
+ "Protocol Buffer",
+ "Protocol Buffer",
+ ),
+ (
+ "PsySH console session for PHP",
+ "PsySH console session for PHP",
+ ),
+ ("Pug", "Pug"),
+ ("Puppet", "Puppet"),
+ ("PyPy Log", "PyPy Log"),
+ ("Python", "Python"),
+ ("Python 2.x", "Python 2.x"),
+ (
+ "Python 2.x Traceback",
+ "Python 2.x Traceback",
+ ),
+ (
+ "Python Traceback",
+ "Python Traceback",
+ ),
+ (
+ "Python console session",
+ "Python console session",
+ ),
+ ("Python+UL4", "Python+UL4"),
+ ("Q", "Q"),
+ ("QBasic", "QBasic"),
+ ("QML", "QML"),
+ ("QVTO", "QVTO"),
+ ("Qlik", "Qlik"),
+ ("RConsole", "RConsole"),
+ ("REBOL", "REBOL"),
+ ("RHTML", "RHTML"),
+ ("RPMSpec", "RPMSpec"),
+ ("RQL", "RQL"),
+ ("RSL", "RSL"),
+ ("Racket", "Racket"),
+ ("Ragel", "Ragel"),
+ (
+ "Ragel in C Host",
+ "Ragel in C Host",
+ ),
+ (
+ "Ragel in CPP Host",
+ "Ragel in CPP Host",
+ ),
+ (
+ "Ragel in D Host",
+ "Ragel in D Host",
+ ),
+ (
+ "Ragel in Java Host",
+ "Ragel in Java Host",
+ ),
+ (
+ "Ragel in Objective C Host",
+ "Ragel in Objective C Host",
+ ),
+ (
+ "Ragel in Ruby Host",
+ "Ragel in Ruby Host",
+ ),
+ (
+ "Raw token data",
+ "Raw token data",
+ ),
+ ("Rd", "Rd"),
+ ("ReasonML", "ReasonML"),
+ ("Red", "Red"),
+ ("Redcode", "Redcode"),
+ (
+ "Relax-NG Compact",
+ "Relax-NG Compact",
+ ),
+ (
+ "ResourceBundle",
+ "ResourceBundle",
+ ),
+ ("Rexx", "Rexx"),
+ ("Ride", "Ride"),
+ ("Rita", "Rita"),
+ (
+ "Roboconf Graph",
+ "Roboconf Graph",
+ ),
+ (
+ "Roboconf Instances",
+ "Roboconf Instances",
+ ),
+ (
+ "RobotFramework",
+ "RobotFramework",
+ ),
+ ("Ruby", "Ruby"),
+ (
+ "Ruby irb session",
+ "Ruby irb session",
+ ),
+ ("Rust", "Rust"),
+ ("S", "S"),
+ ("SARL", "SARL"),
+ ("SAS", "SAS"),
+ ("SCSS", "SCSS"),
+ ("SNBT", "SNBT"),
+ ("SPARQL", "SPARQL"),
+ ("SQL", "SQL"),
+ ("SWIG", "SWIG"),
+ ("Sass", "Sass"),
+ ("Savi", "Savi"),
+ ("Scala", "Scala"),
+ (
+ "Scalate Server Page",
+ "Scalate Server Page",
+ ),
+ ("Scaml", "Scaml"),
+ ("Scheme", "Scheme"),
+ ("Scilab", "Scilab"),
+ ("Sed", "Sed"),
+ ("ShExC", "ShExC"),
+ ("Shen", "Shen"),
+ ("Sieve", "Sieve"),
+ ("Silver", "Silver"),
+ ("Singularity", "Singularity"),
+ ("Slash", "Slash"),
+ ("Slim", "Slim"),
+ ("Slurm", "Slurm"),
+ ("Smali", "Smali"),
+ ("Smalltalk", "Smalltalk"),
+ (
+ "SmartGameFormat",
+ "SmartGameFormat",
+ ),
+ ("Smarty", "Smarty"),
+ ("Smithy", "Smithy"),
+ ("Snobol", "Snobol"),
+ ("Snowball", "Snowball"),
+ ("Solidity", "Solidity"),
+ ("Sophia", "Sophia"),
+ ("SourcePawn", "SourcePawn"),
+ ("Spice", "Spice"),
+ ("SquidConf", "SquidConf"),
+ ("Srcinfo", "Srcinfo"),
+ ("Stan", "Stan"),
+ ("Standard ML", "Standard ML"),
+ ("Stata", "Stata"),
+ ("SuperCollider", "SuperCollider"),
+ ("Swift", "Swift"),
+ ("TADS 3", "TADS 3"),
+ ("TAP", "TAP"),
+ ("TASM", "TASM"),
+ ("TOML", "TOML"),
+ ("Tal", "Tal"),
+ ("Tcl", "Tcl"),
+ ("Tcsh", "Tcsh"),
+ ("Tcsh Session", "Tcsh Session"),
+ ("TeX", "TeX"),
+ ("Tea", "Tea"),
+ (
+ "Tera Term macro",
+ "Tera Term macro",
+ ),
+ ("Termcap", "Termcap"),
+ ("Terminfo", "Terminfo"),
+ ("Terraform", "Terraform"),
+ ("Text only", "Text only"),
+ ("Text output", "Text output"),
+ ("ThingsDB", "ThingsDB"),
+ ("Thrift", "Thrift"),
+ ("Todotxt", "Todotxt"),
+ ("TrafficScript", "TrafficScript"),
+ ("Transact-SQL", "Transact-SQL"),
+ ("Treetop", "Treetop"),
+ ("Turtle", "Turtle"),
+ ("Twig", "Twig"),
+ ("TypeScript", "TypeScript"),
+ ("TypoScript", "TypoScript"),
+ (
+ "TypoScriptCssData",
+ "TypoScriptCssData",
+ ),
+ (
+ "TypoScriptHtmlData",
+ "TypoScriptHtmlData",
+ ),
+ (
+ "Typographic Number Theory",
+ "Typographic Number Theory",
+ ),
+ ("UL4", "UL4"),
+ ("USD", "USD"),
+ ("Unicon", "Unicon"),
+ (
+ "Unix/Linux config files",
+ "Unix/Linux config files",
+ ),
+ ("UrbiScript", "UrbiScript"),
+ ("VB.net", "VB.net"),
+ ("VBScript", "VBScript"),
+ ("VCL", "VCL"),
+ ("VCLSnippets", "VCLSnippets"),
+ ("VCTreeStatus", "VCTreeStatus"),
+ ("VGL", "VGL"),
+ ("Vala", "Vala"),
+ ("Velocity", "Velocity"),
+ ("VimL", "VimL"),
+ ("WDiff", "WDiff"),
+ ("Web IDL", "Web IDL"),
+ ("WebAssembly", "WebAssembly"),
+ ("Whiley", "Whiley"),
+ ("X10", "X10"),
+ ("XML", "XML"),
+ ("XML+Cheetah", "XML+Cheetah"),
+ (
+ "XML+Django/Jinja",
+ "XML+Django/Jinja",
+ ),
+ ("XML+Evoque", "XML+Evoque"),
+ ("XML+Lasso", "XML+Lasso"),
+ ("XML+Mako", "XML+Mako"),
+ ("XML+Myghty", "XML+Myghty"),
+ ("XML+PHP", "XML+PHP"),
+ ("XML+Ruby", "XML+Ruby"),
+ ("XML+Smarty", "XML+Smarty"),
+ ("XML+UL4", "XML+UL4"),
+ ("XML+Velocity", "XML+Velocity"),
+ ("XQuery", "XQuery"),
+ ("XSLT", "XSLT"),
+ (
+ "XUL+mozpreproc",
+ "XUL+mozpreproc",
+ ),
+ ("Xorg", "Xorg"),
+ ("Xtend", "Xtend"),
+ ("YAML", "YAML"),
+ ("YAML+Jinja", "YAML+Jinja"),
+ ("YANG", "YANG"),
+ ("Zeek", "Zeek"),
+ ("Zephir", "Zephir"),
+ ("Zig", "Zig"),
+ ("aspx-cs", "aspx-cs"),
+ ("aspx-vb", "aspx-vb"),
+ ("autohotkey", "autohotkey"),
+ ("c-objdump", "c-objdump"),
+ ("cADL", "cADL"),
+ (
+ "ca65 assembler",
+ "ca65 assembler",
+ ),
+ ("cfstatement", "cfstatement"),
+ ("cplint", "cplint"),
+ ("cpp-objdump", "cpp-objdump"),
+ ("d-objdump", "d-objdump"),
+ ("dg", "dg"),
+ ("eC", "eC"),
+ ("execline", "execline"),
+ ("g-code", "g-code"),
+ ("liquid", "liquid"),
+ (
+ "mozhashpreproc",
+ "mozhashpreproc",
+ ),
+ (
+ "mozpercentpreproc",
+ "mozpercentpreproc",
+ ),
+ ("nesC", "nesC"),
+ ("objdump", "objdump"),
+ ("objdump-nasm", "objdump-nasm"),
+ (
+ "reStructuredText",
+ "reStructuredText",
+ ),
+ ("reg", "reg"),
+ ("scdoc", "scdoc"),
+ ("sqlite3con", "sqlite3con"),
+ ("systemverilog", "systemverilog"),
+ ("teal", "teal"),
+ ("tiddler", "tiddler"),
+ ("ucode", "ucode"),
+ ("verilog", "verilog"),
+ ("vhdl", "vhdl"),
+ ("xtlang", "xtlang"),
+ ]
+ ),
+ ),
+ ("source", wagtail.blocks.TextBlock()),
+ ]
+ ),
+ ),
+ (
+ "tangent",
+ wagtail.blocks.StructBlock(
+ [
+ (
+ "name",
+ wagtail.blocks.CharBlock(max_length=64),
+ ),
+ (
+ "content",
+ wagtail.blocks.RichTextBlock(
+ features=[
+ "bold",
+ "italic",
+ "ol",
+ "ul",
+ "link",
+ "document-link",
+ "code",
+ "strikethrough",
+ "snippet-link",
+ ]
+ ),
+ ),
+ ]
+ ),
+ ),
+ (
+ "mermaid",
+ wagtail.blocks.StructBlock(
+ [
+ ("source", wagtail.blocks.TextBlock()),
+ (
+ "caption",
+ wagtail.blocks.RichTextBlock(
+ features=[
+ "bold",
+ "italic",
+ "link",
+ "document-link",
+ "code",
+ "strikethrough",
+ "snippet-link",
+ ]
+ ),
+ ),
+ ]
+ ),
+ ),
+ ],
+ blank=True,
+ use_json_field=True,
+ ),
+ ),
+ (
+ "hero_image",
+ models.ForeignKey(
+ blank=True,
+ null=True,
+ on_delete=django.db.models.deletion.SET_NULL,
+ to="images.customimage",
+ ),
+ ),
+ (
+ "hero_unsplash_photo",
+ models.ForeignKey(
+ blank=True,
+ null=True,
+ on_delete=django.db.models.deletion.SET_NULL,
+ to="unsplash.unsplashphoto",
+ ),
+ ),
+ ],
+ options={
+ "abstract": False,
+ },
+ bases=("wagtailcore.page", models.Model),
+ ),
+ migrations.CreateModel(
+ name="BlogCollectionListPage",
+ fields=[
+ (
+ "page_ptr",
+ models.OneToOneField(
+ auto_created=True,
+ on_delete=django.db.models.deletion.CASCADE,
+ parent_link=True,
+ primary_key=True,
+ serialize=False,
+ to="wagtailcore.page",
+ ),
+ ),
+ ("subtitle", models.CharField(blank=True, max_length=255)),
+ (
+ "body",
+ wagtail.fields.StreamField(
+ [
+ ("embed", wagtail.embeds.blocks.EmbedBlock()),
+ (
+ "rich_text",
+ wagtail.blocks.RichTextBlock(
+ features=[
+ "h2",
+ "h3",
+ "h4",
+ "h5",
+ "h6",
+ "bold",
+ "italic",
+ "ol",
+ "ul",
+ "link",
+ "document-link",
+ "code",
+ "strikethrough",
+ "snippet-link",
+ "snippet-embed",
+ ]
+ ),
+ ),
+ (
+ "lorem",
+ wagtail.blocks.StructBlock(
+ [
+ (
+ "paragraphs",
+ wagtail.blocks.IntegerBlock(min_value=1),
+ )
+ ]
+ ),
+ ),
+ ("html", wagtail.blocks.RawHTMLBlock()),
+ (
+ "image",
+ wagtail.blocks.StructBlock(
+ [
+ (
+ "image",
+ wagtail.images.blocks.ImageChooserBlock(),
+ ),
+ (
+ "caption",
+ wagtail.blocks.RichTextBlock(
+ features=[
+ "bold",
+ "italic",
+ "link",
+ "document-link",
+ "code",
+ "strikethrough",
+ "snippet-link",
+ ]
+ ),
+ ),
+ ]
+ ),
+ ),
+ (
+ "code",
+ wagtail.blocks.StructBlock(
+ [
+ (
+ "language",
+ wagtail.blocks.ChoiceBlock(
+ choices=[
+ ("ABAP", "ABAP"),
+ ("ABNF", "ABNF"),
+ ("ADL", "ADL"),
+ ("AMDGPU", "AMDGPU"),
+ (
+ "ANSYS parametric design language",
+ "ANSYS parametric design language",
+ ),
+ ("ANTLR", "ANTLR"),
+ (
+ "ANTLR With ActionScript Target",
+ "ANTLR With ActionScript Target",
+ ),
+ (
+ "ANTLR With C# Target",
+ "ANTLR With C# Target",
+ ),
+ (
+ "ANTLR With CPP Target",
+ "ANTLR With CPP Target",
+ ),
+ (
+ "ANTLR With Java Target",
+ "ANTLR With Java Target",
+ ),
+ (
+ "ANTLR With ObjectiveC Target",
+ "ANTLR With ObjectiveC Target",
+ ),
+ (
+ "ANTLR With Perl Target",
+ "ANTLR With Perl Target",
+ ),
+ (
+ "ANTLR With Python Target",
+ "ANTLR With Python Target",
+ ),
+ (
+ "ANTLR With Ruby Target",
+ "ANTLR With Ruby Target",
+ ),
+ ("APL", "APL"),
+ ("ASCII armored", "ASCII armored"),
+ ("ActionScript", "ActionScript"),
+ (
+ "ActionScript 3",
+ "ActionScript 3",
+ ),
+ ("Ada", "Ada"),
+ ("Agda", "Agda"),
+ ("Aheui", "Aheui"),
+ ("Alloy", "Alloy"),
+ ("AmbientTalk", "AmbientTalk"),
+ ("Ampl", "Ampl"),
+ ("Angular2", "Angular2"),
+ ("ApacheConf", "ApacheConf"),
+ ("AppleScript", "AppleScript"),
+ ("Arduino", "Arduino"),
+ ("Arrow", "Arrow"),
+ ("AspectJ", "AspectJ"),
+ ("Asymptote", "Asymptote"),
+ ("Augeas", "Augeas"),
+ ("AutoIt", "AutoIt"),
+ ("Awk", "Awk"),
+ ("BARE", "BARE"),
+ ("BBC Basic", "BBC Basic"),
+ ("BBCode", "BBCode"),
+ ("BC", "BC"),
+ ("BNF", "BNF"),
+ ("BST", "BST"),
+ ("BUGS", "BUGS"),
+ ("Base Makefile", "Base Makefile"),
+ ("Bash", "Bash"),
+ ("Bash Session", "Bash Session"),
+ ("Batchfile", "Batchfile"),
+ ("Bdd", "Bdd"),
+ ("Befunge", "Befunge"),
+ ("Berry", "Berry"),
+ ("BibTeX", "BibTeX"),
+ ("BlitzBasic", "BlitzBasic"),
+ ("BlitzMax", "BlitzMax"),
+ ("Boa", "Boa"),
+ ("Boo", "Boo"),
+ ("Boogie", "Boogie"),
+ ("Brainfuck", "Brainfuck"),
+ ("C", "C"),
+ ("C#", "C#"),
+ ("C++", "C++"),
+ ("CAmkES", "CAmkES"),
+ ("CBM BASIC V2", "CBM BASIC V2"),
+ ("CDDL", "CDDL"),
+ ("CFEngine3", "CFEngine3"),
+ ("CMake", "CMake"),
+ ("COBOL", "COBOL"),
+ ("COBOLFree", "COBOLFree"),
+ ("CPSA", "CPSA"),
+ ("CSS", "CSS"),
+ (
+ "CSS+Django/Jinja",
+ "CSS+Django/Jinja",
+ ),
+ (
+ "CSS+Genshi Text",
+ "CSS+Genshi Text",
+ ),
+ ("CSS+Lasso", "CSS+Lasso"),
+ ("CSS+Mako", "CSS+Mako"),
+ ("CSS+Myghty", "CSS+Myghty"),
+ ("CSS+PHP", "CSS+PHP"),
+ ("CSS+Ruby", "CSS+Ruby"),
+ ("CSS+Smarty", "CSS+Smarty"),
+ ("CSS+UL4", "CSS+UL4"),
+ (
+ "CSS+mozpreproc",
+ "CSS+mozpreproc",
+ ),
+ ("CUDA", "CUDA"),
+ ("Cap'n Proto", "Cap'n Proto"),
+ ("CapDL", "CapDL"),
+ ("Ceylon", "Ceylon"),
+ ("ChaiScript", "ChaiScript"),
+ ("Chapel", "Chapel"),
+ ("Charmci", "Charmci"),
+ ("Cheetah", "Cheetah"),
+ ("Cirru", "Cirru"),
+ ("Clay", "Clay"),
+ ("Clean", "Clean"),
+ ("Clojure", "Clojure"),
+ ("ClojureScript", "ClojureScript"),
+ ("CoffeeScript", "CoffeeScript"),
+ (
+ "Coldfusion CFC",
+ "Coldfusion CFC",
+ ),
+ (
+ "Coldfusion HTML",
+ "Coldfusion HTML",
+ ),
+ ("Common Lisp", "Common Lisp"),
+ (
+ "Component Pascal",
+ "Component Pascal",
+ ),
+ ("Coq", "Coq"),
+ ("Crmsh", "Crmsh"),
+ ("Croc", "Croc"),
+ ("Cryptol", "Cryptol"),
+ ("Crystal", "Crystal"),
+ (
+ "Csound Document",
+ "Csound Document",
+ ),
+ (
+ "Csound Orchestra",
+ "Csound Orchestra",
+ ),
+ ("Csound Score", "Csound Score"),
+ ("Cypher", "Cypher"),
+ ("Cython", "Cython"),
+ ("D", "D"),
+ ("DASM16", "DASM16"),
+ ("DTD", "DTD"),
+ ("Darcs Patch", "Darcs Patch"),
+ ("Dart", "Dart"),
+ (
+ "Debian Control file",
+ "Debian Control file",
+ ),
+ (
+ "Debian Sourcelist",
+ "Debian Sourcelist",
+ ),
+ ("Delphi", "Delphi"),
+ ("Devicetree", "Devicetree"),
+ ("Diff", "Diff"),
+ ("Django/Jinja", "Django/Jinja"),
+ ("Docker", "Docker"),
+ ("Duel", "Duel"),
+ ("Dylan", "Dylan"),
+ ("Dylan session", "Dylan session"),
+ ("DylanLID", "DylanLID"),
+ ("E-mail", "E-mail"),
+ ("EBNF", "EBNF"),
+ ("ECL", "ECL"),
+ ("ERB", "ERB"),
+ ("Earl Grey", "Earl Grey"),
+ ("Easytrieve", "Easytrieve"),
+ ("Eiffel", "Eiffel"),
+ ("Elixir", "Elixir"),
+ (
+ "Elixir iex session",
+ "Elixir iex session",
+ ),
+ ("Elm", "Elm"),
+ ("Elpi", "Elpi"),
+ ("EmacsLisp", "EmacsLisp"),
+ (
+ "Embedded Ragel",
+ "Embedded Ragel",
+ ),
+ ("Erlang", "Erlang"),
+ (
+ "Erlang erl session",
+ "Erlang erl session",
+ ),
+ ("Evoque", "Evoque"),
+ ("Ezhil", "Ezhil"),
+ ("F#", "F#"),
+ ("FStar", "FStar"),
+ ("Factor", "Factor"),
+ ("Fancy", "Fancy"),
+ ("Fantom", "Fantom"),
+ ("Felix", "Felix"),
+ ("Fennel", "Fennel"),
+ ("Fish", "Fish"),
+ ("Flatline", "Flatline"),
+ ("FloScript", "FloScript"),
+ ("Forth", "Forth"),
+ ("Fortran", "Fortran"),
+ ("FortranFixed", "FortranFixed"),
+ ("FoxPro", "FoxPro"),
+ ("Freefem", "Freefem"),
+ ("Futhark", "Futhark"),
+ ("GAP", "GAP"),
+ ("GAS", "GAS"),
+ ("GDScript", "GDScript"),
+ ("GLSL", "GLSL"),
+ ("GSQL", "GSQL"),
+ ("Genshi", "Genshi"),
+ ("Genshi Text", "Genshi Text"),
+ (
+ "Gettext Catalog",
+ "Gettext Catalog",
+ ),
+ ("Gherkin", "Gherkin"),
+ ("Gnuplot", "Gnuplot"),
+ ("Go", "Go"),
+ ("Golo", "Golo"),
+ ("GoodData-CL", "GoodData-CL"),
+ ("Gosu", "Gosu"),
+ ("Gosu Template", "Gosu Template"),
+ ("Graphviz", "Graphviz"),
+ ("Groff", "Groff"),
+ ("Groovy", "Groovy"),
+ ("HLSL", "HLSL"),
+ ("HSAIL", "HSAIL"),
+ ("HTML", "HTML"),
+ (
+ "HTML + Angular2",
+ "HTML + Angular2",
+ ),
+ ("HTML+Cheetah", "HTML+Cheetah"),
+ (
+ "HTML+Django/Jinja",
+ "HTML+Django/Jinja",
+ ),
+ ("HTML+Evoque", "HTML+Evoque"),
+ ("HTML+Genshi", "HTML+Genshi"),
+ (
+ "HTML+Handlebars",
+ "HTML+Handlebars",
+ ),
+ ("HTML+Lasso", "HTML+Lasso"),
+ ("HTML+Mako", "HTML+Mako"),
+ ("HTML+Myghty", "HTML+Myghty"),
+ ("HTML+PHP", "HTML+PHP"),
+ ("HTML+Smarty", "HTML+Smarty"),
+ ("HTML+Twig", "HTML+Twig"),
+ ("HTML+UL4", "HTML+UL4"),
+ ("HTML+Velocity", "HTML+Velocity"),
+ ("HTTP", "HTTP"),
+ ("Haml", "Haml"),
+ ("Handlebars", "Handlebars"),
+ ("Haskell", "Haskell"),
+ ("Haxe", "Haxe"),
+ ("Hexdump", "Hexdump"),
+ ("Hspec", "Hspec"),
+ ("Hxml", "Hxml"),
+ ("Hy", "Hy"),
+ ("Hybris", "Hybris"),
+ ("IDL", "IDL"),
+ ("INI", "INI"),
+ ("IRC logs", "IRC logs"),
+ ("Icon", "Icon"),
+ ("Idris", "Idris"),
+ ("Igor", "Igor"),
+ ("Inform 6", "Inform 6"),
+ (
+ "Inform 6 template",
+ "Inform 6 template",
+ ),
+ ("Inform 7", "Inform 7"),
+ ("Io", "Io"),
+ ("Ioke", "Ioke"),
+ ("Isabelle", "Isabelle"),
+ ("J", "J"),
+ ("JAGS", "JAGS"),
+ ("JCL", "JCL"),
+ ("JSGF", "JSGF"),
+ ("JSLT", "JSLT"),
+ ("JSON", "JSON"),
+ ("JSON-LD", "JSON-LD"),
+ (
+ "JSONBareObject",
+ "JSONBareObject",
+ ),
+ ("Jasmin", "Jasmin"),
+ ("Java", "Java"),
+ (
+ "Java Server Page",
+ "Java Server Page",
+ ),
+ ("JavaScript", "JavaScript"),
+ (
+ "JavaScript+Cheetah",
+ "JavaScript+Cheetah",
+ ),
+ (
+ "JavaScript+Django/Jinja",
+ "JavaScript+Django/Jinja",
+ ),
+ (
+ "JavaScript+Genshi Text",
+ "JavaScript+Genshi Text",
+ ),
+ (
+ "JavaScript+Lasso",
+ "JavaScript+Lasso",
+ ),
+ (
+ "JavaScript+Mako",
+ "JavaScript+Mako",
+ ),
+ (
+ "JavaScript+Myghty",
+ "JavaScript+Myghty",
+ ),
+ (
+ "JavaScript+PHP",
+ "JavaScript+PHP",
+ ),
+ (
+ "JavaScript+Ruby",
+ "JavaScript+Ruby",
+ ),
+ (
+ "JavaScript+Smarty",
+ "JavaScript+Smarty",
+ ),
+ (
+ "Javascript+UL4",
+ "Javascript+UL4",
+ ),
+ (
+ "Javascript+mozpreproc",
+ "Javascript+mozpreproc",
+ ),
+ ("Julia", "Julia"),
+ ("Julia console", "Julia console"),
+ ("Juttle", "Juttle"),
+ ("K", "K"),
+ ("Kal", "Kal"),
+ ("Kconfig", "Kconfig"),
+ ("Kernel log", "Kernel log"),
+ ("Koka", "Koka"),
+ ("Kotlin", "Kotlin"),
+ ("Kuin", "Kuin"),
+ ("LLVM", "LLVM"),
+ ("LLVM-MIR", "LLVM-MIR"),
+ ("LLVM-MIR Body", "LLVM-MIR Body"),
+ ("LSL", "LSL"),
+ ("Lasso", "Lasso"),
+ ("Lean", "Lean"),
+ ("LessCss", "LessCss"),
+ (
+ "Lighttpd configuration file",
+ "Lighttpd configuration file",
+ ),
+ ("LilyPond", "LilyPond"),
+ ("Limbo", "Limbo"),
+ ("Literate Agda", "Literate Agda"),
+ (
+ "Literate Cryptol",
+ "Literate Cryptol",
+ ),
+ (
+ "Literate Haskell",
+ "Literate Haskell",
+ ),
+ (
+ "Literate Idris",
+ "Literate Idris",
+ ),
+ ("LiveScript", "LiveScript"),
+ ("Logos", "Logos"),
+ ("Logtalk", "Logtalk"),
+ ("Lua", "Lua"),
+ ("MAQL", "MAQL"),
+ ("MCFunction", "MCFunction"),
+ ("MIME", "MIME"),
+ ("MOOCode", "MOOCode"),
+ ("MQL", "MQL"),
+ ("MSDOS Session", "MSDOS Session"),
+ ("MXML", "MXML"),
+ ("Macaulay2", "Macaulay2"),
+ ("Makefile", "Makefile"),
+ ("Mako", "Mako"),
+ ("Markdown", "Markdown"),
+ ("Mask", "Mask"),
+ ("Mason", "Mason"),
+ ("Mathematica", "Mathematica"),
+ ("Matlab", "Matlab"),
+ (
+ "Matlab session",
+ "Matlab session",
+ ),
+ ("Maxima", "Maxima"),
+ ("Meson", "Meson"),
+ ("MiniD", "MiniD"),
+ ("MiniScript", "MiniScript"),
+ ("Modelica", "Modelica"),
+ ("Modula-2", "Modula-2"),
+ (
+ "MoinMoin/Trac Wiki markup",
+ "MoinMoin/Trac Wiki markup",
+ ),
+ ("Monkey", "Monkey"),
+ ("Monte", "Monte"),
+ ("MoonScript", "MoonScript"),
+ ("Mosel", "Mosel"),
+ ("Mscgen", "Mscgen"),
+ ("MuPAD", "MuPAD"),
+ ("MySQL", "MySQL"),
+ ("Myghty", "Myghty"),
+ ("NASM", "NASM"),
+ ("NCL", "NCL"),
+ ("NSIS", "NSIS"),
+ ("Nemerle", "Nemerle"),
+ ("NestedText", "NestedText"),
+ ("NewLisp", "NewLisp"),
+ ("Newspeak", "Newspeak"),
+ (
+ "Nginx configuration file",
+ "Nginx configuration file",
+ ),
+ ("Nimrod", "Nimrod"),
+ ("Nit", "Nit"),
+ ("Nix", "Nix"),
+ (
+ "Node.js REPL console session",
+ "Node.js REPL console session",
+ ),
+ ("Notmuch", "Notmuch"),
+ ("NuSMV", "NuSMV"),
+ ("NumPy", "NumPy"),
+ ("OCaml", "OCaml"),
+ ("ODIN", "ODIN"),
+ (
+ "OMG Interface Definition Language",
+ "OMG Interface Definition Language",
+ ),
+ ("Objective-C", "Objective-C"),
+ ("Objective-C++", "Objective-C++"),
+ ("Objective-J", "Objective-J"),
+ ("Octave", "Octave"),
+ ("Ooc", "Ooc"),
+ ("Opa", "Opa"),
+ ("OpenEdge ABL", "OpenEdge ABL"),
+ ("PEG", "PEG"),
+ ("PHP", "PHP"),
+ ("PL/pgSQL", "PL/pgSQL"),
+ ("POVRay", "POVRay"),
+ ("PacmanConf", "PacmanConf"),
+ ("Pan", "Pan"),
+ ("ParaSail", "ParaSail"),
+ ("Pawn", "Pawn"),
+ ("Perl", "Perl"),
+ ("Perl6", "Perl6"),
+ ("Pig", "Pig"),
+ ("Pike", "Pike"),
+ ("PkgConfig", "PkgConfig"),
+ ("Pointless", "Pointless"),
+ ("Pony", "Pony"),
+ ("PostScript", "PostScript"),
+ (
+ "PostgreSQL SQL dialect",
+ "PostgreSQL SQL dialect",
+ ),
+ (
+ "PostgreSQL console (psql)",
+ "PostgreSQL console (psql)",
+ ),
+ ("PowerShell", "PowerShell"),
+ (
+ "PowerShell Session",
+ "PowerShell Session",
+ ),
+ ("Praat", "Praat"),
+ ("Procfile", "Procfile"),
+ ("Prolog", "Prolog"),
+ ("PromQL", "PromQL"),
+ ("Properties", "Properties"),
+ (
+ "Protocol Buffer",
+ "Protocol Buffer",
+ ),
+ (
+ "PsySH console session for PHP",
+ "PsySH console session for PHP",
+ ),
+ ("Pug", "Pug"),
+ ("Puppet", "Puppet"),
+ ("PyPy Log", "PyPy Log"),
+ ("Python", "Python"),
+ ("Python 2.x", "Python 2.x"),
+ (
+ "Python 2.x Traceback",
+ "Python 2.x Traceback",
+ ),
+ (
+ "Python Traceback",
+ "Python Traceback",
+ ),
+ (
+ "Python console session",
+ "Python console session",
+ ),
+ ("Python+UL4", "Python+UL4"),
+ ("Q", "Q"),
+ ("QBasic", "QBasic"),
+ ("QML", "QML"),
+ ("QVTO", "QVTO"),
+ ("Qlik", "Qlik"),
+ ("RConsole", "RConsole"),
+ ("REBOL", "REBOL"),
+ ("RHTML", "RHTML"),
+ ("RPMSpec", "RPMSpec"),
+ ("RQL", "RQL"),
+ ("RSL", "RSL"),
+ ("Racket", "Racket"),
+ ("Ragel", "Ragel"),
+ (
+ "Ragel in C Host",
+ "Ragel in C Host",
+ ),
+ (
+ "Ragel in CPP Host",
+ "Ragel in CPP Host",
+ ),
+ (
+ "Ragel in D Host",
+ "Ragel in D Host",
+ ),
+ (
+ "Ragel in Java Host",
+ "Ragel in Java Host",
+ ),
+ (
+ "Ragel in Objective C Host",
+ "Ragel in Objective C Host",
+ ),
+ (
+ "Ragel in Ruby Host",
+ "Ragel in Ruby Host",
+ ),
+ (
+ "Raw token data",
+ "Raw token data",
+ ),
+ ("Rd", "Rd"),
+ ("ReasonML", "ReasonML"),
+ ("Red", "Red"),
+ ("Redcode", "Redcode"),
+ (
+ "Relax-NG Compact",
+ "Relax-NG Compact",
+ ),
+ (
+ "ResourceBundle",
+ "ResourceBundle",
+ ),
+ ("Rexx", "Rexx"),
+ ("Ride", "Ride"),
+ ("Rita", "Rita"),
+ (
+ "Roboconf Graph",
+ "Roboconf Graph",
+ ),
+ (
+ "Roboconf Instances",
+ "Roboconf Instances",
+ ),
+ (
+ "RobotFramework",
+ "RobotFramework",
+ ),
+ ("Ruby", "Ruby"),
+ (
+ "Ruby irb session",
+ "Ruby irb session",
+ ),
+ ("Rust", "Rust"),
+ ("S", "S"),
+ ("SARL", "SARL"),
+ ("SAS", "SAS"),
+ ("SCSS", "SCSS"),
+ ("SNBT", "SNBT"),
+ ("SPARQL", "SPARQL"),
+ ("SQL", "SQL"),
+ ("SWIG", "SWIG"),
+ ("Sass", "Sass"),
+ ("Savi", "Savi"),
+ ("Scala", "Scala"),
+ (
+ "Scalate Server Page",
+ "Scalate Server Page",
+ ),
+ ("Scaml", "Scaml"),
+ ("Scheme", "Scheme"),
+ ("Scilab", "Scilab"),
+ ("Sed", "Sed"),
+ ("ShExC", "ShExC"),
+ ("Shen", "Shen"),
+ ("Sieve", "Sieve"),
+ ("Silver", "Silver"),
+ ("Singularity", "Singularity"),
+ ("Slash", "Slash"),
+ ("Slim", "Slim"),
+ ("Slurm", "Slurm"),
+ ("Smali", "Smali"),
+ ("Smalltalk", "Smalltalk"),
+ (
+ "SmartGameFormat",
+ "SmartGameFormat",
+ ),
+ ("Smarty", "Smarty"),
+ ("Smithy", "Smithy"),
+ ("Snobol", "Snobol"),
+ ("Snowball", "Snowball"),
+ ("Solidity", "Solidity"),
+ ("Sophia", "Sophia"),
+ ("SourcePawn", "SourcePawn"),
+ ("Spice", "Spice"),
+ ("SquidConf", "SquidConf"),
+ ("Srcinfo", "Srcinfo"),
+ ("Stan", "Stan"),
+ ("Standard ML", "Standard ML"),
+ ("Stata", "Stata"),
+ ("SuperCollider", "SuperCollider"),
+ ("Swift", "Swift"),
+ ("TADS 3", "TADS 3"),
+ ("TAP", "TAP"),
+ ("TASM", "TASM"),
+ ("TOML", "TOML"),
+ ("Tal", "Tal"),
+ ("Tcl", "Tcl"),
+ ("Tcsh", "Tcsh"),
+ ("Tcsh Session", "Tcsh Session"),
+ ("TeX", "TeX"),
+ ("Tea", "Tea"),
+ (
+ "Tera Term macro",
+ "Tera Term macro",
+ ),
+ ("Termcap", "Termcap"),
+ ("Terminfo", "Terminfo"),
+ ("Terraform", "Terraform"),
+ ("Text only", "Text only"),
+ ("Text output", "Text output"),
+ ("ThingsDB", "ThingsDB"),
+ ("Thrift", "Thrift"),
+ ("Todotxt", "Todotxt"),
+ ("TrafficScript", "TrafficScript"),
+ ("Transact-SQL", "Transact-SQL"),
+ ("Treetop", "Treetop"),
+ ("Turtle", "Turtle"),
+ ("Twig", "Twig"),
+ ("TypeScript", "TypeScript"),
+ ("TypoScript", "TypoScript"),
+ (
+ "TypoScriptCssData",
+ "TypoScriptCssData",
+ ),
+ (
+ "TypoScriptHtmlData",
+ "TypoScriptHtmlData",
+ ),
+ (
+ "Typographic Number Theory",
+ "Typographic Number Theory",
+ ),
+ ("UL4", "UL4"),
+ ("USD", "USD"),
+ ("Unicon", "Unicon"),
+ (
+ "Unix/Linux config files",
+ "Unix/Linux config files",
+ ),
+ ("UrbiScript", "UrbiScript"),
+ ("VB.net", "VB.net"),
+ ("VBScript", "VBScript"),
+ ("VCL", "VCL"),
+ ("VCLSnippets", "VCLSnippets"),
+ ("VCTreeStatus", "VCTreeStatus"),
+ ("VGL", "VGL"),
+ ("Vala", "Vala"),
+ ("Velocity", "Velocity"),
+ ("VimL", "VimL"),
+ ("WDiff", "WDiff"),
+ ("Web IDL", "Web IDL"),
+ ("WebAssembly", "WebAssembly"),
+ ("Whiley", "Whiley"),
+ ("X10", "X10"),
+ ("XML", "XML"),
+ ("XML+Cheetah", "XML+Cheetah"),
+ (
+ "XML+Django/Jinja",
+ "XML+Django/Jinja",
+ ),
+ ("XML+Evoque", "XML+Evoque"),
+ ("XML+Lasso", "XML+Lasso"),
+ ("XML+Mako", "XML+Mako"),
+ ("XML+Myghty", "XML+Myghty"),
+ ("XML+PHP", "XML+PHP"),
+ ("XML+Ruby", "XML+Ruby"),
+ ("XML+Smarty", "XML+Smarty"),
+ ("XML+UL4", "XML+UL4"),
+ ("XML+Velocity", "XML+Velocity"),
+ ("XQuery", "XQuery"),
+ ("XSLT", "XSLT"),
+ (
+ "XUL+mozpreproc",
+ "XUL+mozpreproc",
+ ),
+ ("Xorg", "Xorg"),
+ ("Xtend", "Xtend"),
+ ("YAML", "YAML"),
+ ("YAML+Jinja", "YAML+Jinja"),
+ ("YANG", "YANG"),
+ ("Zeek", "Zeek"),
+ ("Zephir", "Zephir"),
+ ("Zig", "Zig"),
+ ("aspx-cs", "aspx-cs"),
+ ("aspx-vb", "aspx-vb"),
+ ("autohotkey", "autohotkey"),
+ ("c-objdump", "c-objdump"),
+ ("cADL", "cADL"),
+ (
+ "ca65 assembler",
+ "ca65 assembler",
+ ),
+ ("cfstatement", "cfstatement"),
+ ("cplint", "cplint"),
+ ("cpp-objdump", "cpp-objdump"),
+ ("d-objdump", "d-objdump"),
+ ("dg", "dg"),
+ ("eC", "eC"),
+ ("execline", "execline"),
+ ("g-code", "g-code"),
+ ("liquid", "liquid"),
+ (
+ "mozhashpreproc",
+ "mozhashpreproc",
+ ),
+ (
+ "mozpercentpreproc",
+ "mozpercentpreproc",
+ ),
+ ("nesC", "nesC"),
+ ("objdump", "objdump"),
+ ("objdump-nasm", "objdump-nasm"),
+ (
+ "reStructuredText",
+ "reStructuredText",
+ ),
+ ("reg", "reg"),
+ ("scdoc", "scdoc"),
+ ("sqlite3con", "sqlite3con"),
+ ("systemverilog", "systemverilog"),
+ ("teal", "teal"),
+ ("tiddler", "tiddler"),
+ ("ucode", "ucode"),
+ ("verilog", "verilog"),
+ ("vhdl", "vhdl"),
+ ("xtlang", "xtlang"),
+ ]
+ ),
+ ),
+ ("source", wagtail.blocks.TextBlock()),
+ ]
+ ),
+ ),
+ (
+ "tangent",
+ wagtail.blocks.StructBlock(
+ [
+ (
+ "name",
+ wagtail.blocks.CharBlock(max_length=64),
+ ),
+ (
+ "content",
+ wagtail.blocks.RichTextBlock(
+ features=[
+ "bold",
+ "italic",
+ "ol",
+ "ul",
+ "link",
+ "document-link",
+ "code",
+ "strikethrough",
+ "snippet-link",
+ ]
+ ),
+ ),
+ ]
+ ),
+ ),
+ (
+ "mermaid",
+ wagtail.blocks.StructBlock(
+ [
+ ("source", wagtail.blocks.TextBlock()),
+ (
+ "caption",
+ wagtail.blocks.RichTextBlock(
+ features=[
+ "bold",
+ "italic",
+ "link",
+ "document-link",
+ "code",
+ "strikethrough",
+ "snippet-link",
+ ]
+ ),
+ ),
+ ]
+ ),
+ ),
+ ],
+ blank=True,
+ use_json_field=True,
+ ),
+ ),
+ (
+ "hero_image",
+ models.ForeignKey(
+ blank=True,
+ null=True,
+ on_delete=django.db.models.deletion.SET_NULL,
+ to="images.customimage",
+ ),
+ ),
+ (
+ "hero_unsplash_photo",
+ models.ForeignKey(
+ blank=True,
+ null=True,
+ on_delete=django.db.models.deletion.SET_NULL,
+ to="unsplash.unsplashphoto",
+ ),
+ ),
+ ],
+ options={
+ "abstract": False,
+ },
+ bases=("wagtailcore.page", models.Model),
+ ),
+ ]
diff --git a/website/blog/models.py b/website/blog/models.py
index a6ce184..9c518d5 100644
--- a/website/blog/models.py
+++ b/website/blog/models.py
@@ -15,7 +15,12 @@ from website.common.utils import TocEntry
class BlogListPage(BaseContentMixin, BasePage): # type: ignore[misc]
max_count = 1
- subpage_types = ["blog.BlogPostPage", "blog.BlogPostTagListPage"]
+ subpage_types = [
+ "blog.BlogPostPage",
+ "blog.BlogPostTagListPage",
+ "blog.BlogCollectionListPage",
+ "blog.BlogCollectionPage",
+ ]
content_panels = BasePage.content_panels + BaseContentMixin.content_panels
@cached_property
@@ -39,7 +44,9 @@ class BlogListPage(BaseContentMixin, BasePage): # type: ignore[misc]
return [TocEntry(post_month, post_month, 0, []) for post_month in post_months]
def get_blog_posts(self) -> PageQuerySet:
- return BlogPostPage.objects.child_of(self).live() # type:ignore[attr-defined]
+ return BlogPostPage.objects.descendant_of( # type:ignore[attr-defined]
+ self
+ ).live()
def get_context(self, request: HttpRequest) -> dict:
context = super().get_context(request)
@@ -55,7 +62,7 @@ class BlogListPage(BaseContentMixin, BasePage): # type: ignore[misc]
class BlogPostPage(BaseContentMixin, BasePage): # type: ignore[misc]
subpage_types: list[Any] = []
- parent_page_types = [BlogListPage]
+ parent_page_types = [BlogListPage, "blog.BlogCollectionPage"]
tags = ParentalManyToManyField("blog.BlogPostTagPage", blank=True)
date = models.DateField(default=timezone.now)
@@ -109,3 +116,53 @@ class BlogPostTagPage(BaseContentMixin, BasePage): # type: ignore[misc]
context = super().get_context(request)
context["pages"] = self.get_blog_posts()
return context
+
+
+class BlogCollectionListPage(BaseContentMixin, BasePage): # type: ignore[misc]
+ subpage_types: list[Any] = []
+ parent_page_types = [BlogListPage]
+ max_count = 1
+
+ content_panels = BasePage.content_panels + BaseContentMixin.content_panels
+
+ @cached_property
+ def table_of_contents(self) -> list[TocEntry]:
+ return [
+ TocEntry(page.title, page.slug, 0, []) for page in self.get_collections()
+ ]
+
+ def get_collections(self) -> PageQuerySet:
+ blog_list_page = (
+ BlogListPage.objects.all().live().get() # type:ignore[attr-defined]
+ )
+ return BlogCollectionPage.objects.child_of( # type:ignore[attr-defined]
+ blog_list_page
+ ).live()
+
+ def get_context(self, request: HttpRequest) -> dict:
+ context = super().get_context(request)
+ context["collections"] = self.get_collections()
+ return context
+
+
+class BlogCollectionPage(BaseContentMixin, BasePage): # type: ignore[misc]
+ parent_page_types = [BlogListPage]
+ subpage_types = [BlogPostPage]
+
+ content_panels = BasePage.content_panels + BaseContentMixin.content_panels
+
+ @cached_property
+ def table_of_contents(self) -> list[TocEntry]:
+ return [
+ TocEntry(page.title, page.slug, 0, []) for page in self.get_blog_posts()
+ ]
+
+ def get_blog_posts(self) -> PageQuerySet:
+ return BlogPostPage.objects.child_of( # type:ignore[attr-defined]
+ self
+ ).order_by("-date")
+
+ def get_context(self, request: HttpRequest) -> dict:
+ context = super().get_context(request)
+ context["pages"] = self.get_blog_posts()
+ return context
diff --git a/website/blog/templates/blog/blog_collection_list_page.html b/website/blog/templates/blog/blog_collection_list_page.html
new file mode 100644
index 0000000..cb82a20
--- /dev/null
+++ b/website/blog/templates/blog/blog_collection_list_page.html
@@ -0,0 +1,19 @@
+{% extends "wagtail_base.html" %}
+
+{% block content %}
+
+{% include "common/hero.html" %}
+
+{% if page.body_html %}
+
+ {{ page.body_html|safe }}
+
+{% endif %}
+
+
+ {% for collection in collections %}
+ {% include "common/listing-item.html" with page=collection %}
+ {% endfor %}
+
+
+{% endblock content %}
diff --git a/website/blog/templates/blog/blog_collection_page.html b/website/blog/templates/blog/blog_collection_page.html
new file mode 100644
index 0000000..cdf2916
--- /dev/null
+++ b/website/blog/templates/blog/blog_collection_page.html
@@ -0,0 +1,19 @@
+{% extends "wagtail_base.html" %}
+
+{% block content %}
+
+{% include "common/hero.html" %}
+
+{% if page.body_html %}
+
+ {{ page.body_html|safe }}
+
+{% endif %}
+
+
+ {% for page in pages %}
+ {% include "common/listing-item.html" %}
+ {% endfor %}
+
+
+{% endblock content %}