From 416c0f5fb44b0acaf17f6570e74a304ad5c683f8 Mon Sep 17 00:00:00 2001 From: Eduardo Cueto Mendoza Date: Sat, 13 Jun 2020 23:43:32 -0600 Subject: [PATCH] Changes to the whole template --- _assets/img/cv_photo.jpg | Bin 0 -> 33895 bytes _assets/infra/lambda.png | Bin 0 -> 4164 bytes cv/index.md | 383 +++++++++++++++++++++++++++++++++++++++ projects/index.md | 197 ++++++++++++++++++++ 4 files changed, 580 insertions(+) create mode 100644 _assets/img/cv_photo.jpg create mode 100644 _assets/infra/lambda.png create mode 100644 cv/index.md create mode 100644 projects/index.md diff --git a/_assets/img/cv_photo.jpg b/_assets/img/cv_photo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..23708c8b8e23168f45122365483d64324e191d6f GIT binary patch literal 33895 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 I<#Yf40VLln(EtDd literal 0 HcmV?d00001 diff --git a/_assets/infra/lambda.png b/_assets/infra/lambda.png new file mode 100644 index 0000000000000000000000000000000000000000..4be33514cc3c297201d371dea31942d776d348ce GIT binary patch literal 4164 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, a) = 14 +``` + +and will look like + +``` +dot(a, a) = 14 +``` + +If you now change the vector `a` in the code block, the page will be re-compiled with the code-block re-evaluated and the new output will be shown. + +If you would like the output to be re-interpeted by Franklin as text, you can use `\textoutput` instead. +Here's an example: + +````` +```julia:./code_pg1/ex2 +using Statistics +temps = (15, 15, 14, 16, 18, 19, 20, 12, 10, 24) +println("The _average_ temperature is **$(mean(temps))°C**.") +``` +\textoutput{./code_pg1/ex2} +````` + +That code block and the `\textoutput` command will appear as: + +```julia +using Statistics +temps = (15, 15, 14, 16, 18, 19, 20, 12, 10, 24) +println("The _average_ temperature is **$(mean(temps))°C**.") +``` + +The _average_ temperature is **16.3°C**. + +Finally if you want to show your code "notebook-style", i.e. both STDOUT and the result of the last line, use `\show`: + +````` +```julia:ex_show +x = 5 +println("hello") +x^2 +``` +\show{ex_show} +````` + +resulting in: + +```julia:ex_show +x = 5 +println("hello") +x^2 +``` +\show{ex_show} + + +### Hiding lines + +Sometimes you may want to run some lines but hide them from the presentation, for this just use `# hide` at the end of the line (`hide` is not case sensitive so `# HiDe` would be fine too): + +````` +```julia:./code_pg1/ex1 +using LinearAlgebra # hide +a = [1, 2, 3] +@show dot(a, a) +``` +````` + +You could also hide the entire code block if you only care about the output, for this put a `# hideall` on any line: + +````` +```julia:./code_pg1/ex2 +#hideall +using Statistics +temps = (15, 15, 14, 16, 18, 19, 20, 12, 10, 24) +println("The _average_ temperature is **$(mean(temps))°C**.") +``` +\textoutput{./code_pg1/ex2} +````` + +Which will appear as just: + +The _average_ temperature is **16.3°C**. + +### Project.toml + +It can be convenient to set up your website as you would a Julia environment: _activating_ it and _adding_ the packages that you will use in code blocks. +In order to do this, just activate the environment as you would otherwise, this will generate a `Project.toml` which will subsequently be used by Franklin without you having to worry about it. + +For instance, let's say that you want to use `PyCall` in some code blocks, then before starting the Franklin server do + +```julia-repl +(1.x) pkg> activate . +(myWebsite) pkg> add PyCall +``` + +once that's done, if you now start the server, Franklin will write + +```julia-repl +julia> serve() +Activating environment at `~/Desktop/myWebsite/Project.toml` +``` + +In other words, whenever you start the server, Franklin will now activate the environment with that `Project.toml`. +This is particularly useful if you intend to write a tutorial website (for a live example of this, see the [MLJ Tutorials](https://alan-turing-institute.github.io/MLJTutorials/)). + +### Plots + +Using the machinery introduced above, you can also evaluate code that generates a plot which you can then include on the page. +In the example below, `PyPlot` is used but you could do something similar with other frameworks. + +Assuming you've added `PyPlot` to your environment, this markdown + +`````markdown +```julia:pyplot1 +using PyPlot +figure(figsize=(8, 6)) +x = range(-2, 2, length=500) +for α in 1:5 + plot(x, sinc.(α .* x)) +end +savefig(joinpath(@OUTPUT, "sinc.svg")) # hide +``` + +\fig{sinc} +````` + +will give: + +```julia:pyplot1 +using PyPlot +figure(figsize=(8, 6)) +x = range(-2, 2, length=500) +for α in 1:5 + plot(x, sinc.(α .* x)) +end +savefig(joinpath(@OUTPUT, "sinc.svg")) # hide +``` + +\fig{sinc} + +**Note**: observe that here everything is done with relative paths, `pyplot1` is placed in the `/assets/` folder relatively to the path of the current page and the `\fig` since it's given a path that doesn't start with `/` or `./` will also look in that folder to try to find a figure which starts with the name `sinc`. See also [more about paths](#more_on_paths). + +### Troubleshooting + +A few things can go wrong when attempting to use and evaluate code blocks. +The first thing to do if no output is shown or an error appears is to make sure that: + +@@tlist +1. if the code uses packages, these packages are available in the local environment, +1. the code "just works" in the REPL. +@@ + +If this is the case and you still have issues, then you may want to force re-evaluation of the code on the page. +In such a case, try adding `@def reeval = true` on the page which will cause **all** code blocks on the page to be completely re-evaluated and their output re-generated. +Assuming that helped, you will then want to remove that line as otherwise that page will be fully re-evaluated _every single time the page is modified_ which will cause an unnecessary overhead. + +**Important note**: unless you explicitly use `@def reeval = true`, code blocks are evaluated *only* if: +@@tlist +- an earlier code block has been evaluated (in which case, since their results may depend on it, all subsequent blocks are re-evaluated), +- the content of the code block has changed. +@@ +An example where this can be a bit tricky is if your code block calls a function on a file, for instance `read(file, String)`; if the underlying *file* is changed, the code block will **not** be re-evaluated (since the code doesn't change), so in such cases you will want to use a `@def reeval = true`. + +## Offline evaluation (any language) + +The philosophy here is: + +@@tlist +* keep your code snippets in appropriate subfolders of `/assets/` where they can be run and their output can be saved, this can be compared to a `test/` folder in a Julia package, +* run some or all of the snippets (before running Franklin), +* use `\input{...}{...}` in your markdown (see below) and when the website is updated, it will plug-in the most recent parts that have been generated. +@@ + +That way, if you modify the code, everything will be updated on the website too while ensuring that the code actually runs and generates the output you're displaying. + +Again, the script files can contain `# hide` at the end of lines you do not want to show (`#` to be replaced by whatever symbol indicates comments in that language). + +The `generate_results.jl` file should run the scripts and redirect outputs to the `assets/[path]/output` directory. +You can use something like the script below (if you generate an example website with `newsite`, it's already in there) though you can of course modify it as you wish. + +```julia +dir = @__DIR__ +""" +genplain(s) + +Small helper function to run some code and redirect the output (stdout) to a file. +""" +function genplain(s::String) + open(joinpath(dir, "output", "$(splitext(s)[1]).out"), "w") do outf + redirect_stdout(outf) do + include(joinpath(dir, s)) + end + end +end +# run `script1.jl` and redirect what it prints to `output/script1.out` +genplain("script1.jl") +# run `script2.jl` which has a savefig(joinpath(@__DIR__, "output", "script2.png")) +include("script2.jl") +``` + +The function `genplain("scriptname.jl")` just redirects the output of the script to `output/scriptname.out`. +So for instance if you have in `assets/scripts/script1.jl` + +```julia +print("hello") +``` + +Then `genplain("script1.jl")` will generate `/assets/scripts/output/script1.out` with content + +```julia +hello +``` + +\note{You could have scripts in any language here (`R`, `Python`, ...) as long as the folder structure is the same.} + +### Inserting code + +In order to insert the code of a script and have it highlighted you can use + +``` +\input{julia}{scripts/script1.jl} +``` + +This will insert the content of the file `/assets/scripts/script1.jl` (see also the section earlier on paths) into a block that will be highlighted as julia code. + +### Plain-text output + +In order to insert the plain-text output of a script, you can use + +``` +\output{scripts/script1.jl} +``` + +This will insert the content of the file `/assets/scripts/script1.out` into a non-highlighted code-block. + +### Plot output + +In order to insert a plot generated by a script, you can use `\fig` as indicated earlier or + +``` +\input{plot}{scripts/script1.jl} +``` + +or `\input{plot:id}{scripts/script1.jl}`. This will look for an image file with root name `/assets/scripts/script1.ext` where `ext` is `gif, png, jp(e)g, svg`. +If you use `plot:id` then it will look for an image file with root name `/assets/scripts/script1id.ext`. + +The `plot:id` option is useful if you have a script that generates several plots for instance. + +### Slicing up + +The structure in the `generate_results.jl` effectively means that all your code is run as one big script. +This also means that if you want to slice some of your code in several parts and show intermediate outputs (e.g. plots), you can just do that by having a `script_1_p1.jl`, `script_1_p2.jl` etc. and then just use `\input` multiple times. diff --git a/projects/index.md b/projects/index.md new file mode 100644 index 0000000..1867bed --- /dev/null +++ b/projects/index.md @@ -0,0 +1,197 @@ + + +# Working with Franklin + +\blurb{Set things up in minutes and focus on writing great content.} + +\lineskip + +\toc + +## Creating your website + +To get started, the easiest is to use the `newsite` function to generate a website folder which you can then modify to your heart's content. +The command takes one mandatory argument: the _name_ of the folder (which can be `"."` if you want to set things up in your current directory). +You can optionally specify a template: + +```julia-repl +julia> newsite("TestWebsite"; template="vela") +✓ Website folder generated at "TestWebsite" (now the current directory). +→ Use serve() from Franklin to see the website in your browser. +``` + +There are a number of [simple templates](https://tlienart.github.io/FranklinTemplates.jl/) you can choose from and tweak. + +\note{The templates are meant to be used as _starting points_ and will likely require some fixes to match what you want. Your help to make them better is very welcome.} + +Once you have created a new website folder, you can start the live-rendering of your website with + +```julia-repl +julia> serve() +→ Initial full pass... +→ Starting the server... +✓ LiveServer listening on http://localhost:8000/ ... + (use CTRL+C to shut down) +``` + +and navigate in a browser to the corresponding address to preview the website. + +### Folder structure + +The initial call to `newsite` generates a folder with the following structure: + +```plaintext +. +├── _assets/ +├── _layout/ +├── _libs/ +├── config.md +└── index.md +``` + +After running `serve` the first time, an additional folder is generated: `__site` which will contain your full generated website. +Among these folders: + +@@tlist +* the files in the top folder such as `index.md` are the source files for the generated pages, you must have an `index.md` or `index.html` at the top level but can then use whatever folder structure you want (see further), +* you should **not** modify the content of `__site` as it's *generated* and any changes you do in there may be silently over-written whenever you modify files elsewhere, +* the folders `_assets/`, `_libs/`, `_layout` and `_css` contain *auxiliary files* supporting your site: + * `_assets/` will contain images, code snippets, etc., + * `_css/` will contain the style sheets, + * `_libs/` will contain javascript libraries, + * `_layout/` will contain bits of HTML scaffolding for the generated pages, +@@ + +### Top folder + +In this folder, + +@@tlist +* `index.md` will generate the site's landing page, +* `pages/page1.md` would correspond to pages on your website (you can have whatever subfolder structure you want in here), +* `config.md` allows to specify variables that help steer the page generation, you can also use it to declare global variables or definitions that can then be used on all pages. +@@ + +\note{You can also write pages in plain HTML. For instance you may want to write an `index.html` file instead of generating it via the `index.md`. You will still need to put it at the exact same place and let Franklin copy the files appropriately.} + +Note that Franklin generates a folder structure in `__site` which allows to have URLs like `[website]/page1/`. The following rules are applied: + +* the filename is `[path/]index.md` or `[path/]index.html`, it will be copied over "as is" to `__site/[path/]index.html`, +* the filename is `[path/]somepage.md` or `[path/]somepage.html`, it will be copied to `__site/[path/]somepage/index.html`. + +So for instance if we ignore auxiliary files and you have + +``` +. +├── index.md +├── folder +│ └── subpage.md +└── page.md +``` + +it will lead to + +``` +__site + ├── index.html + ├── folder + │ └── subpage + │ └── index.html + └── page + └── index.html +``` + +which allows to have the following URLs: + +@@tlist +* `[website]/` +* `[website]/page/` +* `[website]/folder/subpage/` +@@ + +### Reserved names + +To avoid name clashes, refrain from using the following paths where `/` indicates the topdir (website folder): + +@@tlist +* `/css/` or `/css.md` +* `/layout/` or `/layout.md` +* `/literate/` or `/literate.md` +@@ + +Also bear in mind that Franklin will ignore `README.md`, `LICENSE.md`, `Manifest.toml` and `Project.toml`. + +### Editing and testing your website + +The `serve` function can be used to launch a server which will track and render modifications. +There are a few useful options you can use beyond the barebone `serve()`, do `?serve` in your REPL for all options, we list a few noteworthy one below: + +@@tlist +* `clear=false`, whether to erases `__site` and starts from a blank slate, +* `single=false`, whether to do a single build pass generating all pages and not start the server. +* `prerender=false`, whether to prerender code blocks and maths (see the [optimisation step](#optimisation_step)) +* `verb=false`, whether to show information about which page is being processed etc, +* `silent=false`, whether to suppress any informative messages that could otherwise appear in your console when editing your site, this goes one step further than `verb=false` as it also applies for code evaluation, +* `eval_all=false`, whether to re-evaluate all code blocks on all pages. +@@ + +## Post-processing + +### Verify links + +Before deploying you may want to verify that links on your website lead somewhere, to do so use the `verify_links()`. +It will take a few second to verify all links on every generated pages but can be quite helpful to identify dead links or links with typos: + +```julia-repl +julia> verify_links() +Verifying links... [you seem online ✓] +- internal link issue on page index.md: /menu3/. +``` + +then after fixing and re-generating pages: + +```julia-repl +julia> verify_links() +All internal and external links verified ✓. +``` + +### Pre-rendering and compression + +The `optimize` function can + +@@tlist +* pre-render KaTeX and highlight.js code to HTML so that the pages don't have to load these javascript libraries, +* minify all generated HTML and CSS. +@@ +See `?optimize` for options. + +Those two steps may lead to faster loading pages. +Note that in order to run them, you will need a couple of external dependencies as mentioned in the [installation section](/index.html#installing_optional_extras). + +The `optimize` function is called by default in the `publish` function which can be used to help deploy your website. + +### Publish + +\note{If you use GitHub or GitLab with a deployment action on those platforms, you do not need to use `publish`, you can just push your changes and let the relevant action do the rest on the platform. See the section on [deployment](/workflow/deploy/).} + +Once you have synched your local folder with a remote repository (see [deployment instructions](/workflow/deploy/)), the `publish` function can be called to deploy your website; it essentially: + +@@tlist +- applies an optional optimisation step (see previous point), +- does a `git add -A; git commit -am "franklin-update"; git push`. +@@ + +See `?publish` for more information. + +In any case, before deploying, if you're working on a _project website_ i.e. a website whose root URL will look like `username.gitlab.io/project/` then you should add the following line in your `config.md` file: + +```markdown +@def prepath = "project" +``` + +the `publish` function will then ensure that all links are fixed before deploying your website. + +Note also that the `publish` function accepts a `final=` keyword to which you can pass any function `() -> nothing` to do some final post-processing before pushing updates online. +For instance, you can use `final=lunr` where `lunr` is a function exported by Franklin which generates a Lunr search index (see [this tutorial](/extras/lunr/) for more details).