1
0
Fork 0

Starting the entire site over from scratch, handwritten.

master
James T. Martin 2019-02-26 19:53:49 -08:00
parent 0bc3bed3fd
commit b77a6fb35a
56 changed files with 353 additions and 565 deletions

3
.gitmodules vendored
View File

@ -1,3 +0,0 @@
[submodule "templates/html-generator"]
path = templates/html-generator
url = https://github.com/lijerom/html-generator

View File

@ -1,80 +1,3 @@
# jtmar.me
This repo contains the entirety of my website, https://jtmar.me.
It is posed in hopes that other people may find my build system useful.
In addiition, it gives an easy mechanism to submit corrections
to the content itself, such as fixing typos or minor details.
Hypothetically, it is even possible community-contributed content
might one day be submitted.
## Repository Layout
* `/templates/html-generator/` is a git submodule pointing to https://github.com/lijerom/html-generator
and will continue to do so until `html-generator` is released on Hackage,
if it ever is.
* `/templates/` contains all of the page templates and site-specific
generic content, and is imported by most pages on this site.
* `/res/` includes static resources, such as images, css, and javascript
* `/*.sh` are some buildscripts used for building the site
* The rest of this repository is the root directory of the site.
## Building
This site clearly isn't made for redistribution, being a personal website,
but hypothetically all that would need to be done is to change `baseUrl` in
`templates/Templates/Urls.hs`.
If you wish to make your own site based on my build system,
please see the dedicated repository for html-generator instead,
and merely use this page as an example.
First, clone the repo:
```bash
git clone --recursive https://github.com/lijerom/jtmar.me
```
The `--recursive` option also fetches the `html-generator` submodule.
If you forgot to include the `--recursive` option, additionally run:
```bash
git submodule init
git submodule update
```
You will then need to install the Haskell Stack:
```bash
curl -sSL https://get.haskellstack.org/ | sh
```
And then build and install html-generators and templates:
```bash
./build-templates.sh
```
You may then build the actual `xhtml` site pages using:
```bash
./build-site-no-sitemap.sh
```
I would recommend always running the `no-sitemap` variant
before running the general `build-site` variant,
because the resultant sitemap will only include the pages
which successfully compiled,
even though the previous working versions of those pages still exist.
The entire website is static,
so no special server configuration should be neccessary.
However, you can still find my nginx config in https://github.com/lijerom/jtmar.me-config/.
```bash
./build-site.sh
```
## License
* html-generator, in /templates/html-generator/ is licensed GPLv3+.
* All other source code (e.g. /templates/, and /index.hs) is licensed AGPLv3+.
* The articles' content itself is licensed CC BY-SA unless otherwise specified.

View File

@ -1,58 +0,0 @@
module Page where
import HtmlGen
import Templates
lastModified :: String
lastModified = "2018-09-22"
sitemap :: Sitemap
sitemap = baseSitemap aboutUrl
`withLastMod` lastModified
`withPriority` "0.8"
`withChangeFreq` "monthly"
page :: Html
page = simplePage "About James" "James" lastModified $
article
%> (h1 %>> "About")
%> (h2 %% ("id", "bio") %>> "Hello,")
%> (p
%>> "I'm James T Martin, also known as " %> italic "jtmar" %>> " or " %> italic "jammar" %>> ". "
%>> "Music is my passion, and programming is my hobby. "
%>> "I enjoy hiking and skiing. "
%>> "I value honesty, simplicity, and independence. "
%>> "I dislike materialism, arrogance, and dogmatic thinking, "
%>> "and seek to banish these traits from myself. "
%>> "I have many flaws, but try to make an improvement in myself every day, "
%>> "so that I might live life to its fullest. "
)
%> (p
%>> "I am a member of my school marching band, jazz band, robotics club, and film club. "
%>> "I am a moderator of "
%> (href "https://reddit.com/r/ProgrammingLanguages/" $ text "/r/ProgrammingLanguages") %>> ". "
%>> "I also work on my various projects, which are listed " %> (href projectsUrl $ text "here") %>> ". "
)
%> (h2 %>> "Accounts" %% ("id", "accounts"))
%> (p %>> "These are the places I am active on the internet.")
%> (href githubUserUrl githubMark)
%> (href youtubeUserUrl youtubeLogo)
%> (href redditUserUrl redditLogo)
-- %> stackexchangeProfile
%> (p %>> "I am not on any social networking sites. Do not mistake any accounts for mine!")
%> (h2 %>> "Contact" %% ("id", "contact"))
%> (h3 %>> "Email" %% ("id", "email"))
%> (p %> italic "james@[this website]" %>> ". ")
%> (h3 %>> "IRC" %% ("id", "irc"))
%> (p
%>> "I am on freenode as " %> italic "jammar" %>> ". "
%>> "If you want to hang out, drop by in " %> italic "#lijero" %>> ". "
%>> "Just because I am connected does not mean I am online, "
%>> "so please do not expect an immediate reply. "
%> unorderedList
[ href "http://webchat.freenode.net/?channels=%23lijero" $ text "Freenode webchat."
, href "ircs://chat.freenode.net/lijero" $ text "An IRCS link."
, href "https://hexchat.github.io/" $ text "HexChat download."
, text "For connecting via a phone, go download an app. "
]
)

BIN
android-chrome-192x192.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

BIN
apple-touch-icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

@ -1,3 +0,0 @@
cd templates/
stack exec html-generator -- $(find .. -type f -name "*.hs" | grep -v "./templates")
cd ..

View File

@ -1,4 +0,0 @@
cd templates/
stack exec html-generator -- --sitemap $(find .. -type f -name "*.hs" | grep -v "./templates")
mv sitemap.xml ..
cd ..

View File

@ -1,3 +0,0 @@
cd templates
stack install
cd ..

BIN
favicon-16x16.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 579 B

BIN
favicon-32x32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 978 B

BIN
favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -1,24 +0,0 @@
module Page where
import Templates
import HtmlGen
lastModified :: String
lastModified = "2018-09-22"
sitemap :: Sitemap
sitemap = baseSitemap (baseUrl ++ "/")
`withLastMod` lastModified
`withPriority` "1.0"
`withChangeFreq` "weekly"
page :: Html
page = simplePage "James Martin" "James" lastModified $
article
%> (h1 %>> "Home")
%> (p
%>> "I have not yet released any blog posts, "
%>> "or even finished the page generator to be able to make them. "
%>> "However, the other pages still are a bit more complete. "
)

BIN
mstile-70x70.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -1,56 +0,0 @@
module Page where
import HtmlGen
import Templates
lastModified :: String
lastModified = "2018-09-19"
sitemap :: Sitemap
sitemap = baseSitemap projectsUrl
`withLastMod` lastModified
`withPriority` "0.8"
`withChangeFreq` "weekly"
page :: Html
page = simplePage "James's Projects" "James" lastModified $
article
%> (h1 %% ("id", "projects") %>> "Projects")
%> (h2 %% ("id", "programming") %>> "Programming")
%> (h3 %>> "QIPL")
%> (p
%>> "QIPL Is a Programming Language, among other things. "
%>> "It is intended to be the embodiment of my programming philosophy: "
%>> "simple sucks less. "
%>> "More information can be found on "
%> (href qiplUrl $ text "its website") %>> ". "
)
%> (h3 %>> "Hazen Robotics")
%> (p
%>> "I am a programmer for the Hazen Robotics team. "
%>> "All of our code can be found "
%> (href (githubUrl ++ "HazenRobotics/") $ text "our GitHub organization") %>> ". "
)
%> (h3 %>> "html-generator")
%> (p
%>> "This website was written using a static site generator I wrote myself. "
%>> "It's got a really, really long way to go, but you can watch it develop "
%> (href (githubProjectUrl "html-generator") $ text "on GitHub") %>> ". "
)
%> (p
%>> "There's also the source code for both "
%> (href (githubProjectUrl "jtmar.me") $ text "jtmar.me")
%>> " and "
%> (href (githubQiplProjectUrl "qipl.org") $ text "qipl.org")
%>> "."
)
%> (h3 %>> "Other Projects")
%> (p
%>> "I used to have a whole bunch of other cool projects and games "
%>> "lying around, but they've all been lost in the Great Purge, "
%>> "which I generally regard as one of the worst mistakes I've ever made. "
)
%> (h2 %>> "Music")
%> (p
%>> "Writing music is one of my other hobbies, but I have not yet released anything. "
)

39
res/character.css Normal file
View File

@ -0,0 +1,39 @@
table td {
padding-right: 10px;
}
#skills-table, .info-table {
border-collapse: collapse;
}
#skills-table tr, .info-table tr {
border-bottom: dotted black 1px;
}
#skills-table td:not(:first-child), #ability-scores td:not(:first-child) {
text-align: center;
}
#skills-table td:nth-child(2), #ability-scores td:first-child {
font-family: monospace;
}
.info-table {
line-height: 1.5em;
}
.info-table tr td:first-child::after {
content: ": ";
}
h3 a, h2 a {
text-decoration: none;
}
figure {
max-width: 400px;
}
#bat-photo {
width: 200px;
}

54
res/character.js Normal file
View File

@ -0,0 +1,54 @@
window.onload = function() {
var skillsHeaders = document.getElementById("skills-headers");
var bonusHeader = document.createElement('th');
bonusHeader.append(document.createTextNode("Bonus"));
skillsHeaders.append(bonusHeader);
var abilities = new Object();
var abilityRows =
document.getElementById("ability-scores").getElementsByTagName('tr');
for (let ability of abilityRows) {
var columns = ability.getElementsByTagName('td');
if (columns.length != 3) {
// This row contains headers, not values.
continue;
}
var name = columns[0].innerText;
var bonus = parseInt(columns[2].innerText);
abilities[name] = bonus;
}
var skillRows =
document.getElementById("skills-table").getElementsByTagName('tr');
for (let skill of skillRows) {
var columns = skill.getElementsByTagName('td');
if (columns.length != 4) {
// This row contains headers, not values.
continue;
}
var abilityColumn = columns[1].innerText;
var rankColumn = columns[2].innerText;
var extraColumn = columns[3].innerText;
var abilityBonus = abilities[abilityColumn];
var rankBonus = parseInt(rankColumn);
var extraBonus = extraColumn ? parseInt(extraColumn) : 0;
var totalBonus = abilityBonus + rankBonus + extraBonus;
var totalBonusText;
if (totalBonus >= 0) {
totalBonusText = "+" + totalBonus.toString();
} else {
totalBonusText = totalBonus.toString();
}
var totalBonusColumn = document.createElement('td');
totalBonusColumn.append(document.createTextNode(totalBonusText));
skill.append(totalBonusColumn);
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

BIN
res/icon/20px/freenode.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 864 B

BIN
res/icon/20px/linkedin.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 779 B

BIN
res/icon/20px/reddit.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 980 B

BIN
res/icon/20px/wikipedia.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

6
res/icon/discord.svg Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="256px" height="293px" viewBox="0 0 256 293" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid">
<g>
<path d="M226.011429,0 L29.9885714,0 C13.4582857,0 0,13.4582857 0,30.1348571 L0,227.913143 C0,244.589714 13.4582857,258.048 29.9885714,258.048 L195.876571,258.048 L188.123429,230.985143 L206.848,248.393143 L224.548571,264.777143 L256,292.571429 L256,30.1348571 C256,13.4582857 242.541714,0 226.011429,0 Z M169.545143,191.049143 C169.545143,191.049143 164.278857,184.758857 159.890286,179.2 C179.053714,173.787429 186.368,161.792 186.368,161.792 C180.370286,165.741714 174.665143,168.521143 169.545143,170.422857 C162.230857,173.494857 155.209143,175.542857 148.333714,176.713143 C134.290286,179.346286 121.417143,178.614857 110.445714,176.566857 C102.107429,174.957714 94.9394286,172.617143 88.9417143,170.276571 C85.5771429,168.96 81.92,167.350857 78.2628571,165.302857 C77.824,165.010286 77.3851429,164.864 76.9462857,164.571429 C76.6537143,164.425143 76.5074286,164.278857 76.3611429,164.132571 C73.728,162.669714 72.2651429,161.645714 72.2651429,161.645714 C72.2651429,161.645714 79.2868571,173.348571 97.8651429,178.907429 C93.4765714,184.466286 88.064,191.049143 88.064,191.049143 C55.7348571,190.025143 43.4468571,168.813714 43.4468571,168.813714 C43.4468571,121.709714 64.512,83.5291429 64.512,83.5291429 C85.5771429,67.7302857 105.618286,68.1691429 105.618286,68.1691429 L107.081143,69.9245714 C80.7497143,77.5314286 68.608,89.088 68.608,89.088 C68.608,89.088 71.8262857,87.3325714 77.2388571,84.8457143 C92.8914286,77.9702857 105.325714,76.0685714 110.445714,75.6297143 C111.323429,75.4834286 112.054857,75.3371429 112.932571,75.3371429 C121.856,74.1668571 131.949714,73.8742857 142.482286,75.0445714 C156.379429,76.6537143 171.300571,80.7497143 186.514286,89.088 C186.514286,89.088 174.957714,78.1165714 150.089143,70.5097143 L152.137143,68.1691429 C152.137143,68.1691429 172.178286,67.7302857 193.243429,83.5291429 C193.243429,83.5291429 214.308571,121.709714 214.308571,168.813714 C214.308571,168.813714 201.874286,190.025143 169.545143,191.049143 Z M101.522286,122.733714 C93.184,122.733714 86.6011429,130.048 86.6011429,138.971429 C86.6011429,147.894857 93.3302857,155.209143 101.522286,155.209143 C109.860571,155.209143 116.443429,147.894857 116.443429,138.971429 C116.589714,130.048 109.860571,122.733714 101.522286,122.733714 M154.916571,122.733714 C146.578286,122.733714 139.995429,130.048 139.995429,138.971429 C139.995429,147.894857 146.724571,155.209143 154.916571,155.209143 C163.254857,155.209143 169.837714,147.894857 169.837714,138.971429 C169.837714,130.048 163.254857,122.733714 154.916571,122.733714" fill="#7289DA"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

3
res/icon/email.svg Normal file
View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" viewBox="0 0 8 8">
<path d="M0 0v1l4 2 4-2v-1h-8zm0 2v4h8v-4l-4 2-4-2z" transform="translate(0 1)" />
</svg>

After

Width:  |  Height:  |  Size: 171 B

BIN
res/icon/freenode.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 KiB

6
res/icon/github.svg Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="256px" height="250px" viewBox="0 0 256 250" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid">
<g>
<path d="M128.00106,0 C57.3172926,0 0,57.3066942 0,128.00106 C0,184.555281 36.6761997,232.535542 87.534937,249.460899 C93.9320223,250.645779 96.280588,246.684165 96.280588,243.303333 C96.280588,240.251045 96.1618878,230.167899 96.106777,219.472176 C60.4967585,227.215235 52.9826207,204.369712 52.9826207,204.369712 C47.1599584,189.574598 38.770408,185.640538 38.770408,185.640538 C27.1568785,177.696113 39.6458206,177.859325 39.6458206,177.859325 C52.4993419,178.762293 59.267365,191.04987 59.267365,191.04987 C70.6837675,210.618423 89.2115753,204.961093 96.5158685,201.690482 C97.6647155,193.417512 100.981959,187.77078 104.642583,184.574357 C76.211799,181.33766 46.324819,170.362144 46.324819,121.315702 C46.324819,107.340889 51.3250588,95.9223682 59.5132437,86.9583937 C58.1842268,83.7344152 53.8029229,70.715562 60.7532354,53.0843636 C60.7532354,53.0843636 71.5019501,49.6441813 95.9626412,66.2049595 C106.172967,63.368876 117.123047,61.9465949 128.00106,61.8978432 C138.879073,61.9465949 149.837632,63.368876 160.067033,66.2049595 C184.49805,49.6441813 195.231926,53.0843636 195.231926,53.0843636 C202.199197,70.715562 197.815773,83.7344152 196.486756,86.9583937 C204.694018,95.9223682 209.660343,107.340889 209.660343,121.315702 C209.660343,170.478725 179.716133,181.303747 151.213281,184.472614 C155.80443,188.444828 159.895342,196.234518 159.895342,208.176593 C159.895342,225.303317 159.746968,239.087361 159.746968,243.303333 C159.746968,246.709601 162.05102,250.70089 168.53925,249.443941 C219.370432,232.499507 256,184.536204 256,128.00106 C256,57.3066942 198.691187,0 128.00106,0 Z M47.9405593,182.340212 C47.6586465,182.976105 46.6581745,183.166873 45.7467277,182.730227 C44.8183235,182.312656 44.2968914,181.445722 44.5978808,180.80771 C44.8734344,180.152739 45.876026,179.97045 46.8023103,180.409216 C47.7328342,180.826786 48.2627451,181.702199 47.9405593,182.340212 Z M54.2367892,187.958254 C53.6263318,188.524199 52.4329723,188.261363 51.6232682,187.366874 C50.7860088,186.474504 50.6291553,185.281144 51.2480912,184.70672 C51.8776254,184.140775 53.0349512,184.405731 53.8743302,185.298101 C54.7115892,186.201069 54.8748019,187.38595 54.2367892,187.958254 Z M58.5562413,195.146347 C57.7719732,195.691096 56.4895886,195.180261 55.6968417,194.042013 C54.9125733,192.903764 54.9125733,191.538713 55.713799,190.991845 C56.5086651,190.444977 57.7719732,190.936735 58.5753181,192.066505 C59.3574669,193.22383 59.3574669,194.58888 58.5562413,195.146347 Z M65.8613592,203.471174 C65.1597571,204.244846 63.6654083,204.03712 62.5716717,202.981538 C61.4524999,201.94927 61.1409122,200.484596 61.8446341,199.710926 C62.5547146,198.935137 64.0575422,199.15346 65.1597571,200.200564 C66.2704506,201.230712 66.6095936,202.705984 65.8613592,203.471174 Z M75.3025151,206.281542 C74.9930474,207.284134 73.553809,207.739857 72.1039724,207.313809 C70.6562556,206.875043 69.7087748,205.700761 70.0012857,204.687571 C70.302275,203.678621 71.7478721,203.20382 73.2083069,203.659543 C74.6539041,204.09619 75.6035048,205.261994 75.3025151,206.281542 Z M86.046947,207.473627 C86.0829806,208.529209 84.8535871,209.404622 83.3316829,209.4237 C81.8013,209.457614 80.563428,208.603398 80.5464708,207.564772 C80.5464708,206.498591 81.7483088,205.631657 83.2786917,205.606221 C84.8005962,205.576546 86.046947,206.424403 86.046947,207.473627 Z M96.6021471,207.069023 C96.7844366,208.099171 95.7267341,209.156872 94.215428,209.438785 C92.7295577,209.710099 91.3539086,209.074206 91.1652603,208.052538 C90.9808515,206.996955 92.0576306,205.939253 93.5413813,205.66582 C95.054807,205.402984 96.4092596,206.021919 96.6021471,207.069023 Z" fill="#161614"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

12
res/icon/gitlab.svg Normal file
View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<svg width="256px" height="236px" viewBox="0 0 256 236" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid">
<g>
<path d="M128.07485,236.074667 L128.07485,236.074667 L175.17885,91.1043048 L80.9708495,91.1043048 L128.07485,236.074667 L128.07485,236.074667 Z" fill="#E24329"></path>
<path d="M128.07485,236.074423 L80.9708495,91.104061 L14.9557638,91.104061 L128.07485,236.074423 L128.07485,236.074423 Z" fill="#FC6D26"></path>
<path d="M14.9558857,91.1044267 L14.9558857,91.1044267 L0.641828571,135.159589 C-0.663771429,139.17757 0.766171429,143.57955 4.18438095,146.06275 L128.074971,236.074789 L14.9558857,91.1044267 L14.9558857,91.1044267 Z" fill="#FCA326"></path>
<path d="M14.9558857,91.1045486 L80.9709714,91.1045486 L52.6000762,3.79026286 C51.1408762,-0.703146667 44.7847619,-0.701927619 43.3255619,3.79026286 L14.9558857,91.1045486 L14.9558857,91.1045486 Z" fill="#E24329"></path>
<path d="M128.07485,236.074423 L175.17885,91.104061 L241.193935,91.104061 L128.07485,236.074423 L128.07485,236.074423 Z" fill="#FC6D26"></path>
<path d="M241.193935,91.1044267 L241.193935,91.1044267 L255.507992,135.159589 C256.813592,139.17757 255.38365,143.57955 251.96544,146.06275 L128.07485,236.074789 L241.193935,91.1044267 L241.193935,91.1044267 Z" fill="#FCA326"></path>
<path d="M241.193935,91.1045486 L175.17885,91.1045486 L203.549745,3.79026286 C205.008945,-0.703146667 211.365059,-0.701927619 212.824259,3.79026286 L241.193935,91.1045486 L241.193935,91.1045486 Z" fill="#E24329"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

View File

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

3
res/icon/lock-locked.svg Normal file
View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" viewBox="0 0 8 8">
<path d="M3 0c-1.1 0-2 .9-2 2v1h-1v4h6v-4h-1v-1c0-1.1-.9-2-2-2zm0 1c.56 0 1 .44 1 1v1h-2v-1c0-.56.44-1 1-1z" transform="translate(1)" />
</svg>

After

Width:  |  Height:  |  Size: 225 B

3
res/icon/pgp.svg Normal file
View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" viewBox="0 0 8 8">
<path d="M3 0c-1.1 0-2 .9-2 2v1h-1v4h6v-4h-1v-1c0-1.1-.9-2-2-2zm0 1c.56 0 1 .44 1 1v1h-2v-1c0-.56.44-1 1-1z" transform="translate(1)" />
</svg>

After

Width:  |  Height:  |  Size: 225 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

BIN
res/icon/reddit.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

4
res/icon/web.svg Normal file
View File

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" viewBox="0 0 8 8">
<path d="M5.88.03c-.18.01-.36.03-.53.09-.27.1-.53.25-.75.47a.5.5 0 1 0 .69.69c.11-.11.24-.17.38-.22.35-.12.78-.07 1.06.22.39.39.39 1.04 0 1.44l-1.5 1.5c-.44.44-.8.48-1.06.47-.26-.01-.41-.13-.41-.13a.5.5 0 1 0-.5.88s.34.22.84.25c.5.03 1.2-.16 1.81-.78l1.5-1.5c.78-.78.78-2.04 0-2.81-.28-.28-.61-.45-.97-.53-.18-.04-.38-.04-.56-.03zm-2 2.31c-.5-.02-1.19.15-1.78.75l-1.5 1.5c-.78.78-.78 2.04 0 2.81.56.56 1.36.72 2.06.47.27-.1.53-.25.75-.47a.5.5 0 1 0-.69-.69c-.11.11-.24.17-.38.22-.35.12-.78.07-1.06-.22-.39-.39-.39-1.04 0-1.44l1.5-1.5c.4-.4.75-.45 1.03-.44.28.01.47.09.47.09a.5.5 0 1 0 .44-.88s-.34-.2-.84-.22z"
/>
</svg>

After

Width:  |  Height:  |  Size: 704 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 326 KiB

BIN
res/icon/wikipedia.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 325 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

16
res/icon/youtube.svg Normal file
View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="256px" height="256px" viewBox="0 0 256 180" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid">
<defs>
<linearGradient x1="49.9804764%" y1="8.68053889e-07%" x2="49.9804764%" y2="100.030167%" id="linearGradient-1">
<stop stop-color="#E52D27" offset="0%"></stop>
<stop stop-color="#BF171D" offset="100%"></stop>
</linearGradient>
</defs>
<g>
<g>
<path d="M101.6,123.2 L170.8,87.4 L101.6,51.3 L101.6,123.2 L101.6,123.2 Z" fill="#FFFFFF"></path>
<path d="M101.6,51.3 L162.3,91.8 L170.8,87.4 L101.6,51.3 L101.6,51.3 Z" opacity="0.12" fill="#420000"></path>
<path d="M253.301054,38.8 C253.301054,38.8 250.80203,21.2 243.105037,13.4 C233.408825,3.2 222.513081,3.2 217.415072,2.6 C181.729012,0 128.04998,0 128.04998,0 L127.95002,0 C127.95002,0 74.2709879,0 38.3850059,2.6 C33.3869582,3.2 22.4912144,3.2 12.695041,13.4 C5.09800859,21.2 2.59898477,38.8 2.59898477,38.8 C2.59898477,38.8 0,59.6 0,80.3 L0,99.7 C0,120.4 2.59898477,141.1 2.59898477,141.1 C2.59898477,141.1 5.09800859,158.7 12.795002,166.5 C22.4912144,176.7 35.2862163,176.4 40.9839906,177.4 C61.4759859,179.4 127.95002,180 127.95002,180 C127.95002,180 181.729012,179.9 217.515033,177.3 C222.513081,176.7 233.408825,176.7 243.204998,166.5 C250.901991,158.7 253.401015,141.1 253.401015,141.1 C253.401015,141.1 256,120.4 256,99.7 L256,80.3 C255.900039,59.6 253.301054,38.8 253.301054,38.8 L253.301054,38.8 Z M101.560328,123.2 L101.560328,51.3 L170.733307,87.4 L101.560328,123.2 L101.560328,123.2 Z" fill="url(#linearGradient-1)"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 213 KiB

BIN
res/images/wyvern.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

160
res/style.css Normal file
View File

@ -0,0 +1,160 @@
body {
max-width: 95ch;
padding: 20px;
margin: auto;
font-size: 15pt;
font-family: sans-serif;
line-height: 1.5em;
background-color: white;
}
.resume {
max-width: 70ch;
overflow: auto;
}
p {
max-width: 70ch;
}
@media (min-width: 900px) {
.card {
float: right;
padding: 0 30px;
margin: 0 30px;
border-left: solid black;
max-width: 22ch;
line-height: 2em;
}
.card figure {
margin: 0;
}
}
@media (max-width: 899px) {
.card {
margin: auto;
padding: 20px;
border: solid black;
}
.card figure {
margin: auto;
}
}
@media (max-width: 899px) and (min-width: 600px) {
.card { column-count: 2; }
.card h3 { column-span: all; }
}
img.pgp-img {
float: left;
height: 1.2em !important;
}
.pgp > a {
font-family: monospace;
font-size: 10pt;
line-height: 1.2em;
display: inline-block;
padding-left: 5px;
width: 24ch;
}
.card h3, .card h4 {
margin: 0;
padding: 0;
}
.contact-list {
list-style-type: none;
padding: 0;
margin: 10px 0;
}
.contact-list img {
width: 1em;
height: 1em;
}
th {
padding-right: 7px;
}
.more {
font-size: .8em;
}
.duration {
float: right;
}
li > .service::after, .skill-category::after {
content: ": ";
}
.dt-end::before {
content: " — ";
}
.inline-list {
display: inline-block;
list-style-type: none;
padding: 0;
}
.inline-list > li {
display: inline;
}
.inline-list > li:not(:last-child)::after {
content: ", ";
}
.inline-list > li:last-child:not(:first-child)::before {
content: "and ";
}
.inline-list > li:last-child::after {
content: ".";
}
.ap-score::before {
content: "(";
}
.ap-score::after {
content: ")";
}
.p-experience:not(:last-child) {
padding-bottom: 20px;
}
.experiences > ul {
padding: 0;
list-style-type: none;
}
img {
background-color: white;
color: black;
display: block;
}
section figcaption {
text-align: center;
font-style: italic;
font-size: 12pt;
line-height: 1.5em;
}
section figure img {
width: 100%;
}
footer {
min-height: 100px;
}

33
safari-pinned-tab.svg Normal file
View File

@ -0,0 +1,33 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="200.000000pt" height="200.000000pt" viewBox="0 0 200.000000 200.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.11, written by Peter Selinger 2001-2013
</metadata>
<g transform="translate(0.000000,200.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M710 1696 l0 -64 60 -4 c74 -5 109 -35 141 -118 49 -130 50 -115 -27
-276 -30 -62 -54 -114 -54 -117 0 -3 -20 -48 -44 -99 -51 -110 -174 -376 -198
-430 -7 -16 0 -18 71 -18 l79 0 21 50 c21 49 63 140 146 315 23 50 60 127 81
173 43 93 41 94 85 -28 51 -142 71 -195 80 -205 5 -5 9 -15 9 -22 0 -7 15 -52
34 -101 19 -48 42 -108 51 -134 l18 -48 78 0 79 0 -16 37 c-8 21 -24 61 -34
88 -10 28 -32 88 -50 135 -18 47 -38 103 -46 125 -8 22 -18 49 -23 60 -15 36
-48 126 -118 320 -8 22 -21 54 -28 70 -7 17 -23 58 -34 92 -42 127 -79 191
-124 217 -47 27 -126 46 -192 46 l-45 0 0 -64z"/>
<path d="M490 1560 c-63 -8 -127 -44 -159 -88 -33 -46 -53 -154 -46 -237 8
-83 -5 -141 -41 -184 -21 -25 -33 -30 -77 -33 l-52 -3 0 -45 0 -45 53 -6 c98
-12 112 -43 112 -245 0 -170 14 -234 62 -283 53 -54 82 -64 210 -69 l118 -5 0
45 0 45 -92 7 c-108 8 -139 24 -165 80 -14 32 -17 62 -16 141 5 178 -26 276
-99 319 -28 17 -30 20 -12 27 32 12 82 72 99 118 10 29 15 80 15 152 0 139 15
180 74 209 31 15 62 20 119 20 l77 0 0 45 0 45 -62 -1 c-35 -1 -88 -5 -118 -9z"/>
<path d="M1330 1526 l0 -46 77 0 c57 0 88 -5 119 -20 59 -29 74 -70 74 -209 0
-72 5 -123 15 -152 17 -46 67 -106 99 -118 18 -7 17 -9 -10 -25 -39 -23 -79
-82 -90 -131 -4 -22 -8 -98 -9 -170 -1 -199 -23 -229 -183 -241 l-92 -7 0 -45
0 -45 119 5 c105 4 124 8 164 31 85 50 108 116 107 310 -1 211 16 247 116 255
l55 5 -3 46 -3 46 -51 5 c-95 10 -119 52 -117 200 3 182 -31 266 -127 316 -35
18 -68 25 -152 30 l-108 7 0 -47z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

14
site.webmanifest Normal file
View File

@ -0,0 +1,14 @@
{
"name": "James Martin",
"short_name": "James Martin",
"icons": [
{
"src": "/android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
}
],
"theme_color": "#ffffff",
"background_color": "#ffffff",
"display": "standalone"
}

22
templates/.gitignore vendored
View File

@ -1,22 +0,0 @@
dist
dist-*
cabal-dev
*.o
*.hi
*.chi
*.chs.h
*.dyn_o
*.dyn_hi
.hpc
.hsenv
.cabal-sandbox/
cabal.sandbox.config
*.prof
*.aux
*.hp
*.eventlog
.stack-work/
cabal.project.local
cabal.project.local~
.HTF/
.ghc.environment.*

View File

@ -1,2 +0,0 @@
import Distribution.Simple
main = defaultMain

@ -1 +0,0 @@
Subproject commit 12d9f9c59904f2e9707d5319ff351250280b6532

View File

@ -1,76 +0,0 @@
module Templates
( module Templates
, module Templates.Urls
, module Templates.Icons
) where
import Templates.Urls
import Templates.Icons
import HtmlGen
basePage :: String -> String -> Html -> Html
basePage pageTitle authorName content =
html %% xmlns %% langEn
%> (headTag
%> utf8
%> author authorName
%> allowRobots
%> stylesheet stylesheetCommonUrl
%> faviconLink
%> (title %>> pageTitle)
%> viewport
%> (newTag "script" %% ("async", "async") %% ("src", resUrl ++ "/common.js"))
%> blockAllMixedContent
%> cspMeta "default-src 'none'; style-src 'self'; img-src 'self' https://stackexchange.com; script-src 'self';"
)
%> content
navSection :: Html
navSection =
nav
%> (spanTag `withId` "navbrand" %> ((href baseUrl $ text "James Martin") %% ("class", "navbrand")))
%> unorderedList
[ href (baseUrl ++ "/") $ text "Home"
, href projectsUrl $ text "Projects"
, href aboutUrl $ text "About"
]
footerSection :: String -> String -> Html
footerSection authorName dateModified =
footer
%> (divTag `withClass` "metadata"
%> (spanTag
%> authorIcon
%>> ' ' : authorName ++ " "
)
%> (spanTag
%> updatedIcon
%>> ' ' : dateModified ++ " "
)
%> license
)
simplePage :: String -> String -> String -> Html -> Html
simplePage titleName authorName dateModified content =
basePage titleName authorName $
body %> navSection
%> content
%> footerSection authorName dateModified
redirectPage :: String -> String -> Html
redirectPage name url =
html
%> (headTag
%> utf8
%> (meta
%% ("http-equiv", "refresh")
%% ("content", "0;url=" ++ url)
)
%> (title %>> "Redirecting to " ++ url)
)
%> (body
%> (href url $ p
%>> ("Click here if you are not being redirected to " ++ name)
)
)

View File

@ -1,87 +0,0 @@
module Templates.Icons where
import Templates.Urls
import HtmlGen.Html
import HtmlGen.Tags
personIconUrl :: String
personIconUrl = iconUrl ++ "/" ++ "person.svg"
personIcon :: String -> Html
personIcon alt = img alt personIconUrl
authorIcon :: Html
authorIcon = personIcon "Author"
clockIconUrl :: String
clockIconUrl = iconUrl ++ "/" ++ "clock.svg"
clockIcon :: String -> Html
clockIcon alt = img alt clockIconUrl
updatedIcon :: Html
updatedIcon = clockIcon "Updated"
ccbysaIconUrl :: String
ccbysaIconUrl = resUrl ++ "/cc-by-sa-small.png"
ccbysaIcon :: Html
ccbysaIcon = img "This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License" ccbysaIconUrl
license :: Html
license =
divTag `withClass` "license"
%> (href ccbysaUrl ccbysaIcon
%% ("rel", "license"))
faviconUrl :: String
faviconUrl = baseUrl ++ "/favicon.png"
faviconMime :: String
faviconMime = "image/png"
faviconLink :: Html
faviconLink = favicon faviconUrl faviconMime
accountIconClass :: (String, String)
accountIconClass = ("class", "accounticon")
githubMarkUrl :: String
githubMarkUrl = iconUrl ++ "/github-mark-100px.png"
githubMark :: Html
githubMark = img "GitHub" githubMarkUrl %% accountIconClass
linkedinLogoUrl :: String
linkedinLogoUrl = iconUrl ++ "/linkedin-logo-100px.png"
linkedinLogo :: Html
linkedinLogo = img "LinkedIn" linkedinLogoUrl %% accountIconClass
redditLogoUrl :: String
redditLogoUrl = iconUrl ++ "/reddit-logo-100px.png"
redditLogo :: Html
redditLogo = img "Reddit" redditLogoUrl %% accountIconClass
wikipediaLogoUrl :: String
wikipediaLogoUrl = iconUrl ++ "/wikipedia-logo-100px.png"
wikipediaLogo :: Html
wikipediaLogo = img "Wikipedia" wikipediaLogoUrl %% accountIconClass
youtubeLogoUrl :: String
youtubeLogoUrl = iconUrl ++ "/youtube-logo-100px.jpeg"
youtubeLogo :: Html
youtubeLogo = img "Youtube" youtubeLogoUrl %% accountIconClass
freenodeLogoUrl :: String
freenodeLogoUrl = iconUrl ++ "/freenode-logo.svg"
freenodeLogo :: Html
freenodeLogo = img "Freenode" freenodeLogoUrl %% accountIconClass
stackexchangeProfile :: Html
stackexchangeProfile = href stackexchangeUserUrl $ img "James Martin's Stack Exchange profile" stackexchangeFlairUrl %% accountIconClass

View File

@ -1,58 +0,0 @@
module Templates.Urls where
baseUrl :: String
baseUrl = "https://jtmar.me"
resUrl :: String
resUrl = baseUrl ++ "/res"
iconUrl :: String
iconUrl = resUrl ++ "/icon"
ccbysaUrl :: String
ccbysaUrl = "http://creativecommons.org/licenses/by-sa/4.0/"
stylesheetCommonUrl :: String
stylesheetCommonUrl = resUrl ++ "/common.css"
projectsUrl :: String
projectsUrl = baseUrl ++ "/projects"
aboutUrl :: String
aboutUrl = baseUrl ++ "/about"
githubUrl :: String
githubUrl = "https://github.com"
githubUserUrl :: String
githubUserUrl = githubUrl ++ "/jammar"
githubProjectUrl :: String -> String
githubProjectUrl name = githubUserUrl ++ "/" ++ name
githubQiplUrl :: String
githubQiplUrl = githubUrl ++ "/" ++ "qipl"
githubQiplProjectUrl :: String -> String
githubQiplProjectUrl name = githubQiplUrl ++ "/" ++ name
resumeUrl :: String
resumeUrl = baseUrl ++ "/resume.pdf"
qiplUrl :: String
qiplUrl = "https://qipl.org"
redditUserUrl :: String
redditUserUrl = "https://reddit.com/user/lijero"
youtubeUserUrl :: String
youtubeUserUrl = "https://www.youtube.com/channel/UC_nCB91N-0zNbFiMoMu6-3w"
wikipediaUserUrl :: String
wikipediaUserUrl = "https://en.wikipedia.org/wiki/User:Lijero"
stackexchangeUserUrl :: String
stackexchangeUserUrl = "https://stackexchange.com/users/10815798/james-martin"
stackexchangeFlairUrl :: String
stackexchangeFlairUrl = "https://stackexchange.com/users/flair/10815798.png"

View File

@ -1,66 +0,0 @@
# This file was automatically generated by 'stack init'
#
# Some commonly used options have been documented as comments in this file.
# For advanced use and comprehensive documentation of the format, please see:
# https://docs.haskellstack.org/en/stable/yaml_configuration/
# Resolver to choose a 'specific' stackage snapshot or a compiler version.
# A snapshot resolver dictates the compiler version and the set of packages
# to be used for project dependencies. For example:
#
# resolver: lts-3.5
# resolver: nightly-2015-09-21
# resolver: ghc-7.10.2
# resolver: ghcjs-0.1.0_ghc-7.10.2
#
# The location of a snapshot can be provided as a file or url. Stack assumes
# a snapshot provided as a file might change, whereas a url resource does not.
#
# resolver: ./custom-snapshot.yaml
# resolver: https://example.com/snapshots/2018-01-01.yaml
resolver: lts-11.7
# User packages to be built.
# Various formats can be used as shown in the example below.
#
# packages:
# - some-directory
# - https://example.com/foo/bar/baz-0.0.2.tar.gz
# - location:
# git: https://github.com/commercialhaskell/stack.git
# commit: e7b331f14bcffb8367cd58fbfc8b40ec7642100a
# - location: https://github.com/commercialhaskell/stack/commit/e7b331f14bcffb8367cd58fbfc8b40ec7642100a
# subdirs:
# - auto-update
# - wai
packages:
- .
- html-generator
# Dependency packages to be pulled from upstream that are not in the resolver
# using the same syntax as the packages field.
# (e.g., acme-missiles-0.3)
# extra-deps: []
# Override default flag values for local packages and extra-deps
# flags: {}
# Extra package databases containing global packages
# extra-package-dbs: []
# Control whether we use the GHC we find on the path
# system-ghc: true
#
# Require a specific version of stack, using version ranges
# require-stack-version: -any # Default
# require-stack-version: ">=1.7"
#
# Override the architecture used by stack, especially useful on Windows
# arch: i386
# arch: x86_64
#
# Extra directories used by stack for building
# extra-include-dirs: [/path/to/dir]
# extra-lib-dirs: [/path/to/dir]
#
# Allow a newer minor version of GHC than the snapshot specifies
# compiler-check: newer-minor

View File

@ -1,25 +0,0 @@
name: templates
version: 0.1.0.0
-- synopsis:
-- description:
homepage: https://github.com/lijerom/jtmar.me
license: GPL-3
--license-file: LICENSE
author: James Martin
maintainer: james@jtmar.me
copyright: 2018 James Martin
category: Web
build-type: Simple
cabal-version: >=1.10
-- extra-source-files: README.md
library
hs-source-dirs: src
default-language: Haskell2010
exposed-modules:
Templates
, Templates.Icons
, Templates.Urls
build-depends:
base >=4.7 && <5
, html-generator