diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml index 1c7be02..0066c4e 100644 --- a/.github/workflows/gh-pages.yml +++ b/.github/workflows/gh-pages.yml @@ -63,8 +63,6 @@ jobs: HUGO_ENV: production run: | hugo --gc --minify --baseURL "${{ steps.pages.outputs.base_url }}/" - hugo -s subsite/docs --baseURL "${{ steps.pages.outputs.base_url }}/docs/" - mv subsite/docs/public public/docs npx -y pagefind --site public - name: Upload artifact diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f387436..225967e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -47,8 +47,6 @@ jobs: HUGO_ENV: testing run: | hugo --gc --minify --baseURL "${{ steps.pages.outputs.base_url }}/" - hugo -s subsite/docs --baseURL "${{ steps.pages.outputs.base_url }}/docs/" - mv subsite/docs/public public/docs npx -y pagefind --site public - name: Link Checker diff --git a/README.md b/README.md index 7f3eeac..00701b0 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# CRS Project Website Repository +# OWASP ModSecurity Project Website Repository This repository contains the website for the OWASP Modsecurity Project. diff --git a/config/production/hugo.yaml b/config/production/hugo.yaml index 484bee7..e6ed6d5 100644 --- a/config/production/hugo.yaml +++ b/config/production/hugo.yaml @@ -1,6 +1,6 @@ ######################## production configuration #################### # The base URL of your site (required). This will be prepended to all relative URLs. -baseURL: "https://modsecurity.org/" +baseURL: "https://www.modsecurity.org/" googleAnalytics: enableRobotsTXT: true build: diff --git a/content/pages/privacy-policy.md b/content/pages/privacy-policy.md index 6c42265..9acfe3c 100644 --- a/content/pages/privacy-policy.md +++ b/content/pages/privacy-policy.md @@ -53,7 +53,7 @@ The right to access - You have the right to request copies of your personal data The right to erasure - You have the right to request that we erase your personal data, under certain conditions. -If you make a request, we have one month to respond to you. If you would like to exercise any of these rights, please contact us at . +If you make a request, we have one month to respond to you. If you would like to exercise any of these rights, please contact us at . ### How do we use cookies? diff --git a/subsite/docs/.github/workflows/en_GB_wordlist b/subsite/docs/.github/workflows/en_GB_wordlist deleted file mode 100644 index 082fc28..0000000 --- a/subsite/docs/.github/workflows/en_GB_wordlist +++ /dev/null @@ -1,1738 +0,0 @@ -\baccessorise\b -\baccessorised\b -\baccessorises\b -\baccessorising\b -\bacclimatisation\b -\bacclimatise\b -\bacclimatised\b -\bacclimatises\b -\bacclimatising\b -\baccoutrements\b -\baeon\b -\baeons\b -\baerogramme\b -\baerogrammes\b -\baeroplane\b -\baeroplanes\b -\baesthete\b -\baesthetes\b -\baesthetic\b -\baesthetically\b -\baesthetics\b -\baetiology\b -\bageing\b -\baggrandisement\b -\bagonise\b -\bagonised\b -\bagonises\b -\bagonising\b -\bagonisingly\b -\balmanack\b -\balmanacks\b -\baluminium\b -\bamortisable\b -\bamortisation\b -\bamortisations\b -\bamortise\b -\bamortised\b -\bamortises\b -\bamortising\b -\bamphitheatre\b -\bamphitheatres\b -\banaemia\b -\banaemic\b -\banaesthesia\b -\banaesthetic\b -\banaesthetics\b -\banaesthetise\b -\banaesthetised\b -\banaesthetises\b -\banaesthetising\b -\banaesthetist\b -\banaesthetists\b -\banaesthetize\b -\banaesthetized\b -\banaesthetizes\b -\banaesthetizing\b -\banalogue\b -\banalogues\b -\banalyse\b -\banalysed\b -\banalyses\b -\banalysing\b -\banglicise\b -\banglicised\b -\banglicises\b -\banglicising\b -\bannualised\b -\bantagonise\b -\bantagonised\b -\bantagonises\b -\bantagonising\b -\bapologise\b -\bapologised\b -\bapologises\b -\bapologising\b -\bappal\b -\bappals\b -\bappetiser\b -\bappetisers\b -\bappetising\b -\bappetisingly\b -\barbour\b -\barbours\b -\barchaeological\b -\barchaeologically\b -\barchaeologist\b -\barchaeologists\b -\barchaeology\b -\bardour\b -\barmour\b -\barmoured\b -\barmourer\b -\barmourers\b -\barmouries\b -\barmoury\b -\bartefact\b -\bartefacts\b -\bauthorise\b -\bauthorised\b -\bauthorises\b -\bauthorising\b -\baxe\b -\bbackpedalled\b -\bbackpedalling\b -\bbannister\b -\bbannisters\b -\bbaptise\b -\bbaptised\b -\bbaptises\b -\bbaptising\b -\bbastardise\b -\bbastardised\b -\bbastardises\b -\bbastardising\b -\bbattleaxe\b -\bbaulk\b -\bbaulked\b -\bbaulking\b -\bbaulks\b -\bbedevilled\b -\bbedevilling\b -\bbehaviour\b -\bbehavioural\b -\bbehaviourism\b -\bbehaviourist\b -\bbehaviourists\b -\bbehaviours\b -\bbehove\b -\bbehoved\b -\bbehoves\b -\bbejewelled\b -\bbelabour\b -\bbelaboured\b -\bbelabouring\b -\bbelabours\b -\bbevelled\b -\bbevvies\b -\bbevvy\b -\bbiassed\b -\bbiassing\b -\bbingeing\b -\bbougainvillaea\b -\bbougainvillaeas\b -\bbowdlerise\b -\bbowdlerised\b -\bbowdlerises\b -\bbowdlerising\b -\bbreathalyse\b -\bbreathalysed\b -\bbreathalyser\b -\bbreathalysers\b -\bbreathalyses\b -\bbreathalysing\b -\bbrutalise\b -\bbrutalised\b -\bbrutalises\b -\bbrutalising\b -\bbuses\b -\bbusing\b -\bcaesarean\b -\bcaesareans\b -\bcalibre\b -\bcalibres\b -\bcalliper\b -\bcallipers\b -\bcallisthenics\b -\bcanalise\b -\bcanalised\b -\bcanalises\b -\bcanalising\b -\bcancellation\b -\bcancellations\b -\bcancelled\b -\bcancelling\b -\bcandour\b -\bcannibalise\b -\bcannibalised\b -\bcannibalises\b -\bcannibalising\b -\bcanonise\b -\bcanonised\b -\bcanonises\b -\bcanonising\b -\bcapitalise\b -\bcapitalised\b -\bcapitalises\b -\bcapitalising\b -\bcaramelise\b -\bcaramelised\b -\bcaramelises\b -\bcaramelising\b -\bcarbonise\b -\bcarbonised\b -\bcarbonises\b -\bcarbonising\b -\bcarolled\b -\bcarolling\b -\bcatalogue\b -\bcatalogued\b -\bcatalogues\b -\bcataloguing\b -\bcatalyse\b -\bcatalysed\b -\bcatalyses\b -\bcatalysing\b -\bcategorise\b -\bcategorised\b -\bcategorises\b -\bcategorising\b -\bcauterise\b -\bcauterised\b -\bcauterises\b -\bcauterising\b -\bcavilled\b -\bcavilling\b -\bcentigramme\b -\bcentigrammes\b -\bcentilitre\b -\bcentilitres\b -\bcentimetre\b -\bcentimetres\b -\bcentralise\b -\bcentralised\b -\bcentralises\b -\bcentralising\b -\bcentre\b -\bcentred\b -\bcentrefold\b -\bcentrefolds\b -\bcentrepiece\b -\bcentrepieces\b -\bcentres\b -\bchannelled\b -\bchannelling\b -\bcharacterise\b -\bcharacterised\b -\bcharacterises\b -\bcharacterising\b -\bcheque\b -\bchequebook\b -\bchequebooks\b -\bchequered\b -\bcheques\b -\bchilli\b -\bchimaera\b -\bchimaeras\b -\bchiselled\b -\bchiselling\b -\bcircularise\b -\bcircularised\b -\bcircularises\b -\bcircularising\b -\bcivilise\b -\bcivilised\b -\bcivilises\b -\bcivilising\b -\bclamour\b -\bclamoured\b -\bclamouring\b -\bclamours\b -\bclangour\b -\bclarinettist\b -\bclarinettists\b -\bcollectivise\b -\bcollectivised\b -\bcollectivises\b -\bcollectivising\b -\bcolonisation\b -\bcolonise\b -\bcolonised\b -\bcoloniser\b -\bcolonisers\b -\bcolonises\b -\bcolonising\b -\bcolour\b -\bcolourant\b -\bcolourants\b -\bcoloured\b -\bcoloureds\b -\bcolourful\b -\bcolourfully\b -\bcolouring\b -\bcolourize\b -\bcolourized\b -\bcolourizes\b -\bcolourizing\b -\bcolourless\b -\bcolours\b -\bcommercialise\b -\bcommercialised\b -\bcommercialises\b -\bcommercialising\b -\bcompartmentalise\b -\bcompartmentalised\b -\bcompartmentalises\b -\bcompartmentalising\b -\bcomputerise\b -\bcomputerised\b -\bcomputerises\b -\bcomputerising\b -\bconceptualise\b -\bconceptualised\b -\bconceptualises\b -\bconceptualising\b -\bconnexion\b -\bconnexions\b -\bcontextualise\b -\bcontextualised\b -\bcontextualises\b -\bcontextualising\b -\bcosier\b -\bcosies\b -\bcosiest\b -\bcosily\b -\bcosiness\b -\bcosy\b -\bcouncillor\b -\bcouncillors\b -\bcounselled\b -\bcounselling\b -\bcounsellor\b -\bcounsellors\b -\bcrenellated\b -\bcriminalise\b -\bcriminalised\b -\bcriminalises\b -\bcriminalising\b -\bcriticise\b -\bcriticised\b -\bcriticises\b -\bcriticising\b -\bcrueller\b -\bcruellest\b -\bcrystallisation\b -\bcrystallise\b -\bcrystallised\b -\bcrystallises\b -\bcrystallising\b -\bcudgelled\b -\bcudgelling\b -\bcustomisation\b -\bcustomise\b -\bcustomised\b -\bcustomises\b -\bcustomising\b -\bcypher\b -\bcyphers\b -\bdecentralisation\b -\bdecentralise\b -\bdecentralised\b -\bdecentralises\b -\bdecentralising\b -\bdecriminalisation\b -\bdecriminalise\b -\bdecriminalised\b -\bdecriminalises\b -\bdecriminalising\b -\bdefence\b -\bdefenceless\b -\bdefences\b -\bdehumanisation\b -\bdehumanise\b -\bdehumanised\b -\bdehumanises\b -\bdehumanising\b -\bdemeanour\b -\bdemilitarisation\b -\bdemilitarise\b -\bdemilitarised\b -\bdemilitarises\b -\bdemilitarising\b -\bdemobilisation\b -\bdemobilise\b -\bdemobilised\b -\bdemobilises\b -\bdemobilising\b -\bdemocratisation\b -\bdemocratise\b -\bdemocratised\b -\bdemocratises\b -\bdemocratising\b -\bdemonise\b -\bdemonised\b -\bdemonises\b -\bdemonising\b -\bdemoralisation\b -\bdemoralise\b -\bdemoralised\b -\bdemoralises\b -\bdemoralising\b -\bdenationalisation\b -\bdenationalise\b -\bdenationalised\b -\bdenationalises\b -\bdenationalising\b -\bdeodorise\b -\bdeodorised\b -\bdeodorises\b -\bdeodorising\b -\bdepersonalise\b -\bdepersonalised\b -\bdepersonalises\b -\bdepersonalising\b -\bdeputise\b -\bdeputised\b -\bdeputises\b -\bdeputising\b -\bdesensitisation\b -\bdesensitise\b -\bdesensitised\b -\bdesensitises\b -\bdesensitising\b -\bdestabilisation\b -\bdestabilise\b -\bdestabilised\b -\bdestabilises\b -\bdestabilising\b -\bdialled\b -\bdialling\b -\bdialogue\b -\bdialogues\b -\bdiarrhoea\b -\bdigitise\b -\bdigitised\b -\bdigitises\b -\bdigitising\b -\bdisc\b -\bdiscolour\b -\bdiscoloured\b -\bdiscolouring\b -\bdiscolours\b -\bdiscs\b -\bdisembowelled\b -\bdisembowelling\b -\bdisfavour\b -\bdishevelled\b -\bdishonour\b -\bdishonourable\b -\bdishonourably\b -\bdishonoured\b -\bdishonouring\b -\bdishonours\b -\bdisorganisation\b -\bdisorganised\b -\bdistil\b -\bdistils\b -\bdramatisation\b -\bdramatisations\b -\bdramatise\b -\bdramatised\b -\bdramatises\b -\bdramatising\b -\bdraught\b -\bdraughtboard\b -\bdraughtboards\b -\bdraughtier\b -\bdraughtiest\b -\bdraughts\b -\bdraughtsman\b -\bdraughtsmanship\b -\bdraughtsmen\b -\bdraughtswoman\b -\bdraughtswomen\b -\bdraughty\b -\bdrivelled\b -\bdrivelling\b -\bduelled\b -\bduelling\b -\beconomise\b -\beconomised\b -\beconomises\b -\beconomising\b -\bedoema\b -\beditorialise\b -\beditorialised\b -\beditorialises\b -\beditorialising\b -\bempathise\b -\bempathised\b -\bempathises\b -\bempathising\b -\bemphasise\b -\bemphasised\b -\bemphasises\b -\bemphasising\b -\benamelled\b -\benamelling\b -\benamoured\b -\bencyclopaedia\b -\bencyclopaedias\b -\bencyclopaedic\b -\bendeavour\b -\bendeavoured\b -\bendeavouring\b -\bendeavours\b -\benergise\b -\benergised\b -\benergises\b -\benergising\b -\benrol\b -\benrols\b -\benthral\b -\benthrals\b -\bepaulette\b -\bepaulettes\b -\bepicentre\b -\bepicentres\b -\bepilogue\b -\bepilogues\b -\bepitomise\b -\bepitomised\b -\bepitomises\b -\bepitomising\b -\bequalisation\b -\bequalise\b -\bequalised\b -\bequaliser\b -\bequalisers\b -\bequalises\b -\bequalising\b -\beulogise\b -\beulogised\b -\beulogises\b -\beulogising\b -\bevangelise\b -\bevangelised\b -\bevangelises\b -\bevangelising\b -\bexorcise\b -\bexorcised\b -\bexorcises\b -\bexorcising\b -\bextemporisation\b -\bextemporise\b -\bextemporised\b -\bextemporises\b -\bextemporising\b -\bexternalisation\b -\bexternalisations\b -\bexternalise\b -\bexternalised\b -\bexternalises\b -\bexternalising\b -\bfactorise\b -\bfactorised\b -\bfactorises\b -\bfactorising\b -\bfaecal\b -\bfaeces\b -\bfamiliarisation\b -\bfamiliarise\b -\bfamiliarised\b -\bfamiliarises\b -\bfamiliarising\b -\bfantasise\b -\bfantasised\b -\bfantasises\b -\bfantasising\b -\bfavour\b -\bfavourable\b -\bfavourably\b -\bfavoured\b -\bfavouring\b -\bfavourite\b -\bfavourites\b -\bfavouritism\b -\bfavours\b -\bfeminise\b -\bfeminised\b -\bfeminises\b -\bfeminising\b -\bfertilisation\b -\bfertilise\b -\bfertilised\b -\bfertiliser\b -\bfertilisers\b -\bfertilises\b -\bfertilising\b -\bfervour\b -\bfibre\b -\bfibreglass\b -\bfibres\b -\bfictionalisation\b -\bfictionalisations\b -\bfictionalise\b -\bfictionalised\b -\bfictionalises\b -\bfictionalising\b -\bfillet\b -\bfilleted\b -\bfilleting\b -\bfillets\b -\bfinalisation\b -\bfinalise\b -\bfinalised\b -\bfinalises\b -\bfinalising\b -\bflautist\b -\bflautists\b -\bflavour\b -\bflavoured\b -\bflavouring\b -\bflavourings\b -\bflavourless\b -\bflavours\b -\bflavoursome\b -\bflyer / flier\b -\bfoetal\b -\bfoetid\b -\bfoetus\b -\bfoetuses\b -\bformalisation\b -\bformalise\b -\bformalised\b -\bformalises\b -\bformalising\b -\bfossilisation\b -\bfossilise\b -\bfossilised\b -\bfossilises\b -\bfossilising\b -\bfraternisation\b -\bfraternise\b -\bfraternised\b -\bfraternises\b -\bfraternising\b -\bfulfil\b -\bfulfilment\b -\bfulfils\b -\bfunnelled\b -\bfunnelling\b -\bgalvanise\b -\bgalvanised\b -\bgalvanises\b -\bgalvanising\b -\bgambolled\b -\bgambolling\b -\bgaol\b -\bgaolbird\b -\bgaolbirds\b -\bgaolbreak\b -\bgaolbreaks\b -\bgaoled\b -\bgaoler\b -\bgaolers\b -\bgaoling\b -\bgaols\b -\bgases\b -\bgauge\b -\bgauged\b -\bgauges\b -\bgauging\b -\bgeneralisation\b -\bgeneralisations\b -\bgeneralise\b -\bgeneralised\b -\bgeneralises\b -\bgeneralising\b -\bghettoise\b -\bghettoised\b -\bghettoises\b -\bghettoising\b -\bgipsies\b -\bglamorise\b -\bglamorised\b -\bglamorises\b -\bglamorising\b -\bglamour\b -\bglobalisation\b -\bglobalise\b -\bglobalised\b -\bglobalises\b -\bglobalising\b -\bglueing\b -\bgoitre\b -\bgoitres\b -\bgonorrhoea\b -\bgramme\b -\bgrammes\b -\bgravelled\b -\bgrey\b -\bgreyed\b -\bgreying\b -\bgreyish\b -\bgreyness\b -\bgreys\b -\bgrovelled\b -\bgrovelling\b -\bgroyne\b -\bgroynes\b -\bgruelling\b -\bgruellingly\b -\bgryphon\b -\bgryphons\b -\bgynaecological\b -\bgynaecologist\b -\bgynaecologists\b -\bgynaecology\b -\bhaematological\b -\bhaematologist\b -\bhaematologists\b -\bhaematology\b -\bhaemoglobin\b -\bhaemophilia\b -\bhaemophiliac\b -\bhaemophiliacs\b -\bhaemorrhage\b -\bhaemorrhaged\b -\bhaemorrhages\b -\bhaemorrhaging\b -\bhaemorrhoids\b -\bharbour\b -\bharboured\b -\bharbouring\b -\bharbours\b -\bharmonisation\b -\bharmonise\b -\bharmonised\b -\bharmonises\b -\bharmonising\b -\bhomoeopath\b -\bhomoeopathic\b -\bhomoeopaths\b -\bhomoeopathy\b -\bhomogenise\b -\bhomogenised\b -\bhomogenises\b -\bhomogenising\b -\bhonour\b -\bhonourable\b -\bhonourably\b -\bhonoured\b -\bhonouring\b -\bhonours\b -\bhospitalisation\b -\bhospitalise\b -\bhospitalised\b -\bhospitalises\b -\bhospitalising\b -\bhumanise\b -\bhumanised\b -\bhumanises\b -\bhumanising\b -\bhumour\b -\bhumoured\b -\bhumouring\b -\bhumourless\b -\bhumours\b -\bhybridise\b -\bhybridised\b -\bhybridises\b -\bhybridising\b -\bhypnotise\b -\bhypnotised\b -\bhypnotises\b -\bhypnotising\b -\bhypothesise\b -\bhypothesised\b -\bhypothesises\b -\bhypothesising\b -\bidealisation\b -\bidealise\b -\bidealised\b -\bidealises\b -\bidealising\b -\bidolise\b -\bidolised\b -\bidolises\b -\bidolising\b -\bimmobilisation\b -\bimmobilise\b -\bimmobilised\b -\bimmobiliser\b -\bimmobilisers\b -\bimmobilises\b -\bimmobilising\b -\bimmortalise\b -\bimmortalised\b -\bimmortalises\b -\bimmortalising\b -\bimmunisation\b -\bimmunise\b -\bimmunised\b -\bimmunises\b -\bimmunising\b -\bimpanelled\b -\bimpanelling\b -\bimperilled\b -\bimperilling\b -\bindividualise\b -\bindividualised\b -\bindividualises\b -\bindividualising\b -\bindustrialise\b -\bindustrialised\b -\bindustrialises\b -\bindustrialising\b -\binflexion\b -\binflexions\b -\binitialise\b -\binitialised\b -\binitialises\b -\binitialising\b -\binitialled\b -\binitialling\b -\binstal\b -\binstalment\b -\binstalments\b -\binstals\b -\binstil\b -\binstils\b -\binstitutionalisation\b -\binstitutionalise\b -\binstitutionalised\b -\binstitutionalises\b -\binstitutionalising\b -\bintellectualise\b -\bintellectualised\b -\bintellectualises\b -\bintellectualising\b -\binternalisation\b -\binternalise\b -\binternalised\b -\binternalises\b -\binternalising\b -\binternationalisation\b -\binternationalise\b -\binternationalised\b -\binternationalises\b -\binternationalising\b -\bionisation\b -\bionise\b -\bionised\b -\bioniser\b -\bionisers\b -\bionises\b -\bionising\b -\bitalicise\b -\bitalicised\b -\bitalicises\b -\bitalicising\b -\bitemise\b -\bitemised\b -\bitemises\b -\bitemising\b -\bjeopardise\b -\bjeopardised\b -\bjeopardises\b -\bjeopardising\b -\bjewelled\b -\bjeweller\b -\bjewellers\b -\bjewellery\b -\bjudgement\b -\bkilogramme\b -\bkilogrammes\b -\bkilometre\b -\bkilometres\b -\blabelled\b -\blabelling\b -\blabour\b -\blaboured\b -\blabourer\b -\blabourers\b -\blabouring\b -\blabours\b -\blacklustre\b -\blegalisation\b -\blegalise\b -\blegalised\b -\blegalises\b -\blegalising\b -\blegitimise\b -\blegitimised\b -\blegitimises\b -\blegitimising\b -\bleukaemia\b -\blevelled\b -\bleveller\b -\blevellers\b -\blevelling\b -\blibelled\b -\blibelling\b -\blibellous\b -\bliberalisation\b -\bliberalise\b -\bliberalised\b -\bliberalises\b -\bliberalising\b -\blicence\b -\blicenced\b -\blicences\b -\blicencing\b -\blikeable\b -\blionisation\b -\blionise\b -\blionised\b -\blionises\b -\blionising\b -\bliquidise\b -\bliquidised\b -\bliquidiser\b -\bliquidisers\b -\bliquidises\b -\bliquidising\b -\blitre\b -\blitres\b -\blocalise\b -\blocalised\b -\blocalises\b -\blocalising\b -\blouvre\b -\blouvred\b -\blouvres\b -\blustre\b -\bmagnetise\b -\bmagnetised\b -\bmagnetises\b -\bmagnetising\b -\bmanoeuvrability\b -\bmanoeuvrable\b -\bmanoeuvre\b -\bmanoeuvred\b -\bmanoeuvres\b -\bmanoeuvring\b -\bmanoeuvrings\b -\bmarginalisation\b -\bmarginalise\b -\bmarginalised\b -\bmarginalises\b -\bmarginalising\b -\bmarshalled\b -\bmarshalling\b -\bmarvelled\b -\bmarvelling\b -\bmarvellous\b -\bmarvellously\b -\bmaterialisation\b -\bmaterialise\b -\bmaterialised\b -\bmaterialises\b -\bmaterialising\b -\bmaximisation\b -\bmaximise\b -\bmaximised\b -\bmaximises\b -\bmaximising\b -\bmeagre\b -\bmechanisation\b -\bmechanise\b -\bmechanised\b -\bmechanises\b -\bmechanising\b -\bmediaeval\b -\bmemorialise\b -\bmemorialised\b -\bmemorialises\b -\bmemorialising\b -\bmemorise\b -\bmemorised\b -\bmemorises\b -\bmemorising\b -\bmesmerise\b -\bmesmerised\b -\bmesmerises\b -\bmesmerising\b -\bmetabolise\b -\bmetabolised\b -\bmetabolises\b -\bmetabolising\b -\bmetre\b -\bmetres\b -\bmicrometre\b -\bmicrometres\b -\bmilitarise\b -\bmilitarised\b -\bmilitarises\b -\bmilitarising\b -\bmilligramme\b -\bmilligrammes\b -\bmillilitre\b -\bmillilitres\b -\bmillimetre\b -\bmillimetres\b -\bminiaturisation\b -\bminiaturise\b -\bminiaturised\b -\bminiaturises\b -\bminiaturising\b -\bminibuses\b -\bminimise\b -\bminimised\b -\bminimises\b -\bminimising\b -\bmisbehaviour\b -\bmisdemeanour\b -\bmisdemeanours\b -\bmisspelt\b -\bmitre\b -\bmitres\b -\bmobilisation\b -\bmobilise\b -\bmobilised\b -\bmobilises\b -\bmobilising\b -\bmodelled\b -\bmodeller\b -\bmodellers\b -\bmodelling\b -\bmodernise\b -\bmodernised\b -\bmodernises\b -\bmodernising\b -\bmoisturise\b -\bmoisturised\b -\bmoisturiser\b -\bmoisturisers\b -\bmoisturises\b -\bmoisturising\b -\bmonologue\b -\bmonologues\b -\bmonopolisation\b -\bmonopolise\b -\bmonopolised\b -\bmonopolises\b -\bmonopolising\b -\bmoralise\b -\bmoralised\b -\bmoralises\b -\bmoralising\b -\bmotorised\b -\bmould\b -\bmoulded\b -\bmoulder\b -\bmouldered\b -\bmouldering\b -\bmoulders\b -\bmouldier\b -\bmouldiest\b -\bmoulding\b -\bmouldings\b -\bmoulds\b -\bmouldy\b -\bmoult\b -\bmoulted\b -\bmoulting\b -\bmoults\b -\bmoustache\b -\bmoustached\b -\bmoustaches\b -\bmoustachioed\b -\bmulticoloured\b -\bnationalisation\b -\bnationalisations\b -\bnationalise\b -\bnationalised\b -\bnationalises\b -\bnationalising\b -\bnaturalisation\b -\bnaturalise\b -\bnaturalised\b -\bnaturalises\b -\bnaturalising\b -\bneighbour\b -\bneighbourhood\b -\bneighbourhoods\b -\bneighbouring\b -\bneighbourliness\b -\bneighbourly\b -\bneighbours\b -\bneutralisation\b -\bneutralise\b -\bneutralised\b -\bneutralises\b -\bneutralising\b -\bnormalisation\b -\bnormalise\b -\bnormalised\b -\bnormalises\b -\bnormalising\b -\bodour\b -\bodourless\b -\bodours\b -\boesophagus\b -\boesophaguses\b -\boestrogen\b -\boffence\b -\boffences\b -\bomelette\b -\bomelettes\b -\boptimise\b -\boptimised\b -\boptimises\b -\boptimising\b -\borganisation\b -\borganisational\b -\borganisations\b -\borganise\b -\borganised\b -\borganiser\b -\borganisers\b -\borganises\b -\borganising\b -\borthopaedic\b -\borthopaedics\b -\bostracise\b -\bostracised\b -\bostracises\b -\bostracising\b -\boutmanoeuvre\b -\boutmanoeuvred\b -\boutmanoeuvres\b -\boutmanoeuvring\b -\boveremphasise\b -\boveremphasised\b -\boveremphasises\b -\boveremphasising\b -\boxidisation\b -\boxidise\b -\boxidised\b -\boxidises\b -\boxidising\b -\bpaederast\b -\bpaederasts\b -\bpaediatric\b -\bpaediatrician\b -\bpaediatricians\b -\bpaediatrics\b -\bpaedophile\b -\bpaedophiles\b -\bpaedophilia\b -\bpalaeolithic\b -\bpalaeontologist\b -\bpalaeontologists\b -\bpalaeontology\b -\bpanelled\b -\bpanelling\b -\bpanellist\b -\bpanellists\b -\bparalyse\b -\bparalysed\b -\bparalyses\b -\bparalysing\b -\bparcelled\b -\bparcelling\b -\bparlour\b -\bparlours\b -\bparticularise\b -\bparticularised\b -\bparticularises\b -\bparticularising\b -\bpassivisation\b -\bpassivise\b -\bpassivised\b -\bpassivises\b -\bpassivising\b -\bpasteurisation\b -\bpasteurise\b -\bpasteurised\b -\bpasteurises\b -\bpasteurising\b -\bpatronise\b -\bpatronised\b -\bpatronises\b -\bpatronising\b -\bpatronisingly\b -\bpedalled\b -\bpedalling\b -\bpedestrianisation\b -\bpedestrianise\b -\bpedestrianised\b -\bpedestrianises\b -\bpedestrianising\b -\bpenalise\b -\bpenalised\b -\bpenalises\b -\bpenalising\b -\bpencilled\b -\bpencilling\b -\bpersonalise\b -\bpersonalised\b -\bpersonalises\b -\bpersonalising\b -\bpharmacopoeia\b -\bpharmacopoeias\b -\bphilosophise\b -\bphilosophised\b -\bphilosophises\b -\bphilosophising\b -\bphiltre\b -\bphiltres\b -\bphoney\b -\bplagiarise\b -\bplagiarised\b -\bplagiarises\b -\bplagiarising\b -\bplough\b -\bploughed\b -\bploughing\b -\bploughman\b -\bploughmen\b -\bploughs\b -\bploughshare\b -\bploughshares\b -\bpolarisation\b -\bpolarise\b -\bpolarised\b -\bpolarises\b -\bpolarising\b -\bpoliticisation\b -\bpoliticise\b -\bpoliticised\b -\bpoliticises\b -\bpoliticising\b -\bpopularisation\b -\bpopularise\b -\bpopularised\b -\bpopularises\b -\bpopularising\b -\bpouffe\b -\bpouffes\b -\bpractise\b -\bpractised\b -\bpractises\b -\bpractising\b -\bpraesidium\b -\bpraesidiums\b -\bpressurisation\b -\bpressurise\b -\bpressurised\b -\bpressurises\b -\bpressurising\b -\bpretence\b -\bpretences\b -\bprimaeval\b -\bprioritisation\b -\bprioritise\b -\bprioritised\b -\bprioritises\b -\bprioritising\b -\bprivatisation\b -\bprivatisations\b -\bprivatise\b -\bprivatised\b -\bprivatises\b -\bprivatising\b -\bprofessionalisation\b -\bprofessionalise\b -\bprofessionalised\b -\bprofessionalises\b -\bprofessionalising\b -\bprogramme\b -\bprogrammes\b -\bprologue\b -\bprologues\b -\bpropagandise\b -\bpropagandised\b -\bpropagandises\b -\bpropagandising\b -\bproselytise\b -\bproselytised\b -\bproselytiser\b -\bproselytisers\b -\bproselytises\b -\bproselytising\b -\bpsychoanalyse\b -\bpsychoanalysed\b -\bpsychoanalyses\b -\bpsychoanalysing\b -\bpublicise\b -\bpublicised\b -\bpublicises\b -\bpublicising\b -\bpulverisation\b -\bpulverise\b -\bpulverised\b -\bpulverises\b -\bpulverising\b -\bpummelled\b -\bpummelling\b -\bpyjama\b -\bpyjamas\b -\bpzazz\b -\bquarrelled\b -\bquarrelling\b -\bradicalise\b -\bradicalised\b -\bradicalises\b -\bradicalising\b -\brancour\b -\brandomise\b -\brandomised\b -\brandomises\b -\brandomising\b -\brationalisation\b -\brationalisations\b -\brationalise\b -\brationalised\b -\brationalises\b -\brationalising\b -\bravelled\b -\bravelling\b -\brealisable\b -\brealisation\b -\brealisations\b -\brealise\b -\brealised\b -\brealises\b -\brealising\b -\brecognisable\b -\brecognisably\b -\brecognisance\b -\brecognise\b -\brecognised\b -\brecognises\b -\brecognising\b -\breconnoitre\b -\breconnoitred\b -\breconnoitres\b -\breconnoitring\b -\brefuelled\b -\brefuelling\b -\bregularisation\b -\bregularise\b -\bregularised\b -\bregularises\b -\bregularising\b -\bremodelled\b -\bremodelling\b -\bremould\b -\bremoulded\b -\bremoulding\b -\bremoulds\b -\breorganisation\b -\breorganisations\b -\breorganise\b -\breorganised\b -\breorganises\b -\breorganising\b -\brevelled\b -\breveller\b -\brevellers\b -\brevelling\b -\brevitalise\b -\brevitalised\b -\brevitalises\b -\brevitalising\b -\brevolutionise\b -\brevolutionised\b -\brevolutionises\b -\brevolutionising\b -\brhapsodise\b -\brhapsodised\b -\brhapsodises\b -\brhapsodising\b -\brigour\b -\brigours\b -\britualised\b -\brivalled\b -\brivalling\b -\bromanticise\b -\bromanticised\b -\bromanticises\b -\bromanticising\b -\brumour\b -\brumoured\b -\brumours\b -\bsabre\b -\bsabres\b -\bsaltpetre\b -\bsanitise\b -\bsanitised\b -\bsanitises\b -\bsanitising\b -\bsatirise\b -\bsatirised\b -\bsatirises\b -\bsatirising\b -\bsaviour\b -\bsaviours\b -\bsavour\b -\bsavoured\b -\bsavouries\b -\bsavouring\b -\bsavours\b -\bsavoury\b -\bscandalise\b -\bscandalised\b -\bscandalises\b -\bscandalising\b -\bsceptic\b -\bsceptical\b -\bsceptically\b -\bscepticism\b -\bsceptics\b -\bsceptre\b -\bsceptres\b -\bscrutinise\b -\bscrutinised\b -\bscrutinises\b -\bscrutinising\b -\bsecularisation\b -\bsecularise\b -\bsecularised\b -\bsecularises\b -\bsecularising\b -\bsensationalise\b -\bsensationalised\b -\bsensationalises\b -\bsensationalising\b -\bsensitise\b -\bsensitised\b -\bsensitises\b -\bsensitising\b -\bsentimentalise\b -\bsentimentalised\b -\bsentimentalises\b -\bsentimentalising\b -\bsepulchre\b -\bsepulchres\b -\bserialisation\b -\bserialisations\b -\bserialise\b -\bserialised\b -\bserialises\b -\bserialising\b -\bsermonise\b -\bsermonised\b -\bsermonises\b -\bsermonising\b -\bsheikh\b -\bshovelled\b -\bshovelling\b -\bshrivelled\b -\bshrivelling\b -\bsignalise\b -\bsignalised\b -\bsignalises\b -\bsignalising\b -\bsignalled\b -\bsignalling\b -\bsmoulder\b -\bsmouldered\b -\bsmouldering\b -\bsmoulders\b -\bsnivelled\b -\bsnivelling\b -\bsnorkelled\b -\bsnorkelling\b -\bsnowplough\b -\bsnowploughs\b -\bsocialisation\b -\bsocialise\b -\bsocialised\b -\bsocialises\b -\bsocialising\b -\bsodomise\b -\bsodomised\b -\bsodomises\b -\bsodomising\b -\bsolemnise\b -\bsolemnised\b -\bsolemnises\b -\bsolemnising\b -\bsombre\b -\bspecialisation\b -\bspecialisations\b -\bspecialise\b -\bspecialised\b -\bspecialises\b -\bspecialising\b -\bspectre\b -\bspectres\b -\bspiralled\b -\bspiralling\b -\bsplendour\b -\bsplendours\b -\bsquirrelled\b -\bsquirrelling\b -\bstabilisation\b -\bstabilise\b -\bstabilised\b -\bstabiliser\b -\bstabilisers\b -\bstabilises\b -\bstabilising\b -\bstandardisation\b -\bstandardise\b -\bstandardised\b -\bstandardises\b -\bstandardising\b -\bstencilled\b -\bstencilling\b -\bsterilisation\b -\bsterilisations\b -\bsterilise\b -\bsterilised\b -\bsteriliser\b -\bsterilisers\b -\bsterilises\b -\bsterilising\b -\bstigmatisation\b -\bstigmatise\b -\bstigmatised\b -\bstigmatises\b -\bstigmatising\b -\bstorey\b -\bstoreys\b -\bsubsidisation\b -\bsubsidise\b -\bsubsidised\b -\bsubsidiser\b -\bsubsidisers\b -\bsubsidises\b -\bsubsidising\b -\bsuccour\b -\bsuccoured\b -\bsuccouring\b -\bsuccours\b -\bsulphate\b -\bsulphates\b -\bsulphide\b -\bsulphides\b -\bsulphur\b -\bsulphurous\b -\bsummarise\b -\bsummarised\b -\bsummarises\b -\bsummarising\b -\bswivelled\b -\bswivelling\b -\bsymbolise\b -\bsymbolised\b -\bsymbolises\b -\bsymbolising\b -\bsympathise\b -\bsympathised\b -\bsympathiser\b -\bsympathisers\b -\bsympathises\b -\bsympathising\b -\bsynchronisation\b -\bsynchronise\b -\bsynchronised\b -\bsynchronises\b -\bsynchronising\b -\bsynthesise\b -\bsynthesised\b -\bsynthesiser\b -\bsynthesisers\b -\bsynthesises\b -\bsynthesising\b -\bsyphon\b -\bsyphoned\b -\bsyphoning\b -\bsyphons\b -\bsystematisation\b -\bsystematise\b -\bsystematised\b -\bsystematises\b -\bsystematising\b -\btantalise\b -\btantalised\b -\btantalises\b -\btantalising\b -\btantalisingly\b -\btasselled\b -\btechnicolour\b -\btemporise\b -\btemporised\b -\btemporises\b -\btemporising\b -\btenderise\b -\btenderised\b -\btenderises\b -\btenderising\b -\bterrorise\b -\bterrorised\b -\bterrorises\b -\bterrorising\b -\btheatre\b -\btheatregoer\b -\btheatregoers\b -\btheatres\b -\btheorise\b -\btheorised\b -\btheorises\b -\btheorising\b -\btonne\b -\btonnes\b -\btowelled\b -\btowelling\b -\btoxaemia\b -\btranquillise\b -\btranquillised\b -\btranquilliser\b -\btranquillisers\b -\btranquillises\b -\btranquillising\b -\btranquillity\b -\btranquillize\b -\btranquillized\b -\btranquillizer\b -\btranquillizers\b -\btranquillizes\b -\btranquillizing\b -\btranquilly\b -\btransistorised\b -\btraumatise\b -\btraumatised\b -\btraumatises\b -\btraumatising\b -\btravelled\b -\btraveller\b -\btravellers\b -\btravelling\b -\btravelogue\b -\btravelogues\b -\btrialled\b -\btrialling\b -\btricolour\b -\btricolours\b -\btrivialise\b -\btrivialised\b -\btrivialises\b -\btrivialising\b -\btumour\b -\btumours\b -\btunnelled\b -\btunnelling\b -\btyrannise\b -\btyrannised\b -\btyrannises\b -\btyrannising\b -\btyre\b -\btyres\b -\bunauthorised\b -\buncivilised\b -\bunderutilised\b -\bunequalled\b -\bunfavourable\b -\bunfavourably\b -\bunionisation\b -\bunionise\b -\bunionised\b -\bunionises\b -\bunionising\b -\bunorganised\b -\bunravelled\b -\bunravelling\b -\bunrecognisable\b -\bunrecognised\b -\bunrivalled\b -\bunsavoury\b -\buntrammelled\b -\burbanisation\b -\burbanise\b -\burbanised\b -\burbanises\b -\burbanising\b -\butilisable\b -\butilisation\b -\butilise\b -\butilised\b -\butilises\b -\butilising\b -\bvalour\b -\bvandalise\b -\bvandalised\b -\bvandalises\b -\bvandalising\b -\bvaporisation\b -\bvaporise\b -\bvaporised\b -\bvaporises\b -\bvaporising\b -\bvapour\b -\bvapours\b -\bverbalise\b -\bverbalised\b -\bverbalises\b -\bverbalising\b -\bvictimisation\b -\bvictimise\b -\bvictimised\b -\bvictimises\b -\bvictimising\b -\bvideodisc\b -\bvideodiscs\b -\bvigour\b -\bvisualisation\b -\bvisualisations\b -\bvisualise\b -\bvisualised\b -\bvisualises\b -\bvisualising\b -\bvocalisation\b -\bvocalisations\b -\bvocalise\b -\bvocalised\b -\bvocalises\b -\bvocalising\b -\bvulcanised\b -\bvulgarisation\b -\bvulgarise\b -\bvulgarised\b -\bvulgarises\b -\bvulgarising\b -\bwaggon\b -\bwaggons\b -\bwatercolour\b -\bwatercolours\b -\bweaselled\b -\bweaselling\b -\bwesternisation\b -\bwesternise\b -\bwesternised\b -\bwesternises\b -\bwesternising\b -\bwomanise\b -\bwomanised\b -\bwomaniser\b -\bwomanisers\b -\bwomanises\b -\bwomanising\b -\bwoollen\b -\bwoollens\b -\bwoollies\b -\bwoolly\b -\bworshipped\b -\bworshipping\b -\bworshipper\b -\byodelled\b -\byodelling\b -\byoghourt\b -\byoghourts\b -\byoghurt\b -\byoghurts\b diff --git a/subsite/docs/.github/workflows/english_test.sh b/subsite/docs/.github/workflows/english_test.sh deleted file mode 100755 index 5b5bf80..0000000 --- a/subsite/docs/.github/workflows/english_test.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -grep -Ri -f .github/workflows/en_GB_wordlist content/ - -# grep found nothing (i.e. grep exited citing failure)? Exit successfully -if [ $? -eq 1 ] -then - exit 0 -fi - -# grep found a match? Print the offending matches and then exit citing failure -echo -e "\n****************************** Offending Matches *******************************" -grep -Rio -f .github/workflows/en_GB_wordlist content/ -exit 1 diff --git a/subsite/docs/.github/workflows/gh-pages.yml b/subsite/docs/.github/workflows/gh-pages.yml deleted file mode 100644 index 1c77966..0000000 --- a/subsite/docs/.github/workflows/gh-pages.yml +++ /dev/null @@ -1,99 +0,0 @@ ---- -# Sample workflow for building and deploying a Hugo site to GitHub Pages -name: Deploy Hugo site to Pages - -on: - # Runs on pushes targeting the default branch - push: - branches: [main] - - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - -# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages -permissions: - contents: read - pages: write - id-token: write - -# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. -# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. -concurrency: - group: "pages" - cancel-in-progress: false - -# Default to bash -defaults: - run: - shell: bash - -jobs: - # Build job - build: - runs-on: ubuntu-latest - env: - HUGO_VERSION: 0.122.0 - steps: - - name: Install Hugo CLI - run: | - wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb \ - && sudo dpkg -i ${{ runner.temp }}/hugo.deb - - name: Install Dart Sass - run: sudo snap install dart-sass - - name: Checkout - uses: actions/checkout@v4 - with: - submodules: recursive - - name: Setup Pages - id: pages - uses: actions/configure-pages@v4 - - name: Install Node.js dependencies - run: "[[ -f package-lock.json || -f npm-shrinkwrap.json ]] && npm ci || true" - - name: Build with Hugo - env: - # For maximum backward compatibility with Hugo modules - HUGO_ENVIRONMENT: production - HUGO_ENV: production - run: | - hugo \ - --minify \ - --baseURL "${{ steps.pages.outputs.base_url }}/" - - name: Upload artifact - uses: actions/upload-pages-artifact@v3 - with: - path: ./public - - # Deployment job - deploy: - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-latest - needs: build - steps: - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 - - dispatch: - runs-on: ubuntu-latest - needs: build - permissions: - contents: write # needed for triggering dispatch - steps: - - uses: actions/create-github-app-token@v1 - id: app-token - with: - app-id: ${{ vars.APP_ID }} - private-key: ${{ secrets.PRIVATE_KEY }} - owner: ${{ github.repository_owner }} - repositories: "documentation,website" - - - name: Dispatch to workflows - run: | - curl -X POST \ - -H "Accept: application/vnd.github+json" \ - -H "Authorization: Bearer ${{ steps.app-token.outputs.token }}" \ - -H "X-GitHub-Api-Version: 2022-11-28" \ - --data '{"event_type": "documentation", "client_payload": { "updated": true}}' \ - https://api.github.com/repos/$GITHUB_REPOSITORY_OWNER/website/dispatches diff --git a/subsite/docs/.github/workflows/test.yml b/subsite/docs/.github/workflows/test.yml deleted file mode 100644 index 40d29db..0000000 --- a/subsite/docs/.github/workflows/test.yml +++ /dev/null @@ -1,53 +0,0 @@ -name: test syntax - -on: - # Runs on pull requests targeting the default branch - pull_request: - branches: [main] - -# Sets permissions of the GITHUB_TOKEN -permissions: - contents: read - -# Default to bash -defaults: - run: - shell: bash - -jobs: - # Build job - syntax-check: - runs-on: ubuntu-latest - env: - HUGO_VERSION: 0.122.0 - steps: - - name: Install Hugo CLI - run: | - wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb \ - && sudo dpkg -i ${{ runner.temp }}/hugo.deb - - name: Install Dart Sass - run: sudo snap install dart-sass - - name: Checkout - uses: actions/checkout@v4 - with: - submodules: recursive - - - name: Install Node.js dependencies - run: "[[ -f package-lock.json || -f npm-shrinkwrap.json ]] && npm ci || true" - - - name: Build with Hugo - env: - # For maximum backward compatibility with Hugo modules - HUGO_ENVIRONMENT: testing - HUGO_ENV: testing - run: | - hugo \ - --minify \ - --baseURL "${{ steps.pages.outputs.base_url }}/" - - - name: (British/American) English test - # Content should be written in American English. Test all content against - # British English spelling list from: - # http://www.tysto.com/uk-us-spelling-list.html' - shell: bash - run: .github/workflows/english_test.sh diff --git a/subsite/docs/.gitmodules b/subsite/docs/.gitmodules deleted file mode 100644 index abd5bac..0000000 --- a/subsite/docs/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "themes/hugo-relearn"] - path = themes/hugo-relearn - url = https://github.com/McShelby/hugo-theme-relearn.git diff --git a/subsite/docs/README.md b/subsite/docs/README.md deleted file mode 100644 index 80316af..0000000 --- a/subsite/docs/README.md +++ /dev/null @@ -1,50 +0,0 @@ -# Core Rule Set Documentation Repository - -This repository contains the documentation for the OWASP ModSecurity Core Rule Set. - -## For users of the CRS - -The generated documentation is automatically updated at https://coreruleset.org/docs/. If you just want to read the documentation, you can find it there. If you intend to _contribute_ to the documentation, the rest of this page will guide you through it. - -## Requirements - -You can edit the documentation on your local system. The only thing you need is the latest [Hugo binary](https://gohugo.io/getting-started/installing/) for your OS (Windows, Linux, Mac): it’s that simple. - -**Important: You need Hugo _extended_ version >= 0.93.0.** - -## Cloning this repository - -After getting hugo, just clone this repository to work locally. This way you can edit and verify quickly that everything is working properly before creating a new pull request. - -To clone, use the *recursive* option so you will be getting also the theme to render the pages properly: - -```bash -git clone --recursive git@github.com:coreruleset/documentation.git -``` - -## Editing locally - -Now you have all in place to perform your local edits. - -Everything is created using markdown, and you will normally use the `content` subdirectory to add your edits. - -The theme has many shortcodes and others that you can use to simplify editing. You can get more information about it on [Hugo Relearn theme](https://themes.gohugo.io/themes/hugo-theme-relearn/). - -You can run `hugo` to serve the pages, and while you edit and save, your changes will be refreshed in the browser! - -Use: -``` -hugo serve -``` - -Then check your edits on http://localhost:1313/documentation/. - -## Creating a pull request - -If you are a CRS developer, you can make a branch in the documentation repository. - -If you are an outside contributor, you can fork the [repository](https://github.com/coreruleset/documentation/) to your own GitHub account and create a branch in your fork. - -Once you are happy with your changes, [send a PR](https://github.com/coreruleset/documentation/pulls) with your changes. - -After review and merging, the documentation is built and published on [https://coreruleset.org/docs](https://coreruleset.org/docs/) after max. 5 minutes. diff --git a/subsite/docs/archetypes/default.md b/subsite/docs/archetypes/default.md deleted file mode 100644 index 00e77bd..0000000 --- a/subsite/docs/archetypes/default.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: "{{ replace .Name "-" " " | title }}" -date: {{ .Date }} -draft: true ---- - diff --git a/subsite/docs/assets/data/IdNumbering.csv b/subsite/docs/assets/data/IdNumbering.csv deleted file mode 100644 index 06cdbe6..0000000 --- a/subsite/docs/assets/data/IdNumbering.csv +++ /dev/null @@ -1,177 +0,0 @@ -981020,901100 -981021,901110 -981140,910000 -900050,910100 -900051,910110 -900051,910120 -981138,910130 -981141,910140 -981142,910150 -981143,910160 -981144,910170 -981139,910180 -960032,911100 -981044,912000 -981045,912010 -981046,912020 -981047,912030 -981048,912040 -981049,912100 -990002,913100 -990901,913110 -990902,913120 -960911,920100 -981227,920110 -960000,920120 -960912,920130 -960914,920140 -960915,920150 -960016,920160 -960011,920170 -960012,920180 -958230,920190 -958231,920200 -958295,920210 -950107,920220 -950109,920230 -950108,920240 -950801,920250 -950116,920260 -960901,920270 -960008,920280 -960007,920290 -960015,920300 -960021,920310 -960009,920320 -960006,920330 -960904,920340 -960017,920350 -960209,920360 -960208,920370 -960335,920380 -960341,920390 -960342,920400 -960343,920410 -960010,920420 -960034,920430 -960035,920440 -960038,920450 -950012,921100 -950915,921110 -950910,921120 -950911,921130 -950912,921140 -950913,921150 -950914,921160 -950916,921170 -950103,930100 -950104,930110 -950005,930120 -950117,931100 -950118,931110 -950119,931120 -950120,931130 -950907,932100 -958978,933000 -959151,933100 -958977,933110 -958979,933120 -958980,933130 -973344,941000 -973343,941100 -973336,941110 -973337,941120 -973339,941130 -973338,941140 -973350,941150 -973340,941160 -973341,941170 -973342,941180 -973315,941190 -973326,941200 -973346,941210 -973345,941220 -973324,941230 -973323,941240 -973322,941250 -973348,941260 -973321,941270 -973320,941280 -973318,941290 -973317,941300 -973319,941310 -981261,942100 -981318,942110 -981319,942120 -950901,942130 -981320,942140 -950001,942150 -981272,942160 -981250,942170 -981244,942180 -981255,942190 -981257,942200 -981248,942210 -981277,942220 -981241,942230 -981252,942240 -981256,942250 -981245,942260 -981276,942270 -981254,942280 -981270,942290 -981240,942300 -981249,942310 -981253,942320 -981242,942330 -981246,942340 -981251,942350 -981247,942360 -981243,942370 -950009,943100 -950003,943110 -950000,943120 -981175,949100 -981179,949110 -981180,949120 -981181,949130 -981182,949140 -981183,949150 -981184,949160 -981186,949170 -981187,949180 -981176,949190 -970901,950100 -970013,950110 -970017,950120 -970118,950130 -970004,950140 -970904,950150 -970014,950160 -970017,950170 -970009,950180 -970015,950190 -970902,950200 -970003,951100 -9700010,951110 -9700011,951120 -9700012,951130 -9700013,951140 -9700014,951150 -9700015,951160 -9700016,951170 -9700017,951180 -9700018,951190 -9700019,951200 -9700020,951210 -9700021,951220 -9700022,951230 -9700023,951240 -9700024,951250 -9700025,951260 -981200,959100 -981201,980100 -981202,980110 -981203,980120 -981204,980130 -981205,980140 diff --git a/subsite/docs/config/_default/config.toml b/subsite/docs/config/_default/config.toml deleted file mode 100644 index bd133fd..0000000 --- a/subsite/docs/config/_default/config.toml +++ /dev/null @@ -1,58 +0,0 @@ -baseURL = "https://coreruleset.github.io/documentation/" -languageCode = "en-us" -title = "Core Rule Set Documentation" -theme = "hugo-relearn" - -# For search functionality -[outputs] -home = [ "HTML", "RSS", "JSON"] - -[params] - # Prefix URL to edit current page. Will display an "Edit this page" button on top right hand corner of every page. - # Useful to give opportunity to people to create merge request for your doc. - # See the config.toml file from this documentation site to have an example. - editURL = "https://github.com/coreruleset/documentation/blob/main/content/" - # Author of the site, will be used in meta information - author = "CoreRuleSet" - # Description of the site, will be used in meta information - description = "CoreRuleSet Documentation" - # Shows a checkmark for visited pages on the menu - showVisitedLinks = true - # Disable search function. It will hide search bar - disableSearch = false - # Javascript and CSS cache are automatically busted when new version of site is generated. - # Set this to true to disable this behavior (some proxies don't handle well this optimization) - disableAssetsBusting = false - # Set this to true to disable copy-to-clipboard button for inline code. - disableInlineCopyToClipBoard = false - # A title for shortcuts in menu is set by default. Set this to true to disable it. - disableShortcutsTitle = false - # When using mulitlingual website, disable the switch language button. - disableLanguageSwitchingButton = false - # Hide breadcrumbs in the header and only show the current page title - disableBreadcrumb = true - # Hide Next and Previous page buttons normally displayed full height beside content - disableNextPrev = false - # Order sections in menu by "weight" or "title". Default to "weight" - ordersectionsby = "weight" - # Change default color scheme with a variant one. Can be "red", "blue", "green". - themeVariant = "blue" - # Provide a list of custom css files to load relative from the `static/` folder in the site root. - #custom_css = ["css/foo.css", "css/bar.css"] - - # CRS related parameters - crs_latest_release = "4.0.0" - crs_dev_branch = "main" - crs_install_dir = "/etc/crs4" - -[[menu.shortcuts]] -name = " Core Rule Set Home" -identifier = "home" -url = "https://coreruleset.org/" -weight = 10 - -[[menu.shortcuts]] -name = " Core Rule Set GitHub" -identifier = "github" -url = "https://github.com/coreruleset/coreruleset" -weight = 20 diff --git a/subsite/docs/config/wordpress/config.toml b/subsite/docs/config/wordpress/config.toml deleted file mode 100644 index b507f45..0000000 --- a/subsite/docs/config/wordpress/config.toml +++ /dev/null @@ -1 +0,0 @@ -baseURL = "https://coreruleset.org/docs/" diff --git a/subsite/docs/content/_index.md b/subsite/docs/content/_index.md deleted file mode 100644 index 68e54e1..0000000 --- a/subsite/docs/content/_index.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: "Core Rule Set Documentation" ---- - -# Core Rule Set Documentation - -> The OWASP Core Rule Set provides documentation for many of the aspects surrounding the project. This page provides an overview of the project and its documentation. - -{{% notice info %}} -Security issues regarding the Core Rule Set can be submitted via email to security [ at ] coreruleset.org. -{{% /notice %}} - -## What Is the Core Rule Set? - -The OWASP® (Open Worldwide Application Security Project) CRS (Core Rule Set) is a free and open-source collection of rules that work with ModSecurity® and compatible web application firewalls (WAFs). These rules are designed to provide easy to use, generic attack detection capabilities, with a minimum of false positives (false alerts), to web applications as part of a well balanced defense-in-depth solution. - -## How to Get Involved - -For information on how to join the vibrant community of Core Rule Set developers, start by checking out the project's [GitHub repository](https://github.com/coreruleset/coreruleset). When ready to make a contribution, have a read of the project's [contribution guidelines]({{< ref "development/contribution_guidelines/" >}}) which are used to keep the project consistent, well managed, and of a high quality. - -## CRS Change Policy - -The Core Rule Set project endeavors not to make breaking changes in **minor releases** (i.e., 3.3.2). Instead, these releases fix bugs identified in the previous release. - -New functionality and breaking changes are made in **major releases** (i.e., 3.3). - -For information about what has changed in recent versions of the software, refer to the project's [CHANGES](https://github.com/coreruleset/coreruleset/blob/v4.0/dev/CHANGES.md) file on GitHub. - -## Documentation Source - -The source files for this documentation can be found at the [CRS documentation repository](https://github.com/coreruleset/documentation) on GitHub. - -This documentation has been statically generated with [Hugo](https://github.com/gohugoio/hugo). It uses the [Hugo Relearn Theme](https://github.com/McShelby/hugo-theme-relearn). - -## License - -The OWASP Core Rule Set is a free and open-source set of security rules which use the Apache License 2.0. Although it was originally developed for ModSecurity's SecRules language, the rule set can be, and often has been, freely modified, reproduced, and adapted for various commercial and non-commercial endeavors. The CRS project encourages individuals and organizations to contribute back to the OWASP Core Rule Set where possible. diff --git a/subsite/docs/content/concepts/_index.md b/subsite/docs/content/concepts/_index.md deleted file mode 100644 index 279e138..0000000 --- a/subsite/docs/content/concepts/_index.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: How CRS Works -weight: 20 -pre: "2. " -chapter: true ---- - -# How CRS Works diff --git a/subsite/docs/content/concepts/anomaly_scoring.md b/subsite/docs/content/concepts/anomaly_scoring.md deleted file mode 100644 index 03d0a43..0000000 --- a/subsite/docs/content/concepts/anomaly_scoring.md +++ /dev/null @@ -1,224 +0,0 @@ ---- -title: Anomaly Scoring -weight: 10 -disableToc: false -chapter: false ---- - -> The Core Rule Set 3 is designed as an anomaly scoring rule set. This page explains what anomaly scoring is and how to use it. - -## Overview of Anomaly Scoring - -Anomaly scoring, also known as "collaborative detection", is a scoring mechanism used in the Core Rule Set. It assigns a numeric score to HTTP transactions (requests and responses), representing how 'anomalous' they appear to be. Anomaly scores can then be used to make blocking decisions. The default CRS blocking policy, for example, is to block any transaction that meets or exceeds a defined anomaly score threshold. - -## How Anomaly Scoring Mode Works - -Anomaly scoring mode combines the concepts of *collaborative detection* and *delayed blocking*. The key idea to understand is that **the inspection/detection rule logic is decoupled from the blocking functionality**. - -Individual rules designed to detect specific types of attacks and malicious behavior are executed. If a rule matches, no immediate disruptive action is taken (e.g. the transaction is not blocked). Instead, the matched rule contributes to a transactional *anomaly score*, which acts as a running total. The rules just handle detection, adding to the anomaly score if they match. In addition, an individual matched rule will typically log a record of the match for later reference, including the ID of the matched rule, the data that caused the match, and the URI that was being requested. - -Once all of the rules that inspect *request* data have been executed, *blocking evaluation* takes place. If the anomaly score is greater than or equal to the inbound anomaly score threshold then the transaction is *denied*. Transactions that are not denied continue on their journey. - -![Diagram showing an example where the inbound anomaly score threshold is set to 5. A first example request accumulates an anomaly score of 2 and is allowed to pass at the blocking evaluation step. A second example request accumulates an anomaly score of 7 and is denied at the blocking evaluation step.](as_inbound_no_fonts.svg?height=36em) - -Continuing on, once all of the rules that inspect *response* data have been executed, a second round of blocking evaluation takes place. If the *outbound* anomaly score is greater than or equal to the outbound anomaly score threshold, then the response is *not returned* to the user. (Note that in this case, the request *is* fully handled by the backend or application; only the response is stopped.) - -{{% notice info %}} -Having separate inbound and outbound anomaly scores and thresholds allows for request data and response data to be inspected and scored independently. -{{% /notice %}} - -### Summary of Anomaly Scoring Mode - -To summarize, anomaly scoring mode in the CRS works like so: - -1. Execute all *request* rules -1. Make a blocking decision using the *inbound* anomaly score threshold -1. Execute all *response* rules -1. Make a blocking decision using the *outbound* anomaly score threshold - -### The Anomaly Scoring Mechanism In Action - -As described, individual rules are only responsible for detection and inspection: they do not block or deny transactions. If a rule matches then it increments the anomaly score. This is done using ModSecurity's `setvar` action. - -Below is an example of a detection rule which matches when a request has a `Content-Length` header field containing something other than digits. Notice the final line of the rule: it makes use of the `setvar` action, which will increment the anomaly score if the rule matches: - -```apache -SecRule REQUEST_HEADERS:Content-Length "!@rx ^\d+$" \ - "id:920160,\ - phase:1,\ - block,\ - t:none,\ - msg:'Content-Length HTTP header is not numeric',\ - logdata:'%{MATCHED_VAR}',\ - tag:'application-multi',\ - tag:'language-multi',\ - tag:'platform-multi',\ - tag:'attack-protocol',\ - tag:'paranoia-level/1',\ - tag:'OWASP_CRS',\ - tag:'capec/1000/210/272',\ - ver:'OWASP_CRS/3.4.0-dev',\ - severity:'CRITICAL',\ - setvar:'tx.anomaly_score_pl1=+%{tx.critical_anomaly_score}'" -``` - -{{% notice info %}} -Notice that the anomaly score variable name has the suffix `pl1`. Internally, CRS keeps track of anomaly scores on a *per* [*paranoia level*]({{< ref "paranoia_levels" >}} "Page describing paranoia levels.") basis. The individual paranoia level anomaly scores are added together before each round of blocking evaluation takes place, allowing the total combined inbound or outbound score to be compared to the relevant anomaly score threshold. - -Tracking the anomaly score per paranoia level allows for clever scoring mechanisms to be employed, such as the [executing paranoia level]({{< ref "paranoia_levels#moving-to-a-higher-paranoia-level" >}} "Section describing the executing paranoia level feature.") feature. -{{% /notice %}} - -The rules files `REQUEST-949-BLOCKING-EVALUATION.conf` and `RESPONSE-959-BLOCKING-EVALUATION.conf` are responsible for executing the inbound (request) and outbound (response) rounds of blocking evaluation, respectively. The rules in these files calculate the total inbound or outbound transactional anomaly score and then make a blocking decision, by comparing the result to the defined threshold and taking blocking action if required. - -## Configuring Anomaly Scoring Mode - -The following settings can be configured when using anomaly scoring mode: - -- Anomaly score thresholds -- Severity levels -- Early blocking - -If using a native Core Rule Set installation on a web application firewall, these settings are defined in the file `crs-setup.conf`. If running CRS where it has been integrated into a commercial product or CDN then support varies. Some vendors expose these settings in the GUI while other vendors require custom rules to be written which set the necessary variables. Unfortunately, there are also vendors that don't allow these settings to be configured at all. - -### Anomaly Score Thresholds - -An anomaly score threshold is the cumulative anomaly score at which an inbound request or an outbound response will be blocked. - -Most detected inbound threats carry an anomaly score of 5 (by default), while smaller violations, e.g. protocol and standards violations, carry lower scores. An anomaly score threshold of 7, for example, would require multiple rule matches in order to trigger a block (e.g. one "critical" rule scoring 5 plus a lesser-scoring rule, in order to reach the threshold of 7). An anomaly score threshold of 10 would require at least two "critical" rules to match, or a combination of many lesser-scoring rules. **Increasing the anomaly score thresholds makes the CRS less sensitive** and hence less likely to block transactions. - -Rule coverage should be taken into account when setting anomaly score thresholds. Different CRS rule categories feature different numbers of rules. SQL injection, for example, is covered by more than 50 rules. As a result, a real world SQLi attack can easily gain an anomaly score of 15, 20, or even more. On the other hand, a rare protocol attack might only be covered by a single, specific rule. If such an attack only causes the one specific rule to match then it will only gain an anomaly score of 5. If the inbound anomaly score threshold is set to anything higher than 5 then attacks like the one described will not be stopped. **As such, a CRS installation should aim for an inbound anomaly score threshold of 5.** - -{{% notice warning %}} -Increasing the anomaly score thresholds may allow some attacks to bypass the CRS rules. -{{% /notice %}} - -{{% notice info %}} -An outbound anomaly score threshold of 4 (the default) will block a transaction if any single response rule matches. -{{% /notice %}} - -{{% notice tip %}} -A common practice when working with a **new** CRS deployment is to start in blocking mode from the very beginning with *very high anomaly score thresholds* (even as high as 10000). The thresholds can be gradually lowered over time as an iterative process. - -This tuning method was developed and advocated by Christian Folini, who documented it in detail, along with examples, in a popular tutorial titled [Handling False Positives with the OWASP ModSecurity Core Rule Set](https://www.netnea.com/cms/apache-tutorial-8_handling-false-positives-modsecurity-core-rule-set/). -{{% /notice %}} - -CRS uses two anomaly score thresholds, which can be defined using the variables listed below: - -| Threshold | Variable | -| -------------------------------- | ------------------------------------- | -| Inbound anomaly score threshold | `tx.inbound_anomaly_score_threshold` | -| Outbound anomaly score threshold | `tx.outbound_anomaly_score_threshold` | - -A simple way to set these thresholds is to uncomment and use rule 900110: - -```apache -SecAction \ - "id:900110,\ - phase:1,\ - nolog,\ - pass,\ - t:none,\ - setvar:tx.inbound_anomaly_score_threshold=5,\ - setvar:tx.outbound_anomaly_score_threshold=4" -``` - -### Severity Levels - -Each CRS rule has an associated *severity level*. Different severity levels have different anomaly scores associated with them. This means that different rules can increment the anomaly score by different amounts if the rules match. - -The four severity levels and their *default* anomaly scores are: - -| Severity Level | Default Anomaly Score | -| -------------- | --------------------- | -| **CRITICAL** | 5 | -| **ERROR** | 4 | -| **WARNING** | 3 | -| **NOTICE** | 2 | - -For example, by default, a single matching `CRITICAL` rule would increase the anomaly score by 5, while a single matching `WARNING` rule would increase the anomaly score by 3. - -The default anomaly scores are rarely ever changed. It is possible, however, to set custom anomaly scores for severity levels. To do so, uncomment rule 900100 and set the anomaly scores as desired: - -```apache -SecAction \ - "id:900100,\ - phase:1,\ - nolog,\ - pass,\ - t:none,\ - setvar:tx.critical_anomaly_score=5,\ - setvar:tx.error_anomaly_score=4,\ - setvar:tx.warning_anomaly_score=3,\ - setvar:tx.notice_anomaly_score=2" -``` - -{{% notice info %}} -The CRS makes use of a ModSecurity feature called *macro expansion* to propagate the value of the severity level anomaly scores throughout the entire rule set. -{{% /notice %}} - -### Early Blocking - -Early blocking is an optional setting which can be enabled to allow blocking decisions to be made earlier than usual. - -As summarized previously, anomaly scoring mode works like so: - -1. Execute all *request* rules -1. Make a **blocking decision** using the *inbound* anomaly score threshold -1. Execute all *response* rules -1. Make a **blocking decision** using the *outbound* anomaly score threshold - -The early blocking option takes advantage of the fact that the request and response rules are actually split across different *phases*. A more detailed overview of anomaly scoring mode looks like so: - -1. Execute all phase 1 *(request header)* rules -1. Execute all phase 2 *(request body)* rules -1. Make a **blocking decision** using the *inbound* anomaly score threshold -1. Execute all phase 3 *(response header)* rules -1. Execute all phase 4 *(response body)* rules -1. Make a **blocking decision** using the *outbound* anomaly score threshold - -More data from a transaction becomes available for inspection in each subsequent processing phase. In phase 1 the request headers are available for inspection. Detection rules that are only concerned with request headers are executed here. In phase 2 the request body also becomes available for inspection. Rules that need to inspect the request body, perhaps in addition to request headers, are executed here. - -If a transaction's anomaly score *already* meets or exceeds the inbound anomaly score threshold by the end of phase 1 (due to causing phase 1 rules to match) then, in theory, the phase 2 rules don't need to be executed. This saves the time and resources it would take to process the detection rules in phase 2 and also protects the server from being attacked when handling the body of the request. The majority of CRS rules take place in phase 2, which is also where the request body inspection rules are located. When dealing with large request bodies, it may be worthwhile to avoid executing the phase 2 rules in this way. The same logic applies to blocking *responses* that have already met the *outbound* anomaly score threshold in phase 3, *before* reaching phase 4. This saves the time and resources required to execute the phase 4 rules, which inspect the response body. - -Early blocking makes this possible by inserting **two additional rounds of blocking evaluation**: one after the phase 1 detection rules have finished executing, and another after the phase 3 detection rules: - -1. Execute all phase 1 *(request header)* rules -1. Make an **early blocking decision** using the *inbound* anomaly score threshold -1. Execute all phase 2 *(request body)* rules -1. Make a **blocking decision** using the *inbound* anomaly score threshold -1. Execute all phase 3 *(response header)* rules -1. Make an **early blocking decision** using the *outbound* anomaly score threshold -1. Execute all phase 4 *(response body)* rules -1. Make a **blocking decision** using the *outbound* anomaly score threshold - -{{% notice info %}} -More information about processing phases can be found in the [processing phases section](https://github.com/owasp-modsecurity/ModSecurity/wiki/Reference-Manual-(v2.x)#processing-phases) of the ModSecurity Reference Manual. -{{% /notice %}} - -{{% notice warning %}} -The early blocking option has a major drawback to be aware of: **it can cause potential alerts to be hidden**. - -If a transaction is blocked early then its body is not inspected. For example, if a transaction is blocked early at the end of phase 1 (the request headers phase) then the body of the request is never inspected. If the early blocking option is *not* enabled, it's possible that such a transaction would proceed to cause phase 2 rules to match. Early blocking hides these potential alerts. The same applies to responses that trigger an early block: it's possible that some phase 4 rules would match if early blocking were not enabled. - -Using the early blocking option results in having less information to work with, due to fewer rules being executed. This may mean that the full picture is not present in log files when looking back at attacks and malicious traffic. It can also be a problem when dealing with false positives: tuning away a false positive in phase 1 will allow the same request to proceed to the next phase the next time it's issued (instead of being blocked at the end of phase 1). The problem is that now, with the request making it past phase 1, more, previously "hidden" false positives may appear in phase 2. -{{% /notice %}} - -{{% notice warning %}} -If early blocking is not enabled, there's a chance that the web server will interfere with the handling of a request between phases 1 and 2. Take the example where the Apache web server issues a redirect to a new location. With a request that violates CRS rules in phase 1, this may mean that the request has a higher anomaly score than the defined threshold but it gets redirected away before blocking evaluation happens. -{{% /notice %}} - -#### Enabling the Early Blocking Option - -If using a native Core Rule Set installation on a web application firewall, the early blocking option can be enabled in the file `crs-setup.conf`. This is done by uncommenting rule 900120, which sets the variable `tx.blocking_early` to 1 in order to enable early blocking. CRS otherwise gives this variable a default value of 0, meaning that early blocking is disabled by default. - -```apache -SecAction \ - "id:900120,\ - phase:1,\ - nolog,\ - pass,\ - t:none,\ - setvar:tx.blocking_early=1" -``` - -If running CRS where it has been integrated into a commercial product or CDN then support for the early blocking option varies. Some vendors may allow it to be enabled through the GUI, through a custom rule, or they might not allow it to be enabled at all. diff --git a/subsite/docs/content/concepts/anomaly_scoring/as_inbound.svg b/subsite/docs/content/concepts/anomaly_scoring/as_inbound.svg deleted file mode 100644 index 7f06ac0..0000000 --- a/subsite/docs/content/concepts/anomaly_scoring/as_inbound.svg +++ /dev/null @@ -1,838 +0,0 @@ - - - - - - - - - - - - - - - - - - - - HTTP request - Anomaly score - - - - - - - - - Rule 1CRITICALMATCH (Add 5) - Rule 2NOTICEMATCH (Add 2) - - - - - Rule 3NOTICENO MATCH - - - - - - - 5 - - - - 7 - - - - 7 - - - - - - 7 - - BlockingevaluationDENY - Inbound anomalyscore threshold: 5 - - - - - - - - - - - - - - Rule 1CRITICALNO MATCH - Rule 2NOTICENO MATCH - - - - - Rule 3NOTICEMATCH (Add 2) - - - - - - - 0 - - - - 0 - - - - 2 - - - - - - 2 - - BlockingevaluationPASS - Inbound anomalyscore threshold: 5 - - - - - - - - Rule severity - - Result - - diff --git a/subsite/docs/content/concepts/anomaly_scoring/as_inbound_no_fonts.svg b/subsite/docs/content/concepts/anomaly_scoring/as_inbound_no_fonts.svg deleted file mode 100644 index f60b24d..0000000 --- a/subsite/docs/content/concepts/anomaly_scoring/as_inbound_no_fonts.svg +++ /dev/null @@ -1,1722 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/subsite/docs/content/concepts/false_positives_tuning.md b/subsite/docs/content/concepts/false_positives_tuning.md deleted file mode 100644 index 2c2467e..0000000 --- a/subsite/docs/content/concepts/false_positives_tuning.md +++ /dev/null @@ -1,377 +0,0 @@ ---- -title: False Positives and Tuning -weight: 30 -disableToc: false -chapter: false ---- - -> When a *genuine* transaction causes a rule from the Core Rule Set to match in error it is described as a **false positive**. False positives need to be tuned away by writing *rule exclusions*, as this page explains. - -## What are False Positives? - -The Core Rule Set provides _generic_ attack detection capabilities. A fresh CRS deployment has no awareness of the web services that may be running behind it, or the quirks of how those services work. It is possible that *genuine* transactions may cause some CRS rules to match in error, if the transactions happen to match one of the generic attack behaviors or patterns that are being detected. Such a match is referred to as a *false positive*, or false alarm. - -False positives are particularly likely to happen when operating at higher [paranoia levels]({{< ref "paranoia_levels" >}} "Page describing paranoia levels."). While paranoia level 1 is designed to cause few, ideally zero, false positives, higher paranoia levels are increasingly likely to cause false positives. Each successive paranoia level introduces additional rules, with *higher* paranoia levels adding *more aggressive* rules. As such, the higher the paranoia level is the more likely it is that false positives will occur. That is the cost of the higher security provided by higher paranoia levels: the additional time it takes to tune away the increasing number of false positives. - -### Example False Positive - -Imagine deploying the CRS in front of a WordPress instance. The WordPress engine features the ability to add HTML to blog posts (as well as JavaScript, if you're an administrator). Internally, WordPress has rules controlling which HTML tags are allowed to be used. This list of allowed tags has been studied heavily by the security community and it's considered to be a secure mechanism. - -Consider the CRS inspecting a request with a URL like the following: - -``` -www.example.com/?wp_post=

Welcome+To+My+Blog

-``` - -At paranoia level 2, the `wp_post` query string parameter would trigger a match against an XSS attack rule due to the presence of HTML tags. CRS is unaware that the problem is properly mitigated on the server side and, as a result, the request causes a false positive and may be blocked. The false positive may generate an error log line like the following: - -``` -[Wed Jan 01 00:00:00.123456 2022] [:error] [pid 2357:tid 140543564093184] [client 10.0.0.1:0] [client 10.0.0.1] ModSecurity: Warning. Pattern match "<(?:a|abbr|acronym|address|applet|area|audioscope|b|base|basefront|bdo|bgsound|big|blackface|blink|blockquote|body|bq|br|button|caption|center|cite|code|col|colgroup|comment|dd|del|dfn|dir|div|dl|dt|em|embed|fieldset|fn|font|form|frame|frameset|h1|head ..." at ARGS:wp_post. [file "/etc/crs/rules/REQUEST-941-APPLICATION-ATTACK-XSS.conf"] [line "783"] [id "941320"] [msg "Possible XSS Attack Detected - HTML Tag Handler"] [data "Matched Data:

found within ARGS:wp_post:

welcome to my blog

"] [severity "CRITICAL"] [ver "OWASP_CRS/3.3.2"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-xss"] [tag "OWASP_CRS"] [tag "capec/1000/152/242/63"] [tag "PCI/6.5.1"] [tag "paranoia-level/2"] [hostname "www.example.com"] [uri "/"] [unique_id "Yad-7q03dV56xYsnGhYJlQAAAAA"] -``` - -This example log entry provides lots of information about the rule match. Some of the key pieces of information are: - -- The message from ModSecurity, which explains what happened and where: - - `ModSecurity: Warning. Pattern match "<(?:a|abbr|acronym ..." at ARGS:wp_post.` - -- The rule ID of the matched rule: - - `[id "941320"]` - -- The additional matching data from the rule, which explains precisely what caused the rule match: - - `[data "Matched Data:

found within ARGS:wp_post:

welcome to my blog

"]` - -{{% notice tip %}} -CRS ships with a prebuilt *rule exclusion package* for WordPress, as well as other popular web applications, to help prevent false positives. See the section on [rule exclusion packages]({{< ref "#rule-exclusion-packages" >}}) for details. -{{% /notice %}} - -### Why are False Positives a Problem? - -#### Alert Fatigue - -If a system is prone to reporting false positives then the alerts it raises may be ignored. This may lead to real attacks being overlooked. For this reason, leaving false positives mixed in with real attacks is dangerous: the false positives should be resolved. - -#### Sensitive Information and Regulatory Compliance - -A false positive alert may contain sensitive information, for example usernames, passwords, and payment card data. Imagine a situation where a web application user has set their password to '/bin/bash': without proper tuning, this input would cause a false positive every time the user logged in, writing the user's password to the error log file in plaintext as part of the alert. - -It's also important to consider issues surrounding regulatory compliance. Data protection and privacy laws, like GDPR and CCPA, place strict duties and limitations on what information can be gathered and how that information is processed and stored. The unnecessary logging data generated by false positives can cause problems in this regard. - -#### Poor User Experience - -When working in strict blocking mode, false positives can cause legitimate user transactions to be blocked, leading to poor user experience. This can create pressure to disable the CRS or even to remove the WAF solution entirely, which is an unnecessary sacrifice of security for usability. The correct solution to this problem is to tune away the false positives so that they don't reoccur in the future. - -## Tuning Away False Positives - -### Directly Modifying CRS Rules - -{{% notice warning %}} -Making direct modifications to CRS rule files is a bad idea and is strongly discouraged. -{{% /notice %}} - -It may seem logical to prevent false positives by modifying the offending CRS rules. If a detection pattern in a CRS rule is causing matches with genuine transactions then the pattern could be modified. **This is a bad idea.** - -*Directly modifying CRS rules essentially creates a fork of the rule set.* Any modifications made would be undone by a rule set update, meaning that any changes would need to be continually reapplied by hand. This is a tedious, time consuming, and error-prone solution. - -There are alternative ways to deal with false positives, as described below. These methods sometimes require slightly more effort and knowledge but they do not cause problems when performing rule set updates. - -### Rule Exclusions - -#### Overview - -The ModSecurity WAF engine has flexible ways to tune away false positives. It provides several *rule exclusion* (RE) mechanisms which allow rules to be modified *without* directly changing the rules themselves. This makes it possible to work with third-party rule sets, like the Core Rule Set, by adapting rules as needed while leaving the rule set files intact and unmodified. This allows for easy rule set updates. - -Two fundamentally different types of rule exclusions are supported: - -- **Configure-time rule exclusions:** Rule exclusions that are applied once, at *configure-time* (e.g. when (re)starting or reloading ModSecurity, or the server process that holds it). For example: "remove rule X at startup and never execute it." - - This type of rule exclusion takes the form of a ModSecurity directive, e.g. `SecRuleRemoveById`. - -- **Runtime rule exclusions:** Rule exclusions that are applied at *runtime* on a per-transaction basis (e.g. exclusions that can be conditionally applied to some transactions but not others). For example: "if a transaction is a POST request to the location 'login.php', remove rule X." - - This type of rule exclusion takes the form of a `SecRule`. - -{{% notice info %}} -Runtime rule exclusions, while granular and flexible, have a computational overhead, albeit a small one. A runtime rule exclusion is an extra SecRule which must be evaluated for every transaction. -{{% /notice %}} - -In addition to the two *types* of exclusions, rules can be excluded in two different *ways*: - -- **Exclude the entire rule/tag:** An entire rule, or entire category of rules (by specifying a tag), is removed and will not be executed by the rule engine. -- **Exclude a specific variable from the rule/tag:** A *specific variable* will be excluded from a specific rule, or excluded from a category of rules (by specifying a tag). - -These two methods can also operate on multiple individual rules, or even entire rule categories (identified either [by tag]({{< ref "#rule-tags" >}}) or by using a [range of rule IDs]({{< ref "#rule-ranges" >}})). - -The combinations of rule exclusion types and methods allow for writing rule exclusions of varying granularity. Very coarse rule exclusions can be written, for example "remove all SQL injection rules" using `SecRuleRemoveByTag`. Extremely granular rule exclusions can also be written, for example "for transactions to the location 'web_app_2/function.php', exclude the query string parameter 'user_id' from rule 920280" using a SecRule and the action `ctl:ruleRemoveTargetById`. - -The different rule exclusion types and methods are summarized in the table below, which presents the main ModSecurity directives and actions that can be used for each type and method of rule exclusion: - -| | Exclude entire rule/tag | Exclude specific variable from rule/tag | -| ------------------ | ---------------------------------------------- | ------------------------------------------------------ | -| **Configure-time** | `SecRuleRemoveById`\* `SecRuleRemoveByTag` | `SecRuleUpdateTargetById` `SecRuleUpdateTargetByTag` | -| **Runtime** | `ctl:ruleRemoveById`\*\* `ctl:ruleRemoveByTag` | `ctl:ruleRemoveTargetById` `ctl:ruleRemoveTargetByTag` | - -*\*Can also exclude ranges of rules or multiple space separated rules.* - -*\*\*Can also exclude ranges of rules (not currently supported in ModSecurity v3).* - -{{% notice tip %}} -This table is available as a well presented, downloadable [Rule Exclusion Cheatsheet](https://www.netnea.com/cms/rule-exclusion-cheatsheet-download) from Christian Folini. -{{% /notice %}} - -{{% notice note %}} -There's also a third group of rule exclusion directives and actions, the use of which is discouraged. As well as excluding rules "ById" and "ByTag", it's also possible to exclude "ByMsg" (`SecRuleRemoveByMsg`, `SecRuleUpdateTargetByMsg`, `ctl:ruleRemoveByMsg`, and `ctl:ruleRemoveTargetByMsg`). This excludes rules based on the message they write to the error log. These messages can be dynamic and may contain special characters. As such, trying to exclude rules by message is difficult and error-prone. -{{% /notice %}} - -#### Rule Tags - -CRS rules typically feature multiple tags, grouping them into different categories. For example, a rule might be tagged by attack type ('attack-rce', 'attack-xss', etc.), by language ('language-java', 'language-php', etc.), and by platform ('platform-apache', 'platform-unix', etc.). - -Tags can be used to remove or modify entire categories of rules all at once, but some tags are more useful than others in this regard. Tags for _specific_ attack types, languages, and platforms may be useful for writing rule exclusions. For example, if lots of the SQL injection rules are causing false positives but SQL isn't in use anywhere in the back end web application then it may be worthwhile to remove all CRS rules tagged with 'attack-sqli' (`SecRuleRemoveByTag attack-sqli`). - -Some rule tags are _not_ useful for rule exclusion purposes. For example, there are generic tags like 'language-multi' and 'platform-multi': these contain hundreds of rules across the entire CRS, and they don't represent a meaningful rule property to be useful in rule exclusions. There are also tags that categorize rules based on well known security standards, like CAPEC and PCI DSS (e.g. 'capec/1000/153/267', 'PCI/6.5.4'). These tags may be useful for informational and reporting purposes but are not useful in the context of writing rule exclusions. - -Excluding rules using tags may be more useful than excluding using rule ranges in situations where a category of rules is spread across multiple files. For example, the 'language-php' rules are spread across several different rule files (both inbound and outbound rule files). - -#### Rule Ranges - -As well as rules being tagged using different categories, CRS rules are organized into files by general category. In addition, CRS rule IDs follow a consistent numbering convention. This makes it easy to remove unwanted types of rules by removing ranges of rule IDs. For example, the file `REQUEST-913-SCANNER-DETECTION.conf` contains rules related to detecting well known scanners and crawlers, which all have rule IDs in the range 913000-913999. All of the rules in this file can be easily removed using a configure-time rule exclusion, like so: - -```apache -SecRuleRemoveById "913000-913999" -``` - -Excluding rules using rule ranges may be more useful than excluding using tags in situations where tags are less relevant or where tags vary across the rules in question. For example, a rule range may be the most appropriate solution if the goal is to remove all rules contained in a single file, regardless of how the rules are tagged. - -#### Support for Regular Expressions - -Most of the configure-time rule exclusion directives feature some level of support for using regular expressions. This makes it possible, for example, to exclude a dynamically named variable from a rule. The directives with support for regular expressions are: - -- `SecRuleRemoveByTag` - - A regular expression is used for the tag match. For example, `SecRuleRemoveByTag "injection"` would match both "attack-injection-generic" and "attack-injection-php". - -- `SecRuleRemoveByMsg` - - A regular expression is used for the message match. For example, `SecRuleRemoveByMsg "File Access"` would match both "OS File Access Attempt" and "Restricted File Access Attempt". - -- `SecRuleUpdateTargetById`, `SecRuleUpdateTargetByTag`, `SecRuleUpdateTargetByMsg` - - A regular expression can optionally be used in the target specification by enclosing the regular expression in forward slashes. This is useful for dealing with dynamically named variables, like so: - - `SecRuleUpdateTargetById 942440 "!REQUEST_COOKIES:/^uid_.*/"`. - - This example would exclude request cookies named "uid_0123456", "uid_6543210", etc. from rule 942440. - -{{% notice note %}} -The 'ctl' action for writing runtime rule exclusions does **not** support any use of regular expressions. This is a known limitation of the ModSecurity rule engine. -{{% /notice %}} - -#### Placement of Rule Exclusions - -**It is crucial to put rule exclusions in the correct place, otherwise they may not work.** - -- **Configure-time rule exclusions:** These must be placed **after** the CRS has been included in a configuration. For example: - - ```apache - # Include the ModSecurity Core Rule Set - Include crs/rules/*.conf - - # Configure-time rule exclusions - ... - ``` - - Configure-time rule exclusions *remove* rules. A rule must already be defined before it can be removed (something cannot be removed if it doesn't yet exist). As such, this type of rule exclusion must appear *after* the CRS and all its rules have been included. - -- **Runtime rule exclusions:** These must be placed **before** the CRS has been included in a configuration. For example: - - ```apache - # Runtime rule exclusions - ... - - # Include the ModSecurity Core Rule Set - Include crs/rules/*.conf - ``` - - Runtime rule exclusions *modify* rules in some way. If a rule is to be modified then this should occur before the rule is executed (modifying a rule *after* it has been executed has no effect). As such, this type of rule exclusion must appear *before* the CRS and all its rules have been included. - -{{% notice tip %}} -CRS ships with the files `REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example` and `RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example`. After dropping the ".example" suffix, these files can be used to house "BEFORE-CRS" (i.e. runtime) and "AFTER-CRS" (i.e. configure-time) rule exclusions in their correct places relative to the CRS rules. These files also contain example rule exclusions to copy and learn from. -{{% /notice %}} - -#### Example 1 *(SecRuleRemoveById)* - -*(Configure-time RE. Exclude entire rule.)* - -**Scenario:** Rule 933151, "PHP Injection Attack: Medium-Risk PHP Function Name Found", is causing false positives. The web application behind the WAF makes no use of PHP. As such, it is deemed safe to tune away this false positive by completely removing rule 933151. - -**Rule Exclusion:** - -```apache -# CRS Rule Exclusion: 933151 - PHP Injection Attack: Medium-Risk PHP Function Name Found -SecRuleRemoveById 933151 -``` - -#### Example 2 *(SecRuleRemoveByTag)* - -*(Configure-time RE. Exclude entire tag.)* - -**Scenario:** Several different parts of a web application are causing false positives with various SQL injection rules. None of the web services behind the WAF make use of SQL, so it is deemed safe to tune away these false positives by removing all the SQLi detection rules. - -**Rule Exclusion:** - -```apache -# CRS Rule Exclusion: Remove all SQLi detection rules -SecRuleRemoveByTag attack-sqli -``` - -#### Example 3 *(SecRuleUpdateTargetById)* - -*(Configure-time RE. Exclude specific variable from rule.)* - -**Scenario:** The content of a POST body parameter named 'wp_post' is causing false positives with rule 941320, "Possible XSS Attack Detected - HTML Tag Handler". Removing this rule entirely is deemed to be unacceptable: the rule is not causing any other issues, and the protection it provides should be retained for everything apart from 'wp_post'. It is decided to tune away this false positive by excluding 'wp_post' from rule 941320. - -**Rule Exclusion:** - -```apache -# CRS Rule Exclusion: 941320 - Possible XSS Attack Detected - HTML Tag Handler -SecRuleUpdateTargetById 941320 "!ARGS:wp_post" -``` - -#### Example 4 *(SecRuleUpdateTargetByTag)* - -*(Configure-time RE. Exclude specific variable from rule.)* - -**Scenario:** The values of request cookies with random names of the form 'uid_\' are causing false positives with various SQL injection rules. It is decided that it is not a risk to allow SQL-like content in cookie values, however it is deemed unacceptable to disable the SQLi detection rules for anything apart from the request cookies in question. It is decided to tune away these false positives by excluding only the problematic request cookies from the SQLi detection rules. A regular expression is to be used to handle the random string portion of the cookie names. - -**Rule Exclusion:** - -```apache -# CRS Rule Exclusion: Exclude the request cookies 'uid_' from the SQLi detection rules -SecRuleUpdateTargetByTag attack-sqli "!REQUEST_COOKIES:/^uid_.*/" -``` - -#### Example 5 *(ctl:ruleRemoveById)* - -*(Runtime RE. Exclude entire rule.)* - -**Scenario:** Rule 920230, "Multiple URL Encoding Detected", is causing false positives at the specific location '/webapp/function.php'. This is being caused by a known quirk in how the web application has been written, and it cannot be fixed in the application. It is deemed safe to tune away this false positive by removing rule 920230 for that specific location only. - -**Rule Exclusion:** - -```apache -# CRS Rule Exclusion: 920230 - Multiple URL Encoding Detected -SecRule REQUEST_URI "@beginsWith /webapp/function.php" \ - "id:1000,\ - phase:1,\ - pass,\ - nolog,\ - ctl:ruleRemoveById=920230" -``` - -#### Example 6 *(ctl:ruleRemoveByTag)* - -*(Runtime RE. Exclude entire tag.)* - -**Scenario:** Several different locations under '/web_app_1/content' are causing false positives with various SQL injection rules. Nothing under that location makes any use of SQL, so it is deemed safe to remove all the SQLi detection rules for that location. Other locations *may* make use of SQL, however, so the SQLi detection rules **must** remain in place everywhere else. It has been decided to tune away the false positives by removing all the SQLi detection rules for locations under '/web_app_1/content' only. - -**Rule Exclusion:** - -```apache -# CRS Rule Exclusion: Remove all SQLi detection rules -SecRule REQUEST_URI "@beginsWith /web_app_1/content" \ - "id:1010,\ - phase:1,\ - pass,\ - nolog,\ - ctl:ruleRemoveByTag=attack-sqli" -``` - -#### Example 7 *(ctl:ruleRemoveTargetById)* - -*(Runtime RE. Exclude specific variable from rule.)* - -**Scenario:** The content of a POST body parameter named 'text_input' is causing false positives with rule 941150, "XSS Filter - Category 5: Disallowed HTML Attributes", at the specific location '/dynamic/new_post'. Removing this rule entirely is deemed to be unacceptable: the rule is not causing any other issues, and the protection it provides should be retained for everything apart from 'text_input' at the specific problematic location. It is decided to tune away this false positive by excluding 'text_input' from rule 941150 for location '/dynamic/new_post' only. - -**Rule Exclusion:** - -```apache -# CRS Rule Exclusion: 941150 - XSS Filter - Category 5: Disallowed HTML Attributes -SecRule REQUEST_URI "@beginsWith /dynamic/new_post" \ - "id:1020,\ - phase:1,\ - pass,\ - nolog,\ - ctl:ruleRemoveTargetById=941150;ARGS:text_input" -``` - -#### Example 8 *(ctl:ruleRemoveTargetByTag)* - -*(Runtime RE. Exclude specific variable from rule.)* - -**Scenario:** The values of request cookie 'uid' are causing false positives with various SQL injection rules when trying to log in to a web service at location '/webapp/login.html'. It is decided that it is not a risk to allow SQL-like content in this specific cookie's values for the login page, however it is deemed unacceptable to disable the SQLi detection rules for anything apart from the specific request cookie in question at the login page only. It is decided to tune away these false positives by excluding only the problematic request cookie from the SQLi detection rules, and only when accessing '/webapp/login.html'. - -**Rule Exclusion:** - -```apache -# CRS Rule Exclusion: Exclude the request cookie 'uid' from the SQLi detection rules -SecRule REQUEST_URI "@beginsWith /webapp/login.html" \ - "id:1030,\ - phase:1,\ - pass,\ - nolog,\ - ctl:ruleRemoveTargetByTag=attack-sqli;REQUEST_COOKIES:uid" -``` - -{{% notice tip %}} -It's possible to write a conditional rule exclusion that tests something other than just the request URI. Conditions can be built which test, for example, the source IP address, HTTP request method, HTTP headers, and even the day of the week. - -Multiple conditions can also be chained together to create a logical AND by using ModSecurity's [chain](https://github.com/owasp-modsecurity/ModSecurity/wiki/Reference-Manual-(v2.x)#chain) action. This allows for creating powerful rule logic like "for transactions that are from source IP address 10.0.0.1 AND that are for location '/login.html', exclude the query string parameter 'user_id' from rule 920280". Extremely granular and specific rule exclusions can be written, in this way. -{{% /notice %}} - -#### Rule Exclusion Packages - -CRS ships with prebuilt *rule exclusion packages* for a selection of popular web applications. These packages contain application-specific rule exclusions designed to prevent false positives from occurring when CRS is put in front of one of these web applications. - -The packages should be viewed as a good *starting point* from which to build upon. Some false positives may still occur, for example if working at a high paranoia level, if using a very new or old version of the application, if using plug-ins, add-ons, or user customizations. - -If using a native Core Rule Set installation, rule exclusion packages can be enabled in the file `crs-setup.conf`. Modify rule 900130 to select the web applications in question, e.g. to enable the DokuWiki rule exclusion package use `setvar:tx.crs_exclusions_dokuwiki=1`, and then uncomment the rule to enable it. - -If running CRS where it has been integrated into a commercial product or CDN then support varies. Some vendors expose rule exclusion packages in the GUI while other vendors require custom rules to be written which set the necessary variables. Unfortunately, there are also vendors that don't allow rule exclusion packages to be used at all. - -{{% notice tip %}} -If running multiple web applications, it is highly recommended to enable a rule exclusion package only for the location where the corresponding web application resides. For example, to enable the WordPress rule exclusion package only for locations under '/wordpress', a rule like the following could be used: - -```apache -SecRule REQUEST_URI "@beginsWith /wordpress/" setvar:tx.crs_exclusions_wordpress=1... -``` -{{% /notice %}} - -Rule exclusion packages are currently available for the following web applications: - -- [cPanel](https://cpanel.net) -- [DokuWiki](https://www.dokuwiki.org) -- [Drupal](https://www.drupal.org) -- [Nextcloud](https://nextcloud.com) -- [phpBB](https://www.phpbb.com) -- [phpMyAdmin](https://www.phpmyadmin.net) -- [WordPress](https://wordpress.org) -- [XenForo](https://xenforo.com) - -The CRS project is always looking to work with other communities and individuals to add support for additional web applications. Please get in touch via [GitHub](https://github.com/coreruleset/coreruleset) to discuss writing a rule exclusion package for a specific web application. - -## Further Reading - - A popular tutorial titled [Handling False Positives with the OWASP ModSecurity Core Rule Set](https://www.netnea.com/cms/apache-tutorial-8_handling-false-positives-modsecurity-core-rule-set/) by Christian Folini walks through a full CRS tuning process, with examples. - -Detailed reference of each of the rule exclusion mechanisms outlined above can be found in the [ModSecurity Reference Manual](https://github.com/owasp-modsecurity/ModSecurity/wiki/Reference-Manual-(v2.x)): - -- Configure-time rule exclusion mechanisms: - - [SecRuleRemoveById](https://github.com/owasp-modsecurity/ModSecurity/wiki/Reference-Manual-(v2.x)#SecRuleRemoveById) - - [SecRuleRemoveByTag](https://github.com/owasp-modsecurity/ModSecurity/wiki/Reference-Manual-(v2.x)#SecRuleRemoveByTag) - - [SecRuleUpdateTargetById](https://github.com/owasp-modsecurity/ModSecurity/wiki/Reference-Manual-(v2.x)#SecRuleUpdateTargetById) - - [SecRuleUpdateTargetByTag](https://github.com/owasp-modsecurity/ModSecurity/wiki/Reference-Manual-(v2.x)#SecRuleUpdateTargetByTag) -- Runtime rule exclusion mechanisms: - - [The ctl action](https://github.com/owasp-modsecurity/ModSecurity/wiki/Reference-Manual-(v2.x)#ctl) diff --git a/subsite/docs/content/concepts/paranoia_levels.md b/subsite/docs/content/concepts/paranoia_levels.md deleted file mode 100644 index 23e9100..0000000 --- a/subsite/docs/content/concepts/paranoia_levels.md +++ /dev/null @@ -1,91 +0,0 @@ ---- -title: Paranoia Levels -weight: 20 -disableToc: false -chapter: false ---- - -> Paranoia levels are an essential concept when working with the Core Rule Set. This page explains the concept behind paranoia levels and how to work with them on a practical level. - -## Introduction to Paranoia Levels - -**The paranoia level (PL) makes it possible to define how aggressive the Core Rule Set is.** Paranoia level 1 (PL 1) provides a set of rules that hardly ever trigger a false alarm (ideally never, but it can happen, depending on the local setup). PL 2 provides additional rules that detect more attacks (these rules operate *in addition* to the PL 1 rules), but there's a chance that the additional rules will also trigger new false alarms over perfectly legitimate HTTP requests. - -This continues at PL 3, where more rules are added, namely for certain specialized attacks. This leads to even more false alarms. Then at PL 4, the rules are so aggressive that they detect almost every possible attack, yet they also flag a lot of legitimate traffic as malicious. - -![Onion model diagram showing the four paranoia levels as ellipses. Each successive paranoia level is a superset of the previous one.](https://coreruleset.org/docs/images/pl_onion_no_fonts.svg?width=25em) - -A higher paranoia level makes it harder for an attacker to go undetected. Yet this comes at the cost of more false positives: more false alarms. That's the downside to running a rule set that detects almost everything: your business / service / web application is also disrupted. - -When false positives occur they need to be tuned away. In ModSecurity parlance: rule exclusions need to be written. A rule exclusion is a rule that disables another rule, either disabled completely or disabled partially only for certain parameters or for certain URIs. This means **the rule set remains intact** yet the CRS installation is no longer affected by the false positives. - -{{% notice note %}} -Depending on the complexity of the service (web application) in question and on the paranoia level, the process of writing rule exclusions can be a *substantial* amount of work. - -This page won't explore the problem of handling false positives further: for more information on this topic, see the appropriate chapter or refer to the [tutorials at netnea.com](https://www.netnea.com/cms/apache-tutorials/). -{{% /notice %}} - -## Description of the Four Paranoia Levels - -The CRS project views the four paranoia levels as follows: - -| Paranoia Level | Description | -| -------------- | ----------- | -| **1** | Baseline security with a minimal need to tune away false positives. This is CRS for everybody running an HTTP server on the internet. Please report any false positives encountered with a PL 1 system [via GitHub](https://github.com/coreruleset/coreruleset/issues/new/choose). | -| **2** | Rules that are adequate when real user data is involved. Perhaps an off-the-shelf online shop. Expect to encounter false positives and learn how to tune them away. | -| **3** | Online banking level security with lots of false positives. From a project perspective, false positives are accepted and expected here, so it's important to learn how to write rule exclusions. | -| **4** | Rules that are so strong (or paranoid) they're adequate to protect the "crown jewels". To be used at one's own risk: be prepared to face a large number of false positives. | - -## Choosing an Appropriate Paranoia Level - -It's important to think about a service's security requirements. The difference between protecting a personal website and the admin gateway controlling access to an enterprise’s Active Directory are very different. The paranoia level needs to be chosen accordingly, while also considering the resources (time) required to tune away false positives at higher paranoia levels. - -Running at the highest paranoia level, PL 4, may seem appealing from a security standpoint, but *it could take many weeks to tune away the false positives encountered*. It is crucial to have enough time to fully deal with all false positives. - -{{% notice warning %}} -Failure to properly tune an installation runs the risk of exposing users to a vast number of false positives. This can lead to a poor user experience, and might ultimately lead to a decision to completely disable the Core Rule Set. As such, **setting a high PL in blocking mode *without* adequate tuning to deal with false positives is very risky**. -{{% /notice %}} - -If working in an enterprise environment, consider developing an internal policy to map the risk levels and security needs of different assets to the minimum acceptable paranoia level to be used for them, for example: - -* **Risk Class 0**: No personal data involved → PL 1 -* **Risk Class 1**: Personal data involved, e.g. names and addresses → PL 2 -* **Risk Class 2**: Sensitive data involved, e.g. financial/banking data; highest risk class → PL 3 - -## Setting the Paranoia Level - -If using a native Core Rule Set installation on a web application firewall, the paranoia level is defined by setting the variable `tx.paranoia_level` in the file `crs-setup.conf`. This is done in rule 900000, but technically the variable can be set in the Apache or Nginx configuration instead. - -If running CRS where it has been integrated into a commercial product or CDN then support varies. Some vendors expose the PL setting in the GUI while other vendors require a custom rule to be written that sets `tx.paranoia_level`. Unfortunately, there are also vendors that don't allow the PL to be set at all. (The CRS project considers this to be an incomplete Core Rule Set integration, since paranoia levels are a defining feature of the Core Rule Set.) - -## How Paranoia Levels Relate to Anomaly Scoring - -It's important to understand that paranoia levels and CRS anomaly scoring (the CRS anomaly threshold/limit) are **two entirely different things with no direct connection**. The paranoia level controls the number of rules that are enabled while the anomaly threshold defines how many rules can be triggered before a request is blocked. - -At the conceptual level, these two ideas *could* be mixed if the goal was to create a particularly granular security concept. For example, saying "we define the anomaly threshold to be 10, but we compensate for this by running at paranoia level 3, which we acknowledge brings more rule alerts and higher anomaly scores." - -This is *technically* correct but it overlooks the fact that there are attack categories where CRS scores very low. For example, there is a plan to introduce a new rule to detect POP3 and IMAP injections: this will be a single rule, so, under normal circumstances, an IMAP injection would never score more than 5. Therefore, an installation running at an anomaly threshold of 10 could never block an IMAP injection, even if running at PL 3. In light of this, it's generally advised to **keep things simple and separate**: a CRS installation should aim for an anomaly threshold of 5 and a paranoia level as deemed appropriate. - -## Moving to a Higher Paranoia Level - -### Introducing the *Executing Paranoia Level* - -Consider an example successful CRS installation: it operates at paranoia level 1, a handful of rule exclusions are in place to deal with false positives, and the inbound anomaly score threshold is set to 5 which blocks would-be attackers immediately. Things are running smoothly at paranoia level 1, but imagine that there's now a requirement to increase the level of security by raising the paranoia level to 2. Moving to PL 2 will *almost certainly* cause new false positives: given the strict anomaly score threshold of 5, these will likely cause legitimate users to be blocked. - -There's a simple, but **risky**, way to raise the paranoia level of a working and tuned CRS installation: raise the anomaly score threshold for a period of time, in order to account for the additional false positives that are anticipated. Raising the anomaly score threshold will allow through attacks that would have been blocked previously. The idea of *decreasing* security in order to *improve* it is counter-intuitive, as well as being bad practice. - -There is a better solution. First, think of the paranoia level as being the "blocking paranoia level". The rules enabled in the blocking paranoia level count towards the anomaly score threshold, which is used to determine whether or not to block a given request. Now introduce an *additional* paranoia level: the "executing paranoia level". By default, the executing paranoia level is automatically set to be equal to the blocking paranoia level. If, however, the executing paranoia level is set to be *higher* than the blocking paranoia level then the additional rules from the higher paranoia level are *executed* but will never count towards the anomaly score threshold used to make the blocking decision. - -*Example: Blocking paranoia level of 1 and executing paranoia level of 2* - -![Diagram showing a scenario where the blocking paranoia level and the executing paranoia level are different. The active and inactive paranoia levels are emphasized to explain the concept.](https://coreruleset.org/assets/uploads/2021/10/executing-paranoia-level-1.png?width=25em) - -**The executing paranoia level allows rules from a higher paranoia level to be run, and potentially to trigger false positives, without increasing the probability of blocking legitimate users.** Any new false positives can then be tuned away using rule exclusions. Once ready and with all the new rule exclusions in place, the blocking paranoia level can then be raised to match the executing paranoia level. This approach is a flexible and secure way to raise the paranoia level on a working production system *without* the risk of new false positives blocking users in error. - -## Moving to a Lower Paranoia Level - -It is always possible to lower the paranoia level in order to experience fewer false positives, or none at all. The way that the rule set is constructed, lowering the paranoia level *always* means fewer or no false positives; raising the paranoia level is *very likely* to introduce more false positives. - -## Further Reading - -For a slightly longer explanation of paranoia levels, please refer to [our blog post on the subject](https://coreruleset.org/20211028/working-with-paranoia-levels/). The blog post also discusses the pros and cons of dynamically setting the paranoia level on a per-request basis, firstly by geolocation (i.e. a lower PL for domestic traffic and a higher PL for non-domestic traffic) and secondly based on previous behavior (i.e. a user is dealt with at PL 1, but if they ever trigger a rule then they're handled at PL 2 for all future requests). diff --git a/subsite/docs/content/concepts/plugins.md b/subsite/docs/content/concepts/plugins.md deleted file mode 100644 index 42a8ef8..0000000 --- a/subsite/docs/content/concepts/plugins.md +++ /dev/null @@ -1,128 +0,0 @@ ---- -title: Plugin Mechanism -weight: 40 -disableToc: false -chapter: false ---- - -> The CRS plugin mechanism allows the rule set to be extended in specific, experimental, or unusual ways, as this page explains. - -{{% notice note %}} -Plugins are not part of the CRS 3.3.x release line. They are released officially with CRS 4.0. In the meantime, plugins _can_ be used with one of the stable releases by following the instructions presented below. -{{% /notice %}} - -## What are Plugins? - -Plugins are sets of additional rules that can be plugged in to a web application firewall in order to expand CRS with complementary functionality or to interact with CRS. **Rule exclusion plugins** are a special case: these are plugins that disable certain rules to integrate CRS in to a context that is otherwise likely to trigger certain false alarms. - -## Why are Plugins Needed? - -Installing only a minimal set of rules is desirable from a security perspective. A term often used is "minimizing the attack window". For CRS, this means that by having fewer rules, it is less likely to deploy a bug. In the past, CRS had a major bug in one of the rule exclusion packages which affected every standard CRS installation (see [CVE-2021-41773](https://coreruleset.org/20210630/cve-2021-35368-crs-request-body-bypass/)). By moving all rule exclusion packages into optional plugins, the risk is reduced in this regard. As such, security is a prime driver for the use of plugins. - -A second driver is the need for certain functionality that does not belong in mainline CRS releases. Typical candidates include the following: - -* ModSecurity features deemed too exotic for mainline, like the use of Lua scripting -* New rules that are not yet trusted enough to integrate into the mainline -* Specialized functionality with a very limited audience - -A plugin might also evolve quicker than the slow release cycle of stable CRS releases. That way, a new and perhaps experimental plugin can be updated quickly. - -Finally, there is a need to allow third parties to write plugins that interact with CRS. This was previously very difficult to manage, but with plugins everybody has the opportunity to write anomaly scoring rules. - -## How do Plugins Work Conceptually? - -Plugins are a set of rules. These rules can run in any phase, but in practice it is expected that most of them run in phase 1 and, especially, in phase 2, just like the rules in CRS. The rules of a plugin are separated into a rule file that is loaded *before* the CRS rules are loaded and a rule file with rules to be executed *after* the CRS rules are executed. - -Optionally, a plugin can also have a separate configuration file with rules that configure the plugin, just like the `crs-setup.conf` configuration file. - -The order of execution is as follows: - -* CRS configuration -* Plugin configuration -* Plugin rules before CRS rules -* CRS rules -* Plugin rules after CRS rules - -This can be mapped almost 1:1 to the `Includes` involved: - -```apache -Include crs/crs-setup.conf - -Include crs/plugins/*-config.conf -Include crs/plugins/*-before.conf - -Include crs/rules/*.conf - -Include crs/plugins/*-after.conf -``` - -The two existing CRS `Include` statements are complemented with three additional generic plugin `Includes`. This means CRS is configured first, then the plugins are configured (if any), then the first batch of plugin rules are executed, followed by the main CRS rules, and finally the second batch of plugin rules run, after CRS. - -## How to Install a Plugin - -The first step is to prepare the plugin folder. - -CRS 4.x will come with a plugins folder next to the rules folder. When using an older CRS release *without* a plugins folder, create one and place three empty config files in it (e.g. by using the shell command `touch`): - -``` -crs/plugins/empty-config.conf -crs/plugins/empty-before.conf -crs/plugins/empty-after.conf -``` - -These empty rule files ensure that the web server does not fail when `Include`-ing `*.conf` if there are no plugin files present. - -{{% notice info %}} -Apache supports the `IncludeOptional` directive, but that is not available on *all* web servers, so `Include` is used here in the interests of having consistent and simple documentation. -{{% /notice %}} - -For the installation, there are two methods: - -### Method 1: Copying the plugin files - -This is the simple way. Download or copy the plugin files, which are likely rules and data files, and put them in the plugins folder of the CRS installation, as prepared above. - -There is a chance that a plugin configuration file comes with a `.example` suffix in the filename, like the `crs-setup.conf.example` configuration file in the CRS release. If that's the case then rename the plugin configuration file by removing the suffix. - -Be sure to look at the configuration file and see if there is anything that needs to be configured. - -Finally, reload the WAF and the plugin should be active. - -### Method 2: Placing symbolic links to separate plugin files downloaded elsewhere - -This is the more advanced setup and the one that's in sync with many Linux distributions. - -With this approach, download the plugin to a separate location and put a symlink to each individual file in the plugins folder. If the plugin's configuration file comes with a `.example` suffix then that file needs to be renamed first. - -With this approach it's easier to upgrade and downgrade a plugin by simply changing the symlink to point to a different version of the plugin. It's also possible to `git checkout` the plugin and pull the latest version when there's an update. It's not possible to do this in the plugins folder itself, namely when multiple plugins need to be installed side by side. - -This symlink setup also makes it possible to `git clone` the latest version of a plugin and update it in the future without further ado. **Be sure to pay attention to any updates in the config file, however.** - -If updating plugins this way, there's a chance of missing out a new variable that's defined in the latest version of the plugin's config file. Plugin authors should make sure this is not happening to plugin users by adding a rule that checks for the existence of all config variables in the *Before-File*. Examples of this can be found in CRS file `REQUEST-901-INITIALIZATION.conf`. - -## How to Disable a Plugin - -Disabling a plugin is simple. Either remove the plugin files in the plugins folder or, if installed using the symlink method, remove the symlinks to the real files. Working with symlinks is considered to be a 'cleaner' approach, since the plugin files remain available to re-enable in the future. - -Alternatively, it is also valid to disable a plugin by renaming a plugin file from `plugin-before.conf` to `plugin-before.conf.disabled`. - -## What Plugins are Available? - -All official plugins are listed on GitHub in the CRS plugin registry repository: https://github.com/coreruleset/plugin-registry. - -Available plugins include: - -* **Template Plugin:** This is the example plugin for getting started. -* **Auto-Decoding Plugin:** This uses ModSecurity transformations to decode encoded payloads before applying CRS rules at PL 3 and double-decoding payloads at PL 4. -* **Antivirus Plugin:** This helps to integrate an antivirus scanner into CRS. -* **Body-Decompress Plugin:** This decompresses/unzips the response body for inspection by CRS. -* **Fake-Bot Plugin:** This performs a reverse DNS lookup on IP addresses pretending to be a search engine. -* **Incubator Plugin:** This plugin allows non-scoring rules to be tested in production before pushing them into the mainline. - -## How to Write a Plugin - -For information on writing a new plugin, refer to the development documentation on [writing plugins]({{< ref "plugin_writing.md" >}}). - -## Collection Timeout - -If plugins need to work with collections and set a custom `SecCollectionTimeout` outside of the default 3600 seconds defined by the ModSecurity engine, the plugin should either set it in its configuration or indicate the desired value in the plugin documentation. CRS used to define `SecCollectionTimeout` in `crs-setup.conf` before but removed this setting with the introduction of plugins for CRS v4. That's because CRS itself does not work with collections anymore. diff --git a/subsite/docs/content/concepts/sampling_mode.md b/subsite/docs/content/concepts/sampling_mode.md deleted file mode 100644 index a68f55b..0000000 --- a/subsite/docs/content/concepts/sampling_mode.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -title: Sampling Mode -weight: 50 -disableToc: false -chapter: false ---- - -> Sampling mode makes it possible to apply the Core Rule Set to a limited percentage of traffic only. This may be useful in certain scenarios when enabling CRS for the first time, as this page explains. - -## Introduction to Sampling Mode - -The Core Rule Set's sampling mode mechanism was first introduced in version 3.0.0 in 2016. Although the feature has been available since then, it’s rarely used in practice, partly due to it being one of the lesser-known features of CRS. - -When deploying ModSecurity and CRS in front of an existing web service for the first time, it's difficult to predict what's going to happen when CRS is turned on. A well-developed test environment can help, but it's rare to find an installation where real world traffic can be reproduced 1:1 on a test setup. As such, fully enabling ModSecurity and CRS can be something of a leap into the unknown, and potentially very disruptive. This scenario prompted the introduction of CRS 3's sampling mode. - -**Sampling mode makes it possible to run CRS on a limited percentage of traffic.** The remaining traffic will bypass the rule set. If it turns out that ModSecurity is extremely disruptive or if the rules are too resource heavy for the server, only a limited percentage of the total traffic can be negatively affected (for example, only 1%). This significantly reduces the potential impact and risk of enabling CRS, especially when the logs are being monitored and the deployment can be rolled back if the alerts start to pile up. - -Using sampling mode means that CRS offers relatively little security if the sampling percentage is set to be low. The idea, however, is to increase the percentage over time, from 1% to 2%, to 5%, 10%, 20%, 50%, and ultimately to 100%, where the rules are applied to all traffic. - -**The default sampling percentage of CRS is 100%.** As such, if sampling is not of interest then the option can be safely ignored. - -## Applying Sampling Mode - -Sampling mode is controlled by setting the *sampling percentage*. This is defined in the `crs-setup.conf` configuration file and can be found in the rule with ID 900400. To use sampling mode, uncomment this rule and set the variable `tx.sampling_percentage` to the desired value: - -```apache -SecAction "id:900400,\ - phase:1,\ - pass,\ - nolog,\ - setvar:tx.sampling_percentage=50" -``` - -To test sampling mode, set the sampling percentage to 50 (which represents 50%), reload the server, and issue a few requests featuring a payload resembling an exploit. For example: - -```bash -$ curl -v http://localhost/index.html?test=/etc/passwd -``` - -* If the Core Rule Set is applied to the transaction *(and the inbound anomaly threshold is set to 10 or lower)* then a `403 Forbidden` status code will be returned, since the request causes two critical rules to match, by default. -* If sampling mode is triggered for the transaction (with a 50% probability) then the rule set will be bypassed and an ordinary response will be received, e.g. a `200 OK` status code. - -In the latter case, where sampling mode is triggered and CRS is bypassed, an alert like the following can be found in the error log: - -``` -[Wed Jan 01 00:00:00.123456 2022] [:error] [pid 3728:tid 139664291870464] [client 10.0.0.1:0] [client 10.0.0.1] ModSecurity: Warning. Match of "lt %{tx.sampling_percentage}" against "TX:sampling_rnd100" required. [file "/etc/crs/rules/REQUEST-901-INITIALIZATION.conf"] [line "434"] [id "901450"] [msg "Sampling: Disable the rule engine based on sampling_percentage 50 and random number 81"] [ver "OWASP_CRS/3.3.2"] [hostname "www.example.com"] [uri "/index.html"] [unique_id "YgBKx4BqNoKe-XoGhPCPtAAAAIQ"] -``` - -Here, CRS reports that it disabled the rule engine because the random number was above the sampling limit. The sampling percentage is set at the desired level, the rule set generates a random integer in the range 0-99 per-transaction, and if it’s *above* the sampling percentage then the WAF is disabled for the remainder of the transaction. - -{{% notice warning %}} -As sampling mode works by selectively disabling the ModSecurity WAF engine, if *other rule sets* are installed then they will be bypassed too. -{{% /notice %}} - -* For requests where the rule set is bypassed, a log entry is emitted by rule 901450. -* For the other requests, those without a corresponding 901450 entry, the rule set is applied normally. - -### Disabling Sampling Mode Log Entries - -If the log entires generated by rule 901450 seem excessive in volume then the rule can be silenced by applying the following directive, either after the CRS include statement or in the file `RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf`: - -```apache -SecRuleUpdateActionById 901450 "nolog" -``` - -## Rollback - -If CRS is deployed in front of a large service and sampling mode is in use, with a low sampling rate defined, if the logs *still* start piling up then it may be desirable to completely disable CRS. Rather than carrying out a full rollback of the deployment, the quickest solution is to define `tx.sampling_percentage` to be 0, which means that *every request will bypass the WAF* (a sampling percentage of 0%: "sample 0% of traffic"). This will take effect once the web server has been reloaded so that it picks up the modified configuration. This leaves ModSecurity and CRS installed and ready for use, but completely disabled. - -## Random Number Generation - -ModSecurity has no built-in functionality to return random numbers, forcing CRS to find entropy for itself. It does this by taking advantage of the fact that the `UNIQUE_ID` variable, which identifies each request with a token that's guaranteed to be unique, has a random element to it. This is the entropy that's used for sampling. - -Rule 901410 hashes the unique ID and encodes the result as a string of hexadecimal characters. The first two *digits* of the string are then extracted to get a random number from 0 to 99. In the extremely rare case where the hex encoded hash doesn't contain a digit, there's a fallback routine in place which takes the last digits of the `DURATION` variable. - -The random numbers generated using this method are not cryptographically secure, but they are sufficient for the purposes of sampling. diff --git a/subsite/docs/content/deployment/_index.md b/subsite/docs/content/deployment/_index.md deleted file mode 100644 index cbe5817..0000000 --- a/subsite/docs/content/deployment/_index.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Getting CRS -weight: 10 -pre: "1. " -chapter: true ---- - -# Getting CRS diff --git a/subsite/docs/content/deployment/engine_integration_options.md b/subsite/docs/content/deployment/engine_integration_options.md deleted file mode 100644 index 4d70dbd..0000000 --- a/subsite/docs/content/deployment/engine_integration_options.md +++ /dev/null @@ -1,146 +0,0 @@ ---- -title: Engine and Integration Options -weight: 10 -disableToc: false -chapter: false ---- - -> The Core Rule Set runs on WAF engines that are compatible with a subset of ModSecurity's SecLang configuration language. There are several options outside of ModSecurity itself, namely cloud offerings and content delivery network (CDN) services. There is also an open-source alternative to ModSecurity in the form of the new Coraza WAF engine. - -## Compatible Free and Open-Source WAF Engines - -### ModSecurity v2 - -ModSecurity v2, originally a security module for the Apache web server, is **the reference implementation for CRS**. - -ModSecurity 2.9.x passes 100% of the CRS unit tests on the Apache platform. - -When running ModSecurity, this is the option that is *practically guaranteed* to work with most documentation and know-how all around. - -ModSecurity is released under the Apache License 2.0. It is primarily developed by Spiderlabs, an entity within the company Trustwave. In summer 2021, Trustwave announced their plans to end development of ModSecurity in 2024. Attempts to convince Trustwave to hand over the project in the meantime, in the interests of guaranteeing the project's continuation, have failed. Trustwave have stated that they will not relinquish control of the project before 2024. - -As of this writing, there is no imminent need to leave the ModSecurity v2 platform, but such a step may become necessary in the future as the project's development stalls or new security problems can no longer be fixed. Despite these difficulties, the CRS community is confident it has the power and knowledge to provide ModSecurity patches if really needed. - -To learn more about the situation around ModSecurity, read [this CRS blog post](https://coreruleset.org/20211222/talking-about-modsecurity-and-the-new-coraza-waf/) discussing the matter. - -There is a [ModSecurity v2 / Apache Docker container](https://github.com/coreruleset/modsecurity-crs-docker) which is maintained by the CRS project. - -### ModSecurity v3 - -ModSecurity v3, also known as *libModSecurity*, is a re-implementation of ModSecurity v3 with an architecture that is less dependent on the web server. The connection between the standalone ModSecurity and the web server is made using a lean connector module. - -As of spring 2021, *only the Nginx connector module is really usable in production*. - -ModSecurity v3 fails with 2-4% of the CRS unit tests due to bugs and implementation gaps. Nginx + ModSecurity v3 also suffers from performance problems when compared to the Apache + ModSecurity v2 platform. This may be surprising for people familiar with the high performance of Nginx. - -ModSecurity v3 is used in production together with Nginx, but the CRS project recommends to use the ModSecurity v2 release line with Apache. - -ModSecurity is released under the Apache License 2.0. It is primarily developed by Spiderlabs, an entity within the company Trustwave. In summer 2021, Trustwave announced their plans to end development of ModSecurity in 2024. Attempts to convince Trustwave to hand over the project in the meantime, in the interests of guaranteeing the project's continuation, have failed. Trustwave have stated that they will not relinquish control of the project before 2024. - -To learn more about the situation around ModSecurity, read [this CRS blog post](https://coreruleset.org/20211222/talking-about-modsecurity-and-the-new-coraza-waf/) discussing the matter. - -There is a [ModSecurity v3 / Nginx Docker container](https://github.com/coreruleset/modsecurity-crs-docker) which is maintained by the CRS project. - -### Coraza - -The new [OWASP Coraza WAF](https://coraza.io/) is meant to provide an open-source alternative to the two ModSecurity release lines. - -Coraza passes 100% of the CRS v4 test suite and is thus *fully compatible with CRS*. - -Coraza has been developed in Go and currently runs on the Caddy and Traefik platforms. Additional ports are being developed and the developers also seek to bring Coraza to Nginx and, eventually, Apache. In parallel to this expansion, Coraza will be developed further with its own feature set. - -To learn more about CRS and Coraza, read [this CRS blog post](https://coreruleset.org/20211222/talking-about-modsecurity-and-the-new-coraza-waf/) which introduces Coraza. - -## Commercial WAF Appliances - -Dozens of commercial WAFs, both virtual and hardware-based, offer CRS as part of their service. Many of them use ModSecurity underneath, or some alternative implementation (although this is rare on the WAF appliance approach). Most of these commercial WAFs either don't offer the full feature set of CRS or they don't make it easily accessible. With some of these companies, there is often also a lack of CRS experience and knowledge. - -The CRS project recommends evaluating these commercial appliance-based offerings in a holistic way before buying a license. - -In light of the many, many appliance offerings on the market and the CRS project's relatively limited exposure, only a few offerings are listed here. - -### HAProxy Technologies - -HAProxy Technologies embeds ModSecurity v3 in three of its products via the Libmodsecurity module. ModSecurity is included with: HAProxy Enterprise, HAProxy ALOHA, and HAProxy Enterprise Kubernetes Ingress Controller. - -To learn more, visit the [HAProxy WAF solution page on haproxy.com](https://www.haproxy.com/solutions/web-application-firewall). - -### Kemp/Progressive LoadMaster - -The Kemp LoadMaster is a popular load balancer that integrates ModSecurity v2 and CRS in a typical way. It goes further than the competition with the support of most CRS features. - -To learn more, read [this blog post about CRS on LoadMaster](https://kemptechnologies.com/blog/how-to-run-owasp-open-web-application-security-project-i-kemp-load-master/). - -Kemp/Progressive is a sponsor of CRS. - -### Loadbalancer.org - -The load balancer appliance from Loadbalancer.org features WAF functionality based on Apache + ModSecurity v2 + CRS, sandwiched by HAProxy for load balancing. It's available as a hardware, virtual, and cloud appliance. - -To learn more, read [this blog post about CRS at Loadbalancer.org](https://www.loadbalancer.org/blog/simplifying-web-application-security-with-the-core-rule-set-v3/). - -### Avi Networks "Vantage" - -Avi Vantage from Avi Networks is a modern virtual load balancer and proxy with strong WAF capabilities. It's based on a fork of ModSecurity v3. - -To learn more, read [Avi's WAF documentation](https://avinetworks.com/docs/21.1/waf-configuring/). - -## Existing CRS Integrations: Cloud and CDN Offerings - -Most big cloud providers and CDNs provide a CRS offering. While originally these were mostly based on ModSecurity, over time they have all moved to alternative (usually proprietary) implementations of ModSecurity's SecLang configuration language, or they transpose the CRS rules written in SecLang into their own domain specific language (DSL). - -The CRS project has some insight into some of these platforms and is in touch with most of these providers. The *exact specifics* are not really known, however, but what *is* known is that almost all of these integrators compromised and provide a *subset* of CRS rules and a *subset* of features, in the interests of ease of integration and operation. - -{{% notice info %}} -The [CRS Status page project](https://github.com/coreruleset/coreruleset/wiki/DevRetreat21StatusPage) will be testing cloud and CDN offerings. As part of this effort, the CRS project will be documenting the results and even publishing code on how to quickly get started using CRS in CDN/cloud providers. This status page project is in development as of spring 2022. -{{% /notice %}} - -A selection of these platforms are listed below, along with links to get more info. - -### AWS WAF - -{{% notice note %}} -AWS provides a rule set called the ["Core rule set (CRS) managed rule group"](https://docs.aws.amazon.com/waf/latest/developerguide/aws-managed-rule-groups-baseline.html) which "…provides protection against… commonly occurring vulnerabilities described in OWASP publications such as OWASP Top 10." - -The CRS project does **not** believe that the AWS WAF "core rule set" is based on or related to the OWASP Core Rule Set. -{{% /notice %}} - -### Cloudflare WAF - -Cloudflare WAF supports CRS as one of its WAF rule sets. Documentation on how to use it can be found in [Cloudflare's documentation](https://developers.cloudflare.com/waf/managed-rulesets/owasp-core-ruleset/). - -### Edgecast - -Edgecast offers CRS as a managed rule set as part of their WAF service that runs on a ModSecurity re-implementation called WAFLZ. - -To learn more about Edgecast, read [their WAF documentation](https://docs.edgecast.com/cdn/Content/Web-Security/Managed-Rules.htm#RuleSet). - -### Fastly - -Fastly has offered CRS as part of their Fastly WAF for several years, but they have started to migrate their existing customers to the recently acquired Signal Sciences WAF. Interestingly, Fastly is transposing CRS rules into their own Varnish-based WAF engine. - -For more information about the Fastly CRS offering, read [their WAF documentation](https://docs.fastly.com/en/guides/fastly-waf-rule-set-updates-maintenance-legacy). - -### Google Cloud Armor - -Google integrates CRS into its Cloud Armor WAF offering. Google runs the CRS rules on their own WAF engine. As of fall 2022, Google offers version 3.3.2 of CRS. - -To learn more about CRS on Google's Cloud Armor, read [this document from Google](https://cloud.google.com/armor/docs/rule-tuning). - -Google Cloud Armor is a sponsor of CRS. - -### Microsoft Azure WAF - -Azure Application Gateways can be configured to use the WAFv2 and [managed rules with different versions of CRS](https://docs.microsoft.com/en-us/azure/web-application-firewall/ag/application-gateway-crs-rulegroups-rules). Azure provides the 3.2, 3.1, 3.0, and 2.2.9 CRS versions. **We recommend using version 3.2** (see our [security policy](https://github.com/coreruleset/coreruleset/blob/{{< param crs_dev_branch >}}/SECURITY.md) for details on supported CRS versions). - -### Oracle WAF - -The Oracle WAF is a cloud-based offering that includes CRS. To learn more, read [Oracle's WAF documentation](https://docs.oracle.com/en-us/iaas/Content/WAF/Concepts/waftuning.htm). - -## Alternative Use Cases - -Outside of the narrower implementation of a WAF, CRS can also be found in different security-related setups. - -### Sqreen/Datadog - -Sqreen uses a subset of CRS as an innovative part of their RASP offering. A few pieces of information about this offering can be found in [this Sqreen blog post](https://blog.sqreen.com/sqreen-october-release/). diff --git a/subsite/docs/content/deployment/extended_install.md b/subsite/docs/content/deployment/extended_install.md deleted file mode 100644 index 9aa5f5a..0000000 --- a/subsite/docs/content/deployment/extended_install.md +++ /dev/null @@ -1,237 +0,0 @@ ---- -title: Extended Install -weight: 30 -disableToc: false -chapter: false ---- - -> All the information needed to properly install CRS is presented on this page. The installation concepts are expanded upon and presented in more detail than the [quick start guide]({{< ref "install.md" >}}). - -## Contact Us - -To contact the CRS project with questions or problems, reach out via the project's [Google group](https://groups.google.com/a/owasp.org/forum/#!forum/modsecurity-core-rule-set-project) or [Slack channel](https://owasp.slack.com/archives/CBKGH8A5P) (for Slack channel access, [use this link](https://owasp.org/slack/invite) to get an invite). - -## Prerequisites - -Installing the CRS isn't very difficult but does have one major requirement: *a compatible engine*. The reference engine used throughout this page is ModSecurity. - -{{% notice note %}} -In order to successfully run CRS `3.x` using ModSecurity it is recommended to use the latest version available. For Nginx use the `3.x` branch of ModSecurity, and for Apache use the latest `2.x` branch. -{{% /notice %}} - -## Installing a Compatible WAF Engine - -Two different methods to get an engine up and running are presented here: - -- using the chosen engine as provided and packaged by the OS distribution -- compiling the chosen engine from source - -A ModSecurity installation is presented in the examples below, however the install documentation for the Coraza engine can be found [here](https://www.coraza.io). - -### Option 1: Installing Pre-Packaged ModSecurity - -ModSecurity is frequently pre-packaged and is available from several major Linux distributions. - -- **Debian:** Friends of the CRS project [DigitalWave](https://modsecurity.digitalwave.hu) package and, most importantly, **keep ModSecurity updated** for Debian and derivatives. -- **Fedora:** Execute `dnf install mod_security` for Apache + ModSecurity v2. -- **RHEL compatible:** Install EPEL and then execute `yum install mod_security`. - -For Windows, get the latest MSI package from https://github.com/owasp-modsecurity/ModSecurity/releases. - -{{% notice warning %}} -**Distributions might not update their ModSecurity releases frequently.** - -As a result, it is quite likely that a distribution's version of ModSecurity may be missing important features or **may even contain security vulnerabilities**. Additionally, depending on the package and package manager used, the ModSecurity configuration will be laid out slightly differently. -{{% /notice %}} - -As the different engines and distributions have different layouts for their configuration, to simplify the documentation presented here the prefix `/` will be used from this point on. - -Examples of `/` include: - -- `/etc/apache2` in Debian and derivatives -- `/etc/httpd` in RHEL and derivatives -- `/usr/local/apache2` if Apache was compiled from source using the default prefix -- `C:\Program Files\ModSecurity IIS\` (or Program Files(x86), depending on configuration) on Windows -- `/etc/nginx` - -### Option 2: Compiling ModSecurity From Source - -Compiling ModSecurity is easy, but slightly outside the scope of this document. For information on how to compile ModSecurity, refer to: - -- the official [ModSecurity documentation](https://github.com/owasp-modsecurity/ModSecurity/wiki) on GitHub -- the compilation recipes for ModSecurity v3 on the [ModSecurity wiki](https://github.com/owasp-modsecurity/ModSecurity/wiki/Compilation-recipes-for-v3.x) -- the netnea tutorials for [Apache](https://www.netnea.com/cms/apache-tutorial-6_embedding-modsecurity/) or [Nginx](https://www.netnea.com/cms/nginx-tutorial-6_embedding-modsecurity/) - -{{% notice warning "Unsupported Configurations" "skull-crossbones" %}} -Note that the following configurations are **not** supported. They do **not** work as expected. The CRS project recommendation is to *avoid these setups*: - -- Nginx with ModSecurity v2 -- Apache with ModSecurity v3 -{{% /notice %}} - -#### Testing the Compiled Module - -Once ModSecurity has been compiled, there is a simple test to see if the installation is working as expected. After compiling from source, use the appropriate directive to **load the newly compiled module** into the web server. For example: - -- **Apache:** `LoadModule security2_module modules/mod_security2.so` -- **Nginx:** `load_module modules/ngx_http_modsecurity_module.so;` - -Now restart the web server. ModSecurity should output that it's being used. - -Nginx should show something like: - -``` -2022/04/21 23:45:52 [notice] 1#1: ModSecurity-nginx v1.0.2 (rules loaded inline/local/remote: 0/6/0) -``` - -Apache should show something like: - -``` -[Thu Apr 21 23:55:35.142945 2022] [:notice] [pid 2528:tid 140410548673600] ModSecurity for Apache/2.9.3 (http://www.modsecurity.org/) configured. -[Thu Apr 21 23:55:35.142980 2022] [:notice] [pid 2528:tid 140410548673600] ModSecurity: APR compiled version="1.6.5"; loaded version="1.6.5" -[Thu Apr 21 23:55:35.142985 2022] [:notice] [pid 2528:tid 140410548673600] ModSecurity: PCRE compiled version="8.39 "; loaded version="8.39 2016-06-14" -[Thu Apr 21 23:55:35.142988 2022] [:notice] [pid 2528:tid 140410548673600] ModSecurity: LUA compiled version="Lua 5.1" -[Thu Apr 21 23:55:35.142991 2022] [:notice] [pid 2528:tid 140410548673600] ModSecurity: YAJL compiled version="2.1.0" -[Thu Apr 21 23:55:35.142994 2022] [:notice] [pid 2528:tid 140410548673600] ModSecurity: LIBXML compiled version="2.9.4" -[Thu Apr 21 23:55:35.142997 2022] [:notice] [pid 2528:tid 140410548673600] ModSecurity: Status engine is currently disabled, enable it by set SecStatusEngine to On. -[Thu Apr 21 23:55:35.187082 2022] [mpm_event:notice] [pid 2530:tid 140410548673600] AH00489: Apache/2.4.41 (Ubuntu) configured -- resuming normal operations -[Thu Apr 21 23:55:35.187125 2022] [core:notice] [pid 2530:tid 140410548673600] AH00094: Command line: '/usr/sbin/apache2' -``` - -##### Microsoft IIS with ModSecurity 2.x - -The initial configuration file is `modsecurity_iis.conf`. This file will be parsed by ModSecurity for both ModSecurity directives and `'Include'` directives. - -Additionally, in the Event Viewer, under `Windows Logs\Application`, it should be possible to see a new log entry showing ModSecurity being successfully loaded. - -At this stage, the ModSecurity on IIS setup is working and new directives can be placed in the configuration file as needed. - -## Downloading the OWASP Core Rule Set - -With a compatible WAF engine installed and working, the next step is typically to download and install the OWASP CRS. The CRS project strongly recommends using a [supported version](https://github.com/coreruleset/coreruleset/security/policy). - -Official CRS releases can be found at the following URL: https://github.com/coreruleset/coreruleset/releases. - -For *production* environments, it is recommended to use the latest release, which is v{{< param crs_latest_release >}}. For *testing* the bleeding edge CRS version, nightly releases are also provided. - -### Verifying Releases - -{{% notice note %}} -Releases are signed using the CRS project's [GPG key](https://coreruleset.org/security.asc) (fingerprint: 3600 6F0E 0BA1 6783 2158 8211 38EE ACA1 AB8A 6E72). Releases can be verified using GPG/PGP compatible tooling. - -To retrieve the CRS project's public key from public key servers using `gpg`, execute: `gpg --keyserver pgp.mit.edu --recv 0x38EEACA1AB8A6E72` (this ID should be equal to the last sixteen hex characters in the fingerprint). - -It is also possible to use `gpg --fetch-key https://coreruleset.org/security.asc` to retrieve the key directly. -{{% /notice %}} - -The following steps assume that a \*nix operating system is being used. Installation is similar on Windows but likely involves using a zip file from the CRS [releases page](https://github.com/coreruleset/coreruleset/releases). - -To download the release file and the corresponding signature: - -```bash -wget https://github.com/coreruleset/coreruleset/archive/refs/tags/v{{< param crs_latest_release >}}.tar.gz -wget https://github.com/coreruleset/coreruleset/releases/download/v{{< param crs_latest_release >}}/coreruleset-{{< param crs_latest_release >}}.tar.gz.asc -``` - -To verify the integrity of the release: - -```bash -gpg --verify coreruleset-{{< param crs_latest_release >}}.tar.gz.asc v{{< param crs_latest_release >}}.tar.gz -gpg: Signature made Wed Jun 30 10:05:48 2021 -03 -gpg: using RSA key 36006F0E0BA167832158821138EEACA1AB8A6E72 -gpg: Good signature from "OWASP Core Rule Set " [unknown] -gpg: WARNING: This key is not certified with a trusted signature! -gpg: There is no indication that the signature belongs to the owner. -Primary key fingerprint: 3600 6F0E 0BA1 6783 2158 8211 38EE ACA1 AB8A 6E72 -``` - -If the signature was good then the verification succeeds. If a warning is displayed, like the above, it means the CRS project's public key is *known* but is not *trusted*. - -To trust the CRS project's public key: - -```bash -gpg --edit-key 36006F0E0BA167832158821138EEACA1AB8A6E72 -gpg> trust -Your decision: 5 (ultimate trust) -Are you sure: Yes -gpg> quit -``` - -The result when verifying a release will then look like so: - -```bash -gpg --verify coreruleset-{{< param crs_latest_release >}}.tar.gz.asc v{{< param crs_latest_release >}}.tar.gz -gpg: Signature made Wed Jun 30 15:05:48 2021 CEST -gpg: using RSA key 36006F0E0BA167832158821138EEACA1AB8A6E72 -gpg: Good signature from "OWASP Core Rule Set " [ultimate] -``` - -With the CRS release downloaded and verified, the rest of the set up can continue. - -## Setting Up OWASP CRS - -OWASP CRS contains a setup file that should be reviewed prior to completing set up. The setup file is the only configuration file within the root 'coreruleset-{{< param crs_latest_release >}}' folder and is named `crs-setup.conf.example`. Examining this configuration file and reading what the different options are is **highly** recommended. - -At a minimum, keep in mind the following: - -- CRS does not configure features such as the rule engine, audit engine, logging, etc. This task is part of the initial *engine* setup and is not a job for the rule set. For ModSecurity, if not already done, see the [recommended configuration](https://github.com/owasp-modsecurity/ModSecurity/blob/master/modsecurity.conf-recommended). -- Decide what ModSecurity should do when it detects malicious activity, e.g., drop the packet, return a *403 Forbidden* status code, issue a redirect to a custom page, etc. -- Make sure to configure the anomaly scoring thresholds. For more information see [Anomaly]({{< ref "anomaly_scoring.md" >}} "Anomaly"). -- By default, the CRS rules will consider many issues with different databases and languages. If running in a specific environment, e.g., without any SQL database services present, it is probably a good idea to limit this behavior for performance reasons. -- Make sure to add any HTTP methods, static resources, content types, or file extensions that are needed, beyond the default ones listed. - -Once reviewed and configured, the CRS configuration file should be renamed by changing the file suffix from `.example` to `.conf`: - -```bash -mv crs-setup.conf.example crs-setup.conf -``` - -In addition to `crs-setup.conf.example`, there are two other ".example" files within the CRS repository. These are: - -- `rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example` -- `rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example` - -These files are designed to provide the rule maintainer with the ability to modify rules (see [false positives and tuning]({{< ref "../concepts/false_positives_tuning.md" >}}#rule-exclusions)) without breaking forward compatibility with rule set updates. These two files should be renamed by removing the `.example` suffix. This will mean that installing updates will *not* overwrite custom rule exclusions. To rename the files in Linux, use a command similar to the following: - -```bash -mv rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf -mv rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf -``` - -## Proceeding with the Installation - -The engine should support the `Include` directive out of the box. This directive tells the engine to parse *additional* files for directives. The question is where to put the CRS rules folder in order for it to be included. - -Looking at the CRS files, there are quite a few ".conf" files. While the names attempt to do a good job at describing what each file does, additional information is available in the [rules]({{< ref "../rules/" >}}) section. - -### Includes for Apache - -It is recommended to create a folder specifically to contain the CRS rules. In the example presented here, a folder named `modsecurity.d` has been created and placed within the root `/` directory. When using Apache, wildcard notation can be used to vastly simplify the `Include` rules. Simply copying the cloned directory into the `modsecurity.d` folder and specifying the appropriate `Include` directives will install OWASP CRS. In the example below, the `modsecurity.conf` file has also been included, which includes recommended configurations for ModSecurity. - -```apache - - Include modsecurity.d/modsecurity.conf - Include {{< param crs_install_dir >}}/crs-setup.conf - Include {{< param crs_install_dir >}}/plugins/*-config.conf - Include {{< param crs_install_dir >}}/plugins/*-before.conf - Include {{< param crs_install_dir >}}/rules/*.conf - Include {{< param crs_install_dir >}}/plugins/*-after.conf - -``` - -### Includes for Nginx - -Nginx will include files from the Nginx configuration directory (`/etc/nginx` or `/usr/local/nginx/conf/`, depending on the environment). Because only one `ModSecurityConfig` directive can be specified within `nginx.conf`, it is recommended to name that file `modsec_includes.conf` and include additional files from there. In the example below, the cloned `coreruleset` folder was copied into the Nginx configuration directory. From there, the appropriate include directives are specified which will include OWASP CRS when the server is restarted. In the example below, the `modsecurity.conf` file has also been included, which includes recommended configurations for ModSecurity. - -```nginx - Include modsecurity.d/modsecurity.conf - Include {{< param crs_install_dir >}}/crs-setup.conf - Include {{< param crs_install_dir >}}/plugins/*-config.conf - Include {{< param crs_install_dir >}}/plugins/*-before.conf - Include {{< param crs_install_dir >}}/rules/*.conf - Include {{< param crs_install_dir >}}/plugins/*-after.conf -``` - -{{% notice note %}} -You will also need to include the plugins you want along with your CRS installation. -{{% /notice %}} diff --git a/subsite/docs/content/deployment/install.md b/subsite/docs/content/deployment/install.md deleted file mode 100644 index 84a619e..0000000 --- a/subsite/docs/content/deployment/install.md +++ /dev/null @@ -1,190 +0,0 @@ ---- -title: Installing CRS -weight: 20 -disableToc: false -chapter: false ---- - -This guide aims to get a CRS installation up and running. This guide assumes that a compatible ModSecurity engine is already present and working. If unsure then refer to the [extended install]({{< ref "extended_install.md" >}}) page for full details. - -## Downloading the Rule Set - -The first step is to download the Core Rule Set itself. The CRS project strongly recommends using a [supported version](https://github.com/coreruleset/coreruleset/security/policy). - -Official CRS releases can be found at the following URL: https://github.com/coreruleset/coreruleset/releases. - -For *production* environments, it is recommended to use the latest release, which is v{{< param crs_latest_release >}}. For *testing* the bleeding edge CRS version, nightly releases are also provided. - -### Verifying Releases - -{{% notice note %}} -Releases are signed using the CRS project's [GPG key](https://coreruleset.org/security.asc) (fingerprint: 3600 6F0E 0BA1 6783 2158 8211 38EE ACA1 AB8A 6E72). Releases can be verified using GPG/PGP compatible tooling. - -To retrieve the CRS project's public key from public key servers using `gpg`, execute: `gpg --keyserver pgp.mit.edu --recv 0x38EEACA1AB8A6E72` (this ID should be equal to the last sixteen hex characters in the fingerprint). - -It is also possible to use `gpg --fetch-key https://coreruleset.org/security.asc` to retrieve the key directly. -{{% /notice %}} - -The following steps assume that a \*nix operating system is being used. Installation is similar on Windows but likely involves using a zip file from the CRS [releases page](https://github.com/coreruleset/coreruleset/releases). - -To download the release file and the corresponding signature: - -```bash -wget https://github.com/coreruleset/coreruleset/archive/refs/tags/v{{< param crs_latest_release >}}.tar.gz -wget https://github.com/coreruleset/coreruleset/releases/download/v{{< param crs_latest_release >}}/coreruleset-{{< param crs_latest_release >}}.tar.gz.asc -``` - -To verify the integrity of the release: - -```bash -gpg --verify coreruleset-{{< param crs_latest_release >}}.tar.gz.asc v{{< param crs_latest_release >}}.tar.gz -gpg: Signature made Wed Jun 30 10:05:48 2021 -03 -gpg: using RSA key 36006F0E0BA167832158821138EEACA1AB8A6E72 -gpg: Good signature from "OWASP Core Rule Set " [unknown] -gpg: WARNING: This key is not certified with a trusted signature! -gpg: There is no indication that the signature belongs to the owner. -Primary key fingerprint: 3600 6F0E 0BA1 6783 2158 8211 38EE ACA1 AB8A 6E72 -``` - -If the signature was good then the verification succeeds. If a warning is displayed, like the above, it means the CRS project's public key is *known* but is not *trusted*. - -To trust the CRS project's public key: - -```bash -gpg --edit-key 36006F0E0BA167832158821138EEACA1AB8A6E72 -gpg> trust -Your decision: 5 (ultimate trust) -Are you sure: Yes -gpg> quit -``` - -The result when verifying a release will then look like so: - -```bash -gpg --verify coreruleset-{{< param crs_latest_release >}}.tar.gz.asc v{{< param crs_latest_release >}}.tar.gz -gpg: Signature made Wed Jun 30 15:05:48 2021 CEST -gpg: using RSA key 36006F0E0BA167832158821138EEACA1AB8A6E72 -gpg: Good signature from "OWASP Core Rule Set " [ultimate] -``` - -## Installing the Rule Set - -### Extracting the Files - -Once the rule set has been downloaded and verified, extract the rule set files to a well known location on the server. This will typically be somewhere in the web server directory. - -The examples presented below demonstrate using Apache. For information on configuring Nginx or IIS see the [extended install]({{< ref "install.md" >}}) page. - -Note that while it's common practice to make a new `modsecurity.d` folder, as outlined below, this isn't strictly necessary. The path scheme outlined is common on RHEL-based operating systems; the Apache path used may need to be adjusted to match the server's installation. - -```bash -mkdir {{< param crs_install_dir >}} -tar -xzvf v{{< param crs_latest_release >}}.tar.gz --strip-components 1 -C {{< param crs_install_dir >}} -``` - -Now all the CRS files will be located below the `{{< param crs_install_dir >}}` directory. - -### Setting Up the Main Configuration File - -After extracting the rule set files, the next step is to set up the main OWASP Core Rule Set configuration file. An example configuration file is provided as part of the release package, located in the main directory: `crs-setup.conf.example`. - -{{% notice note %}} -Other aspects of ModSecurity, particularly engine-specific parameters, are controlled by the ModSecurity "recommended" configuration rules, `modsecurity.conf-recommended`. This file comes packaged with ModSecurity itself. -{{% /notice %}} - -In many scenarios, the default example CRS configuration will be a good enough starting point. It is, however, a good idea to take the time to look through the example configuration file *before* deploying it to make sure it's right for a given environment. - -Once any settings have been changed within the example configuration file, as needed, it should be renamed to remove the .example portion, like so: - -```bash -cd {{< param crs_install_dir >}} -mv crs-setup.conf.example crs-setup.conf -``` - -### Include-ing the Rule Files - -The last step is to tell the web server where the rules are. This is achieved by `include`-ing the rule configuration files in the `httpd.conf` file. Again, this example demonstrates using Apache, but the process is similar on other systems (see the [extended install]({{< ref "install.md" >}}) page for details). - -```bash -echo 'IncludeOptional {{< param crs_install_dir >}}/crs-setup.conf' >> /etc/httpd/conf/httpd.conf -echo 'IncludeOptional {{< param crs_install_dir >}}/plugins/*-config.conf' >> /etc/httpd/conf/httpd.conf -echo 'IncludeOptional {{< param crs_install_dir >}}/plugins/*-before.conf' >> /etc/httpd/conf/httpd.conf -echo 'IncludeOptional {{< param crs_install_dir >}}/rules/*.conf' >> /etc/httpd/conf/httpd.conf -echo 'IncludeOptional {{< param crs_install_dir >}}/plugins/*-after.conf' >> /etc/httpd/conf/httpd.conf -``` - -Now that everything has been configured, it should be possible to restart and being using the OWASP CRS. The CRS rules typically require a bit of tuning with rule exclusions, depending on the site and web applications in question. For more information on tuning, see [false positives and tuning]({{< ref "false_positives_tuning.md" >}}). - -```bash -systemctl restart httpd.service -``` - -## Alternative: Using Containers - -Another quick option is to use the official CRS [pre-packaged containers]({{< ref "../development/useful_tools/#official-crs-maintained-docker-images" >}}). Docker, Podman, or any compatible container engine can be used. The official CRS images are published in the Docker Hub. The image most often deployed is `owasp/modsecurity-crs`: it already has everything needed to get up and running quickly. - -The CRS project pre-packages both Apache and Nginx web servers along with the appropriate corresponding ModSecurity engine. More engines, like [Coraza](https://coraza.io/), will be added at a later date. - -To protect a running web server, all that's required is to get the appropriate image and set its configuration variables to make the WAF receives requests and proxies them to your backend server. - -Below is an example `docker-compose` file that can be used to pull the container images. All that needs to be changed is the `BACKEND` variable so that the WAF points to the backend server in question: - -```docker-compose -services: - modsec2-apache: - container_name: modsec2-apache - image: owasp/modsecurity-crs:apache - environment: - SERVERNAME: modsec2-apache - BACKEND: http:// - PORT: "80" - MODSEC_RULE_ENGINE: DetectionOnly - BLOCKING_PARANOIA: 2 - TZ: "${TZ}" - ERRORLOG: "/var/log/error.log" - ACCESSLOG: "/var/log/access.log" - MODSEC_AUDIT_LOG_FORMAT: Native - MODSEC_AUDIT_LOG_TYPE: Serial - MODSEC_AUDIT_LOG: "/var/log/modsec_audit.log" - MODSEC_TMP_DIR: "/tmp" - MODSEC_RESP_BODY_ACCESS: "On" - MODSEC_RESP_BODY_MIMETYPE: "text/plain text/html text/xml application/json" - COMBINED_FILE_SIZES: "65535" - volumes: - ports: - - "80:80" -``` - -That's all that needs to be done. Simply starting the container described above will instantly provide the protection of the latest stable CRS release in front of a given backend server or service. There are [lots of additional variables](https://github.com/coreruleset/modsecurity-crs-docker) that can be used to configure the container image and its behavior, so be sure to read the full documentation. - -## Verifying that the CRS is active - -Always verify that CRS is installed correctly by sending a 'malicious' request to your site or application, for instance: - -```bash -curl 'https://www.example.com/?foo=/etc/passwd&bar=/bin/sh' -``` - -Depending on your configurated thresholds, this should be detected as a malicious request. If you use blocking mode, you should receive an Error 403. The request should also be logged to the audit log, which is usually in `/var/log/modsec_audit.log`. - -## Upgrading - -### Upgrading from CRS 3.x to CRS 4 - -The most impactful change is the removal of application exclusion packages in favor of a plugin system. If you had activated the exclusion packages in CRS 3, you should download the plugins for them and place them in the plugins subdirectory. We maintain the list of plugins in our [Plugin Registry](https://github.com/coreruleset/plugin-registry). You can find detailed information on working with plugins in our [plugins documentation]({{ ref "plugins.md" }}). - -In terms of changes to the detection rules, the amount of changes is smaller than in the CRS 2—3 changeover. Most rules have only evolved slightly, so it is recommended that you keep any existing custom exclusions that you have made under CRS 3. - -We recommend to start over by copying our `crs-setup.conf.example` to `crs-setup.conf` with a copy of your old file at hand, and re-do the customizations that you had under CRS 3. - -Please note that we added a large number of new detections, and any new detection brings a certain risk of false alarms. Therefore, we recommend to test first before going live. - -### Upgrading from CRS 2.x to CRS 3 - -In general, you can update by unzipping our new release over your older one, and updating the `crs-setup.conf` file with any new settings. However, CRS 3.0 is a major rewrite, incompatible with CRS 2.x. Key setup variables have changed their name, and new features have been introduced. Your former modsecurity_crs_10_setup.conf file is thus no longer usable. We recommend you to start with a fresh crs-setup.conf file from scratch. - -Most rule IDs have been changed to reorganize them into logical sections. This means that if you have written custom configuration with exclusion rules (e.g. `SecRuleRemoveById`, `SecRuleRemoveTargetById`, `ctl:ruleRemoveById` or `ctl:ruleRemoveTargetById`) you must renumber the rule numbers in that configuration. You can do this using the supplied utility util/id_renumbering/update.py or find the changes in util/id_renumbering/IdNumbering.csv. - -However, a key feature of the CRS 3 is the reduction of false positives in the default installation, and many of your old exclusion rules may no longer be necessary. Therefore, it is a good option to start fresh without your old exclusion rules. - -If you are experienced in writing exclusion rules for CRS 2.x, it may be worthwhile to try running CRS 3 in Paranoia Level 2 (PL2). This is a stricter mode, which blocks additional attack patterns, but brings a higher number of false positives — in many situations the false positives will be comparable with CRS 2.x. This paranoia level however will bring you a higher protection level than CRS 2.x or a CRS 3 default install, so it can be worth the investment. \ No newline at end of file diff --git a/subsite/docs/content/development/_index.md b/subsite/docs/content/development/_index.md deleted file mode 100644 index 4184299..0000000 --- a/subsite/docs/content/development/_index.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Development -weight: 50 -pre: "5. " -chapter: true ---- - -# Development diff --git a/subsite/docs/content/development/contribution_guidelines.md b/subsite/docs/content/development/contribution_guidelines.md deleted file mode 100644 index 2b7d676..0000000 --- a/subsite/docs/content/development/contribution_guidelines.md +++ /dev/null @@ -1,470 +0,0 @@ ---- -title: Contribution Guidelines -weight: 10 -disableToc: false -chapter: false ---- - -> The CRS project values third party contributions. To make the contribution process as easy as possible, a helpful set of contribution guidelines are in place which all contributors and developers are asked to adhere to. - -## Getting Started with a New Contribution - -1. Sign in to [GitHub](https://github.com/join). -2. Open a [new issue](https://github.com/coreruleset/coreruleset/issues) for the contribution, *assuming a similar issue doesn't already exist*. - * **Clearly describe the issue**, including steps to reproduce if reporting a bug. - * **Specify the CRS version in question** if reporting a bug. - * Bonus points for submitting tests along with the issue. -3. Fork the repository on GitHub and begin making changes there. -4. Signed commits are preferred. (For more information and help with this, refer to the [GitHub documentation](https://docs.github.com/en/authentication/managing-commit-signature-verification/signing-commits)). - -## Making Changes - -* Base any changes on the latest dev branch (e.g., `{{< param crs_dev_branch >}}`). -* Create a topic branch for each new contribution. -* Fix only one problem at a time. This helps to quickly test and merge submitted changes. If intending to fix *multiple unrelated problems* then use a separate branch for each problem. -* Make commits of logical units. -* Make sure commits adhere to the contribution guidelines presented in this document. -* Make sure commit messages follow the [standard Git format](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html). -* Make sure changes are submitted as a pull request (PR) on [GitHub](https://github.com/coreruleset/coreruleset/pulls). - * PR titles should follow the [Conventional Commits format](https://www.conventionalcommits.org/en/v1.0.0/), for example: `fix(rce): Fix a FP in rule 912345 with keyword 'time'`. - * If a PR only affects a single rule then the rule ID should be included in the title. - * If a PR title does not follow the correct format then a CRS developer will fix it. - -## General Formatting Guidelines for Rules Contributions - -* American English should be used throughout. -* 4 spaces should be used for indentation (no tabs). -* Files must end with a single newline character. -* No trailing whitespace at EOL. -* No trailing blank lines at EOF (only the required single EOF newline character is allowed). -* Adhere to an 80 character line length limit where possible. -* Add comments where possible and clearly explain any new rules. -* Comments must not appear between chained rules and should instead be placed before the start of a rule chain. -* All [chained rules](https://github.com/owasp-modsecurity/ModSecurity/wiki/Reference-Manual-(v2.x)#chain) should be indented like so, for readability: -``` -SecRule .. .. \ - "..." - SecRule .. .. \ - "..." - SecRule .. .. \ - "..." -``` -- Action lists in rules must always be enclosed in double quotes for readability, even if there is only one action (e.g., use `"chain"` instead of `chain`, and `"ctl:requestBodyAccess=Off"` instead of `ctl:requestBodyAccess=Off`). -- Always use numbers for phases instead of names. -- Format all use of `SecMarker` using double quotes, using UPPERCASE, and separating words with hyphens. For example: -``` -SecMarker "END-RESPONSE-959-BLOCKING-EVALUATION" -SecMarker "END-REQUEST-910-IP-REPUTATION" -``` -- Rule actions should appear in the following order, for consistency: -``` -id -phase -allow | block | deny | drop | pass | proxy | redirect -status -capture -t:xxx -log -nolog -auditlog -noauditlog -msg -logdata -tag -sanitiseArg -sanitiseRequestHeader -sanitiseMatched -sanitiseMatchedBytes -ctl -ver -severity -multiMatch -initcol -setenv -setvar -expirevar -chain -skip -skipAfter -``` -- Rule operators must always be explicitly specified. Although ModSecurity defaults to using the `@rx` operator, for clarity `@rx` should always be explicitly specified when used. For example, write: -``` -SecRule ARGS "@rx foo" "id:1,phase:1,pass,t:none" -``` -instead of -``` -SecRule ARGS "foo" "id:1,phase:1,pass,t:none" -``` - -## Variable Naming Conventions - -* Variable names should be lowercase and should use the characters a-z, 0-9, and underscores only. -* To reflect the different syntax between *defining* a variable (using `setvar`) and *using* a variable, the following visual distinction should be applied: - * **Variable definition:** Lowercase letters for collection name, dot as the separator, variable name. E.g.: `setvar:tx.foo_bar_variable` - * **Variable use:** Capital letters for collection name, colon as the separator, variable name. E.g.: `SecRule TX:foo_bar_variable` - -## Writing Regular Expressions - -* Use the following character class, in the stated order, to cover alphanumeric characters plus underscores and hyphens: `[a-zA-Z0-9_-]` - -### Portable Backslash Representation - -CRS uses `\x5c` to represent the backslash `\` character in regular expressions. Some of the reasons for this are: - -* It's portable across web servers and WAF engines: it works with Apache, Nginx, and Coraza. -* It works with the [crs-toolchain]({{< ref "crs_toolchain" >}}) for building optimized regular expressions. - -The older style of representing a backslash using the character class `[\\\\]` must _not_ be used. This was previously used in CRS to get consistent results between Apache and Nginx, owing to a quirk with how Apache would "double un-escape" character escapes. For future reference, the decision was made to stop using this older method because: - -* It can be confusing and difficult to understand how it works. -* It doesn't work with [crs-toolchain]({{< ref "crs_toolchain" >}}). -* It doesn't work with Coraza. -* It isn't obvious how to use it in a character class, e.g., `[a-zA-Z]`. - -### Forward Slash Representation - -CRS uses literal, *unescaped* forward slash `/` characters in regular expressions. - -Regular expression engines and libraries based on PCRE use the forward slash `/` character as the default delimiter. As such, forward slashes are often escaped in regular expression patterns. In the interests of readability, CRS does *not* escape forward slashes in regular expression patterns, which may seem unusual at first to new contributors. - -If testing a CRS regular expression using a third party tool, it may be useful to change the delimiter to something other than `/` if a testing tool raises errors because a CRS pattern features unescaped forward slashes. - -### When and Why to Anchor Regular Expressions - -Engines running the OWASP Core Rule Set will use regular expressions to _search_ the input string, i.e., the regular expression engine is asked to find the first match in the input string. If an expression needs to match the entire input then the expression must be anchored appropriately. - -#### Beginning of String Anchor (^) - -It is often necessary to match something at the start of the input to prevent false positives that match the same string in the middle of another argument, for example. Consider a scenario where the goal is to match the value of `REQUEST_HEADERS:Content-Type` to `multipart/form-data`. The following regular expression could be used: - -```python -"@rx multipart/form-data" -``` - -HTTP headers can contain multiple values, and it may be necessary to guarantee that the value being searched for is the _first_ value of the header. There are different ways to do this but the simplest one is to use the `^` caret anchor to match the beginning of the string: - -```python -"@rx ^multipart/form-data" -``` - -It will also be useful to ignore case sensitivity in this scenario: - -```python -"@rx (?i)^multipart/form-data" -``` - -#### End of String Anchor ($) - -Consider, for example, needing to find the string `/admin/content/assets/add/evil` in the `REQUEST_FILENAME`. This could be achieved with the following regular expression: - -```python -"@rx /admin/content/assets/add/evil" -``` - -If the input is changed, it can be seen that this expression can easily produce a false positive: `/admin/content/assets/add/evilbutactuallynot/nonevilfile`. If it is known that the file being searched for can't be in a subdirectory of `add` then the `$` anchor can be used to match the end of the input: - -```python -"@rx /admin/content/assets/add/evil$" -``` - -This could be made a bit more general: - -```python -"@rx /admin/content/assets/add/[a-z]+$" -``` - -#### Matching the Entire Input String - -It is sometimes necessary to match the entire input string to ensure that it _exactly_ matches what is expected. It might be necessary to find the "edit" action transmitted by WordPress, for example. To avoid false positives on variations (e.g., "myedit", "the edit", "editable", etc.), the `^` caret and `$` dollar anchors can be used to indicate that an exact string is expected. For example, to only match the _exact_ strings `edit` or `editpost`: - -```python -"@rx ^(?:edit|editpost)$" -``` - -#### Other Anchors - -Other anchors apart from `^` caret and `$` dollar exist, such as `\A`, `\G`, and `\Z` in PCRE. CRS **strongly discourages** the use of other anchors for the following reasons: - -- Not all regular expression engines support all anchors and the OWASP Core Rule Set should be compatible with as many regular expression engines as possible. -- Their function is sometimes not trivial. -- They aren't well known and would require additional documentation. -- In most cases that would justify their use the regular expression can be transformed into a form that doesn't require them, or the rule can be transformed (e.g., with an additional chain rule). - -### Use Capture Groups Sparingly - -Capture groups, i.e., parts of the regular expression surrounded by parentheses (`(` and `)`), are used to store the matched information from a string in memory for later use. Capturing input uses both additional CPU cycles and additional memory. In many cases, parentheses are *mistakenly* used for grouping and ensuring precedence. - -To group parts of a regular expression, or to ensure that the expression uses the precedence required, surround the concerning parts with `(?:` and `)`. Such a group is referred to as being "non-capturing". The following will create a capture group: - -```python -"@rx a|(b|c)d" -``` - -On the other hand, this will create a _non-capturing_ group, guaranteeing the precedence of the alternative _without_ capturing the input: - -```python -"@rx a|(?:b|c)d" -``` - -### Lazy Matching - -The question mark `?` can be used to turn "greedy" quantifiers into "lazy" quantifiers, i.e., `.+` and `.*` are greedy while `.+?` and `.*?` are lazy. Using lazy quantifiers can help with writing certain expressions that wouldn't otherwise be possible. However, in backtracking regular expression engines, like PCRE, lazy quantifiers can also be a source of performance issues. The following is an example of an expression that uses a lazy quantifier: - -```python -"@rx (?i)\.cookie\b.*?;\W*?(?:expires|domain)\W*?=" -``` - -This expression matches cookie values in HTML to detect session fixation attacks. The input string could be `document.cookie = "name=evil; domain=https://example.com";`. - -The lazy quantifiers in this expression are used to reduce the amount of backtracking that engines such as PCRE have to perform (others, such as RE2, are not affected by this). Since the asterisk `*` is greedy, `.*` would match every character in the input up to the end, at which point the regular expression engine would realize that the next character, `;`, can't be matched and it will backtrack to the previous position (`;`). A few iterations later, the engine will realize that the character `d` from `domain` can't be matched and it will backtrack again. This will happen again and again, until the `;` at `evil;` is found. Only then can the engine proceed with the next part of the expression. - -Using lazy quantifiers, the regular expression engine will instead match _as few characters as possible_. The engine will match ` ` (a space), then look for `;` and will not find it. The match will then be expanded to ` =` and, again, a match of `;` is attempted. This continues until the match is ` = "name=evil` and the engine finds `;`. While lazy matching still includes some work, in this case, backtracking would require many more steps. - -Lazy matching can have the inverse effect, though. Consider the following expression: - -```python -"@rx (?i)\b(?:s(?:tyle|rc)|href)\b[\s\S]*?=" -``` - -It matches some HTML attributes and then expects to see `=`. Using a somewhat contrived input, the lazy quantifier will require more steps to match then the greedy version would: `style                     =`. With the lazy quantifier, the regular expression engine will expand the match by one character for each of the space characters in the input, which means 21 steps in this case. With the greedy quantifier, the engine would match up to the end in a single step, backtrack one character and then match `=` (note that `=` is included in `[\s\S]`), which makes 3 steps. - -To summarize: **be very mindful about when and why you use lazy quantifiers in your regular expressions**. - -### Possessive Quantifiers and Atomic Groups - -Lazy and greedy matching change the order in which a regular expression engine processes a regular expression. However, the order of execution does not influence the backtracking behavior of backtracking engines. - -Possessive quantifiers (e.g., `x++`) and atomic groups (e.g., `(?>x)`) are tools that can be used to prevent a backtracking engine from backtracking. They _can_ be used for performance optimization but are only supported by backtracking engines and, therefore, are not permitted in CRS rules. - -### Writing Regular Expressions for Non-Backtracking Compatibility - -Traditional regular expression engines use backtracking to solve some additional problems, such as finding a string that is preceded or followed by another string. While this functionality can certainly come in handy and has its place in certain applications, it can also lead to performance issues and, in uncontrolled environments, open up possibilities for attacks (the term "[ReDoS](https://en.wikipedia.org/wiki/ReDoS)" is often used to describe an attack that exhausts process or system resources due to excessive backtracking). - -The OWASP Core Rule Set tries to be compatible with non-backtracking regular expression engines, such as RE2, because: - -- Non-backtracking engines are less vulnerable to ReDoS attacks. -- Non-backtracking engines can often outperform backtracking engines. -- CRS aims to leave the choice of the engine to the user/system. - -To ensure compatibility with non-backtracking regular expression engines, the following operations are **not** permitted in regular expressions: - -- positive lookahead (e.g., `(?=regex)`) -- negative lookahead (e.g., `(?!regex)`) -- positive lookbehind (e.g., `(?<=regex)`) -- negative lookbehind (e.g., `(?regex)`) -- backreferences (e.g., `\1`) -- named backreferences (e.g., `(?P=name)`) -- conditionals (e.g., `(?(regex)then|else)`) -- recursive calls to capture groups (e.g., `(?1)`) -- possessive quantifiers (e.g., `(?:regex)++`) -- atomic (or possessive) groups (e.g., `(?>regex`)) - -This list is not exhaustive but covers the most important points. The [RE2 documentation](https://github.com/google/re2/wiki/Syntax) includes a complete list of supported and unsupported features that various engines offer. - -### When and How to Optimize Regular Expressions - -Optimizing regular expressions is hard. Often, a change intended to improve the performance of a regular expression will change the original semantics by accident. In addition, optimizations usually make expressions harder to read. Consider the following example of URL schemes: - -```python -mailto|mms|mumble|maven -``` - -An optimized version (produced by the [crs-toolchain]({{< ref "crs_toolchain" >}})) could look like this: - -```python -m(?:a(?:ilto|ven)|umble|ms) -``` - -The above expression is an optimization because it reduces the number of backtracking steps when a branch fails. The regular expressions in the CRS are often comprised of lists of tens or even hundreds of words. Reading such an expression in an optimized form is difficult: even the _simple_ optimized example above is difficult to read. - -In general, contributors should not try to optimize contributed regular expressions and should instead strive for clarity. New regular expressions will usually be required to be submitted as a `.ra` file for the [crs-toolchain]({{< ref "crs_toolchain" >}}) to process. In such a file, the regular expression is decomposed into individual parts, making manual optimizations much harder or even impossible (and unnecessary with the `crs-toolchain`). The `crs-toolchain` performs some common optimizations automatically, such as the one shown above. - -Whether optimizations make sense in a contribution is assessed for each case individually. - -## Rules Compliance with Paranoia Levels - -The rules in CRS are organized into **paranoia levels** (PLs) which makes it possible to define how aggressive CRS is. See the documentation on [paranoia levels](https://coreruleset.org/docs/concepts/paranoia_levels/) for an introduction and more detailed explanation. - -Each rule that is placed into a paranoia level must contain the tag `paranoia-level/N`, where *N* is the PL value, however this tag can only be added if the rule does **not** use the nolog action. - -The types of rules that are allowed at each paranoia level are as follows: - -**PL 0:** - -* ModSecurity / WAF engine installed, but almost no rules - -**PL 1:** - -* Default level: keep in mind that most installations will normally use this level -* Any complex, memory consuming evaluation rules will surely belong to a higher level, not this one -* CRS will normally use atomic checks in single rules at this level -* Confirmed matches only; all scores are allowed -* No false positives / low false positives: try to avoid adding rules with potential false positives! -* False negatives could happen - -**PL 2:** - -* [Chain](https://github.com/owasp-modsecurity/ModSecurity/wiki/Reference-Manual-%28v2.x%29#chain) usage is allowed -* Confirmed matches use score critical -* Matches that cause false positives are limited to using scores notice or warning -* Low false positive rates -* False negatives are not desirable - -**PL 3:** - -* Chain usage with complex regular expression look arounds and macro expansions are allowed -* Confirmed matches use scores warning or critical -* Matches that cause false positives are limited to using score notice -* False positive rates are higher but limited to multiple matches (not single strings) -* False negatives should be a very unlikely accident - -**PL 4:** - -* Every item is inspected -* Variable creations are allowed to avoid engine limitations -* Confirmed matches use scores notice, warning, or critical -* Matches that cause false positives are limited to using scores notice or warning -* False positive rates are higher (even on single strings) -* False negatives should not happen at this level -* Check everything against RFCs and allow listed values for the most popular elements - -## ID Numbering Scheme - -The CRS project uses the numerical ID rule namespace from 900,000 to 999,999 for CRS rules, as well as 9,000,000 to 9,999,999 for default CRS rule exclusion packages and plugins. - -- Rules applying to the **incoming request** use the ID range 900,000 to 949,999. -- Rules applying to the **outgoing response** use the ID range 950,000 to 999,999. - -The rules are grouped by the vulnerability class they address (SQLi, RCE, etc.) or the functionality they provide (e.g., initialization). These groups occupy blocks of thousands (e.g., SQLi: 942,000 - 942,999). These grouped rules are defined in files dedicated to a single group or functionality. The filename takes up the first three digits of the rule IDs defined within the file (e.g., SQLi: `REQUEST-942-APPLICATION-ATTACK-SQLI.conf`). - -The individual rules within each file for a vulnerability class are organized by the paranoia level of the rules. PL 1 is first, then PL 2, etc. - -The ID block 9xx000 - 9xx099 is reserved for use by CRS helper functionality. There are no blocking or filtering rules in this block. - -Among the rules providing CRS helper functionality are rules that skip other rules depending on the paranoia level. These rules always use the following reserved rule IDs: 9xx011 - 9xx018, with very few exceptions. - -The blocking and filter rules start at 9xx100 with a step width of 10, e.g., 9xx100, 9xx110, 9xx120, etc. - -The ID of a rule does not correspond directly with its paranoia level. Given the size of rule groups and how they're organized by paranoia level (starting with the lower PL rules first), PL 2 and above tend to be composed of rules with higher ID numbers. - -### Stricter Siblings - -Within a rule file / block, there are sometimes smaller groups of rules that belong together. They're closely linked and very often represent copies of the original rules with a stricter limit (alternatively, they can represent the same rule addressing a different *target* in a second rule, where this is necessary). These are **stricter siblings** of the base rule. Stricter siblings usually share the first five digits of the rule ID and raise the rule ID by one, e.g., a base rule at 9xx160 and a stricter sibling at 9xx161. - -Stricter siblings often have different paranoia levels. This means that the base rule and the stricter siblings don't usually reside next to each another in the rule file. Instead, they're ordered by paranoia level and are linked by the first digits of their rule IDs. It's good practice to introduce all stricter siblings together as part of the definition of the base rule: this can be done in the comments of the base rule. It's also good practice to refer back to the base rule with the keywords "stricter sibling" in the comments of the stricter siblings themselves. For example: "...This is performed in two separate stricter siblings of this rule: 9xxxx1 and 9xxxx2", and "This is a stricter sibling of rule 9xxxx0." - -## Writing Tests - -Each rule should be accompanied by tests. Rule tests are an invaluable way to check that a rule behaves as expected: - -- Does the rule correctly match against the payloads and behaviors that the rule is designed to detect? (**Positive tests**) -- Does the rule correctly **not** match against legitimate requests, i.e., the rule doesn't cause obvious false positives? (**Negative tests**) - -Rule tests also provide an excellent way to test WAF engines and implementations to ensure they behave and execute CRS rules as expected. - -The rule tests are located under `tests/regression/tests`. Each CRS rule *file* has a corresponding *directory* and each individual *rule* has a corresponding *YAML file* containing all the tests for that rule. For example, the tests for rule 911100 *(Method is not allowed by policy)* are in the file `REQUEST-911-METHOD-ENFORCEMENT/911100.yaml`. - -Full documentation of the required formatting and available options of the YAML tests can be found at https://github.com/coreruleset/ftw/blob/main/docs/YAMLFormat.md. - -### Positive Tests - -Example of a simple *positive test*: - -```yaml -- test_title: 932230-26 - desc: "Unix command injection" - stages: - - stage: - input: - dest_addr: 127.0.0.1 - headers: - Host: localhost - User-Agent: "OWASP CRS test agent" - Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 - method: POST - port: 80 - uri: "/post" - data: "var=` /bin/cat /etc/passwd`" - version: HTTP/1.1 - output: - log_contains: id "932230" -``` - -This test will succeed if the log output contains `id "932230"`, which would indicate that the rule in question matched and generated an alert. - -It's important that tests consistently include the HTTP header fields `Host`, `User-Agent`, and `Accept`. CRS includes rules that detect if these headers are missing or empty, so these headers should be included in each test to avoid unnecessarily causing those rules to match. Ideally, *each positive test should cause* **only** *the rule in question to match*. - -The rule's description field, `desc`, is important. It should describe what is being tested: what *should* match, what should *not* match, etc. - -### Negative Tests - -Example of a simple *negative test*: - -```yaml -- test_title: 932260-4 - stages: - - stage: - input: - dest_addr: "127.0.0.1" - method: "POST" - port: 80 - headers: - User-Agent: "OWASP CRS test agent" - Host: "localhost" - Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 - data: 'foo=ping pong tables' - uri: '/post' - output: - no_log_contains: id "932260" -``` - -This test will succeed if the log output does **not** contain `id "932260"`, which would indicate that the rule in question did **not** match and so did **not** generate an alert. - -### Encoded and Raw Requests - -It is possible to *encode* an entire test request. This encapsulates the request and means that the request headers and payload don't need to be explicitly declared. This is useful when a test request needs to use unusual bytes which might break YAML parsers, or when a test request must be intentionally malformed in a way that is impossible to describe otherwise. An encoded request is sent exactly as intended. - -The `encoded_request` field works like so: - -```yaml -encoded_request: -``` - -For example: -```yaml -encoded_request: "R0VUIFwgSFRUUA0KDQoK" -``` - -where `R0VUIFwgSFRUUA0KDQoK` is the base64-encoded equivalent of `GET \ HTTP\r\n\r\n`. - -The older method of using `raw_request` is deprecated as it's difficult to maintain and less portable than `encoded_request`. - -### Using The Correct HTTP Endpoint - -The CRS project uses [kennthreitz/httpbin](https://hub.docker.com/r/kennethreitz/httpbin) as the backend server for tests. This backend provides one dedicated endpoint for each HTTP method. Tests should target these endpoints to: - -- improve test throughput (prevent HTML from being returned by the backend) -- add automatic HTTP method verification (the backend will respond with status code `405` (method not allowed) to requests whose method does not match the endpoint) - -Test URIs should be structured as follows, where `` must be replaced by the name of the HTTP method the test uses: - -```yaml -#... - method: - uri: //some/arbitrary/url -#... -``` - -## Further Guidance on Rule Writing - -### Leaving Audit Log Configuration Unchanged - -Former versions of CRS dynamically included the HTTP response body in the audit log via special `ctl` statements on certain individual response rules. This was never applied in a systematic way and, regardless, CRS should not change the format of the audit log by itself, namely because this can lead to information leakages. Therefore, the use of `ctl:auditLogParts=+E` or any other form of `ctl:auditLogParts` is not allowed in CRS rules. - -## Non-Rules General Guidelines - -* Remove trailing spaces from files (if they're not needed). This will make linters happy. -* EOF should have an EOL. - -The `pre-commit` framework can be used to check for and fix these issues automatically. First, go to the [pre-commit](https://pre-commit.com/) website and download the framework. Then, after installing, use the command `pre-commit install` so that the tools are installed and run each time a commit is made. CRS provides a config file that will keep the repository clean. diff --git a/subsite/docs/content/development/crs_toolchain.md b/subsite/docs/content/development/crs_toolchain.md deleted file mode 100644 index 5b66ba4..0000000 --- a/subsite/docs/content/development/crs_toolchain.md +++ /dev/null @@ -1,112 +0,0 @@ ---- -title: crs-toolchain -weight: 12 -disableToc: false -chapter: false ---- - -> The crs-toolchain is the utility belt of CRS developers. It provides a single point of entry and a consistent interface for a range of different tools. Its core functionality (owed to the great [rassemble-go](https://github.com/itchyny/rassemble-go), which is itself based on the brain-melting [Regexp::Assemble](https://github.com/ronsavage/Regexp-Assemble) Perl module) is to assemble individual parts of a regular expression into a single expression (with some optimizations). - -## Setup - -### With Existing Go Environment - -If a current Go environment is present, simply run - -```bash -go install github.com/coreruleset/crs-toolchain@latest -``` - -Provided that the Go binaries are on the `PATH`, the toolchain can now be run from anywhere with - -```bash -crs-toolchain -``` - -### With the Binary - -Alternatively, one of the pre-built binaries can be downloaded from GitHub. Navigate to the [latest release](https://github.com/coreruleset/crs-toolchain/releases/latest) and download the package of choice along with the `crs-toolchain-checksums.txt` file. To verify the integrity of the binary/archive, navigate to the directory where the two files are stored and verify that the checksum matches: - -```bash -cd ~/Downloads -shasum -a 256 -c crs-toolchain-checksums.txt 2>&1 | grep OK -``` - -The output should look like the following (depending on the binary/archive downloaded): - -```bash -crs-toolchain-1.0.0_amd64.deb: OK -``` - -### Test the Toolchain - -It should now be possible to use the crs-toolchain. Test this by running the following in a shell: - -```bash -printf "(?:homer)? simpson\n(?:lisa)? simpson" | crs-toolchain regex generate - -``` - -The output should be: - -```bash -(?:homer|(?:lisa)?) simpson -``` - -## Adjusting the Logging Level - -The level of logging can be adjusted with the `--log-level` option. Accepted values are `trace`, `debug`, `info`, `warn`, `error`, `fatal`, `panic`, and `disabled`. The default level is `info`. - -## Full Documentation -Read the built-in help text for the full documentation: - -```bash -crs-toolchain --help -``` - -## The `regex` Command - -The `regex` command provides sub-commands for everything surrounding regular expressions, especially the "assembly" of regular expressions from a specification of its components (see [Assembling Regular Expressions]({{< ref "regex_assembly" >}}) for more details). - -### Example Use - -To generate a reduced expression from a list of expressions, simply pass the corresponding CRS rule ID to the script or pipe the contents to it: - -```bash -crs-toolchain regex generate 942170 -# or -cat regex-assembly/942170.ra | crs-toolchain regex generate - -``` - -It is also possible to compare generated expressions to the current expressions in the rule files, like so: - -```bash -crs-toolchain regex compare 942170 -``` - -Even better, rule files can be updated directly: - -```bash -crs-toolchain regex update 942170 -# or update all -crs-toolchain regex update --all -``` - -The `format` sub-command reports formatting violations and actively formats assembly files: - - ```bash - crs-toolchain regex format --all - ``` - -## The `util` Command - -The `util` command includes sub-commands that are used from time to time and do not fit nicely into any of the other groups. Currently, the only sub-command is `renumber-tests`. `renumber-tests` is used to simplify maintenance of the regression tests. Since every test has a consecutive number within its file, adding or removing tests can disrupt numbering. `renumber-tests` will renumber all tests within each test file consecutively. - -## The `completion` command - -The `completion` command can be used to generate a shell script for shell completion. For example: - -```bash -mkdir -p ~/.oh-my-zsh/completions && crs-toolchain completion zsh > ~/.oh-my-zsh/completions/_crs-toolchain -``` - -How completion is enabled and where completion scripts are sourced from depends on the environment. Please consult the documentation of the shell in use. diff --git a/subsite/docs/content/development/plugin_writing.md b/subsite/docs/content/development/plugin_writing.md deleted file mode 100644 index 017ac01..0000000 --- a/subsite/docs/content/development/plugin_writing.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: Writing Plugins -weight: 50 -disableToc: false -chapter: false ---- - -> The CRS plugin mechanism allows the rule set to be extended in specific, experimental, or unusual ways. This page explains how to write a new plugin to extend CRS. - -## How to Write a Plugin - -### Is a Plugin the Right Approach for a Given Rule Problem? - -This is the first and most important question to ask. - -CRS is a generic rule set. The rule set has no awareness of the particular setup it finds itself deployed in. As such, the rules are written with caution and administrators are given the ability to steer the behavior of CRS by setting the anomaly threshold accordingly. *An administrator writing their own rules knows a lot more about their specific setup*, so there's probably no need to be as cautious. It's also probably futile to write anomaly scoring rules in this situation. Anomaly scoring adds little value if an administrator knows that everybody issuing a request to `/no-access`, for example, is an attacker. - -In such a situation, it's better to write a simple deny-rule that blocks said requests. There's no need for a plugin in most situations. - -### Plugin Writing Guidance - -When there really *is* a good use case for a plugin, it's recommended to start with a clone of the [template plugin](https://github.com/coreruleset/template-plugin). It's well documented and a good place to start from. - -Plugins are a new idea for CRS. As such, there aren't currently any strict rules about what a plugin is and isn't allowed to do. There are definitely fewer rules and restrictions for writing plugin rules than for writing a mainline CRS rule, which is becoming increasingly strict as the project evolves. This means that it's basically possible to do anything in a plugin, especially when there's no plan to contribute the plugin to the CRS project. - -When it *is* planned to contribute a plugin back to the CRS project, the following guidance will help: - -* Try to keep plugins separate. Try not to interfere with other plugins and make sure that any other plugin can run next to yours. -* Be careful when interfering with CRS. It's easy to disrupt CRS by excluding essential rules or by messing with variables. -* Keep an eye on performance and think of use cases. - -### Anomaly Scoring: Getting the Phases Right - -The anomaly scores are only initialized in the CRS rules file `REQUEST-901-INITIALIZATION.conf`. This happens in phase 1, but it still happens *after* a plugin's `*-before.conf` file has been executed for phase 1. As a consequence, if anomaly scores are set there then they'll be overwritten in CRS phase 1. - -The effect for phase 2 anomaly scoring in a plugin's `*-after.conf` file is similar. It happens after the CRS request blocking happens in phase 2. This can mean a plugin raises the anomaly score *after* the blocking decision. This might result in a higher anomaly score in the log file and confusion as to why the request was not blocked. - -What to do is as follows: - -* **Scoring in phase 1:** Put in the plugin's *After-File* (and be aware that early blocking won't work). -* **Scoring in phase 2:** Put in the plugin's *Before-File*. - -### Plugin Use of Persistent Collections: ModSecurity SecCollectionTimeout -If a plugin uses persistent collections (stores stateful information across multiple requests, e.g., to implement DoS protection functionality), it is important to note that CRS does not change the default value (`3600`) for the ModSecurity `SecCollectionTimeout` directive. Plugin authors must instruct users to set the directive to an appropriate value if the plugin requires a value that differs from the default. A plugin should never actively set `SecCollectionTimeout`, as other plugins may specify different values for the directive and the choice for the effective value must be made by the user. - -## Quality Guarantee - -The official CRS plugins are separated from third party plugins. The rationale is to keep the quality of official plugins on par with the quality of the CRS project itself. It's not possible to guarantee the quality of third party plugins as their code is not under the control of the CRS project. Third party plugins should be examined and considered separately to decide whether their quality is sufficient for use in production. - -## How to Integrate a Plugin into the Official Registry - -Plugins should be developed and refined until they are production-ready. The next step is to open a pull request at the [plugin registry](https://github.com/coreruleset/plugin-registry). Any free rule ID range can be used for a new plugin. The plugin will then be reviewed and assigned a block of rule IDs. Afterwards, the plugin will be listed as a new third party plugin. diff --git a/subsite/docs/content/development/regex_assembly.md b/subsite/docs/content/development/regex_assembly.md deleted file mode 100644 index e923f96..0000000 --- a/subsite/docs/content/development/regex_assembly.md +++ /dev/null @@ -1,420 +0,0 @@ ---- -title: Assembling Regular Expressions -weight: 15 -disableToc: false -chapter: false ---- - -> The CRS team uses a custom specification format to specify how a regular expression is to be generated from its components. This format enables reuse across different files, explanation of choices and techniques with comments, and specialized processing. - -## Specification Format - -The files containing regular expression specifications (`.ra` suffix, under `regex-assembly`) contain one regular expression per line. These files are meant to be processed by the [crs-toolchain]({{< ref "crs_toolchain" >}}). - -### Example - -The following is an example of what an assembly file might contain: - -``` -##! This line is a comment and will be ignored. The next line is empty and will also be ignored. - -##! The next line sets the *ignore case* flag on the resulting expression: -##!+ i - -##! The next line is the prefix comment. The assembled expression will be prefixed with its contents: -##!^ \b - -##! The next line is the suffix comment. The assembled expression will be suffixed with its contents: -##!$ \W*\( - -##! The following two lines are regular expressions that will be assembled: ---a-- -__b__ - -##! Another comment, followed by another regular expression: -^#!/bin/bash -``` - -This assembly file would produce the following assembled expression: `(?i)\b(?:--a--|__b__|^#!/bin/bash)[^0-9A-Z_a-z]*\(` - -### Comments - -Lines starting with `##!` are considered comments and will be skipped. Use comments to explain the purpose of a particular regular expression, its use cases, origin, shortcomings, etc. Having more information recorded about individual expressions will allow developers to better understand changes or change requirements, such as when reviewing pull requests. - -### Empty Lines - -Empty lines, i.e., lines containing only white space, will be skipped. Empty lines can be used to improve readability, especially when adding comments. - -### Flag Marker - -A line starting with `##!+` can be used to specify global flags for the regular expression engine. The flags from all lines starting with the flag marker will be combined. The resulting expression will be prefixed with the flags. For example, the two lines - -``` -##!+ i -a+b|c -``` - -will produce the regular expression `(?i)a+b|c`. - -The following flags are currently supported: -- `i`: ignore case; matches will be case-insensitive -- `s`: make `.` match newline (`\n`); this set by ModSecurity anyway and is included here for backward compatibility - -### Prefix Marker - -A line starting with `##!^` can be used to pass a global prefix to the script. The resulting expression will be prefixed with the literal contents of the line. Multiple prefix lines will be concatenated in order. For example, the lines - -``` -##!^ \d*\( -##!^ simpson -marge|homer -``` - -will produce the regular expression `[0-9]*\(simpson(?:marge|homer)`. - -The prefix marker exists for convenience and improved readability. The same can be achieved with the [assemble processor](#assemble-processor). - -### Suffix Marker - -A line starting with `##!$` can be used to pass a suffix to the script. The resulting expression will be suffixed with the literal contents of the line. Multiple suffix lines will be concatenated in order. For example, the lines - -``` -##!$ \d*\( -##!$ simpson -marge|homer -``` - -will produce the regular expression `(?:marge|homer)[0-9]*\(simpson`. - -The suffix marker exists for convenience and improved readability. The same can be achieved with the [assemble processor](#assemble-processor). - -### Processor Marker - -A line starting with `##!>` is a processor directive. The processor marker can be used to preprocess a block of lines. - -A line starting with `##!<` marks the end of the most recent processor block. - -Processor markers have the following general format: ` []`. For example: `##!> cmdline unix`. The arguments depend on the processor and may be empty. - -The following example is intentionanlly simple (and meaningless) to illustrates the use of the markers without adding additionally confusing pieces. Please refer to the following sections for more concrete and useful examples. - -```python -##!> cmdline unix - command1 - command2 - ##!> assemble - nested1 - nested2 - ##!< -##!< -``` - -Processors are defined in the [crs-toolchain]({{< ref "crs_toolchain" >}}). - -### Nesting - -Processors may be nested. This enables complex scenarios, such as assembling a smaller expression to concatenate it with another line or block of lines. For example, the following will produce the regular expression `line1(?:ab|cd)`: - -```python -##!> assemble -line1 -##!=> - ##!> assemble -ab -cd - ##!< -##!< -``` - -There is no practical limit to the nesting depth. - -Each processor block must be terminated with the end marker `##!<`, except for the outermost (default) block, where the end marker is optional. - -## Command Line Evasion processor - -Processor name: `cmdline` - -### Arguments - -`unix|windows` (required): The processor argument determines the escaping strategy used for the regular expression. Currently, the two supported strategies are Windows cmd (`windows`) and "unix like" terminal (`unix`). - -### Output - -One line per line of input, escaped for the specified environment. - -### Description - -The command line evasion processor treats each line as a word (e.g., a shell command) that needs to be escaped. - -Lines starting with a single quote `'` are treated as literals and will not be escaped. - -The special token `@` will be replaced with an optional "word ending" regular expression. This can be used in the context of a shell to reduce the number of false positives for a word by requiring a subsequent token to be present. For example: `python@`. - -`@` will match: -- `python<<<'print("hello")'` -- `python <<< 'print("hello")'` - -`@` will _not_ match: -- `python3<<<'print("hello")'` -- `python3 <<< 'print("hello")'` - -The special token `~` acts like `@` but does not allow any white space tokens to _immediately_ follow the preceding word. This is useful for adding common English words to word lists. For example, there are multiple executable names for "python", such as `python3` or `python3.8`. These could not be added with `python@`, as `python ` would be a valid match and create many false positives. - -`~` will match: -- `python<<<'print("hello")'` -- `python3 <<< 'print("hello")'` - -`~` will _not_ match: -- `python <<< 'print("hello")'` - -The patterns that are used by the command line evasion processor are configurable. The default configuration for the Core Rule Set can be found in the `toolchain.yaml` in the `regex-assembly` directory of the [Core Rule Set project](https://github.com/coreruleset/coreruleset). - -The following is an example of how the command line evasion processor can be used: - -```python -##!> cmdline unix - w@ - gcc~ - 'python[23] - aptitude@ - pacman@ -##!< -``` - -## Assemble processor - -Processor name: `assemble` - -### Arguments - -This processor does not accept any arguments. - -### Output - -Single line regular expression, where each line of the input is treated as an alternation of the regular expression. Input can also be stored or concatenated by using the two marker comments for input (`##!=<`) and output (`##!=>`). - -### Description - -Each line of the input is treated as an alternation of a regular expression, processed into a single line. The resulting regular expression is not optimized (in the strict sense) but is reduced (i.e., common elements may be put into character classes or groups). The ordering of alternations in the output can differ from the order in the file (ordering alternations by length is a simple performance optimization). - -This processor can also store the output of a block delimited with the input marker `##!=<`, or produce the concatenation of blocks delimited with the output marker `##!=>`. - -Lines within blocks delimited by input or output markers are treated as alternations, as usual. The input and output markers enable more complex scenarios, such as separating parts of the regular expression in the assembly file for improved readability. Rule 930100, for example, uses separate expressions for periods and slashes, since it's easier to reason about the differences when they are physically separated. The following example is based on rules from 930100: - -```python -##!> assemble - ##! slash patterns - \x5c - ##! URI encoded - %2f - %5c - ##!=> - - ##! dot patterns - \. - \.%00 - \.%01 -##!< -``` - -The above would produce the following, concatenated regular expression: - -```python -(?:\x5c|%(?:2f|5c))\.(?:%0[0-1])? -``` - -The input marker `##!=<` takes an identifier as a parameter and associates the output of the preceding block with the identifier. No output is produced when using the input `##!=<` marker. To concatenate the output of a previously stored block, the appropriate identifier must be passed to the output marker `##!=>` as an argument. Stored blocks remain in storage until the end of the program and are available globally. Any input stored previously can be retrieved at any nesting level. Both of the following examples produce the output `ab`: - -```python -##!> assemble - ab - ##!=< myinput - ##!> assemble - ##!=> myinput - ##!< -##!< -``` - -```python -##!> assemble - ab - ##!=< myinput -##!< -##!> assemble - ##!=> myinput -##!< -``` - -Rule 930100 requires the following concatenation of rules: ``, where `slash rules` is concatenated twice. The following example produces this sequence by storing the expression for slashes with the identifier `slashes`, thus avoiding duplication: - -```python -##!> assemble - ##! slash patterns - \x5c - ##! URI encoded - %2f - %5c - ##!=< slashes - ##!=> slashes - - ##! dot patterns - \. - \.%00 - \.%01 - ##!=> - ##!=> slashes -##!< -``` - -## Definition processor - -Processor name: `define` - -### Arguments - -- Identifier (required): The name of the definition that will be processed by this processor -- Replacement (required): The string that replaces the definition identified by `identifier` - -### Output - -One line per line of input, with all definition strings replaced with the specified replacement. - -### Description - -The definition processor makes it easy to add recurring strings to expressions. This helps reduce maintenance when a definition needs to be updated. It also improves readability as definition strings provide readable and bounded information, where otherwise a regular expression must be read and boundaries must be identified. - -The format of definition strings is as follows: - -``` -{{identifier}} -``` - -The definition string starts with two opening braces, is followed by an identifier, and ends with two closing braces. The identifier format must satisfy the following regular expression: - -```python -[a-z-A-Z\d_-]+ -``` - -An identifier must have at least one character and consist only of upper and lowercase letters a through z, digits 0 through 9, and underscore or dash. - -The following example shows how to use the definition processor: - -```python -##!> define slashes [/\x5c] -regex with {{slashes}} -``` - -This would result in the output `regex with [/\x5c]`. - -## Include processor - -Processor name: `include` - -### Arguments - -- Include file name (required): The name of the file to include, without suffix -- Suffix replacements (optional): Any number of two-tuples, where the first entry is the suffix to match and the second entry is the replacement. To use, write `--` after the include file name. Tuples are space separated - -### Output - -The exact contents of the included file, including processor directives, with suffixes replaced where appropriate. The prefix and suffix markers are not allowed in included files. - -### Description - -The include processor reduces repetition across assembly files. Repeated blocks can be put into a file in the `include` directory and then be included with the `include` processor comment. Include files are normal assembly files, hence include files can also contain further include directives. The only restriction is that included files must not contain the prefix or suffix markers. This is a technical limitation in the [crs-toolchain]({{< ref "crs_toolchain" >}}). - -The contents of an include file could, for example, be the alternation of accepted HTTP methods: - -```python -POST -GET -HEAD -``` - -This could be included into an assembly file for a rule that adds an additional method: - -```python -##!> include http-headers -OPTIONS -``` - -The resulting regular expression would be `(?:POS|GE)T|HEAD|OPTIONS`. - -Additionally, definition directives of include files are available to the including file. This means that include files can be used as libraries of expressions. For example, an include file called `lib.ra` could contain the following definitions: - -```python -##!> define quotes ['"`] -##!> define opt-lazy-wspace \s*? -``` - -These definitions could then be used in an including file as follows: - -```python -##!> include lib - -it{{quotes}}s{{opt-lazy-wspace}}possible -``` - -Note that the include processor does not have a body, thus the end marker is optional. - -Please see [Include-Except processor]({{< ref "regex_assembly#include-except-processor" >}}) for how suffix replacements work. - -## Include-Except processor - -Processor name: `include-except` - -### Arguments - -- Include file name (required): The name of the file to include, without suffix -- Exclude file names (required): One or more names of files to consult for exclusions, without suffix, space separated -- Suffix replacements (optional): Any number of two-tuples, where the first entry is the suffix to match and the second entry is the replacement. To use, end the list of exclude file names with `--`. Tuples are space separated - -### Output - -The contents of the included file as per the include processor, but with all matching lines from the exclude file removed. Suffixes will have been replaced as appropriate. - -### Description - -The include-except processor further improves reusability of include files by removing exact line matches found in any of the listed exclude files from the result. A use case for this scenario is remote command execution where it is desirable to have a single list of commands but where certain commands should be excluded from some rules to avoid false positives. Consider the following list of command words: - -```python -cat -wget -who -zless -``` - -This list may be usable at paranoia level 2 or 3 but the words `cat` and `who` would produce too many false positives at paranoia level 1. To work around this issue, the following exclude file can be used: - -```python -cat -who -``` - -The regular expression for a rule at paranoia level 1 would then be generated by the following: - -```python -##!> include-except command-list pl1-exclude-list -``` - -The processor accepts more than one exclude file, each file name separated by a space. - -Additionally, the processor can be instructed to replace suffixes of entries in the include file. The use case for this is primarily that we have word lists used together with the `cmdline` processor, where entries can be suffixed with `@` or `~`. The same lists can be used in other contexts but then the `cmdline` suffixes need to be replaced with a regular expression. The following is an example, where `@` will be replaced with `[\s<>]` and `~` with `[^\s]`: - -```python -##!> include-except command-list pl1-exclude-list -- @ [\s<>] ~ [^\s] -``` - -`""` is the special literal used to represent the empty string in suffix replacements. In order to replace a suffix with the empty string one would write, for example: - -```python -##!> include-except command-list pl1-exclude-list -- @ "" ~ "" -``` - -Suffix replacement is performed _after_ all exclusions have been removed, which means that entries in exclude files must target the _verbatim_ contents of the include file, i.e., `some entry@`, not `some entry[\s<>]` - -Note that the include-exclude processor does not have a body, thus the end marker is optional. - -## Development - -We have a syntax highlight extension for Visual Studio Code that helps with writing assembly files. Instructions on how to install the extension can be found in the readme of the repository: https://github.com/coreruleset/regexp-assemble-syntax diff --git a/subsite/docs/content/development/rule_writing.md b/subsite/docs/content/development/rule_writing.md deleted file mode 100644 index 14981c4..0000000 --- a/subsite/docs/content/development/rule_writing.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: Writing Rules -weight: 20 -disableToc: false -chapter: false ---- - -> From years of experience, the CRS project has assembled a wealth of knowledge and advice on how to write clear and efficient WAF rules, as this page outlines. - -The CRS project's advice on rule writing is contained within the [contribution guidelines]({{< ref "contribution_guidelines.md" >}}), a document which can also be found in plain text form in CRS releases for offline reference. The guidelines contain invaluable guidance and tips on how to write rules, including: - -- effective regular expression writing -- consistent formatting and indentation -- rule action order -- CRS paranoia level rule compliance -- writing rule tests - -While some of the guidelines are specific to writing rules for inclusion in CRS, following the guidelines will help with the creation of *any* rule set by ensuring that rules are clear, efficient, easy to read, and easy to maintain. diff --git a/subsite/docs/content/development/sandbox.md b/subsite/docs/content/development/sandbox.md deleted file mode 100644 index 8f4fbb5..0000000 --- a/subsite/docs/content/development/sandbox.md +++ /dev/null @@ -1,184 +0,0 @@ ---- -title: Using the CRS Sandbox -weight: 60 -disableToc: false -chapter: false ---- - -## Introducing the CRS Sandbox - -We have set up a public **CRS Sandbox** which you can use to send attacks at the CRS. You can choose between various WAF engines and CRS versions. The sandbox parses audit logs and returns our detections in an easy and useful format. - -The sandbox is useful for: - -- integrators and administrators: you can test out our response in case of an urgent security event, such as the Log4j vulnerability; -- exploit developers/researchers: if you have devised a payload, you can test beforehand if it will be blocked by the CRS and by which versions; -- CRS developers/rule writers: you can quickly check if the CRS catches a (variant of an) exploit without the hassle of setting up your own CRS instance. - -## Basic usage - -The sandbox is located at https://sandbox.coreruleset.org/. - -An easy way to use the sandbox is to send requests to it with `curl`, although you can use any HTTPS client. - -The sandbox has many options, which you can change by adding HTTP headers to your request. One is very important so we will explain it first; this is the `X-Format-Output: txt-matched-rules` header. If you add this header to your request, the sandbox will parse the WAF’s output, and return to you the matched CRS rule IDs with descriptions, and the score for your request. - -### Example - -```bash -curl -H "x-format-output: txt-matched-rules" https://sandbox.coreruleset.org/?file=/etc/passwd - -930120 PL1 OS File Access Attempt -932160 PL1 Remote Command Execution: Unix Shell Code Found -949110 PL1 Inbound Anomaly Score Exceeded (Total Score: 10) -980130 PL1 Inbound Anomaly Score Exceeded (Total Inbound Score: 10 - SQLI=0,XSS=0,RFI=0,LFI=5,RCE=5,PHPI=0,HTTP=0,SESS=0): individual paranoia level scores: 10, 0, 0, 0 -``` - -In this example, we sent `?file=/etc/passwd` as a GET payload. The CRS should catch the string `/etc/passwd` which is on our blocklist. Try out the command in a terminal now if you like! - -You can send anything you want at the sandbox, for instance, you can send HTTP headers, POST data, use various HTTP methods, et cetera. - -The sandbox will return a 200 response code, no matter if an attack was detected or not. - -The sandbox also adds a `X-Unique-Id` header to the response. It contains a unique value that you can use to refer to your request when communicating with us. With `curl -i` you can see the returned headers. - -### Example showing the response headers - -```bash -curl -i -H 'x-format-output: txt-matched-rules' 'https://sandbox.coreruleset.org/?test=posix_uname()' -HTTP/1.1 200 OK -Date: Tue, 25 Jan 2022 13:53:07 GMT -Content-Type: text/plain -Transfer-Encoding: chunked -Connection: keep-alive -X-Unique-ID: YfAAw3Gq8uf24wZCMjHTcAAAANE -x-backend: apache-3.3.2 - -933150 PL1 PHP Injection Attack: High-Risk PHP Function Name Found -949110 PL1 Inbound Anomaly Score Exceeded (Total Score: 5) -980130 PL1 Inbound Anomaly Score Exceeded (Total Inbound Score: 5 - SQLI=0,XSS=0,RFI=0,LFI=0,RCE=0,PHPI=5,HTTP=0,SESS=0): individual paranoia level scores: 5, 0, 0, 0 -``` - -## Default options - -It’s useful to know that you can tweak the sandbox in various ways. If you don’t send any `X-` headers, the sandbox will use the following defaults. - -- The default backend is _Apache 2 with ModSecurity 2.9_. -- The default CRS version is the _latest release version_, currently 3.3.2. -- The default Paranoia Level is 1, which is the least strict setting. -- By default, the response is the full audit log from the WAF, which is verbose and includes unnecessary information, hence why `X-Format-Output: txt-matched-rules` is useful. - -## Changing options - -Let’s say you want to try your payload on different WAF engines or CRS versions, or like the output in a different format for automated usage. You can do this by adding the following HTTP headers to your request: - -- `x-crs-version`: will pick another CRS version. Available values are `3.3.2` (default), `3.2.1`, `nightly` (which has the latest changes which are not released) and `3.4.0-dev-log4j` (which contains an experimental rule against Log4j attacks). -- `x-crs-paranoia-level`: will run CRS in a given paranoia level. Available values are `1` (default), `2`, `3`, `4`. -- `x-crs-mode`: can be changed to return the http status code from the backend WAF. Default value is blocking (`On`), and can be changed using `detection` (will set engine to `DetectionOnly`). Values are case insensitive. -- `x-crs-inbound-anomaly-score-threshold`: defines the inbound anomaly score threshold. Valid values are any integer > 0, with `5` being the CRS default. ⚠️ Anything different than a positive integer will be taken as 0, so it will be ignored. This only makes sense if `blocking` mode is enabled (the default now). -- `x-crs-outbound-anomaly-score-threshold`: defines the outbound anomaly score threshold. Valid values are any integer > 0, with `4` being the CRS default. ⚠️ Anything different than a positive integer will be taken as 0, so it will be ignored. This only makes sense if `blocking` mode is enabled (the default now). -- `x-backend` allows you to select the specific backend web server - - `apache` (default) will send the request to **Apache 2 + ModSecurity 2.9**. - - `nginx` will send the request to **Nginx + ModSecurity 3**. - - `coraza-caddy` will send the request to **Caddy + Coraza WAF**. -- `x-format-output` formats the response to your use-case (human or automation). Available values are: - - omitted/default: the WAF’s audit log is returned unmodified as JSON - - `txt-matched-rules`: human-readable list of CRS rule matches, one rule per line - - `txt-matched-rules-extended`: same but with explanation for easy inclusion in publications - - `json-matched-rules`: JSON formatted CRS rule matches - - `csv-matched-rules`: CSV formatted - -The header names are case-insensitive. - -Tip: if you work with JSON output (either unmodified or matched rules), `jq` is a useful tool to work with the output, for example you can add `| jq .` to get a pretty-printed JSON, or use `jq` to filter and modify the output. - -### Advanced examples - -Let’s say you want to send a payload to an old CRS version **3.2.1** and choose **Nginx + ModSecurity 3** as a backend, because this is what you are interested in. You want to get the output in JSON because you want to process the results with a script. (For now, we use `jq` to pretty-print it.) - -The command would look like: - -```bash -curl -H "x-backend: nginx" \ - -H "x-crs-version: 3.2.1" \ - -H "x-format-output: json-matched-rules" \ - https://sandbox.coreruleset.org/?file=/etc/passwd | jq . - -[ - { - "message": "OS File Access Attempt", - "id": "930120", - "paranoia_level": "1" - }, - { - "message": "Remote Command Execution: Unix Shell Code Found", - "id": "932160", - "paranoia_level": "1" - }, - { - "message": "Inbound Anomaly Score Exceeded (Total Score: 10)", - "id": "949110", - "paranoia_level": "1" - } -] -``` - -Let’s say you are working on a vulnerability publication and want to add a paragraph to explain how CRS protects (or doesn’t!) against your exploit. Then the `txt-matched-rules-extended` can be a useful format for you. - -```bash -curl -H 'x-format-output: txt-matched-rules-extended' \ - https://sandbox.coreruleset.org/?file=/etc/passwd - -This payload has been tested against the OWASP ModSecurity Core Rule Set -web application firewall. The test was executed using the apache engine and CRS version 3.3.2. - -The payload is being detected by triggering the following rules: - -930120 PL1 OS File Access Attempt -932160 PL1 Remote Command Execution: Unix Shell Code Found -949110 PL1 Inbound Anomaly Score Exceeded (Total Score: 10) -980130 PL1 Inbound Anomaly Score Exceeded (Total Inbound Score: 10 - SQLI=0,XSS=0,RFI=0,LFI=5,RCE=5,PHPI=0,HTTP=0,SESS=0): individual paranoia level scores: 10, 0, 0, 0 - -CRS therefore detects this payload starting with paranoia level 1. -``` - -## Capacity - -- Please do not send more than 10 requests per second. -- We will try to scale in response to demand. - -## Architecture - -The sandbox consists of various parts. The frontend that receives the requests runs on Openresty. It handles the incoming request, chooses and configures the backend running CRS, proxies the request to the backend, and waits for the response. Then it parses the WAF audit log and sends the matched rules back in the format chosen by the user. - -![CRS sandbox diagram v3.drawio.png](https://coreruleset.org/assets/uploads/2022/01/CRS_sandbox_diagram_v3.drawio.png) - -There is a backend container for every engine and version. For instance, one Apache with CRS 3.2.2, one with CRS 3.2.1, et cetera... These are normal webserver installations with a WAF and the CRS. - -The backend writes their JSON logs to a volume to be read by a collector script and sent to S3 bucket and Elasticsearch. - -The logs are parsed, and values like User-Agent and geolocation are extracted. We use Kibana to keep an overview of how the sandbox is used, and hopefully gain new insights about attacks. - -## Known issues - -In some cases, the sandbox will not properly handle and finish your request. - -- **Malformed HTTP requests:** The frontend, Openresty, is itself a HTTP server which performs parsing of the incoming request. The backend servers running CRS are regular webservers such as Apache and Nginx. Either one of these may reject a malformed HTTP request with an error 400 before it is even processed by CRS. This happens for instance when you try to send an Apache 2.4.50 attack that depended on a URL encoding violation. If you receive an error 400, your request was rejected by the frontend or a backend, and it was not scanned by CRS. -- **ReDoS:** If your request leads to a ReDoS and makes the backend spend too much time to process a regular expression, this leads to a timeout from the backend server. The frontend will cancel the request with an error 502. If you have to wait a long time and then receive an error 502, there was likely a ReDoS situation. - -## Questions and suggestions - -If you have any issues with the CRS sandbox, please open a GitHub issue at [https://github.com/coreruleset/coreruleset/issues](https://github.com/coreruleset/coreruleset/issues) and we will help you as soon as possible. - -If you have suggestions for extra functionality, a GitHub issue is appreciated. - -## Working on the sandbox: adding new backends - -The following notes are handy for our team maintaining the sandbox. - -To add a new backend: - -- Each backend has its own IP address. -- docker-compose: copy-paste a back-end container. Give it a new unused IP address in the 10.5.0.\* virtual network. -- The frontend needs to know how to reach the desired backend. There is a hardcoded list in openresty/conf/access.lua with the target IP address. -- httpd-vhosts.conf needs to be changed. diff --git a/subsite/docs/content/development/testing.md b/subsite/docs/content/development/testing.md deleted file mode 100644 index 0a9286a..0000000 --- a/subsite/docs/content/development/testing.md +++ /dev/null @@ -1,425 +0,0 @@ ---- -title: Testing the Rule Set -weight: 40 -disableToc: false -chapter: false ---- - -# Testing for rule developers - -Well, you managed to write your rule, but now want to see if if can be added to the CRS? This document should help you to test it using the same tooling the project uses for its tests. - -CRS uses [go-ftw](https://github.com/coreruleset/go-ftw) to run test cases. **go-ftw** is the successor to the previously used test runner [ftw](https://github.com/coreruleset/ftw). The CRS project no longer uses **ftw** but it us still useful for running tests of older CRS versions. - -## Environments - -Before you start to run tests, you should set up your environment. You can use Docker to run a web server with CRS integration or use your existing environment. - -### Setting up Docker containers - -For testing, we use the [container images from our project](https://github.com/coreruleset/modsecurity-crs-docker). We "bind mount" the rules in the CRS Git repository to the web server container and then instruct **go-ftw** to send requests to it. - -To test we need two containers: the WAF itself, and a backend, provided in this case by the http://httpbin.org project. The `docker-compose.yml` in the CRS Git repository is a ready-to-run configuration for testing, to be used with the `docker compose` command. - --> The supported platform is ModSecurity 2 with Apache httpd - -Let's start the containers by executing the following command: -```bash -❯ docker compose -f tests/docker-compose.yml up -d modsec2-apache - -Creating network "tests_default" with the default driver -Creating tests_backend_1 ... done -Creating modsec2-apache ... done -❯ docker ps -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -785a6f6a3cb6 owasp/modsecurity-crs:3.3-apache "/docker-entrypoint.…" 7 seconds ago Up 3 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp modsec2-apache -bb8d5a7f256d kennethreitz/httpbin "gunicorn -b 0.0.0.0…" 10 seconds ago Up 7 seconds 80/tcp tests_backend_1 -``` - -Excellent, our containers are running, now we can start our tests. - -### Using your own environment for testing {#use-own-env} - -If you have your own environment set up, you can configure that for testing. Please [follow these instructions]({{< ref "install.md#installing-a-compatible-waf-engine" >}}) to install the WAF server locally. - --> The supported platform is ModSecurity 2 with Apache httpd. If you want to run the tests against nginx, you can do that too, but nginx uses libmodsecurity3, which is not fully compatible with Apache httpd + ModSecurity 2. - -If you want to run the complete test suite of CRS 4.0 with **go-ftw**, you need to make some modifications to your setup. This is because the test cases for 4.0 contain some extra data for responses, letting us test the `RESPONSE-*` rules too. Without the following steps these tests will fail. - -To enable response handling for tests you will need the following additional packages: `python3-gunicorn`, `gunicorn` and `python3-httpbin`. - -#### Start `httpbin` - -[`httpbin`](https://httpbin.org/) is a simple HTTP request & response service. You send a request, and it sends it back in the response. - -You can start `httpbin` with this command: - -```bash -/usr/bin/python3 /usr/bin/gunicorn --error-logfile - --access-logfile - --access-logformat "%(h)s %(t)s %(r)s %(s)s Content-Type: %({Content-Type}i)s" httpbin:app -[2023-12-14 15:59:53 +0100] [4012] [INFO] Starting gunicorn 20.1.0 -[2023-12-14 15:59:53 +0100] [4012] [INFO] Listening at: http://127.0.0.1:8000 (4012) -[2023-12-14 15:59:53 +0100] [4012] [INFO] Using worker: sync -[2023-12-14 15:59:53 +0100] [4013] [INFO] Booting worker with pid: 4013 -``` - -As you can see the HTTP server listens on 127.0.0.1:8000, you can check it: - -```bash -$ curl -X POST -H "Content-Type: application/json" -d '{"foo":"bar"}' "http://localhost:8000/anything" -{ - "args": {}, - "data": "{\"foo\":\"bar\"}", - "files": {}, - "form": {}, - "headers": { - "Accept": "*/*", - "Content-Length": "13", - "Content-Type": "application/json", - "Host": "localhost:8000", - "User-Agent": "curl/8.4.0" - }, - "json": { - "foo": "bar" - }, - "method": "POST", - "origin": "127.0.0.1", - "url": "http://localhost:8000/anything" -} -``` - -As you can see, the response's `data` field contains your request data. This feature is mandatory for testing response rules. - -### Modify webserver's config - -For the response tests you need to set up your web server as a proxy, forwarding the requests to `httpbin`. The following is an example of such a proxy setup. - -**Before you start to change your configurations, please make a backup!** - -#### Apache httpd - -Put this snippet into your httpd's default config (eg. `/etc/apache2/sites-enabled/000-default.conf`): - -``` - ProxyPreserveHost On - ProxyPass / http://127.0.0.1:8000/ - ProxyPassReverse / http://127.0.0.1:8000/ - ServerName localhost -``` - -#### nginx - -Put this snippet into the nginx default config (e.g., `/etc/nginx/conf.d/default.conf`) or replace the existing one: - -``` - location / { - - proxy_pass http://127.0.0.1:8000/; - proxy_set_header Host $host; - proxy_set_header Proxy ""; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Port $server_port; - proxy_set_header X-Forwarded-Proto $scheme; - - proxy_http_version 1.1; - proxy_buffering off; - proxy_connect_timeout 60s; - proxy_read_timeout 36000s; - proxy_redirect off; - - proxy_pass_header Authorization; - } -``` - -In both cases (Apache httpd, nginx) you have to change your `modsecurity.conf` settings. Open that file and find the directive `SecResponseBodyMimeType`. Modify the arguments: - -``` -SecResponseBodyMimeType text/plain text/html text/xml application/json -``` - -Note, that the default value does not have the MIME type `application/json`. - -In your `crs-setup.conf` you need to add these extra rules (after the rule `900990`): - -``` -SecAction \ - "id:900005,\ - phase:1,\ - nolog,\ - pass,\ - ctl:ruleEngine=DetectionOnly,\ - ctl:ruleRemoveById=910000,\ - setvar:tx.blocking_paranoia_level=4,\ - setvar:tx.crs_validate_utf8_encoding=1,\ - setvar:tx.arg_name_length=100,\ - setvar:tx.arg_length=400,\ - setvar:tx.max_file_size=64100,\ - setvar:tx.combined_file_sizes=65535" - -SecRule REQUEST_HEADERS:X-CRS-Test "@rx ^.*$" \ - "id:999999,\ - phase:1,\ - pass,\ - t:none,\ - log,\ - msg:'%{MATCHED_VAR}'" -``` - -Now, after restarting the web server all request will be sent to `httpbin`. Let's start testing. - -## Go-ftw - -Tests are performed using [go-ftw](https://github.com/coreruleset/go-ftw). We run our test suite automatically using **go-ftw** as part of a [GitHub workflow](https://github.com/coreruleset/coreruleset/blob/{{< param crs_dev_branch >}}/.github/workflows/test.yml). You can easily reproduce that locally, on your workstation. - -For that you will need: - -- the CRS Git repository -- Docker (modern versions of docker already include the `compose` command, if you are running an older version you also need to have `docker-compose` installed) - OR - [your own environment]({{< relref "#use-own-env" >}}) -- your rules and tests! - -You can download pre-compiled binaries of **go-ftw** or build from source (requires you to have a **Go** environment). The pre-compiled binaries are available [on GitHub](https://github.com/coreruleset/go-ftw/releases). The binaries are ready to run and do not require installation. - -You can also install pre-compiled binaries by using `go install`, if you have a **Go** environment: - -```bash -$ go install github.com/coreruleset/go-ftw@latest -``` - -This will install the binary into your `$HOME/go/bin` directory. To compile **go-ftw** from source, run the following commands: - -```bash -$ git clone https://github.com/coreruleset/go-ftw.git -$ cd go-ftw -$ go build -``` - -This will build the binary in the **go-ftw** repository. - -Now create a configuration file. Because Apache httpd and nginx use different log file paths, and, perhaps, different ports, you may want to create two different configuration files for **go-ftw**. For details please read [go-ftw's documentation](https://github.com/coreruleset/go-ftw#yaml-config-file). - -Example for nginx: - -```bash -$ cat .ftw.nginx.yaml -logfile: /var/log/nginx/error.log -logmarkerheadername: X-CRS-TEST -testoverride: - input: - dest_addr: "127.0.0.1" - port: 8080 -``` - -Example for Apache httpd: - -```bash -$ cat .ftw.apache.yaml -logfile: /var/log/apache2/error.log -logmarkerheadername: X-CRS-TEST -testoverride: - input: - dest_addr: "127.0.0.1" - port: 80 -``` - -Please verify that these settings are correct for your setup, especially the `port` values. - -### Running the test suite - -Execute the following command to run the CRS test suite with **go-ftw** against Apache httpd: - -```bash -$ ./go-ftw run --config .ftw.apache.yaml -d ../coreruleset/tests/regression/tests/ -🛠️ Starting tests! -🚀 Running go-ftw! -👉 executing tests in file 911100.yaml - running 911100-1: ✔ passed in 239.699575ms (RTT 126.721984ms) - running 911100-2: ✔ passed in 63.339213ms (RTT 69.998361ms) - running 911100-3: ✔ passed in 64.87875ms (RTT 71.368241ms) - running 911100-4: ✔ passed in 77.823772ms (RTT 81.059904ms) - running 911100-5: ✔ passed in 64.451749ms (RTT 70.403898ms) - running 911100-6: ✔ passed in 67.774327ms (RTT 73.803885ms) - running 911100-7: ✔ passed in 65.528094ms (RTT 72.64316ms) - running 911100-8: ✔ passed in 66.129563ms (RTT 73.198992ms) -👉 executing tests in file 913100.yaml - running 913100-1: ✔ passed in 71.242549ms (RTT 76.803619ms) - running 913100-2: ✔ passed in 69.999667ms (RTT 76.617714ms) - running 913100-3: ✔ passed in 70.200211ms (RTT 76.92281ms) - running 913100-4: ✔ passed in 65.856005ms (RTT 73.328341ms) - running 913100-5: ✔ passed in 66.986859ms (RTT 73.494356ms) - ... -``` - -To run the test suite against nginx, execute the following: - -```bash -$ ./go-ftw run --config .ftw.nginx.yaml -d ../coreruleset/tests/regression/tests/ -🛠️ Starting tests! -🚀 Running go-ftw! -👉 executing tests in file 911100.yaml - running 911100-1: ✔ passed in 851.460335ms (RTT 292.802335ms) - running 911100-2: ✔ passed in 53.748811ms (RTT 66.798867ms) - running 911100-3: ✔ passed in 49.237535ms (RTT 67.964411ms) - running 911100-4: ✔ passed in 194.935023ms (RTT 202.414171ms) - running 911100-5: ✔ passed in 52.905305ms (RTT 66.254034ms) - running 911100-6: ✔ passed in 52.597784ms (RTT 68.58854ms) - running 911100-7: ✔ passed in 51.996881ms (RTT 67.496534ms) - running 911100-8: ✔ passed in 50.804143ms (RTT 67.589557ms) -👉 executing tests in file 913100.yaml - running 913100-1: ✔ passed in 276.383507ms (RTT 85.436758ms) - running 913100-2: ✔ passed in 86.682684ms (RTT 69.89541ms) - ... -``` - -If you want to run only one test, or a group of tests, you can specify that using the "include" option `-i` (or `--include`). This option takes a regular expression: - -```bash -$ ./go-ftw run --config .ftw.apache.yaml -d ../coreruleset/tests/regression/tests/ -i "955100-1$" -``` - -In the above case only the test case `955100-1` will be run. - -If you need to see more verbose output (e.g., to look at the requests and responses sent and received by **go-ftw**) you can use the `--debug` or `--trace` options: - -```bash -$ ./go-ftw run --config .ftw.apache.yaml -d ../coreruleset/tests/regression/tests/ -i "955100-1$" --trace -``` - - -```bash -$ ./go-ftw run --config .ftw.apache.yaml -d ../coreruleset/tests/regression/tests/ -i "955100-1$" --debug -``` - -Please note again that `libmodsecurity3` is **not fully compatible** with ModSecurity 2, some tests can fail. If you want to ignore them, you can put the tests into a list in your config: - -``` -testoverride: - input: - dest_addr: "127.0.0.1" - port: 8080 - ignore: - # text comes from our friends at https://github.com/digitalwave/ftwrunner - '941190-3$': 'known MSC bug - PR #2023 (Cookie without value)' - '941330-1$': 'know MSC bug - #2148 (double escape)' - ... -``` - -For more information and examples, please check the [go-ftw documentation](https://github.com/coreruleset/go-ftw#example-usage). - -**Also please don't forget to roll back the modifications from this guide to your WAF configuration after you're done testing!** - -## FTW (deprecated) - -[ftw](https://github.com/coreruleset/ftw) is our legacy test runner, and is **deprecated** and no longer used for tests after CRS v3.2. Refer to this [GitHub workflow](https://github.com/coreruleset/coreruleset/blob/v3.2/dev/.travis.yml#L52) if you need to use the old **ftw** Python version. You can easily reproduce that locally, on your workstation. - -For that you will need: - -- the coreruleset git repository -- docker and docker-compose (modern versions of docker already include compose functionality) -- python3 -- your rules and tests! - -### Setting up the basic environment - -I normally use [pipenv](https://docs.pipenv.org/) whenever Python is involved. It will give you both isolation and dependencies at once. But you can use basic pip and virtualenv and the result will be the same. - -For installing the python tooling, just use: - -```bash -❯ pipenv install -r tests/regression/requirements.txt -Creating a virtualenv for this project... -Pipfile: /private/tmp/coreruleset/Pipfile -Using /usr/local/bin/python3 (3.9.5) to create virtualenv... -⠧ Creating virtual environment...created virtual environment CPython3.9.5.final.0-64 in 392ms - creator CPython3Posix(dest=/Users/fzipitria/.local/share/virtualenvs/coreruleset-UNJnkEXP, clear=False, global=False) - seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/Users/fzipitria/Library/Application Support/virtualenv) - added seed packages: pip==21.0.1, setuptools==56.0.0, wheel==0.36.2 - activators BashActivator,CShellActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator - -✔ Successfully created virtual environment! -Virtualenv location: /Users/fzipitria/.local/share/virtualenvs/coreruleset-UNJnkEXP -Creating a Pipfile for this project... -Requirements file provided! Importing into Pipfile... -Pipfile.lock not found, creating... -Locking [dev-packages] dependencies... -Locking [packages] dependencies... -Building requirements... -Resolving dependencies... -✔ Success! -Updated Pipfile.lock (02e6ae)! -Installing dependencies from Pipfile.lock (02e6ae)... - 🐍 ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 17/17 — 00:00:28 -To activate this project's virtualenv, run pipenv shell. -Alternatively, run a command inside the virtualenv with pipenv run. -``` - -Now we are ready to start running tests. - -### Running the test suite - -The test suite will be run by the tool `ftw`, now that we started our containers. - -If you used the `pipenv` tool for installing the module, now is time to enter the shell: -```bash -❯ py.test -vs --tb=short tests/regression/CRS_Tests.py --config=modsec2-apache --ruledir_recurse=./tests/regression/tests -============================================================================== test session starts =============================================================================== -platform darwin -- Python 3.9.5, pytest-4.6.0, py-1.10.0, pluggy-0.13.1 -- /Users/fzipitria/.local/share/virtualenvs/coreruleset-bLfwOI0B/bin/python -cachedir: .pytest_cache -rootdir: /Users/fzipitria/Workspace/OWASP/coreruleset -plugins: ftw-1.2.4 -collected 2468 items - -tests/regression/CRS_Tests.py::test_crs[ruleset0-933210.yaml -- 933210-1] PASSED -tests/regression/CRS_Tests.py::test_crs[ruleset1-933210.yaml -- 933210-2] PASSED -tests/regression/CRS_Tests.py::test_crs[ruleset2-933210.yaml -- 933210-3] PASSED -tests/regression/CRS_Tests.py::test_crs[ruleset3-933210.yaml -- 933210-4] PASSED -tests/regression/CRS_Tests.py::test_crs[ruleset4-933210.yaml -- 933210-5] PASSED -tests/regression/CRS_Tests.py::test_crs[ruleset5-933210.yaml -- 933210-6] PASSED -tests/regression/CRS_Tests.py::test_crs[ruleset6-933210.yaml -- 933210-7] PASSED -tests/regression/CRS_Tests.py::test_crs[ruleset7-933210.yaml -- 933210-8] PASSED -tests/regression/CRS_Tests.py::test_crs[ruleset8-933210.yaml -- 933210-9] PASSED -tests/regression/CRS_Tests.py::test_crs[ruleset9-933210.yaml -- 933210-10] PASSED -tests/regression/CRS_Tests.py::test_crs[ruleset10-933210.yaml -- 933210-11] PASSED -tests/regression/CRS_Tests.py::test_crs[ruleset11-933210.yaml -- 933210-12] PASSED -tests/regression/CRS_Tests.py::test_crs[ruleset12-933210.yaml -- 933210-13] PASSED -... -``` - -Couple notes here: -- using `--ruledir_recurse=./tests/regression/tests` will walk over all the tests defined below that directory -- you can test your specific file using `--rule=./mytest.yaml` - -```bash -❯ py.test -vs --tb=short tests/regression/CRS_Tests.py --config=modsec2-apache --rule=./mytest.yaml -============================================================================== test session starts =============================================================================== -platform darwin -- Python 3.9.5, pytest-4.6.0, py-1.10.0, pluggy-0.13.1 -- /Users/fzipitria/.local/share/virtualenvs/coreruleset-bLfwOI0B/bin/python -cachedir: .pytest_cache -rootdir: /Users/fzipitria/Workspace/OWASP/coreruleset -plugins: ftw-1.2.4 -collected 1 item - -tests/regression/CRS_Tests.py::test_crs[ruleset0-mytest.yaml -- mytest-1] PASSED - -================================================================================ warnings summary ================================================================================ -/Users/fzipitria/.local/share/virtualenvs/coreruleset-bLfwOI0B/lib/python3.9/site-packages/yaml/constructor.py:126 - /Users/fzipitria/.local/share/virtualenvs/coreruleset-bLfwOI0B/lib/python3.9/site-packages/yaml/constructor.py:126: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3, and in 3.10 it will stop working - if not isinstance(key, collections.Hashable): - --- Docs: https://docs.pytest.org/en/latest/warnings.html -====================================================================== 1 passed, 1 warnings in 0.36 seconds ====================================================================== -``` - -That's it! - -## Additional tips - -⚠️ If your test is not matching, you can take a peek at the `modsec_audit.log` file, using: `sudo tail -200 tests/logs/modsec2-apache/modsec_audit.log` - -🔧 If you need to write a test that cannot be written using text (e.g. binary content), we prefer using `encoded_request` in the test, using base64 encoding - -## Summary - -Tests are a core functionality in our ruleset. So whenever you write a rule, try to add some positive and negative tests so we won't have surprises in the future. - -Happy testing! 🎉 diff --git a/subsite/docs/content/development/useful_tools.md b/subsite/docs/content/development/useful_tools.md deleted file mode 100644 index 0ce1a9c..0000000 --- a/subsite/docs/content/development/useful_tools.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: Useful Tools -weight: 30 -disableToc: false -chapter: false ---- - -> There are many first and third party tools that help with ModSecurity and CRS development. The most useful ones are listed here. Get in touch if you think something is missing. - -## coraza-httpbin - -https://github.com/jcchavezs/coraza-httpbin - -A Coraza plus reverse proxy container for testing. Makes it possible to easily test CRS with Coraza in a similar way to testing CRS using the Apache and Nginx Docker containers. - -A local CRS installation can be included using directives in a `directives.conf` file like so: - -``` -Include ../coreruleset/crs-setup.conf.example -Include ../coreruleset/rules/*.conf -``` - -## crs-toolchain - -https://github.com/coreruleset/crs-toolchain - -The CRS developer's toolbelt. Documentation lives at [crs-toolchain]({{< ref "crs_toolchain" >}}). - -## Go-FTW - -https://github.com/coreruleset/go-ftw - -*Framework for Testing WAFs in Go.* A Go-based rewrite of the original Python FTW project. - -## Official CRS Maintained Docker Images - -### ModSecurity Core Rule Set Docker Image - -https://github.com/coreruleset/modsecurity-crs-docker - -A Docker image supporting the latest stable CRS release on: - -- the latest stable ModSecurity v2 on Apache -- the latest stable ModSecurity v3 on Nginx - -## msc_pyparser - -https://github.com/digitalwave/msc_pyparser - -A ModSecurity config parser. Makes it possible to modify SecRules en masse, for example adding a tag to every rule in a rule set simultaneously. - -## msc_retest (RE test) - -https://github.com/digitalwave/msc_retest - -An invaluable tool for testing how regular expressions behave *and perform* in both `mod_security2` (the Apache module) and `libModSecurity` (ModSecurity v3). - -## Regexploit - -https://github.com/doyensec/regexploit - -A tool for testing and finding regular expressions that are vulnerable to regular expression denial of service attacks ([ReDoS](https://en.wikipedia.org/wiki/ReDoS)). diff --git a/subsite/docs/content/miscellaneous/_index.md b/subsite/docs/content/miscellaneous/_index.md deleted file mode 100644 index e0b29b0..0000000 --- a/subsite/docs/content/miscellaneous/_index.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Miscellaneous -weight: 70 -pre: "7. " -chapter: true ---- - -# Miscellaneous - -The content here doesn't fit anywhere else just yet. This whole section will probably be reworked and is only temporary. diff --git a/subsite/docs/content/miscellaneous/self_contained_mode.md b/subsite/docs/content/miscellaneous/self_contained_mode.md deleted file mode 100644 index a82e74c..0000000 --- a/subsite/docs/content/miscellaneous/self_contained_mode.md +++ /dev/null @@ -1,86 +0,0 @@ ---- -title: Self-Contained Mode -weight: 10 -disableToc: false -chapter: false ---- - -## Self-Contained Mode - -### Traditional Detection Mode (deprecated) - -The default mode in CRS 3.x is Anomaly Scoring mode, you can verify this -is your mode by checking that the SecDefaultAction line in the -crs-setup.conf file usees the pass action: - -```apache -SecDefaultAction "phase:2,pass,log" -``` - -{{% notice warning %}} -From version 3.0 onwards, Anomaly Scoring is the default detection mode. Traditional detection mode is discouraged. -{{% /notice %}} - -(AH) Summary: traditional, self-contained mode: a rule match (alert) causes an immediate block. - -Traditional Detection Mode (or IDS/IPS mode) is the old default -operating mode. This is the most basic operating mode where all of the -rules are "self-contained". In this mode there is no intelligence is -shared between rules and each rule has no information about any previous -rule matches. That is to say, in this mode, if a rule triggers, it will -execute any disruptive/logging actions specified on the current rule. - -### Configuring Traditional Mode - -If you want to run the CRS in Traditional mode, you can do this easily -by modifying the SecDefaultAction directive in the crs-setup.conf file -to use a disruptive action other than the default \'pass\', such as -deny: - -```apache -# Default (Anomaly Mode) -SecDefaultAction "phase:2,pass,log" -``` - -```apache -# Updated To Enable Traditional Mode -SecDefaultAction "phase:2,deny,status:403,log" -``` - -### Pros and Cons of Traditional Detection Mode - -Pros - -- The functionality of this mode is much easier for a new user to - understand. -- Better performance (lower latency and resource usage) as the first disruptive - match will stop further processing. - -Cons - -- Not all rules are executed, so not all rules that *could* have been - triggered will match. As such, logging information on a successful - block is less useful, as only the first detected threat is logged -- Not every site has the same risk tolerance -- Lower severity alerts may not trigger traditional mode -- Single low severity alerts may not be deemed critical enough to - block, but multiple lower severity alerts in aggregate could be - -### Pros and Cons of Anomaly Scoring Detection Mode - -Pros -- An increased confidence in blocking - since more detection rules - contribute to the anomaly score, the higher the score, the more - confidence you can have in blocking malicious transactions. -- Flexibility for setting blocking policies. Allows users to set a threshold that is appropriate for them - - different sites may have different thresholds for blocking. -- Allows several low severity events to trigger alerts while - individual ones are suppressed. -- One correlated event helps alert management. -- Exceptions may be handled by either increasing the overall anomaly - score threshold, or by adding local custom exceptions file -- More accurate log information, as all rules execute - -Cons -- More complex for the average user. -- Log monitoring scripts may need to be updated for proper analysis diff --git a/subsite/docs/content/operation/_index.md b/subsite/docs/content/operation/_index.md deleted file mode 100644 index 28e27e6..0000000 --- a/subsite/docs/content/operation/_index.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Operation -weight: 30 -pre: "3. " -chapter: true ---- - -# Operation diff --git a/subsite/docs/content/operation/containers.md b/subsite/docs/content/operation/containers.md deleted file mode 100644 index 54bb40e..0000000 --- a/subsite/docs/content/operation/containers.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: Using Containers -weight: 20 -disableToc: false -chapter: false ---- - -The CRS project maintains a set of 'CRS with ModSecurity' Docker images. - -A full operational guide on how to use and deploy these images will be written in the future. In the meantime, refer to the GitHub README page for more information on how to use these official container images. - -## ModSecurity Core Rule Set Docker Image - -https://github.com/coreruleset/modsecurity-crs-docker - -A Docker image supporting the latest stable CRS release on: - -- the latest stable ModSecurity v2 on Apache -- the latest stable ModSecurity v3 on Nginx diff --git a/subsite/docs/content/operation/known_issues.md b/subsite/docs/content/operation/known_issues.md deleted file mode 100644 index 2329271..0000000 --- a/subsite/docs/content/operation/known_issues.md +++ /dev/null @@ -1,70 +0,0 @@ ---- -title: Known Issues -weight: 10 -disableToc: false -chapter: false ---- - -> There are some *known issues* with CRS and some of its compatible WAF engines. This page describes these issues. Get in touch if you think something is missing. - -- There are still **false positives** for standard web applications in the default install (paranoia level 1). Please [report these on GitHub](https://github.com/coreruleset/coreruleset/issues/new/choose) if and when encountered. - - False positives from paranoia level 2 and higher are considered to be less interesting, as it is expected that users will write exclusion rules for their alerts in the higher paranoia levels. Nevertheless, false positives from higher paranoia levels can still be reported and the CRS project will try to find a generic solution for them. - -- **Apache** may give an error on startup when the CRS is loaded: - - ``` - AH00111: Config variable ${[^} is not defined - ``` - - It appears that Apache tries to be smart by trying to evaluate a config variable. This notice should be a warning and can be safely ignored. The problem has been investigated and a solution has not been found yet. - -- **ModSecurity 3.0.0-3.0.2** will give an error: - - ``` - Expecting an action, got: ctl:requestBodyProcessor=URLENCODED"` - ``` - - Support for the URLENCODED body processor was only added in ModSecurity 3.0.3. To resolve this, upgrade to ModSecurity 3.0.3 or higher. - -- **Debian** releases up to and including Jessie lack YAJL/JSON support in ModSecurity. This causes the following error in the Apache ErrorLog or SecAuditLog: - - ``` - ModSecurity: JSON support was not enabled. - ``` - - JSON support was enabled in Debian's package version 2.8.0-4 (Nov 2014). To resolve this, it is possible to either use `backports.debian.org` to install the latest ModSecurity - release or to disable the rule with ID 200001. - -- **Apache 2.4 prior to 2.4.11** is affected by a bug in parsing multi-line configuration directives, which causes Apache to fail during startup with an error such as: - - ```plaintext - Error parsing actions: Unknown action: \\ - Action 'configtest' failed.` - ``` - - This bug is known to plague RHEL/Centos 7 below v7.4 or httpd v2.4.6 release 67 and Ubuntu 14.04 LTS users. (The original bug report can be found at https://bz.apache.org/bugzilla/show_bug.cgi?id=55910\). - - It is advisable to upgrade an affected Apache version. If upgrading is not possible, the CRS project provides a script in the `util/join-multiline-rules` directory which converts the rules into a format that works around the bug. This script must be re-run whenever the CRS rules are modified or updated. - -- As of CRS version 3.0.1, support has been added for the `application/soap+xml` MIME type by default, as specified in RFC 3902. **OF IMPORTANCE:** application/soap+xml is indicative that XML will be provided. In accordance with this, ModSecurity's XML request body processor should also be configured to support this MIME type. Within the ModSecurity project, [commit 5e4e2af](https://github.com/owasp-modsecurity/ModSecurity/commit/5e4e2af7a6f07854fee6ed36ef4a381d4e03960e) has been merged to support this endeavor. However, if running a modified or preexisting version of the modsecurity.conf file provided by this repository, it is a good idea to upgrade rule '200000' accordingly. The rule now appears as follows: - - ``` - SecRule REQUEST_HEADERS:Content-Type "(?:application(?:/soap\+|/)|text/)xml" \ - "id:'200000',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=XML" - ``` -- **All versions of libmodsecurity3** [do not support](https://github.com/owasp-modsecurity/ModSecurity/wiki/Reference-Manual-(v3.x)#secdisablebackendcompression) the `SecDisableBackendCompression` directive at all. -If Nginx is acting as a proxy and the backend supports any type of compression, if the client sends an `Accept-Encoding: gzip,deflate,...` or `TE` header, the backend will return the response in a compressed format. Because of this, the engine cannot verify the response. As a workaround, you need to override the `Accept-Encoding` and `TE` headers in the proxy: - - ``` - server { - server_name foo.com; - ... - location / { - proxy_pass http://backend; - ... - proxy_set_header Accept-Encoding ""; - proxy_set_header TE ""; - } - } - ``` diff --git a/subsite/docs/content/operation/kubernetes_ingress.md b/subsite/docs/content/operation/kubernetes_ingress.md deleted file mode 100644 index 7b387f4..0000000 --- a/subsite/docs/content/operation/kubernetes_ingress.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: Kubernetes Ingress Controllers -weight: 30 -disableToc: false -chapter: false ---- - -> A Kubernetes cluster can use different types of _ingress controllers_ to expose Kubernetes services outside the cluster. Some ingress controllers include built-in support for using CRS, as this page outlines. - -## NGINX Ingress Controller - -The [NGINX Ingress Controller](https://github.com/kubernetes/ingress-nginx) is built around the [Kubernetes Ingress resource](https://kubernetes.io/docs/concepts/services-networking/ingress/). It uses a [ConfigMap](https://kubernetes.io/docs/concepts/configuration/configmap/) to store the controller configuration. - -Refer to the [official Kubernetes documentation](https://docs.k8s.io) to learn more about using the [Ingress resource](https://kubernetes.io/docs/concepts/services-networking/ingress/). - -### Installing - -Refer to the [upstream installation guide](https://github.com/kubernetes/ingress-nginx/blob/main/docs/deploy/index.md) for a whirlwind tour to get started. - -### Configuration - -The upstream project provides [many examples](https://github.com/kubernetes/ingress-nginx/tree/main/docs/examples) of how to configure the controller. These are a good starting point. - -{{% notice info %}} -All of the configuration is done via the ConfigMap. All options for ModSecurity and CRS can be found in the [annotations list](https://github.com/kubernetes/ingress-nginx/blob/main/docs/user-guide/nginx-configuration/annotations.md#modsecurity). -{{% /notice %}} - -The default ModSecurity configuration file is located at `/etc/nginx/modsecurity/modsecurity.conf`. This is the only file located in this directory and it contains the default recommended configuration. Using a volume, this file can be replaced with the desired configuration. To enable the ModSecurity feature, specify `enable-modsecurity: "true"` in the configuration ConfigMap. - -The directory `/etc/nginx/owasp-modsecurity-crs` contains the CRS repository. Use `enable-owasp-modsecurity-crs: "true"` to enable use of the CRS rules. - -### Common Problems - -{{% notice tip %}} -To get *individual rule alerts*, if they're not visible in the error log (for example, if only log entries for rule `949110` are present in the log file), make sure to set the annotation `error-log-level: warn`. -{{% /notice %}} diff --git a/subsite/docs/content/operation/log_handling.md b/subsite/docs/content/operation/log_handling.md deleted file mode 100644 index 282c6ef..0000000 --- a/subsite/docs/content/operation/log_handling.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Log Handling -weight: 40 -disableToc: false -chapter: false ---- - -A full operational guide on how to handle and consume the logs emitted by CRS and its compatible WAF engines will be written in the future. diff --git a/subsite/docs/content/rules/_index.md b/subsite/docs/content/rules/_index.md deleted file mode 100644 index 0330622..0000000 --- a/subsite/docs/content/rules/_index.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Rules -weight: 40 -pre: "4. " -chapter: true ---- - -# Rules diff --git a/subsite/docs/content/rules/creating.md b/subsite/docs/content/rules/creating.md deleted file mode 100644 index 3f51071..0000000 --- a/subsite/docs/content/rules/creating.md +++ /dev/null @@ -1,270 +0,0 @@ ---- -title: Making -weight: 30 -disableToc: false -chapter: false ---- - -{{% notice note %}} -**The content on this page may be outdated.** We are currently in the process of rewriting all of our documentation: please bear with us while we update our older content. -{{% /notice %}} - -## Making Rules - -### The Basic Syntax - -A [SecRule](https://github.com/owasp-modsecurity/ModSecurity/wiki/Reference-Manual-(v2.x)#SecRule) -is a directive like any other understood by ModSecurity. The difference -is that this directive is way more powerful in what it is capable of -representing. Generally, a SecRule is made up of 4 parts: -- Variables - Instructs ModSecurity *where* to look (sometimes called Targets) -- Operators - Instructs ModSecurity *when* to trigger a match -- Transformations - Instructs ModSecurity *how* it should normalize variable data -- Actions - Instructs ModSecurity *what* to do if a rule matches - -The structure of the rule is as follows: - -```apache -SecRule VARIABLES "OPERATOR" "TRANSFORMATIONS,ACTIONS" -``` - -A very basic rule looks as follows: - -```apache -SecRule REQUEST_URI "@streq /index.php" "id:1,phase:1,t:lowercase,deny" -``` - -The preceding rule will take each HTTP Request and obtain just the URI -portion. From there is will transform the URI value to lowercase. -Subsequently it will check to see if that transformed value is equal to -exactly `'/index.php'`. If it is Modsecurity will deny the request, that -is, it will stop processing further rules and intercept the request. - -As can be seen from the previous explaination, one of the unique things -about the SecRule directive is that each SecRule listed in your -configuration is evaluated on each transaction. All the other -ModSecurity directives are only evaluated at startup. - -Clearly, if this was all there was to SecRules it wouldn't be very -powerful. In fact, there is a lot more. So much more that it is in fact -a full fledged language. The best place to find out about all the -possible capabilities is via the [ModSecurity Manual](https://github.com/owasp-modsecurity/ModSecurity/wiki/Reference-Manual-(v2.x)). -The following is just a glimpse of its capabilities: - -There are ~105 **variables** in 6 different categories, some examples -include: - -- **Request Variables** - ARGS, REQUEST\_HEADERS, REQUEST\_COOKIES -- **Response Variables** - RESPONSE\_HEADERS, RESPONSE\_BODY -- **Server Variables** - REMOTE\_ADDR, AUTH\_TYPE -- **Time Variables** - TIME, TIME\_EPOCH, TIME\_HOUR -- **Collection Variables** - TX, IP, SESSION, GEO -- **Miscellaneous Variables** - HIGHEST\_SEVERITY, MATCHED\_VAR - -There are \~36 **operators** in 4 different categories, some examples -include: - -- **String Operators** - rx, pm, beginsWith, contains, endsWith, - streq, within -- **Numerical Operators** - eq, ge, gt, le, lt -- **Validation Operators** - validateByteRange, validateUrlEncoding, - validateSchema -- **Miscellaneous Operators** - rbl, geoLookup, inspectFile, verifyCC - -There are \~35 **transformation** functions in 6 different categories, -some examples include: - -- **Anti-Evasion Functions** - lowercase, normalisePath, removeNulls, - replaceComments, compressWhitespace -- **Decoding Functions** - base64Decode, hexDecode, jsDecode, - urlDecodeUni -- **Encoding Functions** - base64Encode, hexEncode -- **Hashing Functions** - sha1, md5 - -There are \~47 **actions** in 6 different categories, some examples -include: - -- **Disruptive Actions** - block, drop, deny, proxy -- **Flow Actions** - chain, skip, skipAfter -- **Metadata Actions** - phase, id, msg, severity, tag -- **Variable Actions** - capture, setvar, initcol -- **Logging Actions** - log, auditlog, nolog, sanitiseArg -- **Miscellaneous Actions** - ctl, multiMatch, exec, pause, - append/prepend - -While there are a lot of options available there are a few basic things -to remember. - -1. Every SecRule must have a VARIABLE -2. Every SecRule must have an OPERATOR, if none is listed \@rx is - implied. -3. Every SecRule must have an ACTION. The only required action is id, - however, several actions are implied by SecDefaultAction (default - phase:2,log,auditlog,pass) -4. Every SecRule must have an phase ACTION, this tells the rule when to - fire. If no phase is included the default is phase:2. -5. Every SecRule must have a disruptive ACTION. This is an action that - describes what to do with the transaction if triggered. If no - disruptive action is included the default is pass -6. Transformations are optional but should be used to prevent your rule - from being bypassed - -Advanced Variable Usage ------------------------ - -Variables themselves are quite easy to access as our earlier rules have -shown. There are a couple of corner cases though. Not all variables are -strings. Some variables, like ARGS\_GET are **Collections**. A -collection is very similar to a dictionary in Python, it is a key value -pair of information. For instance if our request URI was - our collection might look like -ARGS\_GET = {\"x\" : \"test\", \"y\" : \"test2\"}. When we request an -VARIABLE that is a collection, ModSecurity will iterate over each value -in the collection, applying transformations and checking against the -operator, until it finds a match. If it finds a match it will stop -processing the rule and undertake any actions specified. - -```apache -SecRule ARGS_GET "@contains test" "id:1,phase:1,t:lowercase,deny" -``` - -It is possible to access just an index of a collection as well. This -makes addressing specific variable very easy. To do this within the -VARIABLE area of a SecRule you use the \':\' (colon). - -```apache -SecRule ARGS_GET:username "@contains admin" "id:1,phase:1,t:lowercase,deny" -``` - -One operator is nice but what if I have to apply one operator on -multiple rules, for instance I want to check GET parameters and COOKIES. -ModSecurity provides a way for you to do this. You can use the \'\|\' -(pipe) to combine two VARIABLES into one rule. This pipe can be applied -as many times as you want. In the example below we combine both GET and -POST arguments. In fact, this is not necessary in reality as there is a -built in ARGS collections that already does this. - -```apache -SecRule ARGS_GET|ARGS_POST|REQUEST_COOKIES "@rx hello\s\d{1,3}" "id:1,phase:2,t:lowercase,deny" -``` - -If you are having a problem where one of your variables is causing false -positives or you just don\'t want to look there you can also remove an -index of a collection using the \'!\' (exclamation mark). This almost -always used in conjunction with the pipe and an index, ModSecurity will -understand that this means remove this index from the collection - -```apache -SecRule ARGS|!ARGS:password "@rx (admin|administrator)" "id:1,phase:2,t:lowercase,deny" -``` - -Advanced Transformation Usage ------------------------------ - -The concept of transformations is very intuitive and thanks to -ModSecurity\'s open source nature there are quite a few to choose from. -An issue arises in that the proper application of transformations often -takes knowledge about how the threat you are trying to stop can manifest -itself. Imagine the following example - you are trying to detect an XSS -(Cross Site Scripting) attack. - -Your first attempt looks like the following: - -```apache -SecRule ARGS "@contains - - - - diff --git a/subsite/docs/layouts/partials/file-description.html b/subsite/docs/layouts/partials/file-description.html deleted file mode 100644 index cf714d3..0000000 --- a/subsite/docs/layouts/partials/file-description.html +++ /dev/null @@ -1 +0,0 @@ -| {{ .file }} | {{ .description | markdownify }} | \ No newline at end of file diff --git a/subsite/docs/layouts/partials/logo.html b/subsite/docs/layouts/partials/logo.html deleted file mode 100644 index b755a04..0000000 --- a/subsite/docs/layouts/partials/logo.html +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/subsite/docs/layouts/shortcodes/crsfiles.html b/subsite/docs/layouts/shortcodes/crsfiles.html deleted file mode 100644 index 3f9c167..0000000 --- a/subsite/docs/layouts/shortcodes/crsfiles.html +++ /dev/null @@ -1,17 +0,0 @@ -{{- $urlPre := "https://api.github.com" -}} -{{- $crsversion := .Site.Param "crs_latest_release" -}} -{{- $prefix := .Site.Param "crs_install_dir" -}} -{{- $prepend := .Get "prepend" | default "" -}} -{{- $filesJ := getJSON $urlPre (printf "/repos/coreruleset/coreruleset/git/trees/v%s" $crsversion) "?recursive=1" -}} -{{- $text := slice -}} -{{- range $idx, $file := $filesJ.tree -}} - {{- if eq $file.type "blob" -}} - {{- if strings.HasSuffix $file.path "example" -}} - {{- $text = $text | append (printf "%s%s/%s" $prepend $prefix (strings.TrimSuffix ".example" $file.path) ) -}} - {{- end -}} - {{- if and (eq (path.Dir $file.path) "rules") (strings.HasSuffix $file.path "conf") -}} - {{- $text = $text | append (printf "%s%s/%s" $prepend $prefix $file.path) -}} - {{- end -}} - {{- end -}} -{{- end -}} -{{ htmlEscape (delimit $text "\n") }} diff --git a/subsite/docs/layouts/shortcodes/describe-rules.html b/subsite/docs/layouts/shortcodes/describe-rules.html deleted file mode 100644 index 4f59369..0000000 --- a/subsite/docs/layouts/shortcodes/describe-rules.html +++ /dev/null @@ -1,7 +0,0 @@ -{{- $crsversion := .Get "version" -}} -{{- $files := merge $.Site.Data.filesdescription.common (index $.Site.Data.filesdescription.versioned $crsversion)}} -| Rule File | Description | -|:--------------------------------------------------------|-------------| -{{- range $file, $description:= $files }} - {{ partial "file-description.html" (dict "context" . "file" $file "description" $description) }} -{{- end }} diff --git a/subsite/docs/layouts/shortcodes/resource-ref.html b/subsite/docs/layouts/shortcodes/resource-ref.html deleted file mode 100644 index d69b7f6..0000000 --- a/subsite/docs/layouts/shortcodes/resource-ref.html +++ /dev/null @@ -1,4 +0,0 @@ -{{ $resource := resources.Get ($.Get 0) }} -{{ with $resource }} -{{- $resource.Permalink -}} -{{ end }} \ No newline at end of file diff --git a/subsite/docs/static/images/as_inbound.svg b/subsite/docs/static/images/as_inbound.svg deleted file mode 100644 index 56d6635..0000000 --- a/subsite/docs/static/images/as_inbound.svg +++ /dev/null @@ -1,794 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - Rule 1(+2 rule)NO MATCH - Rule 2(+5 rule)MATCH - - - - - Rule 3(+2 rule)MATCH - - - - - - - - 0 - - HTTP request - Anomaly score - - - - 5 - - - - 7 - - - - - - 7 - - BlockingevaluationDENY - Inbound anomalyscore threshold: 5 - - - - - - - - - - - Rule 1(+2 rule)NO MATCH - Rule 2(+5 rule)NO MATCH - - - - - Rule 3(+2 rule)NO MATCH - - - - - - - 0 - - - - 0 - - - - 0 - - - - - - 0 - - BlockingevaluationPASS - Inbound anomalyscore threshold: 5 - - - - - - - - - - - diff --git a/subsite/docs/static/images/as_inbound_no_fonts.svg b/subsite/docs/static/images/as_inbound_no_fonts.svg deleted file mode 100644 index 45ae1b9..0000000 --- a/subsite/docs/static/images/as_inbound_no_fonts.svg +++ /dev/null @@ -1,1598 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/subsite/docs/static/images/favicon.png b/subsite/docs/static/images/favicon.png deleted file mode 100644 index 5e41752..0000000 Binary files a/subsite/docs/static/images/favicon.png and /dev/null differ diff --git a/subsite/docs/static/images/logo.png b/subsite/docs/static/images/logo.png deleted file mode 100644 index 9b34cd5..0000000 Binary files a/subsite/docs/static/images/logo.png and /dev/null differ diff --git a/subsite/docs/static/images/pl_onion.svg b/subsite/docs/static/images/pl_onion.svg deleted file mode 100644 index de303d3..0000000 --- a/subsite/docs/static/images/pl_onion.svg +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - - - - - PL 4PL 3PL 2PL 1 - - Very aggressive rulesFalse positives likely - - Less aggressive rulesFalse positives rare - - diff --git a/subsite/docs/static/images/pl_onion_no_fonts.svg b/subsite/docs/static/images/pl_onion_no_fonts.svg deleted file mode 100644 index af21c6e..0000000 --- a/subsite/docs/static/images/pl_onion_no_fonts.svg +++ /dev/null @@ -1,426 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/subsite/docs/static/js/highlight.pack.js b/subsite/docs/static/js/highlight.pack.js deleted file mode 100644 index 6e3f316..0000000 --- a/subsite/docs/static/js/highlight.pack.js +++ /dev/null @@ -1,846 +0,0 @@ -/*! - Highlight.js v11.0.1 (git: 1cf31f015d) - (c) 2006-2021 Ivan Sagalaev and other contributors - License: BSD-3-Clause - */ -var hljs=function(){"use strict";var e={exports:{}};function t(e){ -return e instanceof Map?e.clear=e.delete=e.set=()=>{ -throw Error("map is read-only")}:e instanceof Set&&(e.add=e.clear=e.delete=()=>{ -throw Error("set is read-only") -}),Object.freeze(e),Object.getOwnPropertyNames(e).forEach((n=>{var i=e[n] -;"object"!=typeof i||Object.isFrozen(i)||t(i)})),e} -e.exports=t,e.exports.default=t;var n=e.exports;class i{constructor(e){ -void 0===e.data&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1} -ignoreMatch(){this.isMatchIgnored=!0}}function r(e){ -return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'") -}function s(e,...t){const n=Object.create(null);for(const t in e)n[t]=e[t] -;return t.forEach((e=>{for(const t in e)n[t]=e[t]})),n}const o=e=>!!e.kind -;class a{constructor(e,t){ -this.buffer="",this.classPrefix=t.classPrefix,e.walk(this)}addText(e){ -this.buffer+=r(e)}openNode(e){if(!o(e))return;let t=e.kind -;t=e.sublanguage?"language-"+t:((e,{prefix:t})=>{if(e.includes(".")){ -const n=e.split(".") -;return[`${t}${n.shift()}`,...n.map(((e,t)=>`${e}${"_".repeat(t+1)}`))].join(" ") -}return`${t}${e}`})(t,{prefix:this.classPrefix}),this.span(t)}closeNode(e){ -o(e)&&(this.buffer+="")}value(){return this.buffer}span(e){ -this.buffer+=``}}class l{constructor(){this.rootNode={ -children:[]},this.stack=[this.rootNode]}get top(){ -return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){ -this.top.children.push(e)}openNode(e){const t={kind:e,children:[]} -;this.add(t),this.stack.push(t)}closeNode(){ -if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){ -for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)} -walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,t){ -return"string"==typeof t?e.addText(t):t.children&&(e.openNode(t), -t.children.forEach((t=>this._walk(e,t))),e.closeNode(t)),e}static _collapse(e){ -"string"!=typeof e&&e.children&&(e.children.every((e=>"string"==typeof e))?e.children=[e.children.join("")]:e.children.forEach((e=>{ -l._collapse(e)})))}}class c extends l{constructor(e){super(),this.options=e} -addKeyword(e,t){""!==e&&(this.openNode(t),this.addText(e),this.closeNode())} -addText(e){""!==e&&this.add(e)}addSublanguage(e,t){const n=e.root -;n.kind=t,n.sublanguage=!0,this.add(n)}toHTML(){ -return new a(this,this.options).value()}finalize(){return!0}}function g(e){ -return e?"string"==typeof e?e:e.source:null}function d(...e){ -return e.map((e=>g(e))).join("")}function u(...e){return"("+((e=>{ -const t=e[e.length-1] -;return"object"==typeof t&&t.constructor===Object?(e.splice(e.length-1,1),t):{} -})(e).capture?"":"?:")+e.map((e=>g(e))).join("|")+")"}function h(e){ -return RegExp(e.toString()+"|").exec("").length-1} -const f=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./ -;function p(e,{joinWith:t}){let n=0;return e.map((e=>{n+=1;const t=n -;let i=g(e),r="";for(;i.length>0;){const e=f.exec(i);if(!e){r+=i;break} -r+=i.substring(0,e.index), -i=i.substring(e.index+e[0].length),"\\"===e[0][0]&&e[1]?r+="\\"+(Number(e[1])+t):(r+=e[0], -"("===e[0]&&n++)}return r})).map((e=>`(${e})`)).join(t)} -const b="[a-zA-Z]\\w*",m="[a-zA-Z_]\\w*",E="\\b\\d+(\\.\\d+)?",x="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",y="\\b(0b[01]+)",w={ -begin:"\\\\[\\s\\S]",relevance:0},_={scope:"string",begin:"'",end:"'", -illegal:"\\n",contains:[w]},v={scope:"string",begin:'"',end:'"',illegal:"\\n", -contains:[w]},O=(e,t,n={})=>{const i=s({scope:"comment",begin:e,end:t, -contains:[]},n);i.contains.push({scope:"doctag", -begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)", -end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0}) -;const r=u("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/) -;return i.contains.push({begin:d(/[ ]+/,"(",r,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),i -},k=O("//","$"),N=O("/\\*","\\*/"),S=O("#","$");var M=Object.freeze({ -__proto__:null,MATCH_NOTHING_RE:/\b\B/,IDENT_RE:b,UNDERSCORE_IDENT_RE:m, -NUMBER_RE:E,C_NUMBER_RE:x,BINARY_NUMBER_RE:y, -RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~", -SHEBANG:(e={})=>{const t=/^#![ ]*\// -;return e.binary&&(e.begin=d(t,/.*\b/,e.binary,/\b.*/)),s({scope:"meta",begin:t, -end:/$/,relevance:0,"on:begin":(e,t)=>{0!==e.index&&t.ignoreMatch()}},e)}, -BACKSLASH_ESCAPE:w,APOS_STRING_MODE:_,QUOTE_STRING_MODE:v,PHRASAL_WORDS_MODE:{ -begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ -},COMMENT:O,C_LINE_COMMENT_MODE:k,C_BLOCK_COMMENT_MODE:N,HASH_COMMENT_MODE:S, -NUMBER_MODE:{scope:"number",begin:E,relevance:0},C_NUMBER_MODE:{scope:"number", -begin:x,relevance:0},BINARY_NUMBER_MODE:{scope:"number",begin:y,relevance:0}, -REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{scope:"regexp",begin:/\//, -end:/\/[gimuy]*/,illegal:/\n/,contains:[w,{begin:/\[/,end:/\]/,relevance:0, -contains:[w]}]}]},TITLE_MODE:{scope:"title",begin:b,relevance:0}, -UNDERSCORE_TITLE_MODE:{scope:"title",begin:m,relevance:0},METHOD_GUARD:{ -begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:e=>Object.assign(e,{ -"on:begin":(e,t)=>{t.data._beginMatch=e[1]},"on:end":(e,t)=>{ -t.data._beginMatch!==e[1]&&t.ignoreMatch()}})});function R(e,t){ -"."===e.input[e.index-1]&&t.ignoreMatch()}function j(e,t){ -void 0!==e.className&&(e.scope=e.className,delete e.className)}function A(e,t){ -t&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)", -e.__beforeBegin=R,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords, -void 0===e.relevance&&(e.relevance=0))}function I(e,t){ -Array.isArray(e.illegal)&&(e.illegal=u(...e.illegal))}function B(e,t){ -if(e.match){ -if(e.begin||e.end)throw Error("begin & end are not supported with match") -;e.begin=e.match,delete e.match}}function T(e,t){ -void 0===e.relevance&&(e.relevance=1)}const L=(e,t)=>{if(!e.beforeMatch)return -;if(e.starts)throw Error("beforeMatch cannot be used with starts") -;const n=Object.assign({},e);Object.keys(e).forEach((t=>{delete e[t] -})),e.keywords=n.keywords, -e.begin=d(n.beforeMatch,d("(?=",n.begin,")")),e.starts={relevance:0, -contains:[Object.assign(n,{endsParent:!0})]},e.relevance=0,delete n.beforeMatch -},D=["of","and","for","in","not","or","if","then","parent","list","value"] -;function P(e,t,n="keyword"){const i=Object.create(null) -;return"string"==typeof e?r(n,e.split(" ")):Array.isArray(e)?r(n,e):Object.keys(e).forEach((n=>{ -Object.assign(i,P(e[n],t,n))})),i;function r(e,n){ -t&&(n=n.map((e=>e.toLowerCase()))),n.forEach((t=>{const n=t.split("|") -;i[n[0]]=[e,C(n[0],n[1])]}))}}function C(e,t){ -return t?Number(t):(e=>D.includes(e.toLowerCase()))(e)?0:1}const H={},$=e=>{ -console.error(e)},U=(e,...t)=>{console.log("WARN: "+e,...t)},z=(e,t)=>{ -H[`${e}/${t}`]||(console.log(`Deprecated as of ${e}. ${t}`),H[`${e}/${t}`]=!0) -},K=Error();function W(e,t,{key:n}){let i=0;const r=e[n],s={},o={} -;for(let e=1;e<=t.length;e++)o[e+i]=r[e],s[e+i]=!0,i+=h(t[e-1]) -;e[n]=o,e[n]._emit=s,e[n]._multi=!0}function X(e){(e=>{ -e.scope&&"object"==typeof e.scope&&null!==e.scope&&(e.beginScope=e.scope, -delete e.scope)})(e),"string"==typeof e.beginScope&&(e.beginScope={ -_wrap:e.beginScope}),"string"==typeof e.endScope&&(e.endScope={_wrap:e.endScope -}),(e=>{if(Array.isArray(e.begin)){ -if(e.skip||e.excludeBegin||e.returnBegin)throw $("skip, excludeBegin, returnBegin not compatible with beginScope: {}"), -K -;if("object"!=typeof e.beginScope||null===e.beginScope)throw $("beginScope must be object"), -K;W(e,e.begin,{key:"beginScope"}),e.begin=p(e.begin,{joinWith:""})}})(e),(e=>{ -if(Array.isArray(e.end)){ -if(e.skip||e.excludeEnd||e.returnEnd)throw $("skip, excludeEnd, returnEnd not compatible with endScope: {}"), -K -;if("object"!=typeof e.endScope||null===e.endScope)throw $("endScope must be object"), -K;W(e,e.end,{key:"endScope"}),e.end=p(e.end,{joinWith:""})}})(e)}function G(e){ -function t(t,n){return RegExp(g(t),"m"+(e.case_insensitive?"i":"")+(n?"g":""))} -class n{constructor(){ -this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0} -addRule(e,t){ -t.position=this.position++,this.matchIndexes[this.matchAt]=t,this.regexes.push([t,e]), -this.matchAt+=h(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null) -;const e=this.regexes.map((e=>e[1]));this.matcherRe=t(p(e,{joinWith:"|" -}),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex -;const t=this.matcherRe.exec(e);if(!t)return null -;const n=t.findIndex(((e,t)=>t>0&&void 0!==e)),i=this.matchIndexes[n] -;return t.splice(0,n),Object.assign(t,i)}}class i{constructor(){ -this.rules=[],this.multiRegexes=[], -this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){ -if(this.multiRegexes[e])return this.multiRegexes[e];const t=new n -;return this.rules.slice(e).forEach((([e,n])=>t.addRule(e,n))), -t.compile(),this.multiRegexes[e]=t,t}resumingScanAtSamePosition(){ -return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,t){ -this.rules.push([e,t]),"begin"===t.type&&this.count++}exec(e){ -const t=this.getMatcher(this.regexIndex);t.lastIndex=this.lastIndex -;let n=t.exec(e) -;if(this.resumingScanAtSamePosition())if(n&&n.index===this.lastIndex);else{ -const t=this.getMatcher(0);t.lastIndex=this.lastIndex+1,n=t.exec(e)} -return n&&(this.regexIndex+=n.position+1, -this.regexIndex===this.count&&this.considerAll()),n}} -if(e.compilerExtensions||(e.compilerExtensions=[]), -e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.") -;return e.classNameAliases=s(e.classNameAliases||{}),function n(r,o){const a=r -;if(r.isCompiled)return a -;[j,B,X,L].forEach((e=>e(r,o))),e.compilerExtensions.forEach((e=>e(r,o))), -r.__beforeBegin=null,[A,I,T].forEach((e=>e(r,o))),r.isCompiled=!0;let l=null -;return"object"==typeof r.keywords&&r.keywords.$pattern&&(r.keywords=Object.assign({},r.keywords), -l=r.keywords.$pattern, -delete r.keywords.$pattern),l=l||/\w+/,r.keywords&&(r.keywords=P(r.keywords,e.case_insensitive)), -a.keywordPatternRe=t(l,!0), -o&&(r.begin||(r.begin=/\B|\b/),a.beginRe=t(r.begin),r.end||r.endsWithParent||(r.end=/\B|\b/), -r.end&&(a.endRe=t(r.end)), -a.terminatorEnd=g(r.end)||"",r.endsWithParent&&o.terminatorEnd&&(a.terminatorEnd+=(r.end?"|":"")+o.terminatorEnd)), -r.illegal&&(a.illegalRe=t(r.illegal)), -r.contains||(r.contains=[]),r.contains=[].concat(...r.contains.map((e=>(e=>(e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map((t=>s(e,{ -variants:null},t)))),e.cachedVariants?e.cachedVariants:Z(e)?s(e,{ -starts:e.starts?s(e.starts):null -}):Object.isFrozen(e)?s(e):e))("self"===e?r:e)))),r.contains.forEach((e=>{n(e,a) -})),r.starts&&n(r.starts,o),a.matcher=(e=>{const t=new i -;return e.contains.forEach((e=>t.addRule(e.begin,{rule:e,type:"begin" -}))),e.terminatorEnd&&t.addRule(e.terminatorEnd,{type:"end" -}),e.illegal&&t.addRule(e.illegal,{type:"illegal"}),t})(a),a}(e)}function Z(e){ -return!!e&&(e.endsWithParent||Z(e.starts))}const F=r,V=s,q=Symbol("nomatch") -;var J=(e=>{const t=Object.create(null),r=Object.create(null),s=[];let o=!0 -;const a="Could not find the language '{}', did you forget to load/include a language module?",l={ -disableAutodetect:!0,name:"Plain text",contains:[]};let g={ -ignoreUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i, -languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-", -cssSelector:"pre code",languages:null,__emitter:c};function d(e){ -return g.noHighlightRe.test(e)}function u(e,t,n,i){let r="",s="" -;"object"==typeof t?(r=e, -n=t.ignoreIllegals,s=t.language,i=void 0):(z("10.7.0","highlight(lang, code, ...args) has been deprecated."), -z("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"), -s=e,r=t),void 0===n&&(n=!0);const o={code:r,language:s};w("before:highlight",o) -;const a=o.result?o.result:h(o.language,o.code,n,i) -;return a.code=o.code,w("after:highlight",a),a}function h(e,n,r,s){ -const l=Object.create(null);function c(){if(!k.keywords)return void S.addText(M) -;let e=0;k.keywordPatternRe.lastIndex=0;let t=k.keywordPatternRe.exec(M),n="" -;for(;t;){n+=M.substring(e,t.index) -;const r=_.case_insensitive?t[0].toLowerCase():t[0],s=(i=r,k.keywords[i]);if(s){ -const[e,i]=s -;if(S.addText(n),n="",l[r]=(l[r]||0)+1,l[r]<=7&&(R+=i),e.startsWith("_"))n+=t[0];else{ -const n=_.classNameAliases[e]||e;S.addKeyword(t[0],n)}}else n+=t[0] -;e=k.keywordPatternRe.lastIndex,t=k.keywordPatternRe.exec(M)}var i -;n+=M.substr(e),S.addText(n)}function d(){null!=k.subLanguage?(()=>{ -if(""===M)return;let e=null;if("string"==typeof k.subLanguage){ -if(!t[k.subLanguage])return void S.addText(M) -;e=h(k.subLanguage,M,!0,N[k.subLanguage]),N[k.subLanguage]=e._top -}else e=f(M,k.subLanguage.length?k.subLanguage:null) -;k.relevance>0&&(R+=e.relevance),S.addSublanguage(e._emitter,e.language) -})():c(),M=""}function u(e,t){let n=1;for(;void 0!==t[n];){if(!e._emit[n]){n++ -;continue}const i=_.classNameAliases[e[n]]||e[n],r=t[n] -;i?S.addKeyword(r,i):(M=r,c(),M=""),n++}}function p(e,t){ -return e.scope&&"string"==typeof e.scope&&S.openNode(_.classNameAliases[e.scope]||e.scope), -e.beginScope&&(e.beginScope._wrap?(S.addKeyword(M,_.classNameAliases[e.beginScope._wrap]||e.beginScope._wrap), -M=""):e.beginScope._multi&&(u(e.beginScope,t),M="")),k=Object.create(e,{parent:{ -value:k}}),k}function b(e,t,n){let r=((e,t)=>{const n=e&&e.exec(t) -;return n&&0===n.index})(e.endRe,n);if(r){if(e["on:end"]){const n=new i(e) -;e["on:end"](t,n),n.isMatchIgnored&&(r=!1)}if(r){ -for(;e.endsParent&&e.parent;)e=e.parent;return e}} -if(e.endsWithParent)return b(e.parent,t,n)}function m(e){ -return 0===k.matcher.regexIndex?(M+=e[0],1):(I=!0,0)}function x(e){ -const t=e[0],i=n.substr(e.index),r=b(k,e,i);if(!r)return q;const s=k -;k.endScope&&k.endScope._wrap?(d(), -S.addKeyword(t,k.endScope._wrap)):k.endScope&&k.endScope._multi?(d(), -u(k.endScope,e)):s.skip?M+=t:(s.returnEnd||s.excludeEnd||(M+=t), -d(),s.excludeEnd&&(M=t));do{ -k.scope&&!k.isMultiClass&&S.closeNode(),k.skip||k.subLanguage||(R+=k.relevance), -k=k.parent}while(k!==r.parent) -;return r.starts&&p(r.starts,e),s.returnEnd?0:t.length}let y={};function w(t,s){ -const a=s&&s[0];if(M+=t,null==a)return d(),0 -;if("begin"===y.type&&"end"===s.type&&y.index===s.index&&""===a){ -if(M+=n.slice(s.index,s.index+1),!o){const t=Error(`0 width match regex (${e})`) -;throw t.languageName=e,t.badRule=y.rule,t}return 1} -if(y=s,"begin"===s.type)return(e=>{ -const t=e[0],n=e.rule,r=new i(n),s=[n.__beforeBegin,n["on:begin"]] -;for(const n of s)if(n&&(n(e,r),r.isMatchIgnored))return m(t) -;return n.skip?M+=t:(n.excludeBegin&&(M+=t), -d(),n.returnBegin||n.excludeBegin||(M=t)),p(n,e),n.returnBegin?0:t.length})(s) -;if("illegal"===s.type&&!r){ -const e=Error('Illegal lexeme "'+a+'" for mode "'+(k.scope||"")+'"') -;throw e.mode=k,e}if("end"===s.type){const e=x(s);if(e!==q)return e} -if("illegal"===s.type&&""===a)return 1 -;if(A>1e5&&A>3*s.index)throw Error("potential infinite loop, way more iterations than matches") -;return M+=a,a.length}const _=E(e) -;if(!_)throw $(a.replace("{}",e)),Error('Unknown language: "'+e+'"') -;const v=G(_);let O="",k=s||v;const N={},S=new g.__emitter(g);(()=>{const e=[] -;for(let t=k;t!==_;t=t.parent)t.scope&&e.unshift(t.scope) -;e.forEach((e=>S.openNode(e)))})();let M="",R=0,j=0,A=0,I=!1;try{ -for(k.matcher.considerAll();;){ -A++,I?I=!1:k.matcher.considerAll(),k.matcher.lastIndex=j -;const e=k.matcher.exec(n);if(!e)break;const t=w(n.substring(j,e.index),e) -;j=e.index+t}return w(n.substr(j)),S.closeAllNodes(),S.finalize(),O=S.toHTML(),{ -language:e,value:O,relevance:R,illegal:!1,_emitter:S,_top:k}}catch(t){ -if(t.message&&t.message.includes("Illegal"))return{language:e,value:F(n), -illegal:!0,relevance:0,_illegalBy:{message:t.message,index:j, -context:n.slice(j-100,j+100),mode:t.mode,resultSoFar:O},_emitter:S};if(o)return{ -language:e,value:F(n),illegal:!1,relevance:0,errorRaised:t,_emitter:S,_top:k} -;throw t}}function f(e,n){n=n||g.languages||Object.keys(t);const i=(e=>{ -const t={value:F(e),illegal:!1,relevance:0,_top:l,_emitter:new g.__emitter(g)} -;return t._emitter.addText(e),t})(e),r=n.filter(E).filter(y).map((t=>h(t,e,!1))) -;r.unshift(i);const s=r.sort(((e,t)=>{ -if(e.relevance!==t.relevance)return t.relevance-e.relevance -;if(e.language&&t.language){if(E(e.language).supersetOf===t.language)return 1 -;if(E(t.language).supersetOf===e.language)return-1}return 0})),[o,a]=s,c=o -;return c.secondBest=a,c}function p(e){let t=null;const n=(e=>{ -let t=e.className+" ";t+=e.parentNode?e.parentNode.className:"" -;const n=g.languageDetectRe.exec(t);if(n){const t=E(n[1]) -;return t||(U(a.replace("{}",n[1])), -U("Falling back to no-highlight mode for this block.",e)),t?n[1]:"no-highlight"} -return t.split(/\s+/).find((e=>d(e)||E(e)))})(e);if(d(n))return -;w("before:highlightElement",{el:e,language:n -}),!g.ignoreUnescapedHTML&&e.children.length>0&&(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."), -console.warn("https://github.com/highlightjs/highlight.js/issues/2886"), -console.warn(e)),t=e;const i=t.textContent,s=n?u(i,{language:n,ignoreIllegals:!0 -}):f(i);e.innerHTML=s.value,((e,t,n)=>{const i=t&&r[t]||n -;e.classList.add("hljs"),e.classList.add("language-"+i) -})(e,n,s.language),e.result={language:s.language,re:s.relevance, -relevance:s.relevance},s.secondBest&&(e.secondBest={ -language:s.secondBest.language,relevance:s.secondBest.relevance -}),w("after:highlightElement",{el:e,result:s,text:i})}let b=!1;function m(){ -"loading"!==document.readyState?document.querySelectorAll(g.cssSelector).forEach(p):b=!0 -}function E(e){return e=(e||"").toLowerCase(),t[e]||t[r[e]]} -function x(e,{languageName:t}){"string"==typeof e&&(e=[e]),e.forEach((e=>{ -r[e.toLowerCase()]=t}))}function y(e){const t=E(e) -;return t&&!t.disableAutodetect}function w(e,t){const n=e;s.forEach((e=>{ -e[n]&&e[n](t)}))} -"undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",(()=>{ -b&&m()}),!1),Object.assign(e,{highlight:u,highlightAuto:f,highlightAll:m, -highlightElement:p, -highlightBlock:e=>(z("10.7.0","highlightBlock will be removed entirely in v12.0"), -z("10.7.0","Please use highlightElement now."),p(e)),configure:e=>{g=V(g,e)}, -initHighlighting:()=>{ -m(),z("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")}, -initHighlightingOnLoad:()=>{ -m(),z("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.") -},registerLanguage:(n,i)=>{let r=null;try{r=i(e)}catch(e){ -if($("Language definition for '{}' could not be registered.".replace("{}",n)), -!o)throw e;$(e),r=l} -r.name||(r.name=n),t[n]=r,r.rawDefinition=i.bind(null,e),r.aliases&&x(r.aliases,{ -languageName:n})},unregisterLanguage:e=>{delete t[e] -;for(const t of Object.keys(r))r[t]===e&&delete r[t]}, -listLanguages:()=>Object.keys(t),getLanguage:E,registerAliases:x, -autoDetection:y,inherit:V,addPlugin:e=>{(e=>{ -e["before:highlightBlock"]&&!e["before:highlightElement"]&&(e["before:highlightElement"]=t=>{ -e["before:highlightBlock"](Object.assign({block:t.el},t)) -}),e["after:highlightBlock"]&&!e["after:highlightElement"]&&(e["after:highlightElement"]=t=>{ -e["after:highlightBlock"](Object.assign({block:t.el},t))})})(e),s.push(e)} -}),e.debugMode=()=>{o=!1},e.safeMode=()=>{o=!0},e.versionString="11.0.1" -;for(const e in M)"object"==typeof M[e]&&n(M[e]);return Object.assign(e,M),e -})({}),Y=Object.freeze({__proto__:null});const Q=J -;for(const e of Object.keys(Y)){const t=e.replace("grmr_","") -;Q.registerLanguage(t,Y[e])}return Q}() -;"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs);hljs.registerLanguage("python",(()=>{"use strict";function e(e){ -return e?"string"==typeof e?e:e.source:null}function n(...n){ -return n.map((n=>e(n))).join("")}const t="[a-zA-Z]\\w*",a=(t,a,s={})=>{ -const i=((e,...n)=>{const t=Object.create(null);for(const n in e)t[n]=e[n] -;return n.forEach((e=>{for(const n in e)t[n]=e[n]})),t})({scope:"comment", -begin:t,end:a,contains:[]},s);i.contains.push({scope:"doctag", -begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)", -end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0}) -;const r=function(...n){return"("+((e=>{const n=e[e.length-1] -;return"object"==typeof n&&n.constructor===Object?(e.splice(e.length-1,1),n):{} -})(n).capture?"":"?:")+n.map((n=>e(n))).join("|")+")" -}("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/) -;return i.contains.push({begin:n(/[ ]+/,"(",r,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),i -};return a("//","$"),a("/\\*","\\*/"),a("#","$"),e=>{const a={ -$pattern:/[A-Za-z]\w+|__\w+__/, -keyword:["and","as","assert","async","await","break","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"], -built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip"], -literal:["__debug__","Ellipsis","False","None","NotImplemented","True"], -type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"] -},s={className:"meta",begin:/^(>>>|\.\.\.) /},i={className:"subst",begin:/\{/, -end:/\}/,keywords:a,illegal:/#/},r={begin:/\{\{/,relevance:0},o={ -className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{ -begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/, -contains:[e.BACKSLASH_ESCAPE,s],relevance:10},{ -begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/, -contains:[e.BACKSLASH_ESCAPE,s],relevance:10},{ -begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/, -contains:[e.BACKSLASH_ESCAPE,s,r,i]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/, -end:/"""/,contains:[e.BACKSLASH_ESCAPE,s,r,i]},{begin:/([uU]|[rR])'/,end:/'/, -relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{ -begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/, -end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/, -contains:[e.BACKSLASH_ESCAPE,r,i]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/, -contains:[e.BACKSLASH_ESCAPE,r,i]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE] -},l="[0-9](_?[0-9])*",c=`(\\b(${l}))?\\.(${l})|\\b(${l})\\.`,b={ -className:"number",relevance:0,variants:[{ -begin:`(\\b(${l})|(${c}))[eE][+-]?(${l})[jJ]?\\b`},{begin:`(${c})[jJ]?`},{ -begin:"\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?\\b"},{ -begin:"\\b0[bB](_?[01])+[lL]?\\b"},{begin:"\\b0[oO](_?[0-7])+[lL]?\\b"},{ -begin:"\\b0[xX](_?[0-9a-fA-F])+[lL]?\\b"},{begin:`\\b(${l})[jJ]\\b`}]},d={ -className:"comment",begin:(g=/# type:/,n("(?=",g,")")),end:/$/,keywords:a, -contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0}]};var g -;const p={className:"params",variants:[{className:"",begin:/\(\s*\)/,skip:!0},{ -begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:a, -contains:["self",s,b,o,e.HASH_COMMENT_MODE]}]};return i.contains=[o,b,s],{ -name:"Python",aliases:["py","gyp","ipython"],keywords:a, -illegal:/(<\/|->|\?)|=>/,contains:[s,b,{begin:/\bself\b/},{beginKeywords:"if", -relevance:0},o,d,e.HASH_COMMENT_MODE,{match:[/def/,/\s+/,t],scope:{1:"keyword", -3:"title.function"},contains:[p]},{variants:[{ -match:[/class/,/\s+/,t,/\s*/,/\(\s*/,t,/\s*\)/]},{match:[/class/,/\s+/,t]}], -scope:{1:"keyword",3:"title.class",6:"title.class.inherited"}},{ -className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[b,p,o]}]}}})());hljs.registerLanguage("python-repl",(()=>{"use strict";return s=>({ -aliases:["pycon"],contains:[{className:"meta",starts:{end:/ |$/,starts:{end:"$", -subLanguage:"python"}},variants:[{begin:/^>>>(?=[ ]|$)/},{ -begin:/^\.\.\.(?=[ ]|$)/}]}]})})());hljs.registerLanguage("sql",(()=>{"use strict";function e(e){ -return e?"string"==typeof e?e:e.source:null}function r(...r){ -return r.map((r=>e(r))).join("")}function t(...r){return"("+((e=>{ -const r=e[e.length-1] -;return"object"==typeof r&&r.constructor===Object?(e.splice(e.length-1,1),r):{} -})(r).capture?"":"?:")+r.map((r=>e(r))).join("|")+")"}return e=>{ -const n=e.COMMENT("--","$"),a=["true","false","unknown"],i=["bigint","binary","blob","boolean","char","character","clob","date","dec","decfloat","decimal","float","int","integer","interval","nchar","nclob","national","numeric","real","row","smallint","time","timestamp","varchar","varying","varbinary"],s=["abs","acos","array_agg","asin","atan","avg","cast","ceil","ceiling","coalesce","corr","cos","cosh","count","covar_pop","covar_samp","cume_dist","dense_rank","deref","element","exp","extract","first_value","floor","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","last_value","lead","listagg","ln","log","log10","lower","max","min","mod","nth_value","ntile","nullif","percent_rank","percentile_cont","percentile_disc","position","position_regex","power","rank","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","row_number","sin","sinh","sqrt","stddev_pop","stddev_samp","substring","substring_regex","sum","tan","tanh","translate","translate_regex","treat","trim","trim_array","unnest","upper","value_of","var_pop","var_samp","width_bucket"],o=["create table","insert into","primary key","foreign key","not null","alter table","add constraint","grouping sets","on overflow","character set","respect nulls","ignore nulls","nulls first","nulls last","depth first","breadth first"],c=s,l=["abs","acos","all","allocate","alter","and","any","are","array","array_agg","array_max_cardinality","as","asensitive","asin","asymmetric","at","atan","atomic","authorization","avg","begin","begin_frame","begin_partition","between","bigint","binary","blob","boolean","both","by","call","called","cardinality","cascaded","case","cast","ceil","ceiling","char","char_length","character","character_length","check","classifier","clob","close","coalesce","collate","collect","column","commit","condition","connect","constraint","contains","convert","copy","corr","corresponding","cos","cosh","count","covar_pop","covar_samp","create","cross","cube","cume_dist","current","current_catalog","current_date","current_default_transform_group","current_path","current_role","current_row","current_schema","current_time","current_timestamp","current_path","current_role","current_transform_group_for_type","current_user","cursor","cycle","date","day","deallocate","dec","decimal","decfloat","declare","default","define","delete","dense_rank","deref","describe","deterministic","disconnect","distinct","double","drop","dynamic","each","element","else","empty","end","end_frame","end_partition","end-exec","equals","escape","every","except","exec","execute","exists","exp","external","extract","false","fetch","filter","first_value","float","floor","for","foreign","frame_row","free","from","full","function","fusion","get","global","grant","group","grouping","groups","having","hold","hour","identity","in","indicator","initial","inner","inout","insensitive","insert","int","integer","intersect","intersection","interval","into","is","join","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","language","large","last_value","lateral","lead","leading","left","like","like_regex","listagg","ln","local","localtime","localtimestamp","log","log10","lower","match","match_number","match_recognize","matches","max","member","merge","method","min","minute","mod","modifies","module","month","multiset","national","natural","nchar","nclob","new","no","none","normalize","not","nth_value","ntile","null","nullif","numeric","octet_length","occurrences_regex","of","offset","old","omit","on","one","only","open","or","order","out","outer","over","overlaps","overlay","parameter","partition","pattern","per","percent","percent_rank","percentile_cont","percentile_disc","period","portion","position","position_regex","power","precedes","precision","prepare","primary","procedure","ptf","range","rank","reads","real","recursive","ref","references","referencing","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","release","result","return","returns","revoke","right","rollback","rollup","row","row_number","rows","running","savepoint","scope","scroll","search","second","seek","select","sensitive","session_user","set","show","similar","sin","sinh","skip","smallint","some","specific","specifictype","sql","sqlexception","sqlstate","sqlwarning","sqrt","start","static","stddev_pop","stddev_samp","submultiset","subset","substring","substring_regex","succeeds","sum","symmetric","system","system_time","system_user","table","tablesample","tan","tanh","then","time","timestamp","timezone_hour","timezone_minute","to","trailing","translate","translate_regex","translation","treat","trigger","trim","trim_array","true","truncate","uescape","union","unique","unknown","unnest","update","upper","user","using","value","values","value_of","var_pop","var_samp","varbinary","varchar","varying","versioning","when","whenever","where","width_bucket","window","with","within","without","year","add","asc","collation","desc","final","first","last","view"].filter((e=>!s.includes(e))),u={ -begin:r(/\b/,t(...c),/\s*\(/),relevance:0,keywords:{built_in:c}};return{ -name:"SQL",case_insensitive:!0,illegal:/[{}]|<\//,keywords:{ -$pattern:/\b[\w\.]+/,keyword:((e,{exceptions:r,when:t}={})=>{const n=t -;return r=r||[],e.map((e=>e.match(/\|\d+$/)||r.includes(e)?e:n(e)?e+"|0":e)) -})(l,{when:e=>e.length<3}),literal:a,type:i, -built_in:["current_catalog","current_date","current_default_transform_group","current_path","current_role","current_schema","current_transform_group_for_type","current_user","session_user","system_time","system_user","current_time","localtime","current_timestamp","localtimestamp"] -},contains:[{begin:t(...o),relevance:0,keywords:{$pattern:/[\w\.]+/, -keyword:l.concat(o),literal:a,type:i}},{className:"type", -begin:t("double precision","large object","with timezone","without timezone") -},u,{className:"variable",begin:/@[a-z0-9]+/},{className:"string",variants:[{ -begin:/'/,end:/'/,contains:[{begin:/''/}]}]},{begin:/"/,end:/"/,contains:[{ -begin:/""/}]},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,n,{className:"operator", -begin:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,relevance:0}]}}})());hljs.registerLanguage("php",(()=>{"use strict";return e=>{const r={ -className:"variable", -begin:"\\$+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*(?![A-Za-z0-9])(?![$])"},t={ -className:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?[=]?/},{ -begin:/\?>/}]},a={className:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/, -end:/\}/}]},n=e.inherit(e.APOS_STRING_MODE,{illegal:null -}),i=e.inherit(e.QUOTE_STRING_MODE,{illegal:null, -contains:e.QUOTE_STRING_MODE.contains.concat(a)}),o=e.END_SAME_AS_BEGIN({ -begin:/<<<[ \t]*(\w+)\n/,end:/[ \t]*(\w+)\b/, -contains:e.QUOTE_STRING_MODE.contains.concat(a)}),l={className:"string", -contains:[e.BACKSLASH_ESCAPE,t],variants:[e.inherit(n,{begin:"b'",end:"'" -}),e.inherit(i,{begin:'b"',end:'"'}),i,n,o]},s={className:"number",variants:[{ -begin:"\\b0b[01]+(?:_[01]+)*\\b"},{begin:"\\b0o[0-7]+(?:_[0-7]+)*\\b"},{ -begin:"\\b0x[\\da-f]+(?:_[\\da-f]+)*\\b"},{ -begin:"(?:\\b\\d+(?:_\\d+)*(\\.(?:\\d+(?:_\\d+)*))?|\\B\\.\\d+)(?:e[+-]?\\d+)?" -}],relevance:0},c={ -keyword:"__CLASS__ __DIR__ __FILE__ __FUNCTION__ __LINE__ __METHOD__ __NAMESPACE__ __TRAIT__ die echo exit include include_once print require require_once array abstract and as binary bool boolean break callable case catch class clone const continue declare default do double else elseif empty enddeclare endfor endforeach endif endswitch endwhile enum eval extends final finally float for foreach from global goto if implements instanceof insteadof int integer interface isset iterable list match|0 mixed new object or private protected public real return string switch throw trait try unset use var void while xor yield", -literal:"false null true", -built_in:"Error|0 AppendIterator ArgumentCountError ArithmeticError ArrayIterator ArrayObject AssertionError BadFunctionCallException BadMethodCallException CachingIterator CallbackFilterIterator CompileError Countable DirectoryIterator DivisionByZeroError DomainException EmptyIterator ErrorException Exception FilesystemIterator FilterIterator GlobIterator InfiniteIterator InvalidArgumentException IteratorIterator LengthException LimitIterator LogicException MultipleIterator NoRewindIterator OutOfBoundsException OutOfRangeException OuterIterator OverflowException ParentIterator ParseError RangeException RecursiveArrayIterator RecursiveCachingIterator RecursiveCallbackFilterIterator RecursiveDirectoryIterator RecursiveFilterIterator RecursiveIterator RecursiveIteratorIterator RecursiveRegexIterator RecursiveTreeIterator RegexIterator RuntimeException SeekableIterator SplDoublyLinkedList SplFileInfo SplFileObject SplFixedArray SplHeap SplMaxHeap SplMinHeap SplObjectStorage SplObserver SplObserver SplPriorityQueue SplQueue SplStack SplSubject SplSubject SplTempFileObject TypeError UnderflowException UnexpectedValueException UnhandledMatchError ArrayAccess Closure Generator Iterator IteratorAggregate Serializable Stringable Throwable Traversable WeakReference WeakMap Directory __PHP_Incomplete_Class parent php_user_filter self static stdClass" -};return{case_insensitive:!0,keywords:c, -contains:[e.HASH_COMMENT_MODE,e.COMMENT("//","$",{contains:[t] -}),e.COMMENT("/\\*","\\*/",{contains:[{className:"doctag",begin:"@[A-Za-z]+"}] -}),e.COMMENT("__halt_compiler.+?;",!1,{endsWithParent:!0, -keywords:"__halt_compiler"}),t,{className:"keyword",begin:/\$this\b/},r,{ -begin:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{className:"function", -relevance:0,beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0, -illegal:"[$%\\[]",contains:[{beginKeywords:"use"},e.UNDERSCORE_TITLE_MODE,{ -begin:"=>",endsParent:!0},{className:"params",begin:"\\(",end:"\\)", -excludeBegin:!0,excludeEnd:!0,keywords:c, -contains:["self",r,e.C_BLOCK_COMMENT_MODE,l,s]}]},{className:"class",variants:[{ -beginKeywords:"enum",illegal:/[($"]/},{beginKeywords:"class interface trait", -illegal:/[:($"]/}],relevance:0,end:/\{/,excludeEnd:!0,contains:[{ -beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{ -beginKeywords:"namespace",relevance:0,end:";",illegal:/[.']/, -contains:[e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"use",relevance:0,end:";", -contains:[e.UNDERSCORE_TITLE_MODE]},l,s]}}})());hljs.registerLanguage("xml",(()=>{"use strict";function e(e){ -return e?"string"==typeof e?e:e.source:null}function n(e){return a("(?=",e,")")} -function a(...n){return n.map((n=>e(n))).join("")}function s(...n){ -return"("+((e=>{const n=e[e.length-1] -;return"object"==typeof n&&n.constructor===Object?(e.splice(e.length-1,1),n):{} -})(n).capture?"":"?:")+n.map((n=>e(n))).join("|")+")"}return e=>{ -const t=a(/[A-Z_]/,a("(?:",/[A-Z0-9_.-]*:/,")?"),/[A-Z0-9_.-]*/),i={ -className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},c={begin:/\s/, -contains:[{className:"keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}] -},r=e.inherit(c,{begin:/\(/,end:/\)/}),l=e.inherit(e.APOS_STRING_MODE,{ -className:"string"}),g=e.inherit(e.QUOTE_STRING_MODE,{className:"string"}),m={ -endsWithParent:!0,illegal:/`]+/}]}]}]};return{ -name:"HTML, XML", -aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"], -case_insensitive:!0,contains:[{className:"meta",begin://, -relevance:10,contains:[c,g,l,r,{begin:/\[/,end:/\]/,contains:[{className:"meta", -begin://,contains:[c,r,g,l]}]}]},e.COMMENT(//,{ -relevance:10}),{begin://,relevance:10},i,{ -className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag", -begin:/)/,end:/>/,keywords:{name:"style"},contains:[m],starts:{ -end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag", -begin:/)/,end:/>/,keywords:{name:"script"},contains:[m],starts:{ -end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{ -className:"tag",begin:/<>|<\/>/},{className:"tag", -begin:a(//,/>/,/\s/)))),end:/\/?>/,contains:[{className:"name", -begin:t,relevance:0,starts:m}]},{className:"tag",begin:a(/<\//,n(a(t,/>/))), -contains:[{className:"name",begin:t,relevance:0},{begin:/>/,relevance:0, -endsParent:!0}]}]}}})());hljs.registerLanguage("markdown",(()=>{"use strict";function n(...n){ -return n.map((n=>{return(e=n)?"string"==typeof e?e:e.source:null;var e -})).join("")}return e=>{const a={begin:/<\/?[A-Za-z_]/,end:">", -subLanguage:"xml",relevance:0},i={variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0 -},{begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/, -relevance:2},{begin:n(/\[.+?\]\(/,/[A-Za-z][A-Za-z0-9+.-]*/,/:\/\/.*?\)/), -relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{ -begin:/\[.+?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{ -className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0, -returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)", -excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[", -end:"\\]",excludeBegin:!0,excludeEnd:!0}]},s={className:"strong",contains:[], -variants:[{begin:/_{2}/,end:/_{2}/},{begin:/\*{2}/,end:/\*{2}/}]},c={ -className:"emphasis",contains:[],variants:[{begin:/\*(?!\*)/,end:/\*/},{ -begin:/_(?!_)/,end:/_/,relevance:0}]};s.contains.push(c),c.contains.push(s) -;let t=[a,i] -;return s.contains=s.contains.concat(t),c.contains=c.contains.concat(t), -t=t.concat(s,c),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{ -className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:t},{ -begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n", -contains:t}]}]},a,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)", -end:"\\s+",excludeEnd:!0},s,c,{className:"quote",begin:"^>\\s+",contains:t, -end:"$"},{className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{ -begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{ -begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))", -contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{ -begin:"^[-\\*]{3,}",end:"$"},i,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{ -className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{ -className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}}})());hljs.registerLanguage("javascript",(()=>{"use strict" -;const e="[A-Za-z$_][0-9A-Za-z$_]*",n=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],a=["true","false","null","undefined","NaN","Infinity"],t=["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer","BigInt64Array","BigUint64Array","BigInt"],s=["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],r=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],i=["arguments","this","super","console","window","document","localStorage","module","global"],c=[].concat(r,t,s) -;function o(e){return l("(?=",e,")")}function l(...e){return e.map((e=>{ -return(n=e)?"string"==typeof n?n:n.source:null;var n})).join("")}return b=>{ -const g=e,d={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/, -isTrulyOpeningTag:(e,n)=>{const a=e[0].length+e.index,t=e.input[a] -;"<"!==t?">"===t&&(((e,{after:n})=>{const a="",B={ -match:[/const|var|let/,/\s+/,g,/\s*/,/=\s*/,o(C)],className:{1:"keyword", -3:"title.function"},contains:[w]};return{name:"Javascript", -aliases:["js","jsx","mjs","cjs"],keywords:u,exports:{PARAMS_CONTAINS:S}, -illegal:/#(?![$_A-z])/,contains:[b.SHEBANG({label:"shebang",binary:"node", -relevance:5}),{label:"use_strict",className:"meta",relevance:10, -begin:/^\s*['"]use (strict|asm)['"]/ -},b.APOS_STRING_MODE,b.QUOTE_STRING_MODE,N,f,A,v,y,O,{className:"attr", -begin:g+o(":"),relevance:0},B,{ -begin:"("+b.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*", -keywords:"return throw case",relevance:0,contains:[v,b.REGEXP_MODE,{ -className:"function",begin:C,returnBegin:!0,end:"\\s*=>",contains:[{ -className:"params",variants:[{begin:b.UNDERSCORE_IDENT_RE,relevance:0},{ -className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0, -excludeEnd:!0,keywords:u,contains:S}]}]},{begin:/,/,relevance:0},{match:/\s+/, -relevance:0},{variants:[{begin:"<>",end:""},{begin:d.begin, -"on:begin":d.isTrulyOpeningTag,end:d.end}],subLanguage:"xml",contains:[{ -begin:d.begin,end:d.end,skip:!0,contains:["self"]}]}]},I,{ -beginKeywords:"while if switch catch for"},{ -begin:"\\b(?!function)"+b.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{", -returnBegin:!0,label:"func.def",contains:[w,b.inherit(b.TITLE_MODE,{begin:g, -className:"title.function"})]},{match:/\.\.\./,relevance:0},M,{match:"\\$"+g, -relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"}, -contains:[w]},T,{relevance:0,match:/\b[A-Z][A-Z_]+\b/, -className:"variable.constant"},R,k,{match:/\$[(.]/}]}}})());hljs.registerLanguage("http",(()=>{"use strict";function e(...e){ -return e.map((e=>{return(n=e)?"string"==typeof n?n:n.source:null;var n -})).join("")}return n=>{const a="HTTP/(2|1\\.[01])",s={className:"attribute", -begin:e("^",/[A-Za-z][A-Za-z0-9-]*/,"(?=\\:\\s)"),starts:{contains:[{ -className:"punctuation",begin:/: /,relevance:0,starts:{end:"$",relevance:0}}]} -},t=[s,{begin:"\\n\\n",starts:{subLanguage:[],endsWithParent:!0}}];return{ -name:"HTTP",aliases:["https"],illegal:/\S/,contains:[{begin:"^(?="+a+" \\d{3})", -end:/$/,contains:[{className:"meta",begin:a},{className:"number", -begin:"\\b\\d{3}\\b"}],starts:{end:/\b\B/,illegal:/\S/,contains:t}},{ -begin:"(?=^[A-Z]+ (.*?) "+a+"$)",end:/$/,contains:[{className:"string", -begin:" ",end:" ",excludeBegin:!0,excludeEnd:!0},{className:"meta",begin:a},{ -className:"keyword",begin:"[A-Z]+"}],starts:{end:/\b\B/,illegal:/\S/,contains:t} -},n.inherit(s,{relevance:0})]}}})());hljs.registerLanguage("nginx",(()=>{"use strict";function e(e){ -return n("(?=",e,")")}function n(...e){return e.map((e=>{ -return(n=e)?"string"==typeof n?n:n.source:null;var n})).join("")}return a=>{ -const s={className:"variable",variants:[{begin:/\$\d+/},{begin:/\$\{\w+\}/},{ -begin:n(/[$@]/,a.UNDERSCORE_IDENT_RE)}]},i={endsWithParent:!0,keywords:{ -$pattern:/[a-z_]{2,}|\/dev\/poll/, -literal:["on","off","yes","no","true","false","none","blocked","debug","info","notice","warn","error","crit","select","break","last","permanent","redirect","kqueue","rtsig","epoll","poll","/dev/poll"] -},relevance:0,illegal:"=>",contains:[a.HASH_COMMENT_MODE,{className:"string", -contains:[a.BACKSLASH_ESCAPE,s],variants:[{begin:/"/,end:/"/},{begin:/'/,end:/'/ -}]},{begin:"([a-z]+):/",end:"\\s",endsWithParent:!0,excludeEnd:!0,contains:[s] -},{className:"regexp",contains:[a.BACKSLASH_ESCAPE,s],variants:[{begin:"\\s\\^", -end:"\\s|\\{|;",returnEnd:!0},{begin:"~\\*?\\s+",end:"\\s|\\{|;",returnEnd:!0},{ -begin:"\\*(\\.[a-z\\-]+)+"},{begin:"([a-z\\-]+\\.)+\\*"}]},{className:"number", -begin:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{ -className:"number",begin:"\\b\\d+[kKmMgGdshdwy]?\\b",relevance:0},s]};return{ -name:"Nginx config",aliases:["nginxconf"],contains:[a.HASH_COMMENT_MODE,{ -beginKeywords:"upstream location",end:/;|\{/,contains:i.contains,keywords:{ -section:"upstream location"}},{className:"section", -begin:n(a.UNDERSCORE_IDENT_RE+e(/\s+\{/)),relevance:0},{ -begin:e(a.UNDERSCORE_IDENT_RE+"\\s"),end:";|\\{",contains:[{ -className:"attribute",begin:a.UNDERSCORE_IDENT_RE,starts:i}],relevance:0}], -illegal:"[^\\s\\}\\{]"}}})());hljs.registerLanguage("php-template",(()=>{"use strict";return n=>({ -name:"PHP template",subLanguage:"xml",contains:[{begin:/<\?(php|=)?/,end:/\?>/, -subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"', -end:'"',skip:!0},{begin:"b'",end:"'",skip:!0},n.inherit(n.APOS_STRING_MODE,{ -illegal:null,className:null,contains:null,skip:!0 -}),n.inherit(n.QUOTE_STRING_MODE,{illegal:null,className:null,contains:null, -skip:!0})]}]})})());hljs.registerLanguage("accesslog",(()=>{"use strict";function e(e){ -return e?"string"==typeof e?e:e.source:null}function n(...n){ -return n.map((n=>e(n))).join("")}function l(...n){return"("+((e=>{ -const n=e[e.length-1] -;return"object"==typeof n&&n.constructor===Object?(e.splice(e.length-1,1),n):{} -})(n).capture?"":"?:")+n.map((n=>e(n))).join("|")+")"}return e=>{ -const a=["GET","POST","HEAD","PUT","DELETE","CONNECT","OPTIONS","PATCH","TRACE"] -;return{name:"Apache Access Log",contains:[{className:"number", -begin:/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(:\d{1,5})?\b/,relevance:5},{ -className:"number",begin:/\b\d+\b/,relevance:0},{className:"string", -begin:n(/"/,l(...a)),end:/"/,keywords:a,illegal:/\n/,relevance:5,contains:[{ -begin:/HTTP\/[12]\.\d'/,relevance:5}]},{className:"string", -begin:/\[\d[^\]\n]{8,}\]/,illegal:/\n/,relevance:1},{className:"string", -begin:/\[/,end:/\]/,illegal:/\n/,relevance:0},{className:"string", -begin:/"Mozilla\/\d\.\d \(/,end:/"/,illegal:/\n/,relevance:3},{ -className:"string",begin:/"/,end:/"/,illegal:/\n/,relevance:0}]}}})());hljs.registerLanguage("ini",(()=>{"use strict";function e(e){ -return e?"string"==typeof e?e:e.source:null}function n(...n){ -return n.map((n=>e(n))).join("")}return s=>{const a={className:"number", -relevance:0,variants:[{begin:/([+-]+)?[\d]+_[\d_]+/},{begin:s.NUMBER_RE}] -},t=s.COMMENT();t.variants=[{begin:/;/,end:/$/},{begin:/#/,end:/$/}];const i={ -className:"variable",variants:[{begin:/\$[\w\d"][\w\d_]*/},{begin:/\$\{(.*?)\}/ -}]},r={className:"literal",begin:/\bon|off|true|false|yes|no\b/},c={ -className:"string",contains:[s.BACKSLASH_ESCAPE],variants:[{begin:"'''", -end:"'''",relevance:10},{begin:'"""',end:'"""',relevance:10},{begin:'"',end:'"' -},{begin:"'",end:"'"}]},l={begin:/\[/,end:/\]/,contains:[t,r,i,c,a,"self"], -relevance:0},o=function(...n){return"("+((e=>{const n=e[e.length-1] -;return"object"==typeof n&&n.constructor===Object?(e.splice(e.length-1,1),n):{} -})(n).capture?"":"?:")+n.map((n=>e(n))).join("|")+")" -}(/[A-Za-z0-9_-]+/,/"(\\"|[^"])*"/,/'[^']*'/);return{name:"TOML, also INI", -aliases:["toml"],case_insensitive:!0,illegal:/\S/,contains:[t,{ -className:"section",begin:/\[+/,end:/\]+/},{ -begin:n(o,"(\\s*\\.\\s*",o,")*",n("(?=",/\s*=\s*[^#\s]/,")")),className:"attr", -starts:{end:/$/,contains:[t,l,r,i,c,a]}}]}}})());hljs.registerLanguage("bash",(()=>{"use strict";function e(...e){ -return e.map((e=>{return(s=e)?"string"==typeof s?s:s.source:null;var s -})).join("")}return s=>{const n={},t={begin:/\$\{/,end:/\}/,contains:["self",{ -begin:/:-/,contains:[n]}]};Object.assign(n,{className:"variable",variants:[{ -begin:e(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},t]});const a={ -className:"subst",begin:/\$\(/,end:/\)/,contains:[s.BACKSLASH_ESCAPE]},i={ -begin:/<<-?\s*(?=\w+)/,starts:{contains:[s.END_SAME_AS_BEGIN({begin:/(\w+)/, -end:/(\w+)/,className:"string"})]}},c={className:"string",begin:/"/,end:/"/, -contains:[s.BACKSLASH_ESCAPE,n,a]};a.contains.push(c);const o={begin:/\$\(\(/, -end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},s.NUMBER_MODE,n] -},r=s.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10 -}),l={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0, -contains:[s.inherit(s.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{ -name:"Bash",aliases:["sh"],keywords:{$pattern:/\b[a-z._-]+\b/, -keyword:["if","then","else","elif","fi","for","while","in","do","done","case","esac","function"], -literal:["true","false"], -built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp" -},contains:[r,s.SHEBANG(),l,o,s.HASH_COMMENT_MODE,i,c,{className:"",begin:/\\"/ -},{className:"string",begin:/'/,end:/'/},n]}}})());hljs.registerLanguage("shell",(()=>{"use strict";return s=>({ -name:"Shell Session",aliases:["console","shellsession"],contains:[{ -className:"meta",begin:/^\s{0,3}[/~\w\d[\]()@-]*[>%$#][ ]?/,starts:{ -end:/[^\\](?=\s*$)/,subLanguage:"bash"}}]})})());hljs.registerLanguage("plaintext",(()=>{"use strict";return t=>({ -name:"Plain text",aliases:["text","txt"],disableAutodetect:!0})})());hljs.registerLanguage("apache",(()=>{"use strict";return e=>{const n={ -className:"number",begin:/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(:\d{1,5})?/} -;return{name:"Apache config",aliases:["apacheconf"],case_insensitive:!0, -contains:[e.HASH_COMMENT_MODE,{className:"section",begin:/<\/?/,end:/>/, -contains:[n,{className:"number",begin:/:\d{1,5}/ -},e.inherit(e.QUOTE_STRING_MODE,{relevance:0})]},{className:"attribute", -begin:/\w+/,relevance:0,keywords:{ -_:["order","deny","allow","setenv","rewriterule","rewriteengine","rewritecond","documentroot","sethandler","errordocument","loadmodule","options","header","listen","serverroot","servername"] -},starts:{end:/$/,relevance:0,keywords:{literal:"on off all deny allow"}, -contains:[{className:"meta",begin:/\s\[/,end:/\]$/},{className:"variable", -begin:/[\$%]\{/,end:/\}/,contains:["self",{className:"number",begin:/[$%]\d+/}] -},n,{className:"number",begin:/\b\d+/},e.QUOTE_STRING_MODE]}}],illegal:/\S/}} -})());hljs.registerLanguage("makefile",(()=>{"use strict";return e=>{const i={ -className:"variable",variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)", -contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%{"use strict" -;const e=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],t=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"],i=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"],r=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"],o=["align-content","align-items","align-self","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","auto","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","clear","clip","clip-path","color","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","content","counter-increment","counter-reset","cursor","direction","display","empty-cells","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-smoothing","font-stretch","font-style","font-variant","font-variant-ligatures","font-variation-settings","font-weight","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inherit","initial","justify-content","left","letter-spacing","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marks","mask","max-height","max-width","min-height","min-width","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","perspective","perspective-origin","pointer-events","position","quotes","resize","right","src","tab-size","table-layout","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-style","text-indent","text-overflow","text-rendering","text-shadow","text-transform","text-underline-position","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","white-space","widows","width","word-break","word-spacing","word-wrap","z-index"].reverse() -;return a=>{const n=(e=>({IMPORTANT:{scope:"meta",begin:"!important"},HEXCOLOR:{ -scope:"number",begin:"#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})"}, -ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$", -contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{ -scope:"number", -begin:e.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?", -relevance:0}}))(a),l=r,s=i,d="@[a-z-]+",c={className:"variable", -begin:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b"};return{name:"SCSS",case_insensitive:!0, -illegal:"[=/|']",contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,{ -className:"selector-id",begin:"#[A-Za-z0-9_-]+",relevance:0},{ -className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0 -},n.ATTRIBUTE_SELECTOR_MODE,{className:"selector-tag", -begin:"\\b("+e.join("|")+")\\b",relevance:0},{className:"selector-pseudo", -begin:":("+s.join("|")+")"},{className:"selector-pseudo", -begin:"::("+l.join("|")+")"},c,{begin:/\(/,end:/\)/,contains:[n.CSS_NUMBER_MODE] -},{className:"attribute",begin:"\\b("+o.join("|")+")\\b"},{ -begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b" -},{begin:":",end:";", -contains:[c,n.HEXCOLOR,n.CSS_NUMBER_MODE,a.QUOTE_STRING_MODE,a.APOS_STRING_MODE,n.IMPORTANT] -},{begin:"@(page|font-face)",keywords:{$pattern:d,keyword:"@page @font-face"}},{ -begin:"@",end:"[{;]",returnBegin:!0,keywords:{$pattern:/[a-z-]+/, -keyword:"and or not only",attribute:t.join(" ")},contains:[{begin:d, -className:"keyword"},{begin:/[a-z-]+(?=:)/,className:"attribute" -},c,a.QUOTE_STRING_MODE,a.APOS_STRING_MODE,n.HEXCOLOR,n.CSS_NUMBER_MODE]}]}} -})());hljs.registerLanguage("ruby",(()=>{"use strict";function e(e){ -return n("(?=",e,")")}function n(...e){return e.map((e=>{ -return(n=e)?"string"==typeof n?n:n.source:null;var n})).join("")}return a=>{ -const i="([a-zA-Z_]\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?)",s={ -keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor __FILE__", -built_in:"proc lambda",literal:"true false nil"},r={className:"doctag", -begin:"@[A-Za-z]+"},b={begin:"#<",end:">"},c=[a.COMMENT("#","$",{contains:[r] -}),a.COMMENT("^=begin","^=end",{contains:[r],relevance:10 -}),a.COMMENT("^__END__","\\n$")],t={className:"subst",begin:/#\{/,end:/\}/, -keywords:s},g={className:"string",contains:[a.BACKSLASH_ESCAPE,t],variants:[{ -begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:/%[qQwWx]?\(/, -end:/\)/},{begin:/%[qQwWx]?\[/,end:/\]/},{begin:/%[qQwWx]?\{/,end:/\}/},{ -begin:/%[qQwWx]?/},{begin:/%[qQwWx]?\//,end:/\//},{begin:/%[qQwWx]?%/, -end:/%/},{begin:/%[qQwWx]?-/,end:/-/},{begin:/%[qQwWx]?\|/,end:/\|/},{ -begin:/\B\?(\\\d{1,3})/},{begin:/\B\?(\\x[A-Fa-f0-9]{1,2})/},{ -begin:/\B\?(\\u\{?[A-Fa-f0-9]{1,6}\}?)/},{ -begin:/\B\?(\\M-\\C-|\\M-\\c|\\c\\M-|\\M-|\\C-\\M-)[\x20-\x7e]/},{ -begin:/\B\?\\(c|C-)[\x20-\x7e]/},{begin:/\B\?\\?\S/},{ -begin:n(/<<[-~]?'?/,e(/(\w+)(?=\W)[^\n]*\n(?:[^\n]*\n)*?\s*\1\b/)), -contains:[a.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/, -contains:[a.BACKSLASH_ESCAPE,t]})]}]},d="[0-9](_?[0-9])*",l={className:"number", -relevance:0,variants:[{ -begin:`\\b([1-9](_?[0-9])*|0)(\\.(${d}))?([eE][+-]?(${d})|r)?i?\\b`},{ -begin:"\\b0[dD][0-9](_?[0-9])*r?i?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*r?i?\\b" -},{begin:"\\b0[oO][0-7](_?[0-7])*r?i?\\b"},{ -begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\b"},{ -begin:"\\b0(_?[0-7])+r?i?\\b"}]},o={className:"params",begin:"\\(",end:"\\)", -endsParent:!0,keywords:s},_=[g,{className:"class",beginKeywords:"class module", -end:"$|;",illegal:/=/,contains:[a.inherit(a.TITLE_MODE,{ -begin:"[A-Za-z_]\\w*(::\\w+)*(\\?|!)?"}),{begin:"<\\s*",contains:[{ -begin:"("+a.IDENT_RE+"::)?"+a.IDENT_RE,relevance:0}]}].concat(c)},{ -className:"function",begin:n(/def\s+/,e(i+"\\s*(\\(|;|$)")),relevance:0, -keywords:"def",end:"$|;",contains:[a.inherit(a.TITLE_MODE,{begin:i -}),o].concat(c)},{begin:a.IDENT_RE+"::"},{className:"symbol", -begin:a.UNDERSCORE_IDENT_RE+"(!|\\?)?:",relevance:0},{className:"symbol", -begin:":(?!\\s)",contains:[g,{begin:i}],relevance:0},l,{className:"variable", -begin:"(\\$\\W)|((\\$|@@?)(\\w+))(?=[^@$?])(?![A-Za-z])(?![@$?'])"},{ -className:"params",begin:/\|/,end:/\|/,relevance:0,keywords:s},{ -begin:"("+a.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[{ -className:"regexp",contains:[a.BACKSLASH_ESCAPE,t],illegal:/\n/,variants:[{ -begin:"/",end:"/[a-z]*"},{begin:/%r\{/,end:/\}[a-z]*/},{begin:"%r\\(", -end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}] -}].concat(b,c),relevance:0}].concat(b,c);t.contains=_,o.contains=_;const E=[{ -begin:/^\s*=>/,starts:{end:"$",contains:_}},{className:"meta", -begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d+(p\\d+)?[^\\d][^>]+>)(?=[ ])", -starts:{end:"$",contains:_}}];return c.unshift(b),{name:"Ruby", -aliases:["rb","gemspec","podspec","thor","irb"],keywords:s,illegal:/\/\*/, -contains:[a.SHEBANG({binary:"ruby"})].concat(E).concat(c).concat(_)}}})());hljs.registerLanguage("yaml",(()=>{"use strict";return e=>{ -const n="true false yes no null",a="[\\w#;/?:@&=+$,.~*'()[\\]]+",s={ -className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/ -},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable", -variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]}]},i=e.inherit(s,{ -variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),l={ -end:",",endsWithParent:!0,excludeEnd:!0,keywords:n,relevance:0},t={begin:/\{/, -end:/\}/,contains:[l],illegal:"\\n",relevance:0},g={begin:"\\[",end:"\\]", -contains:[l],illegal:"\\n",relevance:0},b=[{className:"attr",variants:[{ -begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{ -begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---\\s*$", -relevance:10},{className:"string", -begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{ -begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0, -relevance:0},{className:"type",begin:"!\\w+!"+a},{className:"type", -begin:"!<"+a+">"},{className:"type",begin:"!"+a},{className:"type",begin:"!!"+a -},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta", -begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)", -relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{ -className:"number", -begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b" -},{className:"number",begin:e.C_NUMBER_RE+"\\b",relevance:0},t,g,s],c=[...b] -;return c.pop(),c.push(i),l.contains=c,{name:"YAML",case_insensitive:!0, -aliases:["yml"],contains:b}}})());hljs.registerLanguage("diff",(()=>{"use strict";function e(...e){ -return"("+((e=>{const n=e[e.length-1] -;return"object"==typeof n&&n.constructor===Object?(e.splice(e.length-1,1),n):{} -})(e).capture?"":"?:")+e.map((e=>{return(n=e)?"string"==typeof n?n:n.source:null -;var n})).join("|")+")"}return n=>({name:"Diff",aliases:["patch"],contains:[{ -className:"meta",relevance:10, -match:e(/^@@ +-\d+,\d+ +\+\d+,\d+ +@@/,/^\*\*\* +\d+,\d+ +\*\*\*\*$/,/^--- +\d+,\d+ +----$/) -},{className:"comment",variants:[{ -begin:e(/Index: /,/^index/,/={3,}/,/^-{3}/,/^\*{3} /,/^\+{3}/,/^diff --git/), -end:/$/},{match:/^\*{15}$/}]},{className:"addition",begin:/^\+/,end:/$/},{ -className:"deletion",begin:/^-/,end:/$/},{className:"addition",begin:/^!/, -end:/$/}]})})());hljs.registerLanguage("less",(()=>{"use strict" -;const e=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],t=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"],i=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"],o=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"],n=["align-content","align-items","align-self","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","auto","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","clear","clip","clip-path","color","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","content","counter-increment","counter-reset","cursor","direction","display","empty-cells","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-smoothing","font-stretch","font-style","font-variant","font-variant-ligatures","font-variation-settings","font-weight","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inherit","initial","justify-content","left","letter-spacing","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marks","mask","max-height","max-width","min-height","min-width","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","perspective","perspective-origin","pointer-events","position","quotes","resize","right","src","tab-size","table-layout","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-style","text-indent","text-overflow","text-rendering","text-shadow","text-transform","text-underline-position","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","white-space","widows","width","word-break","word-spacing","word-wrap","z-index"].reverse(),r=i.concat(o) -;return a=>{const s=(e=>({IMPORTANT:{scope:"meta",begin:"!important"},HEXCOLOR:{ -scope:"number",begin:"#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})"}, -ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$", -contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{ -scope:"number", -begin:e.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?", -relevance:0}}))(a),l=r,d="([\\w-]+|@\\{[\\w-]+\\})",c=[],g=[],b=e=>({ -className:"string",begin:"~?"+e+".*?"+e}),m=(e,t,i)=>({className:e,begin:t, -relevance:i}),p={$pattern:/[a-z-]+/,keyword:"and or not only", -attribute:t.join(" ")},u={begin:"\\(",end:"\\)",contains:g,keywords:p, -relevance:0} -;g.push(a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,b("'"),b('"'),s.CSS_NUMBER_MODE,{ -begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]", -excludeEnd:!0} -},s.HEXCOLOR,u,m("variable","@@?[\\w-]+",10),m("variable","@\\{[\\w-]+\\}"),m("built_in","~?`[^`]*?`"),{ -className:"attribute",begin:"[\\w-]+\\s*:",end:":",returnBegin:!0,excludeEnd:!0 -},s.IMPORTANT);const h=g.concat({begin:/\{/,end:/\}/,contains:c}),f={ -beginKeywords:"when",endsWithParent:!0,contains:[{beginKeywords:"and not" -}].concat(g)},w={begin:d+"\\s*:",returnBegin:!0,end:/[;}]/,relevance:0, -contains:[{begin:/-(webkit|moz|ms|o)-/},{className:"attribute", -begin:"\\b("+n.join("|")+")\\b",end:/(?=:)/,starts:{endsWithParent:!0, -illegal:"[<=$]",relevance:0,contains:g}}]},v={className:"keyword", -begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b", -starts:{end:"[;{}]",keywords:p,returnEnd:!0,contains:g,relevance:0}},y={ -className:"variable",variants:[{begin:"@[\\w-]+\\s*:",relevance:15},{ -begin:"@[\\w-]+"}],starts:{end:"[;}]",returnEnd:!0,contains:h}},k={variants:[{ -begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:d,end:/\{/}],returnBegin:!0, -returnEnd:!0,illegal:"[<='$\"]",relevance:0, -contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,f,m("keyword","all\\b"),m("variable","@\\{[\\w-]+\\}"),{ -begin:"\\b("+e.join("|")+")\\b",className:"selector-tag" -},m("selector-tag",d+"%?",0),m("selector-id","#"+d),m("selector-class","\\."+d,0),m("selector-tag","&",0),s.ATTRIBUTE_SELECTOR_MODE,{ -className:"selector-pseudo",begin:":("+i.join("|")+")"},{ -className:"selector-pseudo",begin:"::("+o.join("|")+")"},{begin:/\(/,end:/\)/, -relevance:0,contains:h},{begin:"!important"}]},E={ -begin:`[\\w-]+:(:)?(${l.join("|")})`,returnBegin:!0,contains:[k]} -;return c.push(a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,v,y,E,w,k),{ -name:"Less",case_insensitive:!0,illegal:"[=>'/<($\"]",contains:c}}})());hljs.registerLanguage("css",(()=>{"use strict" -;const e=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],t=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"],i=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"],o=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"],r=["align-content","align-items","align-self","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","auto","backface-visibility","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","border","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","clear","clip","clip-path","color","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","content","counter-increment","counter-reset","cursor","direction","display","empty-cells","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-smoothing","font-stretch","font-style","font-variant","font-variant-ligatures","font-variation-settings","font-weight","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inherit","initial","justify-content","left","letter-spacing","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-bottom","margin-left","margin-right","margin-top","marks","mask","max-height","max-width","min-height","min-width","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-bottom","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","perspective","perspective-origin","pointer-events","position","quotes","resize","right","src","tab-size","table-layout","text-align","text-align-last","text-decoration","text-decoration-color","text-decoration-line","text-decoration-style","text-indent","text-overflow","text-rendering","text-shadow","text-transform","text-underline-position","top","transform","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","white-space","widows","width","word-break","word-spacing","word-wrap","z-index"].reverse() -;return n=>{const a=(e=>({IMPORTANT:{scope:"meta",begin:"!important"},HEXCOLOR:{ -scope:"number",begin:"#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})"}, -ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$", -contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{ -scope:"number", -begin:e.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?", -relevance:0}}))(n),l=[n.APOS_STRING_MODE,n.QUOTE_STRING_MODE];return{name:"CSS", -case_insensitive:!0,illegal:/[=|'\$]/,keywords:{keyframePosition:"from to"}, -classNameAliases:{keyframePosition:"selector-tag"}, -contains:[n.C_BLOCK_COMMENT_MODE,{begin:/-(webkit|moz|ms|o)-(?=[a-z])/ -},a.CSS_NUMBER_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/,relevance:0 -},{className:"selector-class",begin:"\\.[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0 -},a.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",variants:[{ -begin:":("+i.join("|")+")"},{begin:"::("+o.join("|")+")"}]},{ -className:"attribute",begin:"\\b("+r.join("|")+")\\b"},{begin:":",end:"[;}]", -contains:[a.HEXCOLOR,a.IMPORTANT,a.CSS_NUMBER_MODE,...l,{ -begin:/(url|data-uri)\(/,end:/\)/,relevance:0,keywords:{built_in:"url data-uri" -},contains:[{className:"string",begin:/[^)]/,endsWithParent:!0,excludeEnd:!0}] -},{className:"built_in",begin:/[\w-]+(?=\()/}]},{ -begin:(s=/@/,((...e)=>e.map((e=>(e=>e?"string"==typeof e?e:e.source:null)(e))).join(""))("(?=",s,")")), -end:"[{;]",relevance:0,illegal:/:/,contains:[{className:"keyword", -begin:/@-?\w[\w]*(-\w+)*/},{begin:/\s/,endsWithParent:!0,excludeEnd:!0, -relevance:0,keywords:{$pattern:/[a-z-]+/,keyword:"and or not only", -attribute:t.join(" ")},contains:[{begin:/[a-z-]+(?=:)/,className:"attribute" -},...l,a.CSS_NUMBER_MODE]}]},{className:"selector-tag", -begin:"\\b("+e.join("|")+")\\b"}]};var s}})());hljs.registerLanguage("json",(()=>{"use strict";return e=>({name:"JSON", -contains:[{className:"attr",begin:/"(\\.|[^\\"\r\n])*"(?=\s*:)/,relevance:1.01 -},{match:/[{}[\],:]/,className:"punctuation",relevance:0},e.QUOTE_STRING_MODE,{ -beginKeywords:"true false null" -},e.C_NUMBER_MODE,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE],illegal:"\\S"}) -})());hljs.registerLanguage("lua",(()=>{"use strict";return e=>{ -const t="\\[=*\\[",a="\\]=*\\]",n={begin:t,end:a,contains:["self"] -},o=[e.COMMENT("--(?!\\[=*\\[)","$"),e.COMMENT("--\\[=*\\[",a,{contains:[n], -relevance:10})];return{name:"Lua",keywords:{$pattern:e.UNDERSCORE_IDENT_RE, -literal:"true false nil", -keyword:"and break do else elseif end for goto if in local not or repeat return then until while", -built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove" -},contains:o.concat([{className:"function",beginKeywords:"function",end:"\\)", -contains:[e.inherit(e.TITLE_MODE,{ -begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params", -begin:"\\(",endsWithParent:!0,contains:o}].concat(o) -},e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string", -begin:t,end:a,contains:[n],relevance:5}])}}})());hljs.registerLanguage("dockerfile",(()=>{"use strict";return e=>({ -name:"Dockerfile",aliases:["docker"],case_insensitive:!0, -keywords:["from","maintainer","expose","env","arg","user","onbuild","stopsignal"], -contains:[e.HASH_COMMENT_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.NUMBER_MODE,{ -beginKeywords:"run cmd entrypoint volume add copy workdir label healthcheck shell", -starts:{end:/[^\\]$/,subLanguage:"bash"}}],illegal:" 0 && fromJSON(steps.open_issues.outputs.data).search.issueCount == 0 && steps.unique_tag.outputs.exists == 'false' }}" = "true" ]; then - echo "::set-output name=outcome::success" - else - echo "::set-output name=outcome::failure" - fi - - - name: Log results and exit - shell: bash - run: | - echo outcome : ${{ steps.outcome.outputs.outcome }} - echo has unique tag : ${{ steps.unique_tag.outputs.exists == 'false' }} - echo has closed issues: ${{ fromJSON(steps.closed_issues.outputs.data).search.issueCount > 0 }} - echo has open issues : ${{ fromJSON(steps.open_issues.outputs.data).search.issueCount > 0 }} - if [ "${{ steps.outcome.outputs.outcome }}" = "failure" ]; then - exit 1 - fi diff --git a/subsite/docs/themes/hugo-relearn/.github/actions/deploy_site/action.yaml b/subsite/docs/themes/hugo-relearn/.github/actions/deploy_site/action.yaml deleted file mode 100644 index b03cae0..0000000 --- a/subsite/docs/themes/hugo-relearn/.github/actions/deploy_site/action.yaml +++ /dev/null @@ -1,17 +0,0 @@ -name: Deploy site -description: Deploys a built site on GitHub-Pages -inputs: - github_token: - description: Secret GitHub token - required: true -runs: - using: composite - steps: - - name: Deploy site - uses: peaceiris/actions-gh-pages@v3 - with: - github_token: ${{ env.GITHUB_TOKEN }} - publish_dir: ${{ env.GITHUB_WORKSPACE }}/../public - env: - GITHUB_TOKEN: ${{ inputs.github_token }} - GITHUB_WORKSPACE: ${{ github.workspace }} diff --git a/subsite/docs/themes/hugo-relearn/.github/actions/release_milestone/action.yaml b/subsite/docs/themes/hugo-relearn/.github/actions/release_milestone/action.yaml deleted file mode 100644 index a16e9fa..0000000 --- a/subsite/docs/themes/hugo-relearn/.github/actions/release_milestone/action.yaml +++ /dev/null @@ -1,64 +0,0 @@ -name: Release milestone -description: Creates a release with changelog and tag out of a given milestone -inputs: - milestone: - description: Milestone for this release - required: true - github_token: - description: Secret GitHub token - required: true -runs: - using: composite - steps: - - name: Setup node - uses: actions/setup-node@v2 - with: - node-version: '16' - - - name: Close milestone - uses: Akkjon/close-milestone@v2 - with: - milestone_name: ${{ env.MILESTONE }} - env: - MILESTONE: ${{ inputs.milestone }} - GITHUB_TOKEN: ${{ inputs.github_token }} - - - name: Create provisionary tag - shell: bash - env: - MILESTONE: ${{ inputs.milestone }} - GITHUB_TOKEN: ${{ inputs.github_token }} - run: | - git config user.name "GitHub Actions Bot" - git config user.email "<>" - git tag --message "" "$MILESTONE" - git push origin "$MILESTONE" - - - name: Update changelog - shell: bash - env: - MILESTONE: ${{ inputs.milestone }} - GITHUB_TOKEN: ${{ inputs.github_token }} - GREN_GITHUB_TOKEN: ${{ inputs.github_token }} - run: | - npx github-release-notes@0.17.1 changelog --generate --override --tags=all - git add * - git commit --message "Ship tag $MILESTONE" - git push origin main - - - name: Create final tag - shell: bash - env: - MILESTONE: ${{ inputs.milestone }} - GITHUB_TOKEN: ${{ inputs.github_token }} - run: | - git tag --force --message "" "$MILESTONE" - git push --force origin "$MILESTONE" - - - name: Publish release - shell: bash - env: - MILESTONE: ${{ inputs.milestone }} - GREN_GITHUB_TOKEN: ${{ inputs.github_token }} - run: | - npx github-release-notes@0.17.1 release --tags "$MILESTONE" diff --git a/subsite/docs/themes/hugo-relearn/.github/contributing.md b/subsite/docs/themes/hugo-relearn/.github/contributing.md deleted file mode 100644 index 0bcbe39..0000000 --- a/subsite/docs/themes/hugo-relearn/.github/contributing.md +++ /dev/null @@ -1,28 +0,0 @@ -# Guidelines - -## For Development - -- help us putting your code into production by opening a meaningful issue -- stay simple for the user by focusing on the mantra "convention over configuration" -- at installation the site should work reasonable without (m)any configuration -- stay close to the Hugo way -- don't use npm or any preprocessing, our contributors may not be front-end developers -- document new features in exampleSite -- don't break existing features if you don't have to -- remove reported issue from the browser's console -- be compatible to IE11, at least for main functionality, for Javascript this means: - - test in IE11 - - check caniuse.com - - don't use arrow functions - - don't use template literals - - don't use other fancy new ES5/6 stuff - -## For Release - -- create releases following [semver policy](https://semver.org/) -- we are using GitHub actions to create new releases -- a release is based on a milestone named like the release itself - just the version number, eg: 1.1.0 -- remember that there have to be at least one closed issue assigned to the milestone -- the release action only runs successfully if all assigned issues for this milestone are closed -- the milestone itself will be closed during execution of the action -- a once released milestone can not be released again diff --git a/subsite/docs/themes/hugo-relearn/.github/workflows/build.yaml b/subsite/docs/themes/hugo-relearn/.github/workflows/build.yaml deleted file mode 100644 index fd9ce5c..0000000 --- a/subsite/docs/themes/hugo-relearn/.github/workflows/build.yaml +++ /dev/null @@ -1,20 +0,0 @@ -name: Build - -on: - push: # Build on all pushes but only deploy for main branch - pull_request: # Build on all PRs regardless what branch - workflow_dispatch: # Allow this task to be manually started (you'll never know) - -jobs: - ci: - name: Run build - runs-on: ubuntu-latest - if: github.event_name != 'push' || (github.event_name == 'push' && github.ref != 'refs/heads/main') - steps: - - name: Checkout repo - uses: actions/checkout@v2 - with: - submodules: true # Fetch Hugo themes (true OR recursive) - - - name: Build site - uses: ./.github/actions/build_site diff --git a/subsite/docs/themes/hugo-relearn/.github/workflows/deploy.yaml b/subsite/docs/themes/hugo-relearn/.github/workflows/deploy.yaml deleted file mode 100644 index 2434748..0000000 --- a/subsite/docs/themes/hugo-relearn/.github/workflows/deploy.yaml +++ /dev/null @@ -1,25 +0,0 @@ -name: Deploy - -on: - push: # Build on all pushes but only deploy for main branch - workflow_dispatch: # Allow this task to be manually started (you'll never know) - -jobs: - deploy: - name: Run deploy - runs-on: ubuntu-latest - if: github.event_name != 'push' || (github.event_name == 'push' && github.ref == 'refs/heads/main') - steps: - - name: Checkout repo - uses: actions/checkout@v2 - with: - submodules: true # Fetch Hugo themes (true OR recursive) - fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod - - - name: Build site - uses: ./.github/actions/build_site - - - name: Deploy site - uses: ./.github/actions/deploy_site - with: - github_token: ${{ secrets.GITHUB_TOKEN }} diff --git a/subsite/docs/themes/hugo-relearn/.github/workflows/release.yaml b/subsite/docs/themes/hugo-relearn/.github/workflows/release.yaml deleted file mode 100644 index 1d32b59..0000000 --- a/subsite/docs/themes/hugo-relearn/.github/workflows/release.yaml +++ /dev/null @@ -1,42 +0,0 @@ -name: Release - -on: - workflow_dispatch: - inputs: - milestone: - description: 'Milestone for this release' - required: true - -jobs: - release: - name: Run release - runs-on: ubuntu-latest - steps: - - name: Checkout repo - uses: actions/checkout@v2 - with: - submodules: true # Fetch Hugo themes (true OR recursive) - fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod - - - name: Check milestone - id: check - uses: ./.github/actions/check_milestone - with: - milestone: ${{ github.event.inputs.milestone }} - github_token: ${{ secrets.GITHUB_TOKEN }} - - - name: Create release - if: ${{ steps.check.outputs.outcome == 'success' }} - uses: ./.github/actions/release_milestone - with: - milestone: ${{ github.event.inputs.milestone }} - github_token: ${{ secrets.GITHUB_TOKEN }} - - # We need to deploy the site again to show the updated changelog - - name: Build site - uses: ./.github/actions/build_site - - - name: Deploy site - uses: ./.github/actions/deploy_site - with: - github_token: ${{ secrets.GITHUB_TOKEN }} diff --git a/subsite/docs/themes/hugo-relearn/.gitignore b/subsite/docs/themes/hugo-relearn/.gitignore deleted file mode 100644 index 940323c..0000000 --- a/subsite/docs/themes/hugo-relearn/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -.DS_Store -public/ -exampleSite/public -exampleSite/hugo*.exe diff --git a/subsite/docs/themes/hugo-relearn/.grenrc.js b/subsite/docs/themes/hugo-relearn/.grenrc.js deleted file mode 100644 index eeeffe2..0000000 --- a/subsite/docs/themes/hugo-relearn/.grenrc.js +++ /dev/null @@ -1,36 +0,0 @@ -module.exports = { - changelogFilename: "exampleSite/content/basics/CHANGELOG.md", - dataSource: "milestones", - groupBy: { - "Enhancements": [ - "feature", - ], - "Fixes": [ - "bug" - ], - "Maintenance": [ - "task", - ], - "Uncategorised": [ - "closed", - ], - }, - ignoreLabels: [ - "discussion", - "documentation", - "duplicate", - "hugo", - "invalid", - "support", - "wontfix", - ], - ignoreTagsWith: [ - "Relearn", - ], - milestoneMatch: "{{tag_name}}", - onlyMilestones: true, - template: { - group: "\n### {{heading}}\n", - release: ({ body, date, release }) => `## ${release} (` + date.replace( /(\d+)\/(\d+)\/(\d+)/, '$3-$2-$1' ) + `)\n${body}`, - }, -}; diff --git a/subsite/docs/themes/hugo-relearn/LICENSE b/subsite/docs/themes/hugo-relearn/LICENSE deleted file mode 100644 index ce8a3bd..0000000 --- a/subsite/docs/themes/hugo-relearn/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2021 Sören Weber -Copyright (c) 2017 Valere JEANTET -Copyright (c) 2016 MATHIEU CORNIC -Copyright (c) 2014 Grav - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/subsite/docs/themes/hugo-relearn/README.md b/subsite/docs/themes/hugo-relearn/README.md deleted file mode 100644 index a6111eb..0000000 --- a/subsite/docs/themes/hugo-relearn/README.md +++ /dev/null @@ -1,52 +0,0 @@ -# Hugo Relearn Theme - -A theme for [Hugo](https://gohugo.io/) designed for documentation. - -![Overview](https://github.com/McShelby/hugo-theme-relearn/raw/main/images/screenshot.png) - -## Motivation - -The theme is a fork of the great [Learn theme](https://github.com/matcornic/hugo-theme-learn) with the aim of fixing long outstanding bugs and adepting to latest Hugo features. As far as possible this theme tries to be a drop-in replacement for the Learn theme. - -## Main features - -- Automatic Search -- Multilingual mode -- Unlimited menu levels -- Automatic next/prev buttons to navigate through menu entries -- Image resizing, shadow… -- Attachments files -- List child pages -- Mermaid diagram (flowchart, sequence, gantt) -- Customizable look and feel and theme variants -- Buttons -- Tip/Note/Info/Warning boxes -- Expand -- Tabs -- File inclusion - -## Installation - -Visit the [installation instructions](https://mcshelby.github.io/hugo-theme-relearn/basics/installation) to learn how to setup the theme in your Hugo installation. - -## Usage - -Visit the [documentation](https://mcshelby.github.io/hugo-theme-relearn/) to learn about all available features and how to use them. - -## Changelog - -See the [changelog](https://mcshelby.github.io/hugo-theme-relearn/basics/history) for a complete list of releases. - -## Contribution - -You are most welcome to contribute to the source code but please visit the [contribution guidelines](https://github.com/McShelby/hugo-theme-relearn/blob/main/.github/contributing.md) first. - -## License - -This theme is licensed under the [MIT License](https://github.com/McShelby/hugo-theme-relearn/blob/main/LICENSE). - -## Credits - -Special thanks to [everyone who has contributed](https://github.com/McShelby/hugo-theme-relearn/graphs/contributors) to this project. - -Many thanks to [@matcornic](https://github.com/matcornic) for his work on the [Learn theme](https://github.com/matcornic/hugo-theme-learn). diff --git a/subsite/docs/themes/hugo-relearn/archetypes/chapter.md b/subsite/docs/themes/hugo-relearn/archetypes/chapter.md deleted file mode 100644 index 6669355..0000000 --- a/subsite/docs/themes/hugo-relearn/archetypes/chapter.md +++ /dev/null @@ -1,12 +0,0 @@ -+++ -chapter = true -pre = "X. " -title = "{{ replace .Name "-" " " | title }}" -weight = 5 -+++ - -### Chapter X - -# Some Chapter title - -Lorem Ipsum. \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/archetypes/default.md b/subsite/docs/themes/hugo-relearn/archetypes/default.md deleted file mode 100644 index 0af9e21..0000000 --- a/subsite/docs/themes/hugo-relearn/archetypes/default.md +++ /dev/null @@ -1,6 +0,0 @@ -+++ -title = "{{ replace .Name "-" " " | title }}" -weight = 5 -+++ - -Lorem Ipsum. \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/config.toml b/subsite/docs/themes/hugo-relearn/exampleSite/config.toml deleted file mode 100644 index 46c128f..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/config.toml +++ /dev/null @@ -1,102 +0,0 @@ -baseURL = "https://example.com" -canonifyURLs = true -languageCode = "en" -defaultContentLanguage = "en" - -title = "Hugo Relearn Documentation" -theme = "hugo-theme-relearn" -themesdir = "../.." -relativeURLs = true - -[params] - editURL = "https://github.com/McShelby/hugo-theme-relearn/edit/main/exampleSite/content/" - description = "Documentation for Hugo Relearn Theme" - author = "Sören Weber" - showVisitedLinks = true - disableBreadcrumb = false - disableNextPrev = false - disableLandingPageButton = true - disableMermaid = false - titleSeparator = "::" - themeVariant = "relearn" - disableSeoHiddenPages = true - -[outputs] - home = ["HTML", "RSS", "JSON"] # add JSON to the home page to support lunr search - -[markup] - [markup.highlight] - style = "base16-snazzy" # choose a color theme or create your own - guessSyntax = false # if set to true, avoid unstyled code if no language was given but mermaid code fences will not work anymore - -[markup.goldmark.renderer] - unsafe= true - -[Languages] - [Languages.en] - title = "Documentation for Hugo Relearn Theme" - weight = 1 - languageName = "English" - landingPageURL = "/" - landingPageName = " Home" - - [[Languages.en.menu.shortcuts]] - name = " GitHub repo" - identifier = "ds" - url = "https://github.com/McShelby/hugo-theme-relearn" - weight = 10 - - [[Languages.en.menu.shortcuts]] - name = " Showcases" - url = "/showcase/" - weight = 11 - - [[Languages.en.menu.shortcuts]] - name = " Hugo Documentation" - identifier = "hugodoc" - url = "https://gohugo.io/" - weight = 20 - - [[Languages.en.menu.shortcuts]] - name = " Credits" - url = "/credits/" - weight = 30 - - [[Languages.en.menu.shortcuts]] - name = " Tags" - url = "/tags/" - weight = 40 - - [Languages.pir] - title = "Documentat'n fer Cap'n Hugo Relearrrn Theme" - weight = 1 - languageName = "Arrr! Pirrrates" - landingPageURL = "/pir/" - landingPageName = " Arrr! Home" - - [[Languages.pir.menu.shortcuts]] - name = " GitHub repo" - identifier = "ds" - url = "https://github.com/McShelby/hugo-theme-relearn" - weight = 10 - - [[Languages.pir.menu.shortcuts]] - name = " Showcases" - url = "/showcase/" - weight = 11 - - [[Languages.pir.menu.shortcuts]] - name = " Cap'n Hugo Documentat'n" - identifier = "hugodoc" - url = "https://gohugo.io/" - weight = 20 - - [[Languages.pir.menu.shortcuts]] - name = " Crrredits" - url = "/credits/" - weight = 30 - - [[Languages.pir.menu.shortcuts]] - name = " Arrr! Tags" - url = "/tags/" - weight = 40 diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/_index.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/_index.en.md deleted file mode 100644 index 6a76d44..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/_index.en.md +++ /dev/null @@ -1,50 +0,0 @@ -+++ -title = "Relearn Theme for Hugo" -+++ - -# Hugo Relearn Theme - -The [Relearn theme](http://github.com/McShelby/hugo-theme-relearn) is a theme for [Hugo](https://gohugo.io/), a static website generator written in Go. Where Hugo is often used for blogs, this theme is designed with documentation in mind. - -{{% notice info %}} -The theme is a fork of the great [Learn theme](https://github.com/matcornic/hugo-theme-learn) with the aim of fixing long outstanding bugs and adepting to latest Hugo features. As far as possible this theme tries to be a drop-in replacement for the Learn theme. -{{% /notice %}} - -## Main features - -{{% notice tip %}} -See [what's new]({{% relref "basics/migration" %}}) within the latest update. -{{% /notice %}} - -* [Automatic Search]({{%relref "basics/configuration/_index.md#activate-search" %}}) -* [Multilingual mode]({{%relref "cont/i18n" %}}) -* Unlimited menu levels -* Automatic next/prev buttons to navigate through menu entries -* [Image resizing, shadow...]({{%relref "cont/markdown#images" %}}) -* [Attachments files]({{%relref "shortcodes/attachments" %}}) -* [List child pages]({{%relref "shortcodes/children" %}}) -* [Mermaid diagram]({{%relref "shortcodes/mermaid" %}}) (flowchart, sequence, gantt) -* [Customizable look and feel and theme variants]({{%relref "basics/customization"%}}) -* [Buttons]({{%relref "shortcodes/button" %}}) -* [Tip/Note/Info/Warning boxes]({{%relref "shortcodes/notice" %}}) -* [Expand]({{%relref "shortcodes/expand" %}}) -* [Tabs]({{%relref "shortcodes/tabs" %}}) -* [File inclusion]({{%relref "shortcodes/include" %}}) - -## Getting support - -To get support, feel free to open a new [discussion topic](https://github.com/McShelby/hugo-theme-relearn/discussions) or [issue](https://github.com/McShelby/hugo-theme-relearn/issues) in the official repository on GitHub. - -## Become a contributor - -Feel free to update this documentation by just clicking the **Edit this page** link displayed on top right of each page. Your changes will be deployed automatically once they were reviewed. - -You are most welcome to contribute bugfixes or even new features to the source code by making pull requests to the [official repository](https://github.com/McShelby/hugo-theme-relearn) via GitHub. Please visit the [contribution guidelines](https://github.com/McShelby/hugo-theme-relearn/blob/main/.github/contributing.md) first. - -## License - -This theme is licensed under the [MIT License](https://github.com/McShelby/hugo-theme-relearn/blob/main/LICENSE). - -## Credits - -This theme would not be possible without the work of many others. See the [credits]({{%relref "credits" %}}) for a detailed list. diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/_index.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/_index.pir.md deleted file mode 100644 index a7a41f9..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/_index.pir.md +++ /dev/null @@ -1,4 +0,0 @@ -+++ -title = "Relearrrn Theme fer Cap'n Hugo" -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/CHANGELOG.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/CHANGELOG.md deleted file mode 100644 index 590efb3..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/CHANGELOG.md +++ /dev/null @@ -1,236 +0,0 @@ -# Changelog - -## 2.7.0 (2021-10-24) - -### Enhancements - -- [**feature**] Support Custom Notice Titles [#124](https://github.com/McShelby/hugo-theme-relearn/issues/124) - ---- - -## 2.6.0 (2021-10-21) - -### Fixes - -- [**bug**] theme: generate correct links if theme served from subdirectory [#120](https://github.com/McShelby/hugo-theme-relearn/issues/120) - ---- - -## 2.5.1 (2021-10-12) - -### Fixes - -- [**bug**] security: fix XSS for malicioius image URLs [#117](https://github.com/McShelby/hugo-theme-relearn/issues/117) - ---- - -## 2.5.0 (2021-10-08) - -### Enhancements - -- [**feature**] syntax highlight: provide default colors for unknown languages [#113](https://github.com/McShelby/hugo-theme-relearn/issues/113) - -### Fixes - -- [**bug**] security: fix XSS for malicioius URLs [#114](https://github.com/McShelby/hugo-theme-relearn/issues/114) -- [**bug**] menu: write correct local shortcut links [#112](https://github.com/McShelby/hugo-theme-relearn/issues/112) - ---- - -## 2.4.1 (2021-10-07) - -### Fixes - -- [**bug**] theme: remove runtime styles from print [#111](https://github.com/McShelby/hugo-theme-relearn/issues/111) - ---- - -## 2.4.0 (2021-10-07) - -### Enhancements - -- [**feature**] lang: add vietnamese translation [#109](https://github.com/McShelby/hugo-theme-relearn/issues/109) -- [**feature**] theme: simplify stylesheet for color variants [#107](https://github.com/McShelby/hugo-theme-relearn/issues/107) -- [**feature**] hidden pages: remove from RSS feed, JSON, taxonomy etc [#102](https://github.com/McShelby/hugo-theme-relearn/issues/102) -- [**feature**] theme: announce alternative content in header [#101](https://github.com/McShelby/hugo-theme-relearn/issues/101) -- [**feature**] menu: frontmatter option to change sort predicate [#98](https://github.com/McShelby/hugo-theme-relearn/issues/98) -- [**feature**] menu: add default setting for menu expansion [#97](https://github.com/McShelby/hugo-theme-relearn/issues/97) -- [**feature**] theme: improve print style [#93](https://github.com/McShelby/hugo-theme-relearn/issues/93) -- [**feature**] theme: improve style [#92](https://github.com/McShelby/hugo-theme-relearn/issues/92) - -### Fixes - -- [**bug**] include: don't generate additional HTML if file should be displayed "as is" [#110](https://github.com/McShelby/hugo-theme-relearn/issues/110) -- [**bug**] attachments: fix broken links if multilang config is used [#105](https://github.com/McShelby/hugo-theme-relearn/issues/105) -- [**bug**] theme: fix sticky header to remove horizontal scrollbar [#82](https://github.com/McShelby/hugo-theme-relearn/issues/82) - -### Maintenance - -- [**task**] chore: update fontawesome [#94](https://github.com/McShelby/hugo-theme-relearn/issues/94) - ---- - -## 2.3.2 (2021-09-20) - -### Fixes - -- [**bug**] docs: rename history pirate translation [#91](https://github.com/McShelby/hugo-theme-relearn/issues/91) - ---- - -## 2.3.1 (2021-09-20) - -### Fixes - -- [**bug**] docs: rename english pirate translation to avoid crash on rendering [#90](https://github.com/McShelby/hugo-theme-relearn/issues/90) - ---- - -## 2.3.0 (2021-09-13) - -### Fixes - -- [**bug**] theme: fix usage of section element [#88](https://github.com/McShelby/hugo-theme-relearn/issues/88) - -### Maintenance - -- [**task**] theme: ensure IE11 compatiblity [#89](https://github.com/McShelby/hugo-theme-relearn/issues/89) -- [**task**] docs: Arrr! showcase multilang featurrre [#87](https://github.com/McShelby/hugo-theme-relearn/issues/87) - ---- - -## 2.2.0 (2021-09-09) - -### Enhancements - -- [**feature**] sitemap: hide hidden pages from sitemap and SEO indexing [#85](https://github.com/McShelby/hugo-theme-relearn/issues/85) - -### Fixes - -- [**bug**] theme: fix showVisitedLinks in case Hugo is configured to modify relative URLs [#86](https://github.com/McShelby/hugo-theme-relearn/issues/86) - -### Maintenance - -- [**task**] theme: switch from data-vocabulary to schema [#84](https://github.com/McShelby/hugo-theme-relearn/issues/84) - ---- - -## 2.1.0 (2021-09-07) - -### Enhancements - -- [**feature**] search: open expand if it contains search term [#80](https://github.com/McShelby/hugo-theme-relearn/issues/80) -- [**feature**] menu: scroll active item into view [#79](https://github.com/McShelby/hugo-theme-relearn/issues/79) -- [**feature**] search: disable search in hidden pages [#76](https://github.com/McShelby/hugo-theme-relearn/issues/76) -- [**feature**] search: improve readablility of index.json [#75](https://github.com/McShelby/hugo-theme-relearn/issues/75) -- [**feature**] search: increase performance [#74](https://github.com/McShelby/hugo-theme-relearn/issues/74) -- [**feature**] search: improve search context preview [#73](https://github.com/McShelby/hugo-theme-relearn/issues/73) - -### Fixes - -- [**bug**] search: hide non-site content [#81](https://github.com/McShelby/hugo-theme-relearn/issues/81) -- [**bug**] menu: always hide hidden sub pages [#77](https://github.com/McShelby/hugo-theme-relearn/issues/77) - ---- - -## 2.0.0 (2021-08-28) - -### Enhancements - -- [**feature**] tabs: enhance styling [#65](https://github.com/McShelby/hugo-theme-relearn/issues/65) -- [**feature**] theme: improve readability [#64](https://github.com/McShelby/hugo-theme-relearn/issues/64) -- [**feature**] menu: show hidden pages if accessed directly [#60](https://github.com/McShelby/hugo-theme-relearn/issues/60) -- [**feature**] theme: treat pages without title as hidden [#59](https://github.com/McShelby/hugo-theme-relearn/issues/59) -- [**feature**] search: show search results if field gains focus [#58](https://github.com/McShelby/hugo-theme-relearn/issues/58) -- [**feature**] theme: add partial templates for pre/post menu entries [#56](https://github.com/McShelby/hugo-theme-relearn/issues/56) -- [**feature**] theme: make chapter archetype more readable [#55](https://github.com/McShelby/hugo-theme-relearn/issues/55) -- [**feature**] children: add parameter for container style [#53](https://github.com/McShelby/hugo-theme-relearn/issues/53) -- [**feature**] theme: make content a template [#50](https://github.com/McShelby/hugo-theme-relearn/issues/50) -- [**feature**] menu: control menu expansion with alwaysopen parameter [#49](https://github.com/McShelby/hugo-theme-relearn/issues/49) -- [**feature**] include: new shortcode to include other files [#43](https://github.com/McShelby/hugo-theme-relearn/issues/43) -- [**feature**] theme: adjust print styles [#35](https://github.com/McShelby/hugo-theme-relearn/issues/35) -- [**feature**] code highligher: switch to standard hugo highlighter [#32](https://github.com/McShelby/hugo-theme-relearn/issues/32) - -### Fixes - -- [**bug**] arrow-nav: default sorting ignores ordersectionsby [#63](https://github.com/McShelby/hugo-theme-relearn/issues/63) -- [**bug**] children: default sorting ignores ordersectionsby [#62](https://github.com/McShelby/hugo-theme-relearn/issues/62) -- [**bug**] arrow-nav: fix broken links on (and below) hidden pages [#61](https://github.com/McShelby/hugo-theme-relearn/issues/61) -- [**bug**] theme: remove superflous singular taxonomy from taxonomy title [#46](https://github.com/McShelby/hugo-theme-relearn/issues/46) -- [**bug**] theme: missing --MENU-HOME-LINK-HOVER-color in documentation [#45](https://github.com/McShelby/hugo-theme-relearn/issues/45) -- [**bug**] theme: fix home link when base URL has some path [#44](https://github.com/McShelby/hugo-theme-relearn/issues/44) - -### Maintenance - -- [**task**] docs: include changelog in exampleSite [#33](https://github.com/McShelby/hugo-theme-relearn/issues/33) - ---- - -## 1.2.0 (2021-07-26) - -### Enhancements - -- [**feature**] theme: adjust copy-to-clipboard [#29](https://github.com/McShelby/hugo-theme-relearn/issues/29) -- [**feature**] attachments: adjust style between notice boxes and attachments [#28](https://github.com/McShelby/hugo-theme-relearn/issues/28) -- [**feature**] theme: adjust blockquote contrast [#27](https://github.com/McShelby/hugo-theme-relearn/issues/27) -- [**feature**] expand: add option to open on page load [#25](https://github.com/McShelby/hugo-theme-relearn/issues/25) -- [**feature**] expand: rework styling [#24](https://github.com/McShelby/hugo-theme-relearn/issues/24) -- [**feature**] attachments: sort output [#23](https://github.com/McShelby/hugo-theme-relearn/issues/23) -- [**feature**] notice: make restyling of notice boxes more robust [#20](https://github.com/McShelby/hugo-theme-relearn/issues/20) -- [**feature**] notice: fix contrast issues [#19](https://github.com/McShelby/hugo-theme-relearn/issues/19) -- [**feature**] notice: align box colors to common standards [#18](https://github.com/McShelby/hugo-theme-relearn/issues/18) -- [**feature**] notice: use distinct icons for notice box type [#17](https://github.com/McShelby/hugo-theme-relearn/issues/17) - -### Fixes - -- [**bug**] attachments: support i18n for attachment size [#21](https://github.com/McShelby/hugo-theme-relearn/issues/21) -- [**bug**] notice: support i18n for box labels [#16](https://github.com/McShelby/hugo-theme-relearn/issues/16) -- [**bug**] notice: support multiple blocks in one box [#15](https://github.com/McShelby/hugo-theme-relearn/issues/15) - -### Maintenance - -- [**task**] dependency: upgrade jquery to 3.6.0 [#30](https://github.com/McShelby/hugo-theme-relearn/issues/30) - ---- - -## 1.1.1 (2021-07-04) - -### Maintenance - -- [**task**] theme: prepare for new hugo theme registration [#13](https://github.com/McShelby/hugo-theme-relearn/issues/13) - ---- - -## 1.1.0 (2021-07-02) - -### Enhancements - -- [**feature**] mermaid: expose options in config.toml [#4](https://github.com/McShelby/hugo-theme-relearn/issues/4) - -### Fixes - -- [**bug**] mermaid: config option for CDN url not used [#12](https://github.com/McShelby/hugo-theme-relearn/issues/12) -- [**bug**] mermaid: only highlight text in HTML elements [#10](https://github.com/McShelby/hugo-theme-relearn/issues/10) -- [**bug**] mermaid: support pan & zoom for graphs [#9](https://github.com/McShelby/hugo-theme-relearn/issues/9) -- [**bug**] mermaid: code fences not always rendered [#6](https://github.com/McShelby/hugo-theme-relearn/issues/6) -- [**bug**] mermaid: search term on load may bomb chart [#5](https://github.com/McShelby/hugo-theme-relearn/issues/5) - -### Maintenance - -- [**task**] mermaid: update to 8.10.2 [#7](https://github.com/McShelby/hugo-theme-relearn/issues/7) - ---- - -## 1.0.1 (2021-07-01) - -### Maintenance - -- [**task**] Prepare for hugo showcase [#3](https://github.com/McShelby/hugo-theme-relearn/issues/3) - ---- - -## 1.0.0 (2021-07-01) - -### Maintenance - -- [**task**] Fork project [#1](https://github.com/McShelby/hugo-theme-relearn/issues/1) diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/_index.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/_index.en.md deleted file mode 100755 index 4d67f9b..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/_index.en.md +++ /dev/null @@ -1,11 +0,0 @@ -+++ -chapter = true -title = "Basics" -weight = 1 -+++ - -### Chapter 1 - -# Basics - -Discover what this Hugo theme is all about and the core-concepts behind it. diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/_index.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/_index.pir.md deleted file mode 100644 index 3ffb2d4..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/_index.pir.md +++ /dev/null @@ -1,6 +0,0 @@ -+++ -chapter = true -title = "Basics" -weight = 1 -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/configuration/_index.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/configuration/_index.en.md deleted file mode 100644 index 40e0c47..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/configuration/_index.en.md +++ /dev/null @@ -1,135 +0,0 @@ -+++ -title = "Configuration" -weight = 20 -+++ - -## Global site parameters - -On top of [Hugo global configuration](https://gohugo.io/overview/configuration/), the Relearn theme lets you define the following parameters in your `config.toml` (here, values are default). - -Note that some of these parameters are explained in details in other sections of this documentation. - -```toml -[params] - # This controls whether submenus will be expanded (true), or collapsed (false) in the - # menu; if no setting is given, the first menu level is set to false, all others to true; - # this can be overridden in the pages frontmatter - alwaysopen = true - # Prefix URL to edit current page. Will display an "Edit this page" button on top right hand corner of every page. - # Useful to give opportunity to people to create merge request for your doc. - # See the config.toml file from this documentation site to have an example. - editURL = "" - # Author of the site, will be used in meta information - author = "" - # Description of the site, will be used in meta information - description = "" - # Shows a checkmark for visited pages on the menu - showVisitedLinks = false - # Disable search function. It will hide search bar - disableSearch = false - # Disable search in hidden pages, otherwise they will be shown in search box - disableSearchHiddenPages = false - # Disables hidden pages from showing up in the sitemap and on Google (et all), otherwise they may be indexed by search engines - disableSeoHiddenPages = false - # Disables hidden pages from showing up on the tags page although the tag term will be displayed even if all pages are hidden - disableTagHiddenPages = false - # Javascript and CSS cache are automatically busted when new version of site is generated. - # Set this to true to disable this behavior (some proxies don't handle well this optimization) - disableAssetsBusting = false - # Set this to true to disable copy-to-clipboard button for inline code. - disableInlineCopyToClipBoard = false - # A title for shortcuts in menu is set by default. Set this to true to disable it. - disableShortcutsTitle = false - # If set to false, a Home button will appear below the search bar on the menu. - # It is redirecting to the landing page of the current language if specified. (Default is "/") - disableLandingPageButton = true - # When using mulitlingual website, disable the switch language button. - disableLanguageSwitchingButton = false - # Hide breadcrumbs in the header and only show the current page title - disableBreadcrumb = true - # If set to true, prevents Hugo from including the Mermaid module if not needed (will reduce load times and traffic) - disableMermaid = false - # Specifies the remote location of the Mermaid js - customMermaidURL = "https://unpkg.com/mermaid@8.8.0/dist/mermaid.min.js" - # Initialization parameter for Mermaid, see Mermaid documentation - mermaidInitialize = "{ \"theme\": \"default\" }" - # Hide Next and Previous page buttons normally displayed full height beside content - disableNextPrev = true - # Order sections in menu by "weight" or "title". Default to "weight"; - # this can be overridden in the pages frontmatter - ordersectionsby = "weight" - # Change default color scheme with a variant one. Can be "red", "blue", "green". - themeVariant = "" - # Provide a list of custom css files to load relative from the `static/` folder in the site root. - custom_css = ["css/foo.css", "css/bar.css"] - # Change the title separator. Default to "::". - titleSeparator = "-" -``` - -## A word on running your site in a subfolder - -The theme runs best if your site is installed in the root of your webserver. If your site is served from a subfolder, eg. `https://example.com/mysite/`, you have to set the following lines to your `config.toml` - -````toml -baseURL = "https://example.com/mysite/" -canonifyURLs = true -```` - -Without `canonifyURLs=true` URLs in sublemental pages (like `sitemap.xml`, `rss.xml`) will be generated falsly while your HTML files will still work. See https://github.com/gohugoio/hugo/issues/5226. - -## Activate search - -If not already present, add the follow lines in the same `config.toml` file. - -```toml -[outputs] -home = [ "HTML", "RSS", "JSON"] -``` - -Relearn theme uses the last improvement available in hugo version 20+ to generate a json index file ready to be consumed by lunr.js javascript search engine. - -> Hugo generate lunrjs index.json at the root of public folder. -> When you build the site with `hugo server`, hugo generates it internally and of course it doesn’t show up in the filesystem - -## Mermaid - -The Mermaid configuration parameters can also be set on a specific page. In this case, the global parameter would be overwritten by the local one. See [Mermaid]({{< relref "shortcodes/mermaid.md" >}}) for additional documentation. - -> Example: -> -> Mermaid is globally disabled. By default it won't be loaded by any page. -> On page "Architecture" you need a class diagram. You can set the Mermaid parameters locally to only load mermaid on this page (not on the others). - -You also can disable Mermaid for specific pages while globally enabled. - -## Home Button Configuration - -If the `disableLandingPageButton` option is set to `false`, a Home button will appear -on the left menu. It is an alternative for clicking on the logo. To edit the -appearance, you will have to configure two parameters for the defined languages: - -```toml -[Lanugages] -[Lanugages.en] -... -landingPageURL = "/" -landingPageName = " Home" -... -[Lanugages.pir] -... -landingPageURL = "/pir/" -landingPageName = " Arrr! Homme" -... -``` - -If those params are not configured for a specific language, they will get their -default values: - -```toml -landingPageURL = "/" -landingPageName = " Home" -``` - -The home button is going to look like this: - -![Default Home Button](/basics/configuration/images/home_button_defaults.png?width=100%) diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/configuration/_index.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/configuration/_index.pir.md deleted file mode 100644 index 5849920..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/configuration/_index.pir.md +++ /dev/null @@ -1,5 +0,0 @@ -+++ -title = "Configurrrat'n" -weight = 20 -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/configuration/images/home_button_defaults.png b/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/configuration/images/home_button_defaults.png deleted file mode 100644 index c5c32f1..0000000 Binary files a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/configuration/images/home_button_defaults.png and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/customization/_index.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/customization/_index.en.md deleted file mode 100644 index b9dab23..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/customization/_index.en.md +++ /dev/null @@ -1,133 +0,0 @@ -+++ -title = "Customization" -weight = 25 -+++ - -The Relearn theme has been built to be as configurable as possible by defining multiple [partials](https://gohugo.io/templates/partials/) - -In `themes/hugo-theme-relearn/layouts/partials/`, you will find all the partials defined for this theme. If you need to overwrite something, don't change the code directly. Instead [follow this page](https://gohugo.io/themes/customizing/). You'd create a new partial in the `layouts/partials` folder of your local project. This partial will have the priority. - -This theme defines the following partials : - -- *content*: the content page itself. This can be overridden if you wan't to display page's meta data above or below the content. -- *header*: the header of the content page (contains the breadcrumbs). _Not meant to be overwritten_ -- *custom-header*: custom headers in page. Meant to be overwritten when adding CSS imports. Don't forget to include `style` HTML tag directive in your file -- *footer*: the footer of the content page (contains the arrows). _Not meant to be overwritten_ -- *custom-footer*: custom footer in page. Meant to be overwritten when adding Javacript. Don't forget to include `javascript` HTML tag directive in your file -- *favicon*: the favicon -- *logo*: the logo, on top left hand corner. -- *meta*: HTML meta tags, if you want to change default behavior -- *menu*: left menu. _Not meant to be overwritten_ -- *menu-pre*: side-wide configuration to prepend to menu items. If you override this, it is your responsiblity to take the page's `pre` setting into account. -- *menu-post*: side-wide configuration to append to menu items. If you override this, it is your responsiblity to take the page's `post` setting into account. -- *menu-footer*: footer of the the left menu -- *search*: search box -- *toc*: table of contents - -## Change the logo - -Create a new file in `layouts/partials/` named `logo.html`. Then write any HTML you want. -You could use an `img` HTML tag and reference an image created under the *static* folder, or you could paste a SVG definition! - -{{% notice note %}} -The size of the logo will adapt automatically -{{% /notice %}} - -## Change the favicon - -If your favicon is a png, just drop off your image in your local `static/images/` folder and name it `favicon.png` - -If you need to change this default behavior, create a new file in `layouts/partials/` named `favicon.html`. Then write something like this: - -```html - -``` - -## Change default colors {#theme-variant} - -The Relearn theme let you choose between some predefined color scheme variants, but feel free to add one yourself! - -### Standard variant - -```toml -[params] - # Change default color scheme with a variant one. Can be empty, "red", "blue", "green". - themeVariant = "" -``` - -![Red variant](/basics/customization/images/standard-variant.png?width=60pc) - -### Red variant - -```toml -[params] - # Change default color scheme with a variant one. Can be empty, "red", "blue", "green". - themeVariant = "red" -``` - -![Red variant](/basics/customization/images/red-variant.png?width=60pc) - -### Blue variant - -```toml -[params] - # Change default color scheme with a variant one. Can be empty, "red", "blue", "green". - themeVariant = "blue" -``` - -![Blue variant](/basics/customization/images/blue-variant.png?width=60pc) - -### Green variant - -```toml -[params] - # Change default color scheme with a variant one. Can be empty, "red", "blue", "green". - themeVariant = "green" -``` - -![Green variant](/basics/customization/images/green-variant.png?width=60pc) - -### 'Mine‘ variant - -First, create a new CSS file in your local `static/css` folder prefixed by `theme` (e.g. with _mine_ theme `static/css/theme-mine.css`). Copy the following content and modify colors in CSS variables. - -```css -:root { - --MAIN-TEXT-color: #323232; /* Color of text by default */ - --MAIN-TITLES-TEXT-color: #5e5e5e; /* Color of titles h2-h3-h4-h5-h6 */ - --MAIN-LINK-color: #1C90F3; /* Color of links */ - --MAIN-LINK-HOVER-color: #167ad0; /* Color of hovered links */ - --MAIN-ANCHOR-color: #1C90F3; /* color of anchors on titles */ - - --MAIN-CODE-color: #e2e4e5; /* fallback color for code background */ - --MAIN-CODE-BG-color: #282a36; /* fallback color for code text */ - - --MENU-HOME-LINK-color: #323232; /* Color of the home button text */ - --MENU-HOME-LINK-HOVER-color: #5e5e5e; /* Color of the hovered home button text */ - - --MENU-HEADER-BG-color: #1C90F3; /* Background color of menu header */ - --MENU-HEADER-BORDER-color: #33a1ff; /*Color of menu header border */ - - --MENU-SEARCH-BG-color: #167ad0; /* Search field background color (by default borders + icons) */ - --MENU-SEARCH-BOX-color: #33a1ff; /* Override search field border color */ - --MENU-SEARCH-BOX-ICONS-color: #a1d2fd; /* Override search field icons color */ - - --MENU-SECTIONS-ACTIVE-BG-color: #20272b; /* Background color of the active section and its children */ - --MENU-SECTIONS-BG-color: #252c31; /* Background color of other sections */ - --MENU-SECTIONS-LINK-color: #ccc; /* Color of links in menu */ - --MENU-SECTIONS-LINK-HOVER-color: #e6e6e6; /* Color of links in menu, when hovered */ - --MENU-SECTION-ACTIVE-CATEGORY-color: #777; /* Color of active category text */ - --MENU-SECTION-ACTIVE-CATEGORY-BG-color: #fff; /* Color of background for the active category (only) */ - - --MENU-VISITED-color: #33a1ff; /* Color of 'page visited' icons in menu */ - --MENU-SECTION-HR-color: #20272b; /* Color of
separator in menu */ -} -``` - -Then, set the `themeVariant` value with the name of your custom theme file. That's it! - -```toml -[params] - # Change default color scheme with a variant one. Can be "red", "blue", "green". - themeVariant = "mine" -``` diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/customization/_index.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/customization/_index.pir.md deleted file mode 100644 index 03cd9da..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/customization/_index.pir.md +++ /dev/null @@ -1,5 +0,0 @@ -+++ -title = "Customizat'n" -weight = 25 -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/customization/images/blue-variant.png b/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/customization/images/blue-variant.png deleted file mode 100644 index e38c767..0000000 Binary files a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/customization/images/blue-variant.png and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/customization/images/green-variant.png b/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/customization/images/green-variant.png deleted file mode 100644 index 4ad9827..0000000 Binary files a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/customization/images/green-variant.png and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/customization/images/red-variant.png b/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/customization/images/red-variant.png deleted file mode 100644 index 769611e..0000000 Binary files a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/customization/images/red-variant.png and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/customization/images/standard-variant.png b/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/customization/images/standard-variant.png deleted file mode 100644 index 0d23ff0..0000000 Binary files a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/customization/images/standard-variant.png and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/history/_index.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/history/_index.en.md deleted file mode 100644 index d238f41..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/history/_index.en.md +++ /dev/null @@ -1,5 +0,0 @@ -+++ -title = "History" -weight = 30 -+++ -{{% include "basics/CHANGELOG.md" false %}} diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/history/_index.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/history/_index.pir.md deleted file mode 100644 index 844a9c1..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/history/_index.pir.md +++ /dev/null @@ -1,5 +0,0 @@ -+++ -title = "Historrry" -weight = 30 -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/installation/_index.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/installation/_index.en.md deleted file mode 100644 index 292f26d..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/installation/_index.en.md +++ /dev/null @@ -1,102 +0,0 @@ -+++ -title = "Installation" -weight = 15 -+++ - -The following steps are here to help you initialize your new website. If you don't know Hugo at all, we strongly suggest you learn more about it by following this [great documentation for beginners](https://gohugo.io/overview/quickstart/). - -## Create your project - -Hugo provides a `new` command to create a new website. - -``` -hugo new site -``` - -## Install the theme - -Install the Relearn theme by following [this documentation](https://gohugo.io/getting-started/quick-start/#step-3-add-a-theme) - -This theme's repository is: https://github.com/McShelby/hugo-theme-relearn.git - -Alternatively, you can [download the theme as .zip](https://github.com/McShelby/hugo-theme-relearn/archive/main.zip) file and extract it in the `themes` directory - -## Basic configuration - -When building the website, you can set a theme by using `--theme` option. However, we suggest you modify the configuration file (`config.toml`) and set the theme as the default. You can also add the `[outputs]` section to enable the search functionality. - -```toml -# Change the default theme to be use when building the site with Hugo -theme = "hugo-theme-relearn" - -# For search functionality -[outputs] -home = [ "HTML", "RSS", "JSON"] -``` - -## Create your first chapter page - -Chapters are pages that contain other child pages. It has a special layout style and usually just contains a _chapter name_, the _title_ and a _brief abstract_ of the section. - -```markdown -### Chapter 1 - -# Basics - -Discover what this Hugo theme is all about and the core concepts behind it. -``` - -renders as - -![A Chapter](/basics/installation/images/chapter.png?classes=shadow&width=60pc) - -The Relearn theme provides archetypes to create skeletons for your website. Begin by creating your first chapter page with the following command - -```shell -hugo new --kind chapter basics/_index.md -``` - -By opening the given file, you should see the property `chapter=true` on top, meaning this page is a _chapter_. - -By default all chapters and pages are created as a draft. If you want to render these pages, remove the property `draft: true` from the metadata. - -## Create your first content pages - -Then, create content pages inside the previously created chapter. Here are two ways to create content in the chapter: - -```shell -hugo new basics/first-content.md -hugo new basics/second-content/_index.md -``` - -Feel free to edit those files by adding some sample content and replacing the `title` value in the beginning of the files. - -## Launching the website locally - -Launch by using the following command: - -```shell -hugo serve -``` - -Go to `http://localhost:1313` - -You should notice three things: - -1. You have a left-side **Basics** menu, containing two submenus with names equal to the `title` properties in the previously created files. -2. The home page explains how to customize it by following the instructions. -3. When you run `hugo serve`, when the contents of the files change, the page automatically refreshes with the changes. Neat! - -## Build the website - -When your site is ready to deploy, run the following command: - -```shell -hugo -``` - -A `public` folder will be generated, containing all static content and assets for your website. It can now be deployed on any web server. - -{{% notice note %}} -This website can be automatically published and hosted with [Netlify](https://www.netlify.com/) (Read more about [Automated HUGO deployments with Netlify](https://www.netlify.com/blog/2015/07/30/hosting-hugo-on-netlifyinsanely-fast-deploys/)). Alternatively, you can use [GitHub pages](https://gohugo.io/hosting-and-deployment/hosting-on-github/) -{{% /notice %}} diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/installation/_index.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/installation/_index.pir.md deleted file mode 100644 index c23fc58..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/installation/_index.pir.md +++ /dev/null @@ -1,5 +0,0 @@ -+++ -title = "Installat'n" -weight = 15 -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/installation/images/chapter.png b/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/installation/images/chapter.png deleted file mode 100644 index 18b1841..0000000 Binary files a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/installation/images/chapter.png and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/migration/_index.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/migration/_index.en.md deleted file mode 100644 index 35a0666..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/migration/_index.en.md +++ /dev/null @@ -1,95 +0,0 @@ -+++ -title = "What's new" -weight = 2 -+++ - -This document shows you what's new in the latest release. For a detailed list of changes, see the [history page]({{%relref "basics/history" %}}). - -**Breaking**: A change that requires action by you after upgrading to assure the site is still functional. - -**Change**: A change in default behavior. This may requires action by you / may or may not be revertable by configuration. - -**New**: Marks new behavior you might find interesting or comes configurable. - ---- - -## 2.7.0 - -- **New**: Optional second parameter for [`notice`]({{% relref "shortcodes/notice" %}}) shortcode to set title in box header. -## 2.6.0 - -- **New**: Your site can now be served from a subfolder if you set `baseURL` and `canonifyURLs=true` in your `config.toml`. See the [documentation]({{% relref "basics/configuration/#a-word-on-running-your-site-in-a-subfolder" %}}) for a detailed example. - ---- - -## 2.5.0 - -- **Change**: Add new colors `--MAIN-CODE-color` and `--MAIN-CODE-BG-color` for syntax highlightning fallback in your stylesheet in case `guessSyntax=true` is set. Ideally they are set to the same values as the ones from your chosen chroma style. - ---- - -## 2.4.0 - -- **Change**: Creation of customized stylesheets was simplified down to only contain the CSS variables. Everything else can and should be deleted from your custom stylesheet to assure everything works fine. For the predefined stylesheet variants, this change is already included. The [documentation]({{%relref "basics/customization/#mine-variant" %}}) was adjusted accordingly. - -- **New**: Hidden pages are displayed by default in their according tags page. You can now turn off this behavior by setting `disableTagHiddenPages=true` in your `config.toml`. - -- **New**: You can define the expansion state of your menus for the whole site by setting the `alwaysopen` option in your `config.toml`. Please see further [documentation]({{%relref "cont/pages/#override-expand-state-rules-for-menu-entries" %}}) for possible values and default behavior. - -- **New**: New frontmatter `ordersectionsby` option to change immediate children sorting in menu and `children` shortcode. Possible values are `title` or `weight`. - -- **New**: Alternate content of a page is now advertised in the HTML meta tags. See [Hugo documentation](https://gohugo.io/templates/rss/#reference-your-rss-feed-in-head). - ---- - -## 2.2.0 - -- **New**: Hidden pages are displayed by default in the sitemap generated by Hugo and are therefore visible for search engine indexing. You can now turn off this behavior by setting `disableSeoHiddenPages=true` in your `config.toml`. - ---- - -## 2.1.0 - -- **Change**: In case the site's structure contains addional *.md files not part of the site (eg files that are meant to be included by site pages - see CHANGELOG.md in exampleSite), they will now be ignored by the search. - -- **New**: Hidden pages are indexed for the site search by default. You can now turn off this behavior by setting `disableSearchHiddenPages=true` in your `config.toml`. - -- **New**: If a search term is found in an `expand` shortcode, the expand will be opened. - -- **New**: The menu will scroll the active item into view on load. - ---- - -## 2.0.0 - -- **Change**: Syntaxhighlightning was switched to [built in Hugo mechanism](https://gohugo.io/content-management/syntax-highlighting/). You may need to configure a new stylesheet or decide to roll you own as describedd on in the Hugo documentation - -- **Change**: In the predefined stylesheets there was a typo and `--MENU-HOME-LINK-HOVERED-color` must be changed to `--MENU-HOME-LINK-HOVER-color`. - -- **Change**: `--MENU-HOME-LINK-color` and `--MENU-HOME-LINK-HOVER-color` were missing in the documentation. You should add them to your custom stylesheets. - -- **Change**: Arrow navigation and `children` shortcode were ignoring setting for `ordersectionsby`. This is now changed and may result in different sorting order of your sub pages. - -- **Change**: If hidden pages are accessed directly by typing their URL, they will be exposed in the menu. - -- **Change**: A page without a `title` will be treated as `hidden=true`. - -- **New**: You can define the expansion state of your menus in the frontmatter. Please see further [documentation]({{%relref "cont/pages/#override-expand-state-rules-for-menu-entries" %}}) for possible values and default behavior. - -- **New**: New partials for defining pre/post content for menu items and the content. See [documentation]({{% relref "basics/customization" %}}) for further reading. - -- **New**: Shortcode [`children`]({{% relref "shortcodes/children" %}}) with new parameter `containerstyle`. - -- **New**: New shortcode [`include`]({{% relref "shortcodes/include" %}}) to include arbitrary file content into a page. - ---- - -## 1.2.0 - -- **New**: Shortcode [`expand`]({{% relref "shortcodes/expand" %}}) with new parameter to open on page load. - ---- - -## 1.1.0 - -- **New**: [`Mermaid`]({{% relref "shortcodes/mermaid#configuration" %}}) config options can be set in `config.toml`. \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/migration/_index.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/migration/_index.pir.md deleted file mode 100644 index 2b41b68..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/migration/_index.pir.md +++ /dev/null @@ -1,5 +0,0 @@ -+++ -title = "Migrrrat'n" -weight = 17 -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/requirements/_index.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/requirements/_index.en.md deleted file mode 100755 index 3d15b9a..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/requirements/_index.en.md +++ /dev/null @@ -1,11 +0,0 @@ -+++ -disableToc = true -title = "Requirements" -weight = 10 -+++ - -Thanks to the simplicity of Hugo, this page is as empty as this theme needs requirements. - -Just download latest version of [Hugo binary](https://gohugo.io/getting-started/installing/) for your OS (Windows, Linux, Mac) : it's that simple. - -![Magic](/basics/requirements/images/magic.gif?classes=shadow) diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/requirements/_index.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/requirements/_index.pir.md deleted file mode 100644 index 312e87c..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/requirements/_index.pir.md +++ /dev/null @@ -1,6 +0,0 @@ -+++ -disableToc = true -title = "Requirrrements" -weight = 10 -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/requirements/images/magic.gif b/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/requirements/images/magic.gif deleted file mode 100644 index 235c4ed..0000000 Binary files a/subsite/docs/themes/hugo-relearn/exampleSite/content/basics/requirements/images/magic.gif and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/_index.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/_index.en.md deleted file mode 100755 index c0152a6..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/_index.en.md +++ /dev/null @@ -1,11 +0,0 @@ -+++ -chapter = true -title = "Content" -weight = 2 -+++ - -### Chapter 2 - -# Content - -Find out how to create and organize your content quickly and intuitively. diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/_index.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/_index.pir.md deleted file mode 100644 index 4a040d6..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/_index.pir.md +++ /dev/null @@ -1,6 +0,0 @@ -+++ -chapter = true -title = "Rambl'n" -weight = 2 -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/archetypes.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/archetypes.en.md deleted file mode 100644 index 044b63c..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/archetypes.en.md +++ /dev/null @@ -1,58 +0,0 @@ -+++ -title = "Archetypes" -weight = 10 -+++ - -Using the command: `hugo new [relative new content path]`, you can start a content file with the date and title automatically set. While this is a welcome feature, active writers need more: [archetypes](https://gohugo.io/content/archetypes/). - -It is pre-configured skeleton pages with default front matter. Please refer to the documentation for types of page to understand the differences. - -## Chapter {#archetypes-chapter} - -To create a Chapter page, run the following commands - -```shell -hugo new --kind chapter /_index.md -``` - -It will create a page with predefined Front-Matter: - -```toml -+++ -chapter = true -pre = "X. " -title = "{{ replace .Name "-" " " | title }}" -weight = 5 -+++ - -### Chapter X - -# Some Chapter title - -Lorem Ipsum. -``` - -## Default - -To create a default page, run either one of the following commands either - -```shell -hugo new //_index.md -``` - -or - -```shell -hugo new /.md -``` - -It will create a page with predefined Front-Matter: - -```toml -+++ -title = "{{ replace .Name "-" " " | title }}" -weight = 5 -+++ - -Lorem Ipsum. -``` diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/archetypes.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/archetypes.pir.md deleted file mode 100644 index 26ef304..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/archetypes.pir.md +++ /dev/null @@ -1,5 +0,0 @@ -+++ -title = "Arrrchetypes" -weight = 10 -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/i18n/_index.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/i18n/_index.en.md deleted file mode 100644 index 727ea1c..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/i18n/_index.en.md +++ /dev/null @@ -1,71 +0,0 @@ -+++ -title = "Multilingual and i18n" -weight = 30 -+++ - -The Relearn theme is fully compatible with Hugo multilingual mode. - -It provides: - -- Translation strings for default values (English, Arabic, Dutch, Piratized English, German, Hindi, Indonesian, Japanese, Piratized English, Portuguese, Russian, Simplified Chinese, Spanish, Turkish). Feel free to contribute! -- Automatic menu generation from multilingual content -- In-browser language switching - -![I18n menu](/cont/i18n/images/i18n-menu.gif) - -## Basic configuration - -After learning [how Hugo handle multilingual websites](https://gohugo.io/content-management/multilingual), define your languages in your `config.toml` file. - -For example with current English and Piratized English website. - -```toml -# English is the default language -defaultContentLanguage = "en" - -[Languages] -[Languages.en] -title = "Documentation for Hugo Relearn Theme" -weight = 1 -languageName = "English" - -[Languages.pir] -title = "Documentat'n fer Cap'n Hugo Relearrrn Theme" -weight = 2 -languageName = "Arrr! Pirrrates" -``` - -Then, for each new page, append the *id* of the language to the file. - -- Single file `my-page.md` is split in two files: - - in English: `my-page.md` - - in Piratized English: `my-page.pir.md` -- Single file `_index.md` is split in two files: - - in English: `_index.md` - - in Piratized English: `_index.pir.md` - -{{% notice info %}} -Be aware that only translated pages are displayed in menu. It's not replaced with default language content. -{{% /notice %}} - -{{% notice tip %}} -Use [slug](https://gohugo.io/content-management/multilingual/#translate-your-content) Front Matter parameter to translate urls too. -{{% /notice %}} - -## Overwrite translation strings - -Translations strings are used for common default values used in the theme (*Edit this page* button, *Search placeholder* and so on). Translations are available in English and Piratized English but you may use another language or want to override default values. - -To override these values, create a new file in your local i18n folder `i18n/.toml` and inspire yourself from the theme `themes/hugo-theme-relearn/i18n/en.toml` - -## Disable language switching - -Switching the language in the browser is a great feature, but for some reasons you may want to disable it. - -Just set `disableLanguageSwitchingButton=true` in your `config.toml` - -```toml -[params] - # When using mulitlingual website, disable the switch language button. - disableLanguageSwitchingButton = true -``` diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/i18n/_index.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/i18n/_index.pir.md deleted file mode 100644 index 9976e08..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/i18n/_index.pir.md +++ /dev/null @@ -1,5 +0,0 @@ -+++ -title = "Multilingual an' i18n" -weight = 30 -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/i18n/images/i18n-menu.gif b/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/i18n/images/i18n-menu.gif deleted file mode 100644 index abf4cd5..0000000 Binary files a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/i18n/images/i18n-menu.gif and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/icons.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/icons.en.md deleted file mode 100644 index a763b2a..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/icons.en.md +++ /dev/null @@ -1,41 +0,0 @@ -+++ -title = "Icons and logos" -weight = 27 -+++ - -The Relearn theme for Hugo loads the [**Font Awesome**](https://fontawesome.com) library, allowing you to easily display any icon or logo available in the Font Awesome free collection. - -## Finding an icon - -Browse through the available icons in the [Font Awesome Gallery](https://fontawesome.com/icons?d=gallery&m=free). Notice that the **free** filter is enabled, as only the free icons are available by default. - -Once on the Font Awesome page for a specific icon, for example the page for the [heart](https://fontawesome.com/icons/heart?style=solid), copy the HTML reference and paste into the Markdown content. - -The HTML to include the heart icon is: - -```html - -``` - -## Including in markdown - -Paste the `` HTML into markup and Font Awesome will load the relevant icon. - -```html -Built with by Relearn and Hugo -``` - -Which appears as - -Built with by Relearn and Hugo - -## Customising icons - -Font Awesome provides many ways to modify the icon - -* Change colour (by default the icon will inherit the parent colour) -* Increase or decrease size -* Rotate -* Combine with other icons - -Check the full documentation on [web fonts with CSS](https://fontawesome.com/how-to-use/web-fonts-with-css) for more. diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/icons.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/icons.pir.md deleted file mode 100644 index dc6dada..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/icons.pir.md +++ /dev/null @@ -1,5 +0,0 @@ -+++ -title = "Ay'cons an' logos" -weight = 27 -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/markdown.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/markdown.en.md deleted file mode 100644 index ac9d588..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/markdown.en.md +++ /dev/null @@ -1,696 +0,0 @@ -+++ -title = "Markdown syntax" -weight = 15 -+++ - -Let's face it: Writing content for the Web is tiresome. WYSIWYG editors help alleviate this task, but they generally result in horrible code, or worse yet, ugly web pages. - -**Markdown** is a better way to write **HTML**, without all the complexities and ugliness that usually accompanies it. - -Some of the key benefits are: - -1. Markdown is simple to learn, with minimal extra characters so it's also quicker to write content. -2. Less chance of errors when writing in Markdown. -3. Produces valid XHTML output. -4. Keeps the content and the visual display separate, so you cannot mess up the look of your site. -5. Write in any text editor or Markdown application you like. -6. Markdown is a joy to use! - -John Gruber, the author of Markdown, puts it like this: - -> The overriding design goal for Markdown’s formatting syntax is to make it as readable as possible. The idea is that a Markdown-formatted document should be publishable as-is, as plain text, without looking like it’s been marked up with tags or formatting instructions. While Markdown’s syntax has been influenced by several existing text-to-HTML filters, the single biggest source of inspiration for Markdown’s syntax is the format of plain text email. -> John Gruber - -Without further delay, let us go over the main elements of Markdown and what the resulting HTML looks like: - -{{% notice info %}} - Bookmark this page and the [official Commonmark reference](https://commonmark.org/help/) for easy future reference! -{{% /notice %}} - -## Headings - -Headings from `h1` through `h6` are constructed with a `#` for each level: - -```markdown -# h1 Heading -## h2 Heading -### h3 Heading -#### h4 Heading -##### h5 Heading -###### h6 Heading -``` - -Renders to: - -# h1 Heading - - -## h2 Heading - -### h3 Heading - -#### h4 Heading - -##### h5 Heading - -###### h6 Heading - -HTML: - -```html -

h1 Heading

-

h2 Heading

-

h3 Heading

-

h4 Heading

-
h5 Heading
-
h6 Heading
-``` - -## Comments - -Comments should be HTML compatible - -```html - -``` - -Comment below should **NOT** be seen: - - - -## Horizontal Rules - -The HTML `
` element is for creating a "thematic break" between paragraph-level elements. In Markdown, you can create a `
` with `---` - three consecutive dashes - -renders to: - ---- - -## Paragraphs - -Any text not starting with a special sign is written as normal, plain text and will be wrapped within `

` tags in the rendered HTML. - -So this body copy: - -```markdown -Lorem ipsum dolor sit amet, graecis denique ei vel, at duo primis mandamus. Et legere ocurreret pri, animal tacimates complectitur ad cum. Cu eum inermis inimicus efficiendi. Labore officiis his ex, soluta officiis concludaturque ei qui, vide sensibus vim ad. -``` - -renders to this HTML: - -```html -

Lorem ipsum dolor sit amet, graecis denique ei vel, at duo primis mandamus. Et legere ocurreret pri, animal tacimates complectitur ad cum. Cu eum inermis inimicus efficiendi. Labore officiis his ex, soluta officiis concludaturque ei qui, vide sensibus vim ad.

-``` - -## Text Markers - -### Bold - -For emphasizing a snippet of text with a heavier font-weight. - -The following snippet of text is **rendered as bold text**. - -```markdown -**rendered as bold text** -``` - -renders to: - - -**rendered as bold text** - - -and this HTML - -```html -rendered as bold text -``` - -### Italics - -For emphasizing a snippet of text with italics. - -The following snippet of text is _rendered as italicized text_. - -```markdown -_rendered as italicized text_ -``` - -renders to: - - -_rendered as italicized text_ - - -and this HTML: - -```html -rendered as italicized text -``` - -### Strikethrough - -In GFM (GitHub flavored Markdown) you can do strikethroughs. - -```markdown -~~Strike through this text.~~ -``` - -Which renders to: - -~~Strike through this text.~~ - -HTML: - -```html -Strike through this text. -``` - -## Blockquotes - -For quoting blocks of content from another source within your document. - -Add `>` before any text you want to quote. - -```markdown -> **Fusion Drive** combines a hard drive with a flash storage (solid-state drive) and presents it as a single logical volume with the space of both drives combined. -``` - -Renders to: - -> **Fusion Drive** combines a hard drive with a flash storage (solid-state drive) and presents it as a single logical volume with the space of both drives combined. - -and this HTML: - -```html -
-

Fusion Drive combines a hard drive with a flash storage (solid-state drive) and presents it as a single logical volume with the space of both drives combined.

-
-``` - -Blockquotes can also be nested: - -```markdown -> Donec massa lacus, ultricies a ullamcorper in, fermentum sed augue. Nunc augue augue, aliquam non hendrerit ac, commodo vel nisi. -> -> > Sed adipiscing elit vitae augue consectetur a gravida nunc vehicula. Donec auctor odio non est accumsan facilisis. Aliquam id turpis in dolor tincidunt mollis ac eu diam. -> -> Mauris sit amet ligula egestas, feugiat metus tincidunt, luctus libero. Donec congue finibus tempor. Vestibulum aliquet sollicitudin erat, ut aliquet purus posuere luctus. -``` - -Renders to: - -> Donec massa lacus, ultricies a ullamcorper in, fermentum sed augue. Nunc augue augue, aliquam non hendrerit ac, commodo vel nisi. -> -> > Sed adipiscing elit vitae augue consectetur a gravida nunc vehicula. Donec auctor odio non est accumsan facilisis. Aliquam id turpis in dolor tincidunt mollis ac eu diam. -> -> Mauris sit amet ligula egestas, feugiat metus tincidunt, luctus libero. Donec congue finibus tempor. Vestibulum aliquet sollicitudin erat, ut aliquet purus posuere luctus. - -## Lists - -### Unordered - -A list of items in which the order of the items does not explicitly matter. - -You may use any of the following symbols to denote bullets for each list item: - -```markdown -* valid bullet -- valid bullet -+ valid bullet -``` - -For example - -```markdown -+ Lorem ipsum dolor sit amet -+ Consectetur adipiscing elit -+ Integer molestie lorem at massa -+ Facilisis in pretium nisl aliquet -+ Nulla volutpat aliquam velit - - Phasellus iaculis neque - - Purus sodales ultricies - - Vestibulum laoreet porttitor sem - - Ac tristique libero volutpat at -+ Faucibus porta lacus fringilla vel -+ Aenean sit amet erat nunc -+ Eget porttitor lorem -``` - -Renders to: - - -+ Lorem ipsum dolor sit amet -+ Consectetur adipiscing elit -+ Integer molestie lorem at massa -+ Facilisis in pretium nisl aliquet -+ Nulla volutpat aliquam velit - - Phasellus iaculis neque - - Purus sodales ultricies - - Vestibulum laoreet porttitor sem - - Ac tristique libero volutpat at -+ Faucibus porta lacus fringilla vel -+ Aenean sit amet erat nunc -+ Eget porttitor lorem - - -And this HTML - -```html -
    -
  • Lorem ipsum dolor sit amet
  • -
  • Consectetur adipiscing elit
  • -
  • Integer molestie lorem at massa
  • -
  • Facilisis in pretium nisl aliquet
  • -
  • Nulla volutpat aliquam velit -
      -
    • Phasellus iaculis neque
    • -
    • Purus sodales ultricies
    • -
    • Vestibulum laoreet porttitor sem
    • -
    • Ac tristique libero volutpat at
    • -
    -
  • -
  • Faucibus porta lacus fringilla vel
  • -
  • Aenean sit amet erat nunc
  • -
  • Eget porttitor lorem
  • -
-``` - -### Ordered - -A list of items in which the order of items does explicitly matter. - -```markdown -1. Lorem ipsum dolor sit amet -4. Consectetur adipiscing elit -2. Integer molestie lorem at massa -8. Facilisis in pretium nisl aliquet -4. Nulla volutpat aliquam velit -99. Faucibus porta lacus fringilla vel -21. Aenean sit amet erat nunc -6. Eget porttitor lorem -``` - -Renders to: - -1. Lorem ipsum dolor sit amet -2. Consectetur adipiscing elit -3. Integer molestie lorem at massa -4. Facilisis in pretium nisl aliquet -5. Nulla volutpat aliquam velit -6. Faucibus porta lacus fringilla vel -7. Aenean sit amet erat nunc -8. Eget porttitor lorem - -And this HTML: - -```html -
    -
  1. Lorem ipsum dolor sit amet
  2. -
  3. Consectetur adipiscing elit
  4. -
  5. Integer molestie lorem at massa
  6. -
  7. Facilisis in pretium nisl aliquet
  8. -
  9. Nulla volutpat aliquam velit
  10. -
  11. Faucibus porta lacus fringilla vel
  12. -
  13. Aenean sit amet erat nunc
  14. -
  15. Eget porttitor lorem
  16. -
-``` - -{{% notice tip %}} -If you just use `1.` for each number, Markdown will automatically number each item. For example: -{{% /notice %}} - -```markdown -1. Lorem ipsum dolor sit amet -1. Consectetur adipiscing elit -1. Integer molestie lorem at massa -1. Facilisis in pretium nisl aliquet -1. Nulla volutpat aliquam velit -1. Faucibus porta lacus fringilla vel -1. Aenean sit amet erat nunc -1. Eget porttitor lorem -``` - -Renders to: - -1. Lorem ipsum dolor sit amet -2. Consectetur adipiscing elit -3. Integer molestie lorem at massa -4. Facilisis in pretium nisl aliquet -5. Nulla volutpat aliquam velit -6. Faucibus porta lacus fringilla vel -7. Aenean sit amet erat nunc -8. Eget porttitor lorem - -## Code - -### Inline code - -Wrap inline snippets of code with `` ` ``. - -```markdown -In this example, `
` should be wrapped as **code**. -``` - -Renders to: - -In this example, `
` should be wrapped as **code**. - -HTML: - -```html -

In this example, <div></div> should be wrapped as code.

-``` - -### Indented code - -Or indent several lines of code by at least two spaces, as in: - -```markdown - // Some comments - line 1 of code - line 2 of code - line 3 of code -``` - -Renders to: - - - // Some comments - line 1 of code - line 2 of code - line 3 of code - - -HTML: - -```html -
-  
-    // Some comments
-    line 1 of code
-    line 2 of code
-    line 3 of code
-  
-
-``` - -### Block code "fences" - -Use "fences" ```` ``` ```` to block in multiple lines of code. - -````plaintext -``` -Sample text here... -``` -```` - -HTML: - -```html -
-  Sample text here...
-
-``` - -### Syntax highlighting - -GFM, or "GitHub Flavored Markdown" also supports syntax highlighting. To activate it, usually you simply add the file extension of the language you want to use directly after the first code "fence", ` ```js `, and syntax highlighting will automatically be applied in the rendered HTML. - -See [Code Highlighting]({{% relref "syntaxhighlight" %}}) for additional documentation. - -For example, to apply syntax highlighting to JavaScript code: - -````plaintext -```js -grunt.initConfig({ - assemble: { - options: { - assets: 'docs/assets', - data: 'src/data/*.{json,yml}', - helpers: 'src/custom-helpers.js', - partials: ['src/partials/**/*.{hbs,md}'] - }, - pages: { - options: { - layout: 'default.hbs' - }, - files: { - './': ['src/templates/pages/index.hbs'] - } - } - } -}; -``` -```` - -Renders to: - -```js -grunt.initConfig({ - assemble: { - options: { - assets: 'docs/assets', - data: 'src/data/*.{json,yml}', - helpers: 'src/custom-helpers.js', - partials: ['src/partials/**/*.{hbs,md}'] - }, - pages: { - options: { - layout: 'default.hbs' - }, - files: { - './': ['src/templates/pages/index.hbs'] - } - } - } -}; -``` - -## Tables - -Tables are created by adding pipes as dividers between each cell, and by adding a line of dashes (also separated by bars) beneath the header. Note that the pipes do not need to be vertically aligned. - -```markdown -| Option | Description | -| ------ | ----------- | -| data | path to data files to supply the data that will be passed into templates. | -| engine | engine to be used for processing templates. Handlebars is the default. | -| ext | extension to be used for dest files. | -``` - -Renders to: - -| Option | Description | -| ------ | ----------- | -| data | path to data files to supply the data that will be passed into templates. | -| engine | engine to be used for processing templates. Handlebars is the default. | -| ext | extension to be used for dest files. | - -And this HTML: - -```html - - - - - - - - - - - - - - - - - -
OptionDescription
datapath to data files to supply the data that will be passed into templates.
engineengine to be used for processing templates. Handlebars is the default.
extextension to be used for dest files.
-``` - -### Right aligned text - -Adding a colon on the right side of the dashes below any heading will right align text for that column. - -```markdown -| Option | Description | -| ------:| -----------:| -| data | path to data files to supply the data that will be passed into templates. | -| engine | engine to be used for processing templates. Handlebars is the default. | -| ext | extension to be used for dest files. | -``` - -| Option | Description | -| ------:| -----------:| -| data | path to data files to supply the data that will be passed into templates. | -| engine | engine to be used for processing templates. Handlebars is the default. | -| ext | extension to be used for dest files. | - -### Two tables adjacent - -| Option | Description | -| ------ | ----------- | -| ext | extension to be used for dest files. | - -| Option | Description | -| ------ | ----------- | -| ext | extension to be used for dest files. | - -## Links - -### Basic link - -```markdown -[Assemble](http://assemble.io) -``` - -Renders to (hover over the link, there is no tooltip): - -[Assemble](http://assemble.io) - -HTML: - -```html -Assemble -``` - -### Add a tooltip - -```markdown -[Upstage](https://github.com/upstage/ "Visit Upstage!") -``` - -Renders to (hover over the link, there should be a tooltip): - -[Upstage](https://github.com/upstage/ "Visit Upstage!") - -HTML: - -```html -Upstage -``` - -### Named Anchors - -Named anchors enable you to jump to the specified anchor point on the same page. For example, each of these chapters: - -```markdown -# Table of Contents - * [Chapter 1](#chapter-1) - * [Chapter 2](#chapter-2) - * [Chapter 3](#chapter-3) -``` - -will jump to these sections: - -```markdown -## Chapter 1 -Content for chapter one. - -## Chapter 2 -Content for chapter one. - -## Chapter 3 -Content for chapter one. -``` -**NOTE** that specific placement of the anchor tag seems to be arbitrary. They are placed inline here since it seems to be unobtrusive, and it works. - -## Images {#images} -Images have a similar syntax to links but include a preceding exclamation point. - -```markdown -![Minion](https://octodex.github.com/images/minion.png) -``` - -![Minion](https://octodex.github.com/images/minion.png) - -or - -```markdown -![Alt text](https://octodex.github.com/images/stormtroopocat.jpg "The Stormtroopocat") -``` - -![Alt text](https://octodex.github.com/images/stormtroopocat.jpg "The Stormtroopocat") - -Like links, Images also have a footnote style syntax - -### Alternative usage : note images - -```markdown -![Alt text][id] -``` - -![Alt text][id] - -With a reference later in the document defining the URL location: - -[id]: https://octodex.github.com/images/dojocat.jpg "The Dojocat" - - [id]: https://octodex.github.com/images/dojocat.jpg "The Dojocat" - -### Further image formatting - -The Hugo Markdown parser supports additional non-standard functionality. - -#### Resizing image - -Add HTTP parameters `width` and/or `height` to the link image to resize the image. Values are CSS values (default is `auto`). - -```markdown -![Minion](https://octodex.github.com/images/minion.png?width=20pc) -``` - -![Minion](https://octodex.github.com/images/minion.png?width=20pc) - -![stormtroopocat](https://octodex.github.com/images/stormtroopocat.png?width=20pc) - -```markdown -![Minion](https://octodex.github.com/images/minion.png?height=50px) -``` - -![Minion](https://octodex.github.com/images/minion.png?height=50px) - -```markdown -![Minion](https://octodex.github.com/images/minion.png?height=50px&width=300px) -``` - -![Minion](https://octodex.github.com/images/minion.png?height=50px&width=300px) - -#### Add CSS classes - -Add a HTTP `classes` parameter to the link image to add CSS classes. `shadow`and `border` are available but you could define other ones. - -```markdown -![stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg?classes=shadow) -``` - -![stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg?width=40pc&classes=shadow) - -```markdown -![stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg?classes=border) -``` - -![stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg?width=40pc&classes=border) - -```markdown -![stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg?classes=border,shadow) -``` - -![stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg?width=40pc&classes=border,shadow) - -#### Lightbox - -Add a HTTP `featherlight` parameter to the link image to disable lightbox. By default lightbox is enabled using the featherlight.js plugin. You can disable this by defining `featherlight` to `false`. - -```markdown -![Minion](https://octodex.github.com/images/minion.png?featherlight=false) -``` - -![Minion](https://octodex.github.com/images/minion.png?featherlight=false) diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/markdown.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/markdown.pir.md deleted file mode 100644 index 64e826d..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/markdown.pir.md +++ /dev/null @@ -1,5 +0,0 @@ -+++ -title = "Marrrkdown rules" -weight = 15 -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/menushortcuts.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/menushortcuts.en.md deleted file mode 100644 index a1ced9b..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/menushortcuts.en.md +++ /dev/null @@ -1,132 +0,0 @@ -+++ -title = "Menu extra shortcuts" -weight = 25 -+++ - -You can define additional menu entries or shortcuts in the navigation menu without any link to content. - -## Basic configuration - -Edit the website configuration `config.toml` and add a `[[menu.shortcuts]]` entry for each link your want to add. - -Example from the current website: - -````toml -[[menu.shortcuts]] -name = " GitHub repo" -identifier = "ds" -url = "https://github.com/McShelby/hugo-theme-relearn" -weight = 10 - -[[menu.shortcuts]] -name = " Showcases" -url = "/showcase/" -weight = 11 - -[[menu.shortcuts]] -name = " Hugo Documentation" -identifier = "hugodoc" -url = "https://gohugo.io/" -weight = 20 - -[[menu.shortcuts]] -name = " Credits" -url = "/credits/" -weight = 30 - -[[menu.shortcuts]] -name = " Tags" -url = "/tags/" -weight = 40 -```` - -By default, shortcuts are preceded by a title. This title can be disabled by setting `disableShortcutsTitle=true`. -However, if you want to keep the title but change its value, it can be overriden by changing your local i18n translation string configuration. - -For example, in your local `i18n/en.toml` file, add the following content - -````toml -[Shortcuts-Title] -other = "" -```` - -Read more about [hugo menu](https://gohugo.io/extras/menus/) and [hugo i18n translation strings](https://gohugo.io/content-management/multilingual/#translation-of-strings) - -## Configuration for Multilingual mode {#i18n} - -When using a multilingual website, you can set different menus for each language. In the `config.toml` file, prefix your menu configuration by `Languages.`. - -Example from the current website: - -````toml -[Languages] - [Languages.en] - title = "Documentation for Hugo Relearn Theme" - weight = 1 - languageName = "English" - landingPageURL = "/" - landingPageName = " Home" - - [[Languages.en.menu.shortcuts]] - name = " GitHub repo" - identifier = "ds" - url = "https://github.com/McShelby/hugo-theme-relearn" - weight = 10 - - [[Languages.en.menu.shortcuts]] - name = " Showcases" - url = "/showcase/" - weight = 11 - - [[Languages.en.menu.shortcuts]] - name = " Hugo Documentation" - identifier = "hugodoc" - url = "https://gohugo.io/" - weight = 20 - - [[Languages.en.menu.shortcuts]] - name = " Credits" - url = "/credits/" - weight = 30 - - [[Languages.en.menu.shortcuts]] - name = " Tags" - url = "/tags/" - weight = 40 - - [Languages.pir] - title = "Documentat'n fer Cap'n Hugo Relearrrn Theme" - weight = 1 - languageName = "Arrr! Pirrrates" - landingPageURL = "/pir/" - landingPageName = " Arrr! Home" - - [[Languages.pir.menu.shortcuts]] - name = " GitHub repo" - identifier = "ds" - url = "https://github.com/McShelby/hugo-theme-relearn" - weight = 10 - - [[Languages.pir.menu.shortcuts]] - name = " Showcases" - url = "/showcase/" - weight = 11 - - [[Languages.pir.menu.shortcuts]] - name = " Cap'n Hugo Documentat'n" - identifier = "hugodoc" - url = "https://gohugo.io/" - weight = 20 - - [[Languages.pir.menu.shortcuts]] - name = " Crrredits" - url = "/credits/" - weight = 30 - - [[Languages.pir.menu.shortcuts]] - name = " Arrr! Tags" - url = "/tags/" - weight = 40 -```` - -Read more about [hugo menu](https://gohugo.io/extras/menus/) and [hugo multilingual menus](https://gohugo.io/content-management/multilingual/#menus) \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/menushortcuts.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/menushortcuts.pir.md deleted file mode 100644 index 0520e5c..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/menushortcuts.pir.md +++ /dev/null @@ -1,5 +0,0 @@ -+++ -title = "Menu extrrra shorrrtcuts" -weight = 25 -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/pages/_index.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/pages/_index.en.md deleted file mode 100644 index b1a161b..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/pages/_index.en.md +++ /dev/null @@ -1,186 +0,0 @@ -+++ -title = "Pages organization" -weight = 5 -+++ - -In **Hugo**, pages are the core of your site. Once it is configured, pages are definitely the added value to your documentation site. - -## Folders - -Organize your site like [any other Hugo project](https://gohugo.io/content/organization/). Typically, you will have a *content* folder with all your pages. - -````plaintext -content -├── level-one -│ ├── level-two -│ │ ├── level-three -│ │ │ ├── level-four -│ │ │ │ ├── _index.md <-- /level-one/level-two/level-three/level-four -│ │ │ │ ├── page-4-a.md <-- /level-one/level-two/level-three/level-four/page-4-a -│ │ │ │ ├── page-4-b.md <-- /level-one/level-two/level-three/level-four/page-4-b -│ │ │ │ └── page-4-c.md <-- /level-one/level-two/level-three/level-four/page-4-c -│ │ │ ├── _index.md <-- /level-one/level-two/level-three -│ │ │ ├── page-3-a.md <-- /level-one/level-two/level-three/page-3-a -│ │ │ ├── page-3-b.md <-- /level-one/level-two/level-three/page-3-b -│ │ │ └── page-3-c.md <-- /level-one/level-two/level-three/page-3-c -│ │ ├── _index.md <-- /level-one/level-two -│ │ ├── page-2-a.md <-- /level-one/level-two/page-2-a -│ │ ├── page-2-b.md <-- /level-one/level-two/page-2-b -│ │ └── page-2-c.md <-- /level-one/level-two/page-2-c -│ ├── _index.md <-- /level-one -│ ├── page-1-a.md <-- /level-one/page-1-a -│ ├── page-1-b.md <-- /level-one/page-1-b -│ └── page-1-c.md <-- /level-one/page-1-c -├── _index.md <-- / -└── page-top.md <-- /page-top -```` - -{{% notice note %}} -`_index.md` is required in each folder, it’s your “folder home page” -{{% /notice %}} - -## Types - -The Relearn theme defines two types of pages. *Default* and *Chapter*. Both can be used at any level of the documentation, the only difference being layout display. - -A **Chapter** displays a page meant to be used as introduction for a set of child pages. Commonly, it contains a simple title and a catch line to define content that can be found under it. -You can define any HTML as prefix for the menu. In the example below, it's just a number but that could be an [icon](https://fortawesome.github.io/Font-Awesome/). - -![Chapter page](/cont/pages/images/pages-chapter.png?width=50pc) - -```markdown -+++ -chapter = true -pre = "1. " -title = "Basics" -weight = 5 -+++ - -### Chapter 1 - -# Basics - -Discover what this Hugo theme is all about and the core-concepts behind it. -``` - -To tell the Relearn theme to consider a page as a chapter, set `chapter=true` in the Front Matter of the page. - -A **Default** page is any other content page. - -![Default page](/cont/pages/images/pages-default.png?width=50pc) - -```toml -+++ -title = "Installation" -weight = 15 -+++ -``` - -The following steps are here to help you initialize your new website. If you don't know Hugo at all, we strongly suggest you to train by following this [great documentation for beginners](https://gohugo.io/overview/quickstart/). - -## Create your project - -Hugo provides a `new` command to create a new website. - -```shell -hugo new site -``` - -The Relearn theme provides [archetypes]({{%relref "cont/archetypes" %}}) to help you create this kind of pages. - -## Front Matter configuration - -Each Hugo page has to define a [Front Matter](https://gohugo.io/content/front-matter/) in *toml*, *yaml* or *json*. This site will use *toml* in all cases. - -The Relearn theme uses the following parameters on top of Hugo ones : - -```toml -+++ -# Table of contents (toc) is enabled by default. Set this parameter to true to disable it. -# Note: Toc is always disabled for chapter pages -disableToc = "false" -# If set, this will be used for the page's menu entry (instead of the `title` attribute) -menuTitle = "" -# If set, this will explicitly override common rules for the expand state of a page's menu entry -alwaysopen = true -# If set, this will explicitly override common rules for the sorting order of a page's submenu entries -ordersectionsby = "title" -# The title of the page in menu will be prefixed by this HTML content -pre = "" -# The title of the page in menu will be postfixed by this HTML content -post = "" -# Set the page as a chapter, changing the way it's displayed -chapter = false -# Hide a menu entry by setting this to true -hidden = false -# Display name of this page modifier. If set, it will be displayed in the footer. -LastModifierDisplayName = "" -# Email of this page modifier. If set with LastModifierDisplayName, it will be displayed in the footer -LastModifierEmail = "" -+++ -``` - -### Add icon to a menu entry - -In the page frontmatter, add a `pre` param to insert any HTML code before the menu label. The example below uses the GitHub icon. - -```toml -+++ -title = "GitHub repo" -pre = " " -+++ -``` - -![Title with icon](/cont/pages/images/frontmatter-icon.png) - -### Ordering sibling menu/page entries - -Hugo provides a [flexible way](https://gohugo.io/content/ordering/) to handle order for your pages. - -The simplest way is to set `weight` parameter to a number. - -```toml -+++ -title = "My page" -weight = 5 -+++ -``` - -### Using a custom title for menu entries - -By default, the Relearn theme will use a page's `title` attribute for the menu item (or `linkTitle` if defined). - -But a page's title has to be descriptive on its own while the menu is a hierarchy. -We've added the `menuTitle` parameter for that purpose: - -For example (for a page named `content/install/linux.md`): - -```toml -+++ -title = "Install on Linux" -menuTitle = "Linux" -+++ -``` - -### Override expand state rules for menu entries - -You can change how the theme expands menu entries on the side of the content with the `alwaysopen` setting on a per page basis. If `alwaysopen=false` for any given entry, its children will not be shown in the menu as long as it is not necessary for the sake of navigation. - -The theme generates the menu based on the following rules: - -- all parent entries of the active page including their siblings are shown regardless of any settings -- immediate children entries of the active page are shown regardless of any settings -- if not overridden, all other first level entries behave like they would have been given `alwaysopen=false` -- if not overridden, all other entries of levels besides the first behave like they would have been given `alwaysopen=true` -- all visible entries show their immediate children entries if `alwaysopen=true`; this proceeds recursivley -- all remaining entries are not shown - -You can see this feature in action on the example page for [children shortcode]({{< relref "shortcodes/children" >}}) and its children pages. - -## Your Page - -To configure your page, you basically have three choices: - -1. Create an `_index.md` document in `content` folder and fill the file with *Markdown content* -2. Create an `index.html` file in the `static` folder and fill the file with *HTML content* -3. Configure your server to automatically redirect home page to one your documentation page diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/pages/_index.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/pages/_index.pir.md deleted file mode 100644 index 718ff7c..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/pages/_index.pir.md +++ /dev/null @@ -1,5 +0,0 @@ -+++ -title = "Planks orrrganizat'n" -weight = 5 -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/pages/images/frontmatter-icon.png b/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/pages/images/frontmatter-icon.png deleted file mode 100644 index d04374e..0000000 Binary files a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/pages/images/frontmatter-icon.png and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/pages/images/pages-chapter.png b/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/pages/images/pages-chapter.png deleted file mode 100644 index 652f37b..0000000 Binary files a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/pages/images/pages-chapter.png and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/pages/images/pages-default.png b/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/pages/images/pages-default.png deleted file mode 100644 index 4ebe549..0000000 Binary files a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/pages/images/pages-default.png and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/syntaxhighlight.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/syntaxhighlight.en.md deleted file mode 100644 index b6db687..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/syntaxhighlight.en.md +++ /dev/null @@ -1,61 +0,0 @@ -+++ -title = "Code highlighting" -weight = 16 -+++ - -The Relearn theme uses [Hugo's built-in syntax highlighting](https://gohugo.io/content-management/syntax-highlighting/) for code. - -## Markdown syntax - -Wrap the code block with three backticks and the name of the language. Highlight will try to auto detect the language if one is not provided. - - -````plaintext -```json -[ - { - "title": "apples", - "count": [12000, 20000], - "description": {"text": "...", "sensitive": false} - }, - { - "title": "oranges", - "count": [17500, null], - "description": {"text": "...", "sensitive": false} - } -] -``` -```` - - -Renders to: - -```json -[ - { - "title": "apples", - "count": [12000, 20000], - "description": {"text": "...", "sensitive": false} - }, - { - "title": "oranges", - "count": [17500, null], - "description": {"text": "...", "sensitive": false} - } -] -``` - -## Supported languages - -Hugo comes with a [remarkable list](https://gohugo.io/content-management/syntax-highlighting/#list-of-chroma-highlighting-languages) of supported languages. - -## Recommended configuration - -You can choose a color theme from the [list of supported themes](https://xyproto.github.io/splash/docs/all.html) and add it in your `config.toml` - -````toml -[markup] - [markup.highlight] - style = "base16-snazzy" # choose a color theme or create your own - guessSyntax = false # if set to true, avoid unstyled code if no language was given but mermaid code fences will not work anymore -```` diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/syntaxhighlight.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/syntaxhighlight.pir.md deleted file mode 100644 index 8abebf9..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/syntaxhighlight.pir.md +++ /dev/null @@ -1,5 +0,0 @@ -+++ -title = "Code highlight'n" -weight = 16 -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/tags.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/tags.en.md deleted file mode 100644 index 2df22e5..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/tags.en.md +++ /dev/null @@ -1,36 +0,0 @@ -+++ -tags = ["documentation", "tutorial"] -title = "Tags" -weight = 40 -+++ - -The Relearn theme supports one default taxonomy of Hugo: the *tag* feature. - -## Configuration - -Just add tags to any page: - -```toml -+++ -tags = ["tutorial", "theme"] -title = "Theme tutorial" -weight = 15 -+++ -``` - -## Behavior - -The tags are displayed at the top of the page, in their insertion order. - -Each tag is a link to a *Taxonomy* page displaying all the articles with the given tag. - -## List all the tags - -In the `config.toml` file you can add a shortcut to display all the tags - -```toml -[[menu.shortcuts]] -name = " Tags" -url = "/tags" -weight = 30 -``` \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/tags.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/tags.pir.md deleted file mode 100644 index 20a7ee0..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/cont/tags.pir.md +++ /dev/null @@ -1,6 +0,0 @@ -+++ -tags = ["documentat'n", "tutorrrial"] -title = "Tags" -weight = 40 -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/credits.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/credits.en.md deleted file mode 100644 index ee500f5..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/credits.en.md +++ /dev/null @@ -1,27 +0,0 @@ -+++ -disableToc = true -title = "Credits" -+++ - -## Contributors - -Special thanks to [everyone who has contributed](https://github.com/McShelby/hugo-theme-relearn/graphs/contributors) to this project. - -Many thanks to [@matcornic](https://github.com/matcornic) for his work on the [Learn theme](https://github.com/matcornic/hugo-theme-learn). - -## Packages and libraries - -* [Mermaid](https://mermaid-js.github.io/mermaid) - generation of diagram and flowchart from text in a similar manner as Markdown -* [font awesome](http://fontawesome.io/) - the iconic font and CSS framework -* [jQuery](https://jquery.com) - The Write Less, Do More, JavaScript Library -* [jquery-svg-zoom-pan](https://github.com/DanielHoffmann/jquery-svg-pan-zoom) - enable pan and zoom in Mermaid graphs -* [lunr](https://lunrjs.com) - Lunr enables you to provide a great search experience without the need for external, server-side, search services... -* [clipboard.js](https://zenorocha.github.io/clipboard.js) - copy text to clipboard -* [modernizr](https://modernizr.com) - A JavaScript toolkit that allows web developers to use new CSS3 and HTML5 features while maintaining a fine level of control over browsers that don't support - -## Tooling - -* [gren](https://github.com/github-tools/github-release-notes) - Releasenotes generator -* [Hugo](https://gohugo.io/) - Static site generator -* [Netlify](https://www.netlify.com) - Continuous deployement and hosting of this documentation -* [Wercker](https://app.wercker.com) - Continous testing diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/credits.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/credits.pir.md deleted file mode 100644 index 3a218c2..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/credits.pir.md +++ /dev/null @@ -1,5 +0,0 @@ -+++ -disableToc = true -title = "Crrredits" -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/INCLUDE_ME.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/INCLUDE_ME.md deleted file mode 100644 index 65e40df..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/INCLUDE_ME.md +++ /dev/null @@ -1,14 +0,0 @@ -You can add: - -- multiple paragraphs -- bullet point lists -- _emphasized_, **bold** and even **_bold emphasized_** text -- [links](https://example.com) -- other shortcodes besides `include` -- etc. - -```plaintext -...and even source code -``` - -> the possiblities are endless diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/_index.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/_index.en.md deleted file mode 100644 index 11fb2bb..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/_index.en.md +++ /dev/null @@ -1,19 +0,0 @@ -+++ -chapter = true -title = "Shortcodes" -weight = 3 -+++ - -### Chapter 3 - -# Shortcodes - -Hugo uses Markdown for its simple content format. However, there are a lot of things that Markdown doesn’t support well. You could use pure HTML to expand possibilities. - -But this happens to be a bad idea. Everyone uses Markdown because it's pure and simple to read even non-rendered. You should avoid HTML to keep it as simple as possible. - -To avoid this limitations, Hugo created [shortcodes](https://gohugo.io/extras/shortcodes/). A shortcode is a simple snippet inside a page. - -The Relearn theme provides multiple shortcodes on top of existing ones. - -{{%children containerstyle="div" style="h2" description="true" %}} diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/_index.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/_index.pir.md deleted file mode 100644 index b427972..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/_index.pir.md +++ /dev/null @@ -1,6 +0,0 @@ -+++ -chapter = true -title = "Shorrrtcodes" -weight = 3 -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/attachments.en.files/BachGavotteShort.mp3 b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/attachments.en.files/BachGavotteShort.mp3 deleted file mode 100644 index 94e3d0e..0000000 Binary files a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/attachments.en.files/BachGavotteShort.mp3 and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/attachments.en.files/Carroll_AliceAuPaysDesMerveilles.pdf b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/attachments.en.files/Carroll_AliceAuPaysDesMerveilles.pdf deleted file mode 100644 index 97377e9..0000000 Binary files a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/attachments.en.files/Carroll_AliceAuPaysDesMerveilles.pdf and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/attachments.en.files/adivorciarsetoca00cape.pdf b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/attachments.en.files/adivorciarsetoca00cape.pdf deleted file mode 100644 index e589c73..0000000 Binary files a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/attachments.en.files/adivorciarsetoca00cape.pdf and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/attachments.en.files/hugo.png b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/attachments.en.files/hugo.png deleted file mode 100644 index 48acf34..0000000 Binary files a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/attachments.en.files/hugo.png and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/attachments.en.files/hugo.txt b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/attachments.en.files/hugo.txt deleted file mode 100644 index 19b69f4..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/attachments.en.files/hugo.txt +++ /dev/null @@ -1 +0,0 @@ -This is a small text \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/attachments.en.files/movieselectricsheep-flock-244-32500-2.mp4 b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/attachments.en.files/movieselectricsheep-flock-244-32500-2.mp4 deleted file mode 100644 index 9f1fe56..0000000 Binary files a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/attachments.en.files/movieselectricsheep-flock-244-32500-2.mp4 and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/attachments.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/attachments.en.md deleted file mode 100644 index 9cb0ac0..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/attachments.en.md +++ /dev/null @@ -1,94 +0,0 @@ -+++ -description = "The Attachments shortcode displays a list of files attached to a page" -title = "Attachments" -+++ - -The Attachments shortcode displays a list of files attached to a page. - -{{% attachments /%}} - -## Usage - -The shortcurt lists files found in a **specific folder**. -Currently, it support two implementations for pages - -1. If your page is a Markdown file, attachements must be placed in a **folder** named like your page and ending with **.files**. - - > * content - > * _index.md - > * page.files - > * attachment.pdf - > * page.md - -2. If your page is a **folder**, attachements must be placed in a nested **'files'** folder. - - > * content - > * _index.md - > * page - > * index.md - > * files - > * attachment.pdf - -Be aware that if you use a multilingual website, you will need to have as many folders as languages. - -That's all! - -### Parameters - -| Parameter | Default | Description | -|:--|:--|:--| -| title | "Attachments" | List's title | -| sort | "asc" | Sorting the output in `asc`ending or `desc`ending order | -| style | "" | Choose between `orange`, `grey`, `blue` and `green` for nice style | -| pattern | ".*" | A regular expressions, used to filter the attachments by file name.

The **pattern** parameter value must be [regular expressions](https://en.wikipedia.org/wiki/Regular_expression). - -For example: - -* To match a file suffix of 'jpg', use **.*jpg** (not *.jpg). -* To match file names ending in 'jpg' or 'png', use **.*(jpg|png)** - -### Examples - -#### List of attachments ending in pdf or mp4 - -````go -{{%/*attachments title="Related files" pattern=".*(pdf|mp4)"/*/%}} -```` - -renders as - -{{%attachments title="Related files" pattern=".*(pdf|mp4)"/%}} - -#### Colored styled box - -````go -{{%/*attachments style="orange" /*/%}} -```` - -renders as - -{{% attachments style="orange" /%}} - -````go -{{%/*attachments style="grey" /*/%}} -```` - -renders as - -{{% attachments style="grey" /%}} - -````go -{{%/*attachments style="blue" /*/%}} -```` - -renders as - -{{% attachments style="blue" /%}} - -````go -{{%/*attachments style="green" /*/%}} -```` - -renders as - -{{% attachments style="green" /%}} diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/attachments.pir.files/NoTreasure.txt b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/attachments.pir.files/NoTreasure.txt deleted file mode 100644 index f7b9fda..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/attachments.pir.files/NoTreasure.txt +++ /dev/null @@ -1 +0,0 @@ -Harrr, nothn' to see herre \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/attachments.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/attachments.pir.md deleted file mode 100644 index da31540..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/attachments.pir.md +++ /dev/null @@ -1,7 +0,0 @@ -+++ -descrption = "Th' Attachments shorrrtcode displays a list o' files attached t' a plank" -title = "Attachments" -+++ -{{% attachments /%}} - -{{< piratify >}} diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/button.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/button.en.md deleted file mode 100644 index b06a298..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/button.en.md +++ /dev/null @@ -1,16 +0,0 @@ -+++ -description = "Nice buttons on your page" -title = "Button" -+++ - -A button is a just a clickable button with optional icon. - -```go -{{%/* button href="https://gohugo.io/" */%}}Get Hugo{{%/* /button */%}} -{{%/* button href="https://gohugo.io/" icon="fas fa-download" */%}}Get Hugo with icon{{%/* /button */%}} -{{%/* button href="https://gohugo.io/" icon="fas fa-download" icon-position="right" */%}}Get Hugo with icon right{{%/* /button */%}} -``` - -{{% button href="https://gohugo.io/" %}}Get Hugo{{% /button %}} -{{% button href="https://gohugo.io/" icon="fas fa-download" %}}Get Hugo with icon{{% /button %}} -{{% button href="https://gohugo.io/" icon="fas fa-download" icon-position="right" %}}Get Hugo with icon right{{% /button %}} diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/button.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/button.pir.md deleted file mode 100644 index 3bd0149..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/button.pir.md +++ /dev/null @@ -1,5 +0,0 @@ -+++ -descrption = "Nice buttons on yer plank" -title = "Button" -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/_index.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/_index.en.md deleted file mode 100644 index b941079..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/_index.en.md +++ /dev/null @@ -1,51 +0,0 @@ -+++ -alwaysopen = false -description = "List the child pages of a page" -title = "Children" -+++ - -Use the children shortcode to list the child pages of a page and the further descendants (children's children). By default, the shortcode displays links to the child pages. - -## Usage - -| Parameter | Default | Description | -|:--|:--|:--| -| page | _current_ | Specify the page name (section name) to display children for | -| containerstyle | "ul" | Choose the style used to group all children. It could be any HTML tag name | -| style | "li" | Choose the style used to display each descendant. It could be any HTML tag name | -| showhidden | "false" | When true, child pages hidden from the menu will be displayed | -| description | "false" | Allows you to include a short text under each page in the list. When no description exists for the page, children shortcode takes the first 70 words of your content. [Read more info about summaries on gohugo.io](https://gohugo.io/content/summaries/) | -| depth | 1 | Enter a number to specify the depth of descendants to display. For example, if the value is 2, the shortcode will display 2 levels of child pages. **Tips:** set 999 to get all descendants | -| sort | [ordersectionsby]({{% relref "basics/configuration#global-site-parameters" %}}) | Sort children by **weight**, to sort on menu order - **title**, to sort alphabetically on menu label. If not set it is sorted by the `ordersectionsby` setting of the site and the pages frontmatter | - -## Demo - -````go -{{%/* children */%}} -```` - -{{% children %}} - -````go -{{%/* children description="true" */%}} -```` - -{{%children description="true" %}} - -````go -{{%/* children depth="999" showhidden="true" */%}} -```` - -{{% children depth="999" showhidden="true" %}} - -````go -{{%/* children containerstyle="div" style="h2" depth="3" description="true" */%}} -```` - -{{% children containerstyle="div" style="h2" depth="3" description="true" %}} - -````go -{{%/* children containerstyle="div" style="div" depth="999" */%}} -```` - -{{% children containerstyle="div" style="div" depth="999" %}} diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/_index.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/_index.pir.md deleted file mode 100644 index fe8f598..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/_index.pir.md +++ /dev/null @@ -1,6 +0,0 @@ -+++ -alwaysopen = false -descrption = "List th' child planks on a plank" -title = "Children" -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/_index.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/_index.en.md deleted file mode 100644 index 83b2f9d..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/_index.en.md +++ /dev/null @@ -1,13 +0,0 @@ -+++ -alwaysopen = false -description = "This is a demo child page" -tags = ["children", "non-hidden"] -title = "page 1" -weight = 10 -+++ - -This is a demo child page. - -## Subpages of this page - -{{% children showhidden="true" %}} diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/_index.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/_index.pir.md deleted file mode 100644 index 76b5a01..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/_index.pir.md +++ /dev/null @@ -1,8 +0,0 @@ -+++ -alwaysopen = false -descrption = "This be a demo child plank" -tags = ["children", "non-hidden"] -title = "Plank 1" -weight = 10 -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/_index.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/_index.en.md deleted file mode 100644 index 4009c71..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/_index.en.md +++ /dev/null @@ -1,12 +0,0 @@ -+++ -alwaysopen = false -description = "This is a demo child page" -tags = ["children", "non-hidden"] -title = "page 1-1" -+++ - -This is a demo child page with a hidden child. You can still access the hidden child [directly]({{% relref "shortcodes/children/children-1/children-1-1/children-1-1-1" %}}) or via the search. - -## Subpages of this page - -{{% children showhidden="true" %}} diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/_index.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/_index.pir.md deleted file mode 100644 index 761f398..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/_index.pir.md +++ /dev/null @@ -1,7 +0,0 @@ -+++ -alwaysopen = false -descrption = "This be a demo child plank" -tags = ["children", "non-hidden"] -title = "Plank 1-1" -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/_index.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/_index.en.md deleted file mode 100644 index 506a115..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/_index.en.md +++ /dev/null @@ -1,12 +0,0 @@ -+++ -description = "This is a hidden demo child page" -hidden = true -tags = ["children", "hidden"] -title = "page 1-1-1 (hidden)" -+++ - -This is a **hidden** demo child page. This page and all its children are hidden in the menu, arrow navigation and children shortcode as long as you aren't viewing this page or its children directly. - -## Subpages of this page - -{{% children showhidden="true" %}} diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/_index.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/_index.pir.md deleted file mode 100644 index 17761c4..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/_index.pir.md +++ /dev/null @@ -1,7 +0,0 @@ -+++ -descrption = "This be a hidden demo child plank" -hidden = true -tags = ["children", "hidden"] -title = "Plank 1-1-1 (hidden)" -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/_index.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/_index.en.md deleted file mode 100644 index d5667ff..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/_index.en.md +++ /dev/null @@ -1,11 +0,0 @@ -+++ -description = "This is a non-hidden demo child page of a hidden parent page" -tags = ["children", "hidden"] -title = "page 1-1-1-1" -+++ - -This is a **non-hidden** demo child page of a hidden parent page with a hidden child. You can still access the hidden child [directly]({{% relref "shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/children-1-1-1-1-1" %}}) or via the search. - -## Subpages of this page - -{{% children showhidden="true" %}} diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/_index.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/_index.pir.md deleted file mode 100644 index 45e61de..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/_index.pir.md +++ /dev/null @@ -1,6 +0,0 @@ -+++ -descrption = "This be a non-hidden demo child plank o' a hidden parrrent plank" -tags = ["children", "hidden"] -title = "Plank 1-1-1-1" -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/children-1-1-1-1-1/_index.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/children-1-1-1-1-1/_index.en.md deleted file mode 100644 index a1581a6..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/children-1-1-1-1-1/_index.en.md +++ /dev/null @@ -1,12 +0,0 @@ -+++ -description = "This is a hidden demo child page" -hidden = true -tags = ["children", "hidden"] -title = "page 1-1-1-1-1 (hidden)" -+++ - -This is a **hidden** demo child page. This page and all its children are hidden in the menu, arrow navigation and children shortcode as long as you aren't viewing this page or its children directly. - -## Subpages of this page - -{{% children showhidden="true" %}} diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/children-1-1-1-1-1/_index.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/children-1-1-1-1-1/_index.pir.md deleted file mode 100644 index 3b31af1..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/children-1-1-1-1-1/_index.pir.md +++ /dev/null @@ -1,7 +0,0 @@ -+++ -descrption = "This be a hidden demo child plank" -hidden = true -tags = ["children", "hidden"] -title = "Plank 1-1-1-1-1 (hidden)" -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/children-1-1-1-1-1/children-1-1-1-1-1-1/_index.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/children-1-1-1-1-1/children-1-1-1-1-1-1/_index.en.md deleted file mode 100644 index f26d411..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/children-1-1-1-1-1/children-1-1-1-1-1-1/_index.en.md +++ /dev/null @@ -1,7 +0,0 @@ -+++ -description = "This is a non-hidden demo child page of a hidden parent page" -tags = ["children", "hidden"] -title = "page 1-1-1-1-1-1" -+++ - -This is a **non-hidden** demo child page of a hidden parent page. \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/children-1-1-1-1-1/children-1-1-1-1-1-1/_index.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/children-1-1-1-1-1/children-1-1-1-1-1-1/_index.pir.md deleted file mode 100644 index 54d6e56..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-1/children-1-1-1-1/children-1-1-1-1-1/children-1-1-1-1-1-1/_index.pir.md +++ /dev/null @@ -1,6 +0,0 @@ -+++ -descrption = "This be a non-hidden demo child plank on a hidden parrrent plank" -tags = ["children", "hidden"] -title = "Plank 1-1-1-1-1-1" -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-2/_index.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-2/_index.en.md deleted file mode 100644 index 85adae8..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-2/_index.en.md +++ /dev/null @@ -1,11 +0,0 @@ -+++ -description = "This is a demo child page" -tags = ["children", "non-hidden"] -title = "page 1-1-2" -+++ - -This is a plain demo child page. - -## Subpages of this page - -{{% children showhidden="true" %}} diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-2/_index.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-2/_index.pir.md deleted file mode 100644 index 60e299b..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-2/_index.pir.md +++ /dev/null @@ -1,6 +0,0 @@ -+++ -descrption = "This be a demo child plank" -tags = ["children", "non-hidden"] -title = "Plank 1-1-2" -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-2/children-1-1-2-1/_index.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-2/children-1-1-2-1/_index.en.md deleted file mode 100644 index 74e144d..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-2/children-1-1-2-1/_index.en.md +++ /dev/null @@ -1,7 +0,0 @@ -+++ -description = "This is a demo child page" -tags = ["children", "non-hidden"] -title = "page 1-1-2-1" -+++ - -This is a plain demo child page. diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-2/children-1-1-2-1/_index.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-2/children-1-1-2-1/_index.pir.md deleted file mode 100644 index 5af0f33..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-2/children-1-1-2-1/_index.pir.md +++ /dev/null @@ -1,6 +0,0 @@ -+++ -descrption = "This be a demo child plank" -tags = ["children", "non-hidden"] -title = "Plank 1-1-2-1" -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-2/children-1-1-2-2/_index.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-2/children-1-1-2-2/_index.en.md deleted file mode 100644 index 41f730e..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-2/children-1-1-2-2/_index.en.md +++ /dev/null @@ -1,7 +0,0 @@ -+++ -description = "This is a demo child page" -tags = ["children", "non-hidden"] -title = "page 1-1-2-2" -+++ - -This is a plain demo child page. diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-2/children-1-1-2-2/_index.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-2/children-1-1-2-2/_index.pir.md deleted file mode 100644 index 110c1e9..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-2/children-1-1-2-2/_index.pir.md +++ /dev/null @@ -1,6 +0,0 @@ -+++ -descrption = "This be a demo child plank" -tags = ["children", "non-hidden"] -title = "Plank 1-1-2-2" -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-3/_index.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-3/_index.en.md deleted file mode 100644 index df89045..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-3/_index.en.md +++ /dev/null @@ -1,7 +0,0 @@ -+++ -description = "This is a demo child page" -tags = ["children", "non-hidden"] -title = "page 1-1-3" -+++ - -This is a plain demo child page. diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-3/_index.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-3/_index.pir.md deleted file mode 100644 index c5657c2..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-1/children-1-1/children-1-1-3/_index.pir.md +++ /dev/null @@ -1,6 +0,0 @@ -+++ -descrption = "This be a demo child plank" -tags = ["children", "non-hidden"] -title = "Plank 1-1-3" -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-2/_index.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-2/_index.en.md deleted file mode 100644 index 7324027..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-2/_index.en.md +++ /dev/null @@ -1,10 +0,0 @@ -+++ -alwaysopen = false -tags = ["children", "non-hidden"] -title = "page 2" -weight = 20 -+++ - -This is a demo child page with no description. - -So its content is used as description. diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-2/_index.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-2/_index.pir.md deleted file mode 100644 index a715a73..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-2/_index.pir.md +++ /dev/null @@ -1,7 +0,0 @@ -+++ -alwaysopen = false -tags = ["children", "non-hidden"] -title = "Plank 2" -weight = 20 -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-3/_index.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-3/_index.en.md deleted file mode 100644 index 71b022b..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-3/_index.en.md +++ /dev/null @@ -1,13 +0,0 @@ -+++ -alwaysopen = false -description = "This is a demo child page" -tags = ["children", "non-hidden"] -title = "page 3" -weight = 30 -+++ - -This is a demo child page. - -## Subpages of this page - -{{% children showhidden="true" %}} diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-3/_index.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-3/_index.pir.md deleted file mode 100644 index 34f466f..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-3/_index.pir.md +++ /dev/null @@ -1,8 +0,0 @@ -+++ -alwaysopen = false -descrption = "This be a demo child plank" -tags = ["children", "non-hidden"] -title = "Plank 3" -weight = 30 -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-3/test3.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-3/test3.en.md deleted file mode 100644 index c8cf6d9..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-3/test3.en.md +++ /dev/null @@ -1,7 +0,0 @@ -+++ -description = "This is a plain page test nested in a parent" -tags = ["children", "non-hidden"] -title = "page 3-1" -+++ - -This is a plain demo child page. diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-3/test3.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-3/test3.pir.md deleted file mode 100644 index 853f818..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-3/test3.pir.md +++ /dev/null @@ -1,6 +0,0 @@ -+++ -descrption = "This be a plain plank test nested 'n a parrrent" -tags = ["children", "non-hidden"] -title = "Plank 3-1" -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-4/_index.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-4/_index.en.md deleted file mode 100644 index 96358d0..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-4/_index.en.md +++ /dev/null @@ -1,10 +0,0 @@ -+++ -alwaysopen = false -description = "This is a hidden demo child page" -hidden = true -tags = ["children", "hidden"] -title = "page 4 (hidden)" -weight = 40 -+++ - -This is a **hidden** demo child page. This page and all its children are hidden in the menu, arrow navigation and children shortcode as long as you aren't viewing this page or its children directly. diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-4/_index.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-4/_index.pir.md deleted file mode 100644 index 94b3c77..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/children-4/_index.pir.md +++ /dev/null @@ -1,9 +0,0 @@ -+++ -alwaysopen = false -descrption = "This be a hidden demo child plank" -hidden = true -tags = ["children", "hidden"] -title = "Plank 4 (hidden)" -weight = 40 -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/test.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/test.en.md deleted file mode 100644 index 24d308c..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/test.en.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -description: | - This is a plain page test, and the beginning of a YAML multiline description... -title: "page X" -weight: 1 ---- - -This is a plain demo child page. diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/test.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/test.pir.md deleted file mode 100644 index a948582..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/children/test.pir.md +++ /dev/null @@ -1,6 +0,0 @@ -+++ -descrption = "This be a plain plank test" -title = "Plank X" -weight = 1 -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/expand.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/expand.en.md deleted file mode 100644 index 4d991c5..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/expand.en.md +++ /dev/null @@ -1,95 +0,0 @@ -+++ -description = "Displays an expandable/collapsible section of text on your page" -title = "Expand" -+++ - -The Expand shortcode displays an expandable/collapsible section of text on your page. - -## Usage - -````go -{{%/* expand [ [ "true" | "false" ] ] */%}} -Yes! -{{%/* /expand */%}} -```` - -The first optional parameter defines the text that appears next to the expand/collapse icon. The default text is `"Expand me..."`. - -The second optional parameter controls if the block is initially shown as expanded (`"true"`) or collapsed (`"false"`). The default ist `"false"`. -## Examples - -{{% expand "I'll tell you a secret..." %}} -...maybe the next time you'll open this expander! -{{% /expand %}} - -### All defaults - -{{% expand %}} -Yes, you did it! -{{% /expand %}} - -{{% expand "Show markup" "true" %}} -````go -{{%/* expand */%}} -Yes, you did it! -{{%/* /expand */%}} -```` -{{% /expand %}} - -### Initially expanded - -{{% expand "Expand me..." "true" %}} -No need to press you! -{{% /expand %}} - -{{% expand "Show markup" "true" %}} -````go -{{%/* expand "Expand me..." "true" */%}} -No need to press you! -{{%/* /expand */%}} -```` -{{% /expand %}} - -### Arbitrary text - -{{% expand "Show me endless possibilities" %}} -Some expandable text. - -You can add: - -- multiple paragraphs -- bullet point lists -- _emphasized_, **bold** and even **_bold emphasized_** text -- [links](https://example.com) -- other shortcodes besides `expand` -- etc. - -```plaintext -...and even source code -``` - -> the possiblities are endless -{{% /expand %}} - -{{% expand "Show markup" %}} -````go -{{%/* expand "Show me endless possibilities" */%}} -Some expandable text. - -You can add: - -- multiple paragraphs -- bullet point lists -- _emphasized_, **bold** and even **_bold emphasized_** text -- [links](https://example.com) -- other shortcodes besides `expand` -- etc. - -```plaintext -...and even source code -``` - -> the possiblities are endless -{{%/* /expand */%}} -```` -{{% /expand %}} diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/expand.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/expand.pir.md deleted file mode 100644 index b86a1a7..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/expand.pir.md +++ /dev/null @@ -1,5 +0,0 @@ -+++ -descrption = "Displays an expand'ble/collaps'ble sect'n o' text on yer plank" -title = "Expand" -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/include.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/include.en.md deleted file mode 100644 index f39a109..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/include.en.md +++ /dev/null @@ -1,28 +0,0 @@ -+++ -description = "Displays content from other Markdown files" -title = "Include" -+++ - -The include shortcode includes other files from your project inside of the current file. This can even contain Markdown and will be taken into account when generating the table of contents. - -## Usage - -````go -{{%/* include [ "true" | "false" ] */%}} -```` - -The first required parameter is the path to the file to be included. - -If the file's content will be displayed as HTML, the second optional parameter controls if the first heading of the included file should be displayed (`"true"`)- which is the default - or be hidden. - -## Examples - -### Arbitray content - -{{% include "shortcodes/INCLUDE_ME.md" %}} - -{{% expand "Show markup" %}} -````go -{{%/* include "shortcodes/INCLUDE_ME.md" */%}} -```` -{{% /expand %}} diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/include.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/include.pir.md deleted file mode 100644 index 8782676..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/include.pir.md +++ /dev/null @@ -1,5 +0,0 @@ -+++ -descrption = "Displays content from other Marrrkdown files" -title = "Include" -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/mermaid.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/mermaid.en.md deleted file mode 100644 index 55ee672..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/mermaid.en.md +++ /dev/null @@ -1,226 +0,0 @@ -+++ -description = "Generation of diagram and flowchart from text in a similar manner as Markdown" -title = "Mermaid" -+++ - -[Mermaid](https://mermaidjs.github.io/) is a library helping you to generate diagram and flowcharts from text, in a similar manner as Markdown. - -## Usage - -Just insert your Mermaid code in the `mermaid` shortcode like this: - -````go -{{}} -classDiagram - Person *-- Dog -{{}} -```` - -You can set an optional `align` attribute which defaults to `"center"`. - -If you don't need alignment you can use the alternative syntax using code fences if you have turned off `guessSyntax` for the `markup.highlight` setting (see below): - -````plaintext -```mermaid -classDiagram - Person *-- Dog -``` -```` - -The generated graphs can be be panned by dragging them and zoomed by using the mousewheel. On mobile devices you can use finger gestures. - -## Examples - -### Flowchart - -{{< mermaid align="left" >}} -graph LR; - A[Hard edge] -->|Link text| B(Round edge) - B --> C{Decision} - C -->|One| D[Result one] - C -->|Two| E[Result two] -{{< /mermaid >}} - -{{% expand "Show markup" "true" %}} -````go -{{}} -graph LR; - A[Hard edge] -->|Link text| B(Round edge) - B --> C{Decision} - C -->|One| D[Result one] - C -->|Two| E[Result two] -{{}} -```` -{{% /expand %}} - -### Sequence - -{{< mermaid >}} -sequenceDiagram - participant Alice - participant Bob - Alice->>John: Hello John, how are you? - loop Healthcheck - John->John: Fight against hypochondria - end - Note right of John: Rational thoughts
prevail... - John-->Alice: Great! - John->Bob: How about you? - Bob-->John: Jolly good! -{{< /mermaid >}} - -{{% expand "Show markup" "true" %}} -````go -{{}} -sequenceDiagram - participant Alice - participant Bob - Alice->>John: Hello John, how are you? - loop Healthcheck - John->John: Fight against hypochondria - end - Note right of John: Rational thoughts
prevail... - John-->Alice: Great! - John->Bob: How about you? - Bob-->John: Jolly good! -{{}} -```` -{{% /expand %}} - -### GANTT - -{{< mermaid >}} -gantt - dateFormat YYYY-MM-DD - title Adding GANTT diagram functionality to Mermaid - section A section - Completed task :done, des1, 2014-01-06,2014-01-08 - Active task :active, des2, 2014-01-09, 3d - Future task : des3, after des2, 5d - Future task2 : des4, after des3, 5d - section Critical tasks - Completed task in the critical line :crit, done, 2014-01-06,24h - Implement parser and jison :crit, done, after des1, 2d - Create tests for parser :crit, active, 3d - Future task in critical line :crit, 5d - Create tests for renderer :2d - Add to Mermaid :1d -{{< /mermaid >}} - -{{% expand "Show markup" "true" %}} -````go -{{}} -gantt - dateFormat YYYY-MM-DD - title Adding GANTT diagram functionality to Mermaid - section A section - Completed task :done, des1, 2014-01-06,2014-01-08 - Active task :active, des2, 2014-01-09, 3d - Future task : des3, after des2, 5d - Future task2 : des4, after des3, 5d - section Critical tasks - Completed task in the critical line :crit, done, 2014-01-06,24h - Implement parser and jison :crit, done, after des1, 2d - Create tests for parser :crit, active, 3d - Future task in critical line :crit, 5d - Create tests for renderer :2d - Add to Mermaid :1d -{{}} -```` -{{% /expand %}} - -### Class - -{{< mermaid >}} -classDiagram - Class01 <|-- AveryLongClass : Cool - Class03 *-- Class04 - Class05 o-- Class06 - Class07 .. Class08 - Class09 --> C2 : Where am i? - Class09 --* C3 - Class09 --|> Class07 - Class07 : equals() - Class07 : Object[] elementData - Class01 : size() - Class01 : int chimp - Class01 : int gorilla - Class08 <--> C2: Cool label -{{< /mermaid >}} - -{{% expand "Show markup" "true" %}} -````go -{{}} -classDiagram - Class01 <|-- AveryLongClass : Cool - Class03 *-- Class04 - Class05 o-- Class06 - Class07 .. Class08 - Class09 --> C2 : Where am i? - Class09 --* C3 - Class09 --|> Class07 - Class07 : equals() - Class07 : Object[] elementData - Class01 : size() - Class01 : int chimp - Class01 : int gorilla - Class08 <--> C2: Cool label -{{}} -```` -{{% /expand %}} - -### State - -````mermaid -stateDiagram-v2 - open: Open Door - closed: Closed Door - locked: Locked Door - open --> closed: Close - closed --> locked: Lock - locked --> closed: Unlock - closed --> open: Open -```` - -{{% expand "Show markup" "true" %}} -````go -```mermaid -stateDiagram-v2 - open: Open Door - closed: Closed Door - locked: Locked Door - open --> closed: Close - closed --> locked: Lock - locked --> closed: Unlock - closed --> open: Open -``` -```` -{{% /expand %}} - -## Configuration - -Mermaid is configured with default settings. You can customize Mermaid's default settings for all of your files thru a JSON object in your `config.toml` or override these settings sidewise thru your pages frontmatter. - -This JSON object is forwarded into Mermaid's `mermaid.initialize()` function. - -See [Mermaid documentation](http://mermaid-js.github.io/mermaid/getting-started/Setup.html#mermaidapi-configuration-defaults) for all allowed settings. - -Also, if you want to use mermaid codefences, you have to turn off `guessSyntax` for the `markup.highlight` setting. - -### Example - -````toml -[params] - mermaidInitialize = "{ \"theme\": \"dark\" }" - -[markup] - [markup.highlight] - guessSyntax = false # if set to true, avoid unstyled code if no language was given but mermaid code fences will not work anymore -```` - -or pages frontmatter -````toml -+++ -mermaidInitialize = "{ \"theme\": \"dark\" }" -+++ -```` diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/mermaid.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/mermaid.pir.md deleted file mode 100644 index 5f20eab..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/mermaid.pir.md +++ /dev/null @@ -1,5 +0,0 @@ -+++ -descrption = "Generrrat'n o' diagrrram an' flowcharrrt frrrom text 'n a similar manner as Marrrkdown" -title = "Merrrmaid" -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/notice.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/notice.en.md deleted file mode 100644 index 2bdcc23..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/notice.en.md +++ /dev/null @@ -1,212 +0,0 @@ -+++ -description = "Disclaimers to help you structure your page" -title = "Notice" -+++ - -The notice shortcode shows four types of disclaimers to help you structure your page. - -## Usage - -````go -{{%/* notice ( note | info | tip | warning ) [ ] */%}} -Some markup -{{%/* /notice */%}} -```` - -The first parameter is required and indicates the type of notice. - -The second parameter is optional. If provided, it will be used as the title of the notice. If not provided, then the type of notice will be used as the title. For example, the title of a warning notice will be "Warning". - -## Examples - -### Note - -{{% notice note %}} -A **notice** disclaimer - -You can add: - -- multiple paragraphs -- bullet point lists -- _emphasized_, **bold** and even ***bold emphasized*** text -- [links](https://example.com) -- other shortcodes besides `notice` -- etc. - -```plaintext -...and even source code -``` - -> the possiblities are endless -{{% /notice %}} - -{{% expand "Show markup" %}} -````go -{{%/* notice note */%}} -A **notice** disclaimer - -You can add: - -- multiple paragraphs -- bullet point lists -- _emphasized_, **bold** and even ***bold emphasized*** text -- [links](https://example.com) -- other shortcodes besides `notice` -- etc. - -```plaintext -...and even source code -``` - -> the possiblities are endless -{{%/* /notice */%}} -```` -{{% /expand %}} - -### Info - -{{% notice info %}} -An **information** disclaimer - -You can add: - -- multiple paragraphs -- bullet point lists -- _emphasized_, **bold** and even ***bold emphasized*** text -- [links](https://example.com) -- other shortcodes besides `notice` -- etc. - -```plaintext -...and even source code -``` - -> the possiblities are endless -{{% /notice %}} - -{{% expand "Show markup" %}} -````go -{{%/* notice info */%}} -An **information** disclaimer - -You can add: - -- multiple paragraphs -- bullet point lists -- _emphasized_, **bold** and even ***bold emphasized*** text -- [links](https://example.com) -- other shortcodes besides `notice` -- etc. - -```plaintext -...and even source code -``` - -> the possiblities are endless -{{%/* /notice */%}} -```` -{{% /expand %}} - -### Tip - -{{% notice tip %}} -A **tip** disclaimer - -You can add: - -- multiple paragraphs -- bullet point lists -- _emphasized_, **bold** and even ***bold emphasized*** text -- [links](https://example.com) -- other shortcodes besides `notice` -- etc. - -```plaintext -...and even source code -``` - -> the possiblities are endless -{{% /notice %}} - -{{% expand "Show markup" %}} -````go -{{%/* notice tip */%}} -A **tip** disclaimer - -You can add: - -- multiple paragraphs -- bullet point lists -- _emphasized_, **bold** and even ***bold emphasized*** text -- [links](https://example.com) -- other shortcodes besides `notice` -- etc. - -```plaintext -...and even source code -``` - -> the possiblities are endless -{{%/* /notice */%}} -```` -{{% /expand %}} - -### Warning - -{{% notice warning %}} -A **warning** disclaimer - -You can add: - -- multiple paragraphs -- bullet point lists -- _emphasized_, **bold** and even ***bold emphasized*** text -- [links](https://example.com) -- other shortcodes besides `notice` -- etc. - -```plaintext -...and even source code -``` - -> the possiblities are endless -{{% /notice %}} - -{{% expand "Show markup" %}} -````go -{{%/* notice warning */%}} -A **warning** disclaimer - -You can add: - -- multiple paragraphs -- bullet point lists -- _emphasized_, **bold** and even ***bold emphasized*** text -- [links](https://example.com) -- other shortcodes besides `notice` -- etc. - -```plaintext -...and even source code -``` - -> the possiblities are endless -{{%/* /notice */%}} -```` -{{% /expand %}} - -### Notice with Custom Title - -You can customize the title of the notice by passing it as a second parameter. - -{{% notice note "Pay Attention to this Note!" %}} -The title is now the parameter that was provided. -{{% /notice %}} - -{{% expand "Show markup" %}} -````go -{{%/* notice note "Pay Attention to this Note!" */%}} -The title is now the parameter that was provided. -{{%/* /notice */%}} -```` -{{% /expand %}} diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/notice.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/notice.pir.md deleted file mode 100644 index 98c1c43..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/notice.pir.md +++ /dev/null @@ -1,5 +0,0 @@ -+++ -descrption = "Disclaimerrrs t' help ye strrructurrre yer plank" -title = "Notice" -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/siteparam.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/siteparam.en.md deleted file mode 100644 index 5445d2f..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/siteparam.en.md +++ /dev/null @@ -1,33 +0,0 @@ -+++ -description = "Get value of site params variables in your page" -title = "Site param" -+++ - -The `siteparam` shortcode is used to help you print values of site params. - -## Usage - -````go -{{%/* siteparam */%}} -```` - -The first required parameter is the name of the site param to be displayed. - -## Examples - -For instance, in this current site, the `editURL` variable is used in `config.toml` - -```toml -[params] - editURL = "https://github.com/McShelby/hugo-theme-relearn/edit/main/exampleSite/content/" -``` - -Use the `siteparam` shortcode to display its value. - -```go -`editURL` Value : {{%/* siteparam "editURL" */%}} -``` - -is displayed as - -`editURL` Value : {{% siteparam "editURL" %}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/siteparam.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/siteparam.pir.md deleted file mode 100644 index 084146b..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/siteparam.pir.md +++ /dev/null @@ -1,5 +0,0 @@ -+++ -descrption = "Get value o' ship parrrams varrriables 'n yer plank" -title = "Ship param" -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/tabs.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/tabs.en.md deleted file mode 100644 index 34d8c46..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/tabs.en.md +++ /dev/null @@ -1,123 +0,0 @@ -+++ -description = "Synchronize selection of content in different tabbed views" -title = "Tabbed views" -+++ - -Choose which content to see across the page. Very handy for providing code -snippets for multiple languages or providing configuration in different formats. - -## Code example - -````go -{{}} -{{%/* tab name="python" */%}} -```python -print("Hello World!") -``` -{{%/* /tab */%}} -{{%/* tab name="R" */%}} -```R -> print("Hello World!") -``` -{{%/* /tab */%}} -{{%/* tab name="Bash" */%}} -```Bash -echo "Hello World!" -``` -{{%/* /tab */%}} -{{}} -```` - -Renders as: - -{{< tabs >}} -{{% tab name="python" %}} -```python -print("Hello World!") -``` -{{% /tab %}} -{{% tab name="R" %}} -```R -> print("Hello World!") -``` -{{% /tab %}} -{{% tab name="Bash" %}} -```Bash -echo "Hello World!" -``` -{{% /tab %}} -{{< /tabs >}} - -Tab views with the same tabs that belong to the same group sychronize their selection: - -{{< tabs >}} -{{% tab name="python" %}} -```python -print("Hello World!") -``` -{{% /tab %}} -{{% tab name="R" %}} -```R -> print("Hello World!") -``` -{{% /tab %}} -{{% tab name="Bash" %}} -```Bash -echo "Hello World!" -``` -{{% /tab %}} -{{< /tabs >}} - -## Config example - -````go -{{}} -{{%/* tab name="json" */%}} -```json -{ - "Hello": "World" -} -``` -{{%/* /tab */%}} -{{%/* tab name="XML" */%}} -```xml -World -``` -{{%/* /tab */%}} -{{%/* tab name="properties" */%}} -```properties -Hello = World -``` -{{%/* /tab */%}} -{{}} -```` - -Renders as: - -{{< tabs groupId="config" >}} -{{% tab name="json" %}} -```json -{ - "Hello": "World" -} -``` -{{% /tab %}} -{{% tab name="XML" %}} -```xml -World -``` -{{% /tab %}} -{{% tab name="properties" %}} -```ini -Hello = World -``` -{{% /tab %}} -{{< /tabs >}} - -{{% notice warning %}} -When using tab views with different content sets, make sure to use a common `groupId` for equal sets but distinct -`groupId` for different sets. The `groupId` defaults to `'default'`. -**Take this into account across the whole site!** -The tab selection is restored automatically based on the `groupId` and if it cannot find a tab item because it came -from the `'default'` group on a different page then all tabs will be empty at first. -{{% /notice %}} diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/tabs.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/tabs.pir.md deleted file mode 100644 index bfbe015..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/shortcodes/tabs.pir.md +++ /dev/null @@ -1,5 +0,0 @@ -+++ -descrption = "Synchr'nize select'n o' content 'n different tabbed views" -title = "Tabbed views" -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/showcase.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/showcase.en.md deleted file mode 100644 index a48ca6c..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/showcase.en.md +++ /dev/null @@ -1,13 +0,0 @@ -+++ -disableToc = true -title = "Showcase" -+++ - -#### [TAT](https://ovh.github.io/tat/overview/) by OVH -![TAT image](/images/showcase/tat.png?width=50pc) - -#### [Tshark.dev](https://tshark.dev) by Ross Jacobs -![Tshark.dev image](/images/showcase/tshark_dev.png?width=50pc) - -#### [inteliver](https://docs.inteliver.com) by Amir Lavasani -![docs.inteliver.com image](/images/showcase/inteliver_docs.png?width=50pc) \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/showcase.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/showcase.pir.md deleted file mode 100644 index 013c1b0..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/showcase.pir.md +++ /dev/null @@ -1,5 +0,0 @@ -+++ -disableToc = true -title = "Showcase" -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/yours/_index.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/yours/_index.en.md deleted file mode 100644 index 855d6c4..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/yours/_index.en.md +++ /dev/null @@ -1,12 +0,0 @@ -+++ -chapter = true -hidden = true -title = "This could be yours" -weight = 4 -+++ - -### Chapter 4 - -# This could be yours - -Start your success story. Now! \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/yours/_index.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/yours/_index.pir.md deleted file mode 100644 index 8c1f2ed..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/yours/_index.pir.md +++ /dev/null @@ -1,7 +0,0 @@ -+++ -chapter = true -hidden = true -title = "This could be yers" -weight = 4 -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/yours/children-1/_index.en.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/yours/children-1/_index.en.md deleted file mode 100644 index e05abd7..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/yours/children-1/_index.en.md +++ /dev/null @@ -1,6 +0,0 @@ -+++ -hidden = true -title = "The one and only hidden child" -+++ - -Placeholder... \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/content/yours/children-1/_index.pir.md b/subsite/docs/themes/hugo-relearn/exampleSite/content/yours/children-1/_index.pir.md deleted file mode 100644 index 53dd0c9..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/content/yours/children-1/_index.pir.md +++ /dev/null @@ -1,5 +0,0 @@ -+++ -hidden = true -title = "Th' one an' only hidden child" -+++ -{{< piratify >}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/layouts/partials/favicon.html b/subsite/docs/themes/hugo-relearn/exampleSite/layouts/partials/favicon.html deleted file mode 100644 index 48b528d..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/layouts/partials/favicon.html +++ /dev/null @@ -1,2 +0,0 @@ -{{- $assetBusting := not .Site.Params.disableAssetsBusting -}} - \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/layouts/partials/menu-footer.html b/subsite/docs/themes/hugo-relearn/exampleSite/layouts/partials/menu-footer.html deleted file mode 100644 index cb43305..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/layouts/partials/menu-footer.html +++ /dev/null @@ -1,6 +0,0 @@ - - Download - Star - Fork -

Built with by Hugo

- \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/layouts/partials/menu-pre.html b/subsite/docs/themes/hugo-relearn/exampleSite/layouts/partials/menu-pre.html deleted file mode 100644 index 98b2be8..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/layouts/partials/menu-pre.html +++ /dev/null @@ -1 +0,0 @@ -{{ if .Params.chapter }}{{ .Params.weight }}. {{ end }} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/layouts/shortcodes/ghcontributors.html b/subsite/docs/themes/hugo-relearn/exampleSite/layouts/shortcodes/ghcontributors.html deleted file mode 100644 index 3e8a928..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/layouts/shortcodes/ghcontributors.html +++ /dev/null @@ -1,31 +0,0 @@ - -
- {{ $url := .Get 0 }} - {{ range getJSON $url }} -
- - - {{.contributions}} commits -
- {{ end }} -
\ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/layouts/shortcodes/piratify.html b/subsite/docs/themes/hugo-relearn/exampleSite/layouts/shortcodes/piratify.html deleted file mode 100644 index 2acac76..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/layouts/shortcodes/piratify.html +++ /dev/null @@ -1,97 +0,0 @@ -{{- $langsrc := .Get 1 | default "en" }} -{{- $langtrg := .Page.Language.Lang }} -{{- $words := dict - "Hugo" "Cap'n Hugo" - "Info" "Ahoi" - "Note" "Avast" - "Tip" "Smarrrt Arrrse" - "Warning" "Arrr" - "good" "bloody" - "shortcode" "shorrrtcode" - "Shortcode" "Shorrrtcode" - "shortcodes" "shorrrtcodes" - "Shortcodes" "Shorrrtcodes" - "Mermaid" "Merrrmaid" - "Markdown" "Marrrkdown" - "Markup" "Marrrkup" - "markup" "marrrkup" - "for" "fer" - "Your" "Yer" - "your" "yer" - "You" "Ye" - "you" "ye" - "the" "th'" - "The" "Th'" - "is" "be" - "Is" "Be" - "are" "be" - "Are" "Be" - "Of" "O'" - "of" "o'" - "To" "T'" - "to" "t'" - "in" "'n" - "With" "Wit'" - "with" "wit'" - "Where" "Whar'" - "where" "whar'" - "After" "Aft" - "after" "aft" - "And" "An'" - "and" "an'" - "Load" "Board" - "load" "board" - "Loaded" "Boarded" - "loaded" "boarded" - "Content" "Rambling" - "content" "rambling" - "icon" "ay'con" - "Icon" "Ay'con" - "icons" "ay'cons" - "Icons" "Ay'cons" - "syntax" "rules" - "Syntax" "Rules" - "Site" "Ship" - "site" "ship" - "Page" "Plank" - "page" "plank" - "Pages" "Planks" - "pages" "planks" - "Relearn" "Relearrrn" - "Learn" "Learrrn" -}} -{{- $specials := dict - "(\\w)ing([\\s\\n<.,;?!:])" "'n" - "(\\w)ings([\\s\\n<.,;?!:])" "'ns" - "(\\w)tion([\\s\\n<.,;?!:])" "t'n" - "(\\w)tions([\\s\\n<.,;?!:])" "t'ns" - "(\\w)(?:[aeiou])ble([\\s\\n<.,;?!:])" "'ble" - "(\\w)(?:[aeiou])mize([\\s\\n<.,;?!:])" "'mize" - "(\\w)(?:[aeiou])mizes([\\s\\n<.,;?!:])" "'mizes" - "(\\w)(?:[aeiou])nize([\\s\\n<.,;?!:])" "'nize" - "(\\w)(?:[aeiou])nizes([\\s\\n<.,;?!:])" "'nizes" - "(.)=\"/([^\".]*?\")" (printf "=\"/%s/" $langtrg) -}} -{{- $fix := dict - "warn'n" "warning" - "sect'n" "section" - "n Cap'n" "n" - "Documentat'n fer Cap'n Hugo Relearrrn Theme" "Documentation for Hugo Relearn Theme" - "Avast right o' John" "Note right of John" -}} -{{- $c := "" }} -{{- range .Page.Translations }} - {{- if eq .Language.Lang $langsrc }} - {{- $c = .Content }} - {{- range $from, $to := $words }} - {{- $c = replaceRE (printf "([\\s\\n>])%s([\\s\\n<.,;?!:])" $from) (printf "${1}%s${2}" $to) $c }} - {{- end }} - {{- range $from, $to := $specials }} - {{- $c = replaceRE $from (printf "${1}%s${2}" $to) $c }} - {{- end }} - {{- range $from, $to := $fix }} - {{ $c = replace $c $from $to }} - {{- end }} - {{- end }} -{{- end }} -{{- $c | safeHTML }} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/static/fonts/monogramos-webfont.eot b/subsite/docs/themes/hugo-relearn/exampleSite/static/fonts/monogramos-webfont.eot deleted file mode 100755 index 702d2cc..0000000 Binary files a/subsite/docs/themes/hugo-relearn/exampleSite/static/fonts/monogramos-webfont.eot and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/static/fonts/monogramos-webfont.svg b/subsite/docs/themes/hugo-relearn/exampleSite/static/fonts/monogramos-webfont.svg deleted file mode 100755 index 811d3aa..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/static/fonts/monogramos-webfont.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/static/fonts/monogramos-webfont.ttf b/subsite/docs/themes/hugo-relearn/exampleSite/static/fonts/monogramos-webfont.ttf deleted file mode 100755 index 4c4637b..0000000 Binary files a/subsite/docs/themes/hugo-relearn/exampleSite/static/fonts/monogramos-webfont.ttf and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/static/fonts/monogramos-webfont.woff b/subsite/docs/themes/hugo-relearn/exampleSite/static/fonts/monogramos-webfont.woff deleted file mode 100755 index d95d5ca..0000000 Binary files a/subsite/docs/themes/hugo-relearn/exampleSite/static/fonts/monogramos-webfont.woff and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/static/fonts/monogramos-webfont.woff2 b/subsite/docs/themes/hugo-relearn/exampleSite/static/fonts/monogramos-webfont.woff2 deleted file mode 100755 index 39074b2..0000000 Binary files a/subsite/docs/themes/hugo-relearn/exampleSite/static/fonts/monogramos-webfont.woff2 and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/static/images/logo.svg b/subsite/docs/themes/hugo-relearn/exampleSite/static/images/logo.svg deleted file mode 100644 index 48b180d..0000000 --- a/subsite/docs/themes/hugo-relearn/exampleSite/static/images/logo.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/static/images/showcase/inteliver_docs.png b/subsite/docs/themes/hugo-relearn/exampleSite/static/images/showcase/inteliver_docs.png deleted file mode 100644 index 9d9bf32..0000000 Binary files a/subsite/docs/themes/hugo-relearn/exampleSite/static/images/showcase/inteliver_docs.png and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/static/images/showcase/tat.png b/subsite/docs/themes/hugo-relearn/exampleSite/static/images/showcase/tat.png deleted file mode 100644 index 35a5e63..0000000 Binary files a/subsite/docs/themes/hugo-relearn/exampleSite/static/images/showcase/tat.png and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/exampleSite/static/images/showcase/tshark_dev.png b/subsite/docs/themes/hugo-relearn/exampleSite/static/images/showcase/tshark_dev.png deleted file mode 100644 index 08f81f9..0000000 Binary files a/subsite/docs/themes/hugo-relearn/exampleSite/static/images/showcase/tshark_dev.png and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/i18n/ar.toml b/subsite/docs/themes/hugo-relearn/i18n/ar.toml deleted file mode 100644 index 85bbc01..0000000 --- a/subsite/docs/themes/hugo-relearn/i18n/ar.toml +++ /dev/null @@ -1,47 +0,0 @@ -[Search-placeholder] -other = "...البحث" - -[Clear-History] -other = "مسح السجل" - -[Attachments-label] -other = "مرفقات" - -[title-404] -other = "خطأ" - -[message-404] -other = ".¯\\_(ツ)_/¯أوبس. يبدو أن هذه الصفحة غير موجودة" - -[Go-to-homepage] -other = "الذهاب إلى الصفحة الرئيسية" - -[Edit-this-page] -other = "تعديل هذه الصفحة" - -[Shortcuts-Title] -other = "المزيد" - -[Expand-title] -other = "...قم بتوسيع" - -[Byte-symbol] -other = "B" - -[Kilobyte-symbol] -other = "KB" - -[Megabyte-symbol] -other = "MB" - -[note] -other = "Note" - -[info] -other = "Info" - -[tip] -other = "Tip" - -[warning] -other = "Warning" diff --git a/subsite/docs/themes/hugo-relearn/i18n/de.toml b/subsite/docs/themes/hugo-relearn/i18n/de.toml deleted file mode 100644 index 66ee78c..0000000 --- a/subsite/docs/themes/hugo-relearn/i18n/de.toml +++ /dev/null @@ -1,47 +0,0 @@ -[Search-placeholder] -other = "Suchen..." - -[Clear-History] -other = "Verlauf löschen" - -[Attachments-label] -other = "Anhänge" - -[title-404] -other = "Fehler" - -[message-404] -other = "Huch. Diese Seite scheint nicht zu existieren ¯\\_(ツ)_/¯." - -[Go-to-homepage] -other = "Gehe zur Homepage" - -[Edit-this-page] -other = "Bearbeite diese Seite" - -[Shortcuts-Title] -other = "Mehr" - -[Expand-title] -other = "Erweitere mich..." - -[Byte-symbol] -other = "B" - -[Kilobyte-symbol] -other = "KB" - -[Megabyte-symbol] -other = "MB" - -[note] -other = "Anmerkung" - -[info] -other = "Info" - -[tip] -other = "Tipp" - -[warning] -other = "Warnung" diff --git a/subsite/docs/themes/hugo-relearn/i18n/en-pir.toml b/subsite/docs/themes/hugo-relearn/i18n/en-pir.toml deleted file mode 100644 index 6b893ba..0000000 --- a/subsite/docs/themes/hugo-relearn/i18n/en-pir.toml +++ /dev/null @@ -1,47 +0,0 @@ -[Search-placeholder] -other = "Searrrch..." - -[Clear-History] -other = "Clear Historrry" - -[Attachments-label] -other = "Attachments" - -[title-404] -other = "Errror" - -[message-404] -other = "Woops. Looks like this plank doesn't exist ¯\\_(ツ)_/¯." - -[Go-to-homepage] -other = "Go t' homeplank" - -[Edit-this-page] -other = "Edit this plank" - -[Shortcuts-Title] -other = "Morrre" - -[Expand-title] -other = "Expand me..." - -[Byte-symbol] -other = "B" - -[Kilobyte-symbol] -other = "KB" - -[Megabyte-symbol] -other = "MB" - -[note] -other = "Avast" - -[info] -other = "Ahoi" - -[tip] -other = "Smarrrt arrrse" - -[warning] -other = "Arrr" diff --git a/subsite/docs/themes/hugo-relearn/i18n/en.toml b/subsite/docs/themes/hugo-relearn/i18n/en.toml deleted file mode 100644 index ef0d31b..0000000 --- a/subsite/docs/themes/hugo-relearn/i18n/en.toml +++ /dev/null @@ -1,47 +0,0 @@ -[Search-placeholder] -other = "Search..." - -[Clear-History] -other = "Clear History" - -[Attachments-label] -other = "Attachments" - -[title-404] -other = "Error" - -[message-404] -other = "Woops. Looks like this page doesn't exist ¯\\_(ツ)_/¯." - -[Go-to-homepage] -other = "Go to homepage" - -[Edit-this-page] -other = "Edit this page" - -[Shortcuts-Title] -other = "More" - -[Expand-title] -other = "Expand me..." - -[Byte-symbol] -other = "B" - -[Kilobyte-symbol] -other = "KB" - -[Megabyte-symbol] -other = "MB" - -[note] -other = "Note" - -[info] -other = "Info" - -[tip] -other = "Tip" - -[warning] -other = "Warning" diff --git a/subsite/docs/themes/hugo-relearn/i18n/es.toml b/subsite/docs/themes/hugo-relearn/i18n/es.toml deleted file mode 100644 index 4f8064f..0000000 --- a/subsite/docs/themes/hugo-relearn/i18n/es.toml +++ /dev/null @@ -1,47 +0,0 @@ -[Search-placeholder] -other = "Buscar..." - -[Clear-History] -other = "Borrar Historial" - -[Attachments-label] -other = "Adjuntos" - -[title-404] -other = "Error" - -[message-404] -other = "Ups. Parece que la página no existe ¯\\_(ツ)_/¯." - -[Go-to-homepage] -other = "Ir al inicio" - -[Edit-this-page] -other = "Editar esta página" - -[Shortcuts-Title] -other = "Más" - -[Expand-title] -other = "Expandir..." - -[Byte-symbol] -other = "B" - -[Kilobyte-symbol] -other = "KB" - -[Megabyte-symbol] -other = "MB" - -[note] -other = "Nota" - -[info] -other = "Información" - -[tip] -other = "Consejo" - -[warning] -other = "Aviso" diff --git a/subsite/docs/themes/hugo-relearn/i18n/fr.toml b/subsite/docs/themes/hugo-relearn/i18n/fr.toml deleted file mode 100644 index b92493f..0000000 --- a/subsite/docs/themes/hugo-relearn/i18n/fr.toml +++ /dev/null @@ -1,47 +0,0 @@ -[Search-placeholder] -other = "Rechercher..." - -[Clear-History] -other = "Supprimer l'historique" - -[Attachments-label] -other = "Pièces jointes" - -[title-404] -other = "Erreur" - -[message-404] -other = "Oups. On dirait que cette page n'existe pas ¯\\_(ツ)_/¯" - -[Go-to-homepage] -other = "Vers la page d'accueil" - -[Edit-this-page] -other = "Modifier la page" - -[Shortcuts-Title] -other = "Aller plus loin" - -[Expand-title] -other = "Déroulez-moi..." - -[Byte-symbol] -other = "o" - -[Kilobyte-symbol] -other = "ko" - -[Megabyte-symbol] -other = "Mo" - -[note] -other = "Remarque" - -[info] -other = "Information" - -[tip] -other = "Astuce" - -[warning] -other = "Avertissement" diff --git a/subsite/docs/themes/hugo-relearn/i18n/hi.toml b/subsite/docs/themes/hugo-relearn/i18n/hi.toml deleted file mode 100644 index 9e09f68..0000000 --- a/subsite/docs/themes/hugo-relearn/i18n/hi.toml +++ /dev/null @@ -1,47 +0,0 @@ -[Search-placeholder] -other = "खोजे..." - -[Clear-History] -other = "इतिहास मिटाएँ" - -[Attachments-label] -other = "संलग्नंक (अटैचमेंट)" - -[title-404] -other = "त्रुटि" - -[message-404] -other = "यह पृष्ठ अभि अनुपलब्ध है!" - -[Go-to-homepage] -other = "मुख्य पृष्ठ पर जाऐ" - -[Edit-this-page] -other = "यह पृष्ठ संपादित करें" - -[Shortcuts-Title] -other = "अधिक सामग्री दिखाएं" - -[Expand-title] -other = "विस्तार करे..." - -[Byte-symbol] -other = "B" - -[Kilobyte-symbol] -other = "KB" - -[Megabyte-symbol] -other = "MB" - -[note] -other = "Note" - -[info] -other = "Info" - -[tip] -other = "Tip" - -[warning] -other = "Warning" diff --git a/subsite/docs/themes/hugo-relearn/i18n/id.toml b/subsite/docs/themes/hugo-relearn/i18n/id.toml deleted file mode 100644 index a8bcd3d..0000000 --- a/subsite/docs/themes/hugo-relearn/i18n/id.toml +++ /dev/null @@ -1,47 +0,0 @@ -[Search-placeholder] -other = "Telusuri..." - -[Clear-History] -other = "Bersihkan Riwayat" - -[Attachments-label] -other = "Lampiran" - -[title-404] -other = "Kesalahan" - -[message-404] -other = "Oops. Sepertinya halaman ini tidak ada ¯\\_(ツ)_/¯." - -[Go-to-homepage] -other = "Ke halaman depan" - -[Edit-this-page] -other = "Edit halaman ini" - -[Shortcuts-Title] -other = "Lainnya" - -[Expand-title] -other = "Bentangkan..." - -[Byte-symbol] -other = "B" - -[Kilobyte-symbol] -other = "KB" - -[Megabyte-symbol] -other = "MB" - -[note] -other = "Note" - -[info] -other = "Info" - -[tip] -other = "Tip" - -[warning] -other = "Warning" diff --git a/subsite/docs/themes/hugo-relearn/i18n/ja.toml b/subsite/docs/themes/hugo-relearn/i18n/ja.toml deleted file mode 100644 index c357d13..0000000 --- a/subsite/docs/themes/hugo-relearn/i18n/ja.toml +++ /dev/null @@ -1,47 +0,0 @@ -[Search-placeholder] -other = "検索..." - -[Clear-History] -other = "履歴削除" - -[Attachments-label] -other = "添付" - -[title-404] -other = "エラー" - -[message-404] -other = "おっと。ページが見当たりません。 ¯\\_(ツ)_/¯." - -[Go-to-homepage] -other = "ホームページへ行く" - -[Edit-this-page] -other = "このページを編集" - -[Shortcuts-Title] -other = "更に" - -[Expand-title] -other = "開く..." - -[Byte-symbol] -other = "B" - -[Kilobyte-symbol] -other = "KB" - -[Megabyte-symbol] -other = "MB" - -[note] -other = "Note" - -[info] -other = "Info" - -[tip] -other = "Tip" - -[warning] -other = "Warning" diff --git a/subsite/docs/themes/hugo-relearn/i18n/nl.toml b/subsite/docs/themes/hugo-relearn/i18n/nl.toml deleted file mode 100644 index 5ad56bd..0000000 --- a/subsite/docs/themes/hugo-relearn/i18n/nl.toml +++ /dev/null @@ -1,47 +0,0 @@ -[Search-placeholder] -other = "Zoeken..." - -[Clear-History] -other = "Wis geschiedenis" - -[Attachments-label] -other = "Bijlagen" - -[title-404] -other = "Error" - -[message-404] -other = "Blijkbaar bestaat deze pagina niet ¯\\_(ツ)_/¯." - -[Go-to-homepage] -other = "Naar startpagina" - -[Edit-this-page] -other = "Deze pagina bewerken" - -[Shortcuts-Title] -other = "Snelkoppelingen" - -[Expand-title] -other = "Lees meer..." - -[Byte-symbol] -other = "B" - -[Kilobyte-symbol] -other = "KB" - -[Megabyte-symbol] -other = "MB" - -[note] -other = "Note" - -[info] -other = "Info" - -[tip] -other = "Tip" - -[warning] -other = "Warning" diff --git a/subsite/docs/themes/hugo-relearn/i18n/pt.toml b/subsite/docs/themes/hugo-relearn/i18n/pt.toml deleted file mode 100644 index 6532da9..0000000 --- a/subsite/docs/themes/hugo-relearn/i18n/pt.toml +++ /dev/null @@ -1,47 +0,0 @@ -[Search-placeholder] -other = "Procurar..." - -[Clear-History] -other = "Limpar Histórico" - -[Attachments-label] -other = "Anexos" - -[title-404] -other = "Erro" - -[message-404] -other = "Ops. Parece que a página não existe ¯\\_(ツ)_/¯." - -[Go-to-homepage] -other = "Ir para o início" - -[Edit-this-page] -other = "Editar esta página" - -[Shortcuts-Title] -other = "Mais" - -[Expand-title] -other = "Expandir..." - -[Byte-symbol] -other = "B" - -[Kilobyte-symbol] -other = "KB" - -[Megabyte-symbol] -other = "MB" - -[note] -other = "Nota" - -[info] -other = "Informação" - -[tip] -other = "Dica" - -[warning] -other = "Aviso" diff --git a/subsite/docs/themes/hugo-relearn/i18n/ru.toml b/subsite/docs/themes/hugo-relearn/i18n/ru.toml deleted file mode 100644 index 69b44b7..0000000 --- a/subsite/docs/themes/hugo-relearn/i18n/ru.toml +++ /dev/null @@ -1,47 +0,0 @@ -[Search-placeholder] -other = "Поиск..." - -[Clear-History] -other = "Очистить историю" - -[Attachments-label] -other = "Присоединенные файлы" - -[title-404] -other = "Ошибка" - -[message-404] -other = "Упс. Выглядит будто такой страницы нет ¯\\_(ツ)_/¯." - -[Go-to-homepage] -other = "Перейти на главную" - -[Edit-this-page] -other = "Редактировать" - -[Shortcuts-Title] -other = "Еще" - -[Expand-title] -other = "Развернуть..." - -[Byte-symbol] -other = "Б" - -[Kilobyte-symbol] -other = "КБ" - -[Megabyte-symbol] -other = "МБ" - -[note] -other = "Заметка" - -[info] -other = "Информация" - -[tip] -other = "Совет" - -[warning] -other = "Внимание" diff --git a/subsite/docs/themes/hugo-relearn/i18n/tr.toml b/subsite/docs/themes/hugo-relearn/i18n/tr.toml deleted file mode 100644 index a6a9bab..0000000 --- a/subsite/docs/themes/hugo-relearn/i18n/tr.toml +++ /dev/null @@ -1,47 +0,0 @@ -[Search-placeholder] -other = "Ara..." - -[Clear-History] -other = "Geçmişi Temizle" - -[Attachments-label] -other = "Ekler" - -[title-404] -other = "Hata" - -[message-404] -other = "Uups. Görünüşe göre böyle bir sayfa yok ¯\\_(ツ)_/¯" - -[Go-to-homepage] -other = "Anasayfaya dön" - -[Edit-this-page] -other = "Sayfayı düzenle" - -[Shortcuts-Title] -other = "Dahası Var" - -[Expand-title] -other = "Genişlet..." - -[Byte-symbol] -other = "B" - -[Kilobyte-symbol] -other = "KB" - -[Megabyte-symbol] -other = "MB" - -[note] -other = "Note" - -[info] -other = "Info" - -[tip] -other = "Tip" - -[warning] -other = "Warning" diff --git a/subsite/docs/themes/hugo-relearn/i18n/vn.toml b/subsite/docs/themes/hugo-relearn/i18n/vn.toml deleted file mode 100644 index fbd7ee7..0000000 --- a/subsite/docs/themes/hugo-relearn/i18n/vn.toml +++ /dev/null @@ -1,50 +0,0 @@ -[Search-placeholder] -other = "Tìm kiếm..." - -[Clear-History] -other = "Xóa lịch sử.." - -[Attachments-label] -other = "Tập tin đính kèm" - -[title-404] -other = "Lỗi" - -[message-404] -other = "Tiếc quá! Có vẻ như trang này không tồn tại ¯\\_(ツ)_/¯." - -[Go-to-homepage] -other = "Đi đến trang chủ" - -[Edit-this-page] -other = "Chỉnh sửa trang này" - -[Shortcuts-Title] -other = "Nội dung khác" - -[Expand-title] -other = "Mở rộng..." - -[BinaryPrefix-kilobyte] -other = "kb" - -[Byte-symbol] -other = "B" - -[Kilobyte-symbol] -other = "KB" - -[Megabyte-symbol] -other = "MB" - -[note] -other = "Ghi chú" - -[info] -other = "Thông tin" - -[tip] -other = "Mẹo vặt" - -[warning] -other = "Cảnh báo" diff --git a/subsite/docs/themes/hugo-relearn/i18n/zh-cn.toml b/subsite/docs/themes/hugo-relearn/i18n/zh-cn.toml deleted file mode 100644 index 8702b80..0000000 --- a/subsite/docs/themes/hugo-relearn/i18n/zh-cn.toml +++ /dev/null @@ -1,47 +0,0 @@ -[Search-placeholder] -other = "搜索..." - -[Clear-History] -other = "清理历史记录" - -[Attachments-label] -other = "附件" - -[title-404] -other = "错误" - -[message-404] -other = "哎哟。 看起来这个页面不存在 ¯\\_(ツ)_/¯。" - -[Go-to-homepage] -other = "转到主页" - -[Edit-this-page] -other = "编辑当前页" - -[Shortcuts-Title] -other = "更多" - -[Expand-title] -other = "展开" - -[Byte-symbol] -other = "B" - -[Kilobyte-symbol] -other = "KB" - -[Megabyte-symbol] -other = "MB" - -[note] -other = "注释" - -[info] -other = "信息" - -[tip] -other = "提示" - -[warning] -other = "警告" diff --git a/subsite/docs/themes/hugo-relearn/images/screenshot.png b/subsite/docs/themes/hugo-relearn/images/screenshot.png deleted file mode 100644 index 83063cf..0000000 Binary files a/subsite/docs/themes/hugo-relearn/images/screenshot.png and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/images/tn.png b/subsite/docs/themes/hugo-relearn/images/tn.png deleted file mode 100644 index 74cdfb5..0000000 Binary files a/subsite/docs/themes/hugo-relearn/images/tn.png and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/layouts/404.html b/subsite/docs/themes/hugo-relearn/layouts/404.html deleted file mode 100644 index fc2bf44..0000000 --- a/subsite/docs/themes/hugo-relearn/layouts/404.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - {{ hugo.Generator -}} - {{- partial "meta.html" . }} - {{ partial "favicon.html" . }} - {{- .Scratch.Add "title" "" }} - {{- if eq .Site.Data.titles .Title }} - {{- .Scratch.Set "title" (index .Site.Data.titles .Title).title }} - {{- else }} - {{- .Scratch.Set "title" .Title}} - {{- end }} - {{ .Scratch.Get "title" }} {{ default "::" .Site.Params.titleSeparator }} {{ .Site.Title }} - - {{- $assetBusting := not .Site.Params.disableAssetsBusting }} - - - - - - {{- with .Site.Params.themeVariant }} - - - {{- end }} - - {{- range .Site.Params.custom_css }} - - {{- end }} - - {{- partial "custom-header.html" . }} - - -
-
-
-
-

{{ T "title-404" }}

-

-

{{ T "message-404" }}

-

-

{{ T "Go-to-homepage" }}

-

Page not found!

-
-
-
- - diff --git a/subsite/docs/themes/hugo-relearn/layouts/_default/list.html b/subsite/docs/themes/hugo-relearn/layouts/_default/list.html deleted file mode 100644 index e9953d5..0000000 --- a/subsite/docs/themes/hugo-relearn/layouts/_default/list.html +++ /dev/null @@ -1,20 +0,0 @@ -{{- partial "header.html" . }} -{{- if eq .Kind "section" }} - -{{ partial "content.html" . }} -{{- end }} - {{- if or (eq .Kind "taxonomy") (eq .Kind "term") }} -
    - {{- range .Pages }} - {{- if and .Title (or (ne (.Scratch.Get "relearnIsHiddenStem") true) (ne .Site.Params.disableTagHiddenPages true) ) }} -
  • {{ .Title }}
  • - {{- end }} - {{- end }} -
- {{- end }} -
- {{- with .Params.LastModifierDisplayName }} - {{ . }} {{ with $.Date }} {{ .Format "02/01/2006" }}{{ end }} - {{- end }} -
-{{- partial "footer.html" . }} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/layouts/_default/rss.xml b/subsite/docs/themes/hugo-relearn/layouts/_default/rss.xml deleted file mode 100644 index 445be9c..0000000 --- a/subsite/docs/themes/hugo-relearn/layouts/_default/rss.xml +++ /dev/null @@ -1,42 +0,0 @@ -{{- printf "" | safeHTML }} -{{- partial "page-meta.go" . }} -{{- $pages := .Page.Pages }} -{{- if .Page.IsHome }} - {{- $pages = .Page.Sections }} -{{- else if .Page.Sections}} - {{- $pages = (.Page.Pages | union .Page.Sections) }} -{{- end }} -{{- $limit := .Site.Config.Services.RSS.Limit -}} -{{- if ge $limit 0 -}} - {{- $pages = $pages | first $limit -}} -{{- end }} - - - {{ if eq .Title .Site.Title }}{{ .Site.Title }}{{ else }}{{ with .Title }}{{.}} on {{ end }}{{ .Site.Title }}{{ end }} - {{ .Permalink }} - Recent content {{ if ne .Title .Site.Title }}{{ with .Title }}in {{.}} {{ end }}{{ end }}on {{ .Site.Title }} - Hugo -- gohugo.io{{ with .Site.LanguageCode }} - {{.}}{{end}}{{ with .Site.Author.email }} - {{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}{{end}}{{ with .Site.Author.email }} - {{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}{{end}}{{ with .Site.Copyright }} - {{.}}{{end}}{{ if not .Date.IsZero }} - {{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}{{ end }} - {{- with .OutputFormats.Get "RSS" -}} - {{ printf "" .Permalink .MediaType | safeHTML }} - {{- end -}} - {{- range $pages }} - {{- if and .Permalink .Title (or (ne (.Scratch.Get "relearnIsHiddenStem") true) (ne .Site.Params.disableSeoHiddenPages true) ) }} - - {{ .Title }} - {{ .Permalink }} - {{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }} - {{- with .Site.Author.email }} - {{.}}{{ with $.Site.Author.name }} ({{.}}){{end}} - {{- end }} - {{ .Permalink }} - {{ .Summary | html }} - - {{- end }} - {{- end }} - - \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/layouts/_default/single.html b/subsite/docs/themes/hugo-relearn/layouts/_default/single.html deleted file mode 100644 index 62c9d81..0000000 --- a/subsite/docs/themes/hugo-relearn/layouts/_default/single.html +++ /dev/null @@ -1,9 +0,0 @@ -{{- partial "header.html" . }} - -{{ partial "content.html" . }} -
- {{- with .Params.LastModifierDisplayName }} - {{ . }} {{ with $.Date }} {{ .Format "02/01/2006" }}{{ end }} - {{- end }} -
-{{- partial "footer.html" . }} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/layouts/_default/sitemap.xml b/subsite/docs/themes/hugo-relearn/layouts/_default/sitemap.xml deleted file mode 100644 index 7ac5f64..0000000 --- a/subsite/docs/themes/hugo-relearn/layouts/_default/sitemap.xml +++ /dev/null @@ -1,24 +0,0 @@ -{{ printf "" | safeHTML }} -{{- partial "page-meta.go" . }} - -{{- range .Data.Pages }} -{{- if and .Title (or (ne (.Scratch.Get "relearnIsHiddenStem") true) (ne .Site.Params.disableSeoHiddenPages true) ) }} - - {{ .Permalink }}{{ if not .Lastmod.IsZero }} - {{ safeHTML ( .Lastmod.Format "2006-01-02T15:04:05-07:00" ) }}{{ end }}{{ with .Sitemap.ChangeFreq }} - {{ . }}{{ end }}{{ if ge .Sitemap.Priority 0.0 }} - {{ .Sitemap.Priority }}{{ end }}{{ if .IsTranslated }}{{ range .Translations }} - {{ end }} - {{ end }} - -{{- end -}} -{{- end }} - diff --git a/subsite/docs/themes/hugo-relearn/layouts/index.html b/subsite/docs/themes/hugo-relearn/layouts/index.html deleted file mode 100644 index b5f7a61..0000000 --- a/subsite/docs/themes/hugo-relearn/layouts/index.html +++ /dev/null @@ -1,19 +0,0 @@ -{{- partial "header.html" . }} - - navigation - - -{{if .Site.Home.Content }} -{{.Site.Home.Content}} -{{else}} -

Customize your own home page

-

- The site is working. Don't forget to customize this page with your own. You typically have 3 choices : -

-
    -
  • 1. Create an _index.md document in content folder and fill it with Markdown content
  • -
  • 2. Create an index.html file in the static folder and fill the file with HTML content
  • -
  • 3. Configure your server to automatically redirect home page to one your documentation page
  • -
-{{ end }} -{{- partial "footer.html" . }} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/layouts/index.json b/subsite/docs/themes/hugo-relearn/layouts/index.json deleted file mode 100644 index d329ce3..0000000 --- a/subsite/docs/themes/hugo-relearn/layouts/index.json +++ /dev/null @@ -1,7 +0,0 @@ -{{- $pages := slice }} -{{- range .Site.Pages }} -{{- if and .Title (or (ne (.Scratch.Get "relearnIsHiddenStem") true) (ne .Site.Params.disableSearchHiddenPages true) ) }} -{{- $pages = $pages | append (dict "uri" .RelPermalink "title" .Title "tags" .Params.tags "description" .Description "content" (.Plain | htmlUnescape)) }} -{{- end }} -{{- end }} -{{- $pages | jsonify (dict "indent" " ") }} diff --git a/subsite/docs/themes/hugo-relearn/layouts/partials/content.html b/subsite/docs/themes/hugo-relearn/layouts/partials/content.html deleted file mode 100644 index fb3ffc2..0000000 --- a/subsite/docs/themes/hugo-relearn/layouts/partials/content.html +++ /dev/null @@ -1 +0,0 @@ -{{ .Content }} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/layouts/partials/custom-comments.html b/subsite/docs/themes/hugo-relearn/layouts/partials/custom-comments.html deleted file mode 100644 index 53f5831..0000000 --- a/subsite/docs/themes/hugo-relearn/layouts/partials/custom-comments.html +++ /dev/null @@ -1,3 +0,0 @@ - \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/layouts/partials/custom-footer.html b/subsite/docs/themes/hugo-relearn/layouts/partials/custom-footer.html deleted file mode 100644 index daa6be7..0000000 --- a/subsite/docs/themes/hugo-relearn/layouts/partials/custom-footer.html +++ /dev/null @@ -1,5 +0,0 @@ - \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/layouts/partials/custom-header.html b/subsite/docs/themes/hugo-relearn/layouts/partials/custom-header.html deleted file mode 100644 index ee449b0..0000000 --- a/subsite/docs/themes/hugo-relearn/layouts/partials/custom-header.html +++ /dev/null @@ -1,5 +0,0 @@ - \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/layouts/partials/favicon.html b/subsite/docs/themes/hugo-relearn/layouts/partials/favicon.html deleted file mode 100644 index b47de9f..0000000 --- a/subsite/docs/themes/hugo-relearn/layouts/partials/favicon.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/layouts/partials/footer.html b/subsite/docs/themes/hugo-relearn/layouts/partials/footer.html deleted file mode 100644 index 6285591..0000000 --- a/subsite/docs/themes/hugo-relearn/layouts/partials/footer.html +++ /dev/null @@ -1,52 +0,0 @@ - {{- if .Params.chapter }} - - {{- end }} - -{{- partial "custom-comments.html" . }} - - - -
-
-
- - - - - - -{{- if (or (and (ne .Params.disableMermaid nil) (not .Params.disableMermaid)) (not .Site.Params.disableMermaid)) }} - {{- if isset .Params "custommermaidurl" }} - - {{- else if isset .Site.Params "custommermaidurl" }} - - {{- else }} - - {{- end }} - {{- if isset .Params "mermaidinitialize" }} - {{- $.Scratch.Set "mermaidInitialize" .Params.mermaidInitialize }} - {{- else if isset .Site.Params "mermaidinitialize" }} - {{- $.Scratch.Set "mermaidInitialize" .Site.Params.mermaidInitialize }} - {{- else }} - {{- $.Scratch.Set "mermaidInitialize" "{ \"startOnLoad\": true }" }} - {{- end }} - -{{- end }} - - {{- partial "custom-footer.html" . }} - - diff --git a/subsite/docs/themes/hugo-relearn/layouts/partials/header.html b/subsite/docs/themes/hugo-relearn/layouts/partials/header.html deleted file mode 100644 index a156aa4..0000000 --- a/subsite/docs/themes/hugo-relearn/layouts/partials/header.html +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - {{ hugo.Generator -}} - {{- partial "meta.html" . }} - {{ partial "favicon.html" . }} - {{ .Title }} {{ default "::" .Site.Params.titleSeparator }} {{ .Site.Title }} - - {{- $assetBusting := not .Site.Params.disableAssetsBusting }} - - - - - - - {{- with .Site.Params.themeVariant }} - - - {{- end }} - - {{- range .Site.Params.custom_css }} - - {{- end }} - - - {{- partial "custom-header.html" . }} - - - {{- partial "menu.html" . }} -
-
-
- {{- if not .IsHome }} -
- {{- if and (or .IsPage .IsSection) .Site.Params.editURL }} - {{- $File := .File }} - {{- $Site := .Site }} - {{- with $File.Path }} - - {{- end }} - {{- end }} - {{- $toc := (and (not .Params.disableToc) (not .Params.chapter)) }} - - {{- if $toc }} - {{- partial "toc.html" . }} - {{- end }} -
- {{- end }} -
-{{- partial "tags.html" . }} -
- {{- if .Params.chapter }} -
- {{- end }} -
- {{- if and (not .IsHome) (not .Params.chapter) }} -

{{ if eq .Kind "term" }}{{ .Data.Singular }} :: {{ end }}{{ .Title }}

- {{- end }} - -{{- define "breadcrumb" }} - {{- $parent := .page.Parent }} - {{- $depth := add .depth 1 }} - {{- if $parent }} - {{- template "breadcrumb" dict "page" $parent "depth" $depth }} - {{- end }} -
  • {{ .page.Title }}{{ if .depth }} > {{ end }}
  • -{{- end }} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/layouts/partials/logo.html b/subsite/docs/themes/hugo-relearn/layouts/partials/logo.html deleted file mode 100644 index f94d7be..0000000 --- a/subsite/docs/themes/hugo-relearn/layouts/partials/logo.html +++ /dev/null @@ -1,23 +0,0 @@ - \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/layouts/partials/menu-footer.html b/subsite/docs/themes/hugo-relearn/layouts/partials/menu-footer.html deleted file mode 100644 index 478e2ef..0000000 --- a/subsite/docs/themes/hugo-relearn/layouts/partials/menu-footer.html +++ /dev/null @@ -1,2 +0,0 @@ - -

    Built with by Hugo

    \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/layouts/partials/menu-post.html b/subsite/docs/themes/hugo-relearn/layouts/partials/menu-post.html deleted file mode 100644 index 1022847..0000000 --- a/subsite/docs/themes/hugo-relearn/layouts/partials/menu-post.html +++ /dev/null @@ -1 +0,0 @@ -{{ .Params.Post | safeHTML }} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/layouts/partials/menu-pre.html b/subsite/docs/themes/hugo-relearn/layouts/partials/menu-pre.html deleted file mode 100644 index 0552d7a..0000000 --- a/subsite/docs/themes/hugo-relearn/layouts/partials/menu-pre.html +++ /dev/null @@ -1 +0,0 @@ -{{ .Params.Pre | safeHTML }} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/layouts/partials/menu.html b/subsite/docs/themes/hugo-relearn/layouts/partials/menu.html deleted file mode 100644 index e5e55dd..0000000 --- a/subsite/docs/themes/hugo-relearn/layouts/partials/menu.html +++ /dev/null @@ -1,137 +0,0 @@ - - - {{- define "section-tree-nav" }} - {{- $showvisitedlinks := .showvisitedlinks }} - {{- $currentNode := .currentnode }} - {{- $currentFileUniqueID := "" }} - {{- $alwaysopen := .alwaysopen }} - {{- with $currentNode.File }}{{ $currentFileUniqueID = .UniqueID }}{{ end }} - {{- with .sect }} - {{- $hidden := and (eq (.Scratch.Get "relearnIsHiddenFromCurrent") true) (not $.showhidden) (not (.IsAncestor $currentNode)) }} - {{- if $hidden }} - {{- else if .IsSection }} - {{- safeHTML .Params.head }} - {{- $defaultOrdersectionsby := .Site.Params.ordersectionsby | default "weight" }} - {{- $currentOrdersectionsby := .Params.ordersectionsby | default $defaultOrdersectionsby }} - {{- $currentAlwaysopen := .Params.alwaysopen | default $alwaysopen }} -
  • - {{- partial "menu-pre.html" . }}{{ or .Params.menuTitle .LinkTitle .Title }}{{ partial "menu-post.html" . }} - {{- if $showvisitedlinks }}{{ end }}
      - {{- $pages := .Pages }} - {{- if .Page.IsHome }} - {{- $pages = .Sections }} - {{- else if .Page.Sections}} - {{- $pages = (.Pages | union .Sections) }} - {{- end }} - {{- $defaultAlwaysopen := .Site.Params.alwaysopen | default true }} - {{- if eq $currentOrdersectionsby "title" }} - {{- range $pages.ByTitle }} - {{- template "section-tree-nav" dict "sect" . "currentnode" $currentNode "showvisitedlinks" $showvisitedlinks "alwaysopen" $defaultAlwaysopen }} - {{- end }} - {{- else }} - {{- range $pages.ByWeight }} - {{- template "section-tree-nav" dict "sect" . "currentnode" $currentNode "showvisitedlinks" $showvisitedlinks "alwaysopen" $defaultAlwaysopen }} - {{- end }} - {{- end }}
  • - {{- else }} -
  • - {{- partial "menu-pre.html" . }}{{ or .Params.menuTitle .LinkTitle .Title }}{{ partial "menu-post.html" . }} - {{- if $showvisitedlinks }}{{ end }}
  • - {{- end }} - {{- end }} - {{- end }} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/layouts/partials/meta.html b/subsite/docs/themes/hugo-relearn/layouts/partials/meta.html deleted file mode 100644 index 4fb098b..0000000 --- a/subsite/docs/themes/hugo-relearn/layouts/partials/meta.html +++ /dev/null @@ -1,21 +0,0 @@ -{{- partial "page-meta.go" . }} -{{- if not (and .Title (or (ne (.Scratch.Get "relearnIsHiddenStem") true) (ne .Site.Params.disableSeoHiddenPages true) ) ) }} - -{{- else }} - {{- range .AlternativeOutputFormats }} - {{- if ne .Name "JSON" }} - - {{- end }} - {{- end }} -{{- end }} -{{- if and (ne .Site.Params.disableSeoHiddenPages true) (ne .Site.Params.disableSearchHiddenPages true) }} -{{- range .AlternativeOutputFormats }} -{{- if eq .Name "JSON" }} - -{{- end }} -{{- end }} -{{- end }} - -{{- with .Site.Params.author }} - -{{- end }} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/layouts/partials/page-meta.go b/subsite/docs/themes/hugo-relearn/layouts/partials/page-meta.go deleted file mode 100644 index 0aca016..0000000 --- a/subsite/docs/themes/hugo-relearn/layouts/partials/page-meta.go +++ /dev/null @@ -1,56 +0,0 @@ -{{- $currentNode := . }} -{{- $currentNode.Scratch.Set "relearnIsSelfFound" nil }} -{{- $currentNode.Scratch.Set "relearnPrevPage" nil }} -{{- $currentNode.Scratch.Set "relearnNextPage" nil }} -{{- $currentNode.Scratch.Set "relearnSubPages" nil }} -{{- template "relearn-structure" dict "node" .Site.Home "currentnode" $currentNode "hiddenstem" false "hiddencurrent" false }} -{{- define "relearn-structure" }} - {{- $currentNode := .currentnode }} - {{- $isSelf := eq $currentNode.RelPermalink .node.RelPermalink }} - {{- $isDescendant := and (not $isSelf) (.node.IsDescendant $currentNode) }} - {{- $isAncestor := and (not $isSelf) (.node.IsAncestor $currentNode) }} - {{- $isOther := and (not $isDescendant) (not $isSelf) (not $isAncestor) }} - - {{- if $isSelf }} - {{- $currentNode.Scratch.Set "relearnIsSelfFound" true }} - {{- end}} - {{- $isSelfFound := eq ($currentNode.Scratch.Get "relearnIsSelfFound") true }} - {{- $isPreSelf := and (not $isSelfFound) (not $isSelf) }} - {{- $isPostSelf := and ($isSelfFound) (not $isSelf) }} - - {{- $hidden_node := or (.node.Params.hidden) (eq .node.Title "") }} - {{- $hidden_stem:= or $hidden_node .hiddenstem }} - {{- $hidden_current_stem:= or $hidden_node .hiddencurrent }} - {{- $hidden_from_current := or (and $hidden_node (not $isAncestor) (not $isSelf) ) (and .hiddencurrent (or $isPreSelf $isPostSelf $isDescendant) ) }} - {{- .node.Scratch.Set "relearnIsHiddenNode" $hidden_node}} - {{- .node.Scratch.Set "relearnIsHiddenStem" $hidden_stem}} - {{- .node.Scratch.Set "relearnIsHiddenFromCurrent" $hidden_current_stem}} - - {{- if not $hidden_from_current }} - {{- if $isPreSelf }} - {{- $currentNode.Scratch.Set "relearnPrevPage" .node }} - {{- else if and $isPostSelf (eq ($currentNode.Scratch.Get "relearnNextPage") nil) }} - {{- $currentNode.Scratch.Set "relearnNextPage" .node }} - {{- end}} - {{- end }} - - {{- $currentNode.Scratch.Set "relearnSubPages" .node.Pages }} - {{- if .node.IsHome }} - {{- $currentNode.Scratch.Set "relearnSubPages" .node.Sections }} - {{- else if .node.Sections }} - {{- $currentNode.Scratch.Set "relearnSubPages" (.node.Pages | union .node.Sections) }} - {{- end }} - {{- $pages := ($currentNode.Scratch.Get "relearnSubPages") }} - - {{- $defaultOrdersectionsby := .Site.Params.ordersectionsby | default "weight" }} - {{- $currentOrdersectionsby := .node.Params.ordersectionsby | default $defaultOrdersectionsby }} - {{- if eq $currentOrdersectionsby "title"}} - {{- range $pages.ByTitle }} - {{- template "relearn-structure" dict "node" . "currentnode" $currentNode "hiddenstem" $hidden_stem "hiddencurrent" $hidden_from_current }} - {{- end}} - {{- else}} - {{- range $pages.ByWeight }} - {{- template "relearn-structure" dict "node" . "currentnode" $currentNode "hiddenstem" $hidden_stem "hiddencurrent" $hidden_from_current }} - {{- end}} - {{- end }} -{{- end }} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/layouts/partials/search.html b/subsite/docs/themes/hugo-relearn/layouts/partials/search.html deleted file mode 100644 index 4cbfffd..0000000 --- a/subsite/docs/themes/hugo-relearn/layouts/partials/search.html +++ /dev/null @@ -1,16 +0,0 @@ - - {{- $assetBusting := not .Site.Params.disableAssetsBusting }} - - - {{ "" | safeHTML }} - {{ "" | safeHTML }} - - \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/layouts/partials/tags.html b/subsite/docs/themes/hugo-relearn/layouts/partials/tags.html deleted file mode 100644 index e61be76..0000000 --- a/subsite/docs/themes/hugo-relearn/layouts/partials/tags.html +++ /dev/null @@ -1,8 +0,0 @@ - -{{- if .Params.tags }} -
    -{{- range .Params.tags }} - {{ . }} -{{- end }} -
    -{{- end }} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/layouts/partials/toc.html b/subsite/docs/themes/hugo-relearn/layouts/partials/toc.html deleted file mode 100644 index 6775620..0000000 --- a/subsite/docs/themes/hugo-relearn/layouts/partials/toc.html +++ /dev/null @@ -1,6 +0,0 @@ - -
    -
    -{{ .TableOfContents }} -
    -
    \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/layouts/shortcodes/attachments.html b/subsite/docs/themes/hugo-relearn/layouts/shortcodes/attachments.html deleted file mode 100644 index 0c17506..0000000 --- a/subsite/docs/themes/hugo-relearn/layouts/shortcodes/attachments.html +++ /dev/null @@ -1,36 +0,0 @@ -{{- $_hugo_config := `{ "version": 1 }` }} -{{- $style := .Get "style" | default "neutral" }} -{{- $title := .Get "title" | default ("Attachments-label" | T) }} -{{- $sort := .Get "sort" | default "asc" }} -
    -
    {{ $title }}
    -
      - {{- $filesName := "files" }} - {{- if ne .Page.File.BaseFileName "index" }} - {{- $filesName = printf "%s.files" .Page.File.BaseFileName }} - {{- end}} - - {{- $fileLink := printf "%s/%s" (.Page.Language.ContentDir | default "content") .Page.File.Dir }} - {{- $fileLink = replace (replace $fileLink "\\" "/") "content/" "" }} - {{- $fileDir := printf "%s/%s" (.Page.Language.ContentDir | default "content") .Page.File.Dir }} - {{- $fileDir = replace $fileDir "\\" "/" }} - {{- $pattern := .Get "pattern" | default "" }} - {{- range sort (readDir (printf "%s%s" $fileDir $filesName) ) "Name" $sort }} - {{- if findRE $pattern .Name}} - {{- $size := .Size }} - {{- $unit := "Byte-symbol" }} - {{- if ge $size 1024 }} - {{- $size = div $size 1024 }} - {{- $unit = "Kilobyte-symbol" }} - {{- end }} - {{- if ge $size 1024 }} - {{- $size = div $size 1024 }} - {{- $unit = "Megabyte-symbol" }} - {{- end }} - {{- $unitsymbol := $unit | T }} -
    • {{.Name}} ({{$size}} {{$unitsymbol}})
    • - {{- end }} - {{- end }} -
    - {{- .Inner }} -
    diff --git a/subsite/docs/themes/hugo-relearn/layouts/shortcodes/button.html b/subsite/docs/themes/hugo-relearn/layouts/shortcodes/button.html deleted file mode 100644 index 0514798..0000000 --- a/subsite/docs/themes/hugo-relearn/layouts/shortcodes/button.html +++ /dev/null @@ -1,14 +0,0 @@ -{{- $_hugo_config := `{ "version": 1 }` }} - - {{- $icon := .Get "icon" }} - {{- $iconposition := .Get "icon-position" }} - {{- if ($icon) }} - {{- if or (not ($iconposition)) (eq $iconposition "left") }} - - {{- end }} - {{- end }} - {{ .Inner }} - {{- if and ($icon) (eq $iconposition "right")}} - - {{- end }} - diff --git a/subsite/docs/themes/hugo-relearn/layouts/shortcodes/children.html b/subsite/docs/themes/hugo-relearn/layouts/shortcodes/children.html deleted file mode 100644 index 7558a69..0000000 --- a/subsite/docs/themes/hugo-relearn/layouts/shortcodes/children.html +++ /dev/null @@ -1,96 +0,0 @@ -{{- $_hugo_config := `{ "version": 1 }` }} -{{- $showhidden := .Get "showhidden"}} -{{- $style := .Get "style" | default "li" }} -{{- $depth := .Get "depth" | default 1 }} -{{- $withDescription := .Get "description" | default false }} -{{- $sortTerm := .Get "sort" | lower }} -{{- $containerstyle := .Get "containerstyle" | default "ul" }} - -{{ (printf "<%s class=\"children children-%s children-sort-%s\">" $containerstyle $style $sortTerm)|safeHTML }} - {{- $pages := .Page.Pages }} - {{- if .Page.IsHome }} - {{- $pages = .Page.Sections }} - {{- else if .Page.Sections}} - {{- $pages = (.Page.Pages | union .Page.Sections) }} - {{- end }} - - {{- $defaultOrdersectionsby := .Site.Params.ordersectionsby | default "weight" }} - {{- $currentOrdersectionsby := $sortTerm | default (.Page.Params.ordersectionsby | default $defaultOrdersectionsby) }} - {{- if eq $currentOrdersectionsby "weight" }} - {{- template "childs" dict "menu" $pages.ByWeight "containerstyle" $containerstyle "style" $style "showhidden" $showhidden "count" 1 "depth" $depth "pages" .Site.Pages "description" $withDescription "sortTerm" $sortTerm }} - {{- else if or (eq $currentOrdersectionsby "name") (eq $currentOrdersectionsby "title") }} - {{- template "childs" dict "menu" $pages.ByTitle "containerstyle" $containerstyle "style" $style "showhidden" $showhidden "count" 1 "depth" $depth "pages" .Site.Pages "description" $withDescription "sortTerm" $sortTerm }} - {{- else if eq $currentOrdersectionsby "publishdate" }} - {{- template "childs" dict "menu" $pages.ByPublishDate "containerstyle" $containerstyle "style" $style "showhidden" $showhidden "count" 1 "depth" $depth "pages" .Site.Pages "description" $withDescription "sortTerm" $sortTerm }} - {{- else if eq $currentOrdersectionsby "date" }} - {{- template "childs" dict "menu" $pages.ByDate "containerstyle" $containerstyle "style" $style "showhidden" $showhidden "count" 1 "depth" $depth "pages" .Site.Pages "description" $withDescription "sortTerm" $sortTerm }} - {{- else if eq $currentOrdersectionsby "length" }} - {{- template "childs" dict "menu" $pages.ByLength "containerstyle" $containerstyle "style" $style "showhidden" $showhidden "count" 1 "depth" $depth "pages" .Site.Pages "description" $withDescription "sortTerm" $sortTerm }} - {{- else }} - {{- template "childs" dict "menu" $pages "containerstyle" $containerstyle "style" $style "showhidden" $showhidden "count" 1 "depth" $depth "pages" .Site.Pages "description" $withDescription "sortTerm" $sortTerm }} - {{- end }} -{{ (printf "" $containerstyle)|safeHTML }} - -{{- define "childs" }} - {{- range .menu }} - {{- $hidden := and (or (.Params.hidden) (eq .Title "")) (not $.showhidden) }} - {{- if not $hidden }} - {{- if not .IsHome }} - {{- if hasPrefix $.style "h" }} - {{- $num := sub ( int (trim $.style "h") ) 1 }} - {{- $numn := add $num $.count }} - -{{ (printf "" $numn)|safeHTML -}} -{{ .Title }} -{{- (printf "" $numn)|safeHTML }} - - {{- else }} -{{ (printf "<%s>" $.style)|safeHTML -}} -{{ .Title }} -{{- (printf "" $.style)|safeHTML }} - {{- end }} - - {{- if $.description }} - {{- if .Description }} -

    {{ .Description }}

    - {{else}} -

    {{ .Summary }}

    - {{- end }} - {{- end }} - {{- end }} - {{- if lt $.count $.depth }} - - {{- if eq $.style "li" }} -{{- (printf "<%s>" $.containerstyle)|safeHTML }} - {{- end }} - - {{- $pages := .Page.Pages }} - {{- if .Page.IsHome }} - {{- $pages = .Page.Sections }} - {{- else if .Page.Sections}} - {{- $pages = (.Page.Pages | union .Page.Sections) }} - {{- end }} - - {{- $defaultOrdersectionsby := .Site.Params.ordersectionsby | default "weight" }} - {{- $currentOrdersectionsby := $.sortTerm | default (.Page.Params.ordersectionsby | default $defaultOrdersectionsby) }} - {{- if eq $currentOrdersectionsby "weight" }} - {{- template "childs" dict "menu" $pages.ByWeight "containerstyle" $.containerstyle "style" $.style "showhidden" $.showhidden "count" (add $.count 1) "depth" $.depth "pages" $.pages "description" $.description "sortTerm" $.sortTerm }} - {{- else if or (eq $.currentOrdersectionsby "name") (eq $.currentOrdersectionsby "title") }} - {{- template "childs" dict "menu" $pages.ByTitle "containerstyle" $.containerstyle "style" $.style "showhidden" $.showhidden "count" (add $.count 1) "depth" $.depth "pages" $.pages "description" $.description "sortTerm" $.sortTerm }} - {{- else if eq $.currentOrdersectionsby "publishdate" }} - {{- template "childs" dict "menu" $pages.ByPublishDate "containerstyle" $.containerstyle "style" $.style "showhidden" $.showhidden "count" (add $.count 1) "depth" $.depth "pages" $.pages "description" $.description "sortTerm" $.sortTerm }} - {{- else if eq $.currentOrdersectionsby "date" }} - {{- template "childs" dict "menu" $pages.ByDate "containerstyle" $.containerstyle "style" $.style "showhidden" $.showhidden "count" (add $.count 1) "depth" $.depth "pages" $.pages "description" $.description "sortTerm" $.sortTerm }} - {{- else if eq $.currentOrdersectionsby "length" }} - {{- template "childs" dict "menu" $pages.ByLength "containerstyle" $.containerstyle "style" $.style "showhidden" $.showhidden "count" (add $.count 1) "depth" $.depth "pages" $.pages "description" $.description "sortTerm" $.sortTerm }} - {{- else }} - {{- template "childs" dict "menu" $pages "containerstyle" $.containerstyle "style" $.style "showhidden" $.showhidden "count" (add $.count 1) "depth" $.depth "pages" $.pages "description" $.description "sortTerm" $.sortTerm }} - {{- end }} - - {{- if eq $.style "li" }} -{{- (printf "" $.containerstyle)|safeHTML }} - {{- end }} - {{- end }} - {{- end }} - {{- end }} -{{- end }} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/layouts/shortcodes/expand.html b/subsite/docs/themes/hugo-relearn/layouts/shortcodes/expand.html deleted file mode 100644 index 4de845a..0000000 --- a/subsite/docs/themes/hugo-relearn/layouts/shortcodes/expand.html +++ /dev/null @@ -1,19 +0,0 @@ -{{- $_hugo_config := `{ "version": 1 }` }} -{{- $title := .Get 0 | default (T "Expand-title") }} -{{- $content := .Inner | safeHTML }} -{{- $expanded := eq (.Get 1) "true" }} -
    - {{/* things are getting complicated when search tries to open the expand box while jquery sets the display CSS on the element */}} - - - - {{ $title }} - -
    - {{ $content }} -
    -
    \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/layouts/shortcodes/include.html b/subsite/docs/themes/hugo-relearn/layouts/shortcodes/include.html deleted file mode 100644 index a7dc2bf..0000000 --- a/subsite/docs/themes/hugo-relearn/layouts/shortcodes/include.html +++ /dev/null @@ -1,7 +0,0 @@ -{{- $file := .Get 0 }} -{{- $showFirstHeading := .Get 1 | default true }} -{{- if not $showFirstHeading }}
    {{ end }} - -{{ $file | readFile | safeHTML }} - -{{- if not $showFirstHeading }}
    {{ end }} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/layouts/shortcodes/mermaid.html b/subsite/docs/themes/hugo-relearn/layouts/shortcodes/mermaid.html deleted file mode 100644 index a3e99e1..0000000 --- a/subsite/docs/themes/hugo-relearn/layouts/shortcodes/mermaid.html +++ /dev/null @@ -1,4 +0,0 @@ -{{- $_hugo_config := `{ "version": 1 }` }} -
    - {{- safeHTML .Inner -}} -
    diff --git a/subsite/docs/themes/hugo-relearn/layouts/shortcodes/notice.html b/subsite/docs/themes/hugo-relearn/layouts/shortcodes/notice.html deleted file mode 100644 index c8f773d..0000000 --- a/subsite/docs/themes/hugo-relearn/layouts/shortcodes/notice.html +++ /dev/null @@ -1,7 +0,0 @@ -{{- $_hugo_config := `{ "version": 1 }` }} -{{- $style := .Get 0 }} -{{- $title := .Get 1 | default ($style | T) }} -
    -
    {{ $title }}
    - {{- .Inner }} -
    \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/layouts/shortcodes/ref.html b/subsite/docs/themes/hugo-relearn/layouts/shortcodes/ref.html deleted file mode 100644 index 67dbd94..0000000 --- a/subsite/docs/themes/hugo-relearn/layouts/shortcodes/ref.html +++ /dev/null @@ -1,14 +0,0 @@ -{{- if in (.Get 0) "/_index.md" -}} - {{- $paths := (split (.Get 0) "_index.md") -}} - {{- $pagepath := index $paths 0 -}} - {{- $anchor := index $paths 1 -}} - {{- with .Site.GetPage "section" (trim $pagepath "/") -}} - {{- ( printf "%s%s" $pagepath $anchor ) | relLangURL -}} - {{- end -}} -{{- else -}} - {{- with .Site.GetPage "section" (.Get 0) }} - {{- .RelPermalink -}} - {{- else -}} - {{- .Get 0 | relref .Page -}} - {{- end -}} -{{- end -}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/layouts/shortcodes/relref.html b/subsite/docs/themes/hugo-relearn/layouts/shortcodes/relref.html deleted file mode 100644 index 67dbd94..0000000 --- a/subsite/docs/themes/hugo-relearn/layouts/shortcodes/relref.html +++ /dev/null @@ -1,14 +0,0 @@ -{{- if in (.Get 0) "/_index.md" -}} - {{- $paths := (split (.Get 0) "_index.md") -}} - {{- $pagepath := index $paths 0 -}} - {{- $anchor := index $paths 1 -}} - {{- with .Site.GetPage "section" (trim $pagepath "/") -}} - {{- ( printf "%s%s" $pagepath $anchor ) | relLangURL -}} - {{- end -}} -{{- else -}} - {{- with .Site.GetPage "section" (.Get 0) }} - {{- .RelPermalink -}} - {{- else -}} - {{- .Get 0 | relref .Page -}} - {{- end -}} -{{- end -}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/layouts/shortcodes/siteparam.html b/subsite/docs/themes/hugo-relearn/layouts/shortcodes/siteparam.html deleted file mode 100644 index 20cd2ca..0000000 --- a/subsite/docs/themes/hugo-relearn/layouts/shortcodes/siteparam.html +++ /dev/null @@ -1,7 +0,0 @@ -{{- $paramName := (.Get 0) -}} -{{- $siteParams := .Site.Params -}} -{{- with $paramName -}} - {{- with $siteParams -}} - {{- index . (lower $paramName) -}} - {{- end -}} -{{- end -}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/layouts/shortcodes/tab.html b/subsite/docs/themes/hugo-relearn/layouts/shortcodes/tab.html deleted file mode 100644 index 661af36..0000000 --- a/subsite/docs/themes/hugo-relearn/layouts/shortcodes/tab.html +++ /dev/null @@ -1,11 +0,0 @@ -{{ if .Parent }} - {{ $name := trim (.Get "name") " " }} - {{ if not (.Parent.Scratch.Get "tabs") }} - {{ .Parent.Scratch.Set "tabs" slice }} - {{ end }} - {{ with .Inner }} - {{ $.Parent.Scratch.Add "tabs" (dict "name" $name "content" . ) }} - {{ end }} -{{ else }} - {{- errorf "[%s] %q: tab shortcode missing its parent" site.Language.Lang .Page.Path -}} -{{ end}} diff --git a/subsite/docs/themes/hugo-relearn/layouts/shortcodes/tabs.html b/subsite/docs/themes/hugo-relearn/layouts/shortcodes/tabs.html deleted file mode 100644 index e39cd20..0000000 --- a/subsite/docs/themes/hugo-relearn/layouts/shortcodes/tabs.html +++ /dev/null @@ -1,21 +0,0 @@ -{{- with .Inner }}{{/* don't do anything, just call it */}}{{ end }} -{{- $groupId := default "default" (.Get "groupId") }} -
    -
    - {{- range $idx, $tab := .Scratch.Get "tabs" }} - - {{- end }} -
    -
    - {{- range $idx, $tab := .Scratch.Get "tabs" }} -
    -{{ .content }} -
    - {{- end }} -
    -
    diff --git a/subsite/docs/themes/hugo-relearn/static/css/auto-complete.css b/subsite/docs/themes/hugo-relearn/static/css/auto-complete.css deleted file mode 100644 index 082a1f5..0000000 --- a/subsite/docs/themes/hugo-relearn/static/css/auto-complete.css +++ /dev/null @@ -1,48 +0,0 @@ -.autocomplete-suggestions { - text-align: left; - cursor: default; - border: 1px solid #ccc; - border-top: 0; - background: #fff; - box-shadow: -1px 1px 3px rgba(0,0,0,.1); - - /* core styles should not be changed */ - position: absolute; - display: none; - z-index: 9999; - max-height: 254px; - overflow: hidden; - overflow-y: auto; - box-sizing: border-box; -} -.autocomplete-suggestion { - position: relative; - cursor: pointer; - padding: 7px; - line-height: 23px; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - color: #333; -} - -.autocomplete-suggestion b { - font-weight: normal; - color: #1f8dd6; -} - -.autocomplete-suggestion.selected { - background: #333; - color: #fff; -} - -.autocomplete-suggestion:hover { - background: #444; - color: #fff; -} - -.autocomplete-suggestion > .context { - font-size: 12px; - overflow: hidden; - text-overflow: ellipsis; -} diff --git a/subsite/docs/themes/hugo-relearn/static/css/featherlight.min.css b/subsite/docs/themes/hugo-relearn/static/css/featherlight.min.css deleted file mode 100644 index 058487f..0000000 --- a/subsite/docs/themes/hugo-relearn/static/css/featherlight.min.css +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Featherlight - ultra slim jQuery lightbox - * Version 1.7.13 - http://noelboss.github.io/featherlight/ - * - * Copyright 2018, Noël Raoul Bossart (http://www.noelboss.com) - * MIT Licensed. -**/ -html.with-featherlight{overflow:hidden}.featherlight{display:none;position:fixed;top:0;right:0;bottom:0;left:0;z-index:2147483647;text-align:center;white-space:nowrap;cursor:pointer;background:#333;background:rgba(0,0,0,0)}.featherlight:last-of-type{background:rgba(0,0,0,.8)}.featherlight:before{content:'';display:inline-block;height:100%;vertical-align:middle}.featherlight .featherlight-content{position:relative;text-align:left;vertical-align:middle;display:inline-block;overflow:auto;padding:25px 25px 0;border-bottom:25px solid transparent;margin-left:5%;margin-right:5%;max-height:95%;background:#fff;cursor:auto;white-space:normal}.featherlight .featherlight-inner{display:block}.featherlight link.featherlight-inner,.featherlight script.featherlight-inner,.featherlight style.featherlight-inner{display:none}.featherlight .featherlight-close-icon{position:absolute;z-index:9999;top:0;right:0;line-height:25px;width:25px;cursor:pointer;text-align:center;font-family:Arial,sans-serif;background:#fff;background:rgba(255,255,255,.3);color:#000;border:0;padding:0}.featherlight .featherlight-close-icon::-moz-focus-inner{border:0;padding:0}.featherlight .featherlight-image{width:100%}.featherlight-iframe .featherlight-content{border-bottom:0;padding:0;-webkit-overflow-scrolling:touch}.featherlight iframe{border:0}.featherlight *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@media only screen and (max-width:1024px){.featherlight .featherlight-content{margin-left:0;margin-right:0;max-height:98%;padding:10px 10px 0;border-bottom:10px solid transparent}}@media print{html.with-featherlight>*>:not(.featherlight){display:none}} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/static/css/fontawesome-all.min.css b/subsite/docs/themes/hugo-relearn/static/css/fontawesome-all.min.css deleted file mode 100644 index ac76ff1..0000000 --- a/subsite/docs/themes/hugo-relearn/static/css/fontawesome-all.min.css +++ /dev/null @@ -1,5 +0,0 @@ -/*! - * Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - */ -.fa,.fab,.fad,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-bacteria:before{content:"\e059"}.fa-bacterium:before{content:"\e05a"}.fa-bahai:before{content:"\f666"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-box-tissue:before{content:"\e05b"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buy-n-large:before{content:"\f8a6"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caravan:before{content:"\f8ff"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudflare:before{content:"\e07d"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-alt:before{content:"\f422"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-cotton-bureau:before{content:"\f89e"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dailymotion:before{content:"\e052"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-deezer:before{content:"\e077"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-disease:before{content:"\f7fa"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edge-legacy:before{content:"\e078"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-alt:before{content:"\f424"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-faucet:before{content:"\e005"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-firefox-browser:before{content:"\e007"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-pay:before{content:"\e079"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guilded:before{content:"\e07e"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-holding-water:before{content:"\f4c1"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-sparkles:before{content:"\e05d"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-hands-wash:before{content:"\e05e"}.fa-handshake:before{content:"\f2b5"}.fa-handshake-alt-slash:before{content:"\e05f"}.fa-handshake-slash:before{content:"\e060"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-hat-wizard:before{content:"\f6e8"}.fa-hdd:before{content:"\f0a0"}.fa-head-side-cough:before{content:"\e061"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-head-side-mask:before{content:"\e063"}.fa-head-side-virus:before{content:"\e064"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hive:before{content:"\e07f"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hospital-user:before{content:"\f80d"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-house-user:before{content:"\e065"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-ideal:before{content:"\e013"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-innosoft:before{content:"\e080"}.fa-instagram:before{content:"\f16d"}.fa-instagram-square:before{content:"\e055"}.fa-instalod:before{content:"\e081"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-house:before{content:"\e066"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lungs:before{content:"\f604"}.fa-lungs-virus:before{content:"\e067"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-mdb:before{content:"\f8ca"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microblog:before{content:"\e01a"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mixer:before{content:"\e056"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse:before{content:"\f8cc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-octopus-deploy:before{content:"\e082"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-orcid:before{content:"\f8d2"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-arrows:before{content:"\e068"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-perbyte:before{content:"\e083"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-square:before{content:"\e01e"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-plane-slash:before{content:"\e069"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pump-medical:before{content:"\e06a"}.fa-pump-soap:before{content:"\e06b"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-record-vinyl:before{content:"\f8d9"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-rust:before{content:"\e07a"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-shield-virus:before{content:"\e06c"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopify:before{content:"\e057"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sink:before{content:"\e06d"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-soap:before{content:"\e06e"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-stopwatch-20:before{content:"\e06f"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-store-alt-slash:before{content:"\e070"}.fa-store-slash:before{content:"\e071"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swift:before{content:"\f8e1"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-tiktok:before{content:"\e07b"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-trailer:before{content:"\e041"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbraco:before{content:"\f8e8"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-uncharted:before{content:"\e084"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-unity:before{content:"\e049"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-unsplash:before{content:"\e07c"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-users-slash:before{content:"\e073"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-vest:before{content:"\e085"}.fa-vest-patches:before{content:"\e086"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-virus:before{content:"\e074"}.fa-virus-slash:before{content:"\e075"}.fa-viruses:before{content:"\e076"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-watchman-monitoring:before{content:"\e087"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wodu:before{content:"\e088"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.fab,.far{font-weight:400}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:"Font Awesome 5 Free"}.fa,.fas{font-weight:900} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/static/css/nucleus.css b/subsite/docs/themes/hugo-relearn/static/css/nucleus.css deleted file mode 100644 index f3a8c16..0000000 --- a/subsite/docs/themes/hugo-relearn/static/css/nucleus.css +++ /dev/null @@ -1,611 +0,0 @@ -*, *::before, *::after { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; } - -@-webkit-viewport { - width: device-width; } -@-moz-viewport { - width: device-width; } -@-ms-viewport { - width: device-width; } -@-o-viewport { - width: device-width; } -@viewport { - width: device-width; } -html { - font-size: 100%; - -ms-text-size-adjust: 100%; - -webkit-text-size-adjust: 100%; } - -body { - margin: 0; } - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -main, -nav, -section, -summary { - display: block; } - -audio, -canvas, -progress, -video { - display: inline-block; - vertical-align: baseline; } - -audio:not([controls]) { - display: none; - height: 0; } - -[hidden], -template { - display: none; } - -a { - background: transparent; - text-decoration: none; } - -a:active, -a:hover { - outline: 0; } - -abbr[title] { - border-bottom: 1px dotted; } - -b, -strong { - font-weight: bold; } - -dfn { - font-style: italic; } - -mark { - background: #FFFF27; - color: #333; } - -sub, -sup { - font-size: 0.8rem; - line-height: 0; - position: relative; - vertical-align: baseline; } - -sup { - top: -0.5em; } - -sub { - bottom: -0.25em; } - -img { - border: 0; - max-width: 100%; } - -svg:not(:root) { - overflow: hidden; } - -figure { - margin: 1em 40px; } - -hr { - height: 0; } - -pre { - overflow: auto; } - -button, -input, -optgroup, -select, -textarea { - color: inherit; - font: inherit; - margin: 0; } - -button { - overflow: visible; } - -button, -select { - text-transform: none; } - -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; - cursor: pointer; } - -button[disabled], -html input[disabled] { - cursor: default; } - -button::-moz-focus-inner, -input::-moz-focus-inner { - border: 0; - padding: 0; } - -input { - line-height: normal; } - -input[type="checkbox"], -input[type="radio"] { - padding: 0; } - -input[type="number"]::-webkit-inner-spin-button, -input[type="number"]::-webkit-outer-spin-button { - height: auto; } - -input[type="search"] { - -webkit-appearance: textfield; } - -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; } - -legend { - border: 0; - padding: 0; } - -textarea { - overflow: auto; } - -optgroup { - font-weight: bold; } - -table { - border-collapse: collapse; - border-spacing: 0; - table-layout: fixed; - width: 100%; } - -tr, td, th { - vertical-align: middle; } - -th, td { - padding: 0.425rem 0; } - -th { - text-align: left; } - -.container { - width: 75em; - margin: 0 auto; - padding: 0; } - @media only all and (min-width: 60em) and (max-width: 74.938em) { - .container { - width: 60em; } } - @media only all and (min-width: 48em) and (max-width: 59.938em) { - .container { - width: 48em; } } - @media only all and (min-width: 30.063em) and (max-width: 47.938em) { - .container { - width: 30em; } } - @media only all and (max-width: 30em) { - .container { - width: 100%; } } - -.grid { - display: -webkit-box; - display: -moz-box; - display: box; - display: -webkit-flex; - display: -moz-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex-flow: row; - -moz-flex-flow: row; - flex-flow: row; - list-style: none; - margin: 0; - padding: 0; } - @media only all and (max-width: 47.938em) { - .grid { - -webkit-flex-flow: row wrap; - -moz-flex-flow: row wrap; - flex-flow: row wrap; } } - -.block { - -webkit-box-flex: 1; - -moz-box-flex: 1; - box-flex: 1; - -webkit-flex: 1; - -moz-flex: 1; - -ms-flex: 1; - flex: 1; - min-width: 0; - min-height: 0; } - @media only all and (max-width: 47.938em) { - .block { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 100%; - -moz-flex: 0 100%; - -ms-flex: 0 100%; - flex: 0 100%; } } - -@media only all and (max-width: 47.938em) { - body [class*="size-"] { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 100%; - -moz-flex: 0 100%; - -ms-flex: 0 100%; - flex: 0 100%; } } - -.size-1-2 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 50%; - -moz-flex: 0 50%; - -ms-flex: 0 50%; - flex: 0 50%; } - -.size-1-3 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 33.33333%; - -moz-flex: 0 33.33333%; - -ms-flex: 0 33.33333%; - flex: 0 33.33333%; } - -.size-1-4 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 25%; - -moz-flex: 0 25%; - -ms-flex: 0 25%; - flex: 0 25%; } - -.size-1-5 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 20%; - -moz-flex: 0 20%; - -ms-flex: 0 20%; - flex: 0 20%; } - -.size-1-6 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 16.66667%; - -moz-flex: 0 16.66667%; - -ms-flex: 0 16.66667%; - flex: 0 16.66667%; } - -.size-1-7 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 14.28571%; - -moz-flex: 0 14.28571%; - -ms-flex: 0 14.28571%; - flex: 0 14.28571%; } - -.size-1-8 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 12.5%; - -moz-flex: 0 12.5%; - -ms-flex: 0 12.5%; - flex: 0 12.5%; } - -.size-1-9 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 11.11111%; - -moz-flex: 0 11.11111%; - -ms-flex: 0 11.11111%; - flex: 0 11.11111%; } - -.size-1-10 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 10%; - -moz-flex: 0 10%; - -ms-flex: 0 10%; - flex: 0 10%; } - -.size-1-11 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 9.09091%; - -moz-flex: 0 9.09091%; - -ms-flex: 0 9.09091%; - flex: 0 9.09091%; } - -.size-1-12 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 8.33333%; - -moz-flex: 0 8.33333%; - -ms-flex: 0 8.33333%; - flex: 0 8.33333%; } - -@media only all and (min-width: 48em) and (max-width: 59.938em) { - .size-tablet-1-2 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 50%; - -moz-flex: 0 50%; - -ms-flex: 0 50%; - flex: 0 50%; } - - .size-tablet-1-3 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 33.33333%; - -moz-flex: 0 33.33333%; - -ms-flex: 0 33.33333%; - flex: 0 33.33333%; } - - .size-tablet-1-4 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 25%; - -moz-flex: 0 25%; - -ms-flex: 0 25%; - flex: 0 25%; } - - .size-tablet-1-5 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 20%; - -moz-flex: 0 20%; - -ms-flex: 0 20%; - flex: 0 20%; } - - .size-tablet-1-6 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 16.66667%; - -moz-flex: 0 16.66667%; - -ms-flex: 0 16.66667%; - flex: 0 16.66667%; } - - .size-tablet-1-7 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 14.28571%; - -moz-flex: 0 14.28571%; - -ms-flex: 0 14.28571%; - flex: 0 14.28571%; } - - .size-tablet-1-8 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 12.5%; - -moz-flex: 0 12.5%; - -ms-flex: 0 12.5%; - flex: 0 12.5%; } - - .size-tablet-1-9 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 11.11111%; - -moz-flex: 0 11.11111%; - -ms-flex: 0 11.11111%; - flex: 0 11.11111%; } - - .size-tablet-1-10 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 10%; - -moz-flex: 0 10%; - -ms-flex: 0 10%; - flex: 0 10%; } - - .size-tablet-1-11 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 9.09091%; - -moz-flex: 0 9.09091%; - -ms-flex: 0 9.09091%; - flex: 0 9.09091%; } - - .size-tablet-1-12 { - -webkit-box-flex: 0; - -moz-box-flex: 0; - box-flex: 0; - -webkit-flex: 0 8.33333%; - -moz-flex: 0 8.33333%; - -ms-flex: 0 8.33333%; - flex: 0 8.33333%; } } -@media only all and (max-width: 47.938em) { - @supports not (flex-wrap: wrap) { - .grid { - display: block; - -webkit-box-lines: inherit; - -moz-box-lines: inherit; - box-lines: inherit; - -webkit-flex-wrap: inherit; - -moz-flex-wrap: inherit; - -ms-flex-wrap: inherit; - flex-wrap: inherit; } - - .block { - display: block; - -webkit-box-flex: inherit; - -moz-box-flex: inherit; - box-flex: inherit; - -webkit-flex: inherit; - -moz-flex: inherit; - -ms-flex: inherit; - flex: inherit; } } } -.first-block { - -webkit-box-ordinal-group: 0; - -webkit-order: -1; - -ms-flex-order: -1; - order: -1; } - -.last-block { - -webkit-box-ordinal-group: 2; - -webkit-order: 1; - -ms-flex-order: 1; - order: 1; } - -.fixed-blocks { - -webkit-flex-flow: row wrap; - -moz-flex-flow: row wrap; - flex-flow: row wrap; } - .fixed-blocks .block { - -webkit-box-flex: inherit; - -moz-box-flex: inherit; - box-flex: inherit; - -webkit-flex: inherit; - -moz-flex: inherit; - -ms-flex: inherit; - flex: inherit; - width: 25%; } - @media only all and (min-width: 60em) and (max-width: 74.938em) { - .fixed-blocks .block { - width: 33.33333%; } } - @media only all and (min-width: 48em) and (max-width: 59.938em) { - .fixed-blocks .block { - width: 50%; } } - @media only all and (max-width: 47.938em) { - .fixed-blocks .block { - width: 100%; } } - -body { - font-size: 1rem; - line-height: 1.5; } - -h1, h2, h3, h4, h5, h6 { - margin: 0.85rem 0 1rem 0; - text-rendering: optimizeLegibility; } - -h1 { - font-size: 3.25rem; } - -h2 { - font-size: 2.55rem; } - -h3 { - font-size: 2.15rem; } - -h4 { - font-size: 1.8rem; } - -h5 { - font-size: 1.4rem; } - -h6 { - font-size: 0.9rem; } - -p { - margin: 1rem 0; } - -ul, ol { - margin-top: 1rem; - margin-bottom: 1rem; } - ul ul, ul ol, ol ul, ol ol { - margin-top: 0; - margin-bottom: 0; } - -blockquote { - margin: 1.5rem 0; - padding-left: 0.85rem; } - -cite { - display: block; - font-size: 0.925rem; } - cite:before { - content: "\2014 \0020"; } - -pre { - margin: 1.5rem 0; - padding: 0.938rem; } - -code { - vertical-align: bottom; } - -small { - font-size: 0.925rem; } - -hr { - border-left: none; - border-right: none; - border-top: none; - margin: 1.5rem 0; } - -fieldset { - border: 0; - padding: 0.938rem; - margin: 0 0 1rem 0; } - -input, -label, -select { - display: block; } - -label { - margin-bottom: 0.425rem; } - label.required:after { - content: "*"; } - label abbr { - display: none; } - -textarea, input[type="email"], input[type="number"], input[type="password"], input[type="search"], input[type="tel"], input[type="text"], input[type="url"], input[type="color"], input[type="date"], input[type="datetime"], input[type="datetime-local"], input[type="month"], input[type="time"], input[type="week"], select[multiple=multiple] { - -webkit-transition: border-color; - -moz-transition: border-color; - transition: border-color; - border-radius: 0.1875rem; - margin-bottom: 0.85rem; - padding: 0.425rem 0.425rem; - width: 100%; } - textarea:focus, input[type="email"]:focus, input[type="number"]:focus, input[type="password"]:focus, input[type="search"]:focus, input[type="tel"]:focus, input[type="text"]:focus, input[type="url"]:focus, input[type="color"]:focus, input[type="date"]:focus, input[type="datetime"]:focus, input[type="datetime-local"]:focus, input[type="month"]:focus, input[type="time"]:focus, input[type="week"]:focus, select[multiple=multiple]:focus { - outline: none; } - -textarea { - resize: vertical; } - -input[type="checkbox"], input[type="radio"] { - display: inline; - margin-right: 0.425rem; } - -input[type="file"] { - width: 100%; } - -select { - width: auto; - max-width: 100%; - margin-bottom: 1rem; } - -button, -input[type="submit"] { - cursor: pointer; - user-select: none; - vertical-align: middle; - white-space: nowrap; - border: inherit; } diff --git a/subsite/docs/themes/hugo-relearn/static/css/perfect-scrollbar.min.css b/subsite/docs/themes/hugo-relearn/static/css/perfect-scrollbar.min.css deleted file mode 100644 index ebd2cb4..0000000 --- a/subsite/docs/themes/hugo-relearn/static/css/perfect-scrollbar.min.css +++ /dev/null @@ -1,2 +0,0 @@ -/* perfect-scrollbar v0.6.13 */ -.ps-container{-ms-touch-action:auto;touch-action:auto;overflow:hidden !important;-ms-overflow-style:none}@supports (-ms-overflow-style: none){.ps-container{overflow:auto !important}}@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none){.ps-container{overflow:auto !important}}.ps-container.ps-active-x>.ps-scrollbar-x-rail,.ps-container.ps-active-y>.ps-scrollbar-y-rail{display:block;background-color:transparent}.ps-container.ps-in-scrolling.ps-x>.ps-scrollbar-x-rail{background-color:#eee;opacity:.9}.ps-container.ps-in-scrolling.ps-x>.ps-scrollbar-x-rail>.ps-scrollbar-x{background-color:#999;height:11px}.ps-container.ps-in-scrolling.ps-y>.ps-scrollbar-y-rail{background-color:#eee;opacity:.9}.ps-container.ps-in-scrolling.ps-y>.ps-scrollbar-y-rail>.ps-scrollbar-y{background-color:#999;width:11px}.ps-container>.ps-scrollbar-x-rail{display:none;position:absolute;opacity:0;-webkit-transition:background-color .2s linear, opacity .2s linear;-o-transition:background-color .2s linear, opacity .2s linear;-moz-transition:background-color .2s linear, opacity .2s linear;transition:background-color .2s linear, opacity .2s linear;bottom:0px;height:15px}.ps-container>.ps-scrollbar-x-rail>.ps-scrollbar-x{position:absolute;background-color:#aaa;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-transition:background-color .2s linear, height .2s linear, width .2s ease-in-out, -webkit-border-radius .2s ease-in-out;transition:background-color .2s linear, height .2s linear, width .2s ease-in-out, -webkit-border-radius .2s ease-in-out;-o-transition:background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out;-moz-transition:background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out, -moz-border-radius .2s ease-in-out;transition:background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out;transition:background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out, -webkit-border-radius .2s ease-in-out, -moz-border-radius .2s ease-in-out;bottom:2px;height:6px}.ps-container>.ps-scrollbar-x-rail:hover>.ps-scrollbar-x,.ps-container>.ps-scrollbar-x-rail:active>.ps-scrollbar-x{height:11px}.ps-container>.ps-scrollbar-y-rail{display:none;position:absolute;opacity:0;-webkit-transition:background-color .2s linear, opacity .2s linear;-o-transition:background-color .2s linear, opacity .2s linear;-moz-transition:background-color .2s linear, opacity .2s linear;transition:background-color .2s linear, opacity .2s linear;right:0;width:15px}.ps-container>.ps-scrollbar-y-rail>.ps-scrollbar-y{position:absolute;background-color:#aaa;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-transition:background-color .2s linear, height .2s linear, width .2s ease-in-out, -webkit-border-radius .2s ease-in-out;transition:background-color .2s linear, height .2s linear, width .2s ease-in-out, -webkit-border-radius .2s ease-in-out;-o-transition:background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out;-moz-transition:background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out, -moz-border-radius .2s ease-in-out;transition:background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out;transition:background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out, -webkit-border-radius .2s ease-in-out, -moz-border-radius .2s ease-in-out;right:2px;width:6px}.ps-container>.ps-scrollbar-y-rail:hover>.ps-scrollbar-y,.ps-container>.ps-scrollbar-y-rail:active>.ps-scrollbar-y{width:11px}.ps-container:hover.ps-in-scrolling.ps-x>.ps-scrollbar-x-rail{background-color:#eee;opacity:.9}.ps-container:hover.ps-in-scrolling.ps-x>.ps-scrollbar-x-rail>.ps-scrollbar-x{background-color:#999;height:11px}.ps-container:hover.ps-in-scrolling.ps-y>.ps-scrollbar-y-rail{background-color:#eee;opacity:.9}.ps-container:hover.ps-in-scrolling.ps-y>.ps-scrollbar-y-rail>.ps-scrollbar-y{background-color:#999;width:11px}.ps-container:hover>.ps-scrollbar-x-rail,.ps-container:hover>.ps-scrollbar-y-rail{opacity:.6}.ps-container:hover>.ps-scrollbar-x-rail:hover{background-color:#eee;opacity:.9}.ps-container:hover>.ps-scrollbar-x-rail:hover>.ps-scrollbar-x{background-color:#999}.ps-container:hover>.ps-scrollbar-y-rail:hover{background-color:#eee;opacity:.9}.ps-container:hover>.ps-scrollbar-y-rail:hover>.ps-scrollbar-y{background-color:#999} diff --git a/subsite/docs/themes/hugo-relearn/static/css/print.css b/subsite/docs/themes/hugo-relearn/static/css/print.css deleted file mode 100644 index 3ae4ef9..0000000 --- a/subsite/docs/themes/hugo-relearn/static/css/print.css +++ /dev/null @@ -1,109 +0,0 @@ -#body #navigation { - display: none; -} -html, -body #body{ - font-size: 8.9pt; -} -pre code { - font-size: 8.3pt; -} -#body .padding { - /* remove page padding - this can be set exactly in the print setup */ - padding: 0; -} -code.copy-to-clipboard-inline { - border-bottom-right-radius: 2px; - border-top-right-radius: 2px; - border-right-width: 1px; -} -pre { - border: 1px solid #ccc; -} -#body #top-bar{ - background-color: #fff; /* avoid background bleeding*/ - border-bottom: 1px solid #ddd; - border-radius: 0; - padding-left: 0; /* for print, we want to align with the footer to ease the layout */ - color: #777; -} -#top-github-link { - /* we don't need this while printing */ - display: none; -} -#body #breadcrumbs { - width: 100%; -} -#body #breadcrumbs .links { - overflow-x: hidden; -} -.copy-to-clipboard { - display: none; -} - -#body h1, #body h2, #body h3, #body h4, #body h5, #body h6 { - /* better contrast for colored elements */ - color: black !important; -} -#body th, #body td, -#body code, #body strong, #body b, -#body li, #body dd, #body dt, -#body p, -#body .anchor, -#body a { - /* better contrast for colored elements */ - color: black; -} - -.progress { - /* we don't need this while printing */ - display: none !important; -} -hr{ - border-bottom: 1px solid #ddd; -} -#chapter h1 { - border-bottom: 1px solid #ddd; -} -.footline { - /* in print mode show footer line to signal reader the end of document */ - border-top: 1px solid #ddd; - color: #777; - margin-top: 1.5rem; - padding-top: .75rem; -} -#body #body-inner a { - /* in print we want to distinguish links in our content from - normal text even if printed black/white; - don't use a.highlight in selector to also get links that are - put as HTML into markdown */ - text-decoration-line: underline; -} -#toc-menu { - /* we don't need this while printing */ - display: none; -} -#sidebar-toggle-span { - /* we don't need this while printing */ - display: none; -} -#breadcrumbs .links { - display: inline; -} -#top-bar{ - /* the header is sticky which is not suitable for print; */ - position: inherit; /* IE11 doesn't know "initial" here */ -} -#top-bar.is-sticky { - box-shadow: initial; -} -#body .tab-nav-button:not(.active) { - opacity: .5; -} -#head-tags { - display: none; -} -mark { - background: inherit; - color: inherit; -} \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/static/css/tabs.css b/subsite/docs/themes/hugo-relearn/static/css/tabs.css deleted file mode 100644 index 98879d4..0000000 --- a/subsite/docs/themes/hugo-relearn/static/css/tabs.css +++ /dev/null @@ -1,57 +0,0 @@ -#body .tab-nav-button { - border-width: 1px 1px 1px 1px !important; - border-color: #ccc !important; - border-radius: 4px 4px 0 0 !important; - background-color: #eaeaea !important; - -webkit-print-color-adjust: exact; - color-adjust: exact; - float: left; - display: block; - position: relative; - margin-left: 4px; - bottom: -1px; -} -#body .tab-nav-button:first-child { - margin-left: 9px; -} -#body .tab-nav-button.active { - background-color: #fff !important; - border-bottom-color: #fff !important; -} -#body .tab-nav-button:not(.active) { - border-bottom-color: #ddd !important; - margin-top: 7px; - padding-bottom: 2px !important; - padding-top: 2px !important; -} -#body .tab-nav-button:not(.active) span { - opacity: .8; -} -#body .tab-panel { - margin-top: 1.5rem; - margin-bottom: 1.5rem; -} -#body .tab-content { - background-color: #fff; - clear: both; - -webkit-print-color-adjust: exact; - color-adjust: exact; - display: block; - padding: 8px; - border-width: 1px; - border-style: solid; - border-color: #ccc; - z-index: 10; -} -#body .tab-content .tab-item{ - display: none; -} - -#body .tab-content .tab-item.active{ - display: block; -} - -#body .tab-item pre{ - margin-bottom: 0; - margin-top: 0; -} diff --git a/subsite/docs/themes/hugo-relearn/static/css/tags.css b/subsite/docs/themes/hugo-relearn/static/css/tags.css deleted file mode 100644 index f829e8a..0000000 --- a/subsite/docs/themes/hugo-relearn/static/css/tags.css +++ /dev/null @@ -1,49 +0,0 @@ -/* Tags */ - -#head-tags{ - margin-left:1em; - margin-top:1em; -} - -#body .tags a.tag-link { - display: inline-block; - line-height: 2em; - font-size: 0.8em; - position: relative; - margin: 0 16px 8px 0; - padding: 0 10px 0 12px; - background: #8451a1; - - -webkit-border-bottom-right-radius: 3px; - border-bottom-right-radius: 3px; - -webkit-border-top-right-radius: 3px; - border-top-right-radius: 3px; - - -webkit-box-shadow: 0 1px 2px rgba(0,0,0,0.2); - box-shadow: 0 1px 2px rgba(0,0,0,0.2); - color: #fff; -} - -#body .tags a.tag-link:before { - content: ""; - position: absolute; - top:0; - left: -.99em; - width: 0; - height: 0; - border-color: transparent #8451a1 transparent transparent; - border-style: solid; - border-width: 1em 1em 1em 0; -} - -#body .tags a.tag-link:after { - content: ""; - position: absolute; - top: 10px; - left: 1px; - width: 5px; - height: 5px; - -webkit-border-radius: 50%; - border-radius: 100%; - background: #fff; -} diff --git a/subsite/docs/themes/hugo-relearn/static/css/theme-blue.css b/subsite/docs/themes/hugo-relearn/static/css/theme-blue.css deleted file mode 100644 index 1b259fa..0000000 --- a/subsite/docs/themes/hugo-relearn/static/css/theme-blue.css +++ /dev/null @@ -1,30 +0,0 @@ -:root { - --MAIN-TEXT-color: #323232; /* Color of text by default */ - --MAIN-TITLES-TEXT-color: #5e5e5e; /* Color of titles h2-h3-h4-h5-h6 */ - --MAIN-LINK-color: #1C90F3; /* Color of links */ - --MAIN-LINK-HOVER-color: #167ad0; /* Color of hovered links */ - --MAIN-ANCHOR-color: #1C90F3; /* color of anchors on titles */ - - --MAIN-CODE-color: #e2e4e5; /* fallback color for code background */ - --MAIN-CODE-BG-color: #282a36; /* fallback color for code text */ - - --MENU-HOME-LINK-color: #323232; /* Color of the home button text */ - --MENU-HOME-LINK-HOVER-color: #5e5e5e; /* Color of the hovered home button text */ - - --MENU-HEADER-BG-color: #1C90F3; /* Background color of menu header */ - --MENU-HEADER-BORDER-color: #33a1ff; /*Color of menu header border */ - - --MENU-SEARCH-BG-color: #167ad0; /* Search field background color (by default borders + icons) */ - --MENU-SEARCH-BOX-color: #33a1ff; /* Override search field border color */ - --MENU-SEARCH-BOX-ICONS-color: #a1d2fd; /* Override search field icons color */ - - --MENU-SECTIONS-ACTIVE-BG-color: #20272b; /* Background color of the active section and its children */ - --MENU-SECTIONS-BG-color: #252c31; /* Background color of other sections */ - --MENU-SECTIONS-LINK-color: #ccc; /* Color of links in menu */ - --MENU-SECTIONS-LINK-HOVER-color: #e6e6e6; /* Color of links in menu, when hovered */ - --MENU-SECTION-ACTIVE-CATEGORY-color: #777; /* Color of active category text */ - --MENU-SECTION-ACTIVE-CATEGORY-BG-color: #fff; /* Color of background for the active category (only) */ - - --MENU-VISITED-color: #33a1ff; /* Color of 'page visited' icons in menu */ - --MENU-SECTION-HR-color: #20272b; /* Color of
    separator in menu */ -} diff --git a/subsite/docs/themes/hugo-relearn/static/css/theme-green.css b/subsite/docs/themes/hugo-relearn/static/css/theme-green.css deleted file mode 100644 index 983a612..0000000 --- a/subsite/docs/themes/hugo-relearn/static/css/theme-green.css +++ /dev/null @@ -1,30 +0,0 @@ -:root { - --MAIN-TEXT-color: #323232; /* Color of text by default */ - --MAIN-TITLES-TEXT-color: #5e5e5e; /* Color of titles h2-h3-h4-h5-h6 */ - --MAIN-LINK-color: #599a3e; /* Color of links */ - --MAIN-LINK-HOVER-color: #3f6d2c; /* Color of hovered links */ - --MAIN-ANCHOR-color: #599a3e; /* color of anchors on titles */ - - --MAIN-CODE-color: #e2e4e5; /* fallback color for code background */ - --MAIN-CODE-BG-color: #282a36; /* fallback color for code text */ - - --MENU-HOME-LINK-color: #323232; /* Color of the home button text */ - --MENU-HOME-LINK-HOVER-color: #5e5e5e; /* Color of the hovered home button text */ - - --MENU-HEADER-BG-color: #74b559; /* Background color of menu header */ - --MENU-HEADER-BORDER-color: #9cd484; /*Color of menu header border */ - - --MENU-SEARCH-BG-color: #599a3e; /* Search field background color (by default borders + icons) */ - --MENU-SEARCH-BOX-color: #84c767; /* Override search field border color */ - --MENU-SEARCH-BOX-ICONS-color: #c7f7c4; /* Override search field icons color */ - - --MENU-SECTIONS-ACTIVE-BG-color: #1b211c; /* Background color of the active section and its children */ - --MENU-SECTIONS-BG-color: #222723; /* Background color of other sections */ - --MENU-SECTIONS-LINK-color: #ccc; /* Color of links in menu */ - --MENU-SECTIONS-LINK-HOVER-color: #e6e6e6; /* Color of links in menu, when hovered */ - --MENU-SECTION-ACTIVE-CATEGORY-color: #777; /* Color of active category text */ - --MENU-SECTION-ACTIVE-CATEGORY-BG-color: #fff; /* Color of background for the active category (only) */ - - --MENU-VISITED-color: #599a3e; /* Color of 'page visited' icons in menu */ - --MENU-SECTION-HR-color: #18211c; /* Color of
    separator in menu */ -} diff --git a/subsite/docs/themes/hugo-relearn/static/css/theme-red.css b/subsite/docs/themes/hugo-relearn/static/css/theme-red.css deleted file mode 100644 index 1d4923e..0000000 --- a/subsite/docs/themes/hugo-relearn/static/css/theme-red.css +++ /dev/null @@ -1,30 +0,0 @@ -:root { - --MAIN-TEXT-color: #323232; /* Color of text by default */ - --MAIN-TITLES-TEXT-color: #5e5e5e; /* Color of titles h2-h3-h4-h5-h6 */ - --MAIN-LINK-color: #f31c1c; /* Color of links */ - --MAIN-LINK-HOVER-color: #d01616; /* Color of hovered links */ - --MAIN-ANCHOR-color: #f31c1c; /* color of anchors on titles */ - - --MAIN-CODE-color: #e2e4e5; /* fallback color for code background */ - --MAIN-CODE-BG-color: #282a36; /* fallback color for code text */ - - --MENU-HOME-LINK-color: #ccc; /* Color of the home button text */ - --MENU-HOME-LINK-HOVER-color: #e6e6e6; /* Color of the hovered home button text */ - - --MENU-HEADER-BG-color: #dc1010; /* Background color of menu header */ - --MENU-HEADER-BORDER-color: #e23131; /*Color of menu header border */ - - --MENU-SEARCH-BG-color: #b90000; /* Search field background color (by default borders + icons) */ - --MENU-SEARCH-BOX-color: #ef2020; /* Override search field border color */ - --MENU-SEARCH-BOX-ICONS-color: #fda1a1; /* Override search field icons color */ - - --MENU-SECTIONS-ACTIVE-BG-color: #2b2020; /* Background color of the active section and its children */ - --MENU-SECTIONS-BG-color: #312525; /* Background color of other sections */ - --MENU-SECTIONS-LINK-color: #ccc; /* Color of links in menu */ - --MENU-SECTIONS-LINK-HOVER-color: #e6e6e6; /* Color of links in menu, when hovered */ - --MENU-SECTION-ACTIVE-CATEGORY-color: #777; /* Color of active category text */ - --MENU-SECTION-ACTIVE-CATEGORY-BG-color: #fff; /* Color of background for the active category (only) */ - - --MENU-VISITED-color: #ff3333; /* Color of 'page visited' icons in menu */ - --MENU-SECTION-HR-color: #2b2020; /* Color of
    separator in menu */ -} diff --git a/subsite/docs/themes/hugo-relearn/static/css/theme-relearn.css b/subsite/docs/themes/hugo-relearn/static/css/theme-relearn.css deleted file mode 100644 index bb4f12f..0000000 --- a/subsite/docs/themes/hugo-relearn/static/css/theme-relearn.css +++ /dev/null @@ -1,30 +0,0 @@ -:root { - --MAIN-TEXT-color: #323232; /* Color of text by default */ - --MAIN-TITLES-TEXT-color: #444753; /* Color of titles h2-h3-h4-h5-h6 */ - --MAIN-LINK-color: #486ac9; /* Color of links */ - --MAIN-LINK-HOVER-color: #0044ff; /* Color of hovered links */ - --MAIN-ANCHOR-color: #486ac9; /* color of anchors on titles */ - - --MAIN-CODE-color: #e2e4e5; /* fallback color for code background */ - --MAIN-CODE-BG-color: #282a36; /* fallback color for code text */ - - --MENU-HOME-LINK-color: #323232; /* Color of the home button text */ - --MENU-HOME-LINK-HOVER-color: #5e5e5e; /* Color of the hovered home button text */ - - --MENU-HEADER-BG-color: #7dc903; /* Background color of menu header */ - --MENU-HEADER-BORDER-color: #7dc903; /*Color of menu header border */ - - --MENU-SEARCH-BG-color: #3d414d; /* Search field background color (by default borders + icons) */ - --MENU-SEARCH-BOX-color: #efefef; /* Override search field border color */ - --MENU-SEARCH-BOX-ICONS-color: #ddd; /* Override search field icons color */ - - --MENU-SECTIONS-ACTIVE-BG-color: #202028; /* Background color of the active section and its children */ - --MENU-SECTIONS-BG-color: #282830; /* Background color of other sections */ - --MENU-SECTIONS-LINK-color: #bababa; /* Color of links in menu */ - --MENU-SECTIONS-LINK-HOVER-color: #fff; /* Color of links in menu, when hovered */ - --MENU-SECTION-ACTIVE-CATEGORY-color: #444; /* Color of active category text */ - --MENU-SECTION-ACTIVE-CATEGORY-BG-color: #fff; /* Color of background for the active category (only) */ - - --MENU-VISITED-color: #506397; /* Color of 'page visited' icons in menu */ - --MENU-SECTION-HR-color: #28292e; /* Color of
    separator in menu */ -} diff --git a/subsite/docs/themes/hugo-relearn/static/css/theme.css b/subsite/docs/themes/hugo-relearn/static/css/theme.css deleted file mode 100644 index 36d47d9..0000000 --- a/subsite/docs/themes/hugo-relearn/static/css/theme.css +++ /dev/null @@ -1,1339 +0,0 @@ -@charset "UTF-8"; - -@import "tags.css"; -@import "tabs.css"; - -#top-github-link, #body #breadcrumbs { - position: relative; - top: 50%; - -webkit-transform: translateY(-50%); - -moz-transform: translateY(-50%); - -o-transform: translateY(-50%); - -ms-transform: translateY(-50%); - transform: translateY(-50%); -} -.button, .button-secondary { - display: inline-block; - padding: 7px 12px; -} -.button:active, .button-secondary:active { - margin: 2px 0 -2px 0; -} -@font-face { - font-family: 'Novacento Sans Wide'; - src: url("../fonts/Novecentosanswide-UltraLight-webfont.eot"); - src: url("../fonts/Novecentosanswide-UltraLight-webfont.eot?#iefix") format("embedded-opentype"), url("../fonts/Novecentosanswide-UltraLight-webfont.woff2") format("woff2"), url("../fonts/Novecentosanswide-UltraLight-webfont.woff") format("woff"), url("../fonts/Novecentosanswide-UltraLight-webfont.ttf") format("truetype"), url("../fonts/Novecentosanswide-UltraLight-webfont.svg#novecento_sans_wideultralight") format("svg"); - font-style: normal; - font-weight: 200; -} -@font-face { - font-family: 'Work Sans'; - font-style: normal; - font-weight: 300; - src: url("../fonts/Work_Sans_300.eot?#iefix") format("embedded-opentype"), url("../fonts/Work_Sans_300.woff") format("woff"), url("../fonts/Work_Sans_300.woff2") format("woff2"), url("../fonts/Work_Sans_300.svg#WorkSans") format("svg"), url("../fonts/Work_Sans_300.ttf") format("truetype"); -} -@font-face { - font-family: 'Work Sans'; - font-style: normal; - font-weight: 500; - src: url("../fonts/Work_Sans_500.eot?#iefix") format("embedded-opentype"), url("../fonts/Work_Sans_500.woff") format("woff"), url("../fonts/Work_Sans_500.woff2") format("woff2"), url("../fonts/Work_Sans_500.svg#WorkSans") format("svg"), url("../fonts/Work_Sans_500.ttf") format("truetype"); -} -body { - background: #fff; - color: #777; -} -body #chapter h1 { - font-size: 3.5rem; -} -@media only all and (min-width: 48em) and (max-width: 59.938em) { - body #chapter h1 { - font-size: 3rem; - } -} -@media only all and (max-width: 47.938em) { - body #chapter h1 { - font-size: 2rem; - } -} -a { - color: #00bdf3; -} -a:hover { - color: #0082a7; -} -pre { - position: relative; -} -.bg { - background: #fff; - border: 1px solid #eaeaea; -} -b, strong, label, th { - font-weight: 600; -} -.default-animation, #header #logo-svg, #header #logo-svg path, #sidebar, #sidebar ul, #body, #body .padding, #body .nav { - -webkit-transition: all 0.5s ease; - -moz-transition: all 0.5s ease; - transition: all 0.5s ease; -} -#sidebar { - font-weight: 300 !important; -} -fieldset { - border: 1px solid #ddd; -} -textarea, input[type="email"], input[type="number"], input[type="password"], input[type="search"], input[type="tel"], input[type="text"], input[type="url"], input[type="color"], input[type="date"], input[type="datetime"], input[type="datetime-local"], input[type="month"], input[type="time"], input[type="week"], select[multiple=multiple] { - background-color: white; - border: 1px solid #ddd; - box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.06); -} -textarea:hover, input[type="email"]:hover, input[type="number"]:hover, input[type="password"]:hover, input[type="search"]:hover, input[type="tel"]:hover, input[type="text"]:hover, input[type="url"]:hover, input[type="color"]:hover, input[type="date"]:hover, input[type="datetime"]:hover, input[type="datetime-local"]:hover, input[type="month"]:hover, input[type="time"]:hover, input[type="week"]:hover, select[multiple=multiple]:hover { - border-color: #c4c4c4; -} -#header-wrapper { - background: #8451a1; - color: #fff; - text-align: center; - border-bottom: 4px solid #9c6fb6; - padding: 1rem; -} -#header a { - display: inline-block; -} -#header #logo-svg { - width: 8rem; - height: 2rem; -} -#header #logo-svg path { - fill: #fff; -} -.searchbox { - margin-top: 1rem; - position: relative; - border: 1px solid #915eae; - background: #764890; - border-radius: 4px; -} -.searchbox label { - color: rgba(255, 255, 255, 0.8); - position: absolute; - left: 10px; - top: 3px; -} -.searchbox span { - color: rgba(255, 255, 255, 0.6); - position: absolute; - right: 10px; - top: 3px; - cursor: pointer; -} -.searchbox span:hover { - color: rgba(255, 255, 255, 0.9); -} -.searchbox input { - display: inline-block; - color: #fff; - width: 100%; - height: 30px; - background: transparent; - border: 0; - padding: 0 25px 0 30px; - margin: 0; - font-weight: 300; -} -.searchbox input::-webkit-input-placeholder { - color: rgba(255, 255, 255, 0.6); -} -.searchbox input::-moz-placeholder { - color: rgba(255, 255, 255, 0.6); -} -.searchbox input:-moz-placeholder { - color: rgba(255, 255, 255, 0.6); -} -.searchbox input:-ms-input-placeholder { - color: rgba(255, 255, 255, 0.6); -} -#sidebar-toggle-span { - display: none; -} -@media only all and (max-width: 47.938em) { - #sidebar-toggle-span { - display: inline; - } -} -#sidebar { - background-color: #322A38; - position: fixed; - top: 0; - width: 300px; - bottom: 0; - left: 0; - font-weight: 400; - font-size: 15px; -} -#sidebar a { - color: #ccc; -} -#sidebar a:hover { - color: #e6e6e6; -} -#sidebar a.subtitle { - color: rgba(204, 204, 204, 0.6); -} -#sidebar hr { - border-bottom: 1px solid #2a232f; -} -#sidebar a.padding { - padding: 0 1rem; -} -#sidebar ul { - list-style: none; - padding: 0; - margin: 0; -} -#sidebar ul.searched a { - color: #999999; -} -#sidebar ul.searched .search-match a { - color: #e6e6e6; -} -#sidebar ul.searched .search-match a:hover { - color: white; -} -#sidebar ul.topics { - margin: 0 1rem; -} -#sidebar ul.topics.searched ul { - display: block; -} -#sidebar ul.topics ul { - display: none; -} -#sidebar ul.topics > li > ul > li:last-child { - padding-bottom: 1rem; -} -#sidebar ul.topics ul ul { - padding-bottom: 0; -} -#sidebar ul.topics li.parent > ul, -#sidebar ul.topics li.active > ul, -#sidebar ul.topics li.alwaysopen > ul { - display: block; -} -#sidebar ul.topics > li > a { - line-height: 2rem; - font-size: 1.1rem; -} -#sidebar ul.topics > li > a b { - opacity: 0.5; - font-weight: normal; -} -#sidebar ul.topics > li > a .fa { - margin-top: 9px; -} -#sidebar ul.topics > li.parent { - background: #251f29; - margin-left: -1rem; - margin-right: -1rem; - padding-left: 1rem; - padding-right: 1rem; -} -#sidebar ul li.active > a { - background: #fff; - color: #777 !important; - margin-left: -1rem; - margin-right: -1rem; - padding-left: 1rem; - padding-right: 1rem; -} -#sidebar ul li { - padding: 0; -} -#sidebar ul li.visited + span { - margin-right: 16px; -} -#sidebar ul li a { - display: block; - padding: 2px 0; -} -#sidebar ul li a span { - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; - display: block; -} -#sidebar ul li > a { - padding: 4px 0; -} -#sidebar ul li.visited > a .read-icon { - color: #9c6fb6; - display: inline; -} -#sidebar ul li li { - padding-left: 1rem; - text-indent: 0.2rem; -} -#main { - background: #f7f7f7; - margin: 0 0 1.563rem 0; -} -#body { - position: relative; - margin-left: 300px; - min-height: 100%; -} -#body img, #body .video-container { - margin: 1.5rem auto; - display: block; - text-align: center; -} -#body img.border, #body .video-container.border { - border: 2px solid #e6e6e6 !important; - padding: 2px; -} -#body img.shadow, #body .video-container.shadow { - box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); -} -#body img.inline { - display: inline !important; - margin: 0 !important; - vertical-align: bottom; -} -#body .bordered { - border: 1px solid #ccc; -} -#body .padding { - padding: 3rem 6rem; -} -@media only all and (max-width: 59.938em) { - #body .padding { - position: static; - padding: 15px 3rem; - } -} -@media only all and (max-width: 47.938em) { - #body .padding { - padding: 5px 1rem; - } -} -#body h1 + hr { - margin-top: -1rem; - margin-bottom: 2rem; -} -@media only all and (max-width: 59.938em) { - #body #navigation { - position: static; - margin-right: 0 !important; - width: 100%; - display: table; - } -} -#body .nav { - position: fixed; - top: 0; - bottom: 0; - width: 4rem; - font-size: 50px; - height: 100%; - cursor: pointer; - display: table; - text-align: center; -} -#body .nav > i { - display: table-cell; - vertical-align: middle; - text-align: center; -} -@media only all and (max-width: 59.938em) { - #body .nav { - display: table-cell; - position: static; - top: auto; - width: 50%; - text-align: center; - height: 100px; - line-height: 100px; - padding-top: 0; - } - #body .nav > i { - display: inline-block; - } -} -#body .nav:hover { - background: #F6F6F6; -} -#body .nav.nav-pref { - left: 0; -} -#body .nav.nav-next { - margin-right: 0px; - right: 0; -} - -/* we limit width if we have large screens */ -@media screen and ( min-width: 1300px ){ /* #sidebar/width + ./max-width */ - #body #body-inner { - max-width: 1000px; - margin: auto; - } -} - -#chapter { - display: flex; - align-items: center; - justify-content: center; - height: 100%; - padding: 2rem 0; -} -#chapter #body-inner { - max-width: 80%; -} -#chapter h3 { - font-family: "Work Sans", "Helvetica", "Tahoma", "Geneva", "Arial", sans-serif; - font-weight: 300; - text-align: center; -} -#chapter h1 { - font-size: 5rem; - border-bottom: 4px solid #F0F2F4; -} -#chapter p { - text-align: justify; - font-size: 1.2rem; -} -#footer { - padding: 3rem 1rem; - color: #b3b3b3; - font-size: 13px; - text-align: center; -} -#footer p { - margin: 0; -} -body { - font-family: "Work Sans", "Helvetica", "Tahoma", "Geneva", "Arial", sans-serif; - font-weight: 300; - line-height: 1.6; - font-size: 18px !important; -} -h2, h3, h4, h5, h6 { - font-family: "Work Sans", "Helvetica", "Tahoma", "Geneva", "Arial", sans-serif; - text-rendering: optimizeLegibility; - color: #5e5e5e; - letter-spacing: -1px; -} -h1 { - font-family: "Novacento Sans Wide", "Helvetica", "Tahoma", "Geneva", "Arial", sans-serif; - text-align: center; - text-transform: uppercase; - color: #222; - font-weight: 200; -} -blockquote { - border-left: 10px solid rgba(0, 8, 16, 0.2); -} -blockquote p { - font-size: 1.1rem; - color: #56585d; -} -blockquote cite { - display: block; - text-align: right; - color: #222; - font-size: 1.2rem; -} -div.notices { - border-top-width: 2rem; - border-top-style: solid; - color: #505050; - -webkit-print-color-adjust: exact; - color-adjust: exact; - margin: 1.5rem 0; - padding-bottom: .1px; - padding-left: 1rem; - padding-right: 1rem; -} -div.notices > div.label { - color: #fff; - font-weight: normal; - margin-bottom: 1rem; - margin-top: -1.75rem; -} -div.notices > div.label:first-child:before { - font-family: "Font Awesome 5 Free"; - font-weight: 900; - margin-left: -.35rem; - margin-right: .35rem; -} -div.notices.info { - border-color: #4897CC; - background-color: #E9F5FD; -} -div.notices.info > div.label:first-child:before { - content: "\f05a"; -} -div.notices.warning { - border-color: #D96A68; - background-color: #FFEBEB; -} -div.notices.warning > div.label:first-child:before { - content: "\f071"; -} -div.notices.note { - border-color: #BF8B44; - background-color: #FFF2DB; -} -div.notices.note > div.label:first-child:before { - content: "\f06a"; -} -div.notices.tip { - border-color: #5AA55A; - background-color: #E6F9E6; -} -div.notices.tip > div.label:first-child:before { - content: "\f0eb"; -} - -/* attachments shortcode */ - -div.attachments { - border-top-width: 2rem; - border-top-style: solid; - color: #505050; - -webkit-print-color-adjust: exact; - color-adjust: exact; - margin: 1.5rem 0; - padding-left: 1rem; - padding-right: 1rem; - padding-bottom: .1px; -} - -div.attachments > div.label { - color: #fff; - font-weight: normal; - margin-bottom: 1rem; - margin-top: -1.75rem; -} - -div.attachments > div.label:first-child:before { - font-family: "Font Awesome 5 Free"; - font-weight: 900; - margin-left: -.35rem; - margin-right: .35rem; - content: "\f0c6"; -} - -div.attachments .attachments-files { - padding: 1rem; - display: block; - font-size: 1rem; - margin-top: -1rem; - margin-bottom: 0rem; -} - -div.attachments.orange { - border-color: #BF8B44; - background-color: #FFF2DB; -} - -div.attachments.green { - border-color: #5AA55A; - background-color: #E6F9E6; -} - -div.attachments.red { - border-color: #D96A68; - background-color: #FFEBEB; -} - -div.attachments.blue { - border-color: #4897CC; - background-color: #E9F5FD; -} - -div.attachments.grey { - border-color: #505D65; - background-color: #F4F4F4; -} - -div.attachments.neutral { - border-color: transparent; - background-color: transparent; -} -div.attachments.neutral > div.label { - color: #505050; -} - -/* Children shortcode */ -.children p { - font-size: small; - margin-top: 0px; - padding-top: 0px; - margin-bottom: 0px; - padding-bottom: 0px; -} -.children-li p { - font-size: small; - font-style: italic; - -} -.children-h2 p, .children-h3 p { - font-size: small; - margin-top: 0px; - padding-top: 0px; - margin-bottom: 0px; - padding-bottom: 0px; -} -.children h3,.children h2 { - margin-bottom: 0px; - margin-top: 5px; -} -#body-inner ul.children-h2, -#body-inner ul.children-h3, -#body-inner ul.children-h4, -#body-inner ul.children-h5, -#body-inner ul.children-h6 { - /* if we display children with style=h2 but without a containerstyle - a ul will be used for structuring; we remove default indention for uls - in this case */ - padding-inline-start: 0; -} - -code, kbd, pre, samp { - font-family: "Consolas", menlo, monospace; - font-size: 92%; - vertical-align: baseline; -} -code { - background-color: #FFFAE9; - border: 1px solid #F8E8C8; - border-radius: 2px; - color: #5E5E5E; - -webkit-print-color-adjust: economy; - color-adjust: economy; - padding-left: 2px; - padding-right: 2px; - white-space: nowrap; -} -code.copy-to-clipboard-inline { - border-bottom-right-radius: 0; - border-top-right-radius: 0; - border-right-width: 0; -} -pre { - background-color: #272822; - border: 0; - border-radius: 2px; - color: #f8f8f2; - -webkit-print-color-adjust: economy; - color-adjust: economy; - line-height: 1.15; - padding: 1rem; -} -pre code { - background-color: inherit; - color: inherit; - -webkit-print-color-adjust: economy; - color-adjust: economy; - border: 0; - font-size: 15px; - margin: 0; - padding: 0; - white-space: inherit; -} -hr { - border-bottom: 4px solid #F0F2F4; -} -.page-title { - margin-top: -25px; - padding: 25px; - float: left; - clear: both; - background: #9c6fb6; - color: #fff; -} -#body a.anchor-link { - color: #ccc; -} -#body a.anchor-link:hover { - color: #9c6fb6; -} -#body-inner pre { - white-space: pre-wrap; -} -#body-inner h1, -#body-inner h2, -#body-inner h3, -#body-inner h4, -#body-inner h5, -#body-inner h6 { - /* big titles cause a horizontal scrollbar - fixing this by wrapping text */ - overflow-x: hidden; - overflow-wrap: break-word; -} - -table { - border: 1px solid #ccc; - margin-bottom: 1rem; - margin-top: 1rem; - table-layout: auto; -} -th, thead td { - background: #eaeaea; - border: 1px solid #ccc; - -webkit-print-color-adjust: exact; - color-adjust: exact; - padding: 0.5rem; -} -td { - border: 1px solid #ccc; - padding: 0.5rem; -} -.button { - background: #9c6fb6; - color: #fff; - box-shadow: 0 3px 0 #00a5d4; -} -.button:hover { - background: #00a5d4; - box-shadow: 0 3px 0 #008db6; - color: #fff; -} -.button:active { - box-shadow: 0 1px 0 #008db6; -} -.button-secondary { - background: #F8B450; - color: #fff; - box-shadow: 0 3px 0 #f7a733; -} -.button-secondary:hover { - background: #f7a733; - box-shadow: 0 3px 0 #f69b15; - color: #fff; -} -.button-secondary:active { - box-shadow: 0 1px 0 #f69b15; -} -.tooltipped { - position: relative; -} -.tooltipped:after { - border: 1px solid #777; - position: absolute; - z-index: 1000000; - display: none; - padding: 5px 8px; - font: normal normal 11px/1.5 "Work Sans", "Helvetica", "Tahoma", "Geneva", "Arial", sans-serif; - color: #fff; - text-align: center; - text-decoration: none; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - word-wrap: break-word; - white-space: pre; - pointer-events: none; - content: attr(aria-label); - background: rgba(0, 0, 0, 0.8); - border-radius: 3px; - -webkit-font-smoothing: subpixel-antialiased; -} -.tooltipped:before { - position: absolute; - z-index: 1000001; - display: none; - width: 0; - height: 0; - color: rgba(0, 0, 0, 0.8); - pointer-events: none; - content: ""; - border: 5px solid transparent; -} -.tooltipped:hover:before, .tooltipped:hover:after, .tooltipped:active:before, .tooltipped:active:after, .tooltipped:focus:before, .tooltipped:focus:after { - display: inline-block; - text-decoration: none; -} -.tooltipped-s:after, .tooltipped-se:after, .tooltipped-sw:after { - top: 100%; - right: 50%; - margin-top: 5px; -} -.tooltipped-s:before, .tooltipped-se:before, .tooltipped-sw:before { - top: auto; - right: 50%; - bottom: -5px; - margin-right: -5px; - border-bottom-color: rgba(0, 0, 0, 0.8); -} -.tooltipped-se:after { - right: auto; - left: 50%; - margin-left: -15px; -} -.tooltipped-sw:after { - margin-right: -15px; -} -.tooltipped-n:after, .tooltipped-ne:after, .tooltipped-nw:after { - right: 50%; - bottom: 100%; - margin-bottom: 5px; -} -.tooltipped-n:before, .tooltipped-ne:before, .tooltipped-nw:before { - top: -5px; - right: 50%; - bottom: auto; - margin-right: -5px; - border-top-color: rgba(0, 0, 0, 0.8); -} -.tooltipped-ne:after { - right: auto; - left: 50%; - margin-left: -15px; -} -.tooltipped-nw:after { - margin-right: -15px; -} -.tooltipped-s:after, .tooltipped-n:after { - transform: translateX(50%); -} -.tooltipped-w:after { - right: 100%; - bottom: 50%; - margin-right: 5px; - transform: translateY(50%); -} -.tooltipped-w:before { - top: 50%; - bottom: 50%; - left: -5px; - margin-top: -5px; - border-left-color: rgba(0, 0, 0, 0.8); -} -.tooltipped-e:after { - bottom: 50%; - left: 100%; - margin-left: 5px; - transform: translateY(50%); -} -.tooltipped-e:before { - top: 50%; - right: -5px; - bottom: 50%; - margin-top: -5px; - border-right-color: rgba(0, 0, 0, 0.8); -} -.highlightable { - padding: 1rem 0 1rem; - position: relative; -} -#sidebar .highlightable { - overflow: auto; -} -.lightbox-active #body { - overflow: visible; -} -.lightbox-active #body .padding { - overflow: visible; -} -#github-contrib i { - vertical-align: middle; -} -.featherlight img { - margin: 0 !important; -} -#top-bar { - background: #F6F6F6; - border-radius: 2px; - padding: 0 1rem; - height: 0; - min-height: 3rem; -} -#top-github-link { - position: relative; - z-index: 1; - float: right; - display: block; -} -#body #breadcrumbs { - height: auto; - margin-bottom: 0; - padding-left: 0; - line-height: 1.4; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - width: 70%; - display: inline-block; - float: left; -} -#body #breadcrumbs span { - padding: 0 0.1rem; -} -#body #breadcrumbs .links { - display: inline; - padding: 0 0.1rem; -} - -#body #breadcrumbs .links * { - display: inline-block; - padding: 0; -} -#body #breadcrumbs .links meta { - display: none; -} -#body #breadcrumbs .links li:last-of-type { - cursor: text; -} -a[aria-disabled="true"] { - color: inherit; - pointer-events: none; - text-decoration: none; -} -@media only all and (max-width: 59.938em) { - #sidebar { - width: 230px; - } - #body { - margin-left: 230px; - } -} -@media only all and (max-width: 47.938em) { - #sidebar { - width: 230px; - left: -230px; - } - #body { - margin-left: 0; - width: 100%; - } - .sidebar-hidden { - overflow: hidden; - } - .sidebar-hidden #sidebar { - left: 0; - } - .sidebar-hidden #body { - margin-left: 230px; - overflow: hidden; - } - .sidebar-hidden #overlay { - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 0; - z-index: 10; - background: rgba(255, 255, 255, 0.5); - cursor: pointer; - } -} -.copy-to-clipboard { - background-color: #FFFAE9; - background-image: url(../images/clippy.svg); - background-position: 50% 50%; - background-repeat: no-repeat; - background-size: 14px 16px; - border: 1px solid #F8E8C8; - border-radius: 0 2px 2px 0; - color: #5E5E5E; - cursor: pointer; - font-family: "Consolas", menlo, monospace; - font-size: 92%; - padding-left: 22px; -} -.copy-to-clipboard:hover { - background-color: #FCEBB4; - border-color: #B19F7A; -} -pre .copy-to-clipboard { - background-color: rgba( 204, 204, 204, .666 ); - border-color: #000; - border-radius: 2px; - padding: 10.5px 12.5px; - position: absolute; - right: 4px; - top: 4px; -} -pre .copy-to-clipboard:hover { - border-color: #505050; - background-color: rgba( 236, 236, 236, .9 ); -} - -#sidebar ul.topics > li > a .read-icon { - margin-top: 9px; -} - -#sidebar ul { - list-style: none; - padding: 0; - margin: 0; -} - -#sidebar #shortcuts li { - padding: 2px 0; - list-style: none; -} - -#sidebar ul li .read-icon { - display: none; - float: right; - font-size: 13px; - min-width: 16px; - margin: 4px 0 0 0; - text-align: right; -} -#sidebar ul li.visited > a .read-icon { - color: #00bdf3; - display: inline; -} - -#sidebar .nav-title { - color: white ; - font-family: "Novacento Sans Wide", "Helvetica", "Tahoma", "Geneva", "Arial", sans-serif; - font-size: 2rem; - font-weight: 400; - letter-spacing: -1px; - line-height: 110% !important; - margin: 1rem 0 1rem 0; - padding-left: 1rem; - text-rendering: optimizeLegibility; -} - -#homelinks { - background-color: #9c6fb6; - color: #fff; - padding: 7px 0; - border-bottom: 4px solid #9c6fb6; -} - -option { - color: initial; -} - -.expand{ - margin-bottom: 1rem; - margin-top: 1rem; -} - -.expand-label { - cursor: pointer; -} - -.expand-label > .fas { - font-size: .8rem; - width: .6rem; -} - -/* expander collapsed, default */ -.expand > .expand-label > .fa-chevron-down { - display: none; -} -.expand > .expand-label > .fa-chevron-right { - display: inline-block; -} - -/* expander expanded, controlled by expand.html */ -.expand.expand-expanded > .expand-label > .fa-chevron-down { - display: inline-block; -} -.expand.expand-expanded > .expand-label > .fa-chevron-right { - display: none; -} - -/* expander expand collapsed marked, must override logic of expand.html, controlled by relearn.js */ -.expand:not(.expand-expanded).expand-marked > .expand-label > .fa-chevron-down { - display: inline-block; -} -.expand:not(.expand-expanded).expand-marked > .expand-label > .fa-chevron-right { - display: none; -} -.expand:not(.expand-expanded).expand-marked > .expand-content { - /* this will disable jquery's animation */ - display: block !important; -} - -#body footer.footline{ - margin-top: 2rem; -} - -.mermaid { - margin-bottom: 1.7rem; - margin-top: 1.7rem; -} - -.include.hide-first-heading h1:first-of-type, -.include.hide-first-heading h2:first-of-type, -.include.hide-first-heading h3:first-of-type, -.include.hide-first-heading h4:first-of-type, -.include.hide-first-heading h5:first-of-type, -.include.hide-first-heading h6:first-of-type { - display: none; -} - -.include.hide-first-heading h1 + h2:first-of-type, -.include.hide-first-heading h1 + h3:first-of-type, -.include.hide-first-heading h2 + h3:first-of-type, -.include.hide-first-heading h1 + h4:first-of-type, -.include.hide-first-heading h2 + h4:first-of-type, -.include.hide-first-heading h3 + h4:first-of-type, -.include.hide-first-heading h1 + h5:first-of-type, -.include.hide-first-heading h2 + h5:first-of-type, -.include.hide-first-heading h3 + h5:first-of-type, -.include.hide-first-heading h4 + h5:first-of-type, -.include.hide-first-heading h1 + h6:first-of-type, -.include.hide-first-heading h2 + h6:first-of-type, -.include.hide-first-heading h3 + h6:first-of-type, -.include.hide-first-heading h4 + h6:first-of-type, -.include.hide-first-heading h5 + h6:first-of-type { - display: block; -} - -/* Table of contents */ - -.progress ul { - list-style: none; - margin: 0; - padding: 0 15px; -} - -#TableOfContents { - font-size: 13px !important; - max-height: 85vh; - overflow: auto; - padding: 15px 5px !important; -} - -#TableOfContents > ul > li > a { - font-weight: bold; -} - -body { - font-size: 16px !important; - color: #323232 !important; -} - -#body a.highlight, #body a.highlight:hover, #body a.highlight:focus { - text-decoration: none; - outline: none; - outline: 0; -} -#body a.highlight { - line-height: 1.1; - display: inline-block; -} -#body a.highlight:after { - display: block; - content: ""; - height: 1px; - width: 0%; - background-color: #0082a7; /*#CE3B2F*/ - -webkit-transition: width 0.5s ease; - -moz-transition: width 0.5s ease; - -ms-transition: width 0.5s ease; - transition: width 0.5s ease; -} -#body a.highlight:hover:after, #body a.highlight:focus:after { - width: 100%; -} - -.progress { - box-shadow: -1px 2px 5px 1px rgba(0, 0, 0, 0.1); - position:absolute; - background-color: rgba(246, 246, 246, 0.97); - width: auto; - border: thin solid #ECECEC; - display:none; - z-index:200; -} - -#toc-menu { - border-right: thin solid #DAD8D8 !important; - padding-right: 1rem !important; - margin-right: 0.5rem !important; -} - -#sidebar-toggle-span { - border-right: thin solid #DAD8D8 !important; - padding-right: 0.5rem !important; - margin-right: 1rem !important; -} - -.btn { - display: inline-block !important; - padding: 6px 12px !important; - margin-bottom: 0 !important; - font-size: 14px !important; - font-weight: normal !important; - line-height: 1.42857143 !important; - text-align: center !important; - white-space: nowrap !important; - vertical-align: middle !important; - -ms-touch-action: manipulation !important; - touch-action: manipulation !important; - cursor: pointer !important; - -webkit-user-select: none !important; - -moz-user-select: none !important; - -ms-user-select: none !important; - user-select: none !important; - background-image: none !important; - border: 1px solid transparent !important; - border-radius: 4px !important; - -webkit-transition: all 0.15s !important; - -moz-transition: all 0.15s !important; - transition: all 0.15s !important; -} -.btn:focus { - /*outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px;*/ - outline: none !important; -} -.btn:hover, -.btn:focus { - color: #2b2b2b !important; - text-decoration: none !important; -} - -.btn-default { - color: #333 !important; - background-color: #fff !important; - border-color: #ccc !important; -} -.btn-default:hover, -.btn-default:focus, -.btn-default:active { - color: #fff !important; - background-color: #9e9e9e !important; - border-color: #9e9e9e !important; -} -.btn-default:active { - background-image: none !important; -} - -/* anchors */ -.anchor { - color: #00bdf3; - font-size: 0.5em; - cursor:pointer; - visibility:hidden; - margin-left: 0.5em; - position: absolute; - margin-top:0.1em; -} - -h2:hover .anchor, h3:hover .anchor, h4:hover .anchor, h5:hover .anchor, h6:hover .anchor { - visibility:visible; -} - -/* Redfines headers style */ - -h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { - font-weight: inherit; -} - -#body h2 { - font-size: 2.2rem; - font-weight: 400; - margin-top: 2rem; -} - -#body h3 { - font-size: 1.8rem; - font-weight: 400; - margin-top: 2rem; -} - -#body h4 { - font-size: 1.85rem; - font-weight: 200; - margin-top: 2rem; -} - -#body h5 { - font-size: 1.6rem; - font-weight: 200; - margin-top: 2rem; -} - -#body h6 { - font-size: 1.3rem; - font-weight: 200; - margin-top: 2rem; -} - -#body h1 + h2, -#body h1 + h3, -#body h1 + h4, -#body h1 + h5, -#body h1 + h6, -#body h2 + h3, -#body h2 + h4, -#body h2 + h5, -#body h2 + h6, -#body h3 + h4, -#body h3 + h5, -#body h3 + h6, -#body h4 + h5, -#body h4 + h6, -#body h5 + h6 { - margin-top: 1rem; -} - -.select-style { - border: 0; - width: 150px; - border-radius: 0px; - overflow: hidden; - display: inline-flex; -} - -.select-style svg { - fill: #ccc; - width: 14px; - height: 14px; - pointer-events: none; - margin: auto; -} - -.select-style svg:hover { - fill: #e6e6e6; -} - -.select-style select { - padding: 0; - width: 130%; - border: none; - box-shadow: none; - background: transparent; - background-image: none; - -webkit-appearance: none; - margin: auto; - margin-left: 0px; - margin-right: -20px; -} - -.select-style select:focus { - outline: none; -} - -.select-style :hover { - cursor: pointer; -} - -@media only all and (max-width: 47.938em) { - #breadcrumbs .links, #top-github-link-text { - display: none; - } -} - -#top-bar { - position: -webkit-sticky; - position: sticky; - top: 0; - z-index: 999; -} - -#top-bar.is-sticky { - box-shadow: -1px 2px 5px 1px rgba(0, 0, 0, 0.1); -} diff --git a/subsite/docs/themes/hugo-relearn/static/css/variant.css b/subsite/docs/themes/hugo-relearn/static/css/variant.css deleted file mode 100644 index 1426a50..0000000 --- a/subsite/docs/themes/hugo-relearn/static/css/variant.css +++ /dev/null @@ -1,97 +0,0 @@ -body { - color: var(--MAIN-TEXT-color) !important; -} - -h2, h3, h4, h5, h6 { - color: var(--MAIN-TITLES-TEXT-color) !important; -} - -a { - color: var(--MAIN-LINK-color); -} - -pre { - background-color: var(--MAIN-CODE-BG-color); - color: var(--MAIN-CODE-color); -} - -.anchor { - color: var(--MAIN-ANCHOR-color); -} - -a:hover { - color: var(--MAIN-LINK-HOVER-color); -} - -#sidebar ul li.visited > a .read-icon { - color: var(--MENU-VISITED-color); -} - -#body a.highlight:after { - background-color: var(--MAIN-LINK-HOVER-color); -} - -#sidebar { - background-color: var(--MENU-SECTIONS-BG-color); -} - -#sidebar #header-wrapper { - background-color: var(--MENU-HEADER-BG-color); - color: var(--MENU-SEARCH-BOX-color); - border-color: var(--MENU-HEADER-BORDER-color); -} - -#sidebar .searchbox { - border-color: var(--MENU-SEARCH-BOX-color); - background-color: var(--MENU-SEARCH-BG-color); -} - -#sidebar ul.topics > li.parent, #sidebar ul.topics > li.active { - background-color: var(--MENU-SECTIONS-ACTIVE-BG-color); -} - -#sidebar .searchbox * { - color: var(--MENU-SEARCH-BOX-ICONS-color); -} - -#sidebar a { - color: var(--MENU-SECTIONS-LINK-color); -} - -#sidebar a:hover { - color: var(--MENU-SECTIONS-LINK-HOVER-color); -} - -#sidebar ul li.active > a { - background-color: var(--MENU-SECTION-ACTIVE-CATEGORY-BG-color); - color: var(--MENU-SECTION-ACTIVE-CATEGORY-color) !important; -} - -#sidebar hr { - border-color: var(--MENU-SECTION-HR-color); -} - -#body .tags a.tag-link { - background-color: var(--MENU-HEADER-BG-color); -} - -#body .tags a.tag-link:before { - border-right-color: var(--MENU-HEADER-BG-color); -} - -#homelinks { - background-color: var(--MENU-HEADER-BG-color); - border-bottom-color: var(--MENU-HEADER-BORDER-color); -} - -#homelinks a { - color: var(--MENU-HOME-LINK-color); -} - -#homelinks a:hover { - color: var(--MENU-HOME-LINK-HOVER-color); -} - -#sidebar .nav-title { - color: var(--MENU-SECTIONS-LINK-HOVER-color) !important; -} diff --git a/subsite/docs/themes/hugo-relearn/static/fonts/Inconsolata.eot b/subsite/docs/themes/hugo-relearn/static/fonts/Inconsolata.eot deleted file mode 100644 index 0a705d6..0000000 Binary files a/subsite/docs/themes/hugo-relearn/static/fonts/Inconsolata.eot and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/static/fonts/Inconsolata.svg b/subsite/docs/themes/hugo-relearn/static/fonts/Inconsolata.svg deleted file mode 100644 index 36775f0..0000000 --- a/subsite/docs/themes/hugo-relearn/static/fonts/Inconsolata.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/static/fonts/Inconsolata.ttf b/subsite/docs/themes/hugo-relearn/static/fonts/Inconsolata.ttf deleted file mode 100644 index 4b8a36d..0000000 Binary files a/subsite/docs/themes/hugo-relearn/static/fonts/Inconsolata.ttf and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/static/fonts/Inconsolata.woff b/subsite/docs/themes/hugo-relearn/static/fonts/Inconsolata.woff deleted file mode 100644 index 6f39625..0000000 Binary files a/subsite/docs/themes/hugo-relearn/static/fonts/Inconsolata.woff and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/static/fonts/Novecentosanswide-Normal-webfont.eot b/subsite/docs/themes/hugo-relearn/static/fonts/Novecentosanswide-Normal-webfont.eot deleted file mode 100644 index 9984682..0000000 Binary files a/subsite/docs/themes/hugo-relearn/static/fonts/Novecentosanswide-Normal-webfont.eot and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/static/fonts/Novecentosanswide-Normal-webfont.svg b/subsite/docs/themes/hugo-relearn/static/fonts/Novecentosanswide-Normal-webfont.svg deleted file mode 100644 index 6fa1a66..0000000 --- a/subsite/docs/themes/hugo-relearn/static/fonts/Novecentosanswide-Normal-webfont.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/static/fonts/Novecentosanswide-Normal-webfont.ttf b/subsite/docs/themes/hugo-relearn/static/fonts/Novecentosanswide-Normal-webfont.ttf deleted file mode 100644 index 8cfb62d..0000000 Binary files a/subsite/docs/themes/hugo-relearn/static/fonts/Novecentosanswide-Normal-webfont.ttf and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/static/fonts/Novecentosanswide-Normal-webfont.woff b/subsite/docs/themes/hugo-relearn/static/fonts/Novecentosanswide-Normal-webfont.woff deleted file mode 100644 index d5c4290..0000000 Binary files a/subsite/docs/themes/hugo-relearn/static/fonts/Novecentosanswide-Normal-webfont.woff and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/static/fonts/Novecentosanswide-Normal-webfont.woff2 b/subsite/docs/themes/hugo-relearn/static/fonts/Novecentosanswide-Normal-webfont.woff2 deleted file mode 100644 index eefb4a3..0000000 Binary files a/subsite/docs/themes/hugo-relearn/static/fonts/Novecentosanswide-Normal-webfont.woff2 and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/static/fonts/Novecentosanswide-UltraLight-webfont.eot b/subsite/docs/themes/hugo-relearn/static/fonts/Novecentosanswide-UltraLight-webfont.eot deleted file mode 100644 index 2a26561..0000000 Binary files a/subsite/docs/themes/hugo-relearn/static/fonts/Novecentosanswide-UltraLight-webfont.eot and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/static/fonts/Novecentosanswide-UltraLight-webfont.svg b/subsite/docs/themes/hugo-relearn/static/fonts/Novecentosanswide-UltraLight-webfont.svg deleted file mode 100644 index c4e903b..0000000 --- a/subsite/docs/themes/hugo-relearn/static/fonts/Novecentosanswide-UltraLight-webfont.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/static/fonts/Novecentosanswide-UltraLight-webfont.ttf b/subsite/docs/themes/hugo-relearn/static/fonts/Novecentosanswide-UltraLight-webfont.ttf deleted file mode 100644 index 9ce9c7f..0000000 Binary files a/subsite/docs/themes/hugo-relearn/static/fonts/Novecentosanswide-UltraLight-webfont.ttf and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/static/fonts/Novecentosanswide-UltraLight-webfont.woff b/subsite/docs/themes/hugo-relearn/static/fonts/Novecentosanswide-UltraLight-webfont.woff deleted file mode 100644 index 381650c..0000000 Binary files a/subsite/docs/themes/hugo-relearn/static/fonts/Novecentosanswide-UltraLight-webfont.woff and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/static/fonts/Novecentosanswide-UltraLight-webfont.woff2 b/subsite/docs/themes/hugo-relearn/static/fonts/Novecentosanswide-UltraLight-webfont.woff2 deleted file mode 100644 index 7e65954..0000000 Binary files a/subsite/docs/themes/hugo-relearn/static/fonts/Novecentosanswide-UltraLight-webfont.woff2 and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_200.eot b/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_200.eot deleted file mode 100644 index 4052e4f..0000000 Binary files a/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_200.eot and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_200.svg b/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_200.svg deleted file mode 100644 index 0ffbd3a..0000000 --- a/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_200.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_200.ttf b/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_200.ttf deleted file mode 100644 index 68019e1..0000000 Binary files a/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_200.ttf and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_200.woff b/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_200.woff deleted file mode 100644 index a1bd9e4..0000000 Binary files a/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_200.woff and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_200.woff2 b/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_200.woff2 deleted file mode 100644 index 20c68a7..0000000 Binary files a/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_200.woff2 and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_300.eot b/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_300.eot deleted file mode 100644 index ace7993..0000000 Binary files a/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_300.eot and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_300.svg b/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_300.svg deleted file mode 100644 index 7d29367..0000000 --- a/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_300.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_300.ttf b/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_300.ttf deleted file mode 100644 index 35387c2..0000000 Binary files a/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_300.ttf and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_300.woff b/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_300.woff deleted file mode 100644 index 8d789ea..0000000 Binary files a/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_300.woff and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_300.woff2 b/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_300.woff2 deleted file mode 100644 index f6e216d..0000000 Binary files a/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_300.woff2 and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_500.eot b/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_500.eot deleted file mode 100644 index 9df6929..0000000 Binary files a/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_500.eot and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_500.svg b/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_500.svg deleted file mode 100644 index 90a91c1..0000000 --- a/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_500.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_500.ttf b/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_500.ttf deleted file mode 100644 index 5b8cc53..0000000 Binary files a/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_500.ttf and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_500.woff b/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_500.woff deleted file mode 100644 index df05851..0000000 Binary files a/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_500.woff and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_500.woff2 b/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_500.woff2 deleted file mode 100644 index b06c54d..0000000 Binary files a/subsite/docs/themes/hugo-relearn/static/fonts/Work_Sans_500.woff2 and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/static/images/clippy.svg b/subsite/docs/themes/hugo-relearn/static/images/clippy.svg deleted file mode 100644 index f455173..0000000 --- a/subsite/docs/themes/hugo-relearn/static/images/clippy.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/subsite/docs/themes/hugo-relearn/static/images/gopher-404.jpg b/subsite/docs/themes/hugo-relearn/static/images/gopher-404.jpg deleted file mode 100644 index 2a50543..0000000 Binary files a/subsite/docs/themes/hugo-relearn/static/images/gopher-404.jpg and /dev/null differ diff --git a/subsite/docs/themes/hugo-relearn/static/js/auto-complete.js b/subsite/docs/themes/hugo-relearn/static/js/auto-complete.js deleted file mode 100644 index 0b46054..0000000 --- a/subsite/docs/themes/hugo-relearn/static/js/auto-complete.js +++ /dev/null @@ -1,3 +0,0 @@ -// JavaScript autoComplete v1.0.4 -// https://github.com/Pixabay/JavaScript-autoComplete -var autoComplete=function(){function e(e){function t(e,t){return e.classList?e.classList.contains(t):new RegExp("\\b"+t+"\\b").test(e.className)}function o(e,t,o){e.attachEvent?e.attachEvent("on"+t,o):e.addEventListener(t,o)}function s(e,t,o){e.detachEvent?e.detachEvent("on"+t,o):e.removeEventListener(t,o)}function n(e,s,n,l){o(l||document,s,function(o){for(var s,l=o.target||o.srcElement;l&&!(s=t(l,e));)l=l.parentElement;s&&n.call(l,o)})}if(document.querySelector){var l={selector:0,source:0,minChars:3,delay:150,offsetLeft:0,offsetTop:1,cache:1,menuClass:"",renderItem:function(e,t){t=t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&");var o=new RegExp("("+t.split(" ").join("|")+")","gi");return'
    '+e.replace(o,"$1")+"
    "},onSelect:function(){}};for(var c in e)e.hasOwnProperty(c)&&(l[c]=e[c]);for(var a="object"==typeof l.selector?[l.selector]:document.querySelectorAll(l.selector),u=0;u0?i.sc.scrollTop=n+i.sc.suggestionHeight+s-i.sc.maxHeight:0>n&&(i.sc.scrollTop=n+s)}else i.sc.scrollTop=0},o(window,"resize",i.updateSC),document.body.appendChild(i.sc),n("autocomplete-suggestion","mouseleave",function(){var e=i.sc.querySelector(".autocomplete-suggestion.selected");e&&setTimeout(function(){e.className=e.className.replace("selected","")},20)},i.sc),n("autocomplete-suggestion","mouseover",function(){var e=i.sc.querySelector(".autocomplete-suggestion.selected");e&&(e.className=e.className.replace("selected","")),this.className+=" selected"},i.sc),n("autocomplete-suggestion","mousedown",function(e){if(t(this,"autocomplete-suggestion")){var o=this.getAttribute("data-val");i.value=o,l.onSelect(e,o,this),i.sc.style.display="none"}},i.sc),i.blurHandler=function(){try{var e=document.querySelector(".autocomplete-suggestions:hover")}catch(t){var e=0}e?i!==document.activeElement&&setTimeout(function(){i.focus()},20):(i.last_val=i.value,i.sc.style.display="none",setTimeout(function(){i.sc.style.display="none"},350))},o(i,"blur",i.blurHandler);var r=function(e){var t=i.value;if(i.cache[t]=e,e.length&&t.length>=l.minChars){for(var o="",s=0;st||t>40)&&13!=t&&27!=t){var o=i.value;if(o.length>=l.minChars){if(o!=i.last_val){if(i.last_val=o,clearTimeout(i.timer),l.cache){if(o in i.cache)return void r(i.cache[o]);for(var s=1;s https://github.com/noelboss/featherlight/issues/317 -!function(u){"use strict";if(void 0!==u)if(u.fn.jquery.match(/-ajax/))"console"in window&&window.console.info("Featherlight needs regular jQuery, not the slim version.");else{var r=[],i=function(t){return r=u.grep(r,function(e){return e!==t&&0','
    ','",'
    '+n.loading+"
    ","
    ","
    "].join("")),o="."+n.namespace+"-close"+(n.otherClose?","+n.otherClose:"");return n.$instance=i.clone().addClass(n.variant),n.$instance.on(n.closeTrigger+"."+n.namespace,function(e){if(!e.isDefaultPrevented()){var t=u(e.target);("background"===n.closeOnClick&&t.is("."+n.namespace)||"anywhere"===n.closeOnClick||t.closest(o).length)&&(n.close(e),e.preventDefault())}}),this},getContent:function(){if(!1!==this.persist&&this.$content)return this.$content;var t=this,e=this.constructor.contentFilters,n=function(e){return t.$currentTarget&&t.$currentTarget.attr(e)},r=n(t.targetAttr),i=t.target||r||"",o=e[t.type];if(!o&&i in e&&(o=e[i],i=t.target&&r),i=i||n("href")||"",!o)for(var a in e)t[a]&&(o=e[a],i=t[a]);if(!o){var s=i;if(i=null,u.each(t.contentFilters,function(){return(o=e[this]).test&&(i=o.test(s)),!i&&o.regex&&s.match&&s.match(o.regex)&&(i=s),!i}),!i)return"console"in window&&window.console.error("Featherlight: no content filter found "+(s?' for "'+s+'"':" (no target specified)")),!1}return o.process.call(t,i)},setContent:function(e){return this.$instance.removeClass(this.namespace+"-loading"),this.$instance.toggleClass(this.namespace+"-iframe",e.is("iframe")),this.$instance.find("."+this.namespace+"-inner").not(e).slice(1).remove().end().replaceWith(u.contains(this.$instance[0],e[0])?"":e),this.$content=e.addClass(this.namespace+"-inner"),this},open:function(t){var n=this;if(n.$instance.hide().appendTo(n.root),!(t&&t.isDefaultPrevented()||!1===n.beforeOpen(t))){t&&t.preventDefault();var e=n.getContent();if(e)return r.push(n),s(!0),n.$instance.fadeIn(n.openSpeed),n.beforeContent(t),u.when(e).always(function(e){n.setContent(e),n.afterContent(t)}).then(n.$instance.promise()).done(function(){n.afterOpen(t)})}return n.$instance.detach(),u.Deferred().reject().promise()},close:function(e){var t=this,n=u.Deferred();return!1===t.beforeClose(e)?n.reject():(0===i(t).length&&s(!1),t.$instance.fadeOut(t.closeSpeed,function(){t.$instance.detach(),t.afterClose(e),n.resolve()})),n.promise()},resize:function(e,t){if(e&&t&&(this.$content.css("width","").css("height",""),this.$content.parent().width()');return n.onload=function(){r.naturalWidth=n.width,r.naturalHeight=n.height,t.resolve(r)},n.onerror=function(){t.reject(r)},n.src=e,t.promise()}},html:{regex:/^\s*<[\w!][^<]*>/,process:function(e){return u(e)}},ajax:{regex:/./,process:function(e){var n=u.Deferred(),r=u("
    ").load(e,function(e,t){"error"!==t&&n.resolve(r.contents()),n.fail()});return n.promise()}},iframe:{process:function(e){var t=new u.Deferred,n=u("