Initial commit.

Hakyll site, generates bib from bibtex.
This commit is contained in:
Justin Hsu 2015-01-03 14:23:27 -08:00
commit 405604d03e
12 changed files with 3335 additions and 0 deletions

82
HakyllBibTex.hs Normal file
View File

@ -0,0 +1,82 @@
-- JH: From hakyll-bibtex by jaspervdj, using the Pandoc parser.
--------------------------------------------------------------------------------
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module HakyllBibTex
( BibEntry (..)
, bibEntryContext
, BibFile (..)
, bibFileEntryNames
, parseBibFile
, lookupBibEntry
) where
--------------------------------------------------------------------------------
import Control.Applicative
import Data.Binary (Binary (..))
import Data.Typeable (Typeable)
import Hakyll
import qualified Text.CSL.Input.Bibtex as B
import qualified Text.Pandoc as Pandoc
import qualified Text.Parsec as Parsec
--------------------------------------------------------------------------------
newtype BibEntry = BibEntry B.Item
deriving (Typeable)
--------------------------------------------------------------------------------
instance Binary BibEntry where
put (BibEntry t) = do
put $ B.entryType t
put $ B.identifier t
put $ B.fields t
get = BibEntry <$> (B.Item <$> get <*> get <*> get)
--------------------------------------------------------------------------------
bibEntryContext :: Context BibEntry
bibEntryContext = Context $ \key _ item ->
let BibEntry t = itemBody item
in case key of
"identifier" -> return $ StringField $ B.identifier t
_ -> case lookup key (B.fields t) of
Nothing -> empty
Just val -> return $ StringField $ latexToHtml val
where
-- Renders latex to HTML, but don't wrap everything in a <p>...
latexToHtml tex =
let p = case Pandoc.readLaTeX Pandoc.def tex of
Pandoc.Pandoc meta [Pandoc.Para para] ->
Pandoc.Pandoc meta [Pandoc.Plain para]
x -> x
in Pandoc.writeHtmlString Pandoc.def p
--------------------------------------------------------------------------------
newtype BibFile = BibFile [BibEntry]
deriving (Binary, Typeable)
--------------------------------------------------------------------------------
bibFileEntryNames :: BibFile -> [String]
bibFileEntryNames (BibFile es) = [B.identifier t | BibEntry t <- es]
--------------------------------------------------------------------------------
parseBibFile :: String -> BibFile
parseBibFile string = case Parsec.runParser (B.bibEntries <* Parsec.eof)
[] "<bib file>" string of
Left err -> error $ show err
Right xs -> BibFile $ map BibEntry (B.resolveCrossRefs True xs)
--------------------------------------------------------------------------------
lookupBibEntry :: String -> BibFile -> BibEntry
lookupBibEntry name (BibFile es) =
case [BibEntry t | BibEntry t <- es, B.identifier t == name] of
[] -> error $ name ++ " not found in BibFile"
(x : _) -> x

324
Text/CSL/Input/Bibtex.hs Normal file
View File

@ -0,0 +1,324 @@
{-# OPTIONS_GHC -fno-warn-unused-do-bind #-}
-----------------------------------------------------------------------------
-- |
-- Module : Text.CSL.Input.Bibtex
-- Copyright : (c) John MacFarlane
-- License : BSD-style (see LICENSE)
--
-- Maintainer : John MacFarlane <fiddlosopher@gmail.com>
-- Stability : unstable-- Portability : unportable
--
-- Modified : JH: Use just the bibtex parser
-----------------------------------------------------------------------------
module Text.CSL.Input.Bibtex
(
bibEntries
, resolveCrossRefs
, Item(..)
)
where
import Text.Parsec hiding (optional, (<|>), many, State)
import Control.Applicative
import Text.Pandoc
import Data.List.Split (splitOn, splitWhen, wordsBy)
import Data.List (intercalate)
import Data.Maybe
import Data.Char (toLower, isUpper, toUpper, isDigit, isAlphaNum)
import Control.Monad
import Control.Monad.RWS
import System.Environment (getEnvironment)
import Text.CSL.Style (Formatted(..), Locale(..), CslTerm(..), Agent(..))
import qualified Text.Pandoc.Walk as Walk
import qualified Text.Pandoc.UTF8 as UTF8
data Item = Item{ identifier :: String
, entryType :: String
, fields :: [(String, String)]
}
type BibParser = Parsec [Char] [(String, String)]
bibEntries :: BibParser [Item]
bibEntries = many (try (skipMany nonEntry >> bibItem)) <* skipMany nonEntry
where nonEntry = bibSkip <|> bibComment <|> bibPreamble <|> bibString
bibSkip :: BibParser ()
bibSkip = skipMany1 (satisfy (/='@'))
bibComment :: BibParser ()
bibComment = try $ do
char '@'
cistring "comment"
skipMany (satisfy (/='\n'))
bibPreamble :: BibParser ()
bibPreamble = try $ do
char '@'
cistring "preamble"
spaces
void inBraces
return ()
bibString :: BibParser ()
bibString = try $ do
char '@'
cistring "string"
spaces
char '{'
spaces
f <- entField
spaces
char '}'
updateState $ (f:)
return ()
inBraces :: BibParser String
inBraces = try $ do
char '{'
res <- manyTill
( many1 (noneOf "{}\\")
<|> (char '\\' >> ( (char '{' >> return "\\{")
<|> (char '}' >> return "\\}")
<|> return "\\"))
<|> (braced <$> inBraces)
) (char '}')
return $ concat res
braced :: String -> String
braced s = "{" ++ s ++ "}"
inQuotes :: BibParser String
inQuotes = do
char '"'
concat <$> manyTill ( many1 (noneOf "\"\\{")
<|> (char '\\' >> (\c -> ['\\',c]) <$> anyChar)
<|> braced <$> inBraces
) (char '"')
fieldName :: BibParser String
fieldName = (map toLower) <$> many1 (letter <|> digit <|> oneOf "-_")
isBibtexKeyChar :: Char -> Bool
isBibtexKeyChar c = isAlphaNum c || c `elem` ".:;?!`'()/*@_+=-[]*"
bibItem :: BibParser Item
bibItem = do
char '@'
enttype <- map toLower <$> many1 letter
spaces
char '{'
spaces
entid <- many (satisfy isBibtexKeyChar)
spaces
char ','
spaces
entfields <- entField `sepEndBy` (char ',')
spaces
char '}'
return $ Item entid enttype entfields
entField :: BibParser (String, String)
entField = try $ do
spaces
k <- fieldName
spaces
char '='
spaces
vs <- (expandString <|> inQuotes <|> inBraces <|> rawWord) `sepBy`
(try $ spaces >> char '#' >> spaces)
spaces
return (k, concat vs)
rawWord :: BibParser String
rawWord = many1 alphaNum
expandString :: BibParser String
expandString = do
k <- fieldName
strs <- getState
case lookup k strs of
Just v -> return v
Nothing -> return k -- return raw key if not found
cistring :: String -> BibParser String
cistring [] = return []
cistring (c:cs) = do
x <- (char (toLower c) <|> char (toUpper c))
xs <- cistring cs
return (x:xs)
resolveCrossRefs :: Bool -> [Item] -> [Item]
resolveCrossRefs isBibtex entries =
map (resolveCrossRef isBibtex entries) entries
splitKeys :: String -> [String]
splitKeys = wordsBy (\c -> c == ' ' || c == ',')
getXrefFields :: Bool -> Item -> [Item] -> String -> [(String, String)]
getXrefFields isBibtex baseEntry entries keys = do
let keys' = splitKeys keys
xrefEntry <- [e | e <- entries, identifier e `elem` keys']
(k, v) <- fields xrefEntry
if k == "crossref" || k == "xdata"
then do
xs <- mapM (getXrefFields isBibtex baseEntry entries)
(splitKeys v)
(x, y) <- xs
guard $ isNothing $ lookup x $ fields xrefEntry
return (x, y)
else do
k' <- if isBibtex
then return k
else transformKey (entryType xrefEntry) (entryType baseEntry) k
guard $ isNothing $ lookup k' $ fields baseEntry
return (k',v)
resolveCrossRef :: Bool -> [Item] -> Item -> Item
resolveCrossRef isBibtex entries entry = foldl go entry (fields entry)
where go entry' (key, val) =
if key == "crossref" || key == "xdata"
then entry'{ fields = fields entry' ++
getXrefFields isBibtex entry entries val }
else entry'
-- transformKey source target key
-- derived from Appendix C of bibtex manual
transformKey :: String -> String -> String -> [String]
transformKey _ _ "ids" = []
transformKey _ _ "crossref" = []
transformKey _ _ "xref" = []
transformKey _ _ "entryset" = []
transformKey _ _ "entrysubtype" = []
transformKey _ _ "execute" = []
transformKey _ _ "label" = []
transformKey _ _ "options" = []
transformKey _ _ "presort" = []
transformKey _ _ "related" = []
transformKey _ _ "relatedoptions" = []
transformKey _ _ "relatedstring" = []
transformKey _ _ "relatedtype" = []
transformKey _ _ "shorthand" = []
transformKey _ _ "shorthandintro" = []
transformKey _ _ "sortkey" = []
transformKey x y "author"
| x `elem` ["mvbook", "book"] &&
y `elem` ["inbook", "bookinbook", "suppbook"] = ["bookauthor", "author"]
-- note: this next clause is not in the biblatex manual, but it makes
-- sense in the context of CSL conversion:
transformKey x y "author"
| x == "mvbook" && y == "book" = ["bookauthor", "author"]
transformKey "mvbook" y z
| y `elem` ["book", "inbook", "bookinbook", "suppbook"] = standardTrans z
transformKey x y z
| x `elem` ["mvcollection", "mvreference"] &&
y `elem` ["collection", "reference", "incollection", "inreference",
"suppcollection"] = standardTrans z
transformKey "mvproceedings" y z
| y `elem` ["proceedings", "inproceedings"] = standardTrans z
transformKey "book" y z
| y `elem` ["inbook", "bookinbook", "suppbook"] = bookTrans z
transformKey x y z
| x `elem` ["collection", "reference"] &&
y `elem` ["incollection", "inreference", "suppcollection"] = bookTrans z
transformKey "proceedings" "inproceedings" z = bookTrans z
transformKey "periodical" y z
| y `elem` ["article", "suppperiodical"] =
case z of
"title" -> ["journaltitle"]
"subtitle" -> ["journalsubtitle"]
"shorttitle" -> []
"sorttitle" -> []
"indextitle" -> []
"indexsorttitle" -> []
_ -> [z]
transformKey _ _ x = [x]
standardTrans :: String -> [String]
standardTrans z =
case z of
"title" -> ["maintitle"]
"subtitle" -> ["mainsubtitle"]
"titleaddon" -> ["maintitleaddon"]
"shorttitle" -> []
"sorttitle" -> []
"indextitle" -> []
"indexsorttitle" -> []
_ -> [z]
bookTrans :: String -> [String]
bookTrans z =
case z of
"title" -> ["booktitle"]
"subtitle" -> ["booksubtitle"]
"titleaddon" -> ["booktitleaddon"]
"shorttitle" -> []
"sorttitle" -> []
"indextitle" -> []
"indexsorttitle" -> []
_ -> [z]
data Lang = Lang String String -- e.g. "en" "US"
langToLocale :: Lang -> String
langToLocale (Lang x y) = x ++ ('-':y)
resolveKey :: Lang -> Formatted -> Formatted
resolveKey lang (Formatted ils) = Formatted (Walk.walk go ils)
where go (Str s) = Str $ resolveKey' lang s
go x = x
resolveKey' :: Lang -> String -> String
resolveKey' (Lang "en" "US") k =
case map toLower k of
"inpreparation" -> "in preparation"
"submitted" -> "submitted"
"forthcoming" -> "forthcoming"
"inpress" -> "in press"
"prepublished" -> "pre-published"
"mathesis" -> "Masters thesis"
"phdthesis" -> "PhD thesis"
"candthesis" -> "Candidate thesis"
"techreport" -> "technical report"
"resreport" -> "research report"
"software" -> "computer software"
"datacd" -> "data CD"
"audiocd" -> "audio CD"
"patent" -> "patent"
"patentde" -> "German patent"
"patenteu" -> "European patent"
"patentfr" -> "French patent"
"patentuk" -> "British patent"
"patentus" -> "U.S. patent"
"patreq" -> "patent request"
"patreqde" -> "German patent request"
"patreqeu" -> "European patent request"
"patreqfr" -> "French patent request"
"patrequk" -> "British patent request"
"patrequs" -> "U.S. patent request"
"countryde" -> "Germany"
"countryeu" -> "European Union"
"countryep" -> "European Union"
"countryfr" -> "France"
"countryuk" -> "United Kingdom"
"countryus" -> "United States of America"
"newseries" -> "new series"
"oldseries" -> "old series"
_ -> k
resolveKey' _ k = resolveKey' (Lang "en" "US") k
parseMonth :: String -> String
parseMonth "jan" = "1"
parseMonth "feb" = "2"
parseMonth "mar" = "3"
parseMonth "apr" = "4"
parseMonth "may" = "5"
parseMonth "jun" = "6"
parseMonth "jul" = "7"
parseMonth "aug" = "8"
parseMonth "sep" = "9"
parseMonth "oct" = "10"
parseMonth "nov" = "11"
parseMonth "dec" = "12"
parseMonth x = x

613
bibs/header.bib Normal file
View File

@ -0,0 +1,613 @@
%% To do:
%% insert first names wherever possible
%% regularize POPL spellings
%% get rid of ACM Press when it appears with POPL
%% - find volume numbers of LNCS, etc.
%% - fix up "to appear"
%% - find journal versions of conference papers
%% - find published versions of TRs
%% - find spellings of first names
%% - nuke crossreferences
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% %%
%% My Bibliography (from bcp.bib) %%
%% %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Conventions:
% * Common conferences (POPL, ICFP, etc.) are defined in strings, for
% uniformity. These strings include...
% *not* "proceedings of the" or whatever (waste of ink, since
% 'symposium' or whatever is included)
% the sponsoring organization (which means that it's not
% necessary to list "ACM Press" as the publisher)
% "international symposium" or whatever
% *not* "twentieth" or whatever
% the conference name spelled out in full
% its common acronym, if any
% the location of that year's meeting, if I know it
% Some special fields:
% checked Set to "yes" or a date if the citation has been
% checked against a physical copy of the document
% fullauthor Present in some cases where the author's name appears in
% abbreviated form on the actual document, but where
% I happened to know their full name. The portion of
% the name that does not appear on the document is
% placed in square brackets, following standard
% practice in some publishing houses.
% fulleditor Similar.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% String Definitions %%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Publishing houses
% %%%%%%%%%%%%%%%%%
@STRING{ap = "Academic Press" }
@STRING{springer = {Springer-Verlag} }
@STRING{elsevier = "Elsevier" }
@STRING{entcs = "Electronic Notes in Theoretical Computer Science" }
@STRING{lncs = "Lecture Notes in Computer Science" }
@STRING{lnm = "Lecture Notes in Mathematics" }
@STRING{gtm = "Graduate Texts in Mathematics" }
@STRING{lfcs = "Laboratory for Foundations of Computer Science,
University of Edinburgh" }
@STRING{mp = "MIT Press" }
@STRING{mitpress = mp }
%
% Journals and magazines
% %%%%%%%%%%%%%%%%%%%%%%
@STRING{toplas = "ACM Transactions on Programming Languages and Systems" }
@STRING{jlp = {Journal of Logic Programming} }
@STRING{acmpress = "ACM Press" }
@STRING{cacm = "Communications of the {ACM}" }
@STRING{jacm = "Journal of the {ACM}" }
@STRING{tcs = "Theoretical Computer Science" }
@STRING{jsl = "Journal of Symbolic Logic" }
@STRING{bsl = "Bulletin of Symbolic Logic" }
@STRING{jcss = "Journal of Computer and System Sciences"}
@STRING{siamjc = "SIAM Journal on Computing" }
@STRING{mscs = "Mathematical Structures in Computer Science" }
@STRING{proc = "Proceedings of the" }
@STRING{ic = "Information and Computation" }
@STRING{iandcomp = {Information and Computation} }
@STRING{jfp = "Journal of Functional Programming" }
@STRING{cup = "Cambridge University Press" }
@STRING{mcgh = "McGraw-Hill" }
@STRING{nh = "North Holland" }
@STRING{sv = "Springer-Verlag" }
@STRING{aw = "Addison-Wesley" }
@STRING{ph = "Prentice Hall" }
@STRING{tose = "IEEE Transactions on Software Engineering" }
%@STRING{taoop = "C[arl] A. Gunter and J[ohn] C. Mitchell, editors, {\em
% Theoretical Aspects of Object-Oriented Programming:
% Types, Semantics, and Language Design}, MIT Press, 1994" }
@STRING{taoop = "C. A. Gunter and J. C. Mitchell, editors, {\em
Theoretical Aspects of Object-Oriented Programming:
Types, Semantics, and Language Design}, MIT Press, 1994" }
@STRING{tissec = "ACM Transactions on Information and System Security"}
@STRING{sigecom = "ACM {SIG}ecom {E}xchanges"}
@STRING{jet = "Journal of Economic Theory"}
@STRING{geb = "Games and Economic Behavior"}
@STRING{jufks = "{I}nternational {J}ournal of {U}ncertainty, {F}uzziness and
{K}nowledge-{B}ased {S}ystems"}
@STRING{toc = "Theory of Computing"}
@STRING{jmlr = "Journal of Machine Learning Research"}
@STRING{jpc = "Journal of Privacy and Confidentiality"}
@STRING{mor = "Mathematics of Operations Research"}
%
% Misc
% %%%%
@STRING{yes = "Yes" }
@STRING{no = "No" }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Conferences %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@STRING{pods = "{ACM} {SIGACT--SIGMOD--SIGART} {S}ymposium on
{P}rinciples of {D}atabase {S}ystems (PODS)"}
@STRING{pods03 = pods # ", San Diego, California"}
@STRING{pods05 = pods # ", Baltimore, Maryland"}
@STRING{pods06 = pods # ", Chicago, Illinois" }
@STRING{pods07 = pods # ", Beijing, China" }
@STRING{pods10 = pods # ", Indianapolis, Indiana" }
@STRING{popl = "{ACM} {SIGPLAN--SIGACT} {S}ymposium on {P}rinciples of
{P}rogramming {L}anguages ({POPL})" }
@STRING{poplpre92 = "{ACM} {S}ymposium on {P}rinciples of {P}rogramming
{L}anguages ({POPL})" }
@STRING{popl73 = poplpre92 # ", Boston, Massachusetts" }
@STRING{popl75 = poplpre92 # ", Palo Alto, California" }
@STRING{popl76 = poplpre92 # ", {A}tlanta, {G}eorgia" }
@STRING{popl77 = poplpre92 # ", Los Angeles, California" }
@STRING{popl78 = poplpre92 # ", Tucson, Arizona" }
@STRING{popl79 = poplpre92 # ", San Antonio, Texas" }
@STRING{popl80 = poplpre92 # ", Las Vegas, Nevada" }
@STRING{popl81 = poplpre92 # ", Williamsburg, Virginia" }
@STRING{popl82 = poplpre92 # ", Albuquerque, New Mexico" }
@STRING{popl83 = poplpre92 # ", Austin, Texas" }
@STRING{popl84 = poplpre92 # ", Salt Lake City, Utah" }
@STRING{popl85 = poplpre92 # ", New Orleans, Louisiana" }
@STRING{popl86 = poplpre92 # ", St.\ Petersburg Beach, Florida" }
@STRING{popl87 = poplpre92 # ", Munich, Germany" }
@STRING{popl88 = poplpre92 # ", San Diego, California" }
@STRING{popl89 = poplpre92 # ", Austin, Texas" }
@STRING{popl90 = poplpre92 # ", {S}an {F}rancisco, {C}alifornia" }
@STRING{popl91 = poplpre92 # ", Orlando, Florida" }
@STRING{popl92 = popl # ", Albuquerque, New Mexico" }
@STRING{popl93 = popl # ", Charleston, South Carolina" }
@STRING{popl94 = popl # ", {P}ortland, {O}regon" }
@STRING{popl95 = popl # ", San Francisco, California" }
@STRING{popl96 = popl # ", St.~Petersburg Beach, Florida" }
@STRING{popl97 = popl # ", Paris, France" }
@STRING{popl98 = popl # ", San Diego, California" }
@STRING{popl99 = popl # ", San Antonio, Texas" }
@STRING{popl00 = popl # ", Boston, Massachusetts" }
@STRING{popl01 = popl # ", London, England" }
@STRING{popl02 = popl # ", Portland, Oregon" }
@STRING{popl03 = popl # ", New Orleans, Louisiana" }
@STRING{popl04 = popl # ", Venice, Italy" }
@STRING{popl05 = popl # ", Long Beach, California" }
@STRING{popl08 = popl # ", San Francisco, California" }
@STRING{popl09 = popl # ", Savannah, Georgia" }
@STRING{popl10 = popl # ", Madrid, Spain" }
@STRING{popl11 = popl # ", Austin, Texas" }
@STRING{popl12 = popl # ", Philadelphia, Pennsylvania" }
@STRING{popl13 = popl # ", Rome, Italy" }
@STRING{popl14 = popl # ", San Diego, California" }
@STRING{popl15 = popl # ", Mumbai, India" }
% ----
@STRING{icfp = "{ACM} {SIGPLAN} {I}nternational {C}onference on
{F}unctional {P}rogramming ({ICFP})" }
@STRING{icfp14 = icfp # ", Gothenburg, Sweden" }
@STRING{icfp13 = icfp # ", Boston, Massachusetts" }
@STRING{icfp11 = icfp # ", Tokyo, Japan" }
@STRING{icfp10 = icfp # ", Baltimore, Maryland" }
@STRING{icfp08 = icfp # ", Victoria, British Colombia" }
@STRING{icfp05 = icfp # ", Tallinn, Estonia" }
@STRING{icfp04 = icfp # ", Snowbird, Utah" }
@STRING{icfp03 = icfp # ", Uppsala, Sweden" }
@STRING{icfp02 = icfp # ", Pittsburgh, Pennsylvania" }
@STRING{icfp01 = icfp # ", Firenze, Italy" }
@STRING{icfp00 = icfp # ", Montr{\'e}al, Qu{\'e}bec" }
@STRING{icfp99 = icfp # ", Paris, France" }
@STRING{icfp98 = icfp # ", Baltimore, Maryland" }
@STRING{icfp97 = icfp # ", Amsterdam, The Netherlands" }
@STRING{icfp96 = icfp # ", Philadelphia, Pennsylvania" }
% ----
@STRING{oopsla = "{ACM} {SIGPLAN} {C}onference on {O}bject {O}riented
{P}rogramming: {S}ystems, {L}anguages, and {A}pplications ({OOPSLA})" }
@STRING{oopslapre96 = "{C}onference on {O}bject {O}riented {P}rogramming:
{S}ystems, {L}anguages, and {A}pplications ({OOPSLA})" }
@STRING{dbpl = {Database Programming Languages (DBPL)}}
@STRING{dbpl05 = dbpl}
@STRING{disc = {International Symposium on Distributed Computing (DISC)}}
@STRING{disc06 = disc}
@STRING{ecoop = {European Conference on Object-Oriented Programming (ECOOP)} }
@STRING{ecoop92 = ecoop}
@STRING{ecoop95 = ecoop}
@STRING{ecoop98 = ecoop}
@STRING{ecoop06 = ecoop # ", Nantes, France"}
@STRING{oopsla86 = oopslapre96 # ", Portland, Oregon" }
@STRING{oopsla89 = oopslapre96 # ", New Orleans, Louisiana"}
@STRING{oopsla90 = oopslapre96 # "/" # ecoop # ", Ottawa, Ontario" }
@STRING{oopsla98 = oopsla # ", Vancouver, British Columbia" }
@STRING{oopsla03 = oopsla # ", Anaheim, California" }
% ----
@STRING{lics = "{IEEE} {S}ymposium on {L}ogic in {C}omputer {S}cience ({LICS})" }
@STRING{lics86 = lics # ", Cambridge, Massachusetts" }
@STRING{lics87 = lics # ", Ithaca, New York" }
@STRING{lics88 = lics # ", Edinburgh, Scotland" }
@STRING{lics89 = lics # ", Asilomar, California" }
@STRING{lics90 = lics # ", Philadelphia, Pennsylvania" }
@STRING{lics91 = lics # ", Amsterdam, The Netherlands" }
@STRING{lics92 = lics # ", Santa Cruz, California" }
@STRING{lics93 = lics # ", Montr{\'e}al, Qu{\'e}bec" }
@STRING{lics94 = lics # ", Paris, France" }
@STRING{lics95 = lics # ", San Diego, California" }
@STRING{lics96 = lics # ", New Brunswick, New Jersey" }
@STRING{lics97 = lics # ", Warsaw, Poland" }
@STRING{lics98 = lics # ", Indianapolis, Indiana" }
@STRING{lics99 = lics # ", Trento, Italy" }
@STRING{lics00 = lics # ", Santa Barbara, California" }
@STRING{lics01 = lics # ", Boston, Massachusetts" }
@STRING{lics02 = lics # ", Copenhagen, Denmark" }
@STRING{lics03 = lics # ", Ottawa, Ontario" }
@STRING{lics11 = lics # ", Toronto, Ontario" }
% ----
@STRING{pldi = "{ACM SIGPLAN Conference on Programming Language Design
and Implementation (PLDI)}" }
@STRING{pldi88 = pldi # ", {A}tlanta, {G}eorgia" }
@STRING{pldi89 = pldi # ", Portland, Oregon" }
@STRING{pldi90 = pldi # ", White Plains, New York" }
@STRING{pldi91 = pldi # ", Toronto, Ontario" }
@STRING{pldi92 = pldi # ", San Francisco, California" }
@STRING{pldi93 = pldi # ", Albuquerque, New Mexico" }
@STRING{pldi94 = pldi # ", Orlando, Florida" }
@STRING{pldi95 = pldi # ", La Jolla, California" }
@STRING{pldi96 = pldi # ", Philadephia, Pennsylvania" }
@STRING{pldi97 = pldi # ", Las Vegas, Nevada" }
@STRING{pldi98 = pldi # ", Montr{\'e}al, Qu{\'e}bec" }
@STRING{pldi99 = pldi # ", {A}tlanta, {G}eorgia" }
@STRING{pldi00 = pldi # ", Vancouver, British Columbia" }
@STRING{pldi01 = pldi # ", Snowbird, Utah" }
@STRING{pldi02 = pldi # ", Berlin, Germany" }
@STRING{pldi03 = pldi # ", San Diego, California" }
@STRING{pldi08 = pldi # ", Tucson, Arizona" }
% ----
@STRING{lfp = "ACM Symposium on Lisp and Functional Programming (LFP)" }
@STRING{lfp80 = lfp # ", Stanford, California" }
@STRING{lfp84 = lfp # ", Austin, Texas" }
@STRING{lfp86 = lfp # ", Cambridge, Massachusetts" }
@STRING{lfp88 = lfp # ", Snowbird, Utah" }
@STRING{lfp90 = lfp }
@STRING{lfp92 = lfp # ", San Francisco, California"}
@STRING{lfp94 = lfp # ", Orlando, Florida" }
% ----
@STRING{fpca = "ACM Symposium on Functional Programming Languages and
Computer Architecture (FPCA)" }
@STRING{fpca87 = fpca # ", Portland, Oregon" }
@STRING{fpca89 = fpca # ", London, England" }
@STRING{fpca93 = fpca # ", Copenhagen, Denmark"}
@STRING{fpca95 = fpca # ", San Diego, California" }
% ----
@STRING{ec = "{ACM} {SIGecom} {C}onference on {E}conomics and
{C}omputation (EC)" }
@STRING{ec13 = ec # ", Philadelphia, Pennsylvania"}
@STRING{ec14 = ec # ", Palo Alto, California"}
% ----
@STRING{ics = "{S}ymposium on {I}nnovations in {C}ompuer {S}cience"}
@STRING{itcs = "{ACM} {SIGACT} {I}nnovations in {T}heoretical {C}omputer
{S}cience (ITCS)"}
@STRING{itcs10 = ics # ", Beijing, China"}
@STRING{itcs12 = itcs # ", Cambridge, Massachusetts"}
@STRING{itcs13 = itcs # ", Berkeley, California"}
@STRING{itcs14 = itcs # ", Princeton, New Jersey"}
% ----
@STRING{stoc = "{ACM} {SIGACT} {S}ymposium on {T}heory of {C}omputing (STOC)"}
@STRING{stoc87 = stoc # ", New York, New York"}
@STRING{stoc89 = stoc # ", Seattle, Washington"}
@STRING{stoc99 = stoc # ", Atlanta, Georgia"}
@STRING{stoc04 = stoc # ", Chicago, Illinois"}
@STRING{stoc05 = stoc # ", Baltimore, Maryland"}
@STRING{stoc06 = stoc # ", Seattle, Washington"}
@STRING{stoc07 = stoc # ", San Diego, California"}
@STRING{stoc08 = stoc # ", Victoria, British Colombia"}
@STRING{stoc09 = stoc # ", Bethesda, Maryland"}
@STRING{stoc10 = stoc # ", Cambridge, Massachusetts"}
@STRING{stoc11 = stoc # ", San Jose, California"}
@STRING{stoc12 = stoc # ", New York, New York"}
@STRING{stoc13 = stoc # ", Palo Alto, California"}
@STRING{stoc14 = stoc # ", New York, New York"}
% ----
@STRING{focs = "{IEEE} {S}ymposium on {F}oundations of {C}omputer {S}cience (FOCS)"}
@STRING{focs82 = focs # ", Chicago, Illinois"}
@STRING{focs07 = focs # ", Providence, Rhode Island"}
@STRING{focs09 = focs # ", Atlanta, Georgia"}
@STRING{focs10 = focs # ", Las Vegas, Nevada"}
@STRING{focs12 = focs # ", New Brunswick, New Jersey"}
@STRING{focs13 = focs # ", Berkeley, California"}
@STRING{focs14 = focs # ", Philadelphia, Pennsylvania"}
% ----
@STRING{socg = "{SIGACT} -- {SIGGRAPH} {S}ymposium on {C}omputational
{G}eometry (SOCG)"}
@STRING{socg14 = socg # ", Kyoto, Japan"}
% ----
@STRING{soda = "{ACM--SIAM} {S}ymposium on {D}iscrete {A}lgorithms (SODA)"}
@STRING{soda10 = soda # ", Austin, Texas"}
@STRING{soda12 = soda # ", Kyoto, Japan"}
@STRING{soda14 = soda # ", Portland, Oregon"}
% ----
@STRING{tcc = "{IACR} {T}heory of {C}ryptography {C}onference (TCC)"}
@STRING{tcc06 = tcc # ", New York, New York"}
@STRING{tcc11 = tcc # ", Providence, Rhode Island"}
@STRING{tcc12 = tcc # ", Taormina, Italy"}
% ----
@STRING{kdd = "{ACM} {SIGKDD} {C}onference on {K}nowledge {D}iscovery
and {D}ata {M}ining (KDD)"}
@STRING{kdd02 = kdd # ", Edmonton, Alberta"}
@STRING{kdd08 = kdd # ", Las Vegas, Nevada"}
@STRING{kdd09 = kdd # ", Paris, France"}
@STRING{kdd10 = kdd # ", Washington, DC"}
% ----
@STRING{nips = "{C}onference on {N}eural {I}nformation {P}rocessing
{S}ystems (NIPS)"}
@STRING{nips08 = nips # ", Vancouver, British Colombia" }
@STRING{nips12 = nips # ", Lake Tahoe, California" }
@STRING{nips13 = nips # ", Lake Tahoe, California" }
% ----
@STRING{icml = "{I}nternational {C}onference on {M}achine {L}earning (ICML)" }
@STRING{icml03 = icml # ", Washington, DC" }
@STRING{icml14 = icml # ", Beijing, China" }
% ----
@STRING{sp = "{IEEE} {S}ymposium on {S}ecurity and {P}rivacy (S\&P)"}
@STRING{sp08 = sp # ", Oakland, California"}
@STRING{sp09 = sp # ", Oakland, California"}
@STRING{sp14 = sp # ", Oakland, California"}
@STRING{oakland = sp}
% ----
@STRING{icde = "{IEEE} {I}nternational {C}onference on {D}ata
{E}ngineering (ICDE)"}
@STRING{icde06 = icde # ", Atlanta, Georgia" }
@STRING{icde07 = icde # ", Istanbul, Turkey" }
@STRING{icde13 = icde # ", Brisbane, Australia" }
% ----
@STRING{vldb = "{I}nternational {C}onference on {V}ery {L}arge {D}ata
{B}ases (VLDB)"}
@STRING{vldb12 = vldb # ", Istanbul, Turkey"}
% ----
@STRING{icc = "{IEEE} {I}nternational {C}onference on {C}ommunications
(ICC)"}
@STRING{icc11 = icc # ", Kyoto, Japan"}
% ----
@STRING{sigmod = "{ACM} {SIGMOD} {I}nternational {C}onference on
{M}anagement of {D}ata (SIGMOD)"}
@STRING{sigmod09 = sigmod # ", Providence, Rhode Island"}
@STRING{sigmod10 = sigmod # ", Indianapolis, Indiana"}
@STRING{sigmod14 = sigmod # ", Snowbird, Utah"}
% ----
@STRING{tamc = "Theory and Applications of Models of Computation
({TAMC})" }
@STRING{tamc08 = tamc # ", Xi'an, China" }
% ----
@STRING{nsdi = "{USENIX} {S}ymposium on {N}etworked {S}ystems {D}esign
and {I}mplementation (NDSI)"}
@STRING{nsdi10 = nsdi # ", San Jose, California"}
@STRING{nsdi12 = nsdi # ", San Jose, California"}
% ----
@STRING{eucrypt = "{IACR} {I}nternational {C}onference on the {T}heory and
{A}pplications of {C}ryptographic {T}echniques (EUROCRYPT)"}
@STRING{eucrypt06 = eucrypt # ", Saint Petersburg, Russia"}
@STRING{eucrypt13 = eucrypt # ", Athens, Greece"}
% ----
@STRING{vmcai = "{I}nternational {C}onference on {V}erification, {M}odel
{C}hecking, and {A}bstract {I}nterpretation ({VMCAI})" }
@STRING{vmcai07 = vmcai # ", Nice, France" }
@STRING{vmcai13 = vmcai # ", Rome, Italy" }
% ----
@STRING{csf = "{IEEE} {C}omputer {S}ecurity {F}oundations {S}ymposium" }
@STRING{csf08 = csf # ", Pittsburgh, Pennsylvania" }
@STRING{csf13 = csf # ", New Orleans, Louisiana" }
@STRING{csf14 = csf # ", Vienna, Austria" }
% ----
@STRING{pepmpre12 = "{S}ymposium on {P}artial {E}valuation and
{S}emantics-{B}ased {P}rogram {M}anipulation ({PEPM})" }
@STRING{pepm91 = pepmpre12 # ", New Haven, Connecticut" }
% ----
% workshops with informal proceedings only
% ----
@STRING{informal = "{, informal proceedings}"}
@STRING{fool = {International Workshop on Foundations of Object-Oriented
Languages (FOOL)} # informal }
@STRING{haskellw = {ACM Haskell Workshop} # informal }
@STRING{mlw = {ACM SIGPLAN Workshop on ML} # informal }
@STRING{space = {Workshop on Semantics, Program Analysis and Computing
Environments for Memory Management (SPACE)} # informal }
@STRING{tpa = {Workshop on Types for Program Analysis (TPA)} # informal }
@STRING{fopara = {International Workshop on Foundational and Practical
Aspects of Resource Analysis (FOPARA)} # informal}
% ----
% meetings with proceedings:
% ---
@STRING{aplas = {Asian Symposium on Programming Languages and Systems (APLAS)} }
@STRING{asplos = {International Conference on Architectural Support for
Programming Langauages and Operating Systems (ASPLOS)} }
@STRING{cav = {International Conference on Computer Aided Verification (CAV)} }
@STRING{ceemas = {International Central and Eastern European Conference on
Multi-Agent Systems} }
@STRING{colt = {{C}onference on {C}omputational {L}earning {T}heory
({CoLT})}}
@STRING{concur = {International Conference on Concurrency Theory (CONCUR)} }
@STRING{csl = {International Workshop on Computer Science Logic (CSL)} }
@STRING{csfw = {IEEE Computer Security Foundations Workshop (CSFW) } }
@STRING{ecoop = {European Conference on Object-Oriented Programming (ECOOP)} }
@STRING{esop = {European Symposium on Programming (ESOP)} }
@STRING{fesca = {International Workshop on Formal Engineering approaches to
Software Components and Architectures (FESCA)} }
@STRING{flops = {International Symposium on Functional and Logic Programming
(FLOPS)} }
@STRING{fmco = {International Symposia on Formal Methods for Components and
Objects (FMCO)} }
@STRING{fsttcs = {Foundations of Software Technology and Theoretical Computer
Science (FSTTCS)} }
@STRING{hoots = {Workshop on Higher Order Operational Techniques in
Semantics (HOOTS)} }
@STRING{icalp = {International Colloquium on Automata, Languages and
Programming (ICALP)} }
@STRING{icse = {International Conference on Software Engineering (ICSE)} }
@STRING{lfcompsci = {International Symposium on Logical Foundations of Computer
Science (LFCS)} }
@STRING{mfps = {Workshop on the Mathematical Foundations of Programming
Semantics (MFPS)} }
@STRING{osdi = {USENIX Symposium on Operating Systems Design and
Implementation (OSDI)} }
@STRING{paste = {ACM SIGPLAN--SIGSOFT Workshop on Program Analysis for
Software Tools and Engineering (PASTE)} }
@STRING{ppdp = {ACM SIGPLAN International Conference on Principles and
Practice of Declarative Programming (PPDP)} }
@STRING{randapx = {Workshop on Approximation Algorithms for Combinatorial
Optimization Problems (APPROX) and Workshop on Randomization
and Computation (RANDOM) } }
@STRING{rta = {International Conference on Rewriting Techniques and
Applications (RTA)} }
@STRING{sas = {International Symposium on Static Analysis (SAS) } }
@STRING{sosp = {ACM Symposium on Operating Systems Principles (SOSP)} }
@STRING{tacs = {International Symposium on Theoretical Aspects of Computer
Software (TACS)} }
@STRING{tacas = {International Conference on Tools and Algorithms for the
Construction and Analysis of Systems (TACAS)} }
@STRING{tapsoft = {Theory and Practice of Software Development (TAPSOFT)} }
@STRING{tic = {ACM SIGPLAN Workshop on Types in Compilation ({TIC})} }
@STRING{tlca = {International Conference on Typed Lambda Calculi and
Applications (TLCA)} }
@STRING{tldi = {ACM SIGPLAN Workshop on Types in Language Design and
Implementation (TLDI)} }
@STRING{tphol = {International Conference on Theorem Proving in Higher Order
Logics } }
@STRING{types = {International Workshop on Types for Proofs and Programs
(TYPES)} }
@STRING{webdb = {International Workshop on the Web and Databases (WebDB)} }
@STRING{wosn = {Workshop on Online Social Networks (WOSN)} }
@STRING{xsym = {Database and XML Technologies: International XML Database
Symposium (XSym)} }
@STRING{wsa = {Workshop on Static Analysis (WSA) } }
% ----
% Specific meetings, with locations:
% ---
@STRING{aplas03 = aplas # ", Beijing, China" }
@STRING{aplas05 = aplas # ", Tsukuba, Japan" }
@STRING{aplas10 = aplas # ", Shanghai, China" }
%----
@STRING{asplos14 = aplas # ", Salt Lake City, Utah" }
%----
@STRING{ceemas07 = ceemas # ", Leipzig, Germany" }
% ---
@STRING{colt95 = colt # ", Santa Cruz, California" }
@STRING{colt96 = colt # ", Desenzano sul Garda, Italy" }
@STRING{colt13 = colt # ", Princeton, New Jersey" }
% ---
@STRING{concur07 = concur # ", Lisbon, Portugal" }
% ---
@STRING{cav96 = cav # ", New Brunswick, New Jersey" }
@STRING{cav02 = cav # ", Copenhagen, Denmark" }
@STRING{cav07 = cav # ", Berlin, Germany" }
% ---
@STRING{csl94 = csl # ", Kazimierz, Poland" }
@STRING{csl97 = csl # ", Aarhus, Denmark" }
@STRING{csl01 = csl # ", Paris, France" }
% ---
@STRING{csfw02 = csfw # ", Cape Breton, Nova Scotia" }
% ---
@STRING{ecoop90 = oopsla # "/" # ecoop # ", Ottawa, Ontario" }
@STRING{ecoop97 = ecoop # ", Jyv{\"a}skyl{\"a}, Finland" }
@STRING{ecoop99 = ecoop # ", Lisbon, Portugal" }
@STRING{ecoop00 = ecoop # ", Sophia Antipolis and Cannes, France" }
@STRING{ecoop02 = ecoop # ", Malaga, Spain" }
@STRING{ecoop03 = ecoop # ", Darmstadt, Germany" }
@STRING{ecoop04 = ecoop # ", Oslo, Norway" }
% ---
@STRING{esop88 = esop # ", Nancy, France" }
@STRING{esop92 = esop # ", Rennes, France" }
@STRING{esop94 = esop # ", Edinburgh, Scotland" }
@STRING{esop00 = esop # ", Berlin, Germany" }
@STRING{esop01 = esop # ", Genova, Italy" }
@STRING{esop02 = esop # ", Grenoble, France" }
@STRING{esop09 = esop # ", York, England" }
@STRING{esop11 = esop # ", Saarbr{\"u}cken, Germany" }
@STRING{esop14 = esop # ", Grenoble, France" }
% ---
@STRING{fesca14 = fesca # ", Grenoble, France" }
% ---
@STRING{flops04 = flops # ", Nara, Japan" }
% ---
@STRING{fmco06 = fmco # ", Amsterdam, The Netherlands" }
% ---
@STRING{fsttcs93 = fsttcs # ", Bombay, India" }
@STRING{fsttcs04 = fsttcs # ", Chennai, India" }
% ---
@STRING{hoots00 = hoots # ", Montr{\'e}al, Qu{\'e}bec" }
% ---
@STRING{icalp98 = icalp # ", Aalborg, Denmark" }
@STRING{icalp06 = icalp # ", Venice, Italy" }
@STRING{icalp12 = icalp # ", Warwick, England" }
@STRING{icalp13 = icalp # ", Riga, Latvia" }
@STRING{icalp14 = icalp # ", Copenhagen, Denmark" }
% ---
@STRING{icse14 = icse # ", Hyderabad, India" }
% ---
@STRING{lfcompsci94 = lfcompsci # ", St. Petersburg, Russia" }
% ---
@STRING{mfps89 = mfps # ", New Orleans, Louisiana" }
@STRING{mfps95 = mfps # ", New Orleans, Louisiana" }
@STRING{mfps01 = mfps # ", Aarhus, Denmark" }
@STRING{mfps14 = mfps # ", Ithaca, New York" }
% ---
@STRING{osdi96 = osdi # ", Seattle, Washington" }
@STRING{osdi00 = osdi # ", San Diego, California" }
@STRING{osdi12 = osdi # ", Hollywood, California" }
% ---
@STRING{paste01 = paste # ", Snowbird, Utah" }
% ---
@STRING{ppdp99 = ppdp # ", Paris France" }
@STRING{ppdp01 = ppdp # ", Firenze, Italy" }
@STRING{ppdp12 = ppdp # ", Leuven, Belgium" }
% ---
@STRING{rta03 = rta # ", Valencia, Spain" }
% ---
@STRING{randapx13 = randapx # ", Berkeley, California" }
% ---
@STRING{sas95 = sas # ", Glasgow, Scotland" }
@STRING{sas96 = sas # ", Aachen, Germany" }
@STRING{sas97 = sas # ", Paris, France" }
@STRING{sas01 = sas # ", Paris, France" }
% ---
@STRING{sosp93 = sosp # ", Asheville, North Carolina" }
% ---
@STRING{tacs94 = tacs # ", Sendai, Japan" }
@STRING{tacs01 = tacs # ", Sendai, Japan" }
% ---
@STRING{tacas06 = tacas # ", Vienna, Austria" }
% ---
@STRING{tapsoft93 = tapsoft # ", Orsay, France" }
@STRING{tapsoft97 = tapsoft # ", Lille, France" }
% ---
@STRING{tic97 = tic # ", Amsterdam, The Netherlands"}
@STRING{tic98 = tic # ", Kyoto, Japan"}
@STRING{tic00 = tic # ", Montr{\'e}al, Qu{\'e}bec" }
% ---
@STRING{tlca93 = tlca # ", Utrecht, The Netherlands" }
@STRING{tlca97 = tlca # ", Nancy, France" }
@STRING{tlca99 = tlca # ", L'Aquila, Italy" }
@STRING{tlca01 = tlca # ", Krak{\'{o}}ow, Poland" }
@STRING{tlca03 = tlca # ", Valencia, Spain" }
% ---
@STRING{tldi03 = tldi # ", New Orleans, Louisiana"}
% ---
@STRING{tphol09 = tphol # ", Munich, Germany" }
% ---
@STRING{types93 = types # ", Nijmegen, The Netherlands" }
@STRING{types98 = types # ", Kloster Irsee, Germany" }
% ---
@STRING{wosn12 = wosn # ", Helsinki, Finland" }
% ---
@STRING{wsa93 = wsa # ", Padova, Italy" }
% hack to alphabetize funny names (from the LaTeX Companion)
@preamble{"\newcommand{\SortNoop}[1]{}"}

2033
bibs/myrefs.bib Normal file

File diff suppressed because it is too large Load Diff

11
content/body.md Normal file
View File

@ -0,0 +1,11 @@
# About Me # {#card}
...
# Research Interests # {#card}
...
# Publications # {#card}
\$draft\$
\$confs\$

3
content/contacts.md Normal file
View File

@ -0,0 +1,3 @@
# Contacts # {#contacts}
* Office: GRW 561
* Email: justin@justinh.su

99
css/style.scss Normal file
View File

@ -0,0 +1,99 @@
@import "compass/css3";
@import "compass/css3/border-radius";
@import "compass/typography/vertical_rhythm";
$base-font-size: 16px;
$base-line-height: 24px;
@include establish-baseline;
.container {
@include display-flex;
@include flex-direction(column);
@include flex-wrap(nowrap);
@include justify-content(flex-start);
@include align-items(center);
}
.container > * {
width: 50%;
padding: rhythm(0.5);
margin: rhythm(0.5);
}
.container h1 {
@include adjust-font-size-to(3em);
}
.container h2 {
@include adjust-font-size-to(2em);
}
.container p {
@include adjust-font-size-to(1em);
}
.header {
background: purple;
@include border-radius(5px, 5px);
// @include border-radius(10px 25px, 15px 30px);
// @include border-radius(1px 3px 5px 7px, 2px 4px 6px 8px);
}
.header h1 {
@include adjust-font-size-to(5em);
}
.topbox {
@include display-flex;
@include flex-direction(row);
@include flex-wrap(nowrap);
@include justify-content(space-around);
@include align-items(stretch);
background: blue;
max-height: 30em;
}
.topbox > * {
padding: rhythm(0.5);
margin: rhythm(0.5);
}
@media all and (max-width: 700px) {
.topbox {
@include flex-direction(column);
background: yellow;
}
.topbox > * {
padding: rhythm(0.5);
margin: rhythm(0.5);
}
}
.picture {
@include flex(1 1 10em);
background: green;
@include order(2);
}
.contact {
@include flex(1 1 10em);
background: red;
@include order(3);
}
@media all and (max-width: 700px) {
.picture {
@include order(3);
}
.contact {
@include order(2);
}
}
#card {
background: blue;
}

11
index.html Normal file
View File

@ -0,0 +1,11 @@
<div class="topbox">
<div class="picture">
picture
</div>
<div class="contact">
$contacts$
</div>
</div>
$content$

116
site.hs Normal file
View File

@ -0,0 +1,116 @@
--------------------------------------------------------------------------------
{-# LANGUAGE OverloadedStrings #-}
import Data.Monoid
import Control.Monad (forM_)
import Hakyll
import HakyllBibTex
import System.Process
import Text.Pandoc.Options
compass :: Compiler (Item String)
compass =
getResourceString >>=
withItemBody (unixFilter "sass" ["-s", "--scss", "--compass"])
b2bflags :: [String]
b2bflags = [ "--expand"
, "-c"
, "jh:'yes'"
, "-s"
, "$date"
, "-r"
]
bibHeaders :: [(String, String, [String])]
bibHeaders = [ ("confs", "Conference Publications",
["-c", "$type='INPROCEEDINGS'" ] )
, ("draft", "Drafts" ,
[ "-c", "$type='UNPUBLISHED'" ] )
]
bibSources :: [String]
bibSources = [ "bibs/header.bib"
, "bibs/myrefs.bib"
]
bib2bib :: [String]
-> Compiler (Item String)
bib2bib flags = (unsafeCompiler $
readProcess "bib2bib" (bibSources ++ b2bflags ++ flags) "")
>>= makeItem
bib2bibParse :: Item String
-> Compiler [Item BibEntry]
bib2bibParse file =
let (BibFile bf) = parseBibFile (itemBody file) in
sequence $ fmap makeItem bf
--------------------------------------------------------------------------------
main :: IO ()
main = hakyll $ do
match "files/**" $ do
route idRoute
compile copyFileCompiler
match "css/*.scss" $ do
route $ setExtension "css"
compile $ compass
forM_ bibHeaders $ \(nick, title, flags) ->
create [fromCapture "bibs/*.html" nick] $ do
route idRoute
compile $
let itemCtx = mconcat
[ bibEntryContext
, functionField "doclink"
(\(i:_) _ -> return $ "files/docs/" ++ i ++ "paper.pdf")
, functionField "slidelink"
(\(i:_) _ -> return $ "files/slides/" ++ i ++ "slides.pdf")
, functionField "posterlink"
(\(i:_) _ -> return $ "files/poster/" ++ i ++ "poster.pdf")
]
biblioCtx = mconcat
[ field "bibtitle" (\_ -> return $ title)
, field "bibitems" $ return . itemBody
] in do
bibTpl <- loadBody "templates/bibitemtpl.html"
(bib2bib flags)
>>= bib2bibParse
>>= applyTemplateList bibTpl itemCtx
>>= makeItem
>>= loadAndApplyTemplate
"templates/biblisttpl.html" biblioCtx
>>= relativizeUrls
match "content/body.md" $ do
route $ setExtension "html"
compile $ do
let makeBibCtx (nick, _, _) =
field nick (\_ -> loadBody $ fromFilePath ("bibs/" ++ nick ++ ".html"))
secDiv = defaultHakyllWriterOptions { writerSectionDivs = True }
bodyCtx = mconcat $ map makeBibCtx bibHeaders in do
pandocCompilerWith defaultHakyllReaderOptions secDiv
>>= applyAsTemplate bodyCtx
>>= relativizeUrls
match "content/*.md" $ do
route $ setExtension "html"
compile $ do
pandocCompiler >>= relativizeUrls
match "index.html" $ do
route idRoute
compile $ do
contacts <- loadBody "content/contacts.md"
content <- loadBody "content/body.md"
let indexContext = mconcat
[ field "contacts" $ \_ -> return contacts
, field "content" $ \_ -> return content
]
getResourceBody
>>= applyAsTemplate indexContext
>>= loadAndApplyTemplate "templates/main.html" defaultContext
>>= relativizeUrls
match "templates/*" $ compile templateCompiler

21
templates/bibitemtpl.html Normal file
View File

@ -0,0 +1,21 @@
<li>
<!-- $identifier$ -->
$title$ </br>
$author$ </br>
$if(eprint)$
[<a href="$eprint$">Arxiv</a>]
$endif$
$if(docs)$
[<a href="$doclink(identifier)$">Paper</a>]
$endif$
$if(slides)$
[<a href="$slidelink(identifier)$">Slides</a>]
$endif$
$if(poster)$
[<a href="$posterlink(identifier)$">Poster</a>]
$endif$
<br>
$if(notes)$
$notes$ <br>
$endif$
</li>

View File

@ -0,0 +1,4 @@
<h2> $bibtitle$ </h2>
<ul>
$bibitems$
</ul>

18
templates/main.html Normal file
View File

@ -0,0 +1,18 @@
<meta charset=utf-8>
<html>
<head>
<title> My Site </title>
<link rel="stylesheet" type="text/css" href="css/style.css">
</head>
<body>
<div class="container">
<div class="header">
<h1> Justin Hsu </h1>
</div>
$body$
</div>
</body>
</html>