aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes 5 Joemann <joemann@beefree.free.de>2023-08-20 18:16:05 +0000
committerRobert Clausecker <fuz@FreeBSD.org>2023-09-24 18:57:13 +0000
commit7fa7c89ce00609a13b933c096eda065d3eb578c7 (patch)
tree866b40d2dad271c803549a017413287be52f0102
parentbacd09cf0ceafb5a20e804fbf75807f540224df5 (diff)
downloadports-7fa7c89ce00609a13b933c096eda065d3eb578c7.tar.gz
ports-7fa7c89ce00609a13b933c096eda065d3eb578c7.zip
www/hs-gitit: Restore and update to 0.15.1.1
Gitit is a wiki program written in Haskell. It uses Happstack for the web server and pandoc for markup processing. Pages and uploaded files are stored in a git, darcs, or mercurial repository and may be modified either by using the VCS's command-line tools or through the wiki's web interface. By default, pandoc's extended version of markdown is used as a markup language, but reStructuredText, LaTeX, HTML, DocBook, or Emacs Org-mode markup can also be used. Gitit can be configured to display TeX math (using texmath) and highlighted source code (using highlighting-kate). Other features include * plugins: dynamically loaded page transformations written in Haskell (see "Network.Gitit.Interface") * categories * caching * Atom feeds (site-wide and per-page) * a library, "Network.Gitit", that makes it simple to include a gitit wiki in any happstack application WWW: https://github.com/jgm/gitit PR: 273260
-rw-r--r--MOVED1
-rw-r--r--www/Makefile1
-rw-r--r--www/hs-gitit/Makefile244
-rw-r--r--www/hs-gitit/distinfo513
-rw-r--r--www/hs-gitit/files/extra-patch-data_default.conf22
-rw-r--r--www/hs-gitit/files/extra-patch-exports612
-rw-r--r--www/hs-gitit/files/extra-patch-src_Network_Gitit_Config.hs22
-rw-r--r--www/hs-gitit/files/extra-patch-src_Network_Gitit_Export.hs31
-rw-r--r--www/hs-gitit/files/extra-patch-src_Network_Gitit_Layout.hs11
-rw-r--r--www/hs-gitit/files/extra-patch-src_Network_Gitit_Types.hs15
-rwxr-xr-xwww/hs-gitit/files/gitit.in236
-rw-r--r--www/hs-gitit/files/patch-__cabal__deps_filestore-0.6.5_Data_FileStore_Darcs.hs22
-rw-r--r--www/hs-gitit/files/patch-__cabal__deps_pandoc-3.1.4_pandoc.cabal11
-rw-r--r--www/hs-gitit/files/patch-data_markup.DocBook748
-rw-r--r--www/hs-gitit/files/patch-data_markupHelp_DocBook125
-rw-r--r--www/hs-gitit/files/patch-gitit.cabal31
-rw-r--r--www/hs-gitit/files/patch-src_Network_Gitit_Initialize.hs14
-rw-r--r--www/hs-gitit/files/patch-src_Network_Gitit_Util.hs10
-rw-r--r--www/hs-gitit/pkg-descr19
-rw-r--r--www/hs-gitit/pkg-plist71
20 files changed, 2758 insertions, 1 deletions
diff --git a/MOVED b/MOVED
index 3a1b2b999822..b425875f54dc 100644
--- a/MOVED
+++ b/MOVED
@@ -66,7 +66,6 @@ x11-toolkits/hs-wxcore||2018-10-23|Has expired: Doesn't build with recent GHC ve
devel/hs-TypeCompose||2018-10-23|Has expired: Doesn't build with recent GHC version
devel/hs-PSQueue||2018-10-23|Has expired: Doesn't build with recent GHC version
devel/hs-blaze-builder-enumerator||2018-10-23|Has expired: Doesn't build with recent GHC version
-www/hs-gitit||2018-10-23|Has expired: Doesn't build with newest packages
cad/kicad-library||2018-10-25|Has expired: KiCad has been upgraded to 5.0.0
devel/linux-kernel||2018-10-29|Has expired: no longer useful
audio/py-musicbrainz2||2018-10-29|Has expired: Musicbrainz Web Service 1.0 support ended 2018-08-01
diff --git a/www/Makefile b/www/Makefile
index 8447e307aa86..fce00506ceff 100644
--- a/www/Makefile
+++ b/www/Makefile
@@ -252,6 +252,7 @@
SUBDIR += hiawatha-monitor
SUBDIR += hotcrp
SUBDIR += hs-DAV
+ SUBDIR += hs-gitit
SUBDIR += hs-hjsmin
SUBDIR += hs-postgrest
SUBDIR += hs-wai-app-static
diff --git a/www/hs-gitit/Makefile b/www/hs-gitit/Makefile
new file mode 100644
index 000000000000..d2aa255c5174
--- /dev/null
+++ b/www/hs-gitit/Makefile
@@ -0,0 +1,244 @@
+PORTNAME= gitit
+PORTVERSION= 0.15.1.1
+CATEGORIES= www haskell
+
+MAINTAINER= joemann@beefree.free.de
+COMMENT= Wiki using happstack and pandoc, and git or darcs or mercurial
+WWW= https://github.com/jgm/gitit
+
+LICENSE= GPLv2
+
+USES= cabal
+
+OPTIONS_DEFINE= PLUGINS EXPORTS
+OPTIONS_DEFAULT= PLUGINS
+
+# "Plugin support makes the gitit executable considerably larger
+# and more memory-hungry". (jgm)
+PLUGINS_DESC= Enable support for plugins
+PLUGINS_CABAL_FLAGS= plugins
+
+# "This feature is a security risk; it provided multiple
+# vectors by which contents of files could be exposed". (jgm)
+EXPORTS_DESC= Enable page exports to many formats (insecure!)
+# This is the commit which removed the export options:
+# https://github.com/jgm/gitit/commit/eed32638f4f6e3b2f4b8a9a04c4b72001acf9ad8
+# To re-enable exports in gitit we have to revert it:
+# git diff --no-prefix eed3263 735096f > extra-patch-exports
+EXPORTS_EXTRA_PATCHES= ${PATCHDIR}/extra-patch-exports \
+ ${PATCHDIR}/extra-patch-data_default.conf \
+ ${PATCHDIR}/extra-patch-src_Network_Gitit_Config.hs \
+ ${PATCHDIR}/extra-patch-src_Network_Gitit_Export.hs \
+ ${PATCHDIR}/extra-patch-src_Network_Gitit_Layout.hs \
+ ${PATCHDIR}/extra-patch-src_Network_Gitit_Types.hs
+# Besides applying the above patches one also has to set "exports: yes"
+# in a gitit instance's config file to enable exports for that instance.
+
+USE_CABAL= ConfigFile-1.1.4_1 \
+ Diff-0.4.1 \
+ Glob-0.10.2_3 \
+ HStringTemplate-0.8.8_5 \
+ HTTP-4000.4.1_2 \
+ JuicyPixels-3.3.8 \
+ MissingH-1.6.0.0 \
+ OneTuple-0.4.1.1 \
+ Only-0.1_1 \
+ QuickCheck-2.14.3 \
+ SHA-1.6.4.4 \
+ StateVar-1.2.2 \
+ aeson-2.1.2.1_3 \
+ aeson-pretty-0.8.10 \
+ ansi-terminal-1.0 \
+ ansi-terminal-types-0.11.5_1 \
+ appar-0.1.8 \
+ asn1-encoding-0.9.6_2 \
+ asn1-parse-0.9.5 \
+ asn1-types-0.3.4 \
+ assoc-1.1 \
+ async-2.2.4_3 \
+ attoparsec-0.14.4_3 \
+ base-compat-0.12.2 \
+ base-compat-batteries-0.12.2 \
+ base-orphans-0.9.0 \
+ base16-bytestring-1.0.2.0 \
+ base64-0.4.2.4_3 \
+ base64-bytestring-1.2.1.0 \
+ basement-0.0.16 \
+ bifunctors-5.6.1 \
+ bitvec-1.1.4.0 \
+ blaze-builder-0.4.2.2_1 \
+ blaze-html-0.9.1.2_2 \
+ blaze-markup-0.8.2.8_4 \
+ byteorder-1.0.4 \
+ cabal-doctest-1.0.9_3 \
+ case-insensitive-1.2.1.0 \
+ cassava-0.5.3.0_1 \
+ cereal-0.5.8.3 \
+ citeproc-0.8.1 \
+ colour-2.3.6 \
+ commonmark-0.2.3 \
+ commonmark-extensions-0.2.3.4 \
+ commonmark-pandoc-0.2.1.3 \
+ comonad-5.0.8_1 \
+ conduit-1.3.5 \
+ conduit-extra-1.3.6 \
+ contravariant-1.5.5 \
+ cookie-0.4.6 \
+ cryptohash-md5-0.11.101.0_2 \
+ cryptohash-sha1-0.11.101.0_2 \
+ crypton-0.33 \
+ crypton-connection-0.3.1 \
+ crypton-x509-1.7.6_1 \
+ crypton-x509-store-1.6.9 \
+ crypton-x509-system-1.6.7 \
+ crypton-x509-validation-1.6.12 \
+ cryptonite-0.30 \
+ css-text-0.1.3.0 \
+ data-default-0.7.1.1 \
+ data-default-class-0.1.2.0 \
+ data-default-instances-containers-0.0.1 \
+ data-default-instances-dlist-0.0.1 \
+ data-default-instances-old-locale-0.0.1 \
+ data-fix-0.3.2_4 \
+ digest-0.0.1.7 \
+ distributive-0.6.2.1_1 \
+ dlist-1.0 \
+ doclayout-0.4.0.1 \
+ doctemplates-0.11 \
+ emojis-0.1.2 \
+ entropy-0.4.1.10_1 \
+ extensible-exceptions-0.1.1.4 \
+ feed-1.3.2.1_1 \
+ file-embed-0.0.15.0 \
+ filestore-0.6.5_1 \
+ foldable1-classes-compat-0.1_2 \
+ generically-0.1.1_1 \
+ ghc-paths-0.1.0.12_5 \
+ gridtables-0.1.0.0 \
+ haddock-library-1.11.0_2 \
+ happstack-server-7.8.0.2 \
+ happy-1.20.1.1 \
+ hashable-1.4.2.0_1 \
+ haskell-lexer-1.1.1 \
+ hoauth2-2.8.0 \
+ hourglass-0.2.12 \
+ hsc2hs-0.68.9 \
+ hslogger-1.3.1.0_7 \
+ html-1.0.1.2 \
+ http-client-0.7.13.1_1 \
+ http-client-tls-0.3.6.2 \
+ http-conduit-2.3.8.2 \
+ http-types-0.12.3 \
+ indexed-traversable-0.1.2.1 \
+ indexed-traversable-instances-0.1.1.2_1 \
+ integer-logarithms-1.0.3.1_4 \
+ iproute-1.7.12 \
+ ipynb-0.2_1 \
+ jira-wiki-markup-1.5.1 \
+ json-0.10_1 \
+ libyaml-0.1.2_1 \
+ memory-0.18.0 \
+ microlens-0.4.13.1 \
+ mime-types-0.1.1.0 \
+ monad-control-1.0.3.1 \
+ mono-traversable-1.0.15.3 \
+ network-3.1.4.0 \
+ network-bsd-2.8.1.0_4 \
+ network-info-0.2.1 \
+ network-uri-2.6.4.2 \
+ old-locale-1.0.0.7_2 \
+ old-time-1.1.0.3_2 \
+ ordered-containers-0.2.3 \
+ pandoc-3.1.4 \
+ pandoc-types-1.23 \
+ pem-0.2.4 \
+ pretty-show-1.10 \
+ primitive-0.8.0.0 \
+ random-1.2.1.1 \
+ recaptcha-0.1.0.4 \
+ regex-base-0.94.0.2_1 \
+ regex-compat-0.95.2.1_2 \
+ regex-posix-0.96.0.1_1 \
+ regex-tdfa-1.3.2.1 \
+ resourcet-1.3.0 \
+ safe-0.3.19 \
+ scientific-0.3.7.0_5 \
+ semialign-1.3 \
+ semigroupoids-6.0.0.1 \
+ semigroups-0.20 \
+ sendfile-0.7.11.4 \
+ skylighting-0.13.3 \
+ skylighting-core-0.13.3 \
+ skylighting-format-ansi-0.1 \
+ skylighting-format-blaze-html-0.1.1 \
+ skylighting-format-context-0.1.0.2 \
+ skylighting-format-latex-0.1 \
+ socks-0.6.1 \
+ split-0.2.3.5 \
+ splitmix-0.1.0.4_2 \
+ streaming-commons-0.2.2.6 \
+ strict-0.5 \
+ syb-0.7.2.3 \
+ system-filepath-0.4.14_1 \
+ tagged-0.8.7 \
+ tagsoup-0.14.8 \
+ temporary-1.3 \
+ texmath-0.12.8 \
+ text-conversions-0.3.1.1 \
+ text-short-0.1.5_2 \
+ th-abstraction-0.5.0.0 \
+ th-compat-0.1.4_2 \
+ th-lift-0.8.3 \
+ th-lift-instances-0.1.20 \
+ these-1.2 \
+ threads-0.5.1.7_1 \
+ time-compat-1.9.6.1_5 \
+ time-locale-compat-0.1.1.5 \
+ tls-1.7.0 \
+ transformers-base-0.4.6 \
+ transformers-compat-0.7.2 \
+ typed-process-0.2.11.0 \
+ typst-0.1.0.0 \
+ typst-symbols-0.1.2 \
+ unicode-collation-0.1.3.4 \
+ unicode-data-0.4.0.1_1 \
+ unicode-transforms-0.4.0.1_3 \
+ uniplate-1.6.13_1 \
+ unix-time-0.4.10 \
+ unliftio-core-0.2.1.0_2 \
+ unordered-containers-0.2.19.1_2 \
+ uri-bytestring-0.3.3.1 \
+ uri-bytestring-aeson-0.1.0.8 \
+ url-2.1.3 \
+ utf8-string-1.0.2 \
+ uuid-1.3.15_2 \
+ uuid-types-1.0.5_4 \
+ vector-0.13.0.0_3 \
+ vector-algorithms-0.9.0.1_2 \
+ vector-stream-0.1.0.0_2 \
+ void-0.7.3 \
+ witherable-0.4.2_4 \
+ xml-1.3.14_2 \
+ xml-conduit-1.9.1.3 \
+ xml-types-0.3.8 \
+ xss-sanitize-0.3.7.2 \
+ yaml-0.11.11.2_2 \
+ zip-archive-0.4.3 \
+ zlib-0.6.3.0_1
+
+# Switch off idle GC using -with_rtsopts=-I0 in gitit.cabal
+CABAL_FLAGS= with_rtsopts
+
+CABAL_EXECUTABLES= gitit expireGititCache
+CABAL_WRAPPER_SCRIPTS= gitit
+
+USE_RC_SUBR= gitit
+
+post-install:
+ cd ${WRKSRC} && \
+ ${COPYTREE_SHARE} README.markdown ${STAGEDIR}${DATADIR} && \
+ ${COPYTREE_SHARE} data ${STAGEDIR}${DATADIR}
+ cd ${STAGEDIR}${DATADIR} && \
+ ${FIND} data -name '*.orig' -exec ${RM} {} ";"
+
+.include <bsd.port.mk>
diff --git a/www/hs-gitit/distinfo b/www/hs-gitit/distinfo
new file mode 100644
index 000000000000..61e515f67cdf
--- /dev/null
+++ b/www/hs-gitit/distinfo
@@ -0,0 +1,513 @@
+TIMESTAMP = 1688557589
+SHA256 (cabal/gitit-0.15.1.1/gitit-0.15.1.1.tar.gz) = 90bc0d30386be90f11e4a6e67963738580327da0646a4c79ea45e16eda02d55d
+SIZE (cabal/gitit-0.15.1.1/gitit-0.15.1.1.tar.gz) = 275402
+SHA256 (cabal/ConfigFile-1.1.4/ConfigFile-1.1.4.tar.gz) = ae087b359ff2945a62b671449227e0a811d143ee651179f4e7e9c66548e0f514
+SIZE (cabal/ConfigFile-1.1.4/ConfigFile-1.1.4.tar.gz) = 28969
+SHA256 (cabal/ConfigFile-1.1.4/revision/1.cabal) = 4cb481f88bbbbba5a61d2c1aa76fda01ae3d8ba9d11439a6cf56a86bfa791883
+SIZE (cabal/ConfigFile-1.1.4/revision/1.cabal) = 2097
+SHA256 (cabal/Diff-0.4.1/Diff-0.4.1.tar.gz) = fd5e4aaac7219bcbb14834fb8580ebe0aae905958d0ad74f5338ea290b372670
+SIZE (cabal/Diff-0.4.1/Diff-0.4.1.tar.gz) = 8759
+SHA256 (cabal/Glob-0.10.2/Glob-0.10.2.tar.gz) = 6af672ac8427d35cbd42d64142dc288feab266f0be92dae3c696e8860d8173c0
+SIZE (cabal/Glob-0.10.2/Glob-0.10.2.tar.gz) = 30226
+SHA256 (cabal/Glob-0.10.2/revision/3.cabal) = dd2ddbecae8f84e8f4cacb5b856901a19c25ceaa11f2525d3ee88d034acb0081
+SIZE (cabal/Glob-0.10.2/revision/3.cabal) = 2938
+SHA256 (cabal/HStringTemplate-0.8.8/HStringTemplate-0.8.8.tar.gz) = 717df416550bdc62f2070c1a86238efe535b0fa41c5fd708c4f631f927880cd9
+SIZE (cabal/HStringTemplate-0.8.8/HStringTemplate-0.8.8.tar.gz) = 18043
+SHA256 (cabal/HStringTemplate-0.8.8/revision/5.cabal) = 8cf2c140b0f7c6357dc21d0a9c218233309220278e836208f4b8e911be1d1492
+SIZE (cabal/HStringTemplate-0.8.8/revision/5.cabal) = 1985
+SHA256 (cabal/HTTP-4000.4.1/HTTP-4000.4.1.tar.gz) = df31d8efec775124dab856d7177ddcba31be9f9e0836ebdab03d94392f2dd453
+SIZE (cabal/HTTP-4000.4.1/HTTP-4000.4.1.tar.gz) = 74330
+SHA256 (cabal/HTTP-4000.4.1/revision/2.cabal) = d9220cc1b8c1f287248d650910710b96e62e54530772e3bcd19dbdec6547f8ae
+SIZE (cabal/HTTP-4000.4.1/revision/2.cabal) = 5862
+SHA256 (cabal/JuicyPixels-3.3.8/JuicyPixels-3.3.8.tar.gz) = d3a0f6ca3515a1b3d526cbf79f2e0b0aab57f208ab216f9c26437bbcd86fb63e
+SIZE (cabal/JuicyPixels-3.3.8/JuicyPixels-3.3.8.tar.gz) = 132479
+SHA256 (cabal/MissingH-1.6.0.0/MissingH-1.6.0.0.tar.gz) = fc3b9684a0a14fc9a0afdd9c8ffb1ae93db122c7150b1eea1769065658092d4f
+SIZE (cabal/MissingH-1.6.0.0/MissingH-1.6.0.0.tar.gz) = 109652
+SHA256 (cabal/OneTuple-0.4.1.1/OneTuple-0.4.1.1.tar.gz) = c9e764d4ee1e57cad8341bd5d0de33ba3a52b6793fc1309679f2bf60c030bb2b
+SIZE (cabal/OneTuple-0.4.1.1/OneTuple-0.4.1.1.tar.gz) = 5601
+SHA256 (cabal/Only-0.1/Only-0.1.tar.gz) = ab7aa193e8c257d3bda6b0b3c1cbcf74cdaa85ab08cb20c2dd62ba248c1ab265
+SIZE (cabal/Only-0.1/Only-0.1.tar.gz) = 1960
+SHA256 (cabal/Only-0.1/revision/1.cabal) = f92f5da97e647451f1ee7f5bf44914fb75062d08ccd3f36b2000d649c63d13aa
+SIZE (cabal/Only-0.1/revision/1.cabal) = 1373
+SHA256 (cabal/QuickCheck-2.14.3/QuickCheck-2.14.3.tar.gz) = 5c0f22b36b28a1a8fa110b3819818d3f29494a3b0dedbae299f064123ca70501
+SIZE (cabal/QuickCheck-2.14.3/QuickCheck-2.14.3.tar.gz) = 76849
+SHA256 (cabal/SHA-1.6.4.4/SHA-1.6.4.4.tar.gz) = 6bd950df6b11a3998bb1452d875d2da043ee43385459afc5f16d471d25178b44
+SIZE (cabal/SHA-1.6.4.4/SHA-1.6.4.4.tar.gz) = 2715144
+SHA256 (cabal/StateVar-1.2.2/StateVar-1.2.2.tar.gz) = 5e4b39da395656a59827b0280508aafdc70335798b50e5d6fd52596026251825
+SIZE (cabal/StateVar-1.2.2/StateVar-1.2.2.tar.gz) = 5048
+SHA256 (cabal/aeson-2.1.2.1/aeson-2.1.2.1.tar.gz) = 5d4042b903ce181ee023bbf908f37a3f55e820c5f0df102683b87f963e3522c6
+SIZE (cabal/aeson-2.1.2.1/aeson-2.1.2.1.tar.gz) = 335908
+SHA256 (cabal/aeson-2.1.2.1/revision/3.cabal) = 5b8d62a60963a925c4d123a46e42a8e235a32188522c9f119f64ac228c2612a7
+SIZE (cabal/aeson-2.1.2.1/revision/3.cabal) = 6359
+SHA256 (cabal/aeson-pretty-0.8.10/aeson-pretty-0.8.10.tar.gz) = 2a21f2cd78adcb149ceba770239ed664519552911e7680172b18ff695cfa7ae5
+SIZE (cabal/aeson-pretty-0.8.10/aeson-pretty-0.8.10.tar.gz) = 5894
+SHA256 (cabal/ansi-terminal-1.0/ansi-terminal-1.0.tar.gz) = 0798a98f79189e62b5ff0aa247ba95fc3845f0f6f1e14ecceb37facfbdd5cfc9
+SIZE (cabal/ansi-terminal-1.0/ansi-terminal-1.0.tar.gz) = 31745
+SHA256 (cabal/ansi-terminal-types-0.11.5/ansi-terminal-types-0.11.5.tar.gz) = bf7b230389f43105100a6d5740822598a88b38eaaf7d042de595ccf72db4fdd1
+SIZE (cabal/ansi-terminal-types-0.11.5/ansi-terminal-types-0.11.5.tar.gz) = 4660
+SHA256 (cabal/ansi-terminal-types-0.11.5/revision/1.cabal) = f78440dfd95c4509e88855ac7cc2d9566ddf956a92c1290404cac93ad1a1b00a
+SIZE (cabal/ansi-terminal-types-0.11.5/revision/1.cabal) = 1482
+SHA256 (cabal/appar-0.1.8/appar-0.1.8.tar.gz) = c4ceeddc26525b58d82c41b6d3e32141371a200a6794aae185b6266ccc81631f
+SIZE (cabal/appar-0.1.8/appar-0.1.8.tar.gz) = 4037
+SHA256 (cabal/asn1-encoding-0.9.6/asn1-encoding-0.9.6.tar.gz) = d9f8deabd3b908e5cf83c0d813c08dc0143b3ec1c0d97f660d2cfa02c1c8da0a
+SIZE (cabal/asn1-encoding-0.9.6/asn1-encoding-0.9.6.tar.gz) = 17343
+SHA256 (cabal/asn1-encoding-0.9.6/revision/2.cabal) = 27ed8f6043aed79630313bb931f7c8e2b510f0b4586cd55c16ae040c7d1ea098
+SIZE (cabal/asn1-encoding-0.9.6/revision/2.cabal) = 2060
+SHA256 (cabal/asn1-parse-0.9.5/asn1-parse-0.9.5.tar.gz) = 8f1fe1344d30b39dc594d74df2c55209577722af1497204b4c2b6d6e8747f39e
+SIZE (cabal/asn1-parse-0.9.5/asn1-parse-0.9.5.tar.gz) = 2951
+SHA256 (cabal/asn1-types-0.3.4/asn1-types-0.3.4.tar.gz) = 78ee92a251379298ca820fa53edbf4b33c539b9fcd887c86f520c30e3b4e21a8
+SIZE (cabal/asn1-types-0.3.4/asn1-types-0.3.4.tar.gz) = 6472
+SHA256 (cabal/assoc-1.1/assoc-1.1.tar.gz) = 7aa2e6548b3d9d49a286ac20639479aaf6c47a1446113ed784d98737c5f60df4
+SIZE (cabal/assoc-1.1/assoc-1.1.tar.gz) = 3193
+SHA256 (cabal/async-2.2.4/async-2.2.4.tar.gz) = 484df85be0e76c4fed9376451e48e1d0c6e97952ce79735b72d54297e7e0a725
+SIZE (cabal/async-2.2.4/async-2.2.4.tar.gz) = 14148
+SHA256 (cabal/async-2.2.4/revision/3.cabal) = 46367dc0c8326dcbeb7b93f200b567491c2f6029bccf822b8bb26ee660397e08
+SIZE (cabal/async-2.2.4/revision/3.cabal) = 3112
+SHA256 (cabal/attoparsec-0.14.4/attoparsec-0.14.4.tar.gz) = 3f337fe58624565de12426f607c23e60c7b09c86b4e3adfc827ca188c9979e6c
+SIZE (cabal/attoparsec-0.14.4/attoparsec-0.14.4.tar.gz) = 160701
+SHA256 (cabal/attoparsec-0.14.4/revision/3.cabal) = 50475b722305175f57a3ee3dbaee10aa4b91f61c9717b85b718a7df37c223fb2
+SIZE (cabal/attoparsec-0.14.4/revision/3.cabal) = 5679
+SHA256 (cabal/base-compat-0.12.2/base-compat-0.12.2.tar.gz) = a62adc883a5ac436f80e4ae02c3c56111cf1007492f267c291139a668d2150bd
+SIZE (cabal/base-compat-0.12.2/base-compat-0.12.2.tar.gz) = 36393
+SHA256 (cabal/base-compat-batteries-0.12.2/base-compat-batteries-0.12.2.tar.gz) = ede9092e07f904e0759160bf1ecd3fb7eb043bae6dc89a37c3dc94829ec5eb99
+SIZE (cabal/base-compat-batteries-0.12.2/base-compat-batteries-0.12.2.tar.gz) = 17645
+SHA256 (cabal/base-orphans-0.9.0/base-orphans-0.9.0.tar.gz) = 613ed4d8241ed5a648a59ae6569a6962990bb545711d020d49fb83fa12d16e62
+SIZE (cabal/base-orphans-0.9.0/base-orphans-0.9.0.tar.gz) = 26025
+SHA256 (cabal/base16-bytestring-1.0.2.0/base16-bytestring-1.0.2.0.tar.gz) = 1d5a91143ef0e22157536093ec8e59d226a68220ec89378d5dcaeea86472c784
+SIZE (cabal/base16-bytestring-1.0.2.0/base16-bytestring-1.0.2.0.tar.gz) = 7219
+SHA256 (cabal/base64-0.4.2.4/base64-0.4.2.4.tar.gz) = 640a2d0afcb07e1de2e0a13a5e942b0265781c5942bd642a8793e7b019be3585
+SIZE (cabal/base64-0.4.2.4/base64-0.4.2.4.tar.gz) = 22065
+SHA256 (cabal/base64-0.4.2.4/revision/3.cabal) = 10103a0b30d5028b8e1ee9811b76b946ca7713bf8234549191b69f55ee0599d5
+SIZE (cabal/base64-0.4.2.4/revision/3.cabal) = 2862
+SHA256 (cabal/base64-bytestring-1.2.1.0/base64-bytestring-1.2.1.0.tar.gz) = fbf8ed30edde271eb605352021431d8f1b055f95a56af31fe2eacf6bdfdc49c9
+SIZE (cabal/base64-bytestring-1.2.1.0/base64-bytestring-1.2.1.0.tar.gz) = 13743
+SHA256 (cabal/basement-0.0.16/basement-0.0.16.tar.gz) = 7fb77e249aef76ba5aed3059d556800ce02b614597c488ba01f0a16449146300
+SIZE (cabal/basement-0.0.16/basement-0.0.16.tar.gz) = 134837
+SHA256 (cabal/bifunctors-5.6.1/bifunctors-5.6.1.tar.gz) = 06381471b5be16516a1b2c4b21a5101a3d991038bface8e0cad144c0044d57fc
+SIZE (cabal/bifunctors-5.6.1/bifunctors-5.6.1.tar.gz) = 38170
+SHA256 (cabal/bitvec-1.1.4.0/bitvec-1.1.4.0.tar.gz) = 68f0b1e01604ca8bdeaef47b3621faec456d6f76d6820a321eccd4d3749454a8
+SIZE (cabal/bitvec-1.1.4.0/bitvec-1.1.4.0.tar.gz) = 35559
+SHA256 (cabal/blaze-builder-0.4.2.2/blaze-builder-0.4.2.2.tar.gz) = 2cdc998c021d3a5f2a66a95138b93386271c26a117e7676d78264a90e536af67
+SIZE (cabal/blaze-builder-0.4.2.2/blaze-builder-0.4.2.2.tar.gz) = 60707
+SHA256 (cabal/blaze-builder-0.4.2.2/revision/1.cabal) = f0017df374c330de0ebe0eb15eae8c48427bddefa1d81a3cb31c0a4812ecdb08
+SIZE (cabal/blaze-builder-0.4.2.2/revision/1.cabal) = 3685
+SHA256 (cabal/blaze-html-0.9.1.2/blaze-html-0.9.1.2.tar.gz) = 60503f42546c6c1b954014d188ea137e43d74dcffd2bf6157c113fd91a0c394c
+SIZE (cabal/blaze-html-0.9.1.2/blaze-html-0.9.1.2.tar.gz) = 81617
+SHA256 (cabal/blaze-html-0.9.1.2/revision/2.cabal) = 74b89ffa665891f528f571ce9e3c2dce24f698563f14b6f5e9e0512eccdf5dc2
+SIZE (cabal/blaze-html-0.9.1.2/revision/2.cabal) = 3062
+SHA256 (cabal/blaze-markup-0.8.2.8/blaze-markup-0.8.2.8.tar.gz) = 43fc3f6872dc8d1be8d0fe091bd4775139b42179987f33d6490a7c5f1e07a349
+SIZE (cabal/blaze-markup-0.8.2.8/blaze-markup-0.8.2.8.tar.gz) = 14519
+SHA256 (cabal/blaze-markup-0.8.2.8/revision/4.cabal) = a8fe050fb93397df36c3f5b19c22628e0e54446382e0f6775e2b45c1ad999eee
+SIZE (cabal/blaze-markup-0.8.2.8/revision/4.cabal) = 2271
+SHA256 (cabal/byteorder-1.0.4/byteorder-1.0.4.tar.gz) = bd20bbb586947f99c38a4c93d9d0266f49f6fc581767b51ba568f6d5d52d2919
+SIZE (cabal/byteorder-1.0.4/byteorder-1.0.4.tar.gz) = 2030
+SHA256 (cabal/cabal-doctest-1.0.9/cabal-doctest-1.0.9.tar.gz) = 5556088496111d33810c4ae6c4a065bb37fa3315e9e8891e8000b1ab6707ba73
+SIZE (cabal/cabal-doctest-1.0.9/cabal-doctest-1.0.9.tar.gz) = 10770
+SHA256 (cabal/cabal-doctest-1.0.9/revision/3.cabal) = 6dea0dbd1457f43d96ce1cfb1bab8b9f55d4fb82940e2bfa5aad78e6e2260656
+SIZE (cabal/cabal-doctest-1.0.9/revision/3.cabal) = 1517
+SHA256 (cabal/case-insensitive-1.2.1.0/case-insensitive-1.2.1.0.tar.gz) = 296dc17e0c5f3dfb3d82ced83e4c9c44c338ecde749b278b6eae512f1d04e406
+SIZE (cabal/case-insensitive-1.2.1.0/case-insensitive-1.2.1.0.tar.gz) = 53609
+SHA256 (cabal/cassava-0.5.3.0/cassava-0.5.3.0.tar.gz) = b4c8451f433ad7725cb8b9f7a7efe598ba103b16584713c91f48ae023829e9be
+SIZE (cabal/cassava-0.5.3.0/cassava-0.5.3.0.tar.gz) = 38224
+SHA256 (cabal/cassava-0.5.3.0/revision/1.cabal) = 3e5a702f0194968ddf2ef38343318334e7c7de44b90c7822e9e20a7e98685bd1
+SIZE (cabal/cassava-0.5.3.0/revision/1.cabal) = 6121
+SHA256 (cabal/cereal-0.5.8.3/cereal-0.5.8.3.tar.gz) = 99905220661b26e5bd91130bd9772554938608a5b1d717240a6eb331121e0f6a
+SIZE (cabal/cereal-0.5.8.3/cereal-0.5.8.3.tar.gz) = 20166
+SHA256 (cabal/citeproc-0.8.1/citeproc-0.8.1.tar.gz) = 33523bbd8c38f72c6d606e02d11b93254171f801be4f2a0cb4d34d6626426400
+SIZE (cabal/citeproc-0.8.1/citeproc-0.8.1.tar.gz) = 549947
+SHA256 (cabal/colour-2.3.6/colour-2.3.6.tar.gz) = 2cd35dcd6944a5abc9f108a5eb5ee564b6b1fa98a9ec79cefcc20b588991f871
+SIZE (cabal/colour-2.3.6/colour-2.3.6.tar.gz) = 20675
+SHA256 (cabal/commonmark-0.2.3/commonmark-0.2.3.tar.gz) = 745ade908c7cd8a61538d9c3e60363d5e1175fd7f544f557ff52517c8408d905
+SIZE (cabal/commonmark-0.2.3/commonmark-0.2.3.tar.gz) = 102342
+SHA256 (cabal/commonmark-extensions-0.2.3.4/commonmark-extensions-0.2.3.4.tar.gz) = a084efe90311f8a0d83d8622ef76f17dfdb974a84b74df454cf906b0ee64665e
+SIZE (cabal/commonmark-extensions-0.2.3.4/commonmark-extensions-0.2.3.4.tar.gz) = 37768
+SHA256 (cabal/commonmark-pandoc-0.2.1.3/commonmark-pandoc-0.2.1.3.tar.gz) = 77adcf9074299a5b318901d057ebf49a7f032245f2aee783ef475539b0897f21
+SIZE (cabal/commonmark-pandoc-0.2.1.3/commonmark-pandoc-0.2.1.3.tar.gz) = 4907
+SHA256 (cabal/comonad-5.0.8/comonad-5.0.8.tar.gz) = ef6cdf2cc292cc43ee6aa96c581b235fdea8ab44a0bffb24dc79ae2b2ef33d13
+SIZE (cabal/comonad-5.0.8/comonad-5.0.8.tar.gz) = 15227
+SHA256 (cabal/comonad-5.0.8/revision/1.cabal) = 1f1aabd73ec7f80f20cf078a748a60cd48d8e57277802fdf6a9ab3601a9b8f7e
+SIZE (cabal/comonad-5.0.8/revision/1.cabal) = 3631
+SHA256 (cabal/conduit-1.3.5/conduit-1.3.5.tar.gz) = 2bb0d3e0eecc43e3d1d8cfc2125914f9175cde752be2d5908a1e120f321c782d
+SIZE (cabal/conduit-1.3.5/conduit-1.3.5.tar.gz) = 88893
+SHA256 (cabal/conduit-extra-1.3.6/conduit-extra-1.3.6.tar.gz) = 8950c38049d892c38590d389bed49ecf880671f58ec63dd4709d9fe3d4b8f153
+SIZE (cabal/conduit-extra-1.3.6/conduit-extra-1.3.6.tar.gz) = 33321
+SHA256 (cabal/contravariant-1.5.5/contravariant-1.5.5.tar.gz) = 062fd66580d7aad0b5ba93e644ffa7feee69276ef50f20d4ed9f1deb7642dffa
+SIZE (cabal/contravariant-1.5.5/contravariant-1.5.5.tar.gz) = 13815
+SHA256 (cabal/cookie-0.4.6/cookie-0.4.6.tar.gz) = 8c41a956c32b9733d525a53d43b0338a236a34d36658ecc4364c8249a6664baa
+SIZE (cabal/cookie-0.4.6/cookie-0.4.6.tar.gz) = 6219
+SHA256 (cabal/cryptohash-md5-0.11.101.0/cryptohash-md5-0.11.101.0.tar.gz) = 3b08db0ae39df2b44e83053ad30d7546a4c6200a852c22a240a7e03ae1080f05
+SIZE (cabal/cryptohash-md5-0.11.101.0/cryptohash-md5-0.11.101.0.tar.gz) = 11872
+SHA256 (cabal/cryptohash-md5-0.11.101.0/revision/2.cabal) = 8d8172dfca073406d6d50a122a8a8caa53a0ea8f3827232a40b3fd7c4de85484
+SIZE (cabal/cryptohash-md5-0.11.101.0/revision/2.cabal) = 3104
+SHA256 (cabal/cryptohash-sha1-0.11.101.0/cryptohash-sha1-0.11.101.0.tar.gz) = a4042c97ad02eb68e766577ca35c01970c33e96cfd74ccb4dd403e3476a23241
+SIZE (cabal/cryptohash-sha1-0.11.101.0/cryptohash-sha1-0.11.101.0.tar.gz) = 11563
+SHA256 (cabal/cryptohash-sha1-0.11.101.0/revision/2.cabal) = 25be9e5bb979c1b96d7695d9cbb6a40ec345025e7a100b2d71d499812c2e89ec
+SIZE (cabal/cryptohash-sha1-0.11.101.0/revision/2.cabal) = 3094
+SHA256 (cabal/crypton-0.33/crypton-0.33.tar.gz) = e66fa0a75c2afe149205df9f496f05d31fa94d8116551632d39e37e58fe60520
+SIZE (cabal/crypton-0.33/crypton-0.33.tar.gz) = 618064
+SHA256 (cabal/crypton-connection-0.3.1/crypton-connection-0.3.1.tar.gz) = 03073694f6525f975db78dbc67c34e89bb27b95cf863d4a3a77dc6ef49d81dcc
+SIZE (cabal/crypton-connection-0.3.1/crypton-connection-0.3.1.tar.gz) = 9112
+SHA256 (cabal/crypton-x509-1.7.6/crypton-x509-1.7.6.tar.gz) = ebb74aca2d00261e2fb4927d211ba1a174e190e5257f309e190f019727f8caff
+SIZE (cabal/crypton-x509-1.7.6/crypton-x509-1.7.6.tar.gz) = 21557
+SHA256 (cabal/crypton-x509-1.7.6/revision/1.cabal) = c567657a705b6d6521f9dd2de999bf530d618ec00f3b939df76a41fb0fe94281
+SIZE (cabal/crypton-x509-1.7.6/revision/1.cabal) = 2339
+SHA256 (cabal/crypton-x509-store-1.6.9/crypton-x509-store-1.6.9.tar.gz) = 3e6218af12e039cc291d19792db044df1647b5cf0bbc60b909a027e7595a256f
+SIZE (cabal/crypton-x509-store-1.6.9/crypton-x509-store-1.6.9.tar.gz) = 12735
+SHA256 (cabal/crypton-x509-system-1.6.7/crypton-x509-system-1.6.7.tar.gz) = a436261e5f5e83d85080f57a5509c8224c9e75a6e56d0c43a7d2967052b634ca
+SIZE (cabal/crypton-x509-system-1.6.7/crypton-x509-system-1.6.7.tar.gz) = 3496
+SHA256 (cabal/crypton-x509-validation-1.6.12/crypton-x509-validation-1.6.12.tar.gz) = 0e60b7e237a4fd5e7e6e7200018c7947314292ef63751cbb51877836ebe650f6
+SIZE (cabal/crypton-x509-validation-1.6.12/crypton-x509-validation-1.6.12.tar.gz) = 19573
+SHA256 (cabal/cryptonite-0.30/cryptonite-0.30.tar.gz) = 56099c8a8aa01d2ee914b670c97c1f818186dbb886e2025b73d9c2afe3496b1d
+SIZE (cabal/cryptonite-0.30/cryptonite-0.30.tar.gz) = 621062
+SHA256 (cabal/css-text-0.1.3.0/css-text-0.1.3.0.tar.gz) = 5ff507bf3863219f41e7f2d215e5511fe15ee13d1e28bd3ee64e0b0b894bcd7a
+SIZE (cabal/css-text-0.1.3.0/css-text-0.1.3.0.tar.gz) = 4594
+SHA256 (cabal/data-default-0.7.1.1/data-default-0.7.1.1.tar.gz) = b0f95d279cd75cacaa8152a01590dc3460f7134f6840b37052abb3ba3cb2a511
+SIZE (cabal/data-default-0.7.1.1/data-default-0.7.1.1.tar.gz) = 1627
+SHA256 (cabal/data-default-class-0.1.2.0/data-default-class-0.1.2.0.tar.gz) = 4f01b423f000c3e069aaf52a348564a6536797f31498bb85c3db4bd2d0973e56
+SIZE (cabal/data-default-class-0.1.2.0/data-default-class-0.1.2.0.tar.gz) = 2522
+SHA256 (cabal/data-default-instances-containers-0.0.1/data-default-instances-containers-0.0.1.tar.gz) = a55e07af005c9815d82f3fc95e125db82994377c9f4a769428878701d4ec081a
+SIZE (cabal/data-default-instances-containers-0.0.1/data-default-instances-containers-0.0.1.tar.gz) = 1659
+SHA256 (cabal/data-default-instances-dlist-0.0.1/data-default-instances-dlist-0.0.1.tar.gz) = 7d683711cbf08abd7adcd5ac2be825381308d220397315a5570fe61b719b5959
+SIZE (cabal/data-default-instances-dlist-0.0.1/data-default-instances-dlist-0.0.1.tar.gz) = 1503
+SHA256 (cabal/data-default-instances-old-locale-0.0.1/data-default-instances-old-locale-0.0.1.tar.gz) = 60d3b02922958c4908d7bf2b24ddf61511665745f784227d206745784b0c0802
+SIZE (cabal/data-default-instances-old-locale-0.0.1/data-default-instances-old-locale-0.0.1.tar.gz) = 1519
+SHA256 (cabal/data-fix-0.3.2/data-fix-0.3.2.tar.gz) = 3a172d3bc0639c327345e965f9d9023e099425814b28dcdb7b60ff66d66219cc
+SIZE (cabal/data-fix-0.3.2/data-fix-0.3.2.tar.gz) = 5842
+SHA256 (cabal/data-fix-0.3.2/revision/4.cabal) = c27b354476175581925217323e0f559d35ceff26907ceaa03cb65c6df38e3de9
+SIZE (cabal/data-fix-0.3.2/revision/4.cabal) = 1720
+SHA256 (cabal/digest-0.0.1.7/digest-0.0.1.7.tar.gz) = b23d6c804e6fed0ac9bb0d35b7aed5785330d63efebe296cf0073dab17e05f0a
+SIZE (cabal/digest-0.0.1.7/digest-0.0.1.7.tar.gz) = 4067
+SHA256 (cabal/distributive-0.6.2.1/distributive-0.6.2.1.tar.gz) = d7351392e078f58caa46630a4b9c643e1e2e9dddee45848c5c8358e7b1316b91
+SIZE (cabal/distributive-0.6.2.1/distributive-0.6.2.1.tar.gz) = 8140
+SHA256 (cabal/distributive-0.6.2.1/revision/1.cabal) = 0f99f5541cca04acf89b64432b03422b6408e830a8dff30e6c4334ef1a48680c
+SIZE (cabal/distributive-0.6.2.1/revision/1.cabal) = 2996
+SHA256 (cabal/dlist-1.0/dlist-1.0.tar.gz) = 173d637328bb173fcc365f30d29ff4a94292a1e0e5558aeb3dfc11de81510115
+SIZE (cabal/dlist-1.0/dlist-1.0.tar.gz) = 18667
+SHA256 (cabal/doclayout-0.4.0.1/doclayout-0.4.0.1.tar.gz) = f7d3515d41abdfd7a5b69f28bf9520f591881364262698fd49686506b570b30b
+SIZE (cabal/doclayout-0.4.0.1/doclayout-0.4.0.1.tar.gz) = 38465
+SHA256 (cabal/doctemplates-0.11/doctemplates-0.11.tar.gz) = e0080c7f030e98ce6156fd31e77df4c83b8f3ee049beee5006ce923a0169546b
+SIZE (cabal/doctemplates-0.11/doctemplates-0.11.tar.gz) = 25255
+SHA256 (cabal/emojis-0.1.2/emojis-0.1.2.tar.gz) = 3cfe9c2ea3efbbdb9b7fc24ee6707a839d272c1deee7e39319f17a7e6feea227
+SIZE (cabal/emojis-0.1.2/emojis-0.1.2.tar.gz) = 49333
+SHA256 (cabal/entropy-0.4.1.10/entropy-0.4.1.10.tar.gz) = 85ac1d53f1d1c095aedd23fdb20c8e3ada04a7fd8aa6d7e6445ae6a59a277de5
+SIZE (cabal/entropy-0.4.1.10/entropy-0.4.1.10.tar.gz) = 9060
+SHA256 (cabal/entropy-0.4.1.10/revision/1.cabal) = 82bd7b600fb8df540dd292ed91dc781f4523eecef3bb588b14787b4851722cb1
+SIZE (cabal/entropy-0.4.1.10/revision/1.cabal) = 2952
+SHA256 (cabal/extensible-exceptions-0.1.1.4/extensible-exceptions-0.1.1.4.tar.gz) = 6ce5e8801760385a408dab71b53550f87629e661b260bdc2cd41c6a439b6e388
+SIZE (cabal/extensible-exceptions-0.1.1.4/extensible-exceptions-0.1.1.4.tar.gz) = 8531
+SHA256 (cabal/feed-1.3.2.1/feed-1.3.2.1.tar.gz) = a8f54072edaaf7e978062b9de94733e8cc43e31b2dda3446f901bf57f1815955
+SIZE (cabal/feed-1.3.2.1/feed-1.3.2.1.tar.gz) = 107015
+SHA256 (cabal/feed-1.3.2.1/revision/1.cabal) = 193ed27062b2fd9bc0c9967748b9dd1e657196f922d955573cecd086193a450c
+SIZE (cabal/feed-1.3.2.1/revision/1.cabal) = 4651
+SHA256 (cabal/file-embed-0.0.15.0/file-embed-0.0.15.0.tar.gz) = f066b85d537a20252faa59489f6a854e4e8f39080f08730c9e195e418cec5bdd
+SIZE (cabal/file-embed-0.0.15.0/file-embed-0.0.15.0.tar.gz) = 7119
+SHA256 (cabal/filestore-0.6.5/filestore-0.6.5.tar.gz) = b0052e1149e582d55078f8fd84ffb4e97111dab90ff8b589cc5ae2b6c711497c
+SIZE (cabal/filestore-0.6.5/filestore-0.6.5.tar.gz) = 32338
+SHA256 (cabal/filestore-0.6.5/revision/1.cabal) = c7926f679e7f31af247f52c13e2060b9d94641180e17a0bed9768a1040c53ded
+SIZE (cabal/filestore-0.6.5/revision/1.cabal) = 3247
+SHA256 (cabal/foldable1-classes-compat-0.1/foldable1-classes-compat-0.1.tar.gz) = d057c3f358e1a6b72c73519bc64ba6aa959f066c08fed69f73258555ef95ff12
+SIZE (cabal/foldable1-classes-compat-0.1/foldable1-classes-compat-0.1.tar.gz) = 10484
+SHA256 (cabal/foldable1-classes-compat-0.1/revision/2.cabal) = 851225c0d4ccf6ca5e4df17347490945c9928548e431f15e7e7d80c240bc4d17
+SIZE (cabal/foldable1-classes-compat-0.1/revision/2.cabal) = 3782
+SHA256 (cabal/generically-0.1.1/generically-0.1.1.tar.gz) = 04c5a436bec4b041f71a733f56a1bd7f435f63dde8d3eb5c1f48d55b4dbc43cf
+SIZE (cabal/generically-0.1.1/generically-0.1.1.tar.gz) = 2870
+SHA256 (cabal/generically-0.1.1/revision/1.cabal) = 2b9b5efb6eea2fb65377565d53d85b0ccc5b37404fba4bef1d60277caa877e5e
+SIZE (cabal/generically-0.1.1/revision/1.cabal) = 1155
+SHA256 (cabal/ghc-paths-0.1.0.12/ghc-paths-0.1.0.12.tar.gz) = 6ecbe676d073cb07989c61ce4c5709c4e67cbefdd2d55a4095f9388b6fe2c484
+SIZE (cabal/ghc-paths-0.1.0.12/ghc-paths-0.1.0.12.tar.gz) = 2565
+SHA256 (cabal/ghc-paths-0.1.0.12/revision/5.cabal) = 2cedd51fe0e85bd7c7edee768c229db74e071a15a1dfb9bf94bd4b0f3a0ec78b
+SIZE (cabal/ghc-paths-0.1.0.12/revision/5.cabal) = 699
+SHA256 (cabal/gridtables-0.1.0.0/gridtables-0.1.0.0.tar.gz) = d6ac341bc7997d39a3b1f6cd811f70ab69689d9c3117ce3bc44bfb2ec55ab0ea
+SIZE (cabal/gridtables-0.1.0.0/gridtables-0.1.0.0.tar.gz) = 12279
+SHA256 (cabal/haddock-library-1.11.0/haddock-library-1.11.0.tar.gz) = 7c075ec9a378b0a2d9d605e72135201e6c7ff316564f2c974113582f43bea20a
+SIZE (cabal/haddock-library-1.11.0/haddock-library-1.11.0.tar.gz) = 32833
+SHA256 (cabal/haddock-library-1.11.0/revision/2.cabal) = debbb2e62f4af08a116e6f95497a478bc3034c50ddd9e9c32f47a22e70991b12
+SIZE (cabal/haddock-library-1.11.0/revision/2.cabal) = 4023
+SHA256 (cabal/happstack-server-7.8.0.2/happstack-server-7.8.0.2.tar.gz) = 3a5653b2e2fea383eb3c3bfecbd60348a0913c682eec9c9e133b17d80b379795
+SIZE (cabal/happstack-server-7.8.0.2/happstack-server-7.8.0.2.tar.gz) = 86256
+SHA256 (cabal/happy-1.20.1.1/happy-1.20.1.1.tar.gz) = 8b4e7dc5a6c5fd666f8f7163232931ab28746d0d17da8fa1cbd68be9e878881b
+SIZE (cabal/happy-1.20.1.1/happy-1.20.1.1.tar.gz) = 183409
+SHA256 (cabal/hashable-1.4.2.0/hashable-1.4.2.0.tar.gz) = 1b4000ea82b81f69d46d0af4152c10c6303873510738e24cfc4767760d30e3f8
+SIZE (cabal/hashable-1.4.2.0/hashable-1.4.2.0.tar.gz) = 25094
+SHA256 (cabal/hashable-1.4.2.0/revision/1.cabal) = 585792335d5541dba78fa8dfcb291a89cd5812a281825ff7a44afa296ab5d58a
+SIZE (cabal/hashable-1.4.2.0/revision/1.cabal) = 4520
+SHA256 (cabal/haskell-lexer-1.1.1/haskell-lexer-1.1.1.tar.gz) = c8eeda569a30f115244c17920247ba2c45d11b3e30805f648a878f7855d8f349
+SIZE (cabal/haskell-lexer-1.1.1/haskell-lexer-1.1.1.tar.gz) = 14499
+SHA256 (cabal/hoauth2-2.8.0/hoauth2-2.8.0.tar.gz) = f73ad909ea4571f5958cee5cfb1ff87427ed333b37cb4751b035484059a2cdf6
+SIZE (cabal/hoauth2-2.8.0/hoauth2-2.8.0.tar.gz) = 16225
+SHA256 (cabal/hourglass-0.2.12/hourglass-0.2.12.tar.gz) = 44335b5c402e80c60f1db6a74462be4ea29d1a9043aa994334ffee1164f1ca4a
+SIZE (cabal/hourglass-0.2.12/hourglass-0.2.12.tar.gz) = 25797
+SHA256 (cabal/hsc2hs-0.68.9/hsc2hs-0.68.9.tar.gz) = c95b10ce0b2c881480e35118d738dcc9cefc435ec72baa0031af81d0d4d3bc0a
+SIZE (cabal/hsc2hs-0.68.9/hsc2hs-0.68.9.tar.gz) = 40442
+SHA256 (cabal/hslogger-1.3.1.0/hslogger-1.3.1.0.tar.gz) = 7f2364f6c0b9c5b85a257267a335816126ef2471c817a42797a5d3c57acaca5b
+SIZE (cabal/hslogger-1.3.1.0/hslogger-1.3.1.0.tar.gz) = 37468
+SHA256 (cabal/hslogger-1.3.1.0/revision/7.cabal) = 53e421418634df83ac5a0143b8d7da0fa865875b09df55d039c40a05f43f70cb
+SIZE (cabal/hslogger-1.3.1.0/revision/7.cabal) = 2978
+SHA256 (cabal/html-1.0.1.2/html-1.0.1.2.tar.gz) = 0c35495ea33d65e69c69bc7441ec8e1af69fbb43433c2aa3406c0a13a3ab3061
+SIZE (cabal/html-1.0.1.2/html-1.0.1.2.tar.gz) = 11021
+SHA256 (cabal/http-client-0.7.13.1/http-client-0.7.13.1.tar.gz) = c98e86a0382fa877e320d83dbbd173c41c966a60a32c9bc597058929a7aa0e27
+SIZE (cabal/http-client-0.7.13.1/http-client-0.7.13.1.tar.gz) = 95306
+SHA256 (cabal/http-client-0.7.13.1/revision/1.cabal) = 6480749144f27919547733262f06a6ae3c759b57b692af53f9beb309d05a1699
+SIZE (cabal/http-client-0.7.13.1/revision/1.cabal) = 5777
+SHA256 (cabal/http-client-tls-0.3.6.2/http-client-tls-0.3.6.2.tar.gz) = 28438ebeee2b97b2354c9cf6d3cb1fb73ac7ebc6cb1f4d54aedf10980394aba6
+SIZE (cabal/http-client-tls-0.3.6.2/http-client-tls-0.3.6.2.tar.gz) = 7852
+SHA256 (cabal/http-conduit-2.3.8.2/http-conduit-2.3.8.2.tar.gz) = ed457713884ced61a905b48db29f73f710ae894cb8060a07d3736ac20aa23a05
+SIZE (cabal/http-conduit-2.3.8.2/http-conduit-2.3.8.2.tar.gz) = 29007
+SHA256 (cabal/http-types-0.12.3/http-types-0.12.3.tar.gz) = 4e8a4a66477459fa436a331c75e46857ec8026283df984d54f90576cd3024016
+SIZE (cabal/http-types-0.12.3/http-types-0.12.3.tar.gz) = 13547
+SHA256 (cabal/indexed-traversable-0.1.2.1/indexed-traversable-0.1.2.1.tar.gz) = fe854c10285debc7d6fe3e09da0928a740ebc091ad2911ae695bb007e6f746a4
+SIZE (cabal/indexed-traversable-0.1.2.1/indexed-traversable-0.1.2.1.tar.gz) = 8905
+SHA256 (cabal/indexed-traversable-instances-0.1.1.2/indexed-traversable-instances-0.1.1.2.tar.gz) = 0f9b4e895ccc819f74d15f913c93613cc74cab74dbb05d7e305aa387bdbe374a
+SIZE (cabal/indexed-traversable-instances-0.1.1.2/indexed-traversable-instances-0.1.1.2.tar.gz) = 3769
+SHA256 (cabal/indexed-traversable-instances-0.1.1.2/revision/1.cabal) = b493ed83623a7cba498d31a9d36beec233406f20377f1be3bb51d4ce3bd2ceef
+SIZE (cabal/indexed-traversable-instances-0.1.1.2/revision/1.cabal) = 2536
+SHA256 (cabal/integer-logarithms-1.0.3.1/integer-logarithms-1.0.3.1.tar.gz) = 9b0a9f9fab609b15cd015865721fb05f744a1bc77ae92fd133872de528bbea7f
+SIZE (cabal/integer-logarithms-1.0.3.1/integer-logarithms-1.0.3.1.tar.gz) = 9023
+SHA256 (cabal/integer-logarithms-1.0.3.1/revision/4.cabal) = 336fb40c3af19a59dbeb4e5b7bffe4b4c7fa04ab06006a8d4b70b1febc1bb4ca
+SIZE (cabal/integer-logarithms-1.0.3.1/revision/4.cabal) = 3262
+SHA256 (cabal/iproute-1.7.12/iproute-1.7.12.tar.gz) = f1751d1579fcbc1d9f86d9d1c9ede48cb71cbeb1d7b2043491c6216e4f236b63
+SIZE (cabal/iproute-1.7.12/iproute-1.7.12.tar.gz) = 17864
+SHA256 (cabal/ipynb-0.2/ipynb-0.2.tar.gz) = 9a743d74e95ccccfadca4a734f44c7b3e2a5b838da3f9044231590d7355191c7
+SIZE (cabal/ipynb-0.2/ipynb-0.2.tar.gz) = 632962
+SHA256 (cabal/ipynb-0.2/revision/1.cabal) = d3ec93f44fac7ddeb06e5419d0577321831cc903ecb176ca6be5015c55e9893a
+SIZE (cabal/ipynb-0.2/revision/1.cabal) = 1906
+SHA256 (cabal/jira-wiki-markup-1.5.1/jira-wiki-markup-1.5.1.tar.gz) = 9ca23d369c3ccf1b3ffb209dda8e6288a5f5901fb8235113825fa48d3ae8e520
+SIZE (cabal/jira-wiki-markup-1.5.1/jira-wiki-markup-1.5.1.tar.gz) = 25459
+SHA256 (cabal/json-0.10/json-0.10.tar.gz) = 0c046a3c03c9332816d3c9e50319b1d1eb3c2c1baba1123a7650d047b26856ba
+SIZE (cabal/json-0.10/json-0.10.tar.gz) = 22622
+SHA256 (cabal/json-0.10/revision/1.cabal) = d9fc6b07ce92b8894825a17d2cf14799856767eb30c8bf55962baa579207d799
+SIZE (cabal/json-0.10/revision/1.cabal) = 3210
+SHA256 (cabal/libyaml-0.1.2/libyaml-0.1.2.tar.gz) = 8f42d66f199fcaee255326f8f770d88b0670df56b5eb78002d6058f3a45e97b5
+SIZE (cabal/libyaml-0.1.2/libyaml-0.1.2.tar.gz) = 63635
+SHA256 (cabal/libyaml-0.1.2/revision/1.cabal) = 7fb663b11fcdb86503c14aa81763106ea79b1048fc29a1fe44ec346d9ecac101
+SIZE (cabal/libyaml-0.1.2/revision/1.cabal) = 2222
+SHA256 (cabal/memory-0.18.0/memory-0.18.0.tar.gz) = fd4eb6f638e24b81b4e6cdd68772a531726f2f67686c8969d3407d82f7862e3e
+SIZE (cabal/memory-0.18.0/memory-0.18.0.tar.gz) = 41957
+SHA256 (cabal/microlens-0.4.13.1/microlens-0.4.13.1.tar.gz) = 0a54abee8ff4f6aeb4bea0783409a3dbd28a4e7a892bac916b0fb6a71382d7fc
+SIZE (cabal/microlens-0.4.13.1/microlens-0.4.13.1.tar.gz) = 27436
+SHA256 (cabal/mime-types-0.1.1.0/mime-types-0.1.1.0.tar.gz) = ebd01ed4e37142cb3233d4ffe55fe879b64d4a0b5802c8bc6afa1c7670f9e11b
+SIZE (cabal/mime-types-0.1.1.0/mime-types-0.1.1.0.tar.gz) = 11818
+SHA256 (cabal/monad-control-1.0.3.1/monad-control-1.0.3.1.tar.gz) = ae0baea04d99375ef788140367179994a7178d400a8ce0d9026846546772713c
+SIZE (cabal/monad-control-1.0.3.1/monad-control-1.0.3.1.tar.gz) = 13985
+SHA256 (cabal/mono-traversable-1.0.15.3/mono-traversable-1.0.15.3.tar.gz) = 98b220f3313d74227a4249210c8818e839678343e62b3ebb1b8c867cf2b974b7
+SIZE (cabal/mono-traversable-1.0.15.3/mono-traversable-1.0.15.3.tar.gz) = 40461
+SHA256 (cabal/network-3.1.4.0/network-3.1.4.0.tar.gz) = b452a2afac95d9207357eb3820c719c7c7d27871ef4b6ed7bfcd03a036b9158e
+SIZE (cabal/network-3.1.4.0/network-3.1.4.0.tar.gz) = 139988
+SHA256 (cabal/network-bsd-2.8.1.0/network-bsd-2.8.1.0.tar.gz) = d94961ca15c42c798d19cde540ec12b25cc43435fb95e682399d6c1a02022d4e
+SIZE (cabal/network-bsd-2.8.1.0/network-bsd-2.8.1.0.tar.gz) = 8584
+SHA256 (cabal/network-bsd-2.8.1.0/revision/4.cabal) = cd945ea08818281e4a8fa6f0a0640a1502aad3748546a3c197e071772452a9bd
+SIZE (cabal/network-bsd-2.8.1.0/revision/4.cabal) = 3738
+SHA256 (cabal/network-info-0.2.1/network-info-0.2.1.tar.gz) = 9b2d88312fc8280351d5003200cc07decbb865f85d3aa7b1094b238bd6a8b404
+SIZE (cabal/network-info-0.2.1/network-info-0.2.1.tar.gz) = 6387
+SHA256 (cabal/network-uri-2.6.4.2/network-uri-2.6.4.2.tar.gz) = 9c188973126e893250b881f20e8811dca06c223c23402b06f7a1f2e995797228
+SIZE (cabal/network-uri-2.6.4.2/network-uri-2.6.4.2.tar.gz) = 31309
+SHA256 (cabal/old-locale-1.0.0.7/old-locale-1.0.0.7.tar.gz) = dbaf8bf6b888fb98845705079296a23c3f40ee2f449df7312f7f7f1de18d7b50
+SIZE (cabal/old-locale-1.0.0.7/old-locale-1.0.0.7.tar.gz) = 3384
+SHA256 (cabal/old-locale-1.0.0.7/revision/2.cabal) = fa998be2c7e00cd26a6e9075bea790caaf3932caa3e9497ad69bc20380dd6911
+SIZE (cabal/old-locale-1.0.0.7/revision/2.cabal) = 1071
+SHA256 (cabal/old-time-1.1.0.3/old-time-1.1.0.3.tar.gz) = 1ccb158b0f7851715d36b757c523b026ca1541e2030d02239802ba39b4112bc1
+SIZE (cabal/old-time-1.1.0.3/old-time-1.1.0.3.tar.gz) = 74219
+SHA256 (cabal/old-time-1.1.0.3/revision/2.cabal) = c91fbb3ee73d20ccd015842b30f1f29a304893ebe0ae3128b7bbc13d5bb0d4c8
+SIZE (cabal/old-time-1.1.0.3/revision/2.cabal) = 1328
+SHA256 (cabal/ordered-containers-0.2.3/ordered-containers-0.2.3.tar.gz) = 36849705752f3bc367fa1d172e1ec57375418341e9d74de572ae1b6fb56a81a3
+SIZE (cabal/ordered-containers-0.2.3/ordered-containers-0.2.3.tar.gz) = 7404
+SHA256 (cabal/pandoc-3.1.4/pandoc-3.1.4.tar.gz) = 15b67fad7e7b9bf72b1c9dfea0010326cf8b115c009783b406db954fdb0b7997
+SIZE (cabal/pandoc-3.1.4/pandoc-3.1.4.tar.gz) = 7266894
+SHA256 (cabal/pandoc-types-1.23/pandoc-types-1.23.tar.gz) = 5e6721410219c0a39b05fc732de9864745592fffa8287ad6e87c66138a51162d
+SIZE (cabal/pandoc-types-1.23/pandoc-types-1.23.tar.gz) = 35901
+SHA256 (cabal/pem-0.2.4/pem-0.2.4.tar.gz) = 770c4c1b9cd24b3db7f511f8a48404a0d098999e28573c3743a8a296bb96f8d4
+SIZE (cabal/pem-0.2.4/pem-0.2.4.tar.gz) = 4717
+SHA256 (cabal/pretty-show-1.10/pretty-show-1.10.tar.gz) = 307f9086e0b063d439dc4f513e36a145e8a57f23de448aefae2a6c00f6da6fd2
+SIZE (cabal/pretty-show-1.10/pretty-show-1.10.tar.gz) = 42233
+SHA256 (cabal/primitive-0.8.0.0/primitive-0.8.0.0.tar.gz) = 5553c21b4a789f9b591eed69e598cc58484c274af29250e517b5a8bcc62b995f
+SIZE (cabal/primitive-0.8.0.0/primitive-0.8.0.0.tar.gz) = 57222
+SHA256 (cabal/random-1.2.1.1/random-1.2.1.1.tar.gz) = 3e1272f7ed6a4d7bd1712b90143ec326fee9b225789222379fea20a9c90c9b76
+SIZE (cabal/random-1.2.1.1/random-1.2.1.1.tar.gz) = 47109
+SHA256 (cabal/recaptcha-0.1.0.4/recaptcha-0.1.0.4.tar.gz) = a26172c3f5797e402de95b92edcb56a828cb791849b92b4238683446c970430d
+SIZE (cabal/recaptcha-0.1.0.4/recaptcha-0.1.0.4.tar.gz) = 2724
+SHA256 (cabal/regex-base-0.94.0.2/regex-base-0.94.0.2.tar.gz) = 7b99408f580f5bb67a1c413e0bc735886608251331ad36322020f2169aea2ef1
+SIZE (cabal/regex-base-0.94.0.2/regex-base-0.94.0.2.tar.gz) = 10488
+SHA256 (cabal/regex-base-0.94.0.2/revision/1.cabal) = 4ff4425c710cddf440dfbac6cd52310bb6b23e17902390ff71c9fc7eaafc4fcc
+SIZE (cabal/regex-base-0.94.0.2/revision/1.cabal) = 2643
+SHA256 (cabal/regex-compat-0.95.2.1/regex-compat-0.95.2.1.tar.gz) = 8f7b386c72fd605a292edfb809b8620245b4a3ab7af192ad79e36778596e7947
+SIZE (cabal/regex-compat-0.95.2.1/regex-compat-0.95.2.1.tar.gz) = 4285
+SHA256 (cabal/regex-compat-0.95.2.1/revision/2.cabal) = 96c83b06280ebfb6fef01864b2af9eb9e136a9832c563773f327d4197bbbb851
+SIZE (cabal/regex-compat-0.95.2.1/revision/2.cabal) = 1705
+SHA256 (cabal/regex-posix-0.96.0.1/regex-posix-0.96.0.1.tar.gz) = c7827c391919227711e1cff0a762b1678fd8739f9c902fc183041ff34f59259c
+SIZE (cabal/regex-posix-0.96.0.1/regex-posix-0.96.0.1.tar.gz) = 12853
+SHA256 (cabal/regex-posix-0.96.0.1/revision/1.cabal) = 9dbba4b65a3bb6975d9740814be5593c6b2d2d6a0b3febc8ec940edb9a9bbdf4
+SIZE (cabal/regex-posix-0.96.0.1/revision/1.cabal) = 2954
+SHA256 (cabal/regex-tdfa-1.3.2.1/regex-tdfa-1.3.2.1.tar.gz) = 5c8bf8b5274dd45a9afa72bb4f51602df429b4dfd2a05275da5d78c00e7b8295
+SIZE (cabal/regex-tdfa-1.3.2.1/regex-tdfa-1.3.2.1.tar.gz) = 82890
+SHA256 (cabal/resourcet-1.3.0/resourcet-1.3.0.tar.gz) = ec601785ee42a201f32adb205b8685c983f18757b1bd33d2e806d571e0f9996b
+SIZE (cabal/resourcet-1.3.0/resourcet-1.3.0.tar.gz) = 17620
+SHA256 (cabal/safe-0.3.19/safe-0.3.19.tar.gz) = 25043442c8f8aa95955bb17467d023630632b961aaa61e807e325d9b2c33f7a2
+SIZE (cabal/safe-0.3.19/safe-0.3.19.tar.gz) = 11267
+SHA256 (cabal/scientific-0.3.7.0/scientific-0.3.7.0.tar.gz) = a3a121c4b3d68fb8b9f8c709ab012e48f090ed553609247a805ad070d6b343a9
+SIZE (cabal/scientific-0.3.7.0/scientific-0.3.7.0.tar.gz) = 24723
+SHA256 (cabal/scientific-0.3.7.0/revision/5.cabal) = 26d8109106963a345368011081453d25ee1dfa6afae2b1f57b426b4bcd392d91
+SIZE (cabal/scientific-0.3.7.0/revision/5.cabal) = 4854
+SHA256 (cabal/semialign-1.3/semialign-1.3.tar.gz) = 628e43319f584a8dd46c124ee0685cac586e0f6f877c5ceff37c3dbb2e3cc56c
+SIZE (cabal/semialign-1.3/semialign-1.3.tar.gz) = 10543
+SHA256 (cabal/semigroupoids-6.0.0.1/semigroupoids-6.0.0.1.tar.gz) = 7da38a9891bdf8205fd6522cdb712956b8c0bf5c52983da60295c8e057d77934
+SIZE (cabal/semigroupoids-6.0.0.1/semigroupoids-6.0.0.1.tar.gz) = 36222
+SHA256 (cabal/semigroups-0.20/semigroups-0.20.tar.gz) = 902d2e33c96b40a89de5957f2a9e097197afcc35e257e45b32ebe770993673e1
+SIZE (cabal/semigroups-0.20/semigroups-0.20.tar.gz) = 18788
+SHA256 (cabal/sendfile-0.7.11.4/sendfile-0.7.11.4.tar.gz) = 73b0be7cd6e29e859ffae741cb398eb129e0bf1c6953ef5755da0b8a020751c4
+SIZE (cabal/sendfile-0.7.11.4/sendfile-0.7.11.4.tar.gz) = 10721
+SHA256 (cabal/skylighting-0.13.3/skylighting-0.13.3.tar.gz) = b25c63cf342aff3c00742e08f4c80d641ebe5fd20eb7a4970450b8e0576e9b95
+SIZE (cabal/skylighting-0.13.3/skylighting-0.13.3.tar.gz) = 1367538
+SHA256 (cabal/skylighting-core-0.13.3/skylighting-core-0.13.3.tar.gz) = 6c6d0fae4aaa80f4dfca2b516ad8a864a6e8b5be7fdba039bd6fb00cb68c63d5
+SIZE (cabal/skylighting-core-0.13.3/skylighting-core-0.13.3.tar.gz) = 854171
+SHA256 (cabal/skylighting-format-ansi-0.1/skylighting-format-ansi-0.1.tar.gz) = 23dfa86c2ecd2601a2efed4967eb2ec0505a52c14776054ce4d89707c2de0a9b
+SIZE (cabal/skylighting-format-ansi-0.1/skylighting-format-ansi-0.1.tar.gz) = 5350
+SHA256 (cabal/skylighting-format-blaze-html-0.1.1/skylighting-format-blaze-html-0.1.1.tar.gz) = b1139b4df369de93d1ec6d8a2ed02bf11d559f9eaf71c31434fb5b19ba48ef13
+SIZE (cabal/skylighting-format-blaze-html-0.1.1/skylighting-format-blaze-html-0.1.1.tar.gz) = 4769
+SHA256 (cabal/skylighting-format-context-0.1.0.2/skylighting-format-context-0.1.0.2.tar.gz) = 004213e13d89b692ea0912d7ffa6ee98c93146d1a7962a849ad7860697bc88bd
+SIZE (cabal/skylighting-format-context-0.1.0.2/skylighting-format-context-0.1.0.2.tar.gz) = 3249
+SHA256 (cabal/skylighting-format-latex-0.1/skylighting-format-latex-0.1.tar.gz) = 97b66c9ab60451e41a94aa80a684e792fbe69816835f735224222beea22afb78
+SIZE (cabal/skylighting-format-latex-0.1/skylighting-format-latex-0.1.tar.gz) = 3777
+SHA256 (cabal/socks-0.6.1/socks-0.6.1.tar.gz) = 734447558bb061ce768f53a0df1f2401902c6bee396cc96ce627edd986ef6a73
+SIZE (cabal/socks-0.6.1/socks-0.6.1.tar.gz) = 9759
+SHA256 (cabal/split-0.2.3.5/split-0.2.3.5.tar.gz) = bf8aa8d610354a2b576946a6c838251ec5988c8374100638e6b2604513b93159
+SIZE (cabal/split-0.2.3.5/split-0.2.3.5.tar.gz) = 15746
+SHA256 (cabal/splitmix-0.1.0.4/splitmix-0.1.0.4.tar.gz) = 6d065402394e7a9117093dbb4530a21342c9b1e2ec509516c8a8d0ffed98ecaa
+SIZE (cabal/splitmix-0.1.0.4/splitmix-0.1.0.4.tar.gz) = 22382
+SHA256 (cabal/splitmix-0.1.0.4/revision/2.cabal) = db25c2e17967aa6b6046ab8b1b96ba3f344ca59a62b60fb6113d51ea305a3d8e
+SIZE (cabal/splitmix-0.1.0.4/revision/2.cabal) = 6537
+SHA256 (cabal/streaming-commons-0.2.2.6/streaming-commons-0.2.2.6.tar.gz) = 0180958a882eb0f6262b812fe886c2b1b8285474b5b958f814ae4f05409fbf79
+SIZE (cabal/streaming-commons-0.2.2.6/streaming-commons-0.2.2.6.tar.gz) = 37959
+SHA256 (cabal/strict-0.5/strict-0.5.tar.gz) = 3f4f0995dec2d520d0e321542f71412dac023658fdab603db04364d75269a0fd
+SIZE (cabal/strict-0.5/strict-0.5.tar.gz) = 12564
+SHA256 (cabal/syb-0.7.2.3/syb-0.7.2.3.tar.gz) = d0b72daf16a947c4d9cb2d5774072f2153433224a04fd60fad60be9ffac8d91a
+SIZE (cabal/syb-0.7.2.3/syb-0.7.2.3.tar.gz) = 40018
+SHA256 (cabal/system-filepath-0.4.14/system-filepath-0.4.14.tar.gz) = 1656ce3c0d585650784ceb3f794748286e19fb635f557e7b29b0897f8956d993
+SIZE (cabal/system-filepath-0.4.14/system-filepath-0.4.14.tar.gz) = 16663
+SHA256 (cabal/system-filepath-0.4.14/revision/1.cabal) = e8ce7d24d7008a825e5d03aa672950a0e8178ac54c3de7134f36c3a7e37694a2
+SIZE (cabal/system-filepath-0.4.14/revision/1.cabal) = 1631
+SHA256 (cabal/tagged-0.8.7/tagged-0.8.7.tar.gz) = 6414eeac27a1633f49e2f78199ced99ce8ce3d70b658cf6d55b1d81ff60cb961
+SIZE (cabal/tagged-0.8.7/tagged-0.8.7.tar.gz) = 10082
+SHA256 (cabal/tagsoup-0.14.8/tagsoup-0.14.8.tar.gz) = ba7e5500d853d29f0675b90655b7fdd032a4a7eee82a56e7ee3ef9949fe93ad5
+SIZE (cabal/tagsoup-0.14.8/tagsoup-0.14.8.tar.gz) = 43894
+SHA256 (cabal/temporary-1.3/temporary-1.3.tar.gz) = 8c442993694b5ffca823ce864af95bd2841fb5264ee511c61cf48cc71d879890
+SIZE (cabal/temporary-1.3/temporary-1.3.tar.gz) = 5686
+SHA256 (cabal/texmath-0.12.8/texmath-0.12.8.tar.gz) = 034ff00671d9b8ac4c983df59ccfb4f39fc7d8c2d19f1f39cc00ac5d3f8625c4
+SIZE (cabal/texmath-0.12.8/texmath-0.12.8.tar.gz) = 1479868
+SHA256 (cabal/text-conversions-0.3.1.1/text-conversions-0.3.1.1.tar.gz) = c8770fba789ce80334cae628285103c49abec0fa074773cbb5a88e26f5a7725d
+SIZE (cabal/text-conversions-0.3.1.1/text-conversions-0.3.1.1.tar.gz) = 5258
+SHA256 (cabal/text-short-0.1.5/text-short-0.1.5.tar.gz) = a35ec6cde2ada084c1a050dc5885be5ab01f851b93d744cf0facbc1c18002dda
+SIZE (cabal/text-short-0.1.5/text-short-0.1.5.tar.gz) = 25113
+SHA256 (cabal/text-short-0.1.5/revision/2.cabal) = c296eb2289dc5bf39912989c295cb82ef05ae5f84ee83ea5dc21f48da80e7052
+SIZE (cabal/text-short-0.1.5/revision/2.cabal) = 3202
+SHA256 (cabal/th-abstraction-0.5.0.0/th-abstraction-0.5.0.0.tar.gz) = 8258dc3ab7188af5826e2467032b52a931a3af4d8a93d4a094210e240a8a9964
+SIZE (cabal/th-abstraction-0.5.0.0/th-abstraction-0.5.0.0.tar.gz) = 40093
+SHA256 (cabal/th-compat-0.1.4/th-compat-0.1.4.tar.gz) = d8f97ac14ab47b6b8a7b0fdb4ff95426322ec56badd01652ac15da4a44d4bab8
+SIZE (cabal/th-compat-0.1.4/th-compat-0.1.4.tar.gz) = 14838
+SHA256 (cabal/th-compat-0.1.4/revision/2.cabal) = e5ae7c083ef3a22248558f8451669bb1c55ea8090f5908b86b9033743c161730
+SIZE (cabal/th-compat-0.1.4/revision/2.cabal) = 3224
+SHA256 (cabal/th-lift-0.8.3/th-lift-0.8.3.tar.gz) = 25d57bf5f8e7deefeb4ace0539805ae1e90b1ba5a034ebcc36141846408c6b75
+SIZE (cabal/th-lift-0.8.3/th-lift-0.8.3.tar.gz) = 14643
+SHA256 (cabal/th-lift-instances-0.1.20/th-lift-instances-0.1.20.tar.gz) = f533c3f95addcca461a0ccd1aafef75dd801bfa6599c0d1184d54bfffb61d870
+SIZE (cabal/th-lift-instances-0.1.20/th-lift-instances-0.1.20.tar.gz) = 6721
+SHA256 (cabal/these-1.2/these-1.2.tar.gz) = a8ed7174b7f790764360f48aab72fea382a6093ed369c7bc6881fae1abacd4b8
+SIZE (cabal/these-1.2/these-1.2.tar.gz) = 10606
+SHA256 (cabal/threads-0.5.1.7/threads-0.5.1.7.tar.gz) = e0f6fea09b99a2f84c98089c27c011077bf43f1e1977a5c43997e226d23142d0
+SIZE (cabal/threads-0.5.1.7/threads-0.5.1.7.tar.gz) = 7459
+SHA256 (cabal/threads-0.5.1.7/revision/1.cabal) = 97132b14f194d7ce0b15e25498545462a42ad1017b072641622653d4c1aabda3
+SIZE (cabal/threads-0.5.1.7/revision/1.cabal) = 2877
+SHA256 (cabal/time-compat-1.9.6.1/time-compat-1.9.6.1.tar.gz) = ad07bb00eb9678c2136d3680752b00acc4cbc522654bb3199bf31c61ef1e6b80
+SIZE (cabal/time-compat-1.9.6.1/time-compat-1.9.6.1.tar.gz) = 59964
+SHA256 (cabal/time-compat-1.9.6.1/revision/5.cabal) = dd4de1fa0d6b7108982efc7ac41938569e4c9b06230bb87d34aae007c52ddb67
+SIZE (cabal/time-compat-1.9.6.1/revision/5.cabal) = 5062
+SHA256 (cabal/time-locale-compat-0.1.1.5/time-locale-compat-0.1.1.5.tar.gz) = 07ff1566de7d851423a843b2de385442319348c621d4f779b3d365ce91ac502c
+SIZE (cabal/time-locale-compat-0.1.1.5/time-locale-compat-0.1.1.5.tar.gz) = 1956
+SHA256 (cabal/tls-1.7.0/tls-1.7.0.tar.gz) = 3c2a50c902d26864f6af113e59045f049f6c54fb46239ed2d1d4a82bc8524078
+SIZE (cabal/tls-1.7.0/tls-1.7.0.tar.gz) = 158630
+SHA256 (cabal/transformers-base-0.4.6/transformers-base-0.4.6.tar.gz) = 323bf8689eb691b122661cffa41a25e00fea7a768433fe2dde35d3da7d32cf90
+SIZE (cabal/transformers-base-0.4.6/transformers-base-0.4.6.tar.gz) = 2902
+SHA256 (cabal/transformers-compat-0.7.2/transformers-compat-0.7.2.tar.gz) = b62c7304c9f3cbc9463d0739aa85cb9489f217ea092b9d625d417514fbcc9d6a
+SIZE (cabal/transformers-compat-0.7.2/transformers-compat-0.7.2.tar.gz) = 46485
+SHA256 (cabal/typed-process-0.2.11.0/typed-process-0.2.11.0.tar.gz) = 948c59540675d85f35c99e285cdb8686713ec1689f530d5d21813239ea91f625
+SIZE (cabal/typed-process-0.2.11.0/typed-process-0.2.11.0.tar.gz) = 18309
+SHA256 (cabal/typst-0.1.0.0/typst-0.1.0.0.tar.gz) = a40a94476357580cd5197e1a2cd65bfdd29d8bad293667beca01741969a24eef
+SIZE (cabal/typst-0.1.0.0/typst-0.1.0.0.tar.gz) = 6402077
+SHA256 (cabal/typst-symbols-0.1.2/typst-symbols-0.1.2.tar.gz) = c2e6c71e71cff33d464d6dc50276886d616626772d5f57260b2f668c4bcba0ab
+SIZE (cabal/typst-symbols-0.1.2/typst-symbols-0.1.2.tar.gz) = 18076
+SHA256 (cabal/unicode-collation-0.1.3.4/unicode-collation-0.1.3.4.tar.gz) = b08dbe9bb269d6eda2639cdfc63caee136794f46c16a1ad51b5305dd2ea6d429
+SIZE (cabal/unicode-collation-0.1.3.4/unicode-collation-0.1.3.4.tar.gz) = 2056084
+SHA256 (cabal/unicode-data-0.4.0.1/unicode-data-0.4.0.1.tar.gz) = 37a5dea6801940beb65c4ac4b9d0f7e653a686cf773507f0ca61c210e0b06080
+SIZE (cabal/unicode-data-0.4.0.1/unicode-data-0.4.0.1.tar.gz) = 187381
+SHA256 (cabal/unicode-data-0.4.0.1/revision/1.cabal) = 081e269b48f2d8511579a6dd1aa5f5c2f940e63d9bafec5fb911c11e32b27ad3
+SIZE (cabal/unicode-data-0.4.0.1/revision/1.cabal) = 5624
+SHA256 (cabal/unicode-transforms-0.4.0.1/unicode-transforms-0.4.0.1.tar.gz) = 3278e1e1d648da4bcd7368658ae091a89080e88a2f44db9df5136711e99649fc
+SIZE (cabal/unicode-transforms-0.4.0.1/unicode-transforms-0.4.0.1.tar.gz) = 648836
+SHA256 (cabal/unicode-transforms-0.4.0.1/revision/3.cabal) = adffd08a043cbf633e9574c35e206315bb07e73ed3886a91472d3cf208d8a6c3
+SIZE (cabal/unicode-transforms-0.4.0.1/revision/3.cabal) = 5923
+SHA256 (cabal/uniplate-1.6.13/uniplate-1.6.13.tar.gz) = e777c94628445556a71f135a42cf72d2cfbaccba5849cc42fbfec8b2182e3ad2
+SIZE (cabal/uniplate-1.6.13/uniplate-1.6.13.tar.gz) = 29787
+SHA256 (cabal/uniplate-1.6.13/revision/1.cabal) = c8b715570d0b4baa72512e677552dd3f98372a64bf9de000e779bd4162fd7be7
+SIZE (cabal/uniplate-1.6.13/revision/1.cabal) = 3320
+SHA256 (cabal/unix-time-0.4.10/unix-time-0.4.10.tar.gz) = 7e4a4bf8cba87bc7b1e3a1a7c68a44d7780360d6f52628cd84154829a03629bc
+SIZE (cabal/unix-time-0.4.10/unix-time-0.4.10.tar.gz) = 52393
+SHA256 (cabal/unliftio-core-0.2.1.0/unliftio-core-0.2.1.0.tar.gz) = 99384cba8d56d9d61b85e38a313a93ebcdb78be6566367f0930ef580597fe3e3
+SIZE (cabal/unliftio-core-0.2.1.0/unliftio-core-0.2.1.0.tar.gz) = 3865
+SHA256 (cabal/unliftio-core-0.2.1.0/revision/2.cabal) = cb78a95718f9cb2579a8a1208d4a148ea358f0774321c8cb905bfb0b96a2813c
+SIZE (cabal/unliftio-core-0.2.1.0/revision/2.cabal) = 1004
+SHA256 (cabal/unordered-containers-0.2.19.1/unordered-containers-0.2.19.1.tar.gz) = 1b27bec5e0d522b27a6029ebf4c4a6d40acbc083c787008e32fb55c4b1d128d2
+SIZE (cabal/unordered-containers-0.2.19.1/unordered-containers-0.2.19.1.tar.gz) = 58030
+SHA256 (cabal/unordered-containers-0.2.19.1/revision/2.cabal) = 9ad8972c2e913c37b1d4f0e1261517fd7a1b8c8a58077e057be69837e3dbaa00
+SIZE (cabal/unordered-containers-0.2.19.1/revision/2.cabal) = 3822
+SHA256 (cabal/uri-bytestring-0.3.3.1/uri-bytestring-0.3.3.1.tar.gz) = f3e7a0ac26111c426727fed11624efe9ce36ee2e74ca79570ec0985eb6111368
+SIZE (cabal/uri-bytestring-0.3.3.1/uri-bytestring-0.3.3.1.tar.gz) = 23052
+SHA256 (cabal/uri-bytestring-aeson-0.1.0.8/uri-bytestring-aeson-0.1.0.8.tar.gz) = 612accdae921dd7a5d00fedaa377d994be5ab585ae75b1f9f0dcaa10412e7509
+SIZE (cabal/uri-bytestring-aeson-0.1.0.8/uri-bytestring-aeson-0.1.0.8.tar.gz) = 2047
+SHA256 (cabal/url-2.1.3/url-2.1.3.tar.gz) = 5af27e3f8c0a27e52d0dcb98ef06a0fdd01efe8bb21242c29432e1bc380a4f61
+SIZE (cabal/url-2.1.3/url-2.1.3.tar.gz) = 4180
+SHA256 (cabal/utf8-string-1.0.2/utf8-string-1.0.2.tar.gz) = ee48deada7600370728c4156cb002441de770d0121ae33a68139a9ed9c19b09a
+SIZE (cabal/utf8-string-1.0.2/utf8-string-1.0.2.tar.gz) = 10726
+SHA256 (cabal/uuid-1.3.15/uuid-1.3.15.tar.gz) = f885958d8934930b7c0f9b91f980722f7f992c9383fc98f075cf9df64c800564
+SIZE (cabal/uuid-1.3.15/uuid-1.3.15.tar.gz) = 8815
+SHA256 (cabal/uuid-1.3.15/revision/2.cabal) = a3d79c5a5e58035e7dc5a08c5910c44a6719aaa38697b249e3f67aaac884411a
+SIZE (cabal/uuid-1.3.15/revision/2.cabal) = 2642
+SHA256 (cabal/uuid-types-1.0.5/uuid-types-1.0.5.tar.gz) = ad68b89b7a64c07dd5c250a11be2033ee929318ff51ec7b4e4b54e1b4deba7dd
+SIZE (cabal/uuid-types-1.0.5/uuid-types-1.0.5.tar.gz) = 11922
+SHA256 (cabal/uuid-types-1.0.5/revision/4.cabal) = e4662609522f093b86c5ae86aa9781afc69338cf102d42e5b5c196c320d95621
+SIZE (cabal/uuid-types-1.0.5/revision/4.cabal) = 2636
+SHA256 (cabal/vector-0.13.0.0/vector-0.13.0.0.tar.gz) = c5d3167d15e12f52e00879ddf304a591672a74e369cc47bc5c7fa1d5a8d15b4f
+SIZE (cabal/vector-0.13.0.0/vector-0.13.0.0.tar.gz) = 154509
+SHA256 (cabal/vector-0.13.0.0/revision/3.cabal) = fa5cac81a17a5af388716792e8b99c24b3b66770086756d0d8b23f8272a0244c
+SIZE (cabal/vector-0.13.0.0/revision/3.cabal) = 9112
+SHA256 (cabal/vector-algorithms-0.9.0.1/vector-algorithms-0.9.0.1.tar.gz) = 2ba7c0d3a8f26ef3ada24ff4abe81609225ecbab3b5754f048f8a0a3ecc33841
+SIZE (cabal/vector-algorithms-0.9.0.1/vector-algorithms-0.9.0.1.tar.gz) = 29149
+SHA256 (cabal/vector-algorithms-0.9.0.1/revision/2.cabal) = f3e5c6695529a94edf762117cafd91c989cb642ad3f8ca4014dbb13c8f6c2a20
+SIZE (cabal/vector-algorithms-0.9.0.1/revision/2.cabal) = 3826
+SHA256 (cabal/vector-stream-0.1.0.0/vector-stream-0.1.0.0.tar.gz) = a888210f6467f155090653734be5cc920406a07227e0d3adb59096716fdb806c
+SIZE (cabal/vector-stream-0.1.0.0/vector-stream-0.1.0.0.tar.gz) = 12377
+SHA256 (cabal/vector-stream-0.1.0.0/revision/2.cabal) = f5d6d5291cd1b5f2f063403593f1f5c8127d692c888eedeb3e1eb40497a88dca
+SIZE (cabal/vector-stream-0.1.0.0/revision/2.cabal) = 1404
+SHA256 (cabal/void-0.7.3/void-0.7.3.tar.gz) = 53af758ddc37dc63981671e503438d02c6f64a2d8744e9bec557a894431f7317
+SIZE (cabal/void-0.7.3/void-0.7.3.tar.gz) = 6741
+SHA256 (cabal/witherable-0.4.2/witherable-0.4.2.tar.gz) = 790d2bb274283419173bd89104439860675a9410f70f21912973ecd9098b4104
+SIZE (cabal/witherable-0.4.2/witherable-0.4.2.tar.gz) = 11876
+SHA256 (cabal/witherable-0.4.2/revision/4.cabal) = cec516b35df0ff53ab0068e70a912a0ba7b65c672fbc554727183faa195ad3b8
+SIZE (cabal/witherable-0.4.2/revision/4.cabal) = 2342
+SHA256 (cabal/xml-1.3.14/xml-1.3.14.tar.gz) = 32d1a1a9f21a59176d84697f96ae3a13a0198420e3e4f1c48abbab7d2425013d
+SIZE (cabal/xml-1.3.14/xml-1.3.14.tar.gz) = 12048
+SHA256 (cabal/xml-1.3.14/revision/2.cabal) = c7a33d37c968c769723931a33e4e795f0aadda6cb62e7073ded8a2db52509d95
+SIZE (cabal/xml-1.3.14/revision/2.cabal) = 952
+SHA256 (cabal/xml-conduit-1.9.1.3/xml-conduit-1.9.1.3.tar.gz) = d8e9169562c71c9e6bc616f15832f521a68c362aa4fc03682748a809755f1bf4
+SIZE (cabal/xml-conduit-1.9.1.3/xml-conduit-1.9.1.3.tar.gz) = 44653
+SHA256 (cabal/xml-types-0.3.8/xml-types-0.3.8.tar.gz) = dad5e4ce602b7d1f4be37c0cfd99a261a4573746bfd80d917dc955b72da84c80
+SIZE (cabal/xml-types-0.3.8/xml-types-0.3.8.tar.gz) = 4054
+SHA256 (cabal/xss-sanitize-0.3.7.2/xss-sanitize-0.3.7.2.tar.gz) = 1bbb7f5be1f4590124c76458fb798bfd9bf8114dce338d5881ad89188a9dc946
+SIZE (cabal/xss-sanitize-0.3.7.2/xss-sanitize-0.3.7.2.tar.gz) = 12002
+SHA256 (cabal/yaml-0.11.11.2/yaml-0.11.11.2.tar.gz) = ee74923ee5b0fef74413c58aaa20ea59baf5d29d256a62fb47cc279570d9dc2f
+SIZE (cabal/yaml-0.11.11.2/yaml-0.11.11.2.tar.gz) = 31926
+SHA256 (cabal/yaml-0.11.11.2/revision/2.cabal) = 6f0a1859e0fb3068e50dbc7fe9bf9a26847741bc24344e35e16a03711a18f88d
+SIZE (cabal/yaml-0.11.11.2/revision/2.cabal) = 5178
+SHA256 (cabal/zip-archive-0.4.3/zip-archive-0.4.3.tar.gz) = 68050fa0f139848db0ea422ea9af1a65b652abf5168db7dafaf1bded5b045d05
+SIZE (cabal/zip-archive-0.4.3/zip-archive-0.4.3.tar.gz) = 22161
+SHA256 (cabal/zlib-0.6.3.0/zlib-0.6.3.0.tar.gz) = 9eaa989ad4534438b5beb51c1d3a4c8f6a088fdff0b259a5394fbf39aaee04da
+SIZE (cabal/zlib-0.6.3.0/zlib-0.6.3.0.tar.gz) = 369595
+SHA256 (cabal/zlib-0.6.3.0/revision/1.cabal) = 9adce39e4ca0b7a87d45df0a243134816c57059a08e28cff5469c98ae1f54dfc
+SIZE (cabal/zlib-0.6.3.0/revision/1.cabal) = 5367
diff --git a/www/hs-gitit/files/extra-patch-data_default.conf b/www/hs-gitit/files/extra-patch-data_default.conf
new file mode 100644
index 000000000000..96e71c4b5458
--- /dev/null
+++ b/www/hs-gitit/files/extra-patch-data_default.conf
@@ -0,0 +1,22 @@
+--- data/default.conf.orig 2023-07-10 14:38:47 UTC
++++ data/default.conf
+@@ -266,10 +266,19 @@ feed-days: 14
+ feed-refresh-time: 60
+ # number of minutes to cache feeds before refreshing
+
++exports: no
++# if yes, export options will be enabled. Beware, this might disclose
++# any file contents readable by the gitit process by maliciously
++# crafting pages that include files!
++
+ pdf-export: no
+ # if yes, PDF will appear in export options. PDF will be created using
+ # pdflatex, which must be installed and in the path. Note that PDF
+ # exports create significant additional server load.
++
++pdf-engine: pdflatex
++# change this to have pandoc use a different engine for PDF creation,
++# like xelatex, wkhtmltopdf, pdfroff, etc.
+
+ pandoc-user-data:
+ # if a directory is specified, this will be searched for pandoc
diff --git a/www/hs-gitit/files/extra-patch-exports b/www/hs-gitit/files/extra-patch-exports
new file mode 100644
index 000000000000..7b2cb45ac0c3
--- /dev/null
+++ b/www/hs-gitit/files/extra-patch-exports
@@ -0,0 +1,612 @@
+diff --git README.markdown README.markdown
+index d49e0cc..c5a4ada 100644
+--- README.markdown
++++ README.markdown
+@@ -7,9 +7,10 @@ files are stored in a [git], [darcs], or [mercurial] repository
+ and may be modified either by using the VCS's command-line tools or
+ through the wiki's web interface. By default, pandoc's extended version
+ of markdown is used as a markup language, but reStructuredText, LaTeX, HTML,
+-DocBook, or Emacs Org-mode markup can also be used. Gitit can
+-be configured to display TeX math (using [texmath]) and
+-highlighted source code (using [highlighting-kate]).
++DocBook, or Emacs Org-mode markup can also be used. Pages can be exported in a
++number of different formats, including LaTeX, RTF, OpenOffice ODT, and
++MediaWiki markup. Gitit can be configured to display TeX math (using
++[texmath]) and highlighted source code (using [highlighting-kate]).
+
+ Other features include
+
+@@ -410,7 +411,7 @@ Caching
+ By default, gitit does not cache content. If your wiki receives a lot of
+ traffic or contains pages that are slow to render, you may want to activate
+ caching. To do this, set the configuration option `use-cache` to `yes`.
+-By default, rendered pages, and highlighted source files
++By default, rendered pages, highlighted source files, and exported PDFs
+ will be cached in the `cache` directory. (Another directory can be
+ specified by setting the `cache-dir` configuration option.)
+
+diff --git data/default.conf data/default.conf
+index cd528f9..567bf8f 100644
+--- data/default.conf
++++ data/default.conf
+@@ -266,9 +266,16 @@ feed-days: 14
+ feed-refresh-time: 60
+ # number of minutes to cache feeds before refreshing
+
++pdf-export: no
++# if yes, PDF will appear in export options. PDF will be created using
++# pdflatex, which must be installed and in the path. Note that PDF
++# exports create significant additional server load.
++
+ pandoc-user-data:
+ # if a directory is specified, this will be searched for pandoc
+-# customizations. If no directory is
++# customizations. These can include a templates/ directory for custom
++# templates for various export formats, an S5 directory for custom
++# S5 styles, and a reference.odt for ODT exports. If no directory is
+ # specified, $HOME/.pandoc will be searched. See pandoc's README for
+ # more information.
+
+diff --git data/templates/pagetools.st data/templates/pagetools.st
+index a5178f4..2d01dfa 100644
+--- data/templates/pagetools.st
++++ data/templates/pagetools.st
+@@ -9,5 +9,6 @@
+ <li><a href="$base$/_feed$pageUrl$" type="application/atom+xml" rel="alternate" title="This page's ATOM Feed">Atom feed</a> <img alt="feed icon" src="$base$/img/icons/feed.png"/></li>
+ $endif$
+ </ul>
++ $exportbox$
+ </fieldset>
+ </div>
+diff --git gitit.cabal gitit.cabal
+index 3d0d695..361415d 100644
+--- gitit.cabal
++++ gitit.cabal
+@@ -115,6 +115,7 @@ Library
+ Network.Gitit.Authentication.Github,
+ Network.Gitit.Util, Network.Gitit.Server
+ Network.Gitit.Cache, Network.Gitit.State,
++ Network.Gitit.Export,
+ Network.Gitit.Handlers,
+ Network.Gitit.Plugins, Network.Gitit.Rpxnow,
+ Network.Gitit.Page, Network.Gitit.Feed,
+diff --git src/Network/Gitit.hs src/Network/Gitit.hs
+index 3ad25f8..032cc9d 100644
+--- src/Network/Gitit.hs
++++ src/Network/Gitit.hs
+@@ -199,6 +199,7 @@ wikiHandlers =
+ authenticate ForModify (unlessNoDelete deletePage showPage) ]
+ , dir "_preview" preview
+ , guardIndex >> indexPage
++ , guardCommand "export" >> exportPage
+ , method POST >> guardCommand "cancel" >> showPage
+ , method POST >> guardCommand "update" >>
+ authenticate ForModify (unlessNoEdit updatePage showPage)
+diff --git src/Network/Gitit/Cache.hs src/Network/Gitit/Cache.hs
+index 3334d07..91b6c0a 100644
+--- src/Network/Gitit/Cache.hs
++++ src/Network/Gitit/Cache.hs
+@@ -41,13 +41,23 @@ import Control.Monad.Trans (liftIO)
+ import Text.Pandoc.UTF8 (encodePath)
+
+ -- | Expire a cached file, identified by its filename in the filestore.
++-- If there is an associated exported PDF, expire it too.
+ -- Returns () after deleting a file from the cache, fails if no cached file.
+ expireCachedFile :: String -> GititServerPart ()
+ expireCachedFile file = do
+ cfg <- getConfig
+ let target = encodePath $ cacheDir cfg </> file
+ exists <- liftIO $ doesFileExist target
+- when exists $ liftIO $ liftIO $ removeFile target
++ when exists $ liftIO $ do
++ liftIO $ removeFile target
++ expireCachedPDF target (defaultExtension cfg)
++
++expireCachedPDF :: String -> String -> IO ()
++expireCachedPDF file ext =
++ when (takeExtension file == "." ++ ext) $ do
++ let pdfname = file ++ ".export.pdf"
++ exists <- doesFileExist pdfname
++ when exists $ removeFile pdfname
+
+ lookupCache :: String -> GititServerPart (Maybe (UTCTime, B.ByteString))
+ lookupCache file = do
+@@ -74,3 +84,4 @@ cacheContents file contents = do
+ liftIO $ do
+ createDirectoryIfMissing True targetDir
+ B.writeFile target contents
++ expireCachedPDF target (defaultExtension cfg)
+diff --git src/Network/Gitit/Config.hs src/Network/Gitit/Config.hs
+index d39d8cf..1bfbc47 100644
+--- src/Network/Gitit/Config.hs
++++ src/Network/Gitit/Config.hs
+@@ -130,6 +130,7 @@ extractConfig cp = do
+ cfWikiTitle <- get cp "DEFAULT" "wiki-title"
+ cfFeedDays <- get cp "DEFAULT" "feed-days"
+ cfFeedRefreshTime <- get cp "DEFAULT" "feed-refresh-time"
++ cfPDFExport <- get cp "DEFAULT" "pdf-export"
+ cfPandocUserData <- get cp "DEFAULT" "pandoc-user-data"
+ cfXssSanitize <- get cp "DEFAULT" "xss-sanitize"
+ cfRecentActivityDays <- get cp "DEFAULT" "recent-activity-days"
+@@ -231,6 +232,7 @@ extractConfig cp = do
+ , wikiTitle = cfWikiTitle
+ , feedDays = readNumber "feed-days" cfFeedDays
+ , feedRefreshTime = readNumber "feed-refresh-time" cfFeedRefreshTime
++ , pdfExport = cfPDFExport
+ , pandocUserData = if null cfPandocUserData
+ then Nothing
+ else Just cfPandocUserData
+diff --git src/Network/Gitit/ContentTransformer.hs src/Network/Gitit/ContentTransformer.hs
+index 12e450a..fa82604 100644
+--- src/Network/Gitit/ContentTransformer.hs
++++ src/Network/Gitit/ContentTransformer.hs
+@@ -31,6 +31,7 @@ module Network.Gitit.ContentTransformer
+ , showRawPage
+ , showFileAsText
+ , showPage
++ , exportPage
+ , showHighlightedSource
+ , showFile
+ , preview
+@@ -44,6 +45,7 @@ module Network.Gitit.ContentTransformer
+ , textResponse
+ , mimeFileResponse
+ , mimeResponse
++ , exportPandoc
+ , applyWikiTemplate
+ -- * Content-type transformation combinators
+ , pageToWikiPandoc
+@@ -77,6 +79,7 @@ import Data.List (stripPrefix)
+ import Data.Maybe (isNothing, mapMaybe)
+ import Data.Semigroup ((<>))
+ import Network.Gitit.Cache (lookupCache, cacheContents)
++import Network.Gitit.Export (exportFormats)
+ import Network.Gitit.Framework hiding (uriPath)
+ import Network.Gitit.Layout
+ import Network.Gitit.Page (stringToPage)
+@@ -183,6 +186,10 @@ showFileAsText = runFileTransformer rawTextResponse
+ showPage :: Handler
+ showPage = runPageTransformer htmlViaPandoc
+
++-- | Responds with page exported into selected format.
++exportPage :: Handler
++exportPage = runPageTransformer exportViaPandoc
++
+ -- | Responds with highlighted source code.
+ showHighlightedSource :: Handler
+ showHighlightedSource = runFileTransformer highlightRawSource
+@@ -213,6 +220,15 @@ applyPreCommitPlugins = runPageTransformer . applyPreCommitTransforms
+ rawTextResponse :: ContentTransformer Response
+ rawTextResponse = rawContents >>= textResponse
+
++-- | Responds with a wiki page in the format specified
++-- by the @format@ parameter.
++exportViaPandoc :: ContentTransformer Response
++exportViaPandoc = rawContents >>=
++ maybe mzero return >>=
++ contentsToPage >>=
++ pageToWikiPandoc >>=
++ exportPandoc
++
+ -- | Responds with a wiki page. Uses the cache when
+ -- possible and caches the rendered page when appropriate.
+ htmlViaPandoc :: ContentTransformer Response
+@@ -306,6 +322,17 @@ mimeResponse :: Monad m
+ mimeResponse c mimeType =
+ return . setContentType mimeType . toResponse $ c
+
++-- | Converts Pandoc to response using format specified in parameters.
++exportPandoc :: Pandoc -> ContentTransformer Response
++exportPandoc doc = do
++ params <- getParams
++ page <- getPageName
++ cfg <- lift getConfig
++ let format = pFormat params
++ case lookup format (exportFormats cfg) of
++ Nothing -> error $ "Unknown export format: " ++ format
++ Just writer -> lift (writer page doc)
++
+ -- | Adds the sidebar, page tabs, and other elements of the wiki page
+ -- layout to the raw content.
+ applyWikiTemplate :: Html -> ContentTransformer Response
+diff --git src/Network/Gitit/Export.hs src/Network/Gitit/Export.hs
+new file mode 100644
+index 0000000..0842a8c
+--- /dev/null
++++ src/Network/Gitit/Export.hs
+@@ -0,0 +1,307 @@
++{-# LANGUAGE OverloadedStrings #-}
++{-# LANGUAGE FlexibleContexts #-}
++{-
++Copyright (C) 2009 John MacFarlane <jgm@berkeley.edu>
++
++This program is free software; you can redistribute it and/or modify
++it under the terms of the GNU General Public License as published by
++the Free Software Foundation; either version 2 of the License, or
++(at your option) any later version.
++
++This program is distributed in the hope that it will be useful,
++but WITHOUT ANY WARRANTY; without even the implied warranty of
++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++GNU General Public License for more details.
++
++You should have received a copy of the GNU General Public License
++along with this program; if not, write to the Free Software
++Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
++-}
++
++{- Functions for exporting wiki pages in various formats.
++-}
++
++module Network.Gitit.Export ( exportFormats ) where
++import Control.Exception (throwIO)
++import Text.Pandoc hiding (HTMLMathMethod(..), getDataFileName)
++import qualified Text.Pandoc as Pandoc
++import Text.Pandoc.PDF (makePDF)
++import Text.Pandoc.SelfContained as SelfContained
++import qualified Text.Pandoc.UTF8 as UTF8
++import qualified Data.Map as M
++import Network.Gitit.Server
++import Network.Gitit.Framework (pathForPage)
++import Network.Gitit.State (getConfig)
++import Network.Gitit.Types
++import Network.Gitit.Cache (cacheContents, lookupCache)
++import Text.DocTemplates as DT
++import Control.Monad.Trans (liftIO)
++import Control.Monad (unless)
++import Text.XHtml (noHtml)
++import qualified Data.ByteString as B
++import qualified Data.ByteString.Lazy as L
++import System.FilePath ((</>), takeDirectory)
++import System.Environment (setEnv)
++import System.Directory (doesFileExist)
++import Text.HTML.SanitizeXSS
++import Data.ByteString.Lazy (fromStrict)
++import Data.Text (Text)
++import qualified Data.Text as T
++import Data.Text.Encoding (encodeUtf8)
++import Data.List (isPrefixOf)
++import Skylighting (styleToCss, pygments)
++import System.IO.Temp (withSystemTempDirectory)
++import Paths_gitit (getDataFileName)
++
++defaultRespOptions :: WriterOptions
++defaultRespOptions = def { writerHighlightStyle = Just pygments }
++
++respondX :: String -> String -> String
++ -> (WriterOptions -> Pandoc -> PandocIO L.ByteString)
++ -> WriterOptions -> String -> Pandoc -> Handler
++respondX templ mimetype ext fn opts page doc = do
++ cfg <- getConfig
++ doc' <- if ext `elem` ["odt","pdf","beamer","epub","docx","rtf"]
++ then fixURLs page doc
++ else return doc
++ doc'' <- liftIO $ runIO $ do
++ setUserDataDir $ pandocUserData cfg
++ compiledTemplate <- compileDefaultTemplate (T.pack templ)
++ fn opts{ writerTemplate = Just compiledTemplate } doc'
++ either (liftIO . throwIO)
++ (ok . setContentType mimetype .
++ (if null ext then id else setFilename (page ++ "." ++ ext)) .
++ toResponseBS B.empty)
++ doc''
++
++respondS :: String -> String -> String -> (WriterOptions -> Pandoc -> PandocIO Text)
++ -> WriterOptions -> String -> Pandoc -> Handler
++respondS templ mimetype ext fn =
++ respondX templ mimetype ext (\o d -> fromStrict . encodeUtf8 <$> fn o d)
++
++respondSlides :: String -> (WriterOptions -> Pandoc -> PandocIO Text) -> String -> Pandoc -> Handler
++respondSlides templ fn page doc = do
++ cfg <- getConfig
++ let math = case mathMethod cfg of
++ MathML -> Pandoc.MathML
++ WebTeX u -> Pandoc.WebTeX $ T.pack u
++ _ -> Pandoc.PlainMath
++ let opts' = defaultRespOptions { writerIncremental = True
++ , writerHTMLMathMethod = math}
++ -- We sanitize the body only, to protect against XSS attacks.
++ -- (Sanitizing the whole HTML page would strip out javascript
++ -- needed for the slides.) We then pass the body into the
++ -- slide template using the 'body' variable.
++ Pandoc meta blocks <- fixURLs page doc
++ docOrError <- liftIO $ runIO $ do
++ setUserDataDir $ pandocUserData cfg
++ body' <- writeHtml5String opts' (Pandoc meta blocks) -- just body
++ let body'' = T.unpack
++ $ (if xssSanitize cfg then sanitizeBalance else id)
++ $ body'
++ let setVariable key val (DT.Context ctx) =
++ DT.Context $ M.insert (T.pack key) (toVal (T.pack val)) ctx
++ variables' <- if mathMethod cfg == MathML
++ then do
++ s <- readDataFile "MathMLinHTML.js"
++ return $ setVariable "mathml-script"
++ (UTF8.toString s) mempty
++ else return mempty
++ compiledTemplate <- compileDefaultTemplate (T.pack templ)
++ dzcore <- if templ == "dzslides"
++ then do
++ dztempl <- readDataFile $ "dzslides" </> "template.html"
++ return $ unlines
++ $ dropWhile (not . isPrefixOf "<!-- {{{{ dzslides core")
++ $ lines $ UTF8.toString dztempl
++ else return ""
++ let opts'' = opts'{
++ writerVariables =
++ setVariable "body" body'' $
++ setVariable "dzslides-core" dzcore $
++ setVariable "highlighting-css" pygmentsCss
++ $ variables'
++ ,writerTemplate = Just compiledTemplate }
++ h <- fn opts'' (Pandoc meta [])
++ makeSelfContained h
++ either (liftIO . throwIO)
++ (ok . setContentType "text/html;charset=UTF-8" .
++ (setFilename (page ++ ".html")) .
++ toResponseBS B.empty . L.fromStrict . UTF8.fromText)
++ docOrError
++
++respondLaTeX :: String -> Pandoc -> Handler
++respondLaTeX = respondS "latex" "application/x-latex" "tex"
++ writeLaTeX defaultRespOptions
++
++respondConTeXt :: String -> Pandoc -> Handler
++respondConTeXt = respondS "context" "application/x-context" "tex"
++ writeConTeXt defaultRespOptions
++
++
++respondRTF :: String -> Pandoc -> Handler
++respondRTF = respondX "rtf" "application/rtf" "rtf"
++ (\o d -> L.fromStrict . UTF8.fromText <$> writeRTF o d) defaultRespOptions
++
++respondRST :: String -> Pandoc -> Handler
++respondRST = respondS "rst" "text/plain; charset=utf-8" ""
++ writeRST defaultRespOptions{writerReferenceLinks = True}
++
++respondMarkdown :: String -> Pandoc -> Handler
++respondMarkdown = respondS "markdown" "text/plain; charset=utf-8" ""
++ writeMarkdown defaultRespOptions{writerReferenceLinks = True}
++
++respondCommonMark :: String -> Pandoc -> Handler
++respondCommonMark = respondS "commonmark" "text/plain; charset=utf-8" ""
++ writeCommonMark defaultRespOptions{writerReferenceLinks = True}
++
++respondPlain :: String -> Pandoc -> Handler
++respondPlain = respondS "plain" "text/plain; charset=utf-8" ""
++ writePlain defaultRespOptions
++
++respondMan :: String -> Pandoc -> Handler
++respondMan = respondS "man" "text/plain; charset=utf-8" ""
++ writeMan defaultRespOptions
++
++respondTexinfo :: String -> Pandoc -> Handler
++respondTexinfo = respondS "texinfo" "application/x-texinfo" "texi"
++ writeTexinfo defaultRespOptions
++
++respondDocbook :: String -> Pandoc -> Handler
++respondDocbook = respondS "docbook" "application/docbook+xml" "xml"
++ writeDocbook5 defaultRespOptions
++
++respondOrg :: String -> Pandoc -> Handler
++respondOrg = respondS "org" "text/plain; charset=utf-8" ""
++ writeOrg defaultRespOptions
++
++respondICML :: String -> Pandoc -> Handler
++respondICML = respondX "icml" "application/xml; charset=utf-8" ""
++ (\o d -> L.fromStrict . UTF8.fromText <$> writeICML o d)
++ defaultRespOptions
++
++respondTextile :: String -> Pandoc -> Handler
++respondTextile = respondS "textile" "text/plain; charset=utf-8" ""
++ writeTextile defaultRespOptions
++
++respondAsciiDoc :: String -> Pandoc -> Handler
++respondAsciiDoc = respondS "asciidoc" "text/plain; charset=utf-8" ""
++ writeAsciiDoc defaultRespOptions
++
++respondMediaWiki :: String -> Pandoc -> Handler
++respondMediaWiki = respondS "mediawiki" "text/plain; charset=utf-8" ""
++ writeMediaWiki defaultRespOptions
++
++respondODT :: String -> Pandoc -> Handler
++respondODT = respondX "opendocument" "application/vnd.oasis.opendocument.text"
++ "odt" writeODT defaultRespOptions
++
++respondEPUB :: String -> Pandoc -> Handler
++respondEPUB = respondX "html" "application/epub+zip" "epub" writeEPUB3
++ defaultRespOptions
++
++respondDocx :: String -> Pandoc -> Handler
++respondDocx = respondX "native"
++ "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
++ "docx" writeDocx defaultRespOptions
++
++respondPDF :: Bool -> String -> Pandoc -> Handler
++respondPDF useBeamer page old_pndc = fixURLs page old_pndc >>= \pndc -> do
++ cfg <- getConfig
++ unless (pdfExport cfg) $ error "PDF export disabled"
++ let cacheName = pathForPage page (defaultExtension cfg) ++ ".export.pdf"
++ cached <- if useCache cfg
++ then lookupCache cacheName
++ else return Nothing
++ pdf' <- case cached of
++ Just (_modtime, bs) -> return $ Right $ L.fromChunks [bs]
++ Nothing -> liftIO $
++ withSystemTempDirectory "gitit" $ \tmpdir -> do
++ let toc = tableOfContents cfg
++ -- ensure that LaTeX \include commands can't include
++ -- files outside the working directory, e.g. /etc/passwd:
++ writeFile (tmpdir </> "texmf.cnf")
++ "openout_any = p\nopenin_any = p\n"
++ setEnv "TEXMFCNF" (tmpdir ++ ":")
++ res <- runIO $ do
++ setUserDataDir $ pandocUserData cfg
++ setInputFiles [baseUrl cfg]
++ let templ = if useBeamer then "beamer" else "latex"
++ compiledTemplate <- compileDefaultTemplate templ
++ makePDF "pdflatex" [] (if useBeamer then writeBeamer else writeLaTeX)
++ defaultRespOptions{ writerTemplate = Just compiledTemplate
++ , writerTableOfContents = toc } pndc
++ either (liftIO . throwIO) return res
++
++ case pdf' of
++ Left logOutput' -> simpleErrorHandler ("PDF creation failed:\n"
++ ++ UTF8.toStringLazy logOutput')
++ Right pdfBS -> do
++ case cached of
++ Nothing ->
++ cacheContents cacheName $ B.concat . L.toChunks $ pdfBS
++ _ -> return ()
++ ok $ setContentType "application/pdf" $ setFilename (page ++ ".pdf") $
++ (toResponse noHtml) {rsBody = pdfBS}
++
++-- | When we create a PDF or ODT from a Gitit page, we need to fix the URLs of any
++-- images on the page. Those URLs will often be relative to the staticDir, but the
++-- PDF or ODT processor only understands paths relative to the working directory.
++--
++-- Because the working directory will not in general be the root of the gitit instance
++-- at the time the Pandoc is fed to e.g. pdflatex, this function replaces the URLs of
++-- images in the staticDir with their correct absolute file path.
++fixURLs :: String -> Pandoc -> GititServerPart Pandoc
++fixURLs page pndc = do
++ cfg <- getConfig
++ defaultStatic <- liftIO $ getDataFileName $ "data" </> "static"
++
++ let static = staticDir cfg
++ let repoPath = repositoryPath cfg
++
++ let go (Image attr ils (url, title)) = do
++ fixedURL <- fixURL $ T.unpack url
++ return $ Image attr ils (T.pack fixedURL, title)
++ go x = return x
++
++ fixURL ('/':url) = resolve url
++ fixURL url = resolve $ takeDirectory page </> url
++
++ resolve p = do
++ sp <- doesFileExist $ static </> p
++ dsp <- doesFileExist $ defaultStatic </> p
++ return (if sp then static </> p
++ else (if dsp then defaultStatic </> p
++ else repoPath </> p))
++ liftIO $ bottomUpM go pndc
++
++exportFormats :: Config -> [(String, String -> Pandoc -> Handler)]
++exportFormats cfg = if pdfExport cfg
++ then ("PDF", respondPDF False) :
++ ("Beamer", respondPDF True) :
++ rest
++ else rest
++ where rest = [ ("LaTeX", respondLaTeX) -- (description, writer)
++ , ("ConTeXt", respondConTeXt)
++ , ("Texinfo", respondTexinfo)
++ , ("reST", respondRST)
++ , ("Markdown", respondMarkdown)
++ , ("CommonMark",respondCommonMark)
++ , ("Plain text",respondPlain)
++ , ("MediaWiki", respondMediaWiki)
++ , ("Org-mode", respondOrg)
++ , ("ICML", respondICML)
++ , ("Textile", respondTextile)
++ , ("AsciiDoc", respondAsciiDoc)
++ , ("Man page", respondMan)
++ , ("DocBook", respondDocbook)
++ , ("DZSlides", respondSlides "dzslides" writeDZSlides)
++ , ("Slidy", respondSlides "slidy" writeSlidy)
++ , ("S5", respondSlides "s5" writeS5)
++ , ("EPUB", respondEPUB)
++ , ("ODT", respondODT)
++ , ("DOCX", respondDocx)
++ , ("RTF", respondRTF) ]
++
++pygmentsCss :: String
++pygmentsCss = styleToCss pygments
+diff --git src/Network/Gitit/Handlers.hs src/Network/Gitit/Handlers.hs
+index 44b19fe..d9f894f 100644
+--- src/Network/Gitit/Handlers.hs
++++ src/Network/Gitit/Handlers.hs
+@@ -42,6 +42,7 @@ module Network.Gitit.Handlers (
+ , showPage
+ , showPageDiff
+ , showFileDiff
++ , exportPage
+ , updatePage
+ , editPage
+ , deletePage
+@@ -60,7 +61,7 @@ import Network.Gitit.Feed (filestoreToXmlFeed, FeedConfig(..))
+ import Network.Gitit.Util (orIfNull)
+ import Network.Gitit.Cache (expireCachedFile, lookupCache, cacheContents)
+ import Network.Gitit.ContentTransformer (showRawPage, showFileAsText, showPage,
+- showHighlightedSource, preview, applyPreCommitPlugins)
++ exportPage, showHighlightedSource, preview, applyPreCommitPlugins)
+ import Network.Gitit.Page (readCategories)
+ import qualified Control.Exception as E
+ import System.FilePath
+diff --git src/Network/Gitit/Layout.hs src/Network/Gitit/Layout.hs
+index f835d42..fd307c7 100644
+--- src/Network/Gitit/Layout.hs
++++ src/Network/Gitit/Layout.hs
+@@ -31,11 +31,12 @@ import Network.Gitit.Server
+ import Network.Gitit.Framework
+ import Network.Gitit.State
+ import Network.Gitit.Types
++import Network.Gitit.Export (exportFormats)
+ import Network.HTTP (urlEncodeVars)
+ import qualified Text.StringTemplate as T
+ import Text.XHtml hiding ( (</>), dir, method, password, rev )
+ import Text.XHtml.Strict ( stringToHtmlString )
+-import Data.Maybe (isNothing)
++import Data.Maybe (isNothing, isJust, fromJust)
+
+ defaultPageLayout :: PageLayout
+ defaultPageLayout = PageLayout
+@@ -110,6 +111,8 @@ filledPageTemplate base' cfg layout htmlContents templ =
+ maybe id (T.setAttribute "markuphelp") (pgMarkupHelp layout) .
+ setBoolAttr "printable" (pgPrintable layout) .
+ maybe id (T.setAttribute "revision") rev .
++ T.setAttribute "exportbox"
++ (renderHtmlFragment $ exportBox base' cfg page rev) .
+ (if null (pgTabs layout) then id else T.setAttribute "tabs"
+ (renderHtmlFragment tabs)) .
+ (\f x xs -> if null xs then x else f xs) (T.setAttribute "messages") id (pgMessages layout) .
+@@ -119,6 +122,17 @@ filledPageTemplate base' cfg layout htmlContents templ =
+ templ
+
+
++exportBox :: String -> Config -> String -> Maybe String -> Html
++exportBox base' cfg page rev | not (isSourceCode page) =
++ gui (base' ++ urlForPage page) ! [identifier "exportbox"] <<
++ ([ textfield "revision" ! [thestyle "display: none;",
++ value (fromJust rev)] | isJust rev ] ++
++ [ select ! [name "format"] <<
++ map ((\f -> option ! [value f] << f) . fst) (exportFormats cfg)
++ , primHtmlChar "nbsp"
++ , submit "export" "Export" ])
++exportBox _ _ _ _ = noHtml
++
+ -- auxiliary functions:
+
+ linkForTab :: (Tab -> Html -> Html) -> String -> String -> Maybe String -> Tab -> Html
+diff --git src/Network/Gitit/Types.hs src/Network/Gitit/Types.hs
+index aa23ec1..8f037b9 100644
+--- src/Network/Gitit/Types.hs
++++ src/Network/Gitit/Types.hs
+@@ -204,6 +204,8 @@ data Config = Config {
+ feedDays :: Integer,
+ -- | Number of minutes to cache feeds before refreshing
+ feedRefreshTime :: Integer,
++ -- | Allow PDF export?
++ pdfExport :: Bool,
+ -- | Directory to search for pandoc customizations
+ pandocUserData :: Maybe FilePath,
+ -- | Filter HTML through xss-sanitize
+@@ -465,7 +467,7 @@ instance FromData Command where
+ return $ case map fst pairs `intersect` commandList of
+ [] -> Command Nothing
+ (c:_) -> Command $ Just c
+- where commandList = ["update", "cancel"]
++ where commandList = ["update", "cancel", "export"]
+
+ -- | State for a single wiki.
+ data WikiState = WikiState {
diff --git a/www/hs-gitit/files/extra-patch-src_Network_Gitit_Config.hs b/www/hs-gitit/files/extra-patch-src_Network_Gitit_Config.hs
new file mode 100644
index 000000000000..0e977d0e92cf
--- /dev/null
+++ b/www/hs-gitit/files/extra-patch-src_Network_Gitit_Config.hs
@@ -0,0 +1,22 @@
+--- src/Network/Gitit/Config.hs.orig 2023-07-10 14:38:47 UTC
++++ src/Network/Gitit/Config.hs
+@@ -130,7 +130,9 @@ extractConfig cp = do
+ cfWikiTitle <- get cp "DEFAULT" "wiki-title"
+ cfFeedDays <- get cp "DEFAULT" "feed-days"
+ cfFeedRefreshTime <- get cp "DEFAULT" "feed-refresh-time"
++ cfExports <- get cp "DEFAULT" "exports"
+ cfPDFExport <- get cp "DEFAULT" "pdf-export"
++ cfPDFEngine <- get cp "DEFAULT" "pdf-engine"
+ cfPandocUserData <- get cp "DEFAULT" "pandoc-user-data"
+ cfXssSanitize <- get cp "DEFAULT" "xss-sanitize"
+ cfRecentActivityDays <- get cp "DEFAULT" "recent-activity-days"
+@@ -232,7 +234,9 @@ extractConfig cp = do
+ , wikiTitle = cfWikiTitle
+ , feedDays = readNumber "feed-days" cfFeedDays
+ , feedRefreshTime = readNumber "feed-refresh-time" cfFeedRefreshTime
++ , exports = cfExports
+ , pdfExport = cfPDFExport
++ , pdfEngine = cfPDFEngine
+ , pandocUserData = if null cfPandocUserData
+ then Nothing
+ else Just cfPandocUserData
diff --git a/www/hs-gitit/files/extra-patch-src_Network_Gitit_Export.hs b/www/hs-gitit/files/extra-patch-src_Network_Gitit_Export.hs
new file mode 100644
index 000000000000..67bad2b51db6
--- /dev/null
+++ b/www/hs-gitit/files/extra-patch-src_Network_Gitit_Export.hs
@@ -0,0 +1,31 @@
+--- src/Network/Gitit/Export.hs.orig 2023-07-10 14:38:47 UTC
++++ src/Network/Gitit/Export.hs
+@@ -61,6 +61,7 @@ respondX :: String -> String -> String
+ -> WriterOptions -> String -> Pandoc -> Handler
+ respondX templ mimetype ext fn opts page doc = do
+ cfg <- getConfig
++ unless (exports cfg) $ error "exports are disabled"
+ doc' <- if ext `elem` ["odt","pdf","beamer","epub","docx","rtf"]
+ then fixURLs page doc
+ else return doc
+@@ -169,7 +170,11 @@ respondTexinfo = respondS "texinfo" "application/x-tex
+
+ respondDocbook :: String -> Pandoc -> Handler
+ respondDocbook = respondS "docbook" "application/docbook+xml" "xml"
++#if MIN_VERSION_pandoc(3,0,0)
++ writeDocBook5 defaultRespOptions
++#else
+ writeDocbook5 defaultRespOptions
++#endif
+
+ respondOrg :: String -> Pandoc -> Handler
+ respondOrg = respondS "org" "text/plain; charset=utf-8" ""
+@@ -228,7 +233,7 @@ respondPDF useBeamer page old_pndc = fixURLs page old_
+ setInputFiles [baseUrl cfg]
+ let templ = if useBeamer then "beamer" else "latex"
+ compiledTemplate <- compileDefaultTemplate templ
+- makePDF "pdflatex" [] (if useBeamer then writeBeamer else writeLaTeX)
++ makePDF (pdfEngine cfg) [] (if useBeamer then writeBeamer else writeLaTeX)
+ defaultRespOptions{ writerTemplate = Just compiledTemplate
+ , writerTableOfContents = toc } pndc
+ either (liftIO . throwIO) return res
diff --git a/www/hs-gitit/files/extra-patch-src_Network_Gitit_Layout.hs b/www/hs-gitit/files/extra-patch-src_Network_Gitit_Layout.hs
new file mode 100644
index 000000000000..f671c768b173
--- /dev/null
+++ b/www/hs-gitit/files/extra-patch-src_Network_Gitit_Layout.hs
@@ -0,0 +1,11 @@
+--- src/Network/Gitit/Layout.hs.orig 2023-07-10 14:38:47 UTC
++++ src/Network/Gitit/Layout.hs
+@@ -123,7 +123,7 @@ filledPageTemplate base' cfg layout htmlContents templ
+
+
+ exportBox :: String -> Config -> String -> Maybe String -> Html
+-exportBox base' cfg page rev | not (isSourceCode page) =
++exportBox base' cfg page rev | exports cfg && not (isSourceCode page) =
+ gui (base' ++ urlForPage page) ! [identifier "exportbox"] <<
+ ([ textfield "revision" ! [thestyle "display: none;",
+ value (fromJust rev)] | isJust rev ] ++
diff --git a/www/hs-gitit/files/extra-patch-src_Network_Gitit_Types.hs b/www/hs-gitit/files/extra-patch-src_Network_Gitit_Types.hs
new file mode 100644
index 000000000000..c9e8f4624175
--- /dev/null
+++ b/www/hs-gitit/files/extra-patch-src_Network_Gitit_Types.hs
@@ -0,0 +1,15 @@
+--- src/Network/Gitit/Types.hs.orig 2023-07-10 14:38:47 UTC
++++ src/Network/Gitit/Types.hs
+@@ -204,8 +204,12 @@ data Config = Config {
+ feedDays :: Integer,
+ -- | Number of minutes to cache feeds before refreshing
+ feedRefreshTime :: Integer,
++ -- | Allow exports?
++ exports :: Bool,
+ -- | Allow PDF export?
+ pdfExport :: Bool,
++ -- | Which PDF engine to use?
++ pdfEngine :: String,
+ -- | Directory to search for pandoc customizations
+ pandocUserData :: Maybe FilePath,
+ -- | Filter HTML through xss-sanitize
diff --git a/www/hs-gitit/files/gitit.in b/www/hs-gitit/files/gitit.in
new file mode 100755
index 000000000000..6f984047406e
--- /dev/null
+++ b/www/hs-gitit/files/gitit.in
@@ -0,0 +1,236 @@
+#!/bin/sh
+#
+# $FreeBSD$
+#
+# PROVIDE: gitit
+# REQUIRE: LOGIN
+# KEYWORD: shutdown
+#
+# Add the following lines to /etc/rc.conf.local or /etc/rc.conf
+# to enable this service:
+#
+# gitit_enable (bool): Set to NO by default.
+# Set it to YES to enable gitit.
+# gitit_cfg (str): Set this to the list of all gitit instance
+# names, if you want to run more than one.
+# If set, then the gitit_* variables are used as
+# defaults for the corresponding instance
+# specific variables gitit_<instance>_*.
+# gitit_chdir (path): Directory in which to start gitit.
+# gitit_dir (path): Directory in which to start gitit. When set and
+# when multiple gitit instances are used via
+# gitit_cfg, then their default gitit_..._chdir
+# is $gitit_dir/<instance>.
+# gitit_supervise (bool):
+# Whether daemon process should restart
+# gitit on exit. (Might cause looping restarts!)
+# gitit_runuser (user): User id that runs this gitit instance.
+# gitit_config (path): Config file (possibly relative to gitit_chdir).
+# gitit_port (number): TCP port number to listen for HTTP requests.
+# gitit_flags (str): Defaults to "+RTS -I0 -RTS". That avoids CPU
+# usage by ghc's idle garbage collector, but
+# only if the gitit port was built using
+# CONFIGURE_ARGS+= "--ghc-option=-rtsopts".
+# gitit_locale (str): UTF-8 required!
+# gitit_timezone (str): gitit 0.11.1 requires UTC
+#
+
+. /etc/rc.subr
+
+name=gitit
+desc="run gitit Wiki webserver process(es)"
+rcvar=gitit_enable
+
+load_rc_config $name
+
+: ${gitit_enable:=NO}
+: ${gitit_program=%%PREFIX%%/bin/gitit}
+: ${gitit_pidfile=/var/run/${name}.pid}
+: ${gitit_dir=/var/gitit}
+: ${gitit_supervise=NO}
+: ${gitit_runuser=gitit}
+: ${gitit_config=${name}.conf}
+: ${gitit_port=5001}
+: ${gitit_flags="+RTS -I0 -RTS"}
+: ${gitit_locale=en_US.UTF-8}
+: ${gitit_timezone=UTC}
+
+start_cmd="gitit_start $*"
+stop_cmd="gitit_stop $*"
+restart_cmd="gitit_restart $*"
+status_cmd="gitit_status $*"
+cmd=$1
+
+gitit_setdefaults()
+{
+ [ -n "${gitit_cfg}" ] || return
+ eval gitit_enable_default=\$${name}_enable
+ #eval gitit_chdir_default=\$${name}_chdir
+ eval gitit_supervise_default=\$${name}_supervise
+ eval gitit_runuser_default=\$${name}_runuser
+ eval gitit_config_default=\$${name}_config
+ eval gitit_port_default=\$${name}_port
+ eval gitit_flags_default=\$${name}_flags
+ eval gitit_locale_default=\$${name}_locale
+ eval gitit_timezone_default=\$${name}_timezone
+}
+
+gitit_setinstancevars()
+{
+ local instance gitit_supervise_instance gitit_config_instance gitit_runuser_instance gitit_port_instance gitit_flags_instance gitit_locale_instance gitit_timezone_instance
+ instance=$1
+ eval gitit_enable_instance=\$${name}_${instance}_enable
+ [ -z "${gitit_enable_instance}" ] || gitit_enable="${gitit_enable_instance}"
+ [ -n "${gitit_enable_instance}" ] || gitit_enable="${gitit_enable_default}"
+ eval gitit_chdir=\$${name}_${instance}_chdir
+ [ -n "${gitit_chdir}" ] || [ -z "${gitit_dir} " ] || gitit_chdir="${gitit_dir}/${instance}"
+ eval gitit_supervise_instance=\$${name}_${instance}_supervise
+ [ -z "${gitit_supervise_instance}" ] || gitit_supervise="${gitit_supervise_instance}"
+ [ -n "${gitit_supervise_instance}" ] || gitit_supervise="${gitit_supervise_default}"
+ eval gitit_runuser_instance=\$${name}_${instance}_runuser
+ [ -z "${gitit_runuser_instance}" ] || gitit_runuser="${gitit_runuser_instance}"
+ [ -n "${gitit_runuser_instance}" ] || gitit_runuser="${gitit_runuser_default}"
+ eval gitit_config_instance=\$${name}_${instance}_config
+ [ -z "${gitit_config_instance}" ] || gitit_config="${gitit_config_instance}"
+ [ -n "${gitit_config_instance}" ] || gitit_config="${gitit_config_default}"
+ eval gitit_port_instance=\$${name}_${instance}_port
+ [ -z "${gitit_port_instance}" ] || gitit_port="${gitit_port_instance}"
+ [ -n "${gitit_port_instance}" ] || gitit_port="${gitit_port_default}"
+ eval gitit_flags_instance=\$${name}_${instance}_flags
+ [ -z "${gitit_flags_instance}" ] || gitit_flags="${gitit_flags_instance}"
+ [ -n "${gitit_flags_instance}" ] || gitit_flags="${gitit_flags_default}"
+ eval gitit_locale_instance=\$${name}_${instance}_locale
+ [ -z "${gitit_locale_instance}" ] || gitit_locale="${gitit_locale_instance}"
+ [ -n "${gitit_locale_instance}" ] || gitit_locale="${gitit_locale_default}"
+ eval gitit_timezone_instance=\$${name}_${instance}_timezone
+ [ -z "${gitit_timezone_instance}" ] || gitit_timezone="${gitit_timezone_instance}"
+
+ gitit_pidfile=/var/run/${name}-${instance}.pid
+ pidfile=`if checkyesno gitit_supervise ; then echo /var/run/${name}-${instance}-daemon.pid ; else echo ${gitit_pidfile} ; fi`
+}
+
+gitit_runonecmd()
+{
+ local real_gitit_program
+ command_args=
+ [ -z "$gitit_config" ] || command_args="$command_args -f $gitit_config"
+ [ -z "$gitit_port" ] || command_args="$command_args -p $gitit_port"
+ [ -z "$gitit_flags" ] || command_args="$command_args $gitit_flags"
+ [ -z "$gitit_locale" ] || export LANG=$gitit_locale
+ [ -z "$gitit_locale" ] || export LC_ALL=$gitit_locale
+ [ -z "$gitit_timezone" ] || export TZ=$gitit_timezone
+ daemonflags=
+ if checkyesno gitit_supervise
+ then
+ daemonflags="-r -P $pidfile "
+ fi
+ daemonflags="$daemonflags-p $gitit_pidfile"
+
+ command=/usr/sbin/daemon
+ command_args="-f $daemonflags -u $gitit_runuser $gitit_program $command_args"
+ real_gitit_program=${gitit_program}
+ gitit_program=${command}
+ gitit_flags=
+ rc_flags=
+
+ run_rc_command "${cmd}"
+
+ case ${cmd} in
+ *start)
+ # make pidfile readable for $gitit_runuser
+ chgrp $gitit_runuser $gitit_pidfile && \
+ chmod 640 $gitit_pidfile
+ ;;
+ esac
+
+ gitit_program=${real_gitit_program}
+ unset LANG LC_ALL
+}
+
+gitit_cmd()
+{
+ local instance prefixchar runinstances i argi
+ if [ -z "${gitit_cfg}" ]
+ then
+ gitit_pidfile=/var/run/${name}.pid
+ pidfile=`if checkyesno gitit_supervise ; then echo /var/run/${name}-daemon.pid ; else echo ${gitit_pidfile} ; fi`
+ gitit_runonecmd
+ else
+ case $cmd in
+ *restart)
+ prefixchar="-+"
+ ;;
+ *start)
+ prefixchar="+"
+ ;;
+ *stop)
+ prefixchar="-"
+ ;;
+ *status)
+ prefixchar="?"
+ ;;
+ esac
+ # rc_extra_args is always empty at this point, so we
+ # extract additional parameters from $*. Positional
+ # parameters have to be passed down to this function.
+ runinstances=
+ i=2
+ if [ $# -ge 2 ]
+ then
+ while [ $i -le $# ]
+ do
+ eval argi=\$$i
+ if echo "${gitit_cfg}" | grep -q -w "${argi}"
+ then
+ runinstances="${runinstances} ${argi}"
+ else
+ echo "Skipping ${argi}"' - not in ${gitit_cfg}.'
+ fi
+ i=$(($i + 1))
+ done
+ else
+ runinstances=${gitit_cfg}
+ fi
+ for instance in ${runinstances}
+ do
+ echo -n "${prefixchar}${instance}: "
+ gitit_setinstancevars ${instance}
+ gitit_runonecmd
+ done
+ fi
+}
+
+gitit_start()
+{
+ unset start_cmd
+ gitit_setdefaults
+ gitit_cmd $*
+}
+
+gitit_stop()
+{
+ unset stop_cmd
+ gitit_setdefaults
+ gitit_cmd $*
+}
+
+gitit_restart()
+{
+ unset restart_cmd
+ unset stop_cmd
+ unset start_cmd
+ gitit_setdefaults
+ cmd=stop
+ gitit_cmd $*
+ cmd=start
+ gitit_cmd $*
+}
+
+gitit_status()
+{
+ unset status_cmd
+ gitit_setdefaults
+ gitit_cmd $*
+}
+
+run_rc_command "$1"
diff --git a/www/hs-gitit/files/patch-__cabal__deps_filestore-0.6.5_Data_FileStore_Darcs.hs b/www/hs-gitit/files/patch-__cabal__deps_filestore-0.6.5_Data_FileStore_Darcs.hs
new file mode 100644
index 000000000000..47b58eba3d5d
--- /dev/null
+++ b/www/hs-gitit/files/patch-__cabal__deps_filestore-0.6.5_Data_FileStore_Darcs.hs
@@ -0,0 +1,22 @@
+--- _cabal_deps/filestore-0.6.5/Data/FileStore/Darcs.hs.orig 2001-09-09 01:46:40 UTC
++++ _cabal_deps/filestore-0.6.5/Data/FileStore/Darcs.hs
+@@ -205,7 +205,7 @@ getNames = map (drop 2) . lines . toString
+ -- | Get a list of all known files inside and managed by a repository.
+ darcsIndex :: FilePath ->IO [FilePath]
+ darcsIndex repo = withVerifyDir repo $ do
+- (status, _errOutput, output) <- runDarcsCommand repo "query" ["files","--no-directories"]
++ (status, _errOutput, output) <- runDarcsCommand repo "show" ["files","--no-directories"]
+ if status == ExitSuccess
+ then return . getNames $ output
+ else return [] -- return empty list if invalid path (see gitIndex)
+@@ -214,8 +214,8 @@ darcsIndex repo = withVerifyDir repo $ do
+ darcsDirectory :: FilePath -> FilePath -> IO [Resource]
+ darcsDirectory repo dir = withVerifyDir (repo </> dir) $ do
+ let dir' = if null dir then "" else addTrailingPathSeparator dir
+- (status1, _errOutput1, output1) <- runDarcsCommand repo "query" ["files","--no-directories"]
+- (status2, _errOutput2, output2) <- runDarcsCommand repo "query" ["files","--no-files"]
++ (status1, _errOutput1, output1) <- runDarcsCommand repo "show" ["files","--no-directories"]
++ (status2, _errOutput2, output2) <- runDarcsCommand repo "show" ["files","--no-files"]
+ if status1 == ExitSuccess && status2 == ExitSuccess
+ then do
+ let files = adhocParsing dir' . lines . toString $ output1
diff --git a/www/hs-gitit/files/patch-__cabal__deps_pandoc-3.1.4_pandoc.cabal b/www/hs-gitit/files/patch-__cabal__deps_pandoc-3.1.4_pandoc.cabal
new file mode 100644
index 000000000000..48d02aa85116
--- /dev/null
+++ b/www/hs-gitit/files/patch-__cabal__deps_pandoc-3.1.4_pandoc.cabal
@@ -0,0 +1,11 @@
+--- _cabal_deps/pandoc-3.1.4/pandoc.cabal.orig 2001-09-09 01:46:40 UTC
++++ _cabal_deps/pandoc-3.1.4/pandoc.cabal
+@@ -415,7 +415,7 @@ source-repository head
+
+ flag embed_data_files
+ Description: Embed data files in binary for relocatable executable.
+- Default: False
++ Default: True
+
+ common common-options
+ default-language: Haskell2010
diff --git a/www/hs-gitit/files/patch-data_markup.DocBook b/www/hs-gitit/files/patch-data_markup.DocBook
new file mode 100644
index 000000000000..823421ff0e3b
--- /dev/null
+++ b/www/hs-gitit/files/patch-data_markup.DocBook
@@ -0,0 +1,748 @@
+--- data/markup.DocBook.orig 2001-09-09 01:46:40 UTC
++++ data/markup.DocBook
+@@ -1,347 +1,411 @@
+-<sect1 id="markdown">
+- <title>Markdown</title>
++# Markdown
++
++The usual way to write pages for this wiki is [pandoc]'s extended form
++of [markdown]. You can start using markdown and later switch to
++DocBook by using `pandoc` to convert your markdown page to DocBook for
++more sophisticated formatting. To do so use the wiki's export option
++(if enabled) or `pandoc -f markdown -t docbook -o page.xml page.md`.
++Further down on this page there is some information about the DocBook
++format. Here we continue with an introduction to markdown.
++If you're not familiar with markdown, you should start by looking
++at the [markdown "basics" page] and the [markdown syntax description].
++Consult the [pandoc User's Guide] for information about pandoc's syntax
++for footnotes, tables, description lists, and other elements not present
++in standard markdown.
++
++[pandoc]: http://pandoc.org
++[pandoc User's Guide]: http://pandoc.org/README.html
++[markdown]: http://daringfireball.net/projects/markdown
++[markdown "basics" page]: http://daringfireball.net/projects/markdown/basics
++[markdown syntax description]: http://daringfireball.net/projects/markdown/syntax
++
++Markdown is pretty intuitive, since it is based on email conventions.
++Here are some examples to get you started:
++
+++--------------------------------------------------------+------------------------------------------------------------+
++| Markdown code | Result |
+++========================================================+============================================================+
++| `*emphasized text*` | *emphasized text* |
+++--------------------------------------------------------+------------------------------------------------------------+
++| `**strong emphasis**` | **strong emphasis** |
+++--------------------------------------------------------+------------------------------------------------------------+
++| `` `literal text` `` | `literal text` |
+++--------------------------------------------------------+------------------------------------------------------------+
++| `\*escaped special characters\*` | \*escaped special characters\* |
+++--------------------------------------------------------+------------------------------------------------------------+
++| `[external link](http://google.com)` | [external link](http://google.com) |
+++--------------------------------------------------------+------------------------------------------------------------+
++| `![folder](/img/icons/folder.png)` | ![folder](/img/icons/folder.png) |
+++--------------------------------------------------------+------------------------------------------------------------+
++| Wikilink: `[Front Page]()` | Wikilink: [Front Page]() |
+++--------------------------------------------------------+------------------------------------------------------------+
++| `H~2~O` | H~2~O |
+++--------------------------------------------------------+------------------------------------------------------------+
++| `10^100^` | 10^100^ |
+++--------------------------------------------------------+------------------------------------------------------------+
++| `~~strikeout~~` | ~~strikeout~~ |
+++--------------------------------------------------------+------------------------------------------------------------+
++| `$x = \frac{{ - b \pm \sqrt {b^2 - 4ac} }}{{2a}}$` | $x = \frac{{ - b \pm \sqrt {b^2 - 4ac} }}{{2a}}$[^1] |
++| | |
++| | [^1]: If this looks like code, it\'s because MathJax is |
++| | not installed on your system. Contact your administrator |
++| | to request it. |
+++--------------------------------------------------------+------------------------------------------------------------+
++| `A simple footnote.^[Or is it so simple?]` | A simple footnote.^[Or is it so simple?] |
+++--------------------------------------------------------+------------------------------------------------------------+
++| \> an indented paragraph\ \ | > an indented paragraph, usually used for quotations |
++| \> usually used for quotations | |
+++--------------------------------------------------------+------------------------------------------------------------+
++| #!/bin/sh -e | #!/bin/sh -e |
++| # code, indented four spaces | # code, indented four spaces |
++| echo "Hello world" | echo "Hello world" |
+++--------------------------------------------------------+------------------------------------------------------------+
++| * a bulleted list | - a bulleted list |
++| * second item | - second item |
++| - sublist | - sublist |
++| - and more | - and more |
++| * back to main list | - back to main list |
++| 1. this item has an ordered | 1. this item has an ordered |
++| 2. sublist | 2. sublist |
++| a) you can also use letters | a. you can also use letters |
++| b) another item | b. another item |
+++--------------------------------------------------------+------------------------------------------------------------+
++| Fruit Quantity | Fruit Quantity |
++| ------- --------- | ------- ---------- |
++| apples 30,200 | apples 30,200 |
++| oranges 1,998 | oranges 1,998 |
++| pears 42 | pears 42 |
++| | |
++| Table: Our fruit inventory | : Our fruit inventory |
+++--------------------------------------------------------+------------------------------------------------------------+
++
++## Headings
++
++For headings, prefix a line with one or more `#` signs: one for a major heading,
++two for a subheading, three for a subsubheading. Be sure to leave space before
++and after the heading.
++
++ # Markdown
++
++ Text...
++
++ ## Some examples...
++
++ Text...
++
++## Wiki links
++
++Links to other wiki pages are formed this way: `[Page Name]()`.
++(Gitit converts markdown links with empty targets into wikilinks.)
++
++To link to a wiki page using something else as the link text:
++`[something else](Page Name)`.
++
++Note that page names may contain spaces and some special characters.
++They need not be CamelCase. CamelCase words are *not* automatically
++converted to wiki links.
++
++Wiki pages may be organized into directories. So, if you have
++several pages on wine, you may wish to organize them like so:
++
++ Wine/Pinot Noir
++ Wine/Burgundy
++ Wine/Cabernet Sauvignon
++
++Note that a wiki link `[Burgundy]()` that occurs inside the `Wine`
++directory will link to `Wine/Burgundy`, and not to `Burgundy`.
++To link to a top-level page called `Burgundy`, you'd have to use
++`[Burgundy](/Burgundy)`.
++
++To link to a directory listing for a subdirectory, use a trailing
++slash: `[Wine/]()` will link to a listing of the `Wine` subdirectory.
++
++# DocBook
++
++As DocBook is an XML format, opening and closing tags must match
++(`<tag>...</tag>`).
++
+++--------------------------------------------------------+------------------------------------------------------------+
++| DocBook code | Result |
+++========================================================+============================================================+
++| `<emphasis>emphasized text</emphasis>` | *emphasized text* |
+++--------------------------------------------------------+------------------------------------------------------------+
++| `<emphasis role="strong">strong emphasis</emphasis>` | **strong emphasis** |
+++--------------------------------------------------------+------------------------------------------------------------+
++| `<literal>literal text</literal>` | `literal text` |
+++--------------------------------------------------------+------------------------------------------------------------+
++| XML character entities: `&lt; &gt; &quot;` | `< > "` |
+++--------------------------------------------------------+------------------------------------------------------------+
++| `<ulink url="https://en.wikipedia.org/wiki/DocBook"> | [external link](https://en.wikipedia.org/wikiDocBook) |
++| external link</ulink>` | |
+++--------------------------------------------------------+------------------------------------------------------------+
++| Inserting an image: | ![folder](/img/icons/folder.png) |
++| | |
++| <inlinemediaobject> | |
++| <alt>folder</alt> | |
++| <imageobject> | |
++| <imagedata fileref="/img/icons/folder.png" /> | |
++| </imageobject> | |
++| </inlinemediaobject> | |
+++--------------------------------------------------------+------------------------------------------------------------+
++| Wikilink: `<ulink url="Front Page">Front Page</ulink>` | Wikilink: [Front Page]() |
+++--------------------------------------------------------+------------------------------------------------------------+
++| `H<subscript>2</subscript>O` | H~2~O |
+++--------------------------------------------------------+------------------------------------------------------------+
++| `10<superscript>100</superscript>` | 10^100^ |
+++--------------------------------------------------------+------------------------------------------------------------+
++| `<emphasis role="strikethrough">strikeout</emphasis>` | ~~strikeout~~ |
+++--------------------------------------------------------+------------------------------------------------------------+
++| `$x = \frac{{ - b \pm \sqrt {b^2 - 4ac} }}{{2a}}$` | $x = \frac{{ - b \pm \sqrt {b^2 - 4ac} }}{{2a}}$[^1] |
++| | |
++| | (Use pandoc's `--mathml` option to convert TeX math code.) |
+++--------------------------------------------------------+------------------------------------------------------------+
++| `A simple footnote.<footnote>Or | A simple footnote.^[Or is it so simple?] |
++| is it so simple?</footnote>` | |
+++--------------------------------------------------------+------------------------------------------------------------+
++| `<blockquote>an indented paragraph, usually used | > an indented paragraph, usually used for quotations |
++| for quotations</blockquote>` | |
+++--------------------------------------------------------+------------------------------------------------------------+
++| <programlisting> | #!/bin/sh -e |
++| #!/bin/sh -e` | echo "Hello world" |
++| echo "Hello world" | |
++| </programlisting> | |
+++--------------------------------------------------------+------------------------------------------------------------+
++| <itemizedlist spacing="compact"> | - a bulleted list |
++| <listitem> | - second item |
++| <simpara>a bulleted list</simpara> | - sublist |
++| </listitem> | - and more |
++| <listitem> | - back to main list |
++| <simpara>second item</simpara> | 1. this item has an ordered |
++| <itemizedlist spacing="compact"> | 2. sublist |
++| <listitem> | a. you can also use letters |
++| <simpara>sublist</simpara> | b. another item |
++| </listitem> | |
++| <listitem> | |
++| <simpara>and more</simpara> | |
++| </listitem> | |
++| </itemizedlist> | |
++| </listitem> | |
++| <listitem> | |
++| <simpara>back to main list</simpara> | |
++| <orderedlist spacing="compact"> | |
++| <listitem> | |
++| <simpara>this item has an ordered</simpara> | |
++| </listitem> | |
++| <listitem> | |
++| <simpara>sublist</simpara> | |
++| <orderedlist spacing="compact" | |
++| numeration="loweralpha"> | |
++| <listitem> | |
++| <simpara>you can also use letters</simpara> | |
++| </listitem> | |
++| <listitem> | |
++| <simpara>another item</simpara> | |
++| </listitem> | |
++| </orderedlist> | |
++| </listitem> | |
++| </orderedlist> | |
++| </listitem> | |
++| </itemizedlist> | |
+++--------------------------------------------------------+------------------------------------------------------------+
++| <table> | Fruit Quantity |
++| <title>Our fruit inventory</title> | ------- ---------- |
++| <tgroup cols="2"> | apples 30,200 |
++| <colspec align="left" /> | oranges 1,998 |
++| <colspec align="right" /> | pears 42 |
++| <thead> | |
++| <row> | : Our fruit inventory |
++| <entry>Fruit</entry> | |
++| <entry>Quantity</entry> | |
++| </row> | |
++| </thead> | |
++| <tbody> | |
++| <row> | |
++| <entry>apples</entry> | |
++| <entry>30,200</entry> | |
++| </row> | |
++| <row> | |
++| <entry>oranges</entry> | |
++| <entry>1,998</entry> | |
++| </row> | |
++| <row> | |
++| <entry>pears</entry> | |
++| <entry>42</entry> | |
++| </row> | |
++| </tbody> | |
++| </tgroup> | |
++| </table> | |
+++--------------------------------------------------------+------------------------------------------------------------+
++
++## Headings
++
++A heading is given as the `<title>` element of a `<section>`:
++
++<pre>
++&lt;section&gt;
++ &lt;title&gt;Heading&lt;/title&gt;
++ &lt;simpara&gt;This is a top level section.&lt;/simpara&gt;
++ &lt;section&gt;
++ &lt;title&gt;Subheading&lt;/title&gt;
++ &lt;simpara&gt;This is a second level section.&lt;/simpara&gt;
++ &lt;/section&gt;
++&lt;/section&gt;
++</pre>
++
++## Wiki links
++
++Links to other wiki pages are formed this way:
++`<ulink url="Page Name">Page Name</ulink>`
++
++To link to a wiki page using something else as the link text:
++`<ulink url="Page Name">something else</ulink>`.
++
++Note that page names may contain spaces and some special characters.
++They need not be CamelCase. CamelCase words are *not* automatically
++converted to wiki links.
++
++Wiki pages may be organized into directories. So, if you have
++several pages on wine, you may wish to organize them like so:
++
++ Wine/Pinot Noir
++ Wine/Burgundy
++ Wine/Cabernet Sauvignon
++
++Note that a wiki link `<ulink url="Burgundy">Burgundy</ulink>`
++that occurs inside the `Wine` directory will link to `Wine/Burgundy`,
++and not to `Burgundy`. To link to a top-level page called `Burgundy`,
++you'd have to use `<ulink url="/Burgundy">Burgundy</ulink>`.
++
++To link to a directory listing for a subdirectory, use a trailing
++slash: `<ulink url="Wine/">Wine</ulink>` will link to a listing of
++the `Wine` subdirectory.
++
++## Reference material
++
++Further reading: [DocBook 5: The Definitive Guide], which includes the
++[List of DocBook elements].
++
++[DocBook 5: The Definitive Guide]: https://tdg.docbook.org/tdg/5.0/docbook.html
++[List of DocBook elements]: https://tdg.docbook.org/tdg/5.0/chunk-part-d64e8789.html
++
++## A sample document
++
++You might want to use the following document as a resource of DocBook
++snippets (copy/paste).
++
++~~~~~~~~
++
++<section id="docbook">
++ <title>Using DocBook</title>
++ <simpara>
++ As DocBook is an XML format, opening and closing tags
++ must match (&lt;tag&gt;...&lt;/tag&gt;).
++ </simpara>
++ <section id="inline">
++ <title>Text Formatting</title>
++ <simpara>
++ A simple paragraph.
++ </simpara>
+ <para>
+- This wiki's pages are written in
+- <ulink url="http://pandoc.org">pandoc</ulink>'s
+- extended form of
+- <ulink url="http://daringfireball.net/projects/markdown">markdown</ulink>.
+- If you're not familiar with markdown, you should start by looking at
+- the
+- <ulink url="http://daringfireball.net/projects/markdown/basics">markdown
+- &quot;basics&quot; page</ulink> and the
+- <ulink url="http://daringfireball.net/projects/markdown/syntax">markdown
+- syntax description</ulink>. Consult the
+- <ulink url="http://pandoc.org/README.html">pandoc
+- User's Guide</ulink> for information about pandoc's syntax for
+- footnotes, tables, description lists, and other elements not present
+- in standard markdown.
++ A complex paragraph may contain blocks.
+ </para>
+- <para>
+- Markdown is pretty intuitive, since it is based on email
+- conventions. Here are some examples to get you started:
+- </para>
+- <table>
+- <tr>
+- <td>
+- <literal>*emphasized text*</literal>
+- </td>
+- <td>
+- <emphasis>emphasized text</emphasis>
+- </td>
+- </tr>
+- <tr>
+- <td>
+- <literal>**strong emphasis**</literal>
+- </td>
+- <td>
+- <emphasis role="strong">strong emphasis</emphasis>
+- </td>
+- </tr>
+- <tr>
+- <td>
+- <literal>`literal text`</literal>
+- </td>
+- <td>
+- <literal>literal text</literal>
+- </td>
+- </tr>
+- <tr>
+- <td>
+- <literal>\*escaped special characters\*</literal>
+- </td>
+- <td>
+- *escaped special characters*
+- </td>
+- </tr>
+- <tr>
+- <td>
+- <literal>[external link](http://google.com)</literal>
+- </td>
+- <td>
+- <ulink url="http://google.com">external link</ulink>
+- </td>
+- </tr>
+- <tr>
+- <td>
+- <literal>![folder](/img/icons/folder.png)</literal>
+- </td>
+- <td>
+- <inlinemediaobject>
++ <simpara>
++ italics: <emphasis>italics</emphasis>,
++ bold: <emphasis role="strong">bold</emphasis>,
++ strikeout: <emphasis role="strikethrough">strikeout</emphasis>,
++ inline code snippets: <literal>inline code</literal>.
++ </simpara>
++ <simpara>
++ Links:
++ <ulink url="http://foo.bar/baz">external</ulink>,
++ <ulink url="Pagename">internal Wiki Link</ulink>.
++ </simpara>
++ <simpara>
++ Inserting an image:
++ <inlinemediaobject>
+ <imageobject>
+- <imagedata fileref="/img/icons/folder.png" />
++ <imagedata fileref="/img/icons/folder.png" />
+ </imageobject>
+- </inlinemediaobject>
+- </td>
+- </tr>
+- <tr>
+- <td>
+- Wikilink: <literal>[Front Page]()</literal>
+- </td>
+- <td>
+- Wikilink: <ulink url="">Front Page</ulink>
+- </td>
+- </tr>
+- <tr>
+- <td>
+- <literal>H~2~O</literal>
+- </td>
+- <td>
+- H<subscript>2</subscript>O
+- </td>
+- </tr>
+- <tr>
+- <td>
+- <literal>10^100^</literal>
+- </td>
+- <td>
+- 10<superscript>100</superscript>
+- </td>
+- </tr>
+- <tr>
+- <td>
+- <literal>~~strikeout~~</literal>
+- </td>
+- <td>
+- <emphasis role="strikethrough">strikeout</emphasis>
+- </td>
+- </tr>
+- <tr>
+- <td>
+- <literal>$x = \frac{{ - b \pm \sqrt {b^2 - 4ac} }}{{2a}}$</literal>
+- </td>
+- <td>
+- $x = \frac{{ - b \pm \sqrt {b^2 - 4ac} }}{{2a}}$<footnote>
+- <para>
+- If this looks like code, it's because MathJax is not installed on
+- your system. Contact your administrator to request it.
+- </para>
+- </footnote>
+- </td>
+- </tr>
+- <tr>
+- <td>
+- <literal>A simple footnote.^[Or is it so simple?]</literal>
+- </td>
+- <td>
+- A simple footnote.<footnote>
+- <para>
+- Or is it so simple?
+- </para>
+- </footnote>
+- </td>
+- </tr>
+- <tr>
+- <td>
+- <pre>
+- > an indented paragraph,
+- > usually used for quotations
+- </pre>
+- </td>
+- <td>
+- <blockquote>
+- <para>
+- an indented paragraph, usually used for quotations
+- </para>
+- </blockquote>
+- </td>
+- <tr>
+- <td>
+- <pre>
+- #!/bin/sh -e
+- # code, indented four spaces
+- echo "Hello world"
+- </pre>
+- </td>
+- <td>
+- <programlisting>
++ </inlinemediaobject>
++ </simpara>
++ </section>
++ <section id="blocks">
++ <title>Text Blocks</title>
++ <para>
++ Quotation:
++ <blockquote>
++ <simpara>
++ A quotation set off from the main text.
++ </simpara>
++ </blockquote>
++ </para>
++ <para>
++ Code listing:
++ <programlisting>
+ #!/bin/sh -e
+-# code, indented four spaces
+ echo &quot;Hello world&quot;
+-</programlisting>
+- </td>
+- </tr>
+- <tr>
+- <td>
+- <pre>
+- * a bulleted list
+- * second item
+- - sublist
+- - and more
+- * back to main list
+- 1. this item has an ordered
+- 2. sublist
+- a) you can also use letters
+- b) another item
+- </pre>
+- </td>
+- <td>
+- <itemizedlist spacing="compact">
++ </programlisting>
++ </para>
++ </section>
++ <section id="lists">
++ <title>Lists</title>
++ <para>
++ Simple list:
++ <itemizedlist spacing="compact">
+ <listitem>
+- <para>
+- a bulleted list
+- </para>
++ <simpara>
++ first
++ </simpara>
+ </listitem>
+ <listitem>
+- <para>
+- second item
+- </para>
+- <itemizedlist spacing="compact">
+- <listitem>
+- <para>
+- sublist
+- </para>
+- </listitem>
+- <listitem>
+- <para>
+- and more
+- </para>
+- </listitem>
+- </itemizedlist>
+- </listitem>
++ <simpara>
++ second
++ </simpara>
++ </listitem>
++ </itemizedlist>
++ Numbered list:
++ <orderedlist spacing="compact">
+ <listitem>
+- <para>
+- back to main list
+- </para>
+- <orderedlist numeration="arabic" spacing="compact">
+- <listitem>
+- <para>
+- this item has an ordered
+- </para>
+- </listitem>
+- <listitem>
+- <para>
+- sublist
+- </para>
+- <orderedlist numeration="loweralpha" spacing="compact">
+- <listitem>
+- <para>
+- you can also use letters
+- </para>
+- </listitem>
+- <listitem>
+- <para>
+- another item
+- </para>
+- </listitem>
+- </orderedlist>
+- </listitem>
+- </orderedlist>
++ <simpara>
++ first
++ </simpara>
+ </listitem>
+- </itemizedlist>
+- </td>
+- </tr>
+- <tr>
+- <td>
+- <pre>
+- Fruit Quantity
+- -------- -----------
+- apples 30,200
+- oranges 1,998
+- pears 42
+-
+- Table: Our fruit inventory
+- </pre>
+- </td>
+- <td>
+- <table>
+- <title>
+- Our fruit inventory
+- </title>
+- <tgroup cols="2">
+- <colspec align="left" />
+- <colspec align="right" />
+- <thead>
+- <row>
+- <entry>
+- Fruit
+- </entry>
+- <entry>
+- Quantity
+- </entry>
+- </row>
+- </thead>
+- <tbody>
+- <row>
+- <entry>
+- apples
+- </entry>
+- <entry>
+- 30,200
+- </entry>
+- </row>
+- <row>
+- <entry>
+- oranges
+- </entry>
+- <entry>
+- 1,998
+- </entry>
+- </row>
+- <row>
+- <entry>
+- pears
+- </entry>
+- <entry>
+- 42
+- </entry>
+- </row>
+- </tbody>
+- </tgroup>
+- </table>
+- </td>
+- </tr>
+- </table>
+- <para>
+- For headings, prefix a line with one or more <literal>#</literal>
+- signs: one for a major heading, two for a subheading, three for a
+- subsubheading. Be sure to leave space before and after the heading.
++ <listitem>
++ <simpara>
++ second
++ </simpara>
++ </listitem>
++ </orderedlist>
++ Definition list:
++ <variablelist>
++ <varlistentry>
++ <term>
++ DocBook
++ </term>
++ <listitem>
++ <simpara>
++ A sophisticated XML format.
++ </simpara>
++ </listitem>
++ </varlistentry>
++ <varlistentry>
++ <term>
++ orange
++ </term>
++ <listitem>
++ <simpara>
++ A healthy fruit.
++ </simpara>
++ </listitem>
++ <listitem>
++ <simpara>
++ A warm colour.
++ </simpara>
++ </listitem>
++ </varlistentry>
++ </variablelist>
+ </para>
+- <programlisting>
+-# Markdown
++ </section>
++</section>
+
+-Text...
+-
+-## Some examples...
+-
+-Text...
+-</programlisting>
+- <sect2 id="wiki-links">
+- <title>Wiki links</title>
+- <para>
+- Links to other wiki pages are formed this way:
+- <literal>[Page Name]()</literal>. (Gitit converts markdown links
+- with empty targets into wikilinks.)
+- </para>
+- <para>
+- To link to a wiki page using something else as the link text:
+- <literal>[something else](Page Name)</literal>.
+- </para>
+- <para>
+- Note that page names may contain spaces and some special
+- characters. They need not be CamelCase. CamelCase words are
+- <emphasis>not</emphasis> automatically converted to wiki links.
+- </para>
+- <para>
+- Wiki pages may be organized into directories. So, if you have
+- several pages on wine, you may wish to organize them like so:
+- </para>
+- <programlisting>
+-Wine/Pinot Noir
+-Wine/Burgundy
+-Wine/Cabernet Sauvignon
+-</programlisting>
+- <para>
+- Note that a wiki link <literal>[Burgundy]()</literal> that occurs
+- inside the <literal>Wine</literal> directory will link to
+- <literal>Wine/Burgundy</literal>, and not to
+- <literal>Burgundy</literal>. To link to a top-level page called
+- <literal>Burgundy</literal>, you'd have to use
+- <literal>[Burgundy](/Burgundy)</literal>.
+- </para>
+- <para>
+- To link to a directory listing for a subdirectory, use a trailing
+- slash: <literal>[Wine/]()</literal> will link to a listing of the
+- <literal>Wine</literal> subdirectory.
+- </para>
+- </sect2>
+-</sect1>
++~~~~~~~~
diff --git a/www/hs-gitit/files/patch-data_markupHelp_DocBook b/www/hs-gitit/files/patch-data_markupHelp_DocBook
new file mode 100644
index 000000000000..d246b8f7f45d
--- /dev/null
+++ b/www/hs-gitit/files/patch-data_markupHelp_DocBook
@@ -0,0 +1,125 @@
+--- data/markupHelp/DocBook.orig 2023-07-10 15:44:20 UTC
++++ data/markupHelp/DocBook
+@@ -0,0 +1,122 @@
++~~~~~~~~
++
++<section id="docbook">
++ <title>Using DocBook</title>
++ <simpara>
++ As DocBook is an XML format, opening and closing tags
++ must match (&lt;tag&gt;...&lt;/tag&gt;).
++ </simpara>
++ <section id="inline">
++ <title>Text Formatting</title>
++ <simpara>
++ A simple paragraph.
++ </simpara>
++ <para>
++ A complex paragraph may contain blocks.
++ </para>
++ <simpara>
++ italics: <emphasis>italics</emphasis>,
++ bold: <emphasis role="strong">bold</emphasis>,
++ strikeout: <emphasis role="strikethrough">strikeout</emphasis>,
++ inline code snippets: <literal>inline code</literal>.
++ </simpara>
++ <simpara>
++ Links:
++ <ulink url="http://foo.bar/baz">external</ulink>,
++ <ulink url="Pagename">internal Wiki Link</ulink>.
++ </simpara>
++ <simpara>
++ Inserting an image:
++ <inlinemediaobject>
++ <alt>folder</alt>
++ <imageobject>
++ <imagedata fileref="/img/icons/folder.png" />
++ </imageobject>
++ </inlinemediaobject>
++ </simpara>
++ </section>
++ <section id="blocks">
++ <title>Text Blocks</title>
++ <para>
++ Quotation:
++ <blockquote>
++ <simpara>
++ A quotation set off from the main text.
++ </simpara>
++ </blockquote>
++ </para>
++ <para>
++ Code listing:
++ <programlisting>
++#!/bin/sh -e
++echo &quot;Hello world&quot;
++ </programlisting>
++ </para>
++ </section>
++ <section id="lists">
++ <title>Lists</title>
++ <para>
++ Simple list:
++ <itemizedlist spacing="compact">
++ <listitem>
++ <simpara>
++ first
++ </simpara>
++ </listitem>
++ <listitem>
++ <simpara>
++ second
++ </simpara>
++ </listitem>
++ </itemizedlist>
++ Numbered list:
++ <orderedlist spacing="compact">
++ <listitem>
++ <simpara>
++ first
++ </simpara>
++ </listitem>
++ <listitem>
++ <simpara>
++ second
++ </simpara>
++ </listitem>
++ </orderedlist>
++ Definition list:
++ <variablelist>
++ <varlistentry>
++ <term>
++ DocBook
++ </term>
++ <listitem>
++ <simpara>
++ A sophisticated XML format.
++ </simpara>
++ </listitem>
++ </varlistentry>
++ <varlistentry>
++ <term>
++ orange
++ </term>
++ <listitem>
++ <simpara>
++ A healthy fruit.
++ </simpara>
++ </listitem>
++ <listitem>
++ <simpara>
++ A warm colour.
++ </simpara>
++ </listitem>
++ </varlistentry>
++ </variablelist>
++ </para>
++ </section>
++</section>
++
++~~~~~~~~
++
++Further reading:
++[DocBook 5: The Definitive Guide](https://tdg.docbook.org/tdg/5.0/docbook.html),
++which includes the
++[List of DocBook elements](https://tdg.docbook.org/tdg/5.0/chunk-part-d64e8789.html).
diff --git a/www/hs-gitit/files/patch-gitit.cabal b/www/hs-gitit/files/patch-gitit.cabal
new file mode 100644
index 000000000000..09264a8ab096
--- /dev/null
+++ b/www/hs-gitit/files/patch-gitit.cabal
@@ -0,0 +1,31 @@
+--- gitit.cabal.orig 2001-09-09 01:46:40 UTC
++++ gitit.cabal
+@@ -104,6 +104,10 @@ Flag plugins
+ plugins should disable this flag.
+ default: True
+
++Flag with_rtsopts
++ description: Use -with-rtsopts=-I0 to avoid idle GC.
++ default: True
++
+ Library
+ hs-source-dirs: src
+ exposed-modules: Network.Gitit, Network.Gitit.ContentTransformer,
+@@ -176,6 +180,8 @@ Library
+ exposed-modules: Network.Gitit.Interface
+ build-depends: ghc, ghc-paths
+ cpp-options: -D_PLUGINS
++ if flag(with_rtsopts)
++ cpp-options: -DRTSOPTS
+ default-extensions: CPP
+ default-language: Haskell2010
+ ghc-options: -Wall -fno-warn-unused-do-bind
+@@ -198,6 +204,8 @@ Executable gitit
+ default-extensions: CPP
+ default-language: Haskell2010
+ ghc-options: -Wall -threaded -fno-warn-unused-do-bind
++ if flag(with_rtsopts)
++ ghc-options: -rtsopts=all -with-rtsopts=-I0
+ ghc-prof-options: -fprof-auto-exported -rtsopts
+
+ Executable expireGititCache
diff --git a/www/hs-gitit/files/patch-src_Network_Gitit_Initialize.hs b/www/hs-gitit/files/patch-src_Network_Gitit_Initialize.hs
new file mode 100644
index 000000000000..636e7ef14447
--- /dev/null
+++ b/www/hs-gitit/files/patch-src_Network_Gitit_Initialize.hs
@@ -0,0 +1,14 @@
+--- src/Network/Gitit/Initialize.hs.orig 2001-09-09 01:46:40 UTC
++++ src/Network/Gitit/Initialize.hs
+@@ -123,7 +123,10 @@ createDefaultPages :: Config -> IO ()
+ createDefaultPages conf = do
+ let fs = filestoreFromConfig conf
+ pt = defaultPageType conf
+- toPandoc = readMarkdown def{ readerExtensions = enableExtension Ext_smart (readerExtensions def) }
++ rOpts = def{ readerExtensions = getDefaultExtensions "markdown"
++ <> extensionsFromList [Ext_smart]
++ <> readerExtensions def }
++ toPandoc = readMarkdown rOpts
+ defOpts = def{ writerExtensions = if showLHSBirdTracks conf
+ then enableExtension
+ Ext_literate_haskell
diff --git a/www/hs-gitit/files/patch-src_Network_Gitit_Util.hs b/www/hs-gitit/files/patch-src_Network_Gitit_Util.hs
new file mode 100644
index 000000000000..d8cd908bcd5e
--- /dev/null
+++ b/www/hs-gitit/files/patch-src_Network_Gitit_Util.hs
@@ -0,0 +1,10 @@
+--- src/Network/Gitit/Util.hs.orig 2001-09-09 01:46:40 UTC
++++ src/Network/Gitit/Util.hs
+@@ -115,6 +115,7 @@ parsePageType s =
+ "latex" -> (LaTeX,False)
+ "latex+lhs" -> (LaTeX,True)
+ "org" -> (Org,False)
++ "docbook" -> (DocBook,False)
+ "mediawiki" -> (MediaWiki,False)
+ x -> error $ "Unknown page type: " ++ x
+
diff --git a/www/hs-gitit/pkg-descr b/www/hs-gitit/pkg-descr
new file mode 100644
index 000000000000..c7c5cf1269ae
--- /dev/null
+++ b/www/hs-gitit/pkg-descr
@@ -0,0 +1,19 @@
+Gitit is a wiki program written in Haskell. It uses Happstack for the
+web server and pandoc for markup processing. Pages and uploaded files
+are stored in a git, darcs, or mercurial repository and may be
+modified either by using the VCS's command-line tools or through
+the wiki's web interface. By default, pandoc's extended version of
+markdown is used as a markup language, but reStructuredText, LaTeX,
+HTML, DocBook, or Emacs Org-mode markup can also be used. Gitit can
+be configured to display TeX math (using texmath) and highlighted
+source code (using highlighting-kate).
+
+Other features include
+
+ * plugins: dynamically loaded page transformations written in
+ Haskell (see "Network.Gitit.Interface")
+ * categories
+ * caching
+ * Atom feeds (site-wide and per-page)
+ * a library, "Network.Gitit", that makes it simple to include
+ a gitit wiki in any happstack application
diff --git a/www/hs-gitit/pkg-plist b/www/hs-gitit/pkg-plist
new file mode 100644
index 000000000000..af0a66fa3ec2
--- /dev/null
+++ b/www/hs-gitit/pkg-plist
@@ -0,0 +1,71 @@
+%%DATADIR%%/README.markdown
+%%DATADIR%%/data/default.conf
+%%DATADIR%%/data/FrontPage.page
+%%DATADIR%%/data/Help.page
+%%DATADIR%%/data/markup.DocBook
+%%DATADIR%%/data/markup.HTML
+%%DATADIR%%/data/markup.LaTeX
+%%DATADIR%%/data/markup.Markdown
+%%DATADIR%%/data/markup.Org
+%%DATADIR%%/data/markup.RST
+%%DATADIR%%/data/markup.Textile
+%%DATADIR%%/data/markupHelp/DocBook
+%%DATADIR%%/data/markupHelp/HTML
+%%DATADIR%%/data/markupHelp/LaTeX
+%%DATADIR%%/data/markupHelp/LaTeX+LHS
+%%DATADIR%%/data/markupHelp/Markdown
+%%DATADIR%%/data/markupHelp/Markdown+LHS
+%%DATADIR%%/data/markupHelp/Org
+%%DATADIR%%/data/markupHelp/RST
+%%DATADIR%%/data/markupHelp/RST+LHS
+%%DATADIR%%/data/post-update
+%%DATADIR%%/data/s5/default/blank.gif
+%%DATADIR%%/data/s5/default/bodybg.gif
+%%DATADIR%%/data/s5/default/framing.css
+%%DATADIR%%/data/s5/default/iepngfix.htc
+%%DATADIR%%/data/s5/default/opera.css
+%%DATADIR%%/data/s5/default/outline.css
+%%DATADIR%%/data/s5/default/pretty.css
+%%DATADIR%%/data/s5/default/print.css
+%%DATADIR%%/data/s5/default/s5-core.css
+%%DATADIR%%/data/s5/default/slides.css
+%%DATADIR%%/data/s5/default/slides.js
+%%DATADIR%%/data/s5/default/slides.min.js
+%%DATADIR%%/data/static/css/custom.css
+%%DATADIR%%/data/static/css/highlighting.css
+%%DATADIR%%/data/static/css/ie.css
+%%DATADIR%%/data/static/css/print.css
+%%DATADIR%%/data/static/css/reset-fonts-grids.css
+%%DATADIR%%/data/static/css/screen.css
+%%DATADIR%%/data/static/img/icons/feed.png
+%%DATADIR%%/data/static/img/icons/folder.png
+%%DATADIR%%/data/static/img/icons/page.png
+%%DATADIR%%/data/static/img/logo.png
+%%DATADIR%%/data/static/js/dragdiff.js
+%%DATADIR%%/data/static/js/footnotes.js
+%%DATADIR%%/data/static/js/jquery-1.2.6.js
+%%DATADIR%%/data/static/js/jquery-1.2.6.min.js
+%%DATADIR%%/data/static/js/jquery-ui-combined-1.6rc2.min.js
+%%DATADIR%%/data/static/js/jquery-ui.core-1.6rc2.js
+%%DATADIR%%/data/static/js/jquery-ui.draggable-1.6rc2.js
+%%DATADIR%%/data/static/js/jquery-ui.droppable-1.6rc2.js
+%%DATADIR%%/data/static/js/jquery-ui.tabs-1.6rc2.js
+%%DATADIR%%/data/static/js/jquery.hotkeys-0.7.9.js
+%%DATADIR%%/data/static/js/jquery.hotkeys-0.7.9.min.js
+%%DATADIR%%/data/static/js/MathMLinHTML.js
+%%DATADIR%%/data/static/js/preview.js
+%%DATADIR%%/data/static/js/search.js
+%%DATADIR%%/data/static/js/uploadForm.js
+%%DATADIR%%/data/static/robots.txt
+%%DATADIR%%/data/templates/content.st
+%%DATADIR%%/data/templates/expire.st
+%%DATADIR%%/data/templates/footer.st
+%%DATADIR%%/data/templates/getuser.st
+%%DATADIR%%/data/templates/listitem.st
+%%DATADIR%%/data/templates/logo.st
+%%DATADIR%%/data/templates/markuphelp.st
+%%DATADIR%%/data/templates/messages.st
+%%DATADIR%%/data/templates/page.st
+%%DATADIR%%/data/templates/pagetools.st
+%%DATADIR%%/data/templates/sitenav.st
+%%DATADIR%%/data/templates/userbox.st