* Split checking for theme template off into separate function
Allows to check for fallbacks elsewhere in the code, without attempting to actually render the template.
* Add template fallback checking to taxonomy pages.
* Add template fallback checking to paginated taxonomies
Requires passing additional arguments to Paginator::from_taxonomy, which may not be desirable.
* Update documentation to reflect taxonomy template fallbacks.
* Update generic taxonomy template names.
* Make check_template_fallbacks() return &str.
* Add tests for check_template_fallbacks
* Next version
* Added tests for shortcode insertion
* Added TOC tests
* Added test for #1475 and #1355
* Basic internal / external links tests
* Added integration test
* Added pseudocode and started on logos
* Logos parsing for shortcodes
* Fixed string literal parsing
Moved string literal parsing to a new lexer in order to have greater
control of control characters which are parsed. This fixes the bug that
was present in the `string_from_quoted` function and also moves the
`QuoteType` to be in the `ArgValueToken`.
* Moved string literal logic to seperate module
* Added square bracket notation for variables
* Error handling rewritten
Remove the Result from the `fetch_shortcodes` function. Added proper
messages within the internal parsing.
* Reorganized and documented the shortcode submodule
* Added all logic for ShortcodeContext spans
* Added working insertion code for MD files
* Made functions generic over Markdown or HTML
* Add check for embedding bodies
* Structure of main function clear
* Added test for `new_with_transforms` function
* It runs!
* Added the code for handling p-ed html shortcodes
* Removed placeholders in markdown function
* Adjusted integration tests
* fetch_shortcodes now also returns a string
* Start of HTML insertion
* Kinda working everything
* Loading of shortcodes and builtins
* Fix tests
* Some missed fixes
* Tweaks + fmt
* Remove string literal handling
* Fix benches
* Grab shortcode def only once per site
* Fix benches
* Rewrite of parser
* Fix tests
* Add test for #1655
* Re-enable integration test
* Add test for #1601
* Add test for #1600
* Add test for #1500
* Add test for #1320
* Fix test on windows?
Co-authored-by: Gijs Burghoorn <g.burghoorn@gmail.com>
* Pass lang to shortcodes context
* Add tests for lang in shortcodes
* Lang is passed to anchor-link.html template
* Document passing lang to shortcodes/anchor-link.html
Add a test to make sure lang can be overriden by passing an explicit argument to the shortcode,
for usage in the markdown filter where the language context is not available.
* Update docs for more information on shortcodes+i18n+markdown() filter
Co-authored-by: southerntofu <southerntofu@thunix.net>
* Consider the site's output path in search_for_file
The search_for_file helper function now accepts an optional
output path. If passed, the file will also be searched there.
This is used in the get_url function to search in the
Site::output_path.
In practice, this means cachebust works for files in the
output path.
* Make output_dir required in search_for_file
* Update docs for file searching logic
* Add test for new file searching behavior
* cargo/manifests: allow user to use native-tls ...
... if `ring` can't be used on the user's platform (e.g. mips/ppc/riscv)
* CI: test for native tls build
* Add class based syntax higlighting + line numbers
* Use fork of syntect for now
* Fix tests
* Fix diff background on inline highlighter
Co-authored-by: evan-brass <evan-brass@protonmail.com>
* Add `num_format` filter for displaying formatted numbers
* Register the filter
* Update docs
* Make `locale` argument required
* Revert "Make `locale` argument required"
This reverts commit 9cdbf28591.
* Pull the default locale from the site config
* Add note about defaults to the docs
* Add missing borrow
* Move image loading code used by get_image_metadata from templates to imageproc
* resize_image: Compute image resize op beforehand and return metadata to caller
* get_image_metdata: Use a serializable response struct
* imageproc: Add integration tests
* imageproc: Assume webp is lossy
* get_image_metadata: Use webp crate for decoding WebP, image is still not very good at it
* imageproc: Test read_image_dimensions in integration tests
* imageproc: Rename read_image_dimensions() as read_image_metadata()
* imageproc: Fix a regression in hash computation
* imageproc: Don't hardcode hashes in integration tests, pattern match them instead
* imageproc: Style fixes
* imageproc: Fix integration tests on Windows (hopefully)
* Add new sorting: UpdateDate that sorts by `meta.updated`.
* Use `max(created, updated)` for sort-by-update-date
This prevents created but never updated articles from appearing at the end/not
appearing at all.
* Fixed failing tests on windows when user is not VssAdministrator.
* Fixed windows specific testcases related to \r
* Added the ability to perform POST requests to load_data
* make tests on windows deal with both \r being there on windows, and \r not being generated as on my personal windows system.
* undo earlier commit eaaa8c3ddd
because it fails on azure buildserver
* added new arguments to the hash for the cache function.
So caching now works as it should
* added new arguments to the hash for the cache function.
* improved documentation of load_data POST with better example.
* added basic derive traits
* changed load_data param contenttype to content_type
* fixed caching issues that went missing?
* format
* made code more idiomatic as suggested by keats
* link_checking: prevent rate-limiting
Fix for https://github.com/getzola/zola/issues/1056.
- assign all links for a domain to the same thread
- reduce number of threads from 32 to 8
- add sleep between HTTP calls
* Add get_link_domain(), use for loops
* Do not sleep after last link for domain
* Avoid quadratic complexity
* remove prints
This updates rendered markdown structures in order to keep track
of all internal links, not anymore limiting to only those targeting
an explicit anchor fragment.
The goal of this rework is to allow building other features, such
as backlinks, on top of the existing collection of internal links.
* fix can not build zola with search/indexing-zh feature
* fix can not build components/utils after enabled indexing-zh feature
error[E0252]: the name `Deserialize` is defined multiple times
--> components/utils/src/de.rs:2:5
|
1 | use serde::{Deserialize, Deserializer};
| ----------- previous import of the macro `Deserialize` here
2 | use serde_derive::Deserialize;
| ^^^^^^^^^^^^^^^^^^^^^^^^^ `Deserialize` reimported here
|
= note: `Deserialize` must be defined only once in the macro namespace of this module
* fix: webp quality level mismatch
* fix: hash collision using the same image ops
Using the same image operations, but for different formats, e.g. `.jpg` and
`.webp`, produced the same hash.
To differentiate between these, the image extension is added to the hash.
* Translations are also generated for the index page (fix#1332)
* More tests for translations
* Even better error message
* Update page count for test
* Patch to fix Windows tests
By @mtolk
Co-authored-by: southerntofu <southerntofu@thunix.net>
* Allow optional whitespace around dash/underscore in filename
Allow file names that are as follows:
2021-01-01 - test.md
To be parsed the same as if they were
2021-01-01-test.md
The slug for both will now just be "test" instead of previously the
first example would have become "2021-01-01-test".
* Add documentation for optional whitespace in filename
* Test that updated regex does not take space after dash
Without content it should be possible to create a file that contains no
newlines after the frontmatter at all, rather than forcing a newline
after the frontmatter.
* Add support for base64-encoded hash values
The global template function 'get_file_hash' can now return a
base64-encoded hash value when its 'base64' parameter is set to true.
See discussion in #519.
* Fix integrity attribute's value in test site
SRI hash values must be base64-encoded.
* Update documentation about 'get_file_hash'
* Fix 'can_get_hash_for_static_files' unit test
* Move `load_tera` to `templates`
I don't know if this is a good place for it, conceptually. I'm moving it
there because I need to use it from `templates`, and `templates` can't
depend on `site`, because there's already a dependency in the opposite
direction.
* Load templates in `markdown` filter
This enables the `markdown` filter to handle shortcodes, as long as
those shortcodes don't access any context variables.
Addresses #1350
* Update documentation of `markdown` filter
* Only load templates for `markdown` filter once
* Clarify `markdown` filter documentation
This is a lightly edited version of what @southerntofu suggested.
* load_data() template function takes a `required` boolean flag
* Update tests for load_data()
* Add test to make sure invalid data always fails in load_data
* Better documentation, fixing a few typos
Co-authored-by: southerntofu <southerntofu@thunix.net>
* Add sort_by=title
* Remove old comment.
* Remove println! debugging
* Minor: text spacing
* Use lexical_sort crate for sort_by title
Co-authored-by: David James <davidcjames@gmail.com>
* Internal links are resolved in tera markdown filter (close#1296#1316)
* Add a test for internal links in markdown filter
Co-authored-by: southerntofu <southerntofu@thunix.net>
* Highlight fallback from extra syntaxes to the theme (close#1309)
* Warning when codeblock language is unknown and cannot be highlighted
* page/section path in codeblock language missing warning
Co-authored-by: southerntofu <southerntofu@thunix.net>
* add shortcode 'invocation' variable to allow a shortcode to track how many times it has been invoked in a given Markdown file
* use closure (implicit struct) instead of explicit struct for invocation tracking
* update variable name to "nth"
* Accept dates presented as strings
Still, if we find a string we involve the TOML parser to make sure the
content of said string would be a correct TOML date. In a pure TOML
world this isn't exactly relevant, but this will come in handy when
using a YAML deserializer.
Signed-off-by: Kevin Ottens <ervin@ipsquad.net>
* Add serde_yaml and test-case dependencies
This will be necessary for the YAML frontmatter handling and
corresponding unit tests.
Signed-off-by: Kevin Ottens <ervin@ipsquad.net>
* Add YAML front matter handling
Signed-off-by: Kevin Ottens <ervin@ipsquad.net>
* Switch RawFrontMatter enum to wrap &str instead of String
Signed-off-by: Kevin Ottens <ervin@ipsquad.net>
* Update the documentation to mention YAML frontmatter
This is just a light update on purpose. There would be no point in
pushing YAML too much, this is mainly here to help people with a backlog
of posts to transition.
Signed-off-by: Kevin Ottens <ervin@ipsquad.net>
* Add support for loading Bibtex data.
* Add load_data() documentation for the bibtex format
* Force bibtex tags to be lower case.
Bibtex tags are case-insensitive, and this works around tera's case-sensitiveness.
* Improve the load_data() documentation for the bibtex format
* Next version
* Remove lines forcing minify_html to false
* Update documentation about minify_html
* Update changelog
Co-authored-by: Vincent Prouillet <balthek@gmail.com>
This introduces `relative-path`, a crate I've written for the specific
purpose of providing platform-neutral operations over paths the same way
they are used in URLs.
This means that `///hello///` == `/hello`, which should do the same as
the existing stripping minus the platform-specific path separators
causing the [bug being referenced](#1169).
* Allow site path to contain underscores
Fixes site.css is not being generated if any part of the path contains
underscores
* Add tests for path with underscores
* Add line highlighting to code blocks
* Fix highlighting of lines
Apparently every line to be highlighted is provided in one chunk.
* Add more documentation to codeblock.rs
* Turn FenceIter into an Iterator
* Move Range to fence.rs
* Add tests
* mention code block output change
* Update snap
* Update themes gallery (#1082)
Co-authored-by: GitHub Action <action@github.com>
* Deployment guide for Vercel
* Change wording a bit
* Update themes gallery (#1122)
Co-authored-by: GitHub Action <action@github.com>
* Add feed autodiscovery documentation (#1123)
* Add feed autodiscovery documentation
* Fix link in template
* Docs/configuration update (#1126)
* Update configuration documentation
- Attempt to split the configuration file into sections to make it more readable and
avoid configuration mistakes (#1056).
- Move translation instructions to the right part.
- Add a bit more explanations to the extra section.
* Take into account @Keats feedbacks
* Remove short notice about translation usage
- A i18n page should be created to better explain it.
* add fix for (#1135) Taxonomies with identical slugs now get merged (#1136)
* add test and implementation for reverse pagination
* incorporate review changes
Co-authored-by: Michael Plotke <bdjnks@gmail.com>
Co-authored-by: Vincent Prouillet <balthek@gmail.com>
Co-authored-by: GitHub Action <action@github.com>
Co-authored-by: Samyak Bakliwal <w3bcode@gmail.com>
Co-authored-by: René Ribaud <uggla@free.fr>
* Doc add a missing arg to `get_taxonomy_url` (#1139)
This feature is already exist, but not in the doc yet
Related #766
* Add minify support
* Add documentation
* Code review
* Fix error in documentation
* Update minify-html to 0.3.6
* Move minify into write_content function
* Fix multiple calls to minify()
* Add test for minified output
* Fix breaking test
Co-authored-by: Ken <2770219+ken0x0a@users.noreply.github.com>
* Per section/subsection feeds
* Added `generate_feed` variable to section front matter.
* Generate atom/rss feeds for sections/subsections that have the
`generate_feed` variable set to true (false by default); this works
independent of the `generate_feed` variable in the root `config.toml`
file, however, the name (and template) of the feed file for each section
is the same as `feed_filename` in `config.toml`, just located in the
root of each section.
* Slightly edited `atom.xml` and `rss.xml` so that they include the
section title (if any), and the url of a section, if it's a section
feed.
* Section feeds: tests
* Changed a couple of sections' front matter in order to generate feeds
for them for the test.
* Changed the can_build_feed test in site package to can_build_feeds and
included some assertions to make sure that section feeds are generated
when requested.
* Section feeds: documentation
* Added information about the section front matter variable
`generate_feed` in the section content page.
* Added information about section feeds in the feeds template page.
* Section feeds fix: use section.path for feed path
* add fix for (#1135) Taxonomies with identical slugs now get merged (#1136)
* update templates so they propperly render taxonomy names
* squash! add fix for (#1135) Taxonomies with identical slugs now get merged (#1136)
reimplement taxonomy deduping
* revert unwanted changes to templates
* add tests for unic in permalinks
* add tests for unic in permalinks
* Change zola serve to load HTML from memory instead of disk
* Be smart about assets copying
* Be a tiny bit smarter on template changes
* Add zola serve --fast
* Make {section, page}.path always start with a slash
Change tests accordingly
* Fix missing leading/trailing slash in current_path of Taxonomy ("tags") and TaxonomyItem ("some-tag")
* Make {Paginator, Pager}.path always start with a slash
Fix Paginator.path missing trailing slash in from_taxonomy()
Change tests accordingly
* Update documentation regarding current_path now always starting with a slash
* Fix asymptomatic inverted logic in filter() for {section, page}.assets
* Add to 3 integration tests several checks for current_path in different templates
* Add a check for current_path in a paginated index section, "/page/2/"
This requires adding two dummy pages in the content root.
* Fix false passing of test on paginator.last due to URL prefix matching
A string formatting such as {name: value} can help prevent this.
* Replace hack for newline support in shortcodes with new hack
* Be a bit more space efficient/accurate with naming
* Boil newline/whitespace shortcode test down to the essentials
* Make sure the new \n and \s chars in old tests are properly represented
* Support markdown templates and shortcodes
* Refactoring .md/.html shortcode behaviour
* Add test for markdown shortcodes
* Add an html output test for markdown based shortcodes
* Add documentation for Markdown based shortcodes
* Tables in config.extra can be merged with those in theme.extra
* Don't panic with invalid config type, but propagate an error
* Recursively merge config/theme extra sections
Co-authored-by: southerntofu <southerntofu@thunix.net>
* Update sitemap.rs
When paginate_by is zero, set number_pagers to 1 so at least 1 sitemap section is pushed
* paginate_by updates
Introduce section.paginate_by, use value if it exists, removes now
unnecessary filter
Co-authored-by: Justin Turpin <justinturpin@pop-os.localdomain>
Prior to this change, only sass files starting with _ were ignored by
Zola's sass compiler. This made using sass frameworks incredibly
inconvenient, as Zola attempted to compile every single sass file in the
framework, and inevitably errored due to them not being standalone. For
example, to use the Bulma framework, you had to manually add an
underscore to the beginning of *every* sass file in it so Zola would
stop trying to compile them as standalone css files. Now you can change
the directory name to _bulma and have the same result.
* Site templates can replace theme templates
* Integrate test case within test_site/
* Full backwards-compatibility with testcase in test_site
* Refine test case
* Call parent's block in child template for test case
* Check both templates are applied
* Follow testing advice
* Test for 'include' in themes and shortcodes
* Documentation for themes and how to extend them
Co-authored-by: Vincent Prouillet <balthek@gmail.com>
* Add support for SVG files to `get_image_metadata`
* Add support for SVG files to `get_image_metadata`
* Update documentation after adding SVG support
* Don't panic on bad date strings
Instead, show a helpful error message explaining only RFC3339 is
supported.
Fixes#993.
* Try to parse the full range of TOML date formats
* Fix get_url(cachebust=true)
The previous implementation looked for static files in the wrong place.
Look in static_path, output_path and content_path. If file can't be
found in any of them, print a warning to stderr and fall back to using
a timestamp.
Add a test to ensure it also works in practice, not just in theory.
* Implement get_file_hash
If there is no response from the server, `load_data` would panic
with: `response status`.
This patch removes the `expect` in favor of an error message that we
couldn't get a response from the server for a given url.
Cache-busting was previously done with a compile-time timestamp. Change
to the SHA-256 hash of the file to avoid refreshing unchanged files.
The implementation could be used to add a new global fn (say,
get_file_hash) for subresource integrity use, but that's for another
commit.
Fixes#519.
Co-authored-by: Vincent Prouillet <balthek@gmail.com>
Also change a few other things to use it, as noted in CHANGELOG.md.
TODO:
- Write a couple of tests: updated field, last_updated template variable
One slight open questions: should `updated` default to the value of
`date` rather than to None? Then pages with `date` could safely assume
`updated`.
The variable name matched the RSS tag it ended up in, but was misleading
about what it actually was—because if you actually want “last build
date”, you should use `now()`. (Due to the potential for edits, I think
that either there should be an official `updated` field on pages, or
that these templates should use `now()`.)
This includes several breaking changes, but they’re easy to adjust for.
Atom 1.0 is superior to RSS 2.0 in a number of ways, both technical and
legal, though information from the last decade is hard to find.
http://www.intertwingly.net/wiki/pie/Rss20AndAtom10Compared
has some info which is probably still mostly correct.
How do RSS and Atom compare in terms of implementation support? The
impression I get is that proper Atom support in normal content websites
has been universal for over twelve years, but that support in podcasts
was not quite so good, but getting there, over twelve years ago. I have
no more recent facts or figures; no one talks about this stuff these
days. I remember investigating this stuff back in 2011–2013 and coming
to the same conclusion. At that time, I went with Atom on websites and
RSS in podcasts. Now I’d just go full Atom and hang any podcast tools
that don’t support Atom, because Atom’s semantics truly are much better.
In light of all this, I make the bold recommendation to default to Atom.
Nonetheless, for compatibility for existing users, and for those that
have Opinions, I’ve retained the RSS template, so that you can escape
the breaking change easily.
I personally prefer to give feeds a basename that doesn’t mention “Atom”
or “RSS”, e.g. “feed.xml”. I’ll be doing that myself, as I’ll be using
my own template with more Atom features anyway, like author information,
taxonomies and making the title field HTML.
Some notes about the Atom feed template:
- I went with atom.xml rather than something like feed.atom (the .atom
file format being registered for this purpose by RFC4287) due to lack
of confidence that it’ll be served with the right MIME type. .xml is a
safer default.
- It might be nice to get Zola’s version number into the <generator>
tag. Not for any particularly good reason, y’know. Just picture it:
<generator uri="https://www.getzola.org/" version="0.10.0">
Zola
</generator>
- I’d like to get taxonomies into the feed, but this requires exposing a
little more info than is currently exposed. I think it’d require
`TaxonomyConfig` to preferably have a new member `permalink` added
(which should be equivalent to something like `config.base_url ~ "/" ~
taxonomy.slug ~ "/"`), and for the feed to get all the taxonomies
passed into it (`taxonomies: HashMap<String, TaxonomyTerm>`).
Then, the template could be like this, inside the entry:
{% for taxonomy, terms in page.taxonomies %}
{% for term in terms %}
<category scheme="{{ taxonomies[taxonomy].permalink }}"
term="{{ term.slug }}" label="{{ term.name }}" />
{% endfor %}
{% endfor %}
Other remarks:
- I have added a date field `extra.updated` to my posts and include that
in the feed; I’ve observed others with a similar field. I believe this
should be included as an official field. I’m inclined to add author to
at least config.toml, too, for feeds.
- We need to have a link from the docs to the source of the built-in
templates, to help people that wish to alter it.
Two main purposes of changes here:
- To make the formatting and indentation of the raw output prettier;
- To simplify the HTML yielded by dropping unnecessary bits.
The 404 changes are a tad more extensive, altering the actual wording to
match conventional stub 404 pages a little more.
The HTML spec doesn’t require it, and I prefer to omit it. This has been
bothering me for ages, but I hadn’t gotten round to fixing it yet.
This can cause nominally invalid HTML to be emitted, if `</body>` was
omitted but `</html>` was present, but that’s unlikely to happen, and
this is for development purposes only, and the right thing will happen
anyway in all environments (per browser behaviour and spec).
I don’t think this warrants a changelog entry.
* get_url takes an optionnal parameter
* Documentation about the 'lang' parameter of 'get_url'
Co-authored-by: Gaëtan Caillaut <gaetan.caillaut@live.com>
Remove a link tag mistakenly imported from Atom XML namespace. The tag
was used to specify the link to the feed itself which is not supported
by RSS 2.0:
https://cyber.harvard.edu/rss/rss.htmlFixes#967
Many servers will return errors (e.g. 400/403) to requests that do not
set a User-Agent header. This results in issues in both the link_checker
and load_data components. With the link_checker these are false positive
dead links. In load_data, remote data fails to be fetched. To mitigate
this issue, this sets a default User-Agent of
$CARGO_PKG_NAME/$CARGO_PKG_VERSION
Note that the root cause of this regression from zola v0.9.0 is that
reqwest 0.10 changed their default behavior and no longer sets a
User-Agent by default:
https://github.com/seanmonstar/reqwest/pull/751Fixes#950.
For the site integration tests, we have a file of common code which is
used by multiple files in `tests/`. However, not all functions in
this file are used by all files in `tests/`.
As Cargo compiles each `tests/*.rs` file as a separate crate, this
means that some of these crates end up with unused code. Rust notices
this and prints a warning.
Let's tell Rust that we don't care about dead code in this file so
that the warning is not printed.
* Detect empty links on markdown rendering and issue an error
* Add a test for empty links stopping rendering with an error
* Assert error message is the expected one
When testing for empty links detection compare the error message
to make sure it's the correct error that stopped the process
and not some unrelated issue.
The issue with the check_site test hanging and timing out seems to
be related to a similar reqwest issue, which was ultimately due to
an upstream bug in tokio and may be fixed in tokio 0.2.7 onward.
* Restore #![feature(test)] and extern crate test; statements, which
were mistakenly removed as part of the Rust 2018 edition migration.
* Fix rendering benchmark's usage of RenderContext. 6 parameters were
provided when 5 were expected.
* Treat 304 (Not Modified) requests as valid.
* Add tests for 301-to-200 links, 301-to-404 links, and 500 links.
This helps to test redirections and the previously-added
response.status() checking for non-success status codes in check_url().
* Make names for HTTP mock paths unique, to avoid weird behavior. It
seems like mocks with the same path can potentially bleed between
tests, so you may end up with an unexpected response which causes the
test to sometimes pass and sometimes fail.
* Fix Clippy warnings about String::from(format!()).
Certain tests involving HTTP requests were sometimes hanging
indefinitely, so this uses Mockito for HTTP mocking. This seemingly
resolves the issue and makes these tests more reliable.
The existing can_fail_404_links test has been renamed to
can_fail_unresolved_links, to represent what actually occurs in the
test. The can_fail_404_links test now deals with a proper 404
response.
Just to be clear, the check_site test in the site component will
still create outgoing HTTP requests (due to the URLs used in the
test_site), so this commit only uses HTTP mocking where possible.
The can_fail_404_links() test doesn't encounter a 404 response in
actuality, since the google.comys domain doesn't resolve. When the
test is updated such that the response's status code is a 404, the
test fails because the check_url() function doesn't handle
non-success responses how the test's assertions expect. This commit
updates check_url() to handle non-success responses, treating them
much like errors.
* maybe_slugify() only does simple sanitation if config.slugify is false
* slugify is disabled by default, turn on for backwards-compatibility
* First docs changes for optional slugification
* Remove # from slugs but not &
* Add/fix tests for utf8 slugs
* Fix test sites for i18n slugs
* fix templates tests for i18n slugs
* Rename slugify setting to slugify_paths
* Default slugify_paths
* Update documentation for slugify_paths
* quasi_slugify removes ?, /, # and newlines
* Remove forbidden NTFS chars in quasi_slugify()
* Slugification forbidden chars can be configured
* Remove trailing dot/space in quasi_slugify
* Fix NTFS path sanitation
* Revert configurable slugification charset
* Remove \r for windows newlines and \t tabulations in quasi_slugify()
* Update docs for output paths
* Replace slugify with slugify_paths
* Fix test
* Default to not slugifying
* Move slugs utils to utils crate
* Use slugify_paths for anchors as well
* Add path to `TranslatedContent`
This makes it possible to retrieve the translated page through the `get_page` function.
* Use TranslatedContent::path field in test_site_i18n
Use it with the `get_page` function to get a reference to the page object.
* Compute canonical path before adjusting parent path
* Don't use adjusted `parent` to recalculate `canonical` in `find_language`
* Add regression tests
- Test for correct canonical field when calling `new_page`
- Test for correct canonical field after calling `find_language`