Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • docker
  • hugo-prepare-migration
  • master
  • 2021.03.3
  • 2021.04.4
  • 2021.04.5
  • 2021.05.6
  • 2021.12.10
  • 2021.12.11
  • 2021.12.7
  • 2021.12.8
  • 2021.12.9
  • 2022.04.16
13 results

Target

Select target project
No results found
Select Git revision
  • master
  • patch-1
2 results
Show changes
59 files
+ 450
508
Compare changes
  • Side-by-side
  • Inline

Files

+0 −1
Original line number Original line Diff line number Diff line
@@ -5,7 +5,6 @@ include/
lib/
lib/
local/
local/
output/
output/
pelican-plugins/
pelican.pid
pelican.pid
pelicanconf.pyc
pelicanconf.pyc
pip-selfcheck.json
pip-selfcheck.json

.gitlab-ci.yml

0 → 100644
+56 −0
Original line number Original line Diff line number Diff line
stages:
  - build
  - package
  - release
  - deploy

build-job:
  image: python:slim
  stage: build
  rules:
    - if: '$CI_COMMIT_BRANCH'
  script:
    - mkdir -p /usr/share/man/man1 # Because of https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=863199
    - apt-get update && apt-get install -y plantuml graphviz
    - pip install -r requirements.txt
    - pelican content -s publishconf.py -e OUTPUT_PATH='"public"'
  artifacts:
    paths:
      - public/
    name: build
    expire_in: 7 days

package-job:
  stage: package
  image: curlimages/curl:latest
  script:
    - PACKAGE_VERSION="$(date +%Y.%m).${CI_PIPELINE_IID}"
    - PACKAGE_REGISTRY_URL="${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/releases/${PACKAGE_VERSION}"
    - echo 'Creating generic package'
    - cd public/
    - tar cvf $HOME/website.tar *
    - ls -al
    - 'curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file $HOME/website.tar ${PACKAGE_REGISTRY_URL}/website.tar'
  rules:
    - if: '$CI_COMMIT_BRANCH == "master"'

release-job:
  stage: release
  image: registry.gitlab.com/gitlab-org/release-cli:latest
  rules:
    - if: '$CI_COMMIT_BRANCH == "master"'
  script:
    - PACKAGE_VERSION="$(date +%Y.%m).${CI_PIPELINE_IID}"
    - PACKAGE_REGISTRY_URL="${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/releases/${PACKAGE_VERSION}"
    - echo 'Creating release'
    - release-cli create --name "$PACKAGE_VERSION" --tag-name $PACKAGE_VERSION --assets-link "{\"name\":\"wesbite.tar\",\"url\":\"$PACKAGE_REGISTRY_URL/website.tar\"}"

pages:
  stage: deploy
  rules:
    - if: '$CI_COMMIT_BRANCH == "master"'
  script:
    - echo "Publishing to Gitlab pages"
  artifacts:
    paths:
      - public/
+8 −7
Original line number Original line Diff line number Diff line
@@ -8,14 +8,14 @@ You may want to reproduce this website locally, for developement purposes for ex


Clone the sources
Clone the sources


    git clone https://github.com/duniter/website.git
    git clone https://git.duniter.org/websites/website_en.git


Install python stuff
Install python stuff


    cd website
    cd website_en
    virtualenv .
    python3 -m venv .venv
    source bin/activate
    source .venv/bin/activate
    pip install pelican pelican-youtube markdown beautifulsoup4
    pip install -r requirements.txt


Install system dependencies for plantuml plugin (plantuml and GraphViz utilities) :
Install system dependencies for plantuml plugin (plantuml and GraphViz utilities) :
```bash
```bash
@@ -25,10 +25,11 @@ apt install plantuml graphviz
Generate the site
Generate the site


    pelican
    pelican
    # or python3 -m pelican


Serve it
Serve it


    ./develop_server.sh restart 8557
    pelican --listen --autoreload --port 8557 # port is hardcoded in develop conf file


The website should be available at http://localhost:8557.
The website should be available at http://localhost:8557.


@@ -38,7 +39,7 @@ You just need to give the production configuration file to Pelican:


    pelican -s publishconf.py
    pelican -s publishconf.py


You may want to change the production parameters, like the domain name: just edit `publishconf.py` and modify the `SITEURL` to whatever value you want.
You may want to change the production parameters, like the domain name: just edit `publishconf.py` and modify the `SITEURL` to whatever value you want. You can also override any other value simply by adding it.


For example if you want to host the site at `https://my.website.org`, set:
For example if you want to host the site at `https://my.website.org`, set:


Original line number Original line Diff line number Diff line
@@ -20,7 +20,7 @@ The presentation was in French, but I took the time to translate it in case you
This day was an opportunity for client softwares to be presented. Let's see the two firsts: *CuteCoin* and *uCoinApps*.
This day was an opportunity for client softwares to be presented. Let's see the two firsts: *CuteCoin* and *uCoinApps*.
### Cutecoin
### Cutecoin


The morning was dedicated to [Cutecoin](https://github.com/duniter/sakia), the very first client of uCoin software. We steped through:
The morning was dedicated to [Cutecoin](https://github.com/duniter/sakia), the very first client of uCoin software. We stepped through:


*   Current state of the application
*   Current state of the application
*   Work to be done
*   Work to be done
@@ -75,21 +75,21 @@ The morning has seen the demonstration by Stéphane Laborde, the author of the R


**The RTM in color** ([english](http://cuckooland.free.fr/TheRtmInColor.html) or [french](http://cuckooland.free.fr/LaTrmEnCouleur.html) version) is a brilliant web application to simulate and explore the concepts of a Freedom Money.
**The RTM in color** ([english](http://cuckooland.free.fr/TheRtmInColor.html) or [french](http://cuckooland.free.fr/LaTrmEnCouleur.html) version) is a brilliant web application to simulate and explore the concepts of a Freedom Money.


![](/content/images/2015/08/rtm_in_color-1024x664.png)
![Screenshot of the "The RTM in color" tool](/content/images/2015/08/rtm_in_color-1024x664.png)


**The RTM for the kids** (available in [french](http://cuckooland.free.fr/LaTrmPourLesEnfants.html) only) is an interactive presentation trying to explain what is a Freedom Money and the RTM to kids, thanks to Elise and its fairy friend:
**The RTM for the kids** (available in [french](http://cuckooland.free.fr/LaTrmPourLesEnfants.html) only) is an interactive presentation trying to explain what is a Freedom Money and the RTM to kids, thanks to Elise and its fairy friend:


![](/content/images/2015/08/rtm_for_the_kids.png)
![Image of the RTM for kids](/content/images/2015/08/rtm_for_the_kids.png)


### Subscription to metab_brouzouf currency
### Subscription to metab_brouzouf currency


The afternoon was the occasion for people to try Cutecoin and [subscribe to metab_brouzouf currency](http://forum.ucoin.io/t/subscribing-to-meta-brouzouf-testing-currency)! As you can see, we now are about 23 active members testing uCoin:
The afternoon was the occasion for people to try Cutecoin and [subscribe to metab_brouzouf currency](http://forum.ucoin.io/t/subscribing-to-meta-brouzouf-testing-currency)! As you can see, we now are about 23 active members testing uCoin:


![](/content/images/2015/08/wot_fmm5.png)
![A web of trust snapshot](/content/images/2015/08/wot_fmm5.png)


And here is the currency overview:
And here is the currency overview:


![](/content/images/2015/08/metab_fmm5.png)
![uCoin currency snapshot](/content/images/2015/08/metab_fmm5.png)


## Conclusion
## Conclusion


Original line number Original line Diff line number Diff line
@@ -17,7 +17,7 @@ For those who hadn't followed closely this experiment, here are some recalls to


The uCoin project started during summer 2013. After a year and a half of development, on January 2015, the bases were considered established and the first pieces of code ready to be tested. It was then important to propose a first currency, was it a testing one, to allow other developers to produce *client softwares* equiped with graphical interfaces easing the money usage.
The uCoin project started during summer 2013. After a year and a half of development, on January 2015, the bases were considered established and the first pieces of code ready to be tested. It was then important to propose a first currency, was it a testing one, to allow other developers to produce *client softwares* equiped with graphical interfaces easing the money usage.


<center>[![](https://camo.githubusercontent.com/39705402deb44e50a1b48b5ed1206394593278dd/68747470733a2f2f7261772e6769746875622e636f6d2f75636f696e2d696f2f73616b69612f6d61737465722f73616b69612e706e67)](http://sakia-wallet.org)</center> <center>_Logo of the first client: Sakia software_</center>
<center>[![Sakia logo](https://camo.githubusercontent.com/39705402deb44e50a1b48b5ed1206394593278dd/68747470733a2f2f7261772e6769746875622e636f6d2f75636f696e2d696f2f73616b69612f6d61737465722f73616b69612e706e67)](http://sakia-wallet.org)</center> <center>_Logo of the first client: Sakia software_</center>


Indeed, even if uCoin is the software at the heart of the money, its role *is not* to manage *your* transactions specifically, *but to handle any document* making it possible to live.
Indeed, even if uCoin is the software at the heart of the money, its role *is not* to manage *your* transactions specifically, *but to handle any document* making it possible to live.


@@ -40,7 +40,7 @@ We can only observe that this objective, at the end of the experiment, was reach


It's worth noting an active contributor of [YunoHost](http://yunohost.org) team also developed [a uCoin packet for YunoHost](https://github.com/duniter/duniter_ynh) greatly easing the installation of uCoin for self-hosting addicted people!
It's worth noting an active contributor of [YunoHost](http://yunohost.org) team also developed [a uCoin packet for YunoHost](https://github.com/duniter/duniter_ynh) greatly easing the installation of uCoin for self-hosting addicted people!


<center>[![](https://avatars1.githubusercontent.com/u/1519495?v=3&s=200)](http://yunohost.org/)</center>
<center>[![YunoHost logo](https://avatars1.githubusercontent.com/u/1519495?v=3&s=200)](http://yunohost.org/)</center>


### The known limits
### The known limits


@@ -60,8 +60,6 @@ Finally, the lifetime of **1 month** for certifications and memberships is way t


For these reasons, no chance for this money to stay in time.
For these reasons, no chance for this money to stay in time.


<center>![](http://forum.ucoin.io/uploads/default/original/1X/da2e4d72317b4bb205d2b56001bb1add75435113.png)</center>

## The experiment results
## The experiment results


Despite these parameters which promised the early end of this testing currency, this latter totaly played its role notably because [several client software were borns](#thefirstclients), but also no less than **115 users** have actively participated the currency, and this despite of the project youth which requires a certain effort to reach the status of individual creating money.
Despite these parameters which promised the early end of this testing currency, this latter totaly played its role notably because [several client software were borns](#thefirstclients), but also no less than **115 users** have actively participated the currency, and this despite of the project youth which requires a certain effort to reach the status of individual creating money.
@@ -113,5 +111,3 @@ As said earlier, this testing currency was an occasion to discover the limits of
We have already implemented its next version **0.2** which carries a lot of newness. And so, what will happen?
We have already implemented its next version **0.2** which carries a lot of newness. And so, what will happen?


The next couple of weeks will tell you.
The next couple of weeks will tell you.

<center><div style="width: 400px">![](http://forum.ucoin.io/uploads/default/original/1X/5deea7ee59d908a917eb2f099d44e8ee05e50198.png)</div></center> 
Original line number Original line Diff line number Diff line
@@ -9,5 +9,3 @@ Thumbnail: /images/box.svg
Duniter upgrades again to a superior version and is now very close to exploitation level! This version allows to tune the last technical details before thinking seriously about the setup of a real, in-production libre money.
Duniter upgrades again to a superior version and is now very close to exploitation level! This version allows to tune the last technical details before thinking seriously about the setup of a real, in-production libre money.


To get more details concerning this version, and to update your installation, [please go to the official announcement (french)](https://forum.duniter.org/t/nouvelle-version-0-40-vers-un-protocole-dexploitation/1334) made on the forum.
To get more details concerning this version, and to update your installation, [please go to the official announcement (french)](https://forum.duniter.org/t/nouvelle-version-0-40-vers-un-protocole-dexploitation/1334) made on the forum.

![](https://forum.duniter.org/uploads/default/optimized/2X/e/e77c36e74254de2b20365284782b956eef96a496_1_690x417.png)
Original line number Original line Diff line number Diff line
@@ -78,7 +78,7 @@ PercentRot: 0.67 # => 33.5% of calculators are excluded


### With Duniter Desktop:
### With Duniter Desktop:


![](./images/gune-test-restarted/sync.png)
![Screenshot showing how to synchronize](./images/gune-test-restarted/sync.png)


### With Duniter Server:
### With Duniter Server:


Original line number Original line Diff line number Diff line
@@ -20,7 +20,7 @@ You will also find the interventions of:
* Eloïs which presents its specialized node [duniter-currency-monit](https://github.com/duniter/duniter-currency-monit)
* Eloïs which presents its specialized node [duniter-currency-monit](https://github.com/duniter/duniter-currency-monit)
* Kimamila which presents the new features of Cesium
* Kimamila which presents the new features of Cesium


![](./images/rml9/paperwallet.png)
![A Paperwallet](./images/rml9/paperwallet.png)


## RML10 in Montpellier
## RML10 in Montpellier


Original line number Original line Diff line number Diff line
@@ -6,7 +6,7 @@ Slug: duniter-rmll2017
Authors: cgeek
Authors: cgeek
Thumbnail: /images/calendar.svg
Thumbnail: /images/calendar.svg


[![](../images/rmll2017.png)](https://2017.rmll.info/)
[![RML banner](./images/rmll2017.png)](https://2017.rmll.info/)


The 2017 Worldwide Free Software Meeting (RMLL) will take place in Saint-Étienne from 1st to 7th July 2017.
The 2017 Worldwide Free Software Meeting (RMLL) will take place in Saint-Étienne from 1st to 7th July 2017.


Original line number Original line Diff line number Diff line
@@ -36,11 +36,11 @@ The Cesium client was historically delivered with Duniter. With the arrival of m


## Synchronization
## Synchronization


> <span class="icon">![](../images/icons/white_check_mark.png)</span> No need to resynchronize. 
> <span class="icon">![White check mark](../images/icons/white_check_mark.png)</span> No need to resynchronize. 


## Compatibility
## Compatibility


> <span class="icon">![](../images/icons/white_check_mark.png)</span> Compatible with Ğ1.
> <span class="icon">![White check mark](../images/icons/white_check_mark.png)</span> Compatible with Ğ1.


-----
-----


Original line number Original line Diff line number Diff line
@@ -15,7 +15,7 @@ In reality, it goes beyond a simple ergonomic change. Small tour of the owner.


First, the ergonomics was revised: we wanted the site to be more attractive and not hinder its consultation. Some extra images and a revised layout avoid a too austere reception:
First, the ergonomics was revised: we wanted the site to be more attractive and not hinder its consultation. Some extra images and a revised layout avoid a too austere reception:


![]({filename}./images/rework/change.png)
![Screenshot of the website before and after the change]({static}./images/rework/change.png)


## A fully editable site
## A fully editable site


@@ -23,7 +23,7 @@ One of the great novelties: the site is now [entirely editable](../wiki/enhance-


You will find on each page in the sidebar a button "Edit page on GitHub" or "Edit article on GitHub". It looks like this:
You will find on each page in the sidebar a button "Edit page on GitHub" or "Edit article on GitHub". It looks like this:


![]({filename}./images/wiki/btn_modifier.png)
![Screenshot of the newly available edit button]({static}./images/wiki/btn_modifier.png)


You will be able to propose modifications or even add new content to this site. A simple validation of our part, and here is the modified site!
You will be able to propose modifications or even add new content to this site. A simple validation of our part, and here is the modified site!


Original line number Original line Diff line number Diff line
@@ -18,11 +18,11 @@ This patch has been tested on a network node Ğ1, which immediately reveals node


## Synchronization
## Synchronization


> <span class="icon">![](../images/icons/white_check_mark.png)</span>No need to resynchronize.
> <span class="icon">![White check mark](../images/icons/white_check_mark.png)</span>No need to resynchronize.


## Compatibility
## Compatibility


> <span class="icon">![](../images/icons/white_check_mark.png)</span> Compatible with Ğ1.
> <span class="icon">![White check mark](../images/icons/white_check_mark.png)</span> Compatible with Ğ1.


-----
-----


Original line number Original line Diff line number Diff line
@@ -20,11 +20,11 @@ For details on all these changes, see [release notes](https://github.com/duniter


## Synchronization
## Synchronization


> <span class="icon">![](../images/icons/white_check_mark.png)</span> No need to resynchronize.
> <span class="icon">![White check mark](../images/icons/white_check_mark.png)</span> No need to resynchronize.


## Compatibility
## Compatibility


> <span class="icon">![](../images/icons/white_check_mark.png)</span> Compatible with Ğ1.
> <span class="icon">![White check mark](../images/icons/white_check_mark.png)</span> Compatible with Ğ1.


-----
-----


Original line number Original line Diff line number Diff line
@@ -21,11 +21,11 @@ This new version brings mainly a lot of important fixes for the stability of the


## Synchronization
## Synchronization


> <span class="icon">![](../images/icons/white_check_mark.png)</span> No need to resynchronize.
> <span class="icon">![White check mark](../images/icons/white_check_mark.png)</span> No need to resynchronize.


## Compatibility
## Compatibility


> <span class="icon">![](../images/icons/white_check_mark.png)</span> Compatible with Ğ1.
> <span class="icon">![White check mark](../images/icons/white_check_mark.png)</span> Compatible with Ğ1.


-----
-----


Original line number Original line Diff line number Diff line
@@ -76,7 +76,7 @@ It is of the utmost importance that we remain free from any state or corporation


* __In-degree of vertex A__: number of incoming edges / head ends to A.
* __In-degree of vertex A__: number of incoming edges / head ends to A.


![degress of a vertex diagram]({filename}/images/wiki/degrees.jpg)
![degress of a vertex diagram]({static}/images/wiki/degrees.jpg)


* __Path__: -aka “walk”- path to follow to get from vertex A to vertex B. 
* __Path__: -aka “walk”- path to follow to get from vertex A to vertex B. 


@@ -128,11 +128,11 @@ The Duniter WoTs -one per currency- work with a set of eight fundamental rules,


Let’s now define the distance rule:
Let’s now define the distance rule:


> **Distance rule**: member A is said to observe this rule if and only if for a subset xPercent % of referent members R there exists a path of length less than or equal to `stepMax` between R and A.**
> **Distance rule**: member A is said to observe this rule if and only if for a subset `xPercent`% of referent members R there exists a path of length less than or equal to `stepMax` between R and A.**


Referent members only exist so that the distance rule can take effect, they have no special privileges over non-referent members.
Referent members only exist so that the distance rule can take effect, they have no special privileges over non-referent members.
In a perfect web, that is one in which each member has certified all members he/she legitimately can, all members would be referent members. However, because the web progressively grows in size and because members die and are replaced by new ones, there are always members at any given time `t` who haven’t yet certified all members they legitimately could. These members would hinder the evolution of the web if they were taken into account in the calculation of the distance rule and the web would effectively stop growing. 
In a perfect web, that is one in which each member has certified all members he/she legitimately can, all members would be referent members. However, because the web progressively grows in size and because members die and are replaced by new ones, there are always members at any given time `t` who haven’t yet certified all members they legitimately could. These members would hinder the evolution of the web if they were taken into account in the calculation of the distance rule and the web would effectively stop growing. 
-You can see what would happen if the notion of ‘referent member’ didn’t exist by going to the ‘gaussianWotQuality’ page on [currency-monit](https://g1-monit.librelois.fr/gaussianWotQuality?lg=en&unit=quality) and activating ‘if the concept of referent members didn’t exist’-.
-You can see what would happen if the notion of ‘referent member’ didn’t exist by going to the ‘gaussianWotQuality’ page on [currency-monit](https://monit.g1.nordstrom.duniter.org/gaussianWotQuality?lg=en&unit=quality) and activating ‘if the concept of referent members didn’t exist’-.


> **When is the distance rule applied?**
> **When is the distance rule applied?**


@@ -153,13 +153,13 @@ Every single member -or old member who hasn’t revoked his identity or been exc
A new request will be stored in the ‘pool’ for a maximum of `msWindow` seconds before it’s included in the blockchain. Once again, this can only happen once/if the member meets both the `siqQty` rule and the distance rule -if these criterion are already matched it’s just a case of waiting for a new block to be mined-.
A new request will be stored in the ‘pool’ for a maximum of `msWindow` seconds before it’s included in the blockchain. Once again, this can only happen once/if the member meets both the `siqQty` rule and the distance rule -if these criterion are already matched it’s just a case of waiting for a new block to be mined-.


If a member hasn’t requested a renewal for longer than `msValidity` seconds, he/she automatically ceases being a member. From this moment on, the ex-member has another `msValidity` window to renew his/her membership.
If a member hasn’t requested a renewal for longer than `msValidity` seconds, he/she automatically ceases being a member. From this moment on, the ex-member has another `msValidity` window to renew his/her membership.
When this period of `2 × msValidity runs out, the membership will expire and this identity will never be available for use again in the web. If the person so desires, he/she will have to start from zero to regain access to the WoT.
When this period of `2 × msValidity` runs out, the membership will expire and this identity will never be available for use again in the web. If the person so desires, he/she will have to start from zero to regain access to the WoT.


## 4. Rule of certification lifespan (`sigValidity`)
## 4. Rule of certification lifespan (`sigValidity`)


All certifications included in the blockchain expire **sigValidity** seconds after they were **issued**.
All certifications included in the blockchain expire `sigValidity` seconds after they were **issued**.


/!\ The issuance and the inclusion of a certification in the blockchain occur at different times. When member A issues a certification at time t1, it gets stored in the pool starting at t1 and only finds its way into the blockchain at t2 when all of the web’s rules are observed. Several weeks can thus go by between t1 and t2!!!
/!\ The issuance and the inclusion of a certification in the blockchain occur at different times. When member A issues a certification at time _t1_, it gets stored in the pool starting at _t1_ and only finds its way into the blockchain at _t2_ when all of the web’s rules are observed. Several weeks can thus go by between _t1_ and _t2_!


## 5. Rule of limited supply of active certifications (`sigStock`)
## 5. Rule of limited supply of active certifications (`sigStock`)


@@ -167,7 +167,6 @@ By ‘active certifications’ we refer to certifications included in the blockc


The total of active certifications issued by any member at any single time must be less than or equal to `sigStock`. When this threshold is reached the member will have to wait for one of his active certifications to expire before he/she can issue a new one. 
The total of active certifications issued by any member at any single time must be less than or equal to `sigStock`. When this threshold is reached the member will have to wait for one of his active certifications to expire before he/she can issue a new one. 



## 6. Rule of the time period between two certification issuances. (`sigPeriod`)
## 6. Rule of the time period between two certification issuances. (`sigPeriod`)


As soon as a certification issued by member A gets included in the blockchain, he/she will be unable to issue a new one before another `sigPeriod` seconds.
As soon as a certification issued by member A gets included in the blockchain, he/she will be unable to issue a new one before another `sigPeriod` seconds.
@@ -196,7 +195,7 @@ As soon as the genesis block has been created, the other identities can start mi


The distance rule is there to curb the maximum size of a Sybil region as well as that of the monetary community as a whole. The `xpercent` parameter prevents the creation of a ‘faction’ that could take hold of the blockchain.
The distance rule is there to curb the maximum size of a Sybil region as well as that of the monetary community as a whole. The `xpercent` parameter prevents the creation of a ‘faction’ that could take hold of the blockchain.


![Sybil region]({filename}/images/wiki/wot-sybil.jpg)
![Sybil region]({static}/images/wiki/wot-sybil.jpg)


The Sybil regions are isolated from the rest of the graph in the sense that they can only receive certifications from other ill-intentioned Sybil members. As a consequence, the shortest edge/path between a legitimate member and a Sybil one has to have the attack’s author as an endpoint. The maximum depth the Sybil region can attain is therefore contingent on the distance between the attacking edge-s- and the xpercent% closest referent members, this distance is known as `stepAttackers`.
The Sybil regions are isolated from the rest of the graph in the sense that they can only receive certifications from other ill-intentioned Sybil members. As a consequence, the shortest edge/path between a legitimate member and a Sybil one has to have the attack’s author as an endpoint. The maximum depth the Sybil region can attain is therefore contingent on the distance between the attacking edge-s- and the xpercent% closest referent members, this distance is known as `stepAttackers`.
The maximum size of a Sybil region created by `sigQty` members depends on the L parameter, defined as L = sigQty/sigStock:
The maximum size of a Sybil region created by `sigQty` members depends on the L parameter, defined as L = sigQty/sigStock:
@@ -213,7 +212,7 @@ However we know for a fact that members will never use all of their available ce


Our goal with the Ğ1 is to create a community of about one million members enjoying the world’s first true [catallaxy](https://en.wikipedia.org/wiki/Catallaxy) -free economy with a spontaneous order of things-. Let’s see how we can tweak the pair of sigQty and stepMax- to reach this size:
Our goal with the Ğ1 is to create a community of about one million members enjoying the world’s first true [catallaxy](https://en.wikipedia.org/wiki/Catallaxy) -free economy with a spontaneous order of things-. Let’s see how we can tweak the pair of sigQty and stepMax- to reach this size:


![graphe WoTmoy en fonction de sigQty et stepMax]({filename}/images/wiki/graph-WoTmoy.png)
![graphe WoTmoy en fonction de sigQty et stepMax]({static}/images/wiki/graph-WoTmoy.png)


The maximum size of a Sybil region grows linearly with `sigQty` but exponentially with `stepMax`. Logic has it that we need to keep `stepMax` as low as possible to ensure sufficient strength to the web. The above graph shows that the lowest value of `stepMax` for a web of a million members is of 5. This is an order of magnitude and is likely to be much higher in reality, we cannot measure it for sure.
The maximum size of a Sybil region grows linearly with `sigQty` but exponentially with `stepMax`. Logic has it that we need to keep `stepMax` as low as possible to ensure sufficient strength to the web. The above graph shows that the lowest value of `stepMax` for a web of a million members is of 5. This is an order of magnitude and is likely to be much higher in reality, we cannot measure it for sure.
 
 
@@ -240,14 +239,14 @@ To help us deter a Sybil attack, we’ve decided to impose a minimum period of t


Here is a graph showing the evolution of a Sybil region with the variation of `sigPeriod`:
Here is a graph showing the evolution of a Sybil region with the variation of `sigPeriod`:


![graph of the WoT's size according to sigPeriod and stepAttackers]({filename}/images/wiki/impact_sig_period.png)
![graph of the WoT's size according to sigPeriod and stepAttackers]({static}/images/wiki/impact_sig_period.png)


As you’ll easily be able to tell, there is a strong link between the growth speed of the region and `sigPeriod`. As evidenced here, we need a `sigPeriod` high enough in order to ensure that the legitimate web can grow at least as fast as a Sybil region.
As you’ll easily be able to tell, there is a strong link between the growth speed of the region and `sigPeriod`. As evidenced here, we need a `sigPeriod` high enough in order to ensure that the legitimate web can grow at least as fast as a Sybil region.
In addition, the higher `sigPeriod` is, the more members will exercise their certification power gingerly, the action coming at a higher ‘cost’.
In addition, the higher `sigPeriod` is, the more members will exercise their certification power gingerly, the action coming at a higher ‘cost’.


There are numerous advantages to giving `sigPeriod` a high value and no technical barriers to it, hence our choice of five days. 
There are numerous advantages to giving `sigPeriod` a high value and no technical barriers to it, hence our choice of five days. 


We could have also gone for days days -one week- for the sake of simplicity however there was an underlying idea behind our choice which was quite simply the pace of today’s life. 
We could have also gone for seven days -one week- for the sake of simplicity however there was an underlying idea behind our choice which was quite simply the pace of today’s life.
Certifying someone can be a lengthy process as one needs to make sure he/she is correctly applying the Ğ1 licence and people nowadays wait for the weekend to enjoy a bit of free-time. Thus the idea to allow one to certify at the end of every working week -five days- instead of a whole calendar one.
Certifying someone can be a lengthy process as one needs to make sure he/she is correctly applying the Ğ1 licence and people nowadays wait for the weekend to enjoy a bit of free-time. Thus the idea to allow one to certify at the end of every working week -five days- instead of a whole calendar one.


## 3. Trust me now, trust me forever? (`sigValidity`, `msValidity`)
## 3. Trust me now, trust me forever? (`sigValidity`, `msValidity`)
@@ -260,7 +259,7 @@ To achieve this, certifications have a limited lifetime and members need to seek
Furthermore, a certification with too short a lifetime would foster careless certifying behaviours. The act of certifying must have a ‘perceived’ cost high-enough to make it feel like an important act.
Furthermore, a certification with too short a lifetime would foster careless certifying behaviours. The act of certifying must have a ‘perceived’ cost high-enough to make it feel like an important act.
Lastly, we also wanted this lifetime to be easy enough to remember. 
Lastly, we also wanted this lifetime to be easy enough to remember. 
Historically speaking, we first settled on the values of 
Historically speaking, we first settled on the values of 
`sigPeriod` and `sigStock`, meant one could issue all of his/her certifications in 495 days, one year was therefore not long enough. We deemed three years to bee much and that’s how we agreed on two years in the end.
`sigPeriod` and `sigStock`, meant one could issue all of his/her certifications in 495 days, one year was therefore not long enough. We deemed three years to be too much and that’s how we agreed on two years in the end.


Thinking that a deceased member could continue producing the UD for two long years without anyone benefitting from it was also something we needed to address.
Thinking that a deceased member could continue producing the UD for two long years without anyone benefitting from it was also something we needed to address.
We choose a value of one year for **msValidity**. The act of renewing every year is done through one of the clients interacting with the blockchain, through a simple click on a button.
We choose a value of one year for **msValidity**. The act of renewing every year is done through one of the clients interacting with the blockchain, through a simple click on a button.
+43 −0
Original line number Original line Diff line number Diff line
Title: Duniter v2 with Substrate 🏗
Date: 2022-04-21
Category: duniter
Slug: duniter-substrate
Authors: hugo
Thumbnail: /images/logos/duniter.png

[TOC]

## A necessary and beneficial evolution 👍

Duniter software has seen many evolutions since its launch [in April 2016](/ucoin-rename-duniter), and so have blockchain technologies. While at the time a "home-made" solution was relevant, we believe that it is now better to base our software on widely tested and proven bricks to ensure scalability. We found the [Substrate](https://substrate.io/) blockchain framework to be particularly well suited to our needs. Indeed, its modular architecture by "[pallet](https://docs.substrate.io/v3/getting-started/glossary/#pallet)" will let us assemble bricks developed by professionals and focus on what makes Duniter unique: its web of trust and the monetary creation by Universal Dividend (UD).

### Migrating the Ğ1 🏆

Duniter's first objective is to power the Ğ1 currency whose web of trust currently counts 4971 members with a 300 members / month growth rate. We want to work together with the community to make the transition towards Duniter v2 as smooth as possible without a "hard fork". Each member will keep his/her status, each wallet will keep its balance, the currency parameters will remain nearly unchanged, wallets (formerly "clients") software will be adapted, and we will try to make the transition as short as possible (ideally less than a day).

### International outreach 🌍

Unlike the "home-made" solution documented mainly in French, Substrate is opening us to an international community of developers. Duniter will bring what the cryptocurrency world is missing: a solid and sound monetary theory. Conversely, the cryptocurrency world will provide Duniter with the expertise needed to take the next step in experimenting with a free currency. To make understanding easier, we will be using a precise vocabulary [(fr)](https://forum.duniter.org/t/vocabulaire-de-base-pour-comprendre-duniter-v2s-lecture-fortement-recommandee-pour-tous/9053) already well established in the domain.

### Blockchain as a common resource 🌲

[🔗 forum (fr)](https://forum.duniter.org/t/comment-partager-equitablement-cette-ressource-commune-quest-la-blockchain-g1/9050/)

Duniter v1 was already part of a comprehensive approach to treat blockchain as a **[common](https://en.wikipedia.org/wiki/Commons)**, <q> a resource that community manage for individual and collective benefit </q>. The migration to Substrate is an ideal opportunity to push the thinking further, by introducing *on-chain* governance tools for collective decisions (voting, protocol evolution) and the allocation of finite blockchain resources (ex. spam resistance).

## Some technical points 👩💻

Let's now move on to the technical part, where we deal with the concrete issues raised by this migration.

### Dropping the PoW mechanism in favor for BABE/GRANDPA 👾

[🔗 forum (fr)](https://forum.duniter.org/t/abandon-de-la-pow-au-profit-de-babe-grandpa/8901) [🔗 forum (fr)](https://forum.duniter.org/t/g1v2-proposition-de-passer-au-consensus-hybride-babe-grandpa/8610)

Duniter's proof of work was often a criticised point. Although our custom [personalised difficulty](/wiki/duniter/2018-11-27-duniter-proof-of-work/#personalised-difficulty) which reduces the energy consumption and distributes the addition of blocks among blacksmiths, the [BABE](https://docs.substrate.io/v3/advanced/consensus/#babe) for block authoring and [GRANDPA](https://docs.substrate.io/v3/advanced/consensus/#grandpa) for finalization will allow us to greatly accelerate the data validation (~30 minutes → ~30 seconds) while limiting the "waste" of CPU resources.


### Blacksmiths subweb 🌋

[🔗 forum (fr)](https://forum.duniter.org/t/la-sous-toile-forgerons/9047)

In Duniter v1, any member of the web of trust is given the rights to create the UD, certify, and add blocks all at once. This is a major security flaw because by hacking into 30 poorly secured accounts it is possible to take control of the entire blockchain. With the increasing number of users, it is better to decouple different rights to grant block authoring only under security conditions that cannot be imposed on the general public.
Original line number Original line Diff line number Diff line
@@ -25,4 +25,4 @@ If the project takes off on long term, the creation of a Foundation is already c


## Contact
## Contact


More informations on the [Contact](/contact) page.
Please get in touch on the [duniter forum](https://forum.duniter.org/).
 No newline at end of file
 No newline at end of file
Original line number Original line Diff line number Diff line
@@ -7,10 +7,10 @@ Authors: cgeek


# Contribute
# Contribute


> This page is an improved copy of the FAQ section [Getting involved](/faq#gettinginvolved).
> This page is an improved copy of the FAQ section [Getting involved](wiki/faq#gettinginvolved).
### How may I help?
### How may I help?


You can help on project developement in many ways, depending on your available time, energy and skills. Please read the requirements and possibilities below. If you feel comfortable with one these profiles, do not hesitate to [contact us](/contact).
You can help on project developement in many ways, depending on your available time, energy and skills. Please read the requirements and possibilities below. If you feel comfortable with one these profiles, do not hesitate to [contact us on the forum](https://forum.duniter.org).
#### As a backend developer
#### As a backend developer


You may participate in Duniter server's development, which is the core software implementing [UCP](https://github.com/duniter/ucoin/blob/master/doc/Protocol.md). You will need some technical skills:
You may participate in Duniter server's development, which is the core software implementing [UCP](https://github.com/duniter/ucoin/blob/master/doc/Protocol.md). You will need some technical skills:
@@ -24,7 +24,8 @@ You may participate in Duniter server's development, which is the core software
 * understanding the basics of asymmetric cryptography
 * understanding the basics of asymmetric cryptography
 * optionally know the [Ed25519](http://ed25519.cr.yp.to/) scheme
 * optionally know the [Ed25519](http://ed25519.cr.yp.to/) scheme


If you are not affraid of those technologies, you can both start reading the Wiki to [Dive into Duniter code](https://github.com/duniter/ucoin/wiki/Dive-into-the-code) and [contact us](/contact).
If you are not affraid of those technologies, you can both start reading the Wiki to [Dive into Duniter code](https://github.com/duniter/ucoin/wiki/Dive-into-the-code) and contact us on [duniter forum](https://forum.duniter.org/).

#### As a designer/frontend developer
#### As a designer/frontend developer


See this beautiful website? You want to improve it with new content, new design? Feel free to propose your skills, any help is welcome. What Duniter probably needs the most is: **a logo**.
See this beautiful website? You want to improve it with new content, new design? Feel free to propose your skills, any help is welcome. What Duniter probably needs the most is: **a logo**.
Original line number Original line Diff line number Diff line
@@ -4,7 +4,7 @@ Slug: credits
Authors: cgeek
Authors: cgeek
Status: hidden
Status: hidden


## Images et logos
## Images and logos


<img src="../images/network.svg" class="credits"/>
<img src="../images/network.svg" class="credits"/>
<div>Icons made by <a href="http://www.flaticon.com/authors/madebyoliver" title="Madebyoliver">Madebyoliver</a> from <a href="http://www.flaticon.com" title="Flaticon">www.flaticon.com</a> is licensed by <a href="http://creativecommons.org/licenses/by/3.0/" title="Creative Commons BY 3.0" target="_blank">CC 3.0 BY</a></div>
<div>Icons made by <a href="http://www.flaticon.com/authors/madebyoliver" title="Madebyoliver">Madebyoliver</a> from <a href="http://www.flaticon.com" title="Flaticon">www.flaticon.com</a> is licensed by <a href="http://creativecommons.org/licenses/by/3.0/" title="Creative Commons BY 3.0" target="_blank">CC 3.0 BY</a></div>
Original line number Original line Diff line number Diff line
@@ -4,12 +4,12 @@ Date: 2015-08-11
Slug: introduction
Slug: introduction
Authors: cgeek
Authors: cgeek


Duniter is a _cryptocurrency software_, which means it is a **software** providing the ability to **create currencies**. Duniter is different from other cryptocurrency softwares you may know (Bitcoin, Litecoin, Peercoin, ...) for 2 main reasons : its **currency code** includes the concepts of a [Universal Dividend](https://en.wikipedia.org/wiki/Social_credit) and [Web of Trust](https://en.wikipedia.org/wiki/Web_of_trust); but also its **Blockchain code**, which is far more energy efficient, getting rid of the massive waste of energy introduced by Bitcoin.
Duniter is a _cryptocurrency software_, which means it is **software** providing the ability to **create currencies**. Duniter is different from other cryptocurrency software you may know (Bitcoin, Litecoin, Peercoin, ...) for 2 main reasons : its **currency code** includes the concepts of a [Universal Dividend](https://en.wikipedia.org/wiki/Social_credit) and [Web of Trust](https://en.wikipedia.org/wiki/Web_of_trust); but also its **Blockchain code**, which is far more energy efficient, getting rid of the massive waste of energy introduced by Bitcoin.
## Outline
## Outline


> **Any member is co-producer of the money** without doing anything, just for being a part of the monetary Community.
> **Any member is co-producer of the money** without doing anything, just for being a part of the monetary Community.


This is where money comes from: every member regularly receives a Universal Dividend (i.e. monetary Basic Income) coming from new money directly issued _by_ members and _to_ members.
This is where the money comes from: every member regularly receives a Universal Dividend (i.e. monetary Basic Income) coming from new money directly issued _by_ members and _to_ members.


> **Any member needs signatures from other members** to join in or simply stay in the Community.
> **Any member needs signatures from other members** to join in or simply stay in the Community.


@@ -22,10 +22,10 @@ Data is fully managed by the _P2P network_; a free currency does not fall under


### Money is co-produced by all the community members
### Money is co-produced by all the community members


This is the main feature: money is _equally_ co-produced by the members of the community (a.k.a. Web of Trust (WoT)). Such an equality is ensured in both space and time so that newcomers won't be excluded from the money production process [as is so with Bitcoin](http://magazine.ouishare.net/2013/05/bitcoin-human-based-digital-currency/), therefore **it isn't necessary to create yet another "Bitcoin" to have your part of the money**. This co-production implies that members be identified in the software, and thus is a mechanism to prevent people being able to create fake accounts and produce more money than others.
This is the main feature: money is _equally_ co-produced by the members of the community (a.k.a. Web of Trust (WoT)). Such equality is ensured in both space and time so that newcomers won't be excluded from the money production process [as is so with Bitcoin](http://magazine.ouishare.net/2013/05/bitcoin-human-based-digital-currency/), therefore **it isn't necessary to create yet another "Bitcoin" to have your part of the money**. This co-production implies that members be identified in the software, and thus is a mechanism to prevent people from being able to create fake accounts and produce more money than others.
### No more CPU race: an energy efficient Blockchain
### No more CPU race: an energy efficient Blockchain


Classical blockchains uses CPU power for addressing security issues. Even if it works (at least, it seems to), this is a very energy-expensive process. Duniter believes it is possible to have a similar but _more efficient_ _process_, which is not the little brother Proof-of-Stake (the power by the richest). Duniter benefits from a particular resource to reach this goal: **its identified community: its members**. Here is how Duniter Blockchain is built: each block is computed exclusively by members. Which means neither super Google nor any superpower would be able to control the chain. Moreover, Duniter adds a rotation rule, meaning **a member cannot control the blockchain alone**. A group of users could, but this would imply that their computing power be higher than the rest of the members of the network. This is where Web of Trust comes into play: each member is recognized (its identity is trusted - not its actions) if he fits the WoT rules:
Classical blockchains use CPU power for addressing security issues. Even if it works (at least, it seems to), this is a very energy-expensive process. Duniter believes it is possible to have a similar but _more efficient_ _process_, which is not the little brother Proof-of-Stake (the power by the richest). Duniter benefits from a particular resource to reach this goal: **its identified community: its members**. Here is how Duniter Blockchain is built: each block is computed exclusively by members. Which means neither super Google nor any superpower would be able to control the chain. Moreover, Duniter adds a rotation rule, meaning **a member cannot control the blockchain alone**. A group of users could, but this would imply that their computing power is higher than the rest of the members of the network. This is where Web of Trust comes into play: each member is recognized (its identity is trusted - not its actions) if they fit the WoT rules:


*   the members must have enough signatures (links) from other members
*   the members must have enough signatures (links) from other members
*   the member is close enough to any other member
*   the member is close enough to any other member
@@ -34,8 +34,8 @@ given the facts that:


*   signatures expire (they are valid for a set amount of time)
*   signatures expire (they are valid for a set amount of time)
*   a given link must wait a while before being relayed
*   a given link must wait a while before being relayed
*   a member must wait a while between each signature he makes (perhaps a week)
*   a member must wait a while between each signature they make (perhaps a week)
*   a member has a limit in the number of links he can make to others
*   a member has a limit in the number of links they can make to others
*   links cannot be made in the future
*   links cannot be made in the future
*   links cannot be made too far in the past
*   links cannot be made too far in the past


Original line number Original line Diff line number Diff line
@@ -3,7 +3,7 @@
<head>
<head>
    <meta name="date" content="2017-12-11">
    <meta name="date" content="2017-12-11">
    <meta name="order" content="9">
    <meta name="order" content="9">
    <meta charset="UTF-8">
    <meta name="encoding" charset="UTF-8">
    <title>Try Duniter</title>
    <title>Try Duniter</title>
</head>
</head>
<body>
<body>
Original line number Original line Diff line number Diff line
@@ -9,17 +9,17 @@ Page concernant spécifiquement le logiciel Duniter.


## Installation
## Installation


* [Install your Duniter node](./install)
* [Install your Duniter node](./duniter/install)
* [Update your Duniter node](./update)
* [Update your Duniter node](./duniter/update)
* [Update a Duniter node hosted on YunoHost](https://forum.duniter.org/t/full-https-support-for-duniter-package-for-yunohost/1892/18)
* [Update a Duniter node hosted on YunoHost](https://forum.duniter.org/t/full-https-support-for-duniter-package-for-yunohost/1892/18)


## For Developers
## For Developers


* [Duniter CLI](./commands)
* [Duniter CLI](./duniter/commands)
* [Development tutorial (in french)](https://github.com/duniter/duniter/blob/master/doc/contribute-french.md)
* [Development tutorial (in french)](https://github.com/duniter/duniter/blob/master/doc/contribute-french.md)
* Creating a release [for Windows](./create_win_release) and [for ARM](./create_arm_release)
* Creating a release [for Windows](./duniter/create_win_release) and [for ARM](./duniter/create_arm_release)


## Concepts
## Concepts


* [Architecture](./architecture)
* [Architecture](./duniter/architecture)
* [The Proof-of-Work in Duniter](./2018-11-27-duniter-proof-of-work)
* [The Proof-of-Work in Duniter](./duniter/2018-11-27-duniter-proof-of-work)
Original line number Original line Diff line number Diff line
@@ -5,6 +5,13 @@ Slug: commands
Authors: cgeek
Authors: cgeek
Here is a guide to the different commands of the `duniter` command-line executable.
Here is a guide to the different commands of the `duniter` command-line executable.


## Foreword

These commands should be executed by the user that will actually __run__ the node. For example, if you use systemd to automatically run your node on startup, it will run under the user `duniter`. In that case, the commands below should be run as follow:
```
sudo -u duniter <cmd>
```

## Initialize its node
## Initialize its node


### `wizard key`
### `wizard key`
@@ -40,7 +47,7 @@ For a new or deleted node (for example, following the use of `reset data`), it i


Synchronize its node with the network Ğ1 (Duniter currency):
Synchronize its node with the network Ğ1 (Duniter currency):


    duniter sync g1.duniter.org 443
    duniter sync g1.duniter.org:443
    Progress:
    Progress:


    download: [|||| ] 23%
    download: [|||| ] 23%
@@ -52,7 +59,7 @@ This command takes time. Be patient.


Disables the display with progress bars in favor of a conventional control output.
Disables the display with progress bars in favor of a conventional control output.


    duniter sync g1.duniter.org 443
    duniter sync g1.duniter.org:443
    2017-04-10T08: 31: 42 + 02: 00 - info: Try with g1.duniter.org:10901 4aCqwi
    2017-04-10T08: 31: 42 + 02: 00 - info: Try with g1.duniter.org:10901 4aCqwi
    2017-04-10T08: 31: 42 + 02: 00 - info: Sync started.
    2017-04-10T08: 31: 42 + 02: 00 - info: Sync started.
    2017-04-10T08: 31: 42 + 02: 00 - info: Getting remote blockchain info ...
    2017-04-10T08: 31: 42 + 02: 00 - info: Getting remote blockchain info ...
@@ -63,7 +70,7 @@ Disables the display with progress bars in favor of a conventional control outpu


Disables P2P downloading and downloading of network node listing.
Disables P2P downloading and downloading of network node listing.


    duniter sync g1.duniter.org 443
    duniter sync g1.duniter.org:443
    2017-04-10T08: 32: 26 + 02: 00 - info: Try with g1.duniter.org:10901 4aCqwi
    2017-04-10T08: 32: 26 + 02: 00 - info: Try with g1.duniter.org:10901 4aCqwi
    2017-04-10T08: 32: 26 + 02: 00 - info: Sync started.
    2017-04-10T08: 32: 26 + 02: 00 - info: Sync started.
    2017-04-10T08: 32: 26 + 02: 00 - info: Getting remote blockchain info ...
    2017-04-10T08: 32: 26 + 02: 00 - info: Getting remote blockchain info ...
@@ -81,13 +88,13 @@ Retrieves only peer information, does not retrieve block information.


Force the careful verification of the validity of each block in relation to the rules of the protocol.
Force the careful verification of the validity of each block in relation to the rules of the protocol.


    duniter sync g1.duniter.org 443 --cautious
    duniter sync g1.duniter.org:443 --cautious


#### Option `--memory`
#### Option `--memory`


Perform synchronization in memory only. Synchronization will not be stored on the hard disk. This option is useful for a quick blockchain integrity check when combined with the `--cautious` option.
Perform synchronization in memory only. Synchronization will not be stored on the hard disk. This option is useful for a quick blockchain integrity check when combined with the `--cautious` option.


    duniter sync g1.duniter.org 443 --cautious --memory
    duniter sync g1.duniter.org:443 --cautious --memory


## Start / Stop its node
## Start / Stop its node


@@ -356,7 +363,7 @@ Because these options allow you to temporarily reset (the time of a command) a g


Allows you to redefine the folder where the application data is stored. The default value for this option is `$HOME/.config/duniter/`
Allows you to redefine the folder where the application data is stored. The default value for this option is `$HOME/.config/duniter/`


    duniter sync g1.duniter.org 10901 --home / tmp / duniter
    duniter sync g1.duniter.org:10901 --home / tmp / duniter
    
    
This command will synchronize and store the result in the `/tmp/duniter/duniter_default` folder.
This command will synchronize and store the result in the `/tmp/duniter/duniter_default` folder.


@@ -364,13 +371,13 @@ This command will synchronize and store the result in the `/tmp/duniter/duniter_


Allows you to redefine the folder where the application data is stored. The default value for this option is `duniter_default`.
Allows you to redefine the folder where the application data is stored. The default value for this option is `duniter_default`.


    duniter sync g1.duniter.org 10901 --mdb g-one
    duniter sync g1.duniter.org:10901 --mdb g-one
    
    
This command will synchronize and store the result in the `$HOME/.config/duniter/g-one` folder.
This command will synchronize and store the result in the `$HOME/.config/duniter/g-one` folder.


It is possible to combine the 2 options:
It is possible to combine the 2 options:


    duniter sync g1.duniter.org 10901 --home / tmp / duniter --mdb g-one
    duniter sync g1.duniter.org:10901 --home / tmp / duniter --mdb g-one
    
    
This command will synchronize and store the result in the `/tmp/duniter/g-one` folder.
This command will synchronize and store the result in the `/tmp/duniter/g-one` folder.


Original line number Original line Diff line number Diff line
@@ -39,7 +39,7 @@ sudo ./Install-Node.sh 8.9.1


Check out the project and build it with the correct branch number:
Check out the project and build it with the correct branch number:
```
```
git clone https://git.duniter.org/nodes/typescript/duniter.git -b 1.6
git clone https://git.duniter.org/nodes/typescript/duniter.git -b 1.7
cd duniter/
cd duniter/
release/scripts/build.sh make arm <version_number>
release/scripts/build.sh make arm <version_number>
```
```
Original line number Original line Diff line number Diff line
@@ -43,7 +43,7 @@ For the most advanced users, a _server_ install allows you to have a node up 100


You will control your instance using command line tools, but if you want you could also access the graphical interface using a web browser.
You will control your instance using command line tools, but if you want you could also access the graphical interface using a web browser.


> Once you are done with the installation, you can follow [the command line user's guide](../commands).
> Once you are done with the installation, you can follow [the command line user's guide](./commands).


# GNU/Linux
# GNU/Linux


@@ -51,7 +51,7 @@ You will control your instance using command line tools, but if you want you cou


### Download package
### Download package


Go to the [release page](https://git.duniter.org/nodes/typescript/duniter/wikis/Releases) to get a link to the last stable release.
Go to the [release page](https://git.duniter.org/nodes/typescript/duniter/-/releases) to get a link to the last stable release.


Choose the file you need:
Choose the file you need:


@@ -91,7 +91,7 @@ To launch the daemon (_server_ version):


    duniter start
    duniter start


> You can follow [the command line user's guide](../commands) in order to use your server node.
> You can follow [the command line user's guide](./commands) in order to use your server node.


The _server_ version node for Ubuntu/Debian is usable with [automatic startup](#automatic-startup) (_Systemd_).
The _server_ version node for Ubuntu/Debian is usable with [automatic startup](#automatic-startup) (_Systemd_).


@@ -134,11 +134,11 @@ For other distributions, there is a binary file containing the _desktop_ version


To get the image of the last version:
To get the image of the last version:


    docker pull duniter/duniter-ts
    docker pull duniter/duniter


It is then possible to create the container with:
It is then possible to create the container with:


    docker run -d -p127.0.0.1:9220:9220 -p10901:10901 -p20901:20901 --name duniter duniter/duniter-ts
    docker run -d -p127.0.0.1:9220:9220 -p10901:10901 -p20901:20901 --name duniter duniter/duniter


Without any other option, the container will automatically execute `duniter direct_webstart`. The `-d` in the command line make the container being executed in the background (daemon). The `--name` option is used to give a unique name to the container, which will then be easier to use for the next commands. The `-p` options are used to connect in-container ports with the host ones:
Without any other option, the container will automatically execute `duniter direct_webstart`. The `-d` in the command line make the container being executed in the background (daemon). The `--name` option is used to give a unique name to the container, which will then be easier to use for the next commands. The `-p` options are used to connect in-container ports with the host ones:


@@ -146,11 +146,11 @@ Without any other option, the container will automatically execute `duniter dire
* port 10901 is used for BMA access; exporting this port is then only necessary if you activate BMA.
* port 10901 is used for BMA access; exporting this port is then only necessary if you activate BMA.
* port 20901 is used for WS2P access.
* port 20901 is used for WS2P access.


> Note : do not use both daemon options for Duniter and Docker (for example: `docker run -d duniter/duniter-ts webstart`) or the container will immediately stop.
> Note : do not use both daemon options for Duniter and Docker (for example: `docker run -d duniter/duniter webstart`) or the container will immediately stop.


Once the node is started, it is accessable either using web UI, going to http://localhost:9220, either using command line:
Once the node is started, it is accessable either using web UI, going to http://localhost:9220, either using command line:


    docker exec -it duniter duniter sync g1.duniter.fr 443
    docker exec -it duniter duniter sync g1.duniter.fr:443


In the above command, the first `duniter` is the name given to the container at creation time, while the second one is the executed command.
In the above command, the first `duniter` is the name given to the container at creation time, while the second one is the executed command.


@@ -159,22 +159,30 @@ You can stop and restart the container using standard Docker commands:
    docker stop duniter
    docker stop duniter
    docker start duniter
    docker start duniter


### Using a keyfile
### Volumes


If the file `/etc/duniter/keys.yml` is found on the container, it is used as keyfile for the node identity. For this file is visible by Duniter, it must be granted appropriate access rights. If the file `keys.yml` is for example on the host in the `~/duniter/conf` directory, here are the commands to execute for it is used:
The container creates 2 Docker volumes. The first one is attached to `/etc/duniter` and contains the Duniter configuration (see the _keyfile_ chapter below). The other one is attached to the Duniter home directory `/var/lib/duniter`. This is the place the Duniter database will be stored.


    chown -R 1111:1111 ~/duniter/conf
You can specify where these directories must be mounted. This would be usefull in order for the data to persist even if, for example, you delete your container because you want to get a new version of the image.
    chmod -R 644 ~/duniter/conf
    docker run -d -p127.0.0.1:9220:9220 -p10901:10901 -p20901:20901 --mount src=~/duniter/conf,dst=/etc/duniter --name duniter duniter/duniter-ts


> Note: some of the above commands need “root” access, usage of `sudo` may be required.
For example, if you want the database to be stored on a `duniter-db` Docker volume, you may create the container using this command:


### Configuration external storage
    docker run -d -p127.0.0.1:9220:9220 -p10901:10901 -p20901:20901 --mount type=volume,src=duniter-db,dst=/var/lib/duniter --name duniter duniter/duniter


By default, configuration and database are stored on the container. It is however possible to store them on the host computer. For this to be done, folder `/var/lib/duniter` must be shared with appropriate rights. For example, for the data to be recorded in the `~/duniter/data` directory, here are the commands to be executed:
If you prefer the database to be stored on the host directory `~/duniter/data`, you have to be carreful of the rights given to this directory. The commands to be executed are then:


    chown -R 1111:1111 ~/duniter/data
    chown -R 1111:1111 ~/duniter/data
    docker run -d -p127.0.0.1:9220:9220 -p10901:10901 -p20901:20901 --mount src=~/duniter/data,dst=/var/lib/duniter --name duniter duniter/duniter-ts
    docker run -d -p127.0.0.1:9220:9220 -p10901:10901 -p20901:20901 --mount type=bind,src=~/duniter/data,dst=/var/lib/duniter --name duniter duniter/duniter

> Note: some of the above commands need “root” access, usage of `sudo` may be required.

### Using a keyfile

If the file `/etc/duniter/keys.yml` is found on the container, it is used as keyfile for the node identity. For this file is visible by Duniter, it must be granted appropriate access rights. If the file `keys.yml` is for example on the host in the `~/duniter/conf` directory, here are the commands to execute for it is used:

    chown -R 1111:1111 ~/duniter/conf
    chmod -R 644 ~/duniter/conf
    docker run -d -p127.0.0.1:9220:9220 -p10901:10901 -p20901:20901 --mount type=bind,src=~/duniter/conf,dst=/etc/duniter --name duniter duniter/duniter


> Note: some of the above commands need “root” access, usage of `sudo` may be required.
> Note: some of the above commands need “root” access, usage of `sudo` may be required.


@@ -281,21 +289,10 @@ Adjustable environment variables for this service are:


# Windows
# Windows


A _desktop_ version is available for Windows.
There is no Windows-specific version anymore.

To deploy a node on a Windows machine, there are two possibilites:
1. Go to the [release page](https://git.duniter.org/nodes/typescript/duniter/wikis/Releases) to get a link to the last stable release. You have to download the file with `.exe` extension.
 * Use [Docker](#docker)

 * Windows Subsystem for Linux (WSL): no instructions available _yet_
2. Process the installation by a double-click on the downloaded `.exe` file.
  <img src="../../../images/wiki/duniter/install/win_fichier.png" width="591" height="39">
  > It may occur that the downloaded file misses the `.exe` extension. This is a Windows protection. You have to circumvent it by renaming the file and add `.exe` to the end of the name to be able to execute it.

3. Follow the installation procedure. You basically just need to accept the licence and click "Next" on each step.
  <br>
  <img src="../../../images/wiki/duniter/install/win_install.png" width="503" height="387">

4. Duniter is now installed, by default it will be launched at the end of the installation. You can launch it in the Windows menus "Start > Programs > Duniter > Duniter".
  <br>
  <img src="../../../images/wiki/duniter/install/win_programme.png" width="271" height="58">


# MacOS
# MacOS


Original line number Original line Diff line number Diff line
@@ -6,5 +6,5 @@ Authors: cgeek


Updating its Duniter node just consists in:
Updating its Duniter node just consists in:


* [reinstall its Duniter node](../install)
* [reinstall its Duniter node](./install)
* restart Duniter to apply the modifications
* restart Duniter to apply the modifications
Original line number Original line Diff line number Diff line
@@ -8,7 +8,7 @@ This site is like free software: all its source code is [available](https://gith


You will find on each page in the sidebar a button "*Edit page on GitHub*" or "Edit article on GitHub". It looks like this:
You will find on each page in the sidebar a button "*Edit page on GitHub*" or "Edit article on GitHub". It looks like this:


![](../../images/wiki/btn_modifier.png)
![The new edit button](../../images/wiki/btn_modifier.png)


By clicking on it, you will be redirected on the GitHub website which hosts the source code of the site. *You can modify it*.
By clicking on it, you will be redirected on the GitHub website which hosts the source code of the site. *You can modify it*.


Original line number Original line Diff line number Diff line
@@ -8,9 +8,9 @@ Authors: cgeek, galuel


<center id = "license_g1"> [Download License Ğ1 (text format)](../../files/license_g1.txt)</center>
<center id = "license_g1"> [Download License Ğ1 (text format)](../../files/license_g1.txt)</center>


[//]: # (BeginLicense)
<iframe width="100%" height="300px" src="../files/license_g1.txt"></iframe>



[//]: # (EndLicense)


> Once the license is received, read and accepted, the process to become a member of the Ğ1 WoT goes through the creation of an ID (your identifier / nicname) and a pair (private key / public key) [if possible in a secure way] (https://forum.duniter.org/t/recommendations-of-security-before-creating-your-account-g1/1819). The public key becomes an account number that can only be used by the person who owns the private key, which is constructed by another pair (passphrase / password) = private key, which must be carefully kept for oneself.
> Once the license is received, read and accepted, the process to become a member of the Ğ1 WoT goes through the creation of an ID (your identifier / nicname) and a pair (private key / public key) [if possible in a secure way] (https://forum.duniter.org/t/recommendations-of-security-before-creating-your-account-g1/1819). The public key becomes an account number that can only be used by the person who owns the private key, which is constructed by another pair (passphrase / password) = private key, which must be carefully kept for oneself.


Original line number Original line Diff line number Diff line
@@ -19,7 +19,7 @@ If you are registered on our GitLab instance, simply go on the good repositories


Then put a title, and a description about the encountered error:
Then put a title, and a description about the encountered error:


![]({Filename} /images/contribuer/ticket_github.png)
![Screenshot of a new github issue]({static}/images/contribuer/ticket_github.png)


> **/!\ Do not forget to validate by clicking the "Submit new issue" button!**
> **/!\ Do not forget to validate by clicking the "Submit new issue" button!**


@@ -27,7 +27,7 @@ Then put a title, and a description about the encountered error:


If you're really struggling to create a ticket on GitLab (it's a good opportunity to learn!), You can also [create a topic on our forum](https://forum.duniter.org/):
If you're really struggling to create a ticket on GitLab (it's a good opportunity to learn!), You can also [create a topic on our forum](https://forum.duniter.org/):


![]({Filename} /images/contribuer/ticket_forum.png)
![Screenshot of a new topic on the forum]({static}/images/contribuer/ticket_forum.png)


Pleas, make sure you to:
Pleas, make sure you to:


develop_server.sh

deleted100755 → 0
+0 −103
Original line number Original line Diff line number Diff line
#!/usr/bin/env bash
##
# This section should match your Makefile
##
PY=${PY:-python}
PELICAN=${PELICAN:-pelican}
PELICANOPTS=

BASEDIR=$(pwd)
INPUTDIR=$BASEDIR/content
OUTPUTDIR=$BASEDIR/output
CONFFILE=$BASEDIR/pelicanconf.py

###
# Don't change stuff below here unless you are sure
###

SRV_PID=$BASEDIR/srv.pid
PELICAN_PID=$BASEDIR/pelican.pid

function usage(){
  echo "usage: $0 (stop) (start) (restart) [port]"
  echo "This starts Pelican in debug and reload mode and then launches"
  echo "an HTTP server to help site development. It doesn't read"
  echo "your Pelican settings, so if you edit any paths in your Makefile"
  echo "you will need to edit your settings as well."
  exit 3
}

function alive() {
  kill -0 $1 >/dev/null 2>&1
}

function shut_down(){
  PID=$(cat $SRV_PID)
  if [[ $? -eq 0 ]]; then
    if alive $PID; then
      echo "Stopping HTTP server"
      kill $PID
    else
      echo "Stale PID, deleting"
    fi
    rm $SRV_PID
  else
    echo "HTTP server PIDFile not found"
  fi

  PID=$(cat $PELICAN_PID)
  if [[ $? -eq 0 ]]; then
    if alive $PID; then
      echo "Killing Pelican"
      kill $PID
    else
      echo "Stale PID, deleting"
    fi
    rm $PELICAN_PID
  else
    echo "Pelican PIDFile not found"
  fi
}

function start_up(){
  local port=$1
  echo "Starting up Pelican and HTTP server"
  shift
  $PELICAN --debug --autoreload -r $INPUTDIR -o $OUTPUTDIR -s $CONFFILE $PELICANOPTS &
  pelican_pid=$!
  echo $pelican_pid > $PELICAN_PID
  cd $OUTPUTDIR
  $PY -m pelican.server $port &
  srv_pid=$!
  echo $srv_pid > $SRV_PID
  cd $BASEDIR
  sleep 1
  if ! alive $pelican_pid ; then
    echo "Pelican didn't start. Is the Pelican package installed?"
    return 1
  elif ! alive $srv_pid ; then
    echo "The HTTP server didn't start. Is there another service using port" $port "?"
    return 1
  fi
  echo 'Pelican and HTTP server processes now running in background.'
}

###
#  MAIN
###
[[ ($# -eq 0) || ($# -gt 2) ]] && usage
port=''
[[ $# -eq 2 ]] && port=$2

if [[ $1 == "stop" ]]; then
  shut_down
elif [[ $1 == "restart" ]]; then
  shut_down
  start_up $port
elif [[ $1 == "start" ]]; then
  if ! start_up $port; then
    shut_down
  fi
else
  usage
fi
Original line number Original line Diff line number Diff line
@@ -53,6 +53,15 @@ dictionary must be given (but can be empty) in the ``I18N_SUBSITES`` dictionary
	    }
	    }
	}
	}


You must also have the following in your pelican configuration

.. code-block:: python
    JINJA_ENVIRONMENT = {
        'extensions': ['jinja2.ext.i18n'],
    }



Default and special overrides
Default and special overrides
-----------------------------
-----------------------------
The settings overrides may contain arbitrary settings, however, there
The settings overrides may contain arbitrary settings, however, there
Original line number Original line Diff line number Diff line
@@ -12,6 +12,9 @@ import posixpath
from copy import copy
from copy import copy
from itertools import chain
from itertools import chain
from operator import attrgetter
from operator import attrgetter
try:
    from collections.abc import OrderedDict
except ImportError:
    from collections import OrderedDict
    from collections import OrderedDict
from contextlib import contextmanager
from contextlib import contextmanager
from six.moves.urllib.parse import urlparse
from six.moves.urllib.parse import urlparse
@@ -22,7 +25,10 @@ import locale
from pelican import signals
from pelican import signals
from pelican.generators import ArticlesGenerator, PagesGenerator
from pelican.generators import ArticlesGenerator, PagesGenerator
from pelican.settings import configure_settings
from pelican.settings import configure_settings
try:
    from pelican.contents import Draft
    from pelican.contents import Draft
except ImportError:
    from pelican.contents import Article as Draft




# Global vars
# Global vars
@@ -353,12 +359,18 @@ def interlink_static_files(generator):
    '''Add links to static files in the main site if necessary'''
    '''Add links to static files in the main site if necessary'''
    if generator.settings['STATIC_PATHS'] != []:
    if generator.settings['STATIC_PATHS'] != []:
        return                               # customized STATIC_PATHS
        return                               # customized STATIC_PATHS
    filenames = generator.context['filenames'] # minimize attr lookup
    try: # minimize attr lookup
        static_content = generator.context['static_content']
    except KeyError:
        static_content = generator.context['filenames']
    relpath = relpath_to_site(generator.settings['DEFAULT_LANG'], _MAIN_LANG)
    relpath = relpath_to_site(generator.settings['DEFAULT_LANG'], _MAIN_LANG)
    for staticfile in _MAIN_STATIC_FILES:
    for staticfile in _MAIN_STATIC_FILES:
        if staticfile.get_relative_source_path() not in filenames:
        if staticfile.get_relative_source_path() not in static_content:
            staticfile = copy(staticfile) # prevent override in main site
            staticfile = copy(staticfile) # prevent override in main site
            staticfile.override_url = posixpath.join(relpath, staticfile.url)
            staticfile.override_url = posixpath.join(relpath, staticfile.url)
            try:
                generator.add_source_path(staticfile, static=True)
            except TypeError:
                generator.add_source_path(staticfile)
                generator.add_source_path(staticfile)




Original line number Original line Diff line number Diff line
@@ -39,7 +39,7 @@ with local development when ``SITEURL == ''``.
Language buttons showing all available languages, current is active
Language buttons showing all available languages, current is active
...................................................................
...................................................................


The ``extra_siteurls`` dictionary is a mapping of all languages to the
The ``lang_subsites`` dictionary is a mapping of all languages to the
``SITEURL`` of the respective (sub-)sites. This template sets the
``SITEURL`` of the respective (sub-)sites. This template sets the
language of the current (sub-)site as active.
language of the current (sub-)site as active.


Original line number Original line Diff line number Diff line
@@ -6,11 +6,13 @@ Localizing themes with Jinja2
---------------------
---------------------


To enable the |ext| extension in your templates, you must add it to
To enable the |ext| extension in your templates, you must add it to
``JINJA_EXTENSIONS`` in your Pelican configuration
``JINJA_ENVIRONMENT`` in your Pelican configuration


.. code-block:: python
.. code-block:: python


  JINJA_EXTENSIONS = ['jinja2.ext.i18n', ...]
  JINJA_ENVIRONMENT = {
    'extensions': ['jinja2.ext.i18n', ...]
  }


Then follow the `Jinja2 templating documentation for the I18N plugin
Then follow the `Jinja2 templating documentation for the I18N plugin
<http://jinja.pocoo.org/docs/templates/#i18n>`_ to make your templates
<http://jinja.pocoo.org/docs/templates/#i18n>`_ to make your templates
Original line number Original line Diff line number Diff line
<!DOCTYPE html>
<!DOCTYPE html>
<html lang="en">
<html lang="en">
<head>
<head>
          <title>Welcome to our Testing site</title>
          <title>Testing site - An untranslated article</title>
        <meta charset="utf-8" />
        <meta charset="utf-8" />
        <meta name="generator" content="Pelican" />
        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testing site Full Atom Feed" />
        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testing site Full Atom Feed" />


<link rel="stylesheet" href="http://example.com/test/theme/style.css" />
<link rel="stylesheet" href="http://example.com/test/theme/style.css" />








</head>
</head>


<body id="index" class="home">
<body id="index" class="home">
        <header id="banner" class="body">
        <header id="banner" class="body">
                <h1><a href="http://example.com/test/">Testing site <strong></strong></a></h1>
                <h1><a href="http://example.com/test/">Testing site</a></h1>
        </header><!-- /#banner -->
        </header><!-- /#banner -->
        <nav id="menu"><ul>
        <nav id="menu"><ul>
            <li><a href="http://example.com/test/pages/untranslated-page.html">Untranslated page</a></li>
            <li><a href="http://example.com/test/pages/untranslated-page.html">Untranslated page</a></li>
            <li class="active"><a href="http://example.com/test/category/misc.html">misc</a></li>
        </ul></nav><!-- /#menu -->
        </ul></nav><!-- /#menu -->
<section id="content" class="body">
<section id="content" class="body">
  <header>
  <header>
@@ -32,6 +36,9 @@
    <address class="vcard author">
    <address class="vcard author">
      By           <a class="url fn" href="http://example.com/test/author/the-tester.html">The Tester</a>
      By           <a class="url fn" href="http://example.com/test/author/the-tester.html">The Tester</a>
    </address>
    </address>
    <div class="category">
        Category: <a href="http://example.com/test/category/misc.html">misc</a>
    </div>
  </footer><!-- /.post-info -->
  </footer><!-- /.post-info -->
  <div class="entry-content">
  <div class="entry-content">
    <p>An article without a translation.
    <p>An article without a translation.
@@ -41,8 +48,8 @@ Here is a link to an <a class="reference external" href="http://example.com/test
</section>
</section>
        <footer id="contentinfo" class="body">
        <footer id="contentinfo" class="body">
                <address id="about" class="vcard body">
                <address id="about" class="vcard body">
                Proudly powered by <a href="http://getpelican.com/">Pelican</a>,
                Proudly powered by <a href="https://getpelican.com/">Pelican</a>,
                which takes great advantage of <a href="http://python.org">Python</a>.
                which takes great advantage of <a href="https://www.python.org/">Python</a>.
                </address><!-- /#about -->
                </address><!-- /#about -->
        </footer><!-- /#contentinfo -->
        </footer><!-- /#contentinfo -->
</body>
</body>
Original line number Original line Diff line number Diff line
<!DOCTYPE html>
<!DOCTYPE html>
<html lang="cz">
<html lang="en">
<head>
<head>
          <title>Welcome to our Testovací stránka</title>
          <title>Testovací stránka - An untranslated article</title>
        <meta charset="utf-8" />
        <meta charset="utf-8" />
        <meta name="generator" content="Pelican" />
        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testovací stránka Full Atom Feed" />
        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testovací stránka Full Atom Feed" />


<link rel="stylesheet" href="http://example.com/test/cz/../theme/style.css" />
<link rel="stylesheet" href="http://example.com/test/cz/../theme/style.css" />








</head>
</head>


<body id="index" class="home">
<body id="index" class="home">
        <header id="banner" class="body">
        <header id="banner" class="body">
                <h1><a href="http://example.com/test/cz/">Testovací stránka <strong></strong></a></h1>
                <h1><a href="http://example.com/test/cz/">Testovací stránka</a></h1>
        </header><!-- /#banner -->
        </header><!-- /#banner -->
        <nav id="menu"><ul>
        <nav id="menu"><ul>
            <li class="active"><a href="http://example.com/test/cz/category/misc.html">misc</a></li>
        </ul></nav><!-- /#menu -->
        </ul></nav><!-- /#menu -->
<section id="content" class="body">
<section id="content" class="body">
  <header>
  <header>
@@ -31,17 +35,20 @@
    <address class="vcard author">
    <address class="vcard author">
      By           <a class="url fn" href="http://example.com/test/cz/author/test-testovic.html">Test Testovič</a>
      By           <a class="url fn" href="http://example.com/test/cz/author/test-testovic.html">Test Testovič</a>
    </address>
    </address>
    <div class="category">
        Category: <a href="http://example.com/test/cz/category/misc.html">misc</a>
    </div>
  </footer><!-- /.post-info -->
  </footer><!-- /.post-info -->
  <div class="entry-content">
  <div class="entry-content">
    <p>An article without a translation.
    <p>An article without a translation.
Here is a link to an <a class="reference external" href="http://example.com/test/cz/../pages/untranslated-page.html">untranslated page</a></p>
Here is a link to an <a class="reference external" href="http://example.com/test/pages/untranslated-page.html">untranslated page</a></p>


  </div><!-- /.entry-content -->
  </div><!-- /.entry-content -->
</section>
</section>
        <footer id="contentinfo" class="body">
        <footer id="contentinfo" class="body">
                <address id="about" class="vcard body">
                <address id="about" class="vcard body">
                Proudly powered by <a href="http://getpelican.com/">Pelican</a>,
                Proudly powered by <a href="https://getpelican.com/">Pelican</a>,
                which takes great advantage of <a href="http://python.org">Python</a>.
                which takes great advantage of <a href="https://www.python.org/">Python</a>.
                </address><!-- /#about -->
                </address><!-- /#about -->
        </footer><!-- /#contentinfo -->
        </footer><!-- /#contentinfo -->
</body>
</body>
Original line number Original line Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Testovací stránka</title><link href="http://example.com/test/cz/" rel="alternate"></link><link href="http://example.com/test/feeds_all.atom.xml" rel="self"></link><id>http://example.com/test/cz/</id><updated>2014-09-15T00:00:00+00:00</updated><entry><title>Přeložený článek</title><link href="http://example.com/test/cz/translated-article.html" rel="alternate"></link><published>2014-09-15T00:00:00+00:00</published><updated>2014-09-15T00:00:00+00:00</updated><author><name>Test Testovič</name></author><id>tag:example.com,2014-09-15:/test/cz/translated-article.html</id><summary type="html">&lt;p&gt;Jednoduchý článek s překlady.
<feed xmlns="http://www.w3.org/2005/Atom"><title>Testovací stránka</title><link href="http://example.com/test/cz/" rel="alternate"></link><link href="http://example.com/test/feeds_all.atom.xml" rel="self"></link><id>http://example.com/test/cz/</id><updated>2014-09-15T00:00:00+00:00</updated><entry><title>Přeložený článek</title><link href="http://example.com/test/cz/translated-article.html" rel="alternate"></link><published>2014-09-15T00:00:00+00:00</published><updated>2014-09-15T00:00:00+00:00</updated><author><name>Test Testovič</name></author><id>tag:example.com,2014-09-15:/test/cz/translated-article.html</id><content type="html">&lt;p&gt;Jednoduchý článek s překlady.
Zde je odkaz na &lt;a class="reference external" href="http://example.com/test/cz/../images/img.png"&gt;nějaký obrázek&lt;/a&gt;.&lt;/p&gt;
Zde je odkaz na &lt;a class="reference external" href="http://example.com/test/images/img.png"&gt;nějaký obrázek&lt;/a&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Jednoduchý článek s překlady.
</content><category term="misc"></category></entry><entry><title>Ein übersetzter Artikel</title><link href="http://example.com/test/de/translated-article.html" rel="alternate"></link><published>2014-09-14T00:00:00+00:00</published><updated>2014-09-14T00:00:00+00:00</updated><author><name>Test Testovič</name></author><id>tag:example.com,2014-09-14:/test/de/translated-article.html</id><content type="html">&lt;p&gt;Ein einfacher Artikel mit einer Übersetzung.
Zde je odkaz na &lt;a class="reference external" href="http://example.com/test/cz/../images/img.png"&gt;nějaký obrázek&lt;/a&gt;.&lt;/p&gt;
Hier ist ein Link zur &lt;a class="reference external" href="http://example.com/test/images/img.png"&gt;einigem Bild&lt;/a&gt;.&lt;/p&gt;
</content></entry><entry><title>Ein übersetzter Artikel</title><link href="http://example.com/test/cz/../de/translated-article.html" rel="alternate"></link><published>2014-09-14T00:00:00+00:00</published><updated>2014-09-14T00:00:00+00:00</updated><author><name>Test Testovič</name></author><id>tag:example.com,2014-09-14:/test/cz/../de/translated-article.html</id><summary type="html">&lt;p&gt;Ein einfacher Artikel mit einer Übersetzung.
</content><category term="misc"></category></entry><entry><title>A translated article</title><link href="http://example.com/test/translated-article.html" rel="alternate"></link><published>2014-09-13T00:00:00+00:00</published><updated>2014-09-13T00:00:00+00:00</updated><author><name>Test Testovič</name></author><id>tag:example.com,2014-09-13:/test/translated-article.html</id><content type="html">&lt;p&gt;A simple article with a translation.
Hier ist ein Link zur &lt;a class="reference external" href="http://example.com/test/cz/../images/img.png"&gt;einigem Bild&lt;/a&gt;.&lt;/p&gt;
Here is a link to &lt;a class="reference external" href="http://example.com/test/images/img.png"&gt;some image&lt;/a&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Ein einfacher Artikel mit einer Übersetzung.
</content><category term="misc"></category></entry><entry><title>An untranslated article</title><link href="http://example.com/test/cz/an-untranslated-article-en.html" rel="alternate"></link><published>2014-07-14T00:00:00+00:00</published><updated>2014-07-14T00:00:00+00:00</updated><author><name>Test Testovič</name></author><id>tag:example.com,2014-07-14:/test/cz/an-untranslated-article-en.html</id><content type="html">&lt;p&gt;An article without a translation.
Hier ist ein Link zur &lt;a class="reference external" href="http://example.com/test/cz/../images/img.png"&gt;einigem Bild&lt;/a&gt;.&lt;/p&gt;
Here is a link to an &lt;a class="reference external" href="http://example.com/test/pages/untranslated-page.html"&gt;untranslated page&lt;/a&gt;&lt;/p&gt;
</content></entry><entry><title>A translated article</title><link href="http://example.com/test/cz/../translated-article.html" rel="alternate"></link><published>2014-09-13T00:00:00+00:00</published><updated>2014-09-13T00:00:00+00:00</updated><author><name>Test Testovič</name></author><id>tag:example.com,2014-09-13:/test/cz/../translated-article.html</id><summary type="html">&lt;p&gt;A simple article with a translation.
</content><category term="misc"></category></entry></feed>
Here is a link to &lt;a class="reference external" href="http://example.com/test/cz/../images/img.png"&gt;some image&lt;/a&gt;.&lt;/p&gt;
 No newline at end of file
</summary><content type="html">&lt;p&gt;A simple article with a translation.
Here is a link to &lt;a class="reference external" href="http://example.com/test/cz/../images/img.png"&gt;some image&lt;/a&gt;.&lt;/p&gt;
</content></entry><entry><title>An untranslated article</title><link href="http://example.com/test/cz/an-untranslated-article-en.html" rel="alternate"></link><published>2014-07-14T00:00:00+00:00</published><updated>2014-07-14T00:00:00+00:00</updated><author><name>Test Testovič</name></author><id>tag:example.com,2014-07-14:/test/cz/an-untranslated-article-en.html</id><summary type="html">&lt;p&gt;An article without a translation.
Here is a link to an &lt;a class="reference external" href="http://example.com/test/cz/../pages/untranslated-page.html"&gt;untranslated page&lt;/a&gt;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;An article without a translation.
Here is a link to an &lt;a class="reference external" href="http://example.com/test/cz/../pages/untranslated-page.html"&gt;untranslated page&lt;/a&gt;&lt;/p&gt;
</content></entry></feed>
 No newline at end of file
Original line number Original line Diff line number Diff line
@@ -3,6 +3,7 @@
<head>
<head>
        <title>Welcome to our Testovací stránka</title>
        <title>Welcome to our Testovací stránka</title>
        <meta charset="utf-8" />
        <meta charset="utf-8" />
        <meta name="generator" content="Pelican" />
        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testovací stránka Full Atom Feed" />
        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testovací stránka Full Atom Feed" />


<link rel="stylesheet" href="http://example.com/test/cz/../theme/style.css" />
<link rel="stylesheet" href="http://example.com/test/cz/../theme/style.css" />
@@ -10,9 +11,10 @@


<body id="index" class="home">
<body id="index" class="home">
        <header id="banner" class="body">
        <header id="banner" class="body">
                <h1><a href="http://example.com/test/cz/">Testovací stránka <strong></strong></a></h1>
                <h1><a href="http://example.com/test/cz/">Testovací stránka</a></h1>
        </header><!-- /#banner -->
        </header><!-- /#banner -->
        <nav id="menu"><ul>
        <nav id="menu"><ul>
            <li><a href="http://example.com/test/cz/category/misc.html">misc</a></li>
        </ul></nav><!-- /#menu -->
        </ul></nav><!-- /#menu -->
<section id="content">
<section id="content">
<h2>All articles</h2>
<h2>All articles</h2>
@@ -27,7 +29,7 @@
                    </address>
                    </address>
                </footer><!-- /.post-info -->
                </footer><!-- /.post-info -->
                <div class="entry-content"> <p>Jednoduchý článek s překlady.
                <div class="entry-content"> <p>Jednoduchý článek s překlady.
Zde je odkaz na <a class="reference external" href="http://example.com/test/cz/../images/img.png">nějaký obrázek</a>.</p>
Zde je odkaz na <a class="reference external" href="http://example.com/test/images/img.png">nějaký obrázek</a>.</p>
 </div><!-- /.entry-content -->
 </div><!-- /.entry-content -->
        </article></li>
        </article></li>
        <li><article class="hentry">
        <li><article class="hentry">
@@ -39,15 +41,15 @@ Zde je odkaz na <a class="reference external" href="http://example.com/test/cz/.
                    </address>
                    </address>
                </footer><!-- /.post-info -->
                </footer><!-- /.post-info -->
                <div class="entry-content"> <p>An article without a translation.
                <div class="entry-content"> <p>An article without a translation.
Here is a link to an <a class="reference external" href="http://example.com/test/cz/../pages/untranslated-page.html">untranslated page</a></p>
Here is a link to an <a class="reference external" href="http://example.com/test/pages/untranslated-page.html">untranslated page</a></p>
 </div><!-- /.entry-content -->
 </div><!-- /.entry-content -->
        </article></li>
        </article></li>
</ol><!-- /#posts-list -->
</ol><!-- /#posts-list -->
</section><!-- /#content -->
</section><!-- /#content -->
        <footer id="contentinfo" class="body">
        <footer id="contentinfo" class="body">
                <address id="about" class="vcard body">
                <address id="about" class="vcard body">
                Proudly powered by <a href="http://getpelican.com/">Pelican</a>,
                Proudly powered by <a href="https://getpelican.com/">Pelican</a>,
                which takes great advantage of <a href="http://python.org">Python</a>.
                which takes great advantage of <a href="https://www.python.org/">Python</a>.
                </address><!-- /#about -->
                </address><!-- /#about -->
        </footer><!-- /#contentinfo -->
        </footer><!-- /#contentinfo -->
</body>
</body>
Original line number Original line Diff line number Diff line
<!DOCTYPE html>
<!DOCTYPE html>
<html lang="cz">
<html lang="cz">
<head>
<head>
        <title>404 stránka</title>
          <title>Testovací stránka - 404 stránka</title>
        <meta charset="utf-8" />
        <meta charset="utf-8" />
        <meta name="generator" content="Pelican" />
        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testovací stránka Full Atom Feed" />
        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testovací stránka Full Atom Feed" />


<link rel="stylesheet" href="http://example.com/test/cz/../theme/style.css" />
<link rel="stylesheet" href="http://example.com/test/cz/../theme/style.css" />


        <link rel="alternate" hreflang="de" href="http://example.com/test/cz/../de/pages/404.html">
    <link rel="alternate" hreflang="en" href="http://example.com/test/cz/../pages/404.html">

</head>
</head>


<body id="index" class="home">
<body id="index" class="home">
        <header id="banner" class="body">
        <header id="banner" class="body">
                <h1><a href="http://example.com/test/cz/">Testovací stránka <strong></strong></a></h1>
                <h1><a href="http://example.com/test/cz/">Testovací stránka</a></h1>
        </header><!-- /#banner -->
        </header><!-- /#banner -->
        <nav id="menu"><ul>
        <nav id="menu"><ul>
            <li><a href="http://example.com/test/cz/category/misc.html">misc</a></li>
        </ul></nav><!-- /#menu -->
        </ul></nav><!-- /#menu -->
    <h1>404 stránka</h1>
    <h1>404 stránka</h1>
    Translations:
    Translations:
<a href="http://example.com/test/cz/../de/pages/404.html">de</a>
<a href="http://example.com/test/cz/../de/pages/404.html" hreflang="de">de</a>
<a href="http://example.com/test/cz/../pages/404.html">en</a>
<a href="http://example.com/test/cz/../pages/404.html" hreflang="en">en</a>




    <p>Jednoduchá 404 stránka.</p>
    <p>Jednoduchá 404 stránka.</p>
@@ -25,8 +32,8 @@


        <footer id="contentinfo" class="body">
        <footer id="contentinfo" class="body">
                <address id="about" class="vcard body">
                <address id="about" class="vcard body">
                Proudly powered by <a href="http://getpelican.com/">Pelican</a>,
                Proudly powered by <a href="https://getpelican.com/">Pelican</a>,
                which takes great advantage of <a href="http://python.org">Python</a>.
                which takes great advantage of <a href="https://www.python.org/">Python</a>.
                </address><!-- /#about -->
                </address><!-- /#about -->
        </footer><!-- /#contentinfo -->
        </footer><!-- /#contentinfo -->
</body>
</body>
Original line number Original line Diff line number Diff line
<!DOCTYPE html>
<!DOCTYPE html>
<html lang="cz">
<html lang="cz">
<head>
<head>
          <title>Welcome to our Testovací stránka</title>
          <title>Testovací stránka - Přeložený článek</title>
        <meta charset="utf-8" />
        <meta charset="utf-8" />
        <meta name="generator" content="Pelican" />
        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testovací stránka Full Atom Feed" />
        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testovací stránka Full Atom Feed" />


<link rel="stylesheet" href="http://example.com/test/cz/../theme/style.css" />
<link rel="stylesheet" href="http://example.com/test/cz/../theme/style.css" />




        <link rel="alternate" hreflang="de" href="http://example.com/test/cz/../de/translated-article.html">
    <link rel="alternate" hreflang="en" href="http://example.com/test/cz/../translated-article.html">





</head>
</head>


<body id="index" class="home">
<body id="index" class="home">
        <header id="banner" class="body">
        <header id="banner" class="body">
                <h1><a href="http://example.com/test/cz/">Testovací stránka <strong></strong></a></h1>
                <h1><a href="http://example.com/test/cz/">Testovací stránka</a></h1>
        </header><!-- /#banner -->
        </header><!-- /#banner -->
        <nav id="menu"><ul>
        <nav id="menu"><ul>
            <li class="active"><a href="http://example.com/test/cz/category/misc.html">misc</a></li>
        </ul></nav><!-- /#menu -->
        </ul></nav><!-- /#menu -->
<section id="content" class="body">
<section id="content" class="body">
  <header>
  <header>
@@ -23,8 +30,8 @@
      <a href="http://example.com/test/cz/translated-article.html" rel="bookmark"
      <a href="http://example.com/test/cz/translated-article.html" rel="bookmark"
         title="Permalink to Přeložený článek">Přeložený článek</a></h2>
         title="Permalink to Přeložený článek">Přeložený článek</a></h2>
 Translations:
 Translations:
<a href="http://example.com/test/cz/../de/translated-article.html">de</a>
<a href="http://example.com/test/cz/../de/translated-article.html" hreflang="de">de</a>
<a href="http://example.com/test/cz/../translated-article.html">en</a>
<a href="http://example.com/test/cz/../translated-article.html" hreflang="en">en</a>


  </header>
  </header>
  <footer class="post-info">
  <footer class="post-info">
@@ -34,17 +41,20 @@
    <address class="vcard author">
    <address class="vcard author">
      By           <a class="url fn" href="http://example.com/test/cz/author/test-testovic.html">Test Testovič</a>
      By           <a class="url fn" href="http://example.com/test/cz/author/test-testovic.html">Test Testovič</a>
    </address>
    </address>
    <div class="category">
        Category: <a href="http://example.com/test/cz/category/misc.html">misc</a>
    </div>
  </footer><!-- /.post-info -->
  </footer><!-- /.post-info -->
  <div class="entry-content">
  <div class="entry-content">
    <p>Jednoduchý článek s překlady.
    <p>Jednoduchý článek s překlady.
Zde je odkaz na <a class="reference external" href="http://example.com/test/cz/../images/img.png">nějaký obrázek</a>.</p>
Zde je odkaz na <a class="reference external" href="http://example.com/test/images/img.png">nějaký obrázek</a>.</p>


  </div><!-- /.entry-content -->
  </div><!-- /.entry-content -->
</section>
</section>
        <footer id="contentinfo" class="body">
        <footer id="contentinfo" class="body">
                <address id="about" class="vcard body">
                <address id="about" class="vcard body">
                Proudly powered by <a href="http://getpelican.com/">Pelican</a>,
                Proudly powered by <a href="https://getpelican.com/">Pelican</a>,
                which takes great advantage of <a href="http://python.org">Python</a>.
                which takes great advantage of <a href="https://www.python.org/">Python</a>.
                </address><!-- /#about -->
                </address><!-- /#about -->
        </footer><!-- /#contentinfo -->
        </footer><!-- /#contentinfo -->
</body>
</body>
Original line number Original line Diff line number Diff line
<!DOCTYPE html>
<!DOCTYPE html>
<html lang="de">
<html lang="en">
<head>
<head>
          <title>Willkommen Sie zur unserer Testseite</title>
          <title>Testseite - An untranslated article</title>
        <meta charset="utf-8" />
        <meta charset="utf-8" />
        <meta name="generator" content="Pelican" />
        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testseite Full Atom Feed" />
        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testseite Full Atom Feed" />


<link rel="stylesheet" href="http://example.com/test/de/../theme/style.css" />
<link rel="stylesheet" href="http://example.com/test/de/../theme/style.css" />








</head>
</head>


<body id="index" class="home">
<body id="index" class="home">
        <header id="banner" class="body">
        <header id="banner" class="body">
                <h1><a href="http://example.com/test/de/">Testseite <strong></strong></a></h1>
                <h1><a href="http://example.com/test/de/">Testseite</a></h1>
        </header><!-- /#banner -->
        </header><!-- /#banner -->
        <nav id="menu"><ul>
        <nav id="menu"><ul>
            <li class="active"><a href="http://example.com/test/de/category/misc.html">misc</a></li>
        </ul></nav><!-- /#menu -->
        </ul></nav><!-- /#menu -->
<section id="content" class="body">
<section id="content" class="body">
  <header>
  <header>
@@ -26,11 +30,14 @@
  </header>
  </header>
  <footer class="post-info">
  <footer class="post-info">
    <time class="published" datetime="2014-07-14T00:00:00+00:00">
    <time class="published" datetime="2014-07-14T00:00:00+00:00">
      Mon 14 July 2014
      Mo 14 Juli 2014
    </time>
    </time>
    <address class="vcard author">
    <address class="vcard author">
      By           <a class="url fn" href="http://example.com/test/de/author/der-tester.html">Der Tester</a>
      By           <a class="url fn" href="http://example.com/test/de/author/der-tester.html">Der Tester</a>
    </address>
    </address>
    <div class="category">
        Category: <a href="http://example.com/test/de/category/misc.html">misc</a>
    </div>
  </footer><!-- /.post-info -->
  </footer><!-- /.post-info -->
  <div class="entry-content">
  <div class="entry-content">
    <p>An article without a translation.
    <p>An article without a translation.
@@ -40,8 +47,8 @@ Here is a link to an <a class="reference external" href="http://example.com/test
</section>
</section>
        <footer id="contentinfo" class="body">
        <footer id="contentinfo" class="body">
                <address id="about" class="vcard body">
                <address id="about" class="vcard body">
                Proudly powered by <a href="http://getpelican.com/">Pelican</a>,
                Proudly powered by <a href="https://getpelican.com/">Pelican</a>,
                which takes great advantage of <a href="http://python.org">Python</a>.
                which takes great advantage of <a href="https://www.python.org/">Python</a>.
                </address><!-- /#about -->
                </address><!-- /#about -->
        </footer><!-- /#contentinfo -->
        </footer><!-- /#contentinfo -->
</body>
</body>
Original line number Original line Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Testseite</title><link href="http://example.com/test/de/" rel="alternate"></link><link href="http://example.com/test/feeds_all.atom.xml" rel="self"></link><id>http://example.com/test/de/</id><updated>2014-09-15T00:00:00+00:00</updated><entry><title>Přeložený článek</title><link href="http://example.com/test/de/../cz/translated-article.html" rel="alternate"></link><published>2014-09-15T00:00:00+00:00</published><updated>2014-09-15T00:00:00+00:00</updated><author><name>Der Tester</name></author><id>tag:example.com,2014-09-15:/test/de/../cz/translated-article.html</id><summary type="html">&lt;p&gt;Jednoduchý článek s překlady.
<feed xmlns="http://www.w3.org/2005/Atom"><title>Testseite</title><link href="http://example.com/test/de/" rel="alternate"></link><link href="http://example.com/test/feeds_all.atom.xml" rel="self"></link><id>http://example.com/test/de/</id><updated>2014-09-15T00:00:00+00:00</updated><entry><title>Přeložený článek</title><link href="http://example.com/test/cz/translated-article.html" rel="alternate"></link><published>2014-09-15T00:00:00+00:00</published><updated>2014-09-15T00:00:00+00:00</updated><author><name>Der Tester</name></author><id>tag:example.com,2014-09-15:/test/cz/translated-article.html</id><content type="html">&lt;p&gt;Jednoduchý článek s překlady.
Zde je odkaz na &lt;a class="reference external" href="http://example.com/test/de/../images/img.png"&gt;nějaký obrázek&lt;/a&gt;.&lt;/p&gt;
Zde je odkaz na &lt;a class="reference external" href="http://example.com/test/images/img.png"&gt;nějaký obrázek&lt;/a&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Jednoduchý článek s překlady.
</content><category term="misc"></category></entry><entry><title>Ein übersetzter Artikel</title><link href="http://example.com/test/de/translated-article.html" rel="alternate"></link><published>2014-09-14T00:00:00+00:00</published><updated>2014-09-14T00:00:00+00:00</updated><author><name>Der Tester</name></author><id>tag:example.com,2014-09-14:/test/de/translated-article.html</id><content type="html">&lt;p&gt;Ein einfacher Artikel mit einer Übersetzung.
Zde je odkaz na &lt;a class="reference external" href="http://example.com/test/de/../images/img.png"&gt;nějaký obrázek&lt;/a&gt;.&lt;/p&gt;
Hier ist ein Link zur &lt;a class="reference external" href="http://example.com/test/images/img.png"&gt;einigem Bild&lt;/a&gt;.&lt;/p&gt;
</content></entry><entry><title>Ein übersetzter Artikel</title><link href="http://example.com/test/de/translated-article.html" rel="alternate"></link><published>2014-09-14T00:00:00+00:00</published><updated>2014-09-14T00:00:00+00:00</updated><author><name>Der Tester</name></author><id>tag:example.com,2014-09-14:/test/de/translated-article.html</id><summary type="html">&lt;p&gt;Ein einfacher Artikel mit einer Übersetzung.
</content><category term="misc"></category></entry><entry><title>A translated article</title><link href="http://example.com/test/translated-article.html" rel="alternate"></link><published>2014-09-13T00:00:00+00:00</published><updated>2014-09-13T00:00:00+00:00</updated><author><name>Der Tester</name></author><id>tag:example.com,2014-09-13:/test/translated-article.html</id><content type="html">&lt;p&gt;A simple article with a translation.
Hier ist ein Link zur &lt;a class="reference external" href="http://example.com/test/de/../images/img.png"&gt;einigem Bild&lt;/a&gt;.&lt;/p&gt;
Here is a link to &lt;a class="reference external" href="http://example.com/test/images/img.png"&gt;some image&lt;/a&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Ein einfacher Artikel mit einer Übersetzung.
</content><category term="misc"></category></entry></feed>
Hier ist ein Link zur &lt;a class="reference external" href="http://example.com/test/de/../images/img.png"&gt;einigem Bild&lt;/a&gt;.&lt;/p&gt;
 No newline at end of file
</content></entry><entry><title>A translated article</title><link href="http://example.com/test/de/../translated-article.html" rel="alternate"></link><published>2014-09-13T00:00:00+00:00</published><updated>2014-09-13T00:00:00+00:00</updated><author><name>Der Tester</name></author><id>tag:example.com,2014-09-13:/test/de/../translated-article.html</id><summary type="html">&lt;p&gt;A simple article with a translation.
Here is a link to &lt;a class="reference external" href="http://example.com/test/de/../images/img.png"&gt;some image&lt;/a&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;A simple article with a translation.
Here is a link to &lt;a class="reference external" href="http://example.com/test/de/../images/img.png"&gt;some image&lt;/a&gt;.&lt;/p&gt;
</content></entry></feed>
 No newline at end of file
Original line number Original line Diff line number Diff line
@@ -3,6 +3,7 @@
<head>
<head>
        <title>Willkommen Sie zur unserer Testseite</title>
        <title>Willkommen Sie zur unserer Testseite</title>
        <meta charset="utf-8" />
        <meta charset="utf-8" />
        <meta name="generator" content="Pelican" />
        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testseite Full Atom Feed" />
        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testseite Full Atom Feed" />


<link rel="stylesheet" href="http://example.com/test/de/../theme/style.css" />
<link rel="stylesheet" href="http://example.com/test/de/../theme/style.css" />
@@ -10,9 +11,10 @@


<body id="index" class="home">
<body id="index" class="home">
        <header id="banner" class="body">
        <header id="banner" class="body">
                <h1><a href="http://example.com/test/de/">Testseite <strong></strong></a></h1>
                <h1><a href="http://example.com/test/de/">Testseite</a></h1>
        </header><!-- /#banner -->
        </header><!-- /#banner -->
        <nav id="menu"><ul>
        <nav id="menu"><ul>
            <li><a href="http://example.com/test/de/category/misc.html">misc</a></li>
        </ul></nav><!-- /#menu -->
        </ul></nav><!-- /#menu -->
<section id="content">
<section id="content">
<h2>All articles</h2>
<h2>All articles</h2>
@@ -21,21 +23,21 @@
        <li><article class="hentry">
        <li><article class="hentry">
                <header> <h2 class="entry-title"><a href="http://example.com/test/de/translated-article.html" rel="bookmark" title="Permalink to Ein übersetzter Artikel">Ein übersetzter Artikel</a></h2> </header>
                <header> <h2 class="entry-title"><a href="http://example.com/test/de/translated-article.html" rel="bookmark" title="Permalink to Ein übersetzter Artikel">Ein übersetzter Artikel</a></h2> </header>
                <footer class="post-info">
                <footer class="post-info">
                    <time class="published" datetime="2014-09-14T00:00:00+00:00"> Sun 14 September 2014 </time>
                    <time class="published" datetime="2014-09-14T00:00:00+00:00"> So 14 September 2014 </time>
                    <address class="vcard author">By
                    <address class="vcard author">By
                        <a class="url fn" href="http://example.com/test/de/author/der-tester.html">Der Tester</a>
                        <a class="url fn" href="http://example.com/test/de/author/der-tester.html">Der Tester</a>
                    </address>
                    </address>
                </footer><!-- /.post-info -->
                </footer><!-- /.post-info -->
                <div class="entry-content"> <p>Ein einfacher Artikel mit einer Übersetzung.
                <div class="entry-content"> <p>Ein einfacher Artikel mit einer Übersetzung.
Hier ist ein Link zur <a class="reference external" href="http://example.com/test/de/../images/img.png">einigem Bild</a>.</p>
Hier ist ein Link zur <a class="reference external" href="http://example.com/test/images/img.png">einigem Bild</a>.</p>
 </div><!-- /.entry-content -->
 </div><!-- /.entry-content -->
        </article></li>
        </article></li>
</ol><!-- /#posts-list -->
</ol><!-- /#posts-list -->
</section><!-- /#content -->
</section><!-- /#content -->
        <footer id="contentinfo" class="body">
        <footer id="contentinfo" class="body">
                <address id="about" class="vcard body">
                <address id="about" class="vcard body">
                Proudly powered by <a href="http://getpelican.com/">Pelican</a>,
                Proudly powered by <a href="https://getpelican.com/">Pelican</a>,
                which takes great advantage of <a href="http://python.org">Python</a>.
                which takes great advantage of <a href="https://www.python.org/">Python</a>.
                </address><!-- /#about -->
                </address><!-- /#about -->
        </footer><!-- /#contentinfo -->
        </footer><!-- /#contentinfo -->
</body>
</body>
Original line number Original line Diff line number Diff line
<!DOCTYPE html>
<!DOCTYPE html>
<html lang="de">
<html lang="de">
<head>
<head>
        <title>Eine 404 Seite</title>
          <title>Testseite - Eine 404 Seite</title>
        <meta charset="utf-8" />
        <meta charset="utf-8" />
        <meta name="generator" content="Pelican" />
        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testseite Full Atom Feed" />
        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testseite Full Atom Feed" />


<link rel="stylesheet" href="http://example.com/test/de/../theme/style.css" />
<link rel="stylesheet" href="http://example.com/test/de/../theme/style.css" />


        <link rel="alternate" hreflang="cz" href="http://example.com/test/de/../cz/pages/404.html">
    <link rel="alternate" hreflang="en" href="http://example.com/test/de/../pages/404.html">

</head>
</head>


<body id="index" class="home">
<body id="index" class="home">
        <header id="banner" class="body">
        <header id="banner" class="body">
                <h1><a href="http://example.com/test/de/">Testseite <strong></strong></a></h1>
                <h1><a href="http://example.com/test/de/">Testseite</a></h1>
        </header><!-- /#banner -->
        </header><!-- /#banner -->
        <nav id="menu"><ul>
        <nav id="menu"><ul>
            <li><a href="http://example.com/test/de/category/misc.html">misc</a></li>
        </ul></nav><!-- /#menu -->
        </ul></nav><!-- /#menu -->
    <h1>Eine 404 Seite</h1>
    <h1>Eine 404 Seite</h1>
    Translations:
    Translations:
<a href="http://example.com/test/de/../cz/pages/404.html">cz</a>
<a href="http://example.com/test/de/../cz/pages/404.html" hreflang="cz">cz</a>
<a href="http://example.com/test/de/../pages/404.html">en</a>
<a href="http://example.com/test/de/../pages/404.html" hreflang="en">en</a>




    <p>Eine einfache 404 Seite.</p>
    <p>Eine einfache 404 Seite.</p>
@@ -25,8 +32,8 @@


        <footer id="contentinfo" class="body">
        <footer id="contentinfo" class="body">
                <address id="about" class="vcard body">
                <address id="about" class="vcard body">
                Proudly powered by <a href="http://getpelican.com/">Pelican</a>,
                Proudly powered by <a href="https://getpelican.com/">Pelican</a>,
                which takes great advantage of <a href="http://python.org">Python</a>.
                which takes great advantage of <a href="https://www.python.org/">Python</a>.
                </address><!-- /#about -->
                </address><!-- /#about -->
        </footer><!-- /#contentinfo -->
        </footer><!-- /#contentinfo -->
</body>
</body>
Original line number Original line Diff line number Diff line
<!DOCTYPE html>
<!DOCTYPE html>
<html lang="de">
<html lang="en">
<head>
<head>
        <title>Untranslated page</title>
          <title>Testseite - Untranslated page</title>
        <meta charset="utf-8" />
        <meta charset="utf-8" />
        <meta name="generator" content="Pelican" />
        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testseite Full Atom Feed" />
        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testseite Full Atom Feed" />


<link rel="stylesheet" href="http://example.com/test/de/../theme/style.css" />
<link rel="stylesheet" href="http://example.com/test/de/../theme/style.css" />


</head>
</head>


<body id="index" class="home">
<body id="index" class="home">
        <header id="banner" class="body">
        <header id="banner" class="body">
                <h1><a href="http://example.com/test/de/">Testseite <strong></strong></a></h1>
                <h1><a href="http://example.com/test/de/">Testseite</a></h1>
        </header><!-- /#banner -->
        </header><!-- /#banner -->
        <nav id="menu"><ul>
        <nav id="menu"><ul>
            <li><a href="http://example.com/test/de/category/misc.html">misc</a></li>
        </ul></nav><!-- /#menu -->
        </ul></nav><!-- /#menu -->
    <h1>Untranslated page</h1>
    <h1>Untranslated page</h1>
    
    
@@ -22,8 +26,8 @@


        <footer id="contentinfo" class="body">
        <footer id="contentinfo" class="body">
                <address id="about" class="vcard body">
                <address id="about" class="vcard body">
                Proudly powered by <a href="http://getpelican.com/">Pelican</a>,
                Proudly powered by <a href="https://getpelican.com/">Pelican</a>,
                which takes great advantage of <a href="http://python.org">Python</a>.
                which takes great advantage of <a href="https://www.python.org/">Python</a>.
                </address><!-- /#about -->
                </address><!-- /#about -->
        </footer><!-- /#contentinfo -->
        </footer><!-- /#contentinfo -->
</body>
</body>
Original line number Original line Diff line number Diff line
<!DOCTYPE html>
<!DOCTYPE html>
<html lang="de">
<html lang="de">
<head>
<head>
          <title>Willkommen Sie zur unserer Testseite</title>
          <title>Testseite - Ein übersetzter Artikel</title>
        <meta charset="utf-8" />
        <meta charset="utf-8" />
        <meta name="generator" content="Pelican" />
        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testseite Full Atom Feed" />
        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testseite Full Atom Feed" />


<link rel="stylesheet" href="http://example.com/test/de/../theme/style.css" />
<link rel="stylesheet" href="http://example.com/test/de/../theme/style.css" />




        <link rel="alternate" hreflang="cz" href="http://example.com/test/de/../cz/translated-article.html">
    <link rel="alternate" hreflang="en" href="http://example.com/test/de/../translated-article.html">





</head>
</head>


<body id="index" class="home">
<body id="index" class="home">
        <header id="banner" class="body">
        <header id="banner" class="body">
                <h1><a href="http://example.com/test/de/">Testseite <strong></strong></a></h1>
                <h1><a href="http://example.com/test/de/">Testseite</a></h1>
        </header><!-- /#banner -->
        </header><!-- /#banner -->
        <nav id="menu"><ul>
        <nav id="menu"><ul>
            <li class="active"><a href="http://example.com/test/de/category/misc.html">misc</a></li>
        </ul></nav><!-- /#menu -->
        </ul></nav><!-- /#menu -->
<section id="content" class="body">
<section id="content" class="body">
  <header>
  <header>
@@ -23,28 +30,31 @@
      <a href="http://example.com/test/de/translated-article.html" rel="bookmark"
      <a href="http://example.com/test/de/translated-article.html" rel="bookmark"
         title="Permalink to Ein übersetzter Artikel">Ein übersetzter Artikel</a></h2>
         title="Permalink to Ein übersetzter Artikel">Ein übersetzter Artikel</a></h2>
 Translations:
 Translations:
<a href="http://example.com/test/de/../cz/translated-article.html">cz</a>
<a href="http://example.com/test/de/../cz/translated-article.html" hreflang="cz">cz</a>
<a href="http://example.com/test/de/../translated-article.html">en</a>
<a href="http://example.com/test/de/../translated-article.html" hreflang="en">en</a>


  </header>
  </header>
  <footer class="post-info">
  <footer class="post-info">
    <time class="published" datetime="2014-09-14T00:00:00+00:00">
    <time class="published" datetime="2014-09-14T00:00:00+00:00">
      Sun 14 September 2014
      So 14 September 2014
    </time>
    </time>
    <address class="vcard author">
    <address class="vcard author">
      By           <a class="url fn" href="http://example.com/test/de/author/der-tester.html">Der Tester</a>
      By           <a class="url fn" href="http://example.com/test/de/author/der-tester.html">Der Tester</a>
    </address>
    </address>
    <div class="category">
        Category: <a href="http://example.com/test/de/category/misc.html">misc</a>
    </div>
  </footer><!-- /.post-info -->
  </footer><!-- /.post-info -->
  <div class="entry-content">
  <div class="entry-content">
    <p>Ein einfacher Artikel mit einer Übersetzung.
    <p>Ein einfacher Artikel mit einer Übersetzung.
Hier ist ein Link zur <a class="reference external" href="http://example.com/test/de/../images/img.png">einigem Bild</a>.</p>
Hier ist ein Link zur <a class="reference external" href="http://example.com/test/images/img.png">einigem Bild</a>.</p>


  </div><!-- /.entry-content -->
  </div><!-- /.entry-content -->
</section>
</section>
        <footer id="contentinfo" class="body">
        <footer id="contentinfo" class="body">
                <address id="about" class="vcard body">
                <address id="about" class="vcard body">
                Proudly powered by <a href="http://getpelican.com/">Pelican</a>,
                Proudly powered by <a href="https://getpelican.com/">Pelican</a>,
                which takes great advantage of <a href="http://python.org">Python</a>.
                which takes great advantage of <a href="https://www.python.org/">Python</a>.
                </address><!-- /#about -->
                </address><!-- /#about -->
        </footer><!-- /#contentinfo -->
        </footer><!-- /#contentinfo -->
</body>
</body>
Original line number Original line Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Testing site</title><link href="http://example.com/test/" rel="alternate"></link><link href="http://example.com/test/feeds_all.atom.xml" rel="self"></link><id>http://example.com/test/</id><updated>2014-09-15T00:00:00+00:00</updated><entry><title>Přeložený článek</title><link href="http://example.com/test/cz/translated-article.html" rel="alternate"></link><published>2014-09-15T00:00:00+00:00</published><updated>2014-09-15T00:00:00+00:00</updated><author><name>The Tester</name></author><id>tag:example.com,2014-09-15:/test/cz/translated-article.html</id><summary type="html">&lt;p&gt;Jednoduchý článek s překlady.
<feed xmlns="http://www.w3.org/2005/Atom"><title>Testing site</title><link href="http://example.com/test/" rel="alternate"></link><link href="http://example.com/test/feeds_all.atom.xml" rel="self"></link><id>http://example.com/test/</id><updated>2014-09-15T00:00:00+00:00</updated><entry><title>Přeložený článek</title><link href="http://example.com/test/cz/translated-article.html" rel="alternate"></link><published>2014-09-15T00:00:00+00:00</published><updated>2014-09-15T00:00:00+00:00</updated><author><name>The Tester</name></author><id>tag:example.com,2014-09-15:/test/cz/translated-article.html</id><content type="html">&lt;p&gt;Jednoduchý článek s překlady.
Zde je odkaz na &lt;a class="reference external" href="http://example.com/test/images/img.png"&gt;nějaký obrázek&lt;/a&gt;.&lt;/p&gt;
Zde je odkaz na &lt;a class="reference external" href="http://example.com/test/images/img.png"&gt;nějaký obrázek&lt;/a&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Jednoduchý článek s překlady.
</content><category term="misc"></category></entry><entry><title>Ein übersetzter Artikel</title><link href="http://example.com/test/de/translated-article.html" rel="alternate"></link><published>2014-09-14T00:00:00+00:00</published><updated>2014-09-14T00:00:00+00:00</updated><author><name>The Tester</name></author><id>tag:example.com,2014-09-14:/test/de/translated-article.html</id><content type="html">&lt;p&gt;Ein einfacher Artikel mit einer Übersetzung.
Zde je odkaz na &lt;a class="reference external" href="http://example.com/test/images/img.png"&gt;nějaký obrázek&lt;/a&gt;.&lt;/p&gt;
</content></entry><entry><title>Ein übersetzter Artikel</title><link href="http://example.com/test/de/translated-article.html" rel="alternate"></link><published>2014-09-14T00:00:00+00:00</published><updated>2014-09-14T00:00:00+00:00</updated><author><name>The Tester</name></author><id>tag:example.com,2014-09-14:/test/de/translated-article.html</id><summary type="html">&lt;p&gt;Ein einfacher Artikel mit einer Übersetzung.
Hier ist ein Link zur &lt;a class="reference external" href="http://example.com/test/images/img.png"&gt;einigem Bild&lt;/a&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Ein einfacher Artikel mit einer Übersetzung.
Hier ist ein Link zur &lt;a class="reference external" href="http://example.com/test/images/img.png"&gt;einigem Bild&lt;/a&gt;.&lt;/p&gt;
Hier ist ein Link zur &lt;a class="reference external" href="http://example.com/test/images/img.png"&gt;einigem Bild&lt;/a&gt;.&lt;/p&gt;
</content></entry><entry><title>A translated article</title><link href="http://example.com/test/translated-article.html" rel="alternate"></link><published>2014-09-13T00:00:00+00:00</published><updated>2014-09-13T00:00:00+00:00</updated><author><name>The Tester</name></author><id>tag:example.com,2014-09-13:/test/translated-article.html</id><summary type="html">&lt;p&gt;A simple article with a translation.
</content><category term="misc"></category></entry><entry><title>A translated article</title><link href="http://example.com/test/translated-article.html" rel="alternate"></link><published>2014-09-13T00:00:00+00:00</published><updated>2014-09-13T00:00:00+00:00</updated><author><name>The Tester</name></author><id>tag:example.com,2014-09-13:/test/translated-article.html</id><content type="html">&lt;p&gt;A simple article with a translation.
Here is a link to &lt;a class="reference external" href="http://example.com/test/images/img.png"&gt;some image&lt;/a&gt;.&lt;/p&gt;
Here is a link to &lt;a class="reference external" href="http://example.com/test/images/img.png"&gt;some image&lt;/a&gt;.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;A simple article with a translation.
</content><category term="misc"></category></entry><entry><title>An untranslated article</title><link href="http://example.com/test/an-untranslated-article.html" rel="alternate"></link><published>2014-07-14T00:00:00+00:00</published><updated>2014-07-14T00:00:00+00:00</updated><author><name>The Tester</name></author><id>tag:example.com,2014-07-14:/test/an-untranslated-article.html</id><content type="html">&lt;p&gt;An article without a translation.
Here is a link to &lt;a class="reference external" href="http://example.com/test/images/img.png"&gt;some image&lt;/a&gt;.&lt;/p&gt;
</content></entry><entry><title>An untranslated article</title><link href="http://example.com/test/an-untranslated-article.html" rel="alternate"></link><published>2014-07-14T00:00:00+00:00</published><updated>2014-07-14T00:00:00+00:00</updated><author><name>The Tester</name></author><id>tag:example.com,2014-07-14:/test/an-untranslated-article.html</id><summary type="html">&lt;p&gt;An article without a translation.
Here is a link to an &lt;a class="reference external" href="http://example.com/test/pages/untranslated-page.html"&gt;untranslated page&lt;/a&gt;&lt;/p&gt;
</summary><content type="html">&lt;p&gt;An article without a translation.
Here is a link to an &lt;a class="reference external" href="http://example.com/test/pages/untranslated-page.html"&gt;untranslated page&lt;/a&gt;&lt;/p&gt;
Here is a link to an &lt;a class="reference external" href="http://example.com/test/pages/untranslated-page.html"&gt;untranslated page&lt;/a&gt;&lt;/p&gt;
</content></entry></feed>
</content><category term="misc"></category></entry></feed>
 No newline at end of file
 No newline at end of file
Original line number Original line Diff line number Diff line
@@ -3,6 +3,7 @@
<head>
<head>
        <title>Welcome to our Testing site</title>
        <title>Welcome to our Testing site</title>
        <meta charset="utf-8" />
        <meta charset="utf-8" />
        <meta name="generator" content="Pelican" />
        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testing site Full Atom Feed" />
        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testing site Full Atom Feed" />


<link rel="stylesheet" href="http://example.com/test/theme/style.css" />
<link rel="stylesheet" href="http://example.com/test/theme/style.css" />
@@ -10,10 +11,11 @@


<body id="index" class="home">
<body id="index" class="home">
        <header id="banner" class="body">
        <header id="banner" class="body">
                <h1><a href="http://example.com/test/">Testing site <strong></strong></a></h1>
                <h1><a href="http://example.com/test/">Testing site</a></h1>
        </header><!-- /#banner -->
        </header><!-- /#banner -->
        <nav id="menu"><ul>
        <nav id="menu"><ul>
            <li><a href="http://example.com/test/pages/untranslated-page.html">Untranslated page</a></li>
            <li><a href="http://example.com/test/pages/untranslated-page.html">Untranslated page</a></li>
            <li><a href="http://example.com/test/category/misc.html">misc</a></li>
        </ul></nav><!-- /#menu -->
        </ul></nav><!-- /#menu -->
<section id="content">
<section id="content">
<h2>All articles</h2>
<h2>All articles</h2>
@@ -47,8 +49,8 @@ Here is a link to an <a class="reference external" href="http://example.com/test
</section><!-- /#content -->
</section><!-- /#content -->
        <footer id="contentinfo" class="body">
        <footer id="contentinfo" class="body">
                <address id="about" class="vcard body">
                <address id="about" class="vcard body">
                Proudly powered by <a href="http://getpelican.com/">Pelican</a>,
                Proudly powered by <a href="https://getpelican.com/">Pelican</a>,
                which takes great advantage of <a href="http://python.org">Python</a>.
                which takes great advantage of <a href="https://www.python.org/">Python</a>.
                </address><!-- /#about -->
                </address><!-- /#about -->
        </footer><!-- /#contentinfo -->
        </footer><!-- /#contentinfo -->
</body>
</body>
Original line number Original line Diff line number Diff line
<!DOCTYPE html>
<!DOCTYPE html>
<html lang="en">
<html lang="en">
<head>
<head>
        <title>A 404 page</title>
          <title>Testing site - A 404 page</title>
        <meta charset="utf-8" />
        <meta charset="utf-8" />
        <meta name="generator" content="Pelican" />
        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testing site Full Atom Feed" />
        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testing site Full Atom Feed" />


<link rel="stylesheet" href="http://example.com/test/theme/style.css" />
<link rel="stylesheet" href="http://example.com/test/theme/style.css" />


        <link rel="alternate" hreflang="cz" href="http://example.com/test/cz/pages/404.html">
    <link rel="alternate" hreflang="de" href="http://example.com/test/de/pages/404.html">

</head>
</head>


<body id="index" class="home">
<body id="index" class="home">
        <header id="banner" class="body">
        <header id="banner" class="body">
                <h1><a href="http://example.com/test/">Testing site <strong></strong></a></h1>
                <h1><a href="http://example.com/test/">Testing site</a></h1>
        </header><!-- /#banner -->
        </header><!-- /#banner -->
        <nav id="menu"><ul>
        <nav id="menu"><ul>
            <li><a href="http://example.com/test/pages/untranslated-page.html">Untranslated page</a></li>
            <li><a href="http://example.com/test/pages/untranslated-page.html">Untranslated page</a></li>
            <li><a href="http://example.com/test/category/misc.html">misc</a></li>
        </ul></nav><!-- /#menu -->
        </ul></nav><!-- /#menu -->
    <h1>A 404 page</h1>
    <h1>A 404 page</h1>
    Translations:
    Translations:
<a href="http://example.com/test/cz/pages/404.html">cz</a>
<a href="http://example.com/test/cz/pages/404.html" hreflang="cz">cz</a>
<a href="http://example.com/test/de/pages/404.html">de</a>
<a href="http://example.com/test/de/pages/404.html" hreflang="de">de</a>




    <p>A simple 404 page.</p>
    <p>A simple 404 page.</p>
@@ -26,8 +33,8 @@


        <footer id="contentinfo" class="body">
        <footer id="contentinfo" class="body">
                <address id="about" class="vcard body">
                <address id="about" class="vcard body">
                Proudly powered by <a href="http://getpelican.com/">Pelican</a>,
                Proudly powered by <a href="https://getpelican.com/">Pelican</a>,
                which takes great advantage of <a href="http://python.org">Python</a>.
                which takes great advantage of <a href="https://www.python.org/">Python</a>.
                </address><!-- /#about -->
                </address><!-- /#about -->
        </footer><!-- /#contentinfo -->
        </footer><!-- /#contentinfo -->
</body>
</body>
Original line number Original line Diff line number Diff line
<!DOCTYPE html>
<!DOCTYPE html>
<html lang="en">
<html lang="en">
<head>
<head>
        <title>Untranslated page</title>
          <title>Testing site - Untranslated page</title>
        <meta charset="utf-8" />
        <meta charset="utf-8" />
        <meta name="generator" content="Pelican" />
        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testing site Full Atom Feed" />
        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testing site Full Atom Feed" />


<link rel="stylesheet" href="http://example.com/test/theme/style.css" />
<link rel="stylesheet" href="http://example.com/test/theme/style.css" />


</head>
</head>


<body id="index" class="home">
<body id="index" class="home">
        <header id="banner" class="body">
        <header id="banner" class="body">
                <h1><a href="http://example.com/test/">Testing site <strong></strong></a></h1>
                <h1><a href="http://example.com/test/">Testing site</a></h1>
        </header><!-- /#banner -->
        </header><!-- /#banner -->
        <nav id="menu"><ul>
        <nav id="menu"><ul>
            <li class="active"><a href="http://example.com/test/pages/untranslated-page.html">Untranslated page</a></li>
            <li class="active"><a href="http://example.com/test/pages/untranslated-page.html">Untranslated page</a></li>
            <li><a href="http://example.com/test/category/misc.html">misc</a></li>
        </ul></nav><!-- /#menu -->
        </ul></nav><!-- /#menu -->
    <h1>Untranslated page</h1>
    <h1>Untranslated page</h1>
    
    
@@ -23,8 +27,8 @@


        <footer id="contentinfo" class="body">
        <footer id="contentinfo" class="body">
                <address id="about" class="vcard body">
                <address id="about" class="vcard body">
                Proudly powered by <a href="http://getpelican.com/">Pelican</a>,
                Proudly powered by <a href="https://getpelican.com/">Pelican</a>,
                which takes great advantage of <a href="http://python.org">Python</a>.
                which takes great advantage of <a href="https://www.python.org/">Python</a>.
                </address><!-- /#about -->
                </address><!-- /#about -->
        </footer><!-- /#contentinfo -->
        </footer><!-- /#contentinfo -->
</body>
</body>
Original line number Original line Diff line number Diff line
<!DOCTYPE html>
<!DOCTYPE html>
<html lang="en">
<html lang="en">
<head>
<head>
          <title>Welcome to our Testing site</title>
          <title>Testing site - A translated article</title>
        <meta charset="utf-8" />
        <meta charset="utf-8" />
        <meta name="generator" content="Pelican" />
        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testing site Full Atom Feed" />
        <link href="http://example.com/test/feeds_all.atom.xml" type="application/atom+xml" rel="alternate" title="Testing site Full Atom Feed" />


<link rel="stylesheet" href="http://example.com/test/theme/style.css" />
<link rel="stylesheet" href="http://example.com/test/theme/style.css" />




        <link rel="alternate" hreflang="cz" href="http://example.com/test/cz/translated-article.html">
    <link rel="alternate" hreflang="de" href="http://example.com/test/de/translated-article.html">





</head>
</head>


<body id="index" class="home">
<body id="index" class="home">
        <header id="banner" class="body">
        <header id="banner" class="body">
                <h1><a href="http://example.com/test/">Testing site <strong></strong></a></h1>
                <h1><a href="http://example.com/test/">Testing site</a></h1>
        </header><!-- /#banner -->
        </header><!-- /#banner -->
        <nav id="menu"><ul>
        <nav id="menu"><ul>
            <li><a href="http://example.com/test/pages/untranslated-page.html">Untranslated page</a></li>
            <li><a href="http://example.com/test/pages/untranslated-page.html">Untranslated page</a></li>
            <li class="active"><a href="http://example.com/test/category/misc.html">misc</a></li>
        </ul></nav><!-- /#menu -->
        </ul></nav><!-- /#menu -->
<section id="content" class="body">
<section id="content" class="body">
  <header>
  <header>
@@ -24,8 +31,8 @@
      <a href="http://example.com/test/translated-article.html" rel="bookmark"
      <a href="http://example.com/test/translated-article.html" rel="bookmark"
         title="Permalink to A translated article">A translated article</a></h2>
         title="Permalink to A translated article">A translated article</a></h2>
 Translations:
 Translations:
<a href="http://example.com/test/cz/translated-article.html">cz</a>
<a href="http://example.com/test/cz/translated-article.html" hreflang="cz">cz</a>
<a href="http://example.com/test/de/translated-article.html">de</a>
<a href="http://example.com/test/de/translated-article.html" hreflang="de">de</a>


  </header>
  </header>
  <footer class="post-info">
  <footer class="post-info">
@@ -35,6 +42,9 @@
    <address class="vcard author">
    <address class="vcard author">
      By           <a class="url fn" href="http://example.com/test/author/the-tester.html">The Tester</a>
      By           <a class="url fn" href="http://example.com/test/author/the-tester.html">The Tester</a>
    </address>
    </address>
    <div class="category">
        Category: <a href="http://example.com/test/category/misc.html">misc</a>
    </div>
  </footer><!-- /.post-info -->
  </footer><!-- /.post-info -->
  <div class="entry-content">
  <div class="entry-content">
    <p>A simple article with a translation.
    <p>A simple article with a translation.
@@ -44,8 +54,8 @@ Here is a link to <a class="reference external" href="http://example.com/test/im
</section>
</section>
        <footer id="contentinfo" class="body">
        <footer id="contentinfo" class="body">
                <address id="about" class="vcard body">
                <address id="about" class="vcard body">
                Proudly powered by <a href="http://getpelican.com/">Pelican</a>,
                Proudly powered by <a href="https://getpelican.com/">Pelican</a>,
                which takes great advantage of <a href="http://python.org">Python</a>.
                which takes great advantage of <a href="https://www.python.org/">Python</a>.
                </address><!-- /#about -->
                </address><!-- /#about -->
        </footer><!-- /#contentinfo -->
        </footer><!-- /#contentinfo -->
</body>
</body>
Original line number Original line Diff line number Diff line
@@ -136,4 +136,4 @@ class TestFullRun(unittest.TestCase):
             self.temp_path], env={'PAGER': ''},
             self.temp_path], env={'PAGER': ''},
            stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
            stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
        self.assertFalse(out, 'non-empty `diff` stdout:\n{}'.format(out))
        self.assertFalse(out, 'non-empty `diff` stdout:\n{}'.format(out))
        self.assertFalse(err, 'non-empty `diff` stderr:\n{}'.format(out))
        self.assertFalse(err, 'non-empty `diff` stderr:\n{}'.format(err))
Original line number Original line Diff line number Diff line
@@ -5,15 +5,15 @@
            <div class="col-md-1"></div>
            <div class="col-md-1"></div>
            <div class="col-md-10 download">
            <div class="col-md-10 download">
                <h3>Download the software</h3>
                <h3>Download the software</h3>
                <a type="button" class="btn btn-warning" href="https://git.duniter.org/nodes/typescript/duniter/tags/" id="duniterTestVersionLink">
                <a type="button" class="btn btn-warning" href="https://git.duniter.org/nodes/typescript/duniter/-/releases/v1.8.0">
                    <span class="fa fa-cloud-download" aria-hidden="true"></span>
                    <span class="fa fa-cloud-download" aria-hidden="true"></span>
                    <span id="duniterTestVersion">Duniter</span>
                    <span id="duniterTestVersion">Duniter v1.8.0</span>
                    <br>
                    <br>
                    <span class="currency_network">Ğ1-TEST Network</span> (test)
                    <span class="currency_network">Ğ1-TEST Network</span> (test)
                </a>
                </a>
                <a type="button" class="btn btn-primary" href="https://git.duniter.org/nodes/typescript/duniter/tags/v1.7.19">
                <a type="button" class="btn btn-primary" href="https://git.duniter.org/nodes/typescript/duniter/-/releases/v1.8.0">
                    <span class="fa fa-cloud-download" aria-hidden="true"></span>
                    <span class="fa fa-cloud-download" aria-hidden="true"></span>
                    <span id="duniterProdVersion">Duniter v1.7.19</span>
                    <span id="duniterProdVersion">Duniter v1.8.0</span>
                    <br>
                    <br>
                    <span class="currency_network">Ğ1 Network</span> (real)
                    <span class="currency_network">Ğ1 Network</span> (real)
                </a>
                </a>
Original line number Original line Diff line number Diff line
@@ -92,7 +92,7 @@
    {% endif %}
    {% endif %}


    {% if category and CATEGORY_FEED_ATOM %}
    {% if category and CATEGORY_FEED_ATOM %}
        <link href="{{ SITEURL }}/{{ CATEGORY_FEED_ATOM|format(category.slug) }}" type="application/atom+xml" rel="alternate"
        <link href="{{ SITEURL }}/{{ CATEGORY_FEED_ATOM|format(slug=category.slug) }}" type="application/atom+xml" rel="alternate"
              title="{{ SITENAME }} {{ category }} ATOM Feed"/>
              title="{{ SITENAME }} {{ category }} ATOM Feed"/>
    {% endif %}
    {% endif %}


Original line number Original line Diff line number Diff line
@@ -123,8 +123,8 @@
            <ul class="list-group">
            <ul class="list-group">
                <li class="list-group-item"><h5>Did you see an error?</h5></li>
                <li class="list-group-item"><h5>Did you see an error?</h5></li>
                <li class="list-group-item">
                <li class="list-group-item">
                    <a class="btn btn-info github" target="_blank" href="https://github.com/duniter/website_en/edit/master/content/pages/{{ page.path }}.md">
                    <a class="btn btn-info github" target="_blank" href="https://git.duniter.org/websites/website_en/edit/master/content/pages/{{ page.path }}.md">
                        <i class="fa fa-random"></i> Fix this page on GitHub
                        <i class="fa fa-random"></i> Fix this page on GitLab
                    </a>
                    </a>
                </li>
                </li>
            </ul>
            </ul>
@@ -135,8 +135,8 @@
            <ul class="list-group">
            <ul class="list-group">
                <li class="list-group-item"><h5>Did you see an error?</h5></li>
                <li class="list-group-item"><h5>Did you see an error?</h5></li>
                <li class="list-group-item">
                <li class="list-group-item">
                    <a class="btn btn-info github" target="_blank" href="https://github.com/duniter/website_en/edit/master/content/{{ article.date.strftime('%Y-%m-%d') ~ '-' ~ article.slug }}.md">
                    <a class="btn btn-info github" target="_blank" href="https://git.duniter.org/websites/website_en/edit/master/content/{{ article.date.strftime('%Y-%m-%d') ~ '-' ~ article.slug }}.md">
                        <i class="fa fa-random"></i> Fix this article on GitHub
                        <i class="fa fa-random"></i> Fix this article on GitLab
                    </a>
                    </a>
                </li>
                </li>
            </ul>
            </ul>
+4 −4
Original line number Original line Diff line number Diff line
@@ -40,7 +40,8 @@ PYGMENTS_STYLE = 'default'


PATH_METADATA = 'pages/(?P<path>.*)\..*'
PATH_METADATA = 'pages/(?P<path>.*)\..*'


JINJA_EXTENSIONS = ['jinja2.ext.i18n']
JINJA_ENVIRONMENT = {"extensions": ['jinja2.ext.i18n']}

I18N_SUBSITES = {
I18N_SUBSITES = {
}
}


@@ -56,7 +57,7 @@ BOOTSTRAP_THEME = 'readable'
DIRECT_TEMPLATES = ('index', 'categories', 'authors', 'archives', 'search')
DIRECT_TEMPLATES = ('index', 'categories', 'authors', 'archives', 'search')


ARTICLE_EXCLUDES = ['files']
ARTICLE_EXCLUDES = ['files']
STATIC_PATHS = ['images', 'content', 'files', 'files/licence_g1.rst', 'css']
STATIC_PATHS = ['images', 'content', 'files', 'files/license_g1.txt', 'css']
CUSTOM_CSS = 'css/custom.css'
CUSTOM_CSS = 'css/custom.css'




@@ -69,7 +70,6 @@ LINKS = (('duniter.org', 'https://duniter.org/'),
ACCEPTED_MENUS = ['introduction',
ACCEPTED_MENUS = ['introduction',
         'get-g1',
         'get-g1',
         'contribute',
         'contribute',
         'contact',
         'wiki',
         'wiki',
         'about',]
         'about',]


@@ -77,7 +77,7 @@ ACCEPTED_MENUS = ['introduction',
SOCIAL = (('Forum', 'https://forum.duniter.org', 'comment'),
SOCIAL = (('Forum', 'https://forum.duniter.org', 'comment'),
          ('Salon XMPP', 'https://chat.duniter.org', 'comments'),
          ('Salon XMPP', 'https://chat.duniter.org', 'comments'),
          ('Bugs', '/fr/wiki/rapporter-un-bug', 'bug'),
          ('Bugs', '/fr/wiki/rapporter-un-bug', 'bug'),
          ('Mastodon', 'ihttps://mastodon.xyz/@duniter', 'globe'),
          ('Mastodon', 'https://mastodon.xyz/@duniter', 'globe'),
          ('Gitlab', 'https://git.duniter.org/'),
          ('Gitlab', 'https://git.duniter.org/'),
          ('GitHub', 'https://github.com/duniter'),
          ('GitHub', 'https://github.com/duniter'),
          ('Diaspora', 'https://framasphere.org/people/1949ee70f6bc0134e6b32a0000053625', 'asterisk'),
          ('Diaspora', 'https://framasphere.org/people/1949ee70f6bc0134e6b32a0000053625', 'asterisk'),
+4 −105
Original line number Original line Diff line number Diff line
#!/usr/bin/env python
#!/usr/bin/env python
# -*- coding: utf-8 -*- #
# -*- coding: utf-8 -*- #
from __future__ import unicode_literals
import sys
sys.path.append('.')


# AUTHOR = u'Duniter'
from pelicanconf import *
SITENAME = u'Duniter'
SITEURL = u'https://duniter.org/en'

PATH = 'content'
THEME = "pelican-themes/pelican-bootstrap3"
PAGES_SORT_ATTRIBUTE = 'order'

TIMEZONE = 'Europe/Paris'

# ABOUT_ME = '<div id="stb-container-1313" class="stb-container-css stb-black-container stb-collapsible stb-visible stb-image-big stb-ltr stb-border" style="margin: 10px 0px 10px 0px;"><div id="stb-caption-box-1313" class="stb-black-caption_box stb_caption stb-caption-box"><aside class="stb-caption-icon"><img src="http://www.creationmonetaire.info/wp-content/plugins/wp-special-textboxes/themes/stb-metro/earth.png"></aside><div id="stb-tool-1313" class="stb-tool"><img id="stb-toolimg-1313" src="http://www.creationmonetaire.info/wp-content/plugins/wp-special-textboxes/themes/stb-metro/minus.png" title="Hide"></div>J’accepte les Ğ1 !</div><div id="stb-body-box-1313" class="stb-black-body_box stb_body stb-body-box"><div style="margin-bottom: 15px;padding: 2px 2px; background-color: #e7f3fe;border-left: 6px solid #2196F3; font-size: 80%; color: black;">ID : Galuel<br>Ds1z6Wd8hNTexBoo3LVG2oXLZN4dC9ZWxoWwnDbF1NEW</div><center><a href="http://g1.duniter.org/cesium/#/app/wot/Ds1z6Wd8hNTexBoo3LVG2oXLZN4dC9ZWxoWwnDbF1NEW/Galuel"><img src="http://www.creationmonetaire.info/wp-content/uploads/2017/03/duniter_button.png" width="100"></a></center></div></div>'
FAVICON = 'images/duniter-logo.png'
SITELOGO = 'images/duniter-logo.png'
THUMBNAIL_DEFAULT = '/images/duniter-logo-bw.png'
SEARCH_URL = '/en/search.html'
# BANNER = 'images/duniter-logo.png'
# BANNER_SUBTITLE = 'This is my subtitle'
SITELOGO_SIZE = 36

DEFAULT_LANG = u'fr'

PLUGIN_PATHS = ['pelican-plugins/']
PLUGINS = ['i18n_subsites', 'tipue_search', 'pelican-page-hierarchy', 'plantuml']

MARKDOWN = {
  'extension_configs': {
    'markdown.extensions.codehilite': { 'css_class': 'highlight' },
    'markdown.extensions.fenced_code': {},
    'markdown.extensions.extra': {},
    'markdown.extensions.toc': {},
    #'plantuml.plantuml_md': {'siteurl': '/en'} DOES NOT WORK, NEED A PATCH ON THE PLUGIN PLANTUML, USE SITEURL BY DEFAULT
  }
}

PYGMENTS_STYLE = 'default'

PATH_METADATA = 'pages/(?P<path>.*)\..*'

JINJA_EXTENSIONS = ['jinja2.ext.i18n']

I18N_SUBSITES = {
}

ARTICLE_URL = '{slug}'
ARTICLE_SAVE_AS = '{slug}.html'
PAGE_URL = 'pages/{slug}'
PAGE_SAVE_AS = 'pages/{slug}.html'
CATEGORY_URL = 'category/{slug}'
CATEGORY_SAVE_AS = 'category/{slug}.html'

BOOTSTRAP_THEME = 'readable'

DIRECT_TEMPLATES = ('index', 'categories', 'authors', 'archives', 'search')

ARTICLE_EXCLUDES = ['files']
STATIC_PATHS = ['images', 'content', 'files', 'files/licence_g1.rst', 'css']
CUSTOM_CSS = 'css/custom.css'


# Blogroll
LINKS = (('duniter.org', 'https://duniter.org/'),
         ('forum.duniter.org', 'https://forum.duniter.org/'),
         ('creationmonetaire.info', 'http://creationmonetaire.info/'),)

# Social widget
ACCEPTED_MENUS = ['introduction',
         'get-g1',
         'contribuer',
         'contact',
         'wiki',
         'a-propos',]


SOCIAL = (('Forum', 'https://forum.duniter.org', 'comment'),
          ('Salon XMPP', 'https://chat.duniter.org', 'comments'),
          ('Bugs', '/fr/wiki/rapporter-un-bug', 'bug'),
          ('Mastodon', 'https://mastodon.xyz/@duniter', 'globe'),
          ('Gitlab', 'https://git.duniter.org/'),
          ('GitHub', 'https://github.com/duniter'),
          ('Diaspora', 'https://framasphere.org/people/1949ee70f6bc0134e6b32a0000053625', 'asterisk'),
          ('RSS', '/feeds/all.atom.xml'),
          ('ğchange', 'https://www.gchange.fr', 'balance-scale'),
          ('ğannonce', 'https://gannonce.duniter.org', 'bullhorn'),)


DEFAULT_PAGINATION = 10

# Uncomment following line if you want document-relative URLs when developing
#RELATIVE_URLS = True

CC_LICENSE = "CC-BY-SA"

DISPLAY_ARTICLE_INFO_ON_INDEX = False
DISPLAY_CATEGORIES_ON_MENU = False
DISPLAY_PAGES_ON_MENU = True
BOOTSTRAP_FLUID = False
DISPLAY_CATEGORY_IN_BREADCRUMBS = True
DISPLAY_BREADCRUMBS = True
DISPLAY_CATEGORIES_ON_SIDEBAR = True
DISPLAY_RECENT_POSTS_ON_SIDEBAR = False
SHOW_ARTICLE_AUTHOR = True
SHOW_ARTICLE_AUTHOR = True
SHOW_ARTICLE_CATEGORY = False
SHOW_DATE_MODIFIED = True


SITEURL = u'https://duniter.org'

replace.py

deleted100644 → 0
+0 −41
Original line number Original line Diff line number Diff line
#!/usr/bin/env python
# -*- coding: utf-8 -*- #

import re

def replace(original_file, placeholder_start, placeholder_end,
            replace_file, target_file=None):
    """
    This function will replace in original_file what is between starting
    placeholder and ending placeholder by the
    content of replace_file. It will save it as target_file if provided, or
    in original_file otherwise.
    No backslash must be used in the placeholders except in order to escape
    Result will be put in triple backquotes.
    :param original_file Source that must be modified:
    :param placeholder_start String starting the position to replace:
    :param placeholder_start String ending the position to replace:
    :param replace_file File to include at placeholder position:
    :param target_file Destination where the complete file must be stored.
    Facultative, will be replaced by original_file if not provided:
    :return:
    """
    if target_file is None:
        target_file = original_file

    with open(original_file, 'r') as my_original_file:
        original_content = my_original_file.read()

    with open(replace_file, 'r') as my_replace_file:
        #we keep placeholders to be able to replay the process several times
        replace_content = placeholder_start.replace('\\','') + "\n\n\n" + my_replace_file.read() + "\n\n\n" + placeholder_end.replace('\\','')

    regex = placeholder_start + r'(.*)' + placeholder_end
    new_content = re.sub(regex, replace_content, original_content, flags=re.DOTALL)

    with open(target_file, 'w') as my_target_file:
        my_target_file.write(new_content)

print("Will start replace")
replace('content/pages/wiki/g1-license.md', '\[//\]: # \(BeginLicense\)', '\[//\]: # \(EndLicense\)', 'content/files/license_g1.txt')
print("Replace completed")