Initial commit
This commit is contained in:
commit
73beb6d0aa
|
@ -0,0 +1,9 @@
|
|||
/.site
|
||||
/.store
|
||||
/.stack-work
|
||||
/.vscode
|
||||
|
||||
/fonts
|
||||
/css/fonts
|
||||
|
||||
/.mailmap
|
|
@ -0,0 +1,31 @@
|
|||
$black: #282c34;
|
||||
$white: #abb2bf;
|
||||
$light_red: #e06c75;
|
||||
$dark_red: #be5046;
|
||||
$green: #98c379;
|
||||
$light_yellow: #e5c07b;
|
||||
$dark_yellow: #d19a66;
|
||||
$blue: #61afef;
|
||||
$magenta: #c678dd;
|
||||
$cyan: #56b6c2;
|
||||
$gutter_grey: #4b5263;
|
||||
$comment_grey: #5c6370;
|
||||
|
||||
$orange: #ffac5f;
|
||||
$blonde: #f5ddbc;
|
||||
$light-purple: #f2f1f8;
|
||||
$purple: #7060eb;
|
||||
$yugo: #ea8472;
|
||||
|
||||
$code-background: $black;
|
||||
$code-language-background: lighten($black, 5%);
|
||||
|
||||
$code-language-color: $white;
|
||||
|
||||
$code-fg: $white;
|
||||
$code-kw: $light_red;
|
||||
$code-dt: $dark_yellow;
|
||||
$code-ot: $code-fg;
|
||||
$code-co: $comment_grey;
|
||||
|
||||
// comment
|
|
@ -0,0 +1,208 @@
|
|||
$purple: #424969;
|
||||
$orange: #ffac5f;
|
||||
$blonde: #f5ddbc;
|
||||
$light-purple: #faf0fa;
|
||||
|
||||
$card-bg: #dde;
|
||||
|
||||
$header: $orange;
|
||||
$header-height: 50px;
|
||||
|
||||
$max-width: 80ch;
|
||||
|
||||
$pfp-size: 64px;
|
||||
|
||||
html, body {
|
||||
min-height: 100%;
|
||||
height: 100%;
|
||||
margin: 0;
|
||||
|
||||
background-color: white;
|
||||
|
||||
font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;
|
||||
}
|
||||
|
||||
body {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
counter-reset: theorem figure;
|
||||
}
|
||||
|
||||
div#header {
|
||||
background-color: $header;
|
||||
height: $header-height;
|
||||
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: stretch;
|
||||
justify-content: space-between;
|
||||
|
||||
flex-wrap: nowrap;
|
||||
overflow-x: auto;
|
||||
|
||||
div#logo {
|
||||
margin: auto;
|
||||
line-height: $header-height;
|
||||
|
||||
padding-left: .5em;
|
||||
padding-right: .5em;
|
||||
font-size: 18pt;
|
||||
|
||||
a {
|
||||
color: black;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
transition: background-color .2s ease-in-out;
|
||||
}
|
||||
|
||||
div#logo:hover {
|
||||
background-color: darken($header, 10%);
|
||||
}
|
||||
}
|
||||
|
||||
.column {
|
||||
list-style: none;
|
||||
display: flex;
|
||||
flex-flow: column nowrap;
|
||||
}
|
||||
|
||||
.columns {
|
||||
display: flex;
|
||||
flex-flow: row nowrap;
|
||||
> * {
|
||||
width: 50%;
|
||||
padding: 0px;
|
||||
}
|
||||
}
|
||||
|
||||
div#content {
|
||||
max-width: $max-width;
|
||||
margin: 0px auto 0px auto;
|
||||
flex: 1 0 auto;
|
||||
|
||||
font-size: 14pt;
|
||||
line-height: 1.6;
|
||||
|
||||
p {
|
||||
text-align: justify;
|
||||
letter-spacing: 1.75;
|
||||
|
||||
code {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
span.qed {
|
||||
float: right;
|
||||
}
|
||||
|
||||
span.theorem ::after {
|
||||
counter-increment: theorem;
|
||||
content: " " counter(theorem);
|
||||
}
|
||||
|
||||
span.theorem, span.paragraph-marker {
|
||||
font-style: italic;
|
||||
}
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-variant: small-caps;
|
||||
max-width: 120ch;
|
||||
}
|
||||
|
||||
* {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.person {
|
||||
margin: 5px 5px;
|
||||
padding: 0.5em;
|
||||
|
||||
background-color: $card-bg;
|
||||
border: 1px solid darken($card-bg, 10%);
|
||||
border-radius: 5px;
|
||||
|
||||
.header {
|
||||
display: flex;
|
||||
|
||||
img.pfp {
|
||||
width: $pfp-size;
|
||||
height: $pfp-size;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
div.default-pfp {
|
||||
background-color: black;
|
||||
width: $pfp-size;
|
||||
height: $pfp-size;
|
||||
border-radius: 3px;
|
||||
img {
|
||||
filter: invert(1);
|
||||
}
|
||||
}
|
||||
|
||||
line-height: $pfp-size;
|
||||
|
||||
.name {
|
||||
padding-left: 10px;
|
||||
font-size: 18pt;
|
||||
}
|
||||
|
||||
.pronouns {
|
||||
font-size: 10pt;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
details[open].person {
|
||||
summary::before {
|
||||
transform: rotate(90deg);
|
||||
}
|
||||
|
||||
.guts {
|
||||
height: unset;
|
||||
}
|
||||
|
||||
summary ~ * {
|
||||
animation: sweep .5s ease-in-out;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes sweep {
|
||||
0% {
|
||||
font-size: 0pt;
|
||||
}
|
||||
100% {
|
||||
font-size: unset;
|
||||
}
|
||||
}
|
||||
|
||||
details.person {
|
||||
> summary::before {
|
||||
content: '▸';
|
||||
margin-right: 1em;
|
||||
|
||||
transition: transform 0.5s;
|
||||
}
|
||||
}
|
||||
|
||||
.footnote-back {
|
||||
margin-left: 0.5em;
|
||||
}
|
||||
|
||||
@media only screen and (max-width: $max-width) {
|
||||
div#content {
|
||||
margin-left: 1em;
|
||||
margin-right: 1em;
|
||||
}
|
||||
|
||||
.columns {
|
||||
flex-flow: column nowrap;
|
||||
> * {
|
||||
width: unset;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
name: offtopia-org
|
||||
version: 0.1.0.0
|
||||
build-type: Simple
|
||||
cabal-version: >= 1.10
|
||||
|
||||
executable site
|
||||
main-is: site.hs
|
||||
build-depends: base
|
||||
, hakyll
|
||||
, pandoc
|
||||
, skylighting
|
||||
, process
|
||||
, containers
|
||||
, directory
|
||||
, pandoc-types
|
||||
, bytestring
|
||||
, uri-encode
|
||||
, deepseq
|
||||
, text
|
||||
, hsass
|
||||
, aeson
|
||||
, hakyll-sass
|
||||
, unordered-containers
|
||||
ghc-options: -threaded
|
||||
default-language: Haskell2010
|
||||
|
||||
ghc-options: -optl-fuse-ld=lld
|
|
@ -0,0 +1,36 @@
|
|||
---
|
||||
title: offtopia.org
|
||||
---
|
||||
|
||||
We do open source. Sometimes. I need this text to be at least 95 characters long so that the webpage flows right, it's really quite annoying.
|
||||
|
||||
<h1>What we do</h1>
|
||||
|
||||
<ul class="column">
|
||||
$for(projects)$
|
||||
<li>
|
||||
$body$
|
||||
</li>
|
||||
$endfor$
|
||||
</ul>
|
||||
|
||||
|
||||
<h1>Who we are</h1>
|
||||
|
||||
<div class="columns">
|
||||
<ul class="column">
|
||||
$for(people-1)$
|
||||
<li>
|
||||
$body$
|
||||
</li>
|
||||
$endfor$
|
||||
</ul>
|
||||
|
||||
<ul class="column">
|
||||
$for(people-2)$
|
||||
<li>
|
||||
$body$
|
||||
</li>
|
||||
$endfor$
|
||||
</ul>
|
||||
</div>
|
|
@ -0,0 +1,16 @@
|
|||
---
|
||||
name: Abbie
|
||||
|
||||
link: https://abby.how
|
||||
pfp: https://plt.abby.how/means/c3Qs.png
|
||||
|
||||
pronouns: she/her
|
||||
|
||||
projects:
|
||||
- name: Amulet
|
||||
url: https://amulet.works
|
||||
desc: |
|
||||
Amulet is a functional programming language in the ML tradition.
|
||||
---
|
||||
|
||||
Hi! I'm a type-theorist-in-training from the south of Brazil. I also made this website, which is why it looks _exactly_ like my blog: Powered by the same stuff, too!
|
|
@ -0,0 +1,9 @@
|
|||
---
|
||||
name: ahti.space
|
||||
link: https://ahti.space
|
||||
|
||||
participants:
|
||||
- a
|
||||
- b
|
||||
- c
|
||||
---
|
|
@ -0,0 +1,190 @@
|
|||
{-# LANGUAGE BangPatterns #-}
|
||||
{-# LANGUAGE MultiWayIf #-}
|
||||
{-# LANGUAGE OverloadedStrings #-}
|
||||
|
||||
import Control.DeepSeq (rnf)
|
||||
import Control.Concurrent
|
||||
import Control.Exception
|
||||
import Control.Monad
|
||||
|
||||
import qualified Data.ByteString.Lazy.Char8 as BS
|
||||
import Data.ByteString.Lazy.Char8 (pack, unpack)
|
||||
import qualified Data.Text.Encoding as T
|
||||
import qualified Data.HashMap.Strict as HMap
|
||||
import qualified Data.Map.Strict as Map
|
||||
import qualified Data.Text as T
|
||||
import Data.Functor
|
||||
import Data.Monoid
|
||||
import Data.Aeson
|
||||
import Data.Maybe
|
||||
import Data.List
|
||||
import Data.Char
|
||||
|
||||
import Debug.Trace
|
||||
|
||||
import Hakyll.Core.Compiler.Internal
|
||||
import Hakyll.Core.Compiler
|
||||
import Hakyll.Web.Sass
|
||||
import Hakyll
|
||||
|
||||
import qualified Network.URI.Encode as URI (encode)
|
||||
|
||||
import qualified Skylighting as Sky
|
||||
|
||||
import System.Environment
|
||||
import System.Process
|
||||
import System.Exit
|
||||
import System.IO
|
||||
|
||||
import Text.Pandoc.Walk (query, walkM)
|
||||
import Text.Pandoc.Highlighting
|
||||
import Text.Pandoc.Definition
|
||||
import Text.Pandoc.Options
|
||||
import Text.Sass.Functions
|
||||
|
||||
readerOpts :: ReaderOptions
|
||||
readerOpts = def { readerExtensions = pandocExtensions
|
||||
, readerIndentedCodeClasses = ["amulet"] }
|
||||
|
||||
writerOptions :: Compiler WriterOptions
|
||||
writerOptions = do
|
||||
syntaxMap <- loadAllSnapshots "syntax/*.xml" "syntax"
|
||||
<&> foldr (Sky.addSyntaxDefinition . itemBody) Sky.defaultSyntaxMap
|
||||
|
||||
pure $ defaultHakyllWriterOptions
|
||||
{ writerExtensions = extensionsFromList
|
||||
[ Ext_tex_math_dollars
|
||||
, Ext_tex_math_double_backslash
|
||||
, Ext_latex_macros
|
||||
] <> writerExtensions defaultHakyllWriterOptions
|
||||
, writerSyntaxMap = syntaxMap
|
||||
, writerHighlightStyle = Just kate
|
||||
}
|
||||
|
||||
rssfeed :: FeedConfiguration
|
||||
rssfeed
|
||||
= FeedConfiguration { feedTitle = "Abigail's Blag: Latest articles"
|
||||
, feedDescription = ""
|
||||
, feedAuthorName = "Abigail Magalhães"
|
||||
, feedAuthorEmail = "magalhaes.alcantara@pucpr.edu.br"
|
||||
, feedRoot = "https://abby.how"
|
||||
}
|
||||
|
||||
conf :: Configuration
|
||||
conf = def { destinationDirectory = ".site"
|
||||
, storeDirectory = ".store"
|
||||
, tmpDirectory = ".store/tmp"
|
||||
, deployCommand = "./sync" }
|
||||
|
||||
main :: IO ()
|
||||
main = hakyllWith conf $ do
|
||||
let compiler = do
|
||||
wops <- writerOptions
|
||||
pandocCompilerWithTransformM readerOpts wops pure
|
||||
|
||||
match "static/*" $ do
|
||||
route idRoute
|
||||
compile copyFileCompiler
|
||||
|
||||
match "css/*.scss" $ do
|
||||
route $ setExtension "css"
|
||||
compile $ sassCompilerWith def { sassOutputStyle = SassStyleCompressed
|
||||
, sassImporters = Nothing
|
||||
}
|
||||
|
||||
match "pages/**/*" $ do
|
||||
route $ setExtension "html"
|
||||
|
||||
compile $ do
|
||||
id <- getUnderlying
|
||||
meta <- getMetadata id
|
||||
let category = takeWhile (/= '/') $ tail $ dropWhile (/= '/') (toFilePath id)
|
||||
compiler
|
||||
>>= loadAndApplyTemplate (fromFilePath ("templates/" ++ category ++ ".html")) (metaToContext meta)
|
||||
>>= saveSnapshot "content"
|
||||
|
||||
match "pages/*.html" $ do
|
||||
route $ gsubRoute "pages/" (const "")
|
||||
compile $ do
|
||||
ppl <- loadAll "pages/people/*"
|
||||
let (ppl_a, ppl_b) = explode ppl
|
||||
|
||||
projects <- loadAll "pages/projects/*"
|
||||
|
||||
let indexCtx =
|
||||
listField "people-1" postCtx (return ppl_a) <>
|
||||
listField "people-2" postCtx (return ppl_b) <>
|
||||
listField "projects" postCtx (return projects) <>
|
||||
constField "title" "Home" <>
|
||||
defaultContext
|
||||
getResourceBody
|
||||
>>= applyAsTemplate indexCtx
|
||||
>>= loadAndApplyTemplate "templates/default.html" indexCtx
|
||||
>>= relativizeUrls
|
||||
|
||||
match "pages/*.md" $ do
|
||||
route $ gsubRoute "pages/" (const "") <> setExtension "html"
|
||||
compile $ compiler
|
||||
>>= loadAndApplyTemplate "templates/default.html" defaultContext
|
||||
>>= relativizeUrls
|
||||
|
||||
match "templates/*" $ compile templateBodyCompiler
|
||||
|
||||
postCtx :: Context String
|
||||
postCtx = dateField "date" "%B %e, %Y"
|
||||
<> defaultContext
|
||||
|
||||
pathFromTitle :: Metadata -> Routes
|
||||
pathFromTitle meta =
|
||||
let
|
||||
declaredCategory =
|
||||
case lookupString "category" meta of
|
||||
Just s -> ((s ++ "/") ++)
|
||||
Nothing -> ("posts/" <>)
|
||||
|
||||
!titleString =
|
||||
case lookupString "title" meta of
|
||||
Just s -> s
|
||||
Nothing -> error "post has no title?"
|
||||
|
||||
title = filter (/= "") . map (filter isAlphaNum . map toLower) . words $ titleString
|
||||
|
||||
(category, title') =
|
||||
if | "or" `elem` title -> (declaredCategory, takeWhile (/= "or") title)
|
||||
| ["a", "quickie"] `isPrefixOf` title -> (("quick/" ++), drop 2 title)
|
||||
| otherwise -> (declaredCategory, title)
|
||||
in
|
||||
case lookupString "path" meta of
|
||||
Just p -> constRoute (category (p <> ".html"))
|
||||
Nothing -> constRoute (category (intercalate "-" title' <> ".html"))
|
||||
|
||||
foldMapM :: (Monad w, Monoid m, Foldable f) => (a -> w m) -> f a -> w m
|
||||
foldMapM k = foldr (\x y -> do { m <- k x; (m <>) <$> y }) (pure mempty)
|
||||
|
||||
explode :: [a] -> ([a], [a])
|
||||
explode = go True where
|
||||
go True (x:xs) =
|
||||
let (as, bs) = go False xs
|
||||
in (x:as, bs)
|
||||
go False (x:xs) =
|
||||
let (as, bs) = go True xs
|
||||
in (as, x:bs)
|
||||
go _ [] = ([], [])
|
||||
|
||||
metaToContext :: Object -> Context String
|
||||
metaToContext obj = HMap.foldrWithKey go mempty obj <> defaultContext where
|
||||
go :: T.Text -> Value -> Context String -> Context String
|
||||
go key (String x) ctx = constField (T.unpack key) (T.unpack x) <> ctx
|
||||
go key (Array xs) ctx = listField (T.unpack key) (Context jsonContext) (traverse makeItem (foldr (:) [] xs))
|
||||
|
||||
jsonContext key idk item = do
|
||||
let x = itemBody item
|
||||
objToField key x
|
||||
|
||||
objToField key x =
|
||||
case x of
|
||||
String x -> pure $ StringField (T.unpack x)
|
||||
Object m -> objToField (tail (dropWhile (/= '.') key)) (fromJust (HMap.lookup (T.pack (takeWhile (/= '.') key)) m))
|
||||
Array xs -> do
|
||||
is <- traverse makeItem (foldr (:) [] xs)
|
||||
pure $ ListField (Context jsonContext) is
|
|
@ -0,0 +1,6 @@
|
|||
resolver: lts-16.20
|
||||
|
||||
extra-deps:
|
||||
- hakyll-sass-0.2.4@sha256:4d2fbd8b63f5ef15483fc6dda09e10eefd63b4f873ad38dec2a3607eb504a8ba,939
|
||||
- hsass-0.8.0@sha256:05fb3d435dbdf9f66a98db4e1ee57a313170a677e52ab3a5a05ced1fc42b0834,2899
|
||||
- hlibsass-0.1.10.1@sha256:08db56c633e9a83a642d8ea57dffa93112b092d05bf8f3b07491cfee9ee0dfa5,2565
|
|
@ -0,0 +1,33 @@
|
|||
# This file was autogenerated by Stack.
|
||||
# You should not edit this file by hand.
|
||||
# For more information, please see the documentation at:
|
||||
# https://docs.haskellstack.org/en/stable/lock_files
|
||||
|
||||
packages:
|
||||
- completed:
|
||||
hackage: hakyll-sass-0.2.4@sha256:4d2fbd8b63f5ef15483fc6dda09e10eefd63b4f873ad38dec2a3607eb504a8ba,939
|
||||
pantry-tree:
|
||||
size: 217
|
||||
sha256: c03e74e71d010f009b8d972efc31fbd6dd25183e6d9afbec55f4b7f0d4a74b47
|
||||
original:
|
||||
hackage: hakyll-sass-0.2.4@sha256:4d2fbd8b63f5ef15483fc6dda09e10eefd63b4f873ad38dec2a3607eb504a8ba,939
|
||||
- completed:
|
||||
hackage: hsass-0.8.0@sha256:05fb3d435dbdf9f66a98db4e1ee57a313170a677e52ab3a5a05ced1fc42b0834,2899
|
||||
pantry-tree:
|
||||
size: 1448
|
||||
sha256: b25aeb947cb4e0b550f8a6f226d06503ef0edcb54712ad9cdd4fb2b05bf16c7c
|
||||
original:
|
||||
hackage: hsass-0.8.0@sha256:05fb3d435dbdf9f66a98db4e1ee57a313170a677e52ab3a5a05ced1fc42b0834,2899
|
||||
- completed:
|
||||
hackage: hlibsass-0.1.10.1@sha256:08db56c633e9a83a642d8ea57dffa93112b092d05bf8f3b07491cfee9ee0dfa5,2565
|
||||
pantry-tree:
|
||||
size: 11229
|
||||
sha256: 39b62f1f3f30c5a9e12f9c6a040d6863edb5ce81951452e649152a18145ee1bc
|
||||
original:
|
||||
hackage: hlibsass-0.1.10.1@sha256:08db56c633e9a83a642d8ea57dffa93112b092d05bf8f3b07491cfee9ee0dfa5,2565
|
||||
snapshots:
|
||||
- completed:
|
||||
size: 532177
|
||||
url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/16/20.yaml
|
||||
sha256: 0e14ba5603f01e8496e8984fd84b545a012ca723f51a098c6c9d3694e404dc6d
|
||||
original: lts-16.20
|
Binary file not shown.
After Width: | Height: | Size: 2.2 KiB |
|
@ -0,0 +1,3 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
rsync .site/ "${SYNC_SERVER}:/var/www/offtopia.abby.how/" -vuar0
|
|
@ -0,0 +1,46 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
|
||||
<title>$title$</title>
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="/css/default.css" />
|
||||
|
||||
<!-- <link rel="apple-touch-icon" sizes="180x180" href="/static/icon/apple-touch-icon.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/static/icon/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/static/icon/favicon-16x16.png"> -->
|
||||
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:title" content="offtopia.org">
|
||||
<meta name="title" content="offtopia.org">
|
||||
|
||||
<noscript>
|
||||
<style> .script { display: none } </style>
|
||||
</noscript>
|
||||
|
||||
$if(fastbuild)$
|
||||
<style>
|
||||
.math {
|
||||
color: red;
|
||||
}
|
||||
</style>
|
||||
$endif$
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<header>
|
||||
<div id="header">
|
||||
<div id="logo">
|
||||
<a href="/">offtopia.org</a>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<div id="content">
|
||||
<h1></h1>
|
||||
$body$
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,52 @@
|
|||
<details
|
||||
class="person"
|
||||
$if(background)$
|
||||
style="background-color: $background$;"
|
||||
$endif$
|
||||
>
|
||||
<summary class="header">
|
||||
$if(pfp)$
|
||||
<img class="pfp" alt="$name$'s profile picture" src="$pfp$" />
|
||||
$else$
|
||||
<div class="pfp default-pfp">
|
||||
<img alt="$name$ does not have a profile picture" src="/static/default-pfp.png" />
|
||||
</div>
|
||||
$endif$
|
||||
|
||||
<div class="info">
|
||||
<span class="name">
|
||||
$if(link)$
|
||||
<a href="$link$">$name$</a>
|
||||
$else$
|
||||
$name$
|
||||
$endif$
|
||||
</span>
|
||||
<span class="pronouns">
|
||||
$if(pronouns)$
|
||||
$pronouns$
|
||||
$else$
|
||||
?/?
|
||||
$endif$
|
||||
</span>
|
||||
</div>
|
||||
</summary>
|
||||
<div class="guts">
|
||||
$body$
|
||||
|
||||
$if(projects)$
|
||||
<h3>$name$'s projects</h3>
|
||||
<ul>
|
||||
$for(projects)$
|
||||
<li>
|
||||
<details class="project">
|
||||
<summary>
|
||||
<a href="$url$">$name$</a> <i>click to read more</i>
|
||||
</summary>
|
||||
$desc$
|
||||
</details>
|
||||
</li>
|
||||
$endfor$
|
||||
</ul>
|
||||
$endif$
|
||||
</div>
|
||||
</details>
|
|
@ -0,0 +1,18 @@
|
|||
<h2>
|
||||
$if(link)$
|
||||
<a href="$link$">$name$</a>
|
||||
$else$
|
||||
$name$
|
||||
$endif$
|
||||
</h2>
|
||||
|
||||
$if(participants)$
|
||||
<span>
|
||||
People involved:
|
||||
$for(participants)$
|
||||
<span class="author">$name$</span>$sep$,
|
||||
$endfor$
|
||||
</span>
|
||||
$endif$
|
||||
|
||||
$body$
|
Loading…
Reference in New Issue