├── layouts ├── partials │ ├── extra-in-head.html │ ├── disqus.html │ ├── navigation.html │ ├── page-content.html │ ├── page-header.html │ ├── post-content.html │ ├── intro.html │ ├── page-stub.html │ ├── opengraph.html │ ├── pagination.html │ ├── tag-pagination.html │ ├── post-stub.html │ ├── fathom.html │ ├── post-header.html │ ├── exponea.html │ ├── footer.html │ ├── post-footer.html │ └── header.html ├── 404.html ├── page │ └── single.html ├── _default │ ├── single.html │ ├── list.html │ └── rss.xml ├── post │ ├── single.html │ └── list.html ├── tag │ └── list.html └── index.html ├── docs ├── viewerjs │ ├── pdfjsversion.js │ ├── images │ │ ├── nlnet.png │ │ ├── kogmbh.png │ │ ├── texture.png │ │ ├── toolbarButton-pageUp.png │ │ ├── toolbarButton-zoomIn.png │ │ ├── toolbarButton-download.png │ │ ├── toolbarButton-pageDown.png │ │ ├── toolbarButton-zoomOut.png │ │ ├── toolbarButton-fullscreen.png │ │ ├── toolbarButton-menuArrows.png │ │ └── toolbarButton-presentation.png │ ├── example.local.css │ └── ui_utils.js ├── favicon.ico ├── img │ ├── bluehats.jpg │ └── bluehats.png ├── fr │ ├── index.html │ └── sitemap.xml ├── page │ ├── 1 │ │ └── index.html │ └── 2 │ │ └── index.html ├── en │ ├── page │ │ └── 1 │ │ │ └── index.html │ ├── tags │ │ ├── page │ │ │ └── 1 │ │ │ │ └── index.html │ │ ├── index.xml │ │ └── index.html │ ├── categories │ │ ├── page │ │ │ └── 1 │ │ │ │ └── index.html │ │ ├── index.xml │ │ └── index.html │ ├── index.xml │ ├── sitemap.xml │ ├── 404.html │ └── index.html ├── post │ ├── page │ │ ├── 1 │ │ │ └── index.html │ │ └── 2 │ │ │ └── index.html │ └── index.html ├── tags │ ├── page │ │ └── 1 │ │ │ └── index.html │ ├── index.xml │ └── index.html ├── sitemap.xml ├── categories │ ├── page │ │ └── 1 │ │ │ └── index.html │ ├── index.xml │ └── index.html ├── js │ ├── scripts.js │ └── jquery.fitvids.js ├── dist │ ├── syntax.css │ └── site.css ├── 404.html ├── index.html ├── a-propos │ └── index.html └── gazette_bluehat_10 │ └── index.html ├── static ├── viewerjs │ ├── pdfjsversion.js │ ├── images │ │ ├── nlnet.png │ │ ├── kogmbh.png │ │ ├── texture.png │ │ ├── toolbarButton-pageUp.png │ │ ├── toolbarButton-zoomIn.png │ │ ├── toolbarButton-download.png │ │ ├── toolbarButton-pageDown.png │ │ ├── toolbarButton-zoomOut.png │ │ ├── toolbarButton-fullscreen.png │ │ ├── toolbarButton-menuArrows.png │ │ └── toolbarButton-presentation.png │ ├── example.local.css │ └── ui_utils.js ├── favicon.ico ├── img │ ├── bluehats.jpg │ └── bluehats.png ├── dist │ ├── fonts │ │ ├── Marianne-Bold.woff │ │ ├── Marianne-Bold.woff2 │ │ ├── Marianne-Regular.woff │ │ ├── Marianne-Regular.woff2 │ │ └── index.css │ └── site.css └── js │ ├── scripts.js │ └── jquery.fitvids.js ├── .gitignore ├── template.org ├── archetypes └── default.md ├── .github ├── ISSUE_TEMPLATE │ ├── annonce-logiciel.md │ ├── cr-evenement.md │ ├── annonce-evenement.md │ └── temoignage.md └── workflows │ └── gh-pages.yml ├── config.toml ├── README.org ├── README.md ├── content ├── a-propos.fr.org └── post │ ├── gazette_bluehat_10.org │ ├── gazette_bluehat_8.org │ └── gazette_bluehat_0.org └── LICENSE.txt /layouts/partials/extra-in-head.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/viewerjs/pdfjsversion.js: -------------------------------------------------------------------------------- 1 | var /**@const{!string}*/pdfjs_version = "v1.1.114"; 2 | -------------------------------------------------------------------------------- /static/viewerjs/pdfjsversion.js: -------------------------------------------------------------------------------- 1 | var /**@const{!string}*/pdfjs_version = "v1.1.114"; 2 | -------------------------------------------------------------------------------- /docs/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DISIC/gazette-bluehats/HEAD/docs/favicon.ico -------------------------------------------------------------------------------- /static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DISIC/gazette-bluehats/HEAD/static/favicon.ico -------------------------------------------------------------------------------- /docs/img/bluehats.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DISIC/gazette-bluehats/HEAD/docs/img/bluehats.jpg -------------------------------------------------------------------------------- /docs/img/bluehats.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DISIC/gazette-bluehats/HEAD/docs/img/bluehats.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *odt 2 | *pdf 3 | wip/ 4 | public/ 5 | docs/ 6 | content/post/*html 7 | content/post/*css 8 | -------------------------------------------------------------------------------- /static/img/bluehats.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DISIC/gazette-bluehats/HEAD/static/img/bluehats.jpg -------------------------------------------------------------------------------- /static/img/bluehats.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DISIC/gazette-bluehats/HEAD/static/img/bluehats.png -------------------------------------------------------------------------------- /docs/viewerjs/images/nlnet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DISIC/gazette-bluehats/HEAD/docs/viewerjs/images/nlnet.png -------------------------------------------------------------------------------- /docs/viewerjs/images/kogmbh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DISIC/gazette-bluehats/HEAD/docs/viewerjs/images/kogmbh.png -------------------------------------------------------------------------------- /docs/viewerjs/images/texture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DISIC/gazette-bluehats/HEAD/docs/viewerjs/images/texture.png -------------------------------------------------------------------------------- /static/viewerjs/images/nlnet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DISIC/gazette-bluehats/HEAD/static/viewerjs/images/nlnet.png -------------------------------------------------------------------------------- /static/viewerjs/images/kogmbh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DISIC/gazette-bluehats/HEAD/static/viewerjs/images/kogmbh.png -------------------------------------------------------------------------------- /static/viewerjs/images/texture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DISIC/gazette-bluehats/HEAD/static/viewerjs/images/texture.png -------------------------------------------------------------------------------- /template.org: -------------------------------------------------------------------------------- 1 | #+title: Title 2 | #+date: YYYY-MM-DD 3 | #+author: Bastien 4 | #+layout: post 5 | #+draft: true 6 | #+tags: 7 | -------------------------------------------------------------------------------- /archetypes/default.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "{{ replace .Name "-" " " | title }}" 3 | date: {{ .Date }} 4 | draft: true 5 | --- 6 | 7 | -------------------------------------------------------------------------------- /static/dist/fonts/Marianne-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DISIC/gazette-bluehats/HEAD/static/dist/fonts/Marianne-Bold.woff -------------------------------------------------------------------------------- /static/dist/fonts/Marianne-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DISIC/gazette-bluehats/HEAD/static/dist/fonts/Marianne-Bold.woff2 -------------------------------------------------------------------------------- /static/dist/fonts/Marianne-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DISIC/gazette-bluehats/HEAD/static/dist/fonts/Marianne-Regular.woff -------------------------------------------------------------------------------- /static/dist/fonts/Marianne-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DISIC/gazette-bluehats/HEAD/static/dist/fonts/Marianne-Regular.woff2 -------------------------------------------------------------------------------- /docs/viewerjs/images/toolbarButton-pageUp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DISIC/gazette-bluehats/HEAD/docs/viewerjs/images/toolbarButton-pageUp.png -------------------------------------------------------------------------------- /docs/viewerjs/images/toolbarButton-zoomIn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DISIC/gazette-bluehats/HEAD/docs/viewerjs/images/toolbarButton-zoomIn.png -------------------------------------------------------------------------------- /docs/viewerjs/images/toolbarButton-download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DISIC/gazette-bluehats/HEAD/docs/viewerjs/images/toolbarButton-download.png -------------------------------------------------------------------------------- /docs/viewerjs/images/toolbarButton-pageDown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DISIC/gazette-bluehats/HEAD/docs/viewerjs/images/toolbarButton-pageDown.png -------------------------------------------------------------------------------- /docs/viewerjs/images/toolbarButton-zoomOut.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DISIC/gazette-bluehats/HEAD/docs/viewerjs/images/toolbarButton-zoomOut.png -------------------------------------------------------------------------------- /static/viewerjs/images/toolbarButton-pageUp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DISIC/gazette-bluehats/HEAD/static/viewerjs/images/toolbarButton-pageUp.png -------------------------------------------------------------------------------- /static/viewerjs/images/toolbarButton-zoomIn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DISIC/gazette-bluehats/HEAD/static/viewerjs/images/toolbarButton-zoomIn.png -------------------------------------------------------------------------------- /docs/viewerjs/images/toolbarButton-fullscreen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DISIC/gazette-bluehats/HEAD/docs/viewerjs/images/toolbarButton-fullscreen.png -------------------------------------------------------------------------------- /docs/viewerjs/images/toolbarButton-menuArrows.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DISIC/gazette-bluehats/HEAD/docs/viewerjs/images/toolbarButton-menuArrows.png -------------------------------------------------------------------------------- /static/viewerjs/images/toolbarButton-download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DISIC/gazette-bluehats/HEAD/static/viewerjs/images/toolbarButton-download.png -------------------------------------------------------------------------------- /static/viewerjs/images/toolbarButton-pageDown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DISIC/gazette-bluehats/HEAD/static/viewerjs/images/toolbarButton-pageDown.png -------------------------------------------------------------------------------- /static/viewerjs/images/toolbarButton-zoomOut.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DISIC/gazette-bluehats/HEAD/static/viewerjs/images/toolbarButton-zoomOut.png -------------------------------------------------------------------------------- /docs/viewerjs/images/toolbarButton-presentation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DISIC/gazette-bluehats/HEAD/docs/viewerjs/images/toolbarButton-presentation.png -------------------------------------------------------------------------------- /static/viewerjs/images/toolbarButton-fullscreen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DISIC/gazette-bluehats/HEAD/static/viewerjs/images/toolbarButton-fullscreen.png -------------------------------------------------------------------------------- /static/viewerjs/images/toolbarButton-menuArrows.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DISIC/gazette-bluehats/HEAD/static/viewerjs/images/toolbarButton-menuArrows.png -------------------------------------------------------------------------------- /static/viewerjs/images/toolbarButton-presentation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DISIC/gazette-bluehats/HEAD/static/viewerjs/images/toolbarButton-presentation.png -------------------------------------------------------------------------------- /layouts/partials/disqus.html: -------------------------------------------------------------------------------- 1 | {{ if .Site.DisqusShortname }} 2 |
3 | {{ template "_internal/disqus.html" . }} 4 |
5 | {{ end }} -------------------------------------------------------------------------------- /layouts/partials/navigation.html: -------------------------------------------------------------------------------- 1 | {{ range .Site.Menus.main.ByWeight }} 2 | 5 | {{ end }} -------------------------------------------------------------------------------- /layouts/partials/page-content.html: -------------------------------------------------------------------------------- 1 |
2 | {{ with .Params.Image }} 3 | 4 | {{ end }} 5 | 6 | {{ .Content }} 7 |
-------------------------------------------------------------------------------- /layouts/partials/page-header.html: -------------------------------------------------------------------------------- 1 |
2 |

{{ .Title }}

3 | {{ if .Description }} 4 |

{{ .Description }}

5 | {{ end }} 6 |
-------------------------------------------------------------------------------- /layouts/partials/post-content.html: -------------------------------------------------------------------------------- 1 |
2 | {{ with .Params.Image }} 3 | 4 | {{ end }} 5 | 6 | {{ .Content }} 7 |
-------------------------------------------------------------------------------- /layouts/partials/intro.html: -------------------------------------------------------------------------------- 1 | {{ if .Site.Params.intro }} 2 |
3 |

{{ .Site.Params.headline }}

4 |

{{ .Site.Params.description }}

5 |
6 | {{ end }} 7 | -------------------------------------------------------------------------------- /layouts/404.html: -------------------------------------------------------------------------------- 1 | {{ partial "header.html" . }} 2 | 3 |
4 | {{ partial "intro.html" . }} 5 |

Oh, this page does not exist. You can head back to homepage.

6 |
7 | 8 | {{ partial "footer.html" . }} 9 | -------------------------------------------------------------------------------- /layouts/page/single.html: -------------------------------------------------------------------------------- 1 | {{ partial "header.html" . }} 2 | 3 |
4 |
5 | {{ partial "page-header.html" . }} 6 | 7 | {{ partial "page-content.html" . }} 8 |
9 |
10 | 11 | {{ partial "footer.html" . }} 12 | -------------------------------------------------------------------------------- /docs/fr/index.html: -------------------------------------------------------------------------------- 1 | https://disic.github.io/gazette-bluehats/ -------------------------------------------------------------------------------- /docs/page/1/index.html: -------------------------------------------------------------------------------- 1 | https://disic.github.io/gazette-bluehats/ -------------------------------------------------------------------------------- /docs/en/page/1/index.html: -------------------------------------------------------------------------------- 1 | https://disic.github.io/gazette-bluehats/en/ -------------------------------------------------------------------------------- /docs/post/page/1/index.html: -------------------------------------------------------------------------------- 1 | https://disic.github.io/gazette-bluehats/post/ -------------------------------------------------------------------------------- /docs/tags/page/1/index.html: -------------------------------------------------------------------------------- 1 | https://disic.github.io/gazette-bluehats/tags/ -------------------------------------------------------------------------------- /docs/en/tags/page/1/index.html: -------------------------------------------------------------------------------- 1 | https://disic.github.io/gazette-bluehats/en/tags/ -------------------------------------------------------------------------------- /docs/sitemap.xml: -------------------------------------------------------------------------------- 1 | https://disic.github.io/gazette-bluehats/fr/sitemap.xml2021-06-23T00:00:00+00:00https://disic.github.io/gazette-bluehats/en/sitemap.xml -------------------------------------------------------------------------------- /docs/categories/page/1/index.html: -------------------------------------------------------------------------------- 1 | https://disic.github.io/gazette-bluehats/categories/ -------------------------------------------------------------------------------- /layouts/_default/single.html: -------------------------------------------------------------------------------- 1 | {{ partial "header.html" . }} 2 | 3 |
4 |
5 | {{ partial "page-header.html" . }} 6 | 7 | {{ partial "page-content.html" . }} 8 | 9 | {{ partial "post-footer.html" . }} 10 |
11 |
12 | 13 | {{ partial "footer.html" . }} 14 | -------------------------------------------------------------------------------- /docs/en/categories/page/1/index.html: -------------------------------------------------------------------------------- 1 | https://disic.github.io/gazette-bluehats/en/categories/ -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/annonce-logiciel.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Annonce autour d'un logiciel 3 | about: Annoncer une mise à jour ou une autre nouvelle concernant un logiciel libre 4 | title: 'Logiciel : ' 5 | labels: '' 6 | assignees: 'bzg' 7 | --- 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /layouts/partials/page-stub.html: -------------------------------------------------------------------------------- 1 |
  • 2 | 3 |

    {{ .Title }}

    4 | {{ if .Description }} 5 |

    {{ .Description }}

    6 | {{ end }} 7 | {{ with .Params.featured }} 8 | Featured 9 | {{ end }} 10 |
    11 |
  • -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/cr-evenement.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Compte-rendu d'un événement 3 | about: Partager un compte-rendu autour d'un événement 4 | title: 'Compte-rendu : ' 5 | labels: '' 6 | assignees: 'bzg' 7 | --- 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/annonce-evenement.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Annonce d'un événement 3 | about: Annoncer un événement à venir dans les deux prochains mois 4 | title: 'Événement : ' 5 | labels: '' 6 | assignees: 'bzg' 7 | --- 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /layouts/post/single.html: -------------------------------------------------------------------------------- 1 | {{ partial "header.html" . }} 2 | 3 |
    4 |
    5 | {{ partial "post-header.html" . }} 6 | 7 | {{ partial "post-content.html" . }} 8 | 9 | {{ partial "post-footer.html" . }} 10 | 11 | {{ partial "disqus.html" . }} 12 |
    13 |
    14 | 15 | {{ partial "footer.html" . }} 16 | -------------------------------------------------------------------------------- /layouts/post/list.html: -------------------------------------------------------------------------------- 1 | {{ partial "header.html" . }} 2 | 3 |
    4 | {{ partial "intro.html" . }} 5 | 6 |
      7 | {{ $pag := .Paginate .Pages }} 8 | {{ range $pag.Pages }} 9 | {{ partial "post-stub.html" . }} 10 | {{ end }} 11 |
    12 | 13 |
    14 | {{ partial "pagination.html" . }} 15 |
    16 |
    17 | 18 | {{ partial "footer.html" . }} -------------------------------------------------------------------------------- /layouts/_default/list.html: -------------------------------------------------------------------------------- 1 | {{ partial "header.html" . }} 2 | 3 |
    4 | {{ partial "intro.html" . }} 5 | 6 |
      7 | {{ $pag := .Paginate .Pages }} 8 | {{ range $pag.Pages }} 9 | {{ partial "page-stub.html" . }} 10 | {{ end }} 11 |
    12 | 13 |
    14 | {{ partial "pagination.html" . }} 15 |
    16 |
    17 | 18 | {{ partial "footer.html" . }} -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/temoignage.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Témoignage 3 | about: Raconter une expérience autour d'un logiciel libre de/pour l'administration publique 4 | title: 'Témoignage : ' 5 | labels: '' 6 | assignees: 'bzg' 7 | --- 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /layouts/tag/list.html: -------------------------------------------------------------------------------- 1 | {{ partial "header.html" . }} 2 | 3 |
    4 | {{ partial "intro.html" . }} 5 | 6 |
      7 | {{ $pag := .Paginate .Pages }} 8 | {{ range $pag.Pages }} 9 | {{ partial "page-stub.html" . }} 10 | {{ end }} 11 |
    12 | 13 |
    14 | {{ partial "tag-pagination.html" . }} 15 |
    16 |
    17 | 18 | {{ partial "footer.html" . }} -------------------------------------------------------------------------------- /docs/en/index.xml: -------------------------------------------------------------------------------- 1 | Gazette #BlueHatshttps://disic.github.io/gazette-bluehats/en/Recent content on Gazette #BlueHatsHugo -- gohugo.iofr-FrDirection interministérielle du numérique -------------------------------------------------------------------------------- /docs/tags/index.xml: -------------------------------------------------------------------------------- 1 | Tags on Gazette #BlueHatshttps://disic.github.io/gazette-bluehats/tags/Recent content in Tags on Gazette #BlueHatsHugo -- gohugo.iofr-FrDirection interministérielle du numérique -------------------------------------------------------------------------------- /layouts/partials/opengraph.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {{- with .Params.images }} 6 | {{- range first 6 . }} 7 | 8 | {{- end }} 9 | {{- end }} -------------------------------------------------------------------------------- /layouts/partials/pagination.html: -------------------------------------------------------------------------------- 1 | {{ $pag := $.Paginator }} 2 | {{ if gt $pag.TotalPages 1 }} 3 | 12 | {{ end }} -------------------------------------------------------------------------------- /layouts/partials/tag-pagination.html: -------------------------------------------------------------------------------- 1 | {{ $pag := $.Paginator }} 2 | {{ if gt $pag.TotalPages 1 }} 3 | 12 | {{ end }} -------------------------------------------------------------------------------- /docs/en/tags/index.xml: -------------------------------------------------------------------------------- 1 | Tags on Gazette #BlueHatshttps://disic.github.io/gazette-bluehats/en/tags/Recent content in Tags on Gazette #BlueHatsHugo -- gohugo.iofr-FrDirection interministérielle du numérique -------------------------------------------------------------------------------- /static/dist/fonts/index.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: "Marianne"; 3 | font-style: normal; 4 | font-weight: normal; 5 | src: local("Marianne Regular"), local("Marianne-Regular"), url("Marianne-Regular.woff2") format("woff2"), url("Marianne-Regular.woff") format("woff"); 6 | } 7 | 8 | @font-face { 9 | font-family: "Marianne"; 10 | font-style: normal; 11 | font-weight: bold; 12 | src: local("Marianne Bold"), local("Marianne-Bold"), url("Marianne-Bold.woff2") format("woff2"), url("Marianne-Bold.woff") format("woff"); 13 | } 14 | 15 | -------------------------------------------------------------------------------- /docs/categories/index.xml: -------------------------------------------------------------------------------- 1 | Categories on Gazette #BlueHatshttps://disic.github.io/gazette-bluehats/categories/Recent content in Categories on Gazette #BlueHatsHugo -- gohugo.iofr-FrDirection interministérielle du numérique -------------------------------------------------------------------------------- /docs/en/categories/index.xml: -------------------------------------------------------------------------------- 1 | Categories on Gazette #BlueHatshttps://disic.github.io/gazette-bluehats/en/categories/Recent content in Categories on Gazette #BlueHatsHugo -- gohugo.iofr-FrDirection interministérielle du numérique -------------------------------------------------------------------------------- /layouts/partials/post-stub.html: -------------------------------------------------------------------------------- 1 |
  • 2 | 9 |
  • 10 | -------------------------------------------------------------------------------- /layouts/index.html: -------------------------------------------------------------------------------- 1 | {{ partial "header.html" . }} 2 | 3 |
    4 | {{ partial "intro.html" . }} 5 | 6 |
      7 | {{ $pag := .Paginate (where .Site.RegularPages "Type" "in" .Site.Params.mainSections) }} 8 | {{ range $pag.Pages }} 9 | {{ partial "post-stub.html" . }} 10 | {{ end }} 11 |
    12 | 13 |
    14 | {{ partial "pagination.html" . }} 15 |
    16 |
    17 | 18 | {{ partial "footer.html" . }} 19 | -------------------------------------------------------------------------------- /docs/js/scripts.js: -------------------------------------------------------------------------------- 1 | jQuery(function ($) { 2 | 3 | /* ============================================================ */ 4 | /* Responsive Videos */ 5 | /* ============================================================ */ 6 | 7 | $(".post-content").fitVids(); 8 | 9 | /* ============================================================ */ 10 | /* Scroll To Top */ 11 | /* ============================================================ */ 12 | 13 | $('.js-jump-top').on('click', function (e) { 14 | e.preventDefault(); 15 | 16 | $('html, body').animate({ 'scrollTop': 0 }); 17 | }); 18 | }); 19 | -------------------------------------------------------------------------------- /static/js/scripts.js: -------------------------------------------------------------------------------- 1 | jQuery(function ($) { 2 | 3 | /* ============================================================ */ 4 | /* Responsive Videos */ 5 | /* ============================================================ */ 6 | 7 | $(".post-content").fitVids(); 8 | 9 | /* ============================================================ */ 10 | /* Scroll To Top */ 11 | /* ============================================================ */ 12 | 13 | $('.js-jump-top').on('click', function (e) { 14 | e.preventDefault(); 15 | 16 | $('html, body').animate({ 'scrollTop': 0 }); 17 | }); 18 | }); 19 | -------------------------------------------------------------------------------- /layouts/partials/fathom.html: -------------------------------------------------------------------------------- 1 | {{ if .Site.Params.fathomUrl }} 2 | 3 | 16 | 17 | {{ end }} -------------------------------------------------------------------------------- /.github/workflows/gh-pages.yml: -------------------------------------------------------------------------------- 1 | name: github pages 2 | 3 | on: 4 | push: 5 | branches: 6 | - master # Set a branch to deploy 7 | pull_request: 8 | 9 | jobs: 10 | deploy: 11 | runs-on: ubuntu-20.04 12 | steps: 13 | - uses: actions/checkout@v2 14 | with: 15 | submodules: true # Fetch Hugo themes (true OR recursive) 16 | fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod 17 | 18 | - name: Setup Hugo 19 | uses: peaceiris/actions-hugo@v2 20 | with: 21 | hugo-version: 'latest' 22 | # extended: true 23 | 24 | - name: Build 25 | run: hugo --minify 26 | 27 | - name: Deploy 28 | uses: peaceiris/actions-gh-pages@v3 29 | if: github.ref == 'refs/heads/master' 30 | with: 31 | github_token: ${{ secrets.GITHUB_TOKEN }} 32 | personal_token: ${{ secrets.TOKEN }} 33 | publish_dir: ./docs 34 | -------------------------------------------------------------------------------- /docs/en/sitemap.xml: -------------------------------------------------------------------------------- 1 | https://disic.github.io/gazette-bluehats/en/categories/https://disic.github.io/gazette-bluehats/en/https://disic.github.io/gazette-bluehats/en/tags/ -------------------------------------------------------------------------------- /layouts/partials/post-header.html: -------------------------------------------------------------------------------- 1 |
    2 |

    {{ .Title }}

    3 | {{ if .Description }} 4 |

    {{ .Description }}

    5 | {{ end }} 6 |

    7 | Publiée 8 | par 9 | 14 |

    15 | {{ if .Site.Params.readingTime }} 16 |

    17 | {{ .Site.Params.readingTimeText }} {{ .Page.ReadingTime }} min 18 |

    19 | {{ end }} 20 |
    21 | -------------------------------------------------------------------------------- /static/viewerjs/example.local.css: -------------------------------------------------------------------------------- 1 | /* This is just a sample file with CSS rules. You should write your own @font-face declarations 2 | * to add support for your desired fonts. 3 | */ 4 | 5 | @font-face { 6 | font-family: 'Novecentowide Book'; 7 | src: url("/ViewerJS/fonts/Novecentowide-Bold-webfont.eot"); 8 | src: url("/ViewerJS/fonts/Novecentowide-Bold-webfont.eot?#iefix") format("embedded-opentype"), 9 | url("/ViewerJS/fonts/Novecentowide-Bold-webfont.woff") format("woff"), 10 | url("/fonts/Novecentowide-Bold-webfont.ttf") format("truetype"), 11 | url("/fonts/Novecentowide-Bold-webfont.svg#NovecentowideBookBold") format("svg"); 12 | font-weight: normal; 13 | font-style: normal; 14 | } 15 | 16 | @font-face { 17 | font-family: 'exotica'; 18 | src: url('/ViewerJS/fonts/Exotica-webfont.eot'); 19 | src: url('/ViewerJS/fonts/Exotica-webfont.eot?#iefix') format('embedded-opentype'), 20 | url('/ViewerJS/fonts/Exotica-webfont.woff') format('woff'), 21 | url('/ViewerJS/fonts/Exotica-webfont.ttf') format('truetype'), 22 | url('/ViewerJS/fonts/Exotica-webfont.svg#exoticamedium') format('svg'); 23 | font-weight: normal; 24 | font-style: normal; 25 | 26 | } 27 | 28 | -------------------------------------------------------------------------------- /docs/viewerjs/example.local.css: -------------------------------------------------------------------------------- 1 | /* This is just a sample file with CSS rules. You should write your own @font-face declarations 2 | * to add support for your desired fonts. 3 | */ 4 | 5 | @font-face { 6 | font-family: 'Novecentowide Book'; 7 | src: url("/ViewerJS/fonts/Novecentowide-Bold-webfont.eot"); 8 | src: url("/ViewerJS/fonts/Novecentowide-Bold-webfont.eot?#iefix") format("embedded-opentype"), 9 | url("/ViewerJS/fonts/Novecentowide-Bold-webfont.woff") format("woff"), 10 | url("/fonts/Novecentowide-Bold-webfont.ttf") format("truetype"), 11 | url("/fonts/Novecentowide-Bold-webfont.svg#NovecentowideBookBold") format("svg"); 12 | font-weight: normal; 13 | font-style: normal; 14 | } 15 | 16 | @font-face { 17 | font-family: 'exotica'; 18 | src: url('/ViewerJS/fonts/Exotica-webfont.eot'); 19 | src: url('/ViewerJS/fonts/Exotica-webfont.eot?#iefix') format('embedded-opentype'), 20 | url('/ViewerJS/fonts/Exotica-webfont.woff') format('woff'), 21 | url('/ViewerJS/fonts/Exotica-webfont.ttf') format('truetype'), 22 | url('/ViewerJS/fonts/Exotica-webfont.svg#exoticamedium') format('svg'); 23 | font-weight: normal; 24 | font-style: normal; 25 | 26 | } 27 | 28 | -------------------------------------------------------------------------------- /layouts/partials/exponea.html: -------------------------------------------------------------------------------- 1 | {{ if .Site.Params.exponeaJsUrl }} 2 | 3 | 12 | {{ end }} -------------------------------------------------------------------------------- /layouts/partials/footer.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /config.toml: -------------------------------------------------------------------------------- 1 | baseURL = "https://disic.github.io/gazette-bluehats/" 2 | languageCode = "fr-Fr" 3 | title = "Gazette #BlueHats" 4 | copyright = "Direction interministérielle du numérique" 5 | defaultContentLanguage = "fr" 6 | publishDir = "docs" 7 | 8 | [Author] 9 | name = "Gazette #BlueHats - La gazette du logiciel libre dans/pour l'administration" 10 | profile = "https://disic.github.io/gazette-bluehats" 11 | 12 | [Taxonomies] 13 | tag = "tags" 14 | category = "categories" 15 | 16 | [languages] 17 | [languages.fr] 18 | weight = 1 19 | [languages.fr.params] 20 | headline = "Gazette #BlueHats" 21 | description = "La gazette du logiciel libre dans/pour l'administration" 22 | [languages.en] 23 | weight = 2 24 | [languages.en.params] 25 | headline = "Gazette #BlueHats" 26 | description = "La gazette du logiciel libre dans/pour l'administration" 27 | 28 | [Params] 29 | intro = true 30 | headline = "Gazette #BlueHats" 31 | github = "https://github.com/disic/gazette-bluehats" 32 | twitter = "https://twitter.com/_DINUM" 33 | email = "bluehats@etalab.gouv.fr" 34 | opengraph = true 35 | shareTwitter = true 36 | shareFacebook = false 37 | shareGooglePlus = false 38 | shareLinkedIn = false 39 | dateFormat = "Mon 2 Jan 2006" 40 | highlightJsUrl = "" 41 | highlightJsLocalUrl = "" 42 | 43 | [Permalinks] 44 | post = "/:filename" 45 | 46 | [[languages.fr.menu.main]] 47 | name = "À propos" 48 | url = "/a-propos/" 49 | weight = 1 50 | 51 | [minify] 52 | disableCSS = false 53 | disableHTML = false 54 | disableJS = false 55 | disableJSON = false 56 | disableSVG = false 57 | disableXML = false 58 | minifyOutput = true 59 | -------------------------------------------------------------------------------- /layouts/_default/rss.xml: -------------------------------------------------------------------------------- 1 | {{- $pctx := . -}} 2 | {{- if .IsHome -}}{{ $pctx = .Site }}{{- end -}} 3 | {{- $pages := slice -}} 4 | {{- if or $.IsHome $.IsSection -}} 5 | {{- $pages = $pctx.RegularPages -}} 6 | {{- else -}} 7 | {{- $pages = $pctx.Pages -}} 8 | {{- end -}} 9 | {{- $limit := .Site.Config.Services.RSS.Limit -}} 10 | {{- if ge $limit 1 -}} 11 | {{- $pages = $pages | first $limit -}} 12 | {{- end -}} 13 | {{- printf "" | safeHTML }} 14 | 15 | 16 | {{ if eq .Title .Site.Title }}{{ .Site.Title }}{{ else }}{{ with .Title }}{{.}} on {{ end }}{{ .Site.Title }}{{ end }} 17 | {{ .Permalink }} 18 | Recent content {{ if ne .Title .Site.Title }}{{ with .Title }}in {{.}} {{ end }}{{ end }}on {{ .Site.Title }} 19 | Hugo -- gohugo.io{{ with .Site.LanguageCode }} 20 | {{.}}{{end}}{{ with .Site.Author.email }} 21 | {{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}{{end}}{{ with .Site.Author.email }} 22 | {{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}{{end}}{{ with .Site.Copyright }} 23 | {{.}}{{end}}{{ if not .Date.IsZero }} 24 | {{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}{{ end }} 25 | {{- with .OutputFormats.Get "RSS" -}} 26 | {{ printf "" .Permalink .MediaType | safeHTML }} 27 | {{- end -}} 28 | {{ range $pages }} 29 | 30 | {{ .Title }} 31 | {{ .Permalink }} 32 | {{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }} 33 | {{ with .Site.Author.email }}{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}{{end}} 34 | {{ .Permalink }} 35 | {{ .Content | html }} 36 | 37 | {{ end }} 38 | 39 | 40 | -------------------------------------------------------------------------------- /layouts/partials/post-footer.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/fr/sitemap.xml: -------------------------------------------------------------------------------- 1 | https://disic.github.io/gazette-bluehats/2021-06-23T00:00:00+00:00https://disic.github.io/gazette-bluehats/gazette_bluehat_11/2021-06-23T00:00:00+00:00https://disic.github.io/gazette-bluehats/post/2021-06-23T00:00:00+00:00https://disic.github.io/gazette-bluehats/gazette_bluehat_10/2021-04-11T00:00:00+00:00https://disic.github.io/gazette-bluehats/gazette_bluehat_9/2021-02-15T00:00:00+00:00https://disic.github.io/gazette-bluehats/gazette_bluehat_8/2020-11-18T00:00:00+00:00https://disic.github.io/gazette-bluehats/gazette_bluehat_7/2020-09-20T00:00:00+00:00https://disic.github.io/gazette-bluehats/gazette_bluehat_6/2020-07-16T00:00:00+00:00https://disic.github.io/gazette-bluehats/gazette_bluehat_5/2020-05-05T00:00:00+00:00https://disic.github.io/gazette-bluehats/gazette_bluehat_4/2019-12-08T00:00:00+00:00https://disic.github.io/gazette-bluehats/gazette_bluehat_3/2019-10-17T00:00:00+00:00https://disic.github.io/gazette-bluehats/gazette_bluehat_1/2019-06-10T00:00:00+00:00https://disic.github.io/gazette-bluehats/gazette_bluehat_0/2019-04-01T00:00:00+00:00https://disic.github.io/gazette-bluehats/a-propos/2019-01-01T00:00:00+00:00https://disic.github.io/gazette-bluehats/categories/https://disic.github.io/gazette-bluehats/tags/ -------------------------------------------------------------------------------- /README.org: -------------------------------------------------------------------------------- 1 | La gazette =#BlueHats= est la contribution de la DINUM au mouvement blue hats : elle propose tous les deux mois des informations sur le logiciel libre dans et pour l'administration. 2 | 3 | *Ce dépôt est archivé depuis le 10 novembre 2021.* 4 | 5 | Les gazettes BlueHats sont désormais publiées sur [[https://communs.numerique.gouv.fr/gazette/][communs.numerique.gouv.fr/gazette/]]. 6 | 7 | [[file:static/img/bluehats.jpg]] 8 | 9 | Pour vous y inscrire : https://infolettres.etalab.gouv.fr/subscribe/bluehats@mail.etalab.studio 10 | 11 | Voir l'article de lancement sur [[https://www.numerique.gouv.fr/actualites/la-communaute-blue-hats-hackers-dinteret-general-est-lancee-rejoignez-nous/][numerique.gouv.fr]]. 12 | 13 | * Contribuez ! 14 | 15 | Pour toute autre suggestion de contenu, écrivez-nous à =logiciels-libres@data.gouv.fr=. 16 | 17 | * Numéros précédents 18 | 19 | - [[https://disic.github.io/gazette-bluehats/gazette_bluehat_11/][Numéro 13]] (19/10/2021) 20 | - [[https://disic.github.io/gazette-bluehats/gazette_bluehat_12/][Numéro 12]] (20/08/2021) 21 | - [[https://disic.github.io/gazette-bluehats/gazette_bluehat_11/][Numéro 11]] (21/06/2021) 22 | - [[https://disic.github.io/gazette-bluehats/gazette_bluehat_11/][Numéro 11]] (21/06/2021) 23 | - [[https://disic.github.io/gazette-bluehats/gazette_bluehat_10/][Numéro 10]] (11/04/2021) 24 | - [[https://disic.github.io/gazette-bluehats/gazette_bluehat_9/][Numéro 9]] (15/02/2021) 25 | - [[https://disic.github.io/gazette-bluehats/gazette_bluehat_8/][Numéro 8]] (18/11/2020) 26 | - [[https://disic.github.io/gazette-bluehats/gazette_bluehat_7/][Numéro 7]] (20/09/2020) 27 | - [[https://disic.github.io/gazette-bluehats/gazette_bluehat_6/][Numéro 6]] (16/7/2020) 28 | - [[https://disic.github.io/gazette-bluehats/gazette_bluehat_5/][Numéro 5]] (5/5/2020) 29 | - [[https://disic.github.io/gazette-bluehats/gazette_bluehat_4/][Numéro 4]] (8/11/2019) 30 | - [[https://disic.github.io/gazette-bluehats/gazette_bluehat_3/][Numéro 3]] (17/10/2019) 31 | - Numéro 2 : pause estivale 32 | - [[https://disic.github.io/gazette-bluehats/gazette_bluehat_1/][Numéro 1]] (10/06/2019) 33 | - [[https://disic.github.io/gazette-bluehats/gazette_bluehat_0/][Numéro 0]] (01/04/2019) 34 | 35 | * Conditions générales d'utilisation 36 | 37 | L'inscription à la gazette #BlueHats est libre. L'adresse email partagée à l'[[https://infolettres.etalab.gouv.fr/subscribe/bluehats@mail.etalab.studio][inscription]] n'est partagée avec personne. Vous pouvez à tout moment vous [[https://infolettres.etalab.gouv.fr/unsubscribe/bluehats@mail.etalab.studio][désinscrire]]. 38 | 39 | * Licence 40 | 41 | La gazette #BlueHats est une publication DINUM, 20 avenue de Ségur, 42 | 75019, publié sous [[file:LICENSE.txt][licence Ouverte 2.0]]. 43 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | La gazette `#BlueHats` est la contribution de la DINUM au mouvement blue hats : elle propose tous les deux mois des informations sur le logiciel libre dans et pour l'administration. 2 | 3 | **Ce dépôt est archivé depuis le 10 novembre 2021.** 4 | 5 | Les gazettes BlueHats sont désormais publiées sur [communs.numerique.gouv.fr/gazette/](https://communs.numerique.gouv.fr/gazette/). 6 | 7 | ![img](static/img/bluehats.jpg) 8 | 9 | 10 | 11 | Voir l'article de lancement sur [numerique.gouv.fr](https://www.numerique.gouv.fr/actualites/la-communaute-blue-hats-hackers-dinteret-general-est-lancee-rejoignez-nous/). 12 | 13 | 14 | # Contribuez ! 15 | 16 | Pour toute autre suggestion de contenu, écrivez-nous à `logiciels-libres@data.gouv.fr`. 17 | 18 | 19 | # Numéros précédents 20 | 21 | - [Numéro 13](https://disic.github.io/gazette-bluehats/gazette_bluehat_11/) (19/10/2021) 22 | - [Numéro 12](https://disic.github.io/gazette-bluehats/gazette_bluehat_12/) (20/08/2021) 23 | - [Numéro 11](https://disic.github.io/gazette-bluehats/gazette_bluehat_11/) (21/06/2021) 24 | - [Numéro 11](https://disic.github.io/gazette-bluehats/gazette_bluehat_11/) (21/06/2021) 25 | - [Numéro 10](https://disic.github.io/gazette-bluehats/gazette_bluehat_10/) (11/04/2021) 26 | - [Numéro 9](https://disic.github.io/gazette-bluehats/gazette_bluehat_9/) (15/02/2021) 27 | - [Numéro 8](https://disic.github.io/gazette-bluehats/gazette_bluehat_8/) (18/11/2020) 28 | - [Numéro 7](https://disic.github.io/gazette-bluehats/gazette_bluehat_7/) (20/09/2020) 29 | - [Numéro 6](https://disic.github.io/gazette-bluehats/gazette_bluehat_6/) (16/7/2020) 30 | - [Numéro 5](https://disic.github.io/gazette-bluehats/gazette_bluehat_5/) (5/5/2020) 31 | - [Numéro 4](https://disic.github.io/gazette-bluehats/gazette_bluehat_4/) (8/11/2019) 32 | - [Numéro 3](https://disic.github.io/gazette-bluehats/gazette_bluehat_3/) (17/10/2019) 33 | - Numéro 2 : pause estivale 34 | - [Numéro 1](https://disic.github.io/gazette-bluehats/gazette_bluehat_1/) (10/06/2019) 35 | - [Numéro 0](https://disic.github.io/gazette-bluehats/gazette_bluehat_0/) (01/04/2019) 36 | 37 | 38 | # Conditions générales d'utilisation 39 | 40 | L'inscription à la gazette #BlueHats est libre. L'adresse email partagée à l'[inscription](https://infolettres.etalab.gouv.fr/subscribe/bluehats@mail.etalab.studio) n'est partagée avec personne. Vous pouvez à tout moment vous [désinscrire](https://infolettres.etalab.gouv.fr/unsubscribe/bluehats@mail.etalab.studio). 41 | 42 | 43 | # Licence 44 | 45 | La gazette #BlueHats est une publication DINUM, 20 avenue de Ségur, 46 | 75019, publié sous [licence Ouverte 2.0](LICENSE.txt). 47 | -------------------------------------------------------------------------------- /content/a-propos.fr.org: -------------------------------------------------------------------------------- 1 | #+title: À propos de la Gazette #BlueHats 2 | #+date: 2019-01-01 3 | #+author: DINUM 4 | #+layout: post 5 | #+draft: false 6 | #+tags: 7 | 8 | La gazette =#BlueHats= est la contribution de la DINUM au mouvement BlueHats : elle propose tous les deux mois des informations sur le logiciel libre dans et pour l'administration. 9 | 10 | #+begin_export html 11 |
    12 | 13 |
    14 | #+end_export html 15 | 16 | Pour vous y inscrire : [[https://infolettres.etalab.gouv.fr/subscribe/bluehats@mail.etalab.studio]] 17 | 18 | Voir l'article de lancement sur [[https://www.numerique.gouv.fr/actualites/la-communaute-blue-hats-hackers-dinteret-general-est-lancee-rejoignez-nous/][numerique.gouv.fr]]. 19 | 20 | * Contribuez ! 21 | 22 | Vous pouvez [[https://github.com/DISIC/gazette-bluehats/issues/new?assignees=bzg&labels=&template=annonce-evenement.md&title=%C3%89v%C3%A9nement+%3A+][annoncer un événement]], envoyer le [[https://github.com/DISIC/gazette-bluehats/issues/new?assignees=bzg&labels=&template=cr-evenement.md&title=Compte-rendu+%3A+][compte-rendu d'un événement]], faire une [[https://github.com/DISIC/gazette-bluehats/issues/new?assignees=bzg&labels=&template=annonce-logiciel.md&title=Logiciel+%3A+][annonce sur un logiciel libre]] particulier ou proposer un [[https://github.com/DISIC/gazette-bluehats/issues/new?assignees=bzg&labels=&template=temoignage.md&title=T%C3%A9moignage+%3A+][témoignage]]. 23 | 24 | Pour toute autre suggestion de contenu, écrivez à =bluehats@etalab.gouv.fr=. 25 | 26 | * Numéros précédents 27 | 28 | # - [[https://disic.github.io/gazette-bluehats/gazette_bluehat_12/][Numéro 12]] (20/08/2021) 29 | - [[https://disic.github.io/gazette-bluehats/gazette_bluehat_11/][Numéro 11]] (21/06/2021) 30 | - [[https://disic.github.io/gazette-bluehats/gazette_bluehat_10/][Numéro 10]] (11/04/2021) 31 | - [[https://disic.github.io/gazette-bluehats/gazette_bluehat_9/][Numéro 9]] (15/02/2021) 32 | - [[https://disic.github.io/gazette-bluehats/gazette_bluehat_8/][Numéro 8]] (18/11/2020) 33 | - [[https://disic.github.io/gazette-bluehats/gazette_bluehat_7/][Numéro 7]] (20/09/2020) 34 | - [[https://disic.github.io/gazette-bluehats/gazette_bluehat_6/][Numéro 6]] (16/7/2020) 35 | - [[https://disic.github.io/gazette-bluehats/gazette_bluehat_5/][Numéro 5]] (5/5/2020) 36 | - [[/gazette-bluehats/gazette_bluehat_4][Numéro 4]] (08/12/2019) 37 | - [[/gazette-bluehats/gazette_bluehat_3][Numéro 3]] (17/10/2019) 38 | - Numéro 2 : pause estivale 39 | - [[/gazette-bluehats/gazette_bluehat_1][Numéro 1]] (10/06/2019) 40 | - [[/gazette-bluehats/gazette_bluehat_0][Numéro 0]] (01/04/2019) 41 | 42 | * Conditions générales d'utilisation 43 | 44 | L'inscription à la gazette #BlueHats est libre. L'adresse email partagée à l'[[https://infolettres.etalab.gouv.fr/subscribe/bluehats@mail.etalab.studio][inscription]] n'est partagée avec personne. Vous pouvez à tout moment vous [[https://infolettres.etalab.gouv.fr/unsubscribe/bluehats@mail.etalab.studio][désinscrire]]. 45 | 46 | * Licence 47 | 48 | La gazette #BlueHats est une publication DINUM, 20 avenue de Ségur, 49 | 75019, publiée sous licence Ouverte 2.0. 50 | -------------------------------------------------------------------------------- /docs/dist/syntax.css: -------------------------------------------------------------------------------- 1 | .chroma { background-color: #f0f0f0; } 2 | .chroma .err { color: #a61717; background-color: #e3d2d2; } 3 | .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; } 4 | .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; width: auto; overflow: auto; display: block; } 5 | .chroma .hl { display: block; width: 100%; background-color: #ffc; } 6 | .chroma .lnt { margin-right: .4em; padding: 0 .4em 0 .4em; color: #7f7f7f; } 7 | .chroma .ln { margin-right: .4em; padding: 0 .4em 0 .4em; color: #7f7f7f; } 8 | .chroma .k { color: #000; font-weight: bold; } 9 | .chroma .kc { color: #000; font-weight: bold; } 10 | .chroma .kd { color: #000; font-weight: bold; } 11 | .chroma .kn { color: #000; font-weight: bold; } 12 | .chroma .kp { color: #000; font-weight: bold; } 13 | .chroma .kr { color: #000; font-weight: bold; } 14 | .chroma .kt { color: #458; font-weight: bold; } 15 | .chroma .na { color: #008080; } 16 | .chroma .nb { color: #0086b3; } 17 | .chroma .bp { color: #999; } 18 | .chroma .nc { color: #458; font-weight: bold; } 19 | .chroma .no { color: #008080; } 20 | .chroma .nd { color: #1f7199; font-weight: bold; } 21 | .chroma .ni { color: #800080; } 22 | .chroma .ne { color: #900; font-weight: bold; } 23 | .chroma .nf { color: #800; font-weight: bold; } 24 | .chroma .nl { color: #900; font-weight: bold; } 25 | .chroma .nn { color: #555; } 26 | .chroma .nt { color: #000080; } 27 | .chroma .nv { color: #008080; } 28 | .chroma .vc { color: #008080; } 29 | .chroma .vg { color: #008080; } 30 | .chroma .vi { color: #008080; } 31 | .chroma .s { color: #d14; } 32 | .chroma .sa { color: #d14; } 33 | .chroma .sb { color: #d14; } 34 | .chroma .sc { color: #d14; } 35 | .chroma .dl { color: #d14; } 36 | .chroma .sd { color: #d14; } 37 | .chroma .s2 { color: #800; } 38 | .chroma .se { color: #d14; } 39 | .chroma .sh { color: #d14; } 40 | .chroma .si { color: #d14; } 41 | .chroma .sx { color: #d14; } 42 | .chroma .sr { color: #009926; } 43 | .chroma .s1 { color: #800; } 44 | .chroma .ss { color: #990073; } 45 | .chroma .m { color: #099; } 46 | .chroma .mb { color: #099; } 47 | .chroma .mf { color: #099; } 48 | .chroma .mh { color: #099; } 49 | .chroma .mi { color: #099; } 50 | .chroma .il { color: #099; } 51 | .chroma .mo { color: #099; } 52 | .chroma .o { color: #000; font-weight: bold; } 53 | .chroma .ow { color: #000; font-weight: bold; } 54 | .chroma .c { color: #998; font-style: italic; } 55 | .chroma .ch { color: #998; font-style: italic; } 56 | .chroma .cm { color: #998; font-style: italic; } 57 | .chroma .c1 { color: #998; font-style: italic; } 58 | .chroma .cs { color: #999; font-weight: bold; font-style: italic; } 59 | .chroma .cp { color: #999; font-weight: bold; font-style: italic; } 60 | .chroma .cpf { color: #999; font-weight: bold; font-style: italic; } 61 | .chroma .gd { color: #000; background-color: #fdd; } 62 | .chroma .ge { color: #000; font-style: italic; } 63 | .chroma .gr { color: #a00; } 64 | .chroma .gh { color: #999; } 65 | .chroma .gi { color: #000; background-color: #dfd; } 66 | .chroma .go { color: #888; } 67 | .chroma .gp { color: #555; } 68 | .chroma .gs { font-weight: bold; } 69 | .chroma .gu { color: #aaa; } 70 | .chroma .gt { color: #a00; } 71 | .chroma .gl { text-decoration: underline; } 72 | .chroma .w { color: #bbb; } 73 | -------------------------------------------------------------------------------- /docs/en/404.html: -------------------------------------------------------------------------------- 1 | 404 Page not found · Gazette #BlueHats - La gazette du logiciel libre dans/pour l'administration

    Gazette #BlueHats

    La gazette du logiciel libre dans/pour l'administration

    Oh, this page does not exist. You can head back to homepage.

    -------------------------------------------------------------------------------- /docs/en/categories/index.html: -------------------------------------------------------------------------------- 1 | Categories · Gazette #BlueHats - La gazette du logiciel libre dans/pour l'administration

    Gazette #BlueHats

    La gazette du logiciel libre dans/pour l'administration

      -------------------------------------------------------------------------------- /docs/en/tags/index.html: -------------------------------------------------------------------------------- 1 | Tags · Gazette #BlueHats - La gazette du logiciel libre dans/pour l'administration

      Gazette #BlueHats

      La gazette du logiciel libre dans/pour l'administration

        -------------------------------------------------------------------------------- /docs/en/index.html: -------------------------------------------------------------------------------- 1 | Gazette #BlueHats · Gazette #BlueHats - La gazette du logiciel libre dans/pour l'administration

        Gazette #BlueHats

        La gazette du logiciel libre dans/pour l'administration

          -------------------------------------------------------------------------------- /docs/404.html: -------------------------------------------------------------------------------- 1 | 404 Page not found · Gazette #BlueHats - La gazette du logiciel libre dans/pour l'administration

          Gazette #BlueHats

          La gazette du logiciel libre dans/pour l'administration

          Oh, this page does not exist. You can head back to homepage.

          -------------------------------------------------------------------------------- /docs/categories/index.html: -------------------------------------------------------------------------------- 1 | Categories · Gazette #BlueHats - La gazette du logiciel libre dans/pour l'administration

          Gazette #BlueHats

          La gazette du logiciel libre dans/pour l'administration

            -------------------------------------------------------------------------------- /docs/tags/index.html: -------------------------------------------------------------------------------- 1 | Tags · Gazette #BlueHats - La gazette du logiciel libre dans/pour l'administration

            Gazette #BlueHats

            La gazette du logiciel libre dans/pour l'administration

              -------------------------------------------------------------------------------- /docs/js/jquery.fitvids.js: -------------------------------------------------------------------------------- 1 | /*global jQuery */ 2 | /*jshint browser:true */ 3 | /*! 4 | * FitVids 1.1 5 | * 6 | * Copyright 2013, Chris Coyier - http://css-tricks.com + Dave Rupert - http://daverupert.com 7 | * Credit to Thierry Koblentz - http://www.alistapart.com/articles/creating-intrinsic-ratios-for-video/ 8 | * Released under the WTFPL license - http://sam.zoy.org/wtfpl/ 9 | * 10 | */ 11 | 12 | (function( $ ){ 13 | 14 | "use strict"; 15 | 16 | $.fn.fitVids = function( options ) { 17 | var settings = { 18 | customSelector: null, 19 | ignore: null 20 | }; 21 | 22 | if(!document.getElementById('fit-vids-style')) { 23 | // appendStyles: https://github.com/toddmotto/fluidvids/blob/master/dist/fluidvids.js 24 | var head = document.head || document.getElementsByTagName('head')[0]; 25 | var css = '.fluid-width-video-wrapper{width:100%;position:relative;padding:0;}.fluid-width-video-wrapper iframe,.fluid-width-video-wrapper object,.fluid-width-video-wrapper embed {position:absolute;top:0;left:0;width:100%;height:100%;}'; 26 | var div = document.createElement('div'); 27 | div.innerHTML = '

              x

              '; 28 | head.appendChild(div.childNodes[1]); 29 | } 30 | 31 | if ( options ) { 32 | $.extend( settings, options ); 33 | } 34 | 35 | return this.each(function(){ 36 | var selectors = [ 37 | "iframe[src*='player.vimeo.com']", 38 | "iframe[src*='youtube.com']", 39 | "iframe[src*='youtube-nocookie.com']", 40 | "iframe[src*='kickstarter.com'][src*='video.html']", 41 | "object", 42 | "embed" 43 | ]; 44 | 45 | if (settings.customSelector) { 46 | selectors.push(settings.customSelector); 47 | } 48 | 49 | var ignoreList = '.fitvidsignore'; 50 | 51 | if(settings.ignore) { 52 | ignoreList = ignoreList + ', ' + settings.ignore; 53 | } 54 | 55 | var $allVideos = $(this).find(selectors.join(',')); 56 | $allVideos = $allVideos.not("object object"); // SwfObj conflict patch 57 | $allVideos = $allVideos.not(ignoreList); // Disable FitVids on this video. 58 | 59 | $allVideos.each(function(){ 60 | var $this = $(this); 61 | if($this.parents(ignoreList).length > 0) { 62 | return; // Disable FitVids on this video. 63 | } 64 | if (this.tagName.toLowerCase() === 'embed' && $this.parent('object').length || $this.parent('.fluid-width-video-wrapper').length) { return; } 65 | if ((!$this.css('height') && !$this.css('width')) && (isNaN($this.attr('height')) || isNaN($this.attr('width')))) 66 | { 67 | $this.attr('height', 9); 68 | $this.attr('width', 16); 69 | } 70 | var height = ( this.tagName.toLowerCase() === 'object' || ($this.attr('height') && !isNaN(parseInt($this.attr('height'), 10))) ) ? parseInt($this.attr('height'), 10) : $this.height(), 71 | width = !isNaN(parseInt($this.attr('width'), 10)) ? parseInt($this.attr('width'), 10) : $this.width(), 72 | aspectRatio = height / width; 73 | if(!$this.attr('id')){ 74 | var videoID = 'fitvid' + Math.floor(Math.random()*999999); 75 | $this.attr('id', videoID); 76 | } 77 | $this.wrap('
              ').parent('.fluid-width-video-wrapper').css('padding-top', (aspectRatio * 100)+"%"); 78 | $this.removeAttr('height').removeAttr('width'); 79 | }); 80 | }); 81 | }; 82 | // Works with either jQuery or Zepto 83 | })( window.jQuery || window.Zepto ); 84 | -------------------------------------------------------------------------------- /static/js/jquery.fitvids.js: -------------------------------------------------------------------------------- 1 | /*global jQuery */ 2 | /*jshint browser:true */ 3 | /*! 4 | * FitVids 1.1 5 | * 6 | * Copyright 2013, Chris Coyier - http://css-tricks.com + Dave Rupert - http://daverupert.com 7 | * Credit to Thierry Koblentz - http://www.alistapart.com/articles/creating-intrinsic-ratios-for-video/ 8 | * Released under the WTFPL license - http://sam.zoy.org/wtfpl/ 9 | * 10 | */ 11 | 12 | (function( $ ){ 13 | 14 | "use strict"; 15 | 16 | $.fn.fitVids = function( options ) { 17 | var settings = { 18 | customSelector: null, 19 | ignore: null 20 | }; 21 | 22 | if(!document.getElementById('fit-vids-style')) { 23 | // appendStyles: https://github.com/toddmotto/fluidvids/blob/master/dist/fluidvids.js 24 | var head = document.head || document.getElementsByTagName('head')[0]; 25 | var css = '.fluid-width-video-wrapper{width:100%;position:relative;padding:0;}.fluid-width-video-wrapper iframe,.fluid-width-video-wrapper object,.fluid-width-video-wrapper embed {position:absolute;top:0;left:0;width:100%;height:100%;}'; 26 | var div = document.createElement('div'); 27 | div.innerHTML = '

              x

              '; 28 | head.appendChild(div.childNodes[1]); 29 | } 30 | 31 | if ( options ) { 32 | $.extend( settings, options ); 33 | } 34 | 35 | return this.each(function(){ 36 | var selectors = [ 37 | "iframe[src*='player.vimeo.com']", 38 | "iframe[src*='youtube.com']", 39 | "iframe[src*='youtube-nocookie.com']", 40 | "iframe[src*='kickstarter.com'][src*='video.html']", 41 | "object", 42 | "embed" 43 | ]; 44 | 45 | if (settings.customSelector) { 46 | selectors.push(settings.customSelector); 47 | } 48 | 49 | var ignoreList = '.fitvidsignore'; 50 | 51 | if(settings.ignore) { 52 | ignoreList = ignoreList + ', ' + settings.ignore; 53 | } 54 | 55 | var $allVideos = $(this).find(selectors.join(',')); 56 | $allVideos = $allVideos.not("object object"); // SwfObj conflict patch 57 | $allVideos = $allVideos.not(ignoreList); // Disable FitVids on this video. 58 | 59 | $allVideos.each(function(){ 60 | var $this = $(this); 61 | if($this.parents(ignoreList).length > 0) { 62 | return; // Disable FitVids on this video. 63 | } 64 | if (this.tagName.toLowerCase() === 'embed' && $this.parent('object').length || $this.parent('.fluid-width-video-wrapper').length) { return; } 65 | if ((!$this.css('height') && !$this.css('width')) && (isNaN($this.attr('height')) || isNaN($this.attr('width')))) 66 | { 67 | $this.attr('height', 9); 68 | $this.attr('width', 16); 69 | } 70 | var height = ( this.tagName.toLowerCase() === 'object' || ($this.attr('height') && !isNaN(parseInt($this.attr('height'), 10))) ) ? parseInt($this.attr('height'), 10) : $this.height(), 71 | width = !isNaN(parseInt($this.attr('width'), 10)) ? parseInt($this.attr('width'), 10) : $this.width(), 72 | aspectRatio = height / width; 73 | if(!$this.attr('id')){ 74 | var videoID = 'fitvid' + Math.floor(Math.random()*999999); 75 | $this.attr('id', videoID); 76 | } 77 | $this.wrap('
              ').parent('.fluid-width-video-wrapper').css('padding-top', (aspectRatio * 100)+"%"); 78 | $this.removeAttr('height').removeAttr('width'); 79 | }); 80 | }); 81 | }; 82 | // Works with either jQuery or Zepto 83 | })( window.jQuery || window.Zepto ); 84 | -------------------------------------------------------------------------------- /docs/post/page/2/index.html: -------------------------------------------------------------------------------- 1 | Posts · Gazette #BlueHats - La gazette du logiciel libre dans/pour l'administration

              Gazette #BlueHats

              La gazette du logiciel libre dans/pour l'administration

              -------------------------------------------------------------------------------- /docs/page/2/index.html: -------------------------------------------------------------------------------- 1 | Gazette #BlueHats · Gazette #BlueHats - La gazette du logiciel libre dans/pour l'administration

              Gazette #BlueHats

              La gazette du logiciel libre dans/pour l'administration

              -------------------------------------------------------------------------------- /layouts/partials/header.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | {{ .Title }} · {{ .Site.Author.name }} 7 | 8 | 9 | 10 | {{ hugo.Generator }} 11 | 12 | 13 | {{ if .Site.Params.opengraph }}{{ partial "opengraph.html" . }}{{ end }} 14 | 15 | 16 | {{ if .OutputFormats.Get "RSS" }} 17 | 18 | {{ end }} 19 | {{ partial "extra-in-head.html" . }} 20 | {{ partial "exponea.html" . }} 21 | {{ partial "fathom.html" . }} 22 | 23 | 24 | {{ template "_internal/google_analytics.html" . }} 25 | 26 |
              27 | 82 | 83 |
              84 | -------------------------------------------------------------------------------- /content/post/gazette_bluehat_10.org: -------------------------------------------------------------------------------- 1 | #+title: Gazette #BlueHats n°10 2 | #+date: 2021-04-11 3 | #+author: DINUM 4 | #+layout: post 5 | #+draft: false 6 | #+options: toc:nil num:nil H:4 ^:nil pri:t html-postamble:nil html-preamble:nil 7 | #+html_head: 8 | 9 | #+begin_center 10 | La gazette [[https://disic.github.io/gazette-bluehats/][#BlueHats]] est une lettre d'information bimestrielle sur le 11 | logiciel libre dans, par et pour l'administration publique. Cette 12 | gazette est la contribution de la [[https://www.numerique.gouv.fr/][DINUM]] au mouvement des #BlueHats, 13 | les hackers d'intérêt général. 14 | 15 | Vous pouvez vous y inscrire [[https://infolettres.etalab.gouv.fr/subscribe/bluehats@mail.etalab.studio][depuis ce lien]], [[https://disic.github.io/gazette-bluehats/][lire les gazettes 16 | précédentes]] et [[https://github.com/DISIC/gazette-bluehats/issues/new/choose][proposer des contenus]] pour les prochaines éditions. 17 | 18 | Pour accéder à la version en ligne, [[https://disic.github.io/gazette-bluehats/gazette_bluehat_10/][cliquez ici]]. Bonne lecture ! 19 | ----- 20 | #+end_center 21 | 22 | * Focus : Vive le numérique libre 23 | 24 | Introduit par M. Eric Bothorel, député et responsable d’une mission 25 | relative à la politique publique de la donnée dont le rapport a été 26 | remis au Premier ministre le 23 décembre 2020, le millésime 2021 de la 27 | [[http://www.amue.fr/systeme-dinformation/metier/la-collection-numerique/][collection numérique]] publiée par l'AMUE présente le Libre sous toutes 28 | ses formes. 29 | 30 | Débats d’idées, retours d’expériences ou interviews, la thématique est 31 | abordée dans ses nombreuses dimensions et toute sa richesse. C’est un 32 | beau panorama de la question du Libre que nous vous partageons avec 33 | plaisir. Ce numéro ne manquera pas de nourrir vos réflexions. Que ses 34 | nombreux contributeurs en soient chaleureusement remerciés ! 35 | 36 | =>>= Accéder au numéro : http://amue.fr/presentation/articles/article/la-collection-numerique-parlons-libre/ 37 | 38 | * Rencontres Open Source & acteurs publics mardi 13 avril 39 | 40 | Le [[systematic-paris-region.org][Pôle Systematic]] propose aux acteurs publics de rencontrer des 41 | offreurs de solutions Open Source sélectionnés pouvant répondre à 42 | leurs besoins IT lors de rendez-vous express en one-to-one ciblés 43 | et programmés. 44 | 45 | =>>= Mardi 13 avril après-midi, 100% visio 46 | =>>= Inscriptions : https://server.matchmaking-studio.com/fr/RendezVousOneToOneOpenSource/ 47 | =>>= Lien pdf : https://systematic-paris-region.org/wp-content/uploads/2021/03/RDV121_Acteurspublics.pdf 48 | 49 | * Publication de l'annuaire du CNLL en bêta 50 | 51 | La nouvelle version de l'annuaire des entreprises du libre du CNLL 52 | inclut de nombreuses améliorations et ajouts de fonctionnalités. Ces 53 | progrès permettent au [[https://cnll.fr/][CNLL]] de mettre à disposition des utilisateurs de 54 | solutions open source un annuaire complet et thématique, offrant un 55 | large choix de critères de recherche : 56 | 57 | - par nom d'entreprise ; 58 | - par localisation (région, ville, cluster) ; 59 | - par solutions et technologies ; 60 | - par métier (éditeur, société de services, hébergeur). 61 | 62 | L'annuaire inclut également une visualisation cartographique de la 63 | localisation des entreprises. Présentée via une interface conviviale, 64 | intuitive et ergonomique, cet outil se veut être compréhensible en 65 | quelques minutes par l'utilisateur et répondre à son besoin. Nous 66 | sommes impatients de recevoir des retours d'expérience utilisateurs et 67 | suggestions possibles d'améliorations. 68 | 69 | =>>= L'annuaire : https://annuaire.cnll.fr 70 | 71 | =>>= L'annonce : https://cnll.fr/news/annuaire-des-entreprises-du-cnll-nouvelle-version/ 72 | 73 | * De-ci de-là 74 | 75 | - [[https://www.dailymotion.com/playlist/x767bq][Les vidéos des sessions des ateliers BlueHats sont publiques]] 76 | - [[https://danescenari.edu.ac-lyon.fr/sc/pub/Visios_BBB_web/co/module_Visios_BBB.html][Présentation de la solution de visioconférence de l'Éducation Nationale]] 77 | - [[https://twitter.com/jbuget/status/1366128542241730572][Le moteur open source de pix.fr réutilisé pour ecriplus.fr]] 78 | 79 | * Revue de presse 80 | 81 | - [[https://www.journaldunet.com/solutions/dsi/1498485-jitsi-meet-vs-nextcloud-talk-le-match-des-zoom-open-source/][Match des Zoom open source : Jitsi, la simplicité, vs Nextcloud Talk, l'efficacité]] (journaldunet.com, 8 mars 2021) 82 | - [[https://www.banquedesterritoires.fr/geotrek-du-logiciel-libre-la-creation-dun-ecosysteme-numerique-de-la-randonnee][Geotrek : du logiciel libre à la création d’un écosystème numérique de la randonnée]] (banquedesterritoires.fr, 26 février 2021) 83 | - [[https://adullact.org/breves/68-actualite/vie-associative/958-le-nouveau-service-demarches-simplifiees-est-operationnel][Le nouveau service Démarches Simplifiées de l'Adullact est opérationnel]] (adullact.org, 25 février 2021) 84 | - [[https://www.franceculture.fr/emissions/la-question-du-jour/pourquoi-les-logiciels-libres-interessent-ils-les-etats][Pourquoi les logiciels libres intéressent-ils les États ?]] (franculture.fr, 16 février 2021) 85 | - [[https://www.ouvrirlascience.fr/wp-content/uploads/2021/02/Comments-by-France-on-UNESCO-first-draft-reco-Open-Science.pdf][Le retour de la France sur le premier draft des recommendations UNESCO sur la science ouverte]] (ouvrirlascience.fr, Décembre 2020) 86 | -------------------------------------------------------------------------------- /docs/post/index.html: -------------------------------------------------------------------------------- 1 | Posts · Gazette #BlueHats - La gazette du logiciel libre dans/pour l'administration -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | Gazette #BlueHats · Gazette #BlueHats - La gazette du logiciel libre dans/pour l'administration -------------------------------------------------------------------------------- /docs/a-propos/index.html: -------------------------------------------------------------------------------- 1 | À propos de la Gazette #BlueHats · Gazette #BlueHats - La gazette du logiciel libre dans/pour l'administration

              À propos de la Gazette #BlueHats

              La gazette #BlueHats est la contribution de la DINUM au mouvement BlueHats : elle propose tous les deux mois des informations sur le logiciel libre dans et pour l'administration.

              Pour vous y inscrire : https://infolettres.etalab.gouv.fr/subscribe/bluehats@mail.etalab.studio

              Voir l'article de lancement sur numerique.gouv.fr.

              Contribuez !

              Vous pouvez annoncer un événement, envoyer le compte-rendu d'un événement, faire une annonce sur un logiciel libre particulier ou proposer un témoignage.

              Pour toute autre suggestion de contenu, écrivez à bluehats@etalab.gouv.fr.

              Numéros précédents

              Conditions générales d'utilisation

              L'inscription à la gazette #BlueHats est libre. L'adresse email partagée à l'inscription n'est partagée avec personne. Vous pouvez à tout moment vous désinscrire.

              Licence

              La gazette #BlueHats est une publication DINUM, 20 avenue de Ségur, 8 | 75019, publiée sous licence Ouverte 2.0.

              -------------------------------------------------------------------------------- /content/post/gazette_bluehat_8.org: -------------------------------------------------------------------------------- 1 | #+title: Gazette #BlueHats n°8 2 | #+date: 2020-11-18 3 | #+author: DINUM 4 | #+layout: post 5 | #+draft: false 6 | #+options: toc:nil num:nil H:4 ^:nil pri:t html-postamble:nil html-preamble:nil 7 | #+html_head: 8 | 9 | # Intro 10 | 11 | #+begin_center 12 | La gazette [[https://disic.github.io/gazette-bluehats/][#BlueHats]] est une lettre d'information bimestrielle sur le 13 | logiciel libre dans, par et pour l'administration publique. Cette 14 | gazette est la contribution de la [[https://www.numerique.gouv.fr/][DINUM]] au mouvement des #BlueHats, 15 | les hackers d'intérêt général. 16 | 17 | Vous pouvez vous y inscrire [[https://infolettres.etalab.gouv.fr/subscribe/bluehats@mail.etalab.studio][depuis ce lien]], [[https://disic.github.io/gazette-bluehats/][lire les gazettes 18 | précédentes]] et [[https://github.com/DISIC/gazette-bluehats/issues/new/choose][proposer des contenus]] pour les prochaines éditions. 19 | 20 | Pour accéder à la version en ligne, [[https://disic.github.io/gazette-bluehats/gazette_bluehat_8/][cliquez ici]]. Bonne lecture ! 21 | ----- 22 | #+end_center 23 | 24 | * Une liste #BlueHats pour échanger 25 | 26 | Une gazette, c'est bien, une liste pour échanger, c'est mieux ! 27 | 28 | La liste est ouverte à tous, agents public ou non. Les échanges et 29 | les archives de cette liste sont privés. 30 | 31 | =>>= Pour vous inscrire en ligne : [[https://listes.etalab.gouv.fr/listinfo/bluehats][listes.etalab.gouv.fr]] 32 | 33 | * Le calendrier des ateliers #BlueHats 34 | 35 | Depuis juillet 2020, et à l'initiative des référents du [[https://sill.etalab.gouv.fr/fr/software][Socle 36 | Interministériel de Logiciels Libres]], des wébinaires en ligne sont 37 | régulièrement organisés pour présenter des logiciels libres utilisés 38 | dans l'administration. 39 | 40 | Le prochain atelier aura lieu ce vendredi 20 novembre à 11h en visio 41 | et portera sur [[https://www.xwiki.org/xwiki/bin/view/Main/WebHome][XWiki]]. Les ateliers suivants porteront sur Prodige et 42 | Atlasanté, l'association Exodus Privacy, le projet OpenMole, les JDEV 43 | et la plateforme vidéo “Constellation”, ainsi que la solution Tuleap. 44 | 45 | Si vous voulez présenter un cas d'utilisation d'une solution libre 46 | dans l'administration, n'hésitez pas à proposer un atelier #BlueHats ! 47 | 48 | =>>= Consultez le [[https://box.bzg.io/cloud/index.php/apps/calendar/p/Lt2cGqsFS82mjkWL][calendrier en ligne]] 49 | 50 | =>>= Consultez le pad avec [[https://pad.incubateur.net/d3cj0U1WT42y-rQoozp4gQ][le détail des événements]] 51 | 52 | * La Commission européenne publie sa stratégie Open Source 53 | 54 | Le 21 octobre, la Commission européenne a approuvé la nouvelle 55 | stratégie Open Source pour 2020-2023. 56 | 57 | =>>= En lire plus sur [[https://ec.europa.eu/info/departments/informatics/open-source-software-strategy_en][le site de la Commission européenne]] 58 | =>>= Lire le rapport [[https://ec.europa.eu/info/sites/info/files/fr_ec_open_source_strategy_2020-2023.pdf][en français]] ou [[https://ec.europa.eu/info/sites/info/files/en_ec_open_source_strategy_2020-2023.pdf][en anglais]] 59 | 60 | Dans la presse : 61 | 62 | - [[https://www.silicon.fr/open-source-engagements-commission-europeenne-349799.html][Open Source : les 5 engagements de la Commission européenne]] (silicon.fr) 63 | - [[https://www.zdnet.fr/blogs/l-esprit-libre/la-commission-europeenne-fervent-utilisateur-des-logiciels-libres-39911923.htm][La Commission européenne "fervent utilisateur des logiciels libres"]] (zdnet.fr) 64 | 65 | * Guidelines for creating sustainable open source communities 66 | 67 | L'Open Source Observatory européen vient de publier un guide pour la 68 | création de communautés libres durables dans le secteur public. 69 | 70 | =>>= Lire le guide en anglais [[https://joinup.ec.europa.eu/collection/open-source-observatory-osor/guidelines-creating-sustainable-open-source-communities][sur le site de l'Observatoire de l'Open Source]] 71 | 72 | * Le MENJS a contribué à BigBlueButton 73 | 74 | Le MENJS a financé des développements pour la solution de 75 | visioconférence BigBlueButton, notamment pour le téléversement de 76 | documents avant d'entrer dans un salon : cela permet d'éviter que les 77 | enseignants avec une connexion lente ne passent du temps à téléverser 78 | dans le salon des documents lourds et que les élèves soient "seuls" 79 | dans le salon avec l'enseignant bloqué sur la page de téléversement. 80 | 81 | =>>= Voir [[https://github.com/bigbluebutton/greenlight/releases/tag/release-2.7][les notes de publication de la version 2.7]] 82 | 83 | * Compte-rendu des rencontres Scenari 84 | 85 | L'association Scenari, qui fédère les utilisateur⋅rice⋅s du logiciel 86 | libre Scenari, a organisé comme chaque année ses "Rencontres" pour 87 | écouter la communauté d'utilisateur⋅rice⋅s, faire partager des retours 88 | d'expérience et des ateliers, apporter des l'information sur les 89 | prochains axes de développement et créer des synergies entre 90 | participant⋅e⋅s. 91 | 92 | 201 personnes se sont inscrites pour visionner les 12 retours 93 | d'expérience et les 8 ateliers proposés en modalité asynchrone, et 94 | participer aux sessions synchrones de visioconférence les 29-30 95 | octobre. L'association a aussi réalisé son Assemblée Générale annuelle 96 | le 28 octobre et à renouvelé son bureau par la même occasion. 97 | 98 | =>>= Plus de détails en ligne : [[https://scenari.org/rencontres2020][scenari.org/rencontres2020]] 99 | 100 | * Clinique #BlueHats pour l'ouverture des codes sources 101 | 102 | Le lundi 23 novembre de 13h30 à 17h30, dans le cadre du mois de 103 | l'innovation publique, Etalab organise une « clinique » d'ouverture 104 | des codes sources publics. Besoin d’aide pour ouvrir des codes 105 | sources ? Venez posez vos questions et proposer vos codes sources lors 106 | de sessions de travail collectives et individuelles. 107 | 108 | La rencontre aura lieu en visioconférence. 109 | 110 | =>>= En savoir plus sur la page du [[https://www.modernisation.gouv.fr/mois-innovation-publique/evenement/ouvrez-vos-codes-sources][mois de l'innovation publique]] 111 | 112 | * Revue de presse 113 | 114 | - [[https://www.acteurspublics.fr/articles/ouverture-des-donnees-des-pistes-pour-relancer-la-machine][Ouverture des données : des pistes pour relancer la machine]] (acteurspublics.fr) 115 | - [[https://www.acteurspublics.fr/articles/etats-generaux-du-numerique-educatif-les-lecons-que-tire-le-ministere-de-sa-consultation-publique][États généraux du numérique éducatif : les leçons que tire le ministère de sa consultation publique]] (acteurspublics.fr) 116 | - [[https://labo.societenumerique.gouv.fr/2020/10/26/ouverture-des-donnees-publiques-sur-fond-de-crise-sanitaire-une-mission-se-penche-sur-la-politique-publique-de-la-donnee/][Ouverture des données publiques sur fond de crise sanitaire : une mission se penche sur la politique publique de la donnée]] (labo.societenumerique.gouv.fr) 117 | - [[https://www.cio-online.com/actualites/lire-demarches-simplifiees-les-collectivites-locales-servies-par-l-adullact-12645.html][Démarches Simplifiées : les collectivités locales servies par l'ADULLACT]] (cio-online.com) 118 | - [[https://www.lagazettedescommunes.com/700244/demarches-simplifiees-une-plateforme-specialement-destinee-aux-collectivites/][Démarches simplifiées : une plateforme spécialement destinée aux collectivités]] (lagazettedescommunes.com) 119 | - [[https://www.itforbusiness.fr/pourquoi-est-il-si-difficile-de-trouver-des-alternatives-aux-gafam-41068][Pourquoi est-il si difficile de trouver des alternatives aux GAFAM ?]] (itforbusiness.fr) 120 | - [[https://www.acteurspublics.fr/articles/letat-travaille-sur-une-nouvelle-solution-de-visioconference-pour-leducation-nationale][L’État travaille sur une nouvelle solution de visioconférence pour l’éducation nationale]] (acteurspublics.fr) 121 | - [[https://lehub.bpifrance.fr/open-source-modele-reconnu/][L’Open Source : un modèle qui gagne à être (re)connu avec Digital Venture]] (lehub.bpifrance.fr) 122 | 123 | ----- 124 | 125 | #+begin_export html 126 | 127 | #+end_export 128 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | LICENCE OUVERTE 2.0/OPEN LICENCE 2.0 2 | ==================================== 3 | 4 | Réutilisation de l'« Information » sous cette licence 5 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 6 | 7 | Le « Concédant » concède au « Réutilisateur » un droit non exclusif et 8 | gratuit de libre  « Réutilisation » de l'« Information » objet de la 9 | présente licence, à des fins commerciales ou non, dans le monde entier 10 | et pour une durée illimitée, dans les conditions exprimées ci-dessous. 11 | 12 | *Le « Réutilisateur » est libre de réutiliser l'« Information » :* 13 | 14 | - de la communiquer, la reproduire, la copier ; 15 | - de l'adapter, la modifier, l'extraire et la transformer, notamment 16 | pour créer des « Informations dérivées » ; 17 | - de la diffuser, la redistribuer, la publier et la transmettre, de 18 | l'exploiter à titre commercial, par exemple en la combinant avec 19 | d'autres informations, ou en l'incluant dans votre propre produit ou 20 | application. 21 | 22 | *Sous réserve de :* 23 | 24 | - mentionner la paternité de l'«Information» : sa source (a minima le 25 | nom du « Concédant ») et la date de la dernière mise à jour de 26 | l'« Information » réutilisée. 27 | 28 | Le « Réutilisateur » peut notamment s'acquitter de cette condition en 29 | indiquant l'adresse (URL) renvoyant vers « l'Information » et assurant 30 | une mention effective de sa paternité. 31 | 32 | *Par exemple :* 33 | 34 | Dans le cas d'une réutilisation de la base SIRENE de l'INSEE, 35 | mentionner l'URL du « Concédant » : www.insee.fr + la date de dernière 36 | mise à jour de l'Information réutilisée. 37 | 38 | Cette mention de paternité ne doit ni conférer un caractère officiel à 39 | la « Réutilisation » de l'« Information », ni suggérer une quelconque 40 | reconnaissance ou caution par le « Concédant », ou par toute autre 41 | entité publique, du « Réutilisateur » ou de sa « Réutilisation ». 42 | 43 | 44 | Données à caractère personnel 45 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 46 | 47 | L'« Information » mise à disposition peut contenir des « Données à 48 | caractère personnel » pouvant faire l'objet d'une « Réutilisation ». 49 | Alors, le « Concédant » informe le « Réutilisateur » (par tous moyens) 50 | de leur présence, l' « Information » peut être librement réutilisée, 51 | sans faire obstacle aux libertés accordées par la présente licence, à 52 | condition de respecter le cadre légal relatif à la protection des 53 | données à caractère personnel. 54 | 55 | 56 | Droits de propriété intellectuelle 57 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | 59 | Il est garanti au « Réutilisateur » que l' « Information » ne contient 60 | pas de « Droits de propriété intellectuelle »  appartenant à des tiers 61 | qui pourraient faire obstacle aux libertés qui lui sont accordées par 62 | la présente licence. 63 | 64 | Les éventuels « Droits de propriété intellectuelle » détenus par le 65 | « Concédant » sur l' « Information » ne font pas obstacle aux libertés 66 | qui sont accordées par la présente licence. Lorsque le « Concédant » 67 | détient des « Droits de propriété intellectuelle » » sur l' 68 | « Information », il les cède au « Réutilisateur » de façon non 69 | exclusive, à titre gracieux, pour le monde entier, pour toute la durée 70 | des « Droits de propriété intellectuelle », et le « Réutilisateur » 71 | peut en faire tout usage conformément aux libertés et aux conditions 72 | définies par la présente licence. 73 | 74 | 75 | Responsabilité 76 | ~~~~~~~~~~~~~~ 77 | 78 | L' «Information» est mise à disposition telle que produite ou reçue, 79 | sans autre garantie expresse ou tacite qui n'est pas prévue par la 80 | présente licence. L'absence de défauts ou d'erreurs éventuellement 81 | contenues dans l' «Information», comme la fourniture continue de l' 82 | « Information » n'est pas garantie par le «Concédant». Il ne peut être 83 | tenu pour responsable de toute perte, préjudice ou dommage de quelque 84 | sorte causé à des tiers du fait de la « Réutilisation ». 85 | 86 | Le « Réutilisateur » est seul responsable de la « Réutilisation » de 87 | l'« Information ». 88 | 89 | La « Réutilisation » ne doit pas induire en erreur des tiers quant au 90 | contenu de l'« Information », sa source et sa date de mise à jour. 91 | 92 | 93 | Droit applicable 94 | ~~~~~~~~~~~~~~~~ 95 | 96 | La présente licence est régie par le droit français. 97 | 98 | 99 | Compatibilité de la présente licence 100 | ------------------------------------ 101 | 102 | Elle a été conçue pour être compatible avec toute licence libre qui 103 | exige /a minima/ la mention de paternité. Elle est notamment 104 | compatible avec la version antérieure de la présente licence ainsi 105 | qu'avec les licences « Open Government Licence » (OGL) du Royaume-Uni, 106 | « Creative Commons Attribution » (CC-BY) de Creative Commons et « Open 107 | Data Commons Attribution » (ODC-BY) de l'Open Knowledge Foundation. 108 | 109 | 110 | Définitions 111 | ~~~~~~~~~~~ 112 | 113 | Sont considérés, au sens de la présente licence comme : 114 | 115 | - Le « *Concédant* » : toute personne concédant un droit de 116 | « Réutilisation » sur l'« Information » dans les libertés et les 117 | conditions prévues par la présente licence. 118 | - L'« *Information* » : 119 | - toute information publique figurant dans des documents communiqués 120 | ou publiés par une administration mentionnée au premier alinéa de 121 | l'article L.300-2 du CRPA ; 122 | - toute information mise à disposition par toute personne selon les 123 | termes et conditions de la présente licence. 124 | - La « *Réutilisation* » : l'utilisation de l'« Information » à 125 | d'autres fins que celles pour lesquelles elle a été produite ou 126 | reçue. 127 | - Le « *Réutilisateur* » : toute personne qui réutilise les 128 | « Informations »  conformément aux conditions de la présente 129 | licence. 130 | - Des « *Données à caractère personnel* » : toute information se 131 | rapportant à une personne physique identifiée ou identifiable, 132 | pouvant être identifiée directement ou indirectement. Leur 133 | « Réutilisation » est subordonnée au respect du cadre juridique en 134 | vigueur. 135 | - Une « *Information dérivée* » : toute nouvelle donnée ou information 136 | créées directement à partir de l'« Information » ou à partir d'une 137 | combinaison de l' « Information » et d'autres données ou 138 | informations non soumises à cette licence. 139 | - Les « *Droits de propriété intellectuelle* » : tous droits 140 | identifiés comme tels par le Code de la propriété intellectuelle 141 | (droit d'auteur, droits voisins au droit d'auteur, droit sui generis 142 | des producteurs de bases de données). 143 | 144 | 145 | À propos de cette licence 146 | ~~~~~~~~~~~~~~~~~~~~~~~~~ 147 | 148 | La présente licence a vocation à être utilisée par les administrations 149 | pour la réutilisation de leurs informations publiques. Elle peut 150 | également être utilisée par toute personne souhaitant mettre à 151 | disposition de l'« Information » dans les conditions définies par la 152 | présente licence 153 | 154 | La France est dotée d'un cadre juridique global visant à une diffusion 155 | spontanée par les administrations de leurs informations publiques afin 156 | d'en permettre la plus large réutilisation. 157 | 158 | Le droit de la « Réutilisation » de l'« Information » des 159 | administrations est régi par le code des relations entre le public et 160 | l'administration (CRPA) et, le cas échéant, le code du patrimoine 161 | (livre II relatif aux archives). 162 | 163 | Cette licence facilite la réutilisation libre et gratuite des 164 | informations publiques et figure parmi les licences qui peuvent être 165 | utilisées par l'administration en vertu du décret pris en application 166 | de l'article L.323-2 du CRPA. 167 | 168 | Etalab est la mission chargée, sous l'autorité du Premier ministre, 169 | d'ouvrir le plus grand nombre de données publiques des administrations 170 | de l'État et de ses établissements publics. Elle a réalisé la Licence 171 | Ouverte pour faciliter la réutilisation libre et gratuite de ces 172 | informations publiques, telles que définies par l'article L321-1 du 173 | CRPA. 174 | 175 | Cette licence est une version 2.0 de la Licence Ouverte. 176 | 177 | Etalab se réserve la faculté de proposer de nouvelles versions de la 178 | Licence Ouverte. Cependant, les « Réutilisateurs » pourront continuer 179 | à réutiliser les informations disponibles sous cette licence s'ils le 180 | souhaitent. 181 | -------------------------------------------------------------------------------- /content/post/gazette_bluehat_0.org: -------------------------------------------------------------------------------- 1 | #+title: Gazette #BlueHats n°0 2 | #+date: 2019-04-01 3 | #+author: DINUM 4 | #+layout: post 5 | #+draft: false 6 | 7 | Merci de vous être inscrits à la « gazette BlueHats » ! 8 | 9 | * =#BlueHats=, c'est qui ? 10 | 11 | Les =#Bluehats= sont toutes les personnes qui souhaitent montrer 12 | qu'elles contribuent à des logiciels libres développés et/ou utilisés 13 | par l'administration publique : les agents publics impliqués dans le 14 | développement de ces logiciels, bien sûr, mais aussi tout citoyen qui 15 | reconnaît que son action pour des logiciels libres aide concrètement 16 | des projets de l'administration. 17 | 18 | Les =#BlueHats= portent des chapeaux bleus pour montrer leur attachement 19 | à l'administration publique : il n'y a pas un unique chapeau bleu, 20 | chacun invente le sien, il doit juste être bleu ! 21 | 22 | * Une gazette, pour quoi faire ? 23 | 24 | La gazette =#BlueHats= est la contribution de la DINSIC au mouvement 25 | =#BlueHats=. 26 | 27 | Le but de cette lettre bimensuelle est de partager des informations 28 | sur l'utilisation et le développement de logiciels libres dans et pour 29 | l'administration. Elle servira aussi à donner une vue d'ensemble des 30 | activités du réseau de compagnonnage =#BlueHats=. En la lisant, vous 31 | découvrirez des projets que vous pourrez tester ou suivre ; en y 32 | contribuant, vous partagerez vos initiatives et vos découvertes. 33 | 34 | * Dois-je demander l'autorisation ? 35 | 36 | Vous voulez organiser un événement =#BlueHats= ? Faites-le et dites-le 37 | nous ! Pas besoin d'autorisation. Envoyez-nous les comptes-rendus de 38 | vos ateliers et de vos événements, aussi modestes soient-ils, nous 39 | pourrons les relayer via la gazette. 40 | 41 | * S'approprier et faire évoluer la POCOS 42 | 43 | La « POCOS » c'est le petit nom de la politique de contribution open 44 | source de l'Etat, officielle depuis mai 2018. Cette politique répond 45 | à la question : en tant qu'agent public, comment puis-je contribuer à 46 | un logiciel libre existant ou en publiant un nouveau logiciel libre ? 47 | 48 | La version 1 de la POCOS est sortie en mai 2018, mais des corrections 49 | sont toujours en cours, n'hésitez pas à faire les vôtres : 50 | 51 | [[https://github.com/disic/politique-de-contribution-open-source/]] 52 | 53 | Pour toute question : opensource@data.gouv.fr 54 | 55 | * Le hackathon GLPI du ministère de l'Intérieur 56 | 57 | GLPI est un logiciel libre de helpdesk destiné, entre autres, au suivi 58 | de tâches ou de travaux. Lundi 18 mars a eu lieu dans les locaux du 59 | Ministère de l’Intérieur un hackathon interministériel pour rendre 60 | l’interface de GLPI accessible aux personnes non voyantes. 61 | 62 | Cette opération a eu lieu en présence d’experts de l’accessibilité 63 | numérique et du RGAA, de développeurs, d’experts du produit GLPI et de 64 | personnes non voyantes et expertes dans leurs outils d’accessibilité. 65 | A l'exception d'une développeuse de la communauté GLPI, tous étaient 66 | des agents de différentes administrations (DINSIC, Intérieur, 67 | Préfecture, INSEE, Pôle Emploi, Éducation Nationale, etc.) 68 | 69 | Cette journée a permis d’établir des constatations sur le code de 70 | l’application, d’écrire un rapport sur ce produit et de tester 71 | certaines modifications du code pour la rendre accessible. La 72 | documentation du produit a aussi été évaluée et des correctifs ont été 73 | appliqués. La prochaine étape consistera à présenter ces travaux à 74 | l’éditeur du produit afin qu’il implémente les correctifs, améliore la 75 | qualité du code pour le rendre plus accessible, pour respecter les 76 | référentiels d’accessibilité. 77 | 78 | Ce hackathon était aussi l’occasion de découvrir cette forme de 79 | travail collaboratif et de mettre les agents acteur de l’amélioration 80 | de leurs outils de travail. Pour les développeurs, c’était aussi le 81 | moyen de comprendre certains mécanismes de l’accessibilité numérique 82 | et d’être plus efficaces dans la mise en place de ces normes de 83 | développement. 84 | 85 | Nul doute que cette opération pourra se renouveler sur d’autres 86 | logiciels avec une équipe encore plus soudée par cette expérience. 87 | * La messagerie TCHAP présentée au FOSDEM 88 | 89 | TCHAP est le nom de l'application basée sur Riot Matrix. Une version 90 | de TCHAP doit bientôt être disponible pour les agents publics. Lors 91 | du FOSDEM de février 2019, Matthew Hodgson a présenté l'utilisation 92 | prochaine de Matrix par les administrations françaises : 93 | 94 | [[https://matrix.org/blog/2019/02/04/matrix-at-fosdem-2019/]] 95 | 96 | * L'Open Source Observatory évoque =#BlueHats= 97 | 98 | L'open Source Observatory (OSOR) cite l'initiative =#BlueHats= dans leur 99 | dernière lettre d'information. Ils incitent les autres pays européens 100 | à prendre exemple sur cette démarche communautaire pour renforcer la 101 | place du libre dans les administrations publiques. 102 | 103 | [[https://joinup.ec.europa.eu/news/les-blue-hats]] 104 | 105 | * Le libre chez les Entrepreneurs d'intérêt général (EIG) 106 | 107 | Le programme Entrepreneurs d'Intérêt Général permet à l'administration 108 | de s'ouvrir à des talents du numérique pour résoudre des défis publics 109 | en 10 mois. 110 | 111 | La troisième promotion du programme réunit 32 datascientistes, 112 | designers et développeurs autour de 15 défis. Lors de son lancement 113 | en février, les EIG et leurs mentors ont eu une présentation générale 114 | de la place du logiciel libre dans les défis EIG : 115 | 116 | [[https://speakerdeck.com/bluehats/les-logiciels-libres-dans-le-cadre-du-programme-entrepreneur-dinteret-general]] 117 | 118 | Une présentation plus ciblée sur les enjeux autour de la publication 119 | de logiciels libres par l'administration a été faite lors d'un atelier 120 | EIG mi-mars : 121 | 122 | [[https://speakerdeck.com/bluehats/du-logiciel-libre-ecrit-par-ladministration-publique]] 123 | 124 | Pour un récit plus détaillé de la place du libre dans la promotion EIG 125 | 2018, vous pouvez lire cet article de blog : 126 | 127 | [[https://entrepreneur-interet-general.etalab.gouv.fr/blog/2018/11/14/administrations-eig-et-logiciel-libre.html]] 128 | 129 | * Les dépôts de codes sources d'organismes publics 130 | 131 | Antoine Augusti, développeur à Etalab et EIG Link pour la troisième 132 | promotion du programme Entrepreneur d'intérêt général a développé une 133 | API exposant les métadonnées des dépôts de code source publiés par des 134 | organismes publics. 135 | 136 | [[https://github.com/etalab/data-codes-sources-fr]] 137 | 138 | Prenez une minute pour vérifier que votre organisme public est bien 139 | listé dans ce fichier et ouvrez une issue ou une pull request si ce 140 | n'est pas le cas : 141 | 142 | [[https://github.com/DISIC/politique-de-contribution-open-source/blob/master/comptes-organismes-publics]] 143 | 144 | L'API doit continuer d'évoluer et voir s'adjoindre une interface de 145 | navigation. 146 | 147 | * Focus sur le Geotrek et Geonature 148 | 149 | Témoignage de Camille Monchicourt, responsable du pôle Système 150 | d’informations du Parc national des Écrins : 151 | 152 | « Le Parc national des Écrins utilise des logiciels libres depuis de 153 | nombreuses années. Pour y contribuer à notre tour, nous avons fait le 154 | choix de publier nous aussi nos applications sous licence libre. Pour 155 | cela, nous développons des outils génériques pour répondre à nos 156 | besoins spécifiques, que ce soit pour des projets réalisés en interne 157 | ou sous-traités. Au-delà du fait de publier nos développements sur une 158 | forge sous licence libre, pour que ceux-ci soient réellement utilisés 159 | et enrichis par d’autres structures, nous avons compris qu’il fallait 160 | aussi les documenter, les illustrer, prendre du recul pour anticiper 161 | d’autres contextes d’utilisation de nos outils, utiliser des 162 | frameworks et standards, mais aussi présenter et communiquer sur ces 163 | outils pour les faire connaître. 164 | 165 | C’est ainsi que nous avons construit des communautés avec aujourd'hui 166 | plus de 100 structures utilisatrices de nos outils Geotrek et 167 | GeoNature. Nous animons ces communautés avec de l’information 168 | régulière, des rencontres annuelles, des workshops, des groupes de 169 | travail et de nombreux projets mutualisés » 170 | 171 | Pour en savoir plus, lisez le retour sur le workshop GeoNature, outil 172 | de gestion et de diffusion de données de biodiversité : 173 | 174 | [[http://www.ecrins-parcnational.fr/actualite/geeks-geonature-carburent]] 175 | 176 | * Invitez des =#BlueHats= ! 177 | 178 | Vous connaissez des personnes qui contribuent à des logiciels libres 179 | développés ou utilisés dans l'administration ? Offrez-leur un chapeau 180 | bleu et invitez-les à s'inscrire à cette gazette ! 181 | 182 | [[https://infolettres.etalab.gouv.fr/subscribe/bluehats@mail.etalab.studio]] 183 | 184 | * Une suggestion ? Une nouvelle à partager ? 185 | 186 | Faites-nous en part en répondant tout simplement à ce message ou en 187 | écrivant à =bluehats@etalab.gouv.fr=. 188 | 189 | Merci d'avance pour vos contributions ! 190 | -------------------------------------------------------------------------------- /docs/gazette_bluehat_10/index.html: -------------------------------------------------------------------------------- 1 | Gazette #BlueHats n°10 · Gazette #BlueHats - La gazette du logiciel libre dans/pour l'administration

              Gazette #BlueHats n°10

              La gazette #BlueHats est une lettre d'information bimestrielle sur le 10 | logiciel libre dans, par et pour l'administration publique. Cette 11 | gazette est la contribution de la DINUM au mouvement des #BlueHats, 12 | les hackers d'intérêt général.

              Vous pouvez vous y inscrire depuis ce lien, lire les gazettes 13 | précédentes et proposer des contenus pour les prochaines éditions.

              Pour accéder à la version en ligne, cliquez ici. Bonne lecture !


              Focus : Vive le numérique libre

              Introduit par M. Eric Bothorel, député et responsable d’une mission 14 | relative à la politique publique de la donnée dont le rapport a été 15 | remis au Premier ministre le 23 décembre 2020, le millésime 2021 de la 16 | collection numérique publiée par l'AMUE présente le Libre sous toutes 17 | ses formes.

              Débats d’idées, retours d’expériences ou interviews, la thématique est 18 | abordée dans ses nombreuses dimensions et toute sa richesse. C’est un 19 | beau panorama de la question du Libre que nous vous partageons avec 20 | plaisir. Ce numéro ne manquera pas de nourrir vos réflexions. Que ses 21 | nombreux contributeurs en soient chaleureusement remerciés !

              >> Accéder au numéro : http://amue.fr/presentation/articles/article/la-collection-numerique-parlons-libre/

              Rencontres Open Source & acteurs publics mardi 13 avril

              Le Pôle Systematic propose aux acteurs publics de rencontrer des 22 | offreurs de solutions Open Source sélectionnés pouvant répondre à 23 | leurs besoins IT lors de rendez-vous express en one-to-one ciblés 24 | et programmés.

              >> Mardi 13 avril après-midi, 100% visio 25 | >> Inscriptions : https://server.matchmaking-studio.com/fr/RendezVousOneToOneOpenSource/ 26 | >> Lien pdf : https://systematic-paris-region.org/wp-content/uploads/2021/03/RDV121_Acteurspublics.pdf

              Publication de l'annuaire du CNLL en bêta

              La nouvelle version de l'annuaire des entreprises du libre du CNLL 27 | inclut de nombreuses améliorations et ajouts de fonctionnalités. Ces 28 | progrès permettent au CNLL de mettre à disposition des utilisateurs de 29 | solutions open source un annuaire complet et thématique, offrant un 30 | large choix de critères de recherche :

              • par nom d'entreprise ;

              • par localisation (région, ville, cluster) ;

              • par solutions et technologies ;

              • par métier (éditeur, société de services, hébergeur).

              L'annuaire inclut également une visualisation cartographique de la 31 | localisation des entreprises. Présentée via une interface conviviale, 32 | intuitive et ergonomique, cet outil se veut être compréhensible en 33 | quelques minutes par l'utilisateur et répondre à son besoin. Nous 34 | sommes impatients de recevoir des retours d'expérience utilisateurs et 35 | suggestions possibles d'améliorations.

              >> L'annuaire : https://annuaire.cnll.fr

              >> L'annonce : https://cnll.fr/news/annuaire-des-entreprises-du-cnll-nouvelle-version/

              -------------------------------------------------------------------------------- /docs/dist/site.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ 2 | html { line-height: 1.15; -webkit-text-size-adjust: 100%; } 3 | html, body { height: 100%; } 4 | body { margin: 0; background: #fefefe; color: #424242; font-family: "Open Sans", arial, sans-serif; font-size: 18px; } 5 | main { display: block; } 6 | h1 { font-size: 2em; margin: .67em 0; } 7 | hr { box-sizing: content-box; height: 0; overflow: visible; } 8 | pre { font-family: monospace, monospace; font-size: 1em; } 9 | a { background-color: transparent; } 10 | abbr[title] { border-bottom: none; text-decoration: underline; text-decoration: underline dotted; } 11 | b, strong { font-weight: bolder; } 12 | code, kbd, samp { font-family: monospace, monospace; font-size: 1em; } 13 | small { font-size: 80%; } 14 | sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } 15 | sub { bottom: -0.25em; } 16 | sup { top: -0.5em; } 17 | img { border-style: none; } 18 | button, input, optgroup, select, textarea { font-family: inherit; font-size: 100%; line-height: 1.15; margin: 0; } 19 | button, input { overflow: visible; } 20 | button, select { text-transform: none; } 21 | button, [type="button"], [type="reset"], [type="submit"] { -webkit-appearance: button; } 22 | button::-moz-focus-inner, [type="button"]::-moz-focus-inner, 23 | [type="reset"]::-moz-focus-inner, [type="submit"]::-moz-focus-inner { border-style: none; padding: 0; } 24 | button:-moz-focusring, [type="button"]:-moz-focusring, 25 | [type="reset"]:-moz-focusring, [type="submit"]:-moz-focusring { outline: 1px dotted ButtonText; } 26 | fieldset { padding: .35em .75em .625em; } 27 | legend { box-sizing: border-box; color: inherit; display: table; max-width: 100%; padding: 0; white-space: normal; } 28 | progress { vertical-align: baseline; } 29 | textarea { overflow: auto; } 30 | [type="checkbox"], [type="radio"] { box-sizing: border-box; padding: 0; } 31 | [type="number"]::-webkit-inner-spin-button, 32 | [type="number"]::-webkit-outer-spin-button { height: auto; } 33 | [type="search"] { -webkit-appearance: textfield; outline-offset: -2px; } 34 | [type="search"]::-webkit-search-decoration { -webkit-appearance: none; } 35 | ::-webkit-file-upload-button { -webkit-appearance: button; font: inherit; } 36 | details { display: block; } 37 | summary { display: list-item; } 38 | template { display: none; } 39 | [hidden] { display: none; } 40 | h1, h2, h3, h4, h5, h6 { margin-bottom: 20px; text-transform: none; } 41 | h1 { font-size: 26px; } 42 | h2 { font-size: 24px; } 43 | h3 { font-size: 20px; margin-bottom: 20px; } 44 | h4 { font-size: 18px; margin-bottom: 18px; } 45 | h5 { font-size: 16px; margin-bottom: 15px; } 46 | h6 { font-size: 14px; margin-bottom: 12px; } 47 | p { line-height: 1.5; margin: 0 0 16px; } 48 | a { color: #1E90FF; text-decoration: none; } 49 | ul, ol { line-height: 1.4; margin: 0 0 10px; } 50 | ul ul, ul ol, ol ul, ol ol { margin: 10px 0 0 20px; } 51 | ul li, ol li { margin: 0 0 2px; } 52 | ul li:last-of-type, ol li:last-of-type { margin-bottom: 0; } 53 | blockquote { border-left: 1px dotted #1E90FF; margin: 40px 0; padding: 5px 30px; } 54 | blockquote p { color: #aeadad; display: block; font-style: italic; margin: 0; width: 100%; } 55 | img { display: block; margin: 40px 0; width: auto; max-width: 100%; } 56 | img[src$="align-center"] { margin: auto; } 57 | img[src$="align-left"] { float: left; margin-right: 40px; } 58 | img[src$="align-right"] { float: right; margin-left: 40px; } 59 | pre { border: 1px solid #dddbcc; border-radius: 3px; margin: 0 0 20px; overflow-x: auto; padding: 10px; font-size: 16px; } 60 | pre code { padding: 0; } 61 | code { padding: 2px 4px; font-size: 90%; border-radius: 4px; background-color: #f1f0ea; } 62 | hr { border: none; border-bottom: 1px dotted #303030; margin: 45px 0; } 63 | table { margin-bottom: 40px; width: 100%; } 64 | table tbody>tr:nth-child(odd)>td, table tbody>tr:nth-child(odd)>th { background-color: #f7f7f3; } 65 | table th { padding: 0 10px 10px; text-align: left; } 66 | table td { padding: 10px; } 67 | table tr { border-bottom: 1px dotted #aeadad; } 68 | ::selection { background: #fff5b8; color: #000; display: block; } 69 | ::-moz-selection { background: #fff5b8; color: #000; display: block; } 70 | .fluid-width-video-wrapper { margin-bottom: 40px; } 71 | .hidden { text-indent: -9999px; visibility: hidden; display: none; } 72 | .clearfix:after { content: ""; display: table; clear: both; } 73 | .container { margin: 0 auto; position: relative; width: 100%; max-width: 889px; } 74 | #wrapper { height: auto; min-height: 100%; margin-bottom: -265px; } 75 | #wrapper:after { content: ""; display: block; height: 265px; } 76 | .button { background: #303030; border: none; border-radius: 3px; color: #fefefe; font-size: 14px; font-weight: 700; padding: 10px 12px; text-transform: uppercase; } 77 | .button:hover { background: #1E90FF; } 78 | .button-square { background: #1E90FF; color: #fff; float: left; font-size: 17px; margin: 0 0 0 10px; padding: 3px 8px 4px; } 79 | .button-square:hover { background: #303030; } 80 | .error { text-align: center; } 81 | .comments { margin-top: 10px; } 82 | .site-header { padding: 40px 0 0; overflow: auto; text-align: center; text-transform: uppercase; } 83 | .site-title-wrapper { display: table; margin: 0 auto; } 84 | .site-title { float: left; font-size: 14px; font-weight: 600; margin: 0; text-transform: uppercase; } 85 | .site-title a { float: left; background: #1E90FF; color: #fefefe; padding: 5px 10px 6px; } 86 | .site-title a:hover { background: #303030; } 87 | .site-logo { display: block; } 88 | .site-logo img { margin: 0; } 89 | .site-nav { list-style: none; margin: 28px 0 10px; padding: 0; } 90 | .site-nav-item { display: inline-block; font-size: 14px; font-weight: 700; margin: 0 10px; } 91 | .site-nav-item a:hover { color: #424242; } 92 | #latest-post { display: none; } 93 | .post-container { margin: 0 40px; } 94 | .post-header { border-bottom: 6px solid #303030; margin: 0 0 20px; padding: 0 0 20px; text-align: center; text-transform: uppercase; } 95 | .post-title, .page-title { font-size: 52px; font-weight: 700; margin: 15px 0; text-align: center; text-transform: uppercase; } 96 | .page-title { margin: 15px 40px; } 97 | .post-date, .post-reading, .blog-description { color: #aeadad; font-size: 14px; font-weight: 600; line-height: 1; margin: 25px 0 0; } 98 | .post-date a, .post-reading a, .blog-description a { color: #aeadad; } 99 | .post-date a:hover, .post-reading a:hover, .blog-description a:hover { color: #1E90FF; } 100 | .post-line:after { border-bottom: 1px dotted #303030; content: ""; display: block; margin: 40px auto 0; width: 100px; } 101 | .post-content a:hover { border-bottom: 1px dotted #1E90FF; padding: 0 0 2px; } 102 | .post-content:last-child { margin-bottom: 0; } 103 | .post-content .footnote { border-spacing: 0; margin-bottom: 0; } 104 | .post-content .footnote .label+td { width: 100%; } 105 | .post-content .gist tr { border-bottom: 0; } 106 | .post-footer { margin-top: 5px; } 107 | .post-tags, .share { color: #aeadad; font-size: 14px; } 108 | .post-tags span, .share span { font-weight: 600; } 109 | .post-tags { float: left; margin: 3px 0 0; } 110 | .post-tags a:hover { color: #303030; } 111 | .share { float: right; } 112 | .share a { background: #1E90FF; color: #fff; display: inline-block; font-size: 16px; margin-left: 5px; padding: 5px 0 4px; width: 30px; text-align: center; } 113 | .share a:hover { background: #303030; } 114 | .post-navigation { display: table; margin: 70px auto 100px; } 115 | .newer-posts, .older-posts { float: left; background: #1E90FF; color: #fefefe; font-size: 14px; font-weight: 600; margin: 0 5px; padding: 5px 10px 6px; text-transform: uppercase; } 116 | .newer-posts:hover, .older-posts:hover { background: #303030; } 117 | .page-number { display: none; } 118 | .post-list { list-style: none; padding: 0; } 119 | .post-stub { border-bottom: 1px dotted #303030; margin: 0; position: relative; } 120 | .post-stub:first-child { padding-top: 0; } 121 | .post-stub a { -webkit-transition: all .2s ease-in-out; -moz-transition: all .2s ease-in-out; transition: all .2s ease-in-out; display: block; color: #424242; padding: 20px 5px; } 122 | .post-stub a:hover { background: #fcf5f5; color: #1E90FF; padding: 20px 12px; } 123 | .post-stub a:hover .post-stub-tag { background: #1E90FF; } 124 | .post-stub-tag { background: #303030; border-radius: 3px; color: #fff; float: right; font-size: 10px; margin: 7px 0 0; padding: 0 5px; text-transform: uppercase; } 125 | .post-stub-title { display: inline-block; margin: 0; text-transform: none; } 126 | .post-stub-description { display: inline-block; margin: 0; text-transform: none; } 127 | .post-stub-date { display: inline-block; } 128 | .post-stub-date:before { content: "/ "; } 129 | .next-posts-link a, .previous-posts-link a { display: block; padding: 8px 11px; } 130 | .author-profile { margin: 0 40px; } 131 | .author-profile:after { border-bottom: 1px dotted #303030; content: ""; display: block; margin: 40px auto 0; width: 100px; } 132 | .author-heading { margin: 15px auto; text-align: center; width: 100%; } 133 | .author-avatar { border-radius: 50px; display: inline; height: 50px; margin: 5px 10px 0 0; width: 50px; vertical-align: middle; } 134 | .author-name { display: inline; font-size: 52px; font-weight: 700; text-align: center; text-transform: uppercase; vertical-align: middle; } 135 | .author-meta { color: #aeadad; font-size: 14px; font-weight: 600; line-height: 1; margin: 25px 0 0; text-align: center; text-transform: uppercase; } 136 | .author-meta span { display: inline-block; margin: 0 10px 8px; } 137 | .author-meta i { margin-right: 8px; } 138 | .author-meta a { color: #aeadad; } 139 | .author-meta a:hover { color: #1E90FF; } 140 | .author-bio { margin: 20px auto 0; text-align: center; max-width: 700px; } 141 | .footer { background: #303030; color: #d3d3d3; height: 265px; margin-top: 95px; overflow: auto; } 142 | .footer .site-title-wrapper { margin: 80px auto 35px; } 143 | .footer .site-title a:hover, .footer .button-square:hover { background: #121212; } 144 | .footer-copyright { color: #656565; font-size: 14px; margin: 0; text-align: center; text-transform: uppercase; } 145 | .footer-copyright a { color: #656565; font-weight: 700; } 146 | .footer-copyright a:hover { color: #fefefe; } 147 | #nprogress .bar { background: #1E90FF; } 148 | #nprogress .peg { box-shadow: 0 0 10px #1E90FF, 0 0 5px #1E90FF; } 149 | #nprogress .spinner-icon { border-top-color: #1E90FF; border-left-color: #1E90FF; } 150 | @media only screen and (max-width: 800px) { 151 | .post-stub-tag { display: none; } 152 | } 153 | @media only screen and (max-width: 600px) { 154 | h1, h2 { margin-bottom: 20px; } 155 | p { margin-bottom: 20px; } 156 | ul, ol { margin-bottom: 20px; } 157 | img { margin: 30px 0; } 158 | blockquote { margin: 30px 0; } 159 | pre { margin: 20px 0; } 160 | hr { margin: 35px 0; } 161 | .site-header { padding-top: 40px; } 162 | .site-title { float: none; margin-bottom: 15px; } 163 | .site-title a { float: none; } 164 | .site-title+.button-square { margin-left: 0; } 165 | .site-nav-item { display: block; margin: 15px 0; } 166 | .post-header { margin-bottom: 20px; padding-bottom: 20px; } 167 | .post-header p { word-wrap: break-word; overflow-wrap: break-word; } 168 | .post-title, .page-title, .author-name, .author-heading { font-size: 42px; margin-top: 5px; word-wrap: break-word; overflow-wrap: break-word; } 169 | .post-date, .blog-description, .author-meta { margin-top: 20px; } 170 | .post-date:after, .post-date:before, .blog-description:after, 171 | .blog-description:before, .author-meta:after, .author-meta:before { margin-top: 30px; } 172 | .author-profile:after, .author-profile:before { margin-top: 20px; } 173 | .post-stub-title { display: block; } 174 | .post-stub-date:before { content: ""; display: block; } 175 | .post-list { margin-top: 20px; } 176 | .post-container, .post-list, .author-profile { margin-right: 25px; margin-left: 25px; } 177 | .post-tags { width: 100%; } 178 | .post-stub a, .post-stub a:hover { padding-top: 12px; padding-bottom: 12px; } 179 | .share { float: left; margin-top: 20px; } 180 | .share a { margin: 0 5px 0 0; } 181 | .footer { margin-top: 50px; } 182 | .footer .site-title-wrapper { text-align: center; } 183 | .footer .button-jump-top { clear: both; display: inline-block; float: none; } 184 | } 185 | @media only screen and (max-width: 400px) { 186 | .site-header { padding-top: 40px; } 187 | .post-title, .page-title, .author-name, .author-heading { font-size: 30px; line-height: 1.2; word-wrap: break-word; overflow-wrap: break-word; } 188 | .post-date, .blog-description, .author-meta { line-height: 1.6; } 189 | .post-date, .blog-description, .author-meta { margin-top: 10px; } 190 | .post-date:after, .post-date:before, .blog-description:after, 191 | .blog-description:before, .author-meta:after, .author-meta:before { margin-top: 20px; } 192 | .author-profile:after, .author-profile:before { margin-top: 10px; } 193 | .post-container, .post-list, .author-profile { margin-right: 15px; margin-left: 15px; } 194 | .author-avatar { display: block; margin: 0 auto 18px; } 195 | .author-meta span { display: block; margin: 18px 0; } 196 | .footer-copyright { padding: 0 10px; } 197 | } 198 | -------------------------------------------------------------------------------- /static/dist/site.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ 2 | 3 | @import "fonts/index.css"; 4 | 5 | html { line-height: 1.15; -webkit-text-size-adjust: 100%; } 6 | html, body { height: 100%; } 7 | body { margin: 0; background: #fefefe; color: #424242; font-family: Marianne, arial, sans-serif; font-size: 18px; } 8 | main { display: block; } 9 | h1 { font-size: 2em; margin: .67em 0; } 10 | hr { box-sizing: content-box; height: 0; overflow: visible; } 11 | pre { font-family: monospace, monospace; font-size: 1em; } 12 | a { background-color: transparent; } 13 | abbr[title] { border-bottom: none; text-decoration: underline; text-decoration: underline dotted; } 14 | b, strong { font-weight: bolder; } 15 | code, kbd, samp { font-family: monospace, monospace; font-size: 1em; } 16 | small { font-size: 80%; } 17 | sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } 18 | sub { bottom: -0.25em; } 19 | sup { top: -0.5em; } 20 | img { border-style: none; } 21 | button, input, optgroup, select, textarea { font-family: inherit; font-size: 100%; line-height: 1.15; margin: 0; } 22 | button, input { overflow: visible; } 23 | button, select { text-transform: none; } 24 | button, [type="button"], [type="reset"], [type="submit"] { -webkit-appearance: button; } 25 | button::-moz-focus-inner, [type="button"]::-moz-focus-inner, 26 | [type="reset"]::-moz-focus-inner, [type="submit"]::-moz-focus-inner { border-style: none; padding: 0; } 27 | button:-moz-focusring, [type="button"]:-moz-focusring, 28 | [type="reset"]:-moz-focusring, [type="submit"]:-moz-focusring { outline: 1px dotted ButtonText; } 29 | fieldset { padding: .35em .75em .625em; } 30 | legend { box-sizing: border-box; color: inherit; display: table; max-width: 100%; padding: 0; white-space: normal; } 31 | progress { vertical-align: baseline; } 32 | textarea { overflow: auto; } 33 | [type="checkbox"], [type="radio"] { box-sizing: border-box; padding: 0; } 34 | [type="number"]::-webkit-inner-spin-button, 35 | [type="number"]::-webkit-outer-spin-button { height: auto; } 36 | [type="search"] { -webkit-appearance: textfield; outline-offset: -2px; } 37 | [type="search"]::-webkit-search-decoration { -webkit-appearance: none; } 38 | ::-webkit-file-upload-button { -webkit-appearance: button; font: inherit; } 39 | details { display: block; } 40 | summary { display: list-item; } 41 | template { display: none; } 42 | [hidden] { display: none; } 43 | h1, h2, h3, h4, h5, h6 { margin-bottom: 20px; text-transform: none; } 44 | h1 { font-size: 26px; } 45 | h2 { font-size: 24px; } 46 | h3 { font-size: 20px; margin-bottom: 20px; } 47 | h4 { font-size: 18px; margin-bottom: 18px; } 48 | h5 { font-size: 16px; margin-bottom: 15px; } 49 | h6 { font-size: 14px; margin-bottom: 12px; } 50 | p { line-height: 1.5; margin: 0 0 16px; } 51 | a { color: #000091; text-decoration: none; } 52 | ul, ol { line-height: 1.4; margin: 0 0 10px; } 53 | ul ul, ul ol, ol ul, ol ol { margin: 10px 0 0 20px; } 54 | ul li, ol li { margin: 0 0 2px; } 55 | ul li:last-of-type, ol li:last-of-type { margin-bottom: 0; } 56 | blockquote { border-left: 1px dotted #000091; margin: 40px 0; padding: 5px 30px; } 57 | blockquote p { color: #aeadad; display: block; font-style: italic; margin: 0; width: 100%; } 58 | img { display: block; margin: 40px 0; width: auto; max-width: 100%; } 59 | img[src$="align-center"] { margin: auto; } 60 | img[src$="align-left"] { float: left; margin-right: 40px; } 61 | img[src$="align-right"] { float: right; margin-left: 40px; } 62 | pre { border: 1px solid #dddbcc; border-radius: 3px; margin: 0 0 20px; overflow-x: auto; padding: 10px; font-size: 16px; } 63 | pre code { padding: 0; } 64 | code { padding: 2px 4px; font-size: 90%; border-radius: 4px; background-color: #f1f0ea; } 65 | hr { border: none; border-bottom: 1px dotted #1E1E1E; margin: 45px 0; } 66 | table { margin-bottom: 40px; width: 100%; } 67 | table tbody>tr:nth-child(odd)>td, table tbody>tr:nth-child(odd)>th { background-color: #f7f7f3; } 68 | table th { padding: 0 10px 10px; text-align: left; } 69 | table td { padding: 10px; } 70 | table tr { border-bottom: 1px dotted #aeadad; } 71 | ::selection { background: #fff5b8; color: #000; display: block; } 72 | ::-moz-selection { background: #fff5b8; color: #000; display: block; } 73 | .fluid-width-video-wrapper { margin-bottom: 40px; } 74 | .hidden { text-indent: -9999px; visibility: hidden; display: none; } 75 | .clearfix:after { content: ""; display: table; clear: both; } 76 | .container { margin: 0 auto; position: relative; width: 100%; max-width: 889px; } 77 | #wrapper { height: auto; min-height: 100%; margin-bottom: -265px; } 78 | #wrapper:after { content: ""; display: block; height: 265px; } 79 | .button { background: #1E1E1E; border: none; border-radius: 3px; color: #fefefe; font-size: 14px; font-weight: 700; padding: 10px 12px; text-transform: uppercase; } 80 | .button:hover { background: #000091; } 81 | .button-square { background: #000091; color: #fff; float: left; font-size: 17px; margin: 0 0 0 10px; padding: 3px 8px 4px; } 82 | .button-square:hover { background: #1E1E1E; } 83 | .error { text-align: center; } 84 | .comments { margin-top: 10px; } 85 | .site-header { padding: 40px 0 0; overflow: auto; text-align: center; text-transform: uppercase; } 86 | .site-title-wrapper { display: table; margin: 0 auto; } 87 | .site-title { float: left; font-size: 14px; font-weight: 600; margin: 0; text-transform: uppercase; } 88 | .site-title a { float: left; background: #000091; color: #fefefe; padding: 5px 10px 6px; } 89 | .site-title a:hover { background: #1E1E1E; } 90 | .site-logo { display: block; } 91 | .site-logo img { margin: 0; } 92 | .site-nav { list-style: none; margin: 28px 0 10px; padding: 0; } 93 | .site-nav-item { display: inline-block; font-size: 14px; font-weight: 700; margin: 0 10px; } 94 | .site-nav-item a:hover { color: #424242; } 95 | #latest-post { display: none; } 96 | .post-container { margin: 0 40px; } 97 | .post-header { border-bottom: 6px solid #1E1E1E; margin: 0 0 20px; padding: 0 0 20px; text-align: center; text-transform: uppercase; } 98 | .post-title, .page-title { font-size: 52px; font-weight: 700; margin: 15px 0; text-align: center; text-transform: uppercase; } 99 | .page-title { margin: 15px 40px; } 100 | .post-date, .post-reading, .blog-description { color: #aeadad; font-size: 14px; font-weight: 600; line-height: 1; margin: 25px 0 0; } 101 | .post-date a, .post-reading a, .blog-description a { color: #aeadad; } 102 | .post-date a:hover, .post-reading a:hover, .blog-description a:hover { color: #000091; } 103 | .post-line:after { border-bottom: 1px dotted #1E1E1E; content: ""; display: block; margin: 40px auto 0; width: 100px; } 104 | .post-content a:hover { border-bottom: 1px dotted #000091; padding: 0 0 2px; } 105 | .post-content:last-child { margin-bottom: 0; } 106 | .post-content .footnote { border-spacing: 0; margin-bottom: 0; } 107 | .post-content .footnote .label+td { width: 100%; } 108 | .post-content .gist tr { border-bottom: 0; } 109 | .post-footer { margin-top: 5px; } 110 | .post-tags, .share { color: #aeadad; font-size: 14px; } 111 | .post-tags span, .share span { font-weight: 600; } 112 | .post-tags { float: left; margin: 3px 0 0; } 113 | .post-tags a:hover { color: #1E1E1E; } 114 | .share { float: right; } 115 | .share a { background: #000091; color: #fff; display: inline-block; font-size: 16px; margin-left: 5px; padding: 5px 0 4px; width: 30px; text-align: center; } 116 | .share a:hover { background: #1E1E1E; } 117 | .post-navigation { display: table; margin: 70px auto 100px; } 118 | .newer-posts, .older-posts { float: left; background: #000091; color: #fefefe; font-size: 14px; font-weight: 600; margin: 0 5px; padding: 5px 10px 6px; text-transform: uppercase; } 119 | .newer-posts:hover, .older-posts:hover { background: #1E1E1E; } 120 | .page-number { display: none; } 121 | .post-list { list-style: none; padding: 0; } 122 | .post-stub { border-bottom: 1px dotted #1E1E1E; margin: 0; position: relative; } 123 | .post-stub:first-child { padding-top: 0; } 124 | .post-stub a { -webkit-transition: all .2s ease-in-out; -moz-transition: all .2s ease-in-out; transition: all .2s ease-in-out; display: block; color: #424242; padding: 20px 5px; } 125 | .post-stub a:hover { background: #fcf5f5; color: #000091; padding: 20px 12px; } 126 | .post-stub a:hover .post-stub-tag { background: #000091; } 127 | .post-stub-tag { background: #1E1E1E; border-radius: 3px; color: #fff; float: right; font-size: 10px; margin: 7px 0 0; padding: 0 5px; text-transform: uppercase; } 128 | .post-stub-title { display: inline-block; margin: 0; text-transform: none; } 129 | .post-stub-description { display: inline-block; margin: 0; text-transform: none; } 130 | .post-stub-date { display: inline-block; } 131 | .post-stub-date:before { content: "/ "; } 132 | .next-posts-link a, .previous-posts-link a { display: block; padding: 8px 11px; } 133 | .author-profile { margin: 0 40px; } 134 | .author-profile:after { border-bottom: 1px dotted #1E1E1E; content: ""; display: block; margin: 40px auto 0; width: 100px; } 135 | .author-heading { margin: 15px auto; text-align: center; width: 100%; } 136 | .author-avatar { border-radius: 50px; display: inline; height: 50px; margin: 5px 10px 0 0; width: 50px; vertical-align: middle; } 137 | .author-name { display: inline; font-size: 52px; font-weight: 700; text-align: center; text-transform: uppercase; vertical-align: middle; } 138 | .author-meta { color: #aeadad; font-size: 14px; font-weight: 600; line-height: 1; margin: 25px 0 0; text-align: center; text-transform: uppercase; } 139 | .author-meta span { display: inline-block; margin: 0 10px 8px; } 140 | .author-meta i { margin-right: 8px; } 141 | .author-meta a { color: #aeadad; } 142 | .author-meta a:hover { color: #000091; } 143 | .author-bio { margin: 20px auto 0; text-align: center; max-width: 700px; } 144 | .footer { background: #1E1E1E; color: #d3d3d3; height: 265px; margin-top: 95px; overflow: auto; } 145 | .footer .site-title-wrapper { margin: 80px auto 35px; } 146 | .footer .site-title a:hover, .footer .button-square:hover { background: #121212; } 147 | .footer-copyright { color: #656565; font-size: 14px; margin: 0; text-align: center; text-transform: uppercase; } 148 | .footer-copyright a { color: #656565; font-weight: 700; } 149 | .footer-copyright a:hover { color: #fefefe; } 150 | #nprogress .bar { background: #000091; } 151 | #nprogress .peg { box-shadow: 0 0 10px #000091, 0 0 5px #000091; } 152 | #nprogress .spinner-icon { border-top-color: #000091; border-left-color: #000091; } 153 | @media only screen and (max-width: 800px) { 154 | .post-stub-tag { display: none; } 155 | } 156 | @media only screen and (max-width: 600px) { 157 | h1, h2 { margin-bottom: 20px; } 158 | p { margin-bottom: 20px; } 159 | ul, ol { margin-bottom: 20px; } 160 | img { margin: 30px 0; } 161 | blockquote { margin: 30px 0; } 162 | pre { margin: 20px 0; } 163 | hr { margin: 35px 0; } 164 | .site-header { padding-top: 40px; } 165 | .site-title { float: none; margin-bottom: 15px; } 166 | .site-title a { float: none; } 167 | .site-title+.button-square { margin-left: 0; } 168 | .site-nav-item { display: block; margin: 15px 0; } 169 | .post-header { margin-bottom: 20px; padding-bottom: 20px; } 170 | .post-header p { word-wrap: break-word; overflow-wrap: break-word; } 171 | .post-title, .page-title, .author-name, .author-heading { font-size: 42px; margin-top: 5px; word-wrap: break-word; overflow-wrap: break-word; } 172 | .post-date, .blog-description, .author-meta { margin-top: 20px; } 173 | .post-date:after, .post-date:before, .blog-description:after, 174 | .blog-description:before, .author-meta:after, .author-meta:before { margin-top: 30px; } 175 | .author-profile:after, .author-profile:before { margin-top: 20px; } 176 | .post-stub-title { display: block; } 177 | .post-stub-date:before { content: ""; display: block; } 178 | .post-list { margin-top: 20px; } 179 | .post-container, .post-list, .author-profile { margin-right: 25px; margin-left: 25px; } 180 | .post-tags { width: 100%; } 181 | .post-stub a, .post-stub a:hover { padding-top: 12px; padding-bottom: 12px; } 182 | .share { float: left; margin-top: 20px; } 183 | .share a { margin: 0 5px 0 0; } 184 | .footer { margin-top: 50px; } 185 | .footer .site-title-wrapper { text-align: center; } 186 | .footer .button-jump-top { clear: both; display: inline-block; float: none; } 187 | } 188 | @media only screen and (max-width: 400px) { 189 | .site-header { padding-top: 40px; } 190 | .post-title, .page-title, .author-name, .author-heading { font-size: 30px; line-height: 1.2; word-wrap: break-word; overflow-wrap: break-word; } 191 | .post-date, .blog-description, .author-meta { line-height: 1.6; } 192 | .post-date, .blog-description, .author-meta { margin-top: 10px; } 193 | .post-date:after, .post-date:before, .blog-description:after, 194 | .blog-description:before, .author-meta:after, .author-meta:before { margin-top: 20px; } 195 | .author-profile:after, .author-profile:before { margin-top: 10px; } 196 | .post-container, .post-list, .author-profile { margin-right: 15px; margin-left: 15px; } 197 | .author-avatar { display: block; margin: 0 auto 18px; } 198 | .author-meta span { display: block; margin: 18px 0; } 199 | .footer-copyright { padding: 0 10px; } 200 | } 201 | -------------------------------------------------------------------------------- /docs/viewerjs/ui_utils.js: -------------------------------------------------------------------------------- 1 | /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 | /* Copyright 2012 Mozilla Foundation 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | 'use strict'; 18 | 19 | var CSS_UNITS = 96.0 / 72.0; 20 | var DEFAULT_SCALE = 'auto'; 21 | var UNKNOWN_SCALE = 0; 22 | var MAX_AUTO_SCALE = 1.25; 23 | var SCROLLBAR_PADDING = 40; 24 | var VERTICAL_PADDING = 5; 25 | 26 | // optimised CSS custom property getter/setter 27 | var CustomStyle = (function CustomStyleClosure() { 28 | 29 | // As noted on: http://www.zachstronaut.com/posts/2009/02/17/ 30 | // animate-css-transforms-firefox-webkit.html 31 | // in some versions of IE9 it is critical that ms appear in this list 32 | // before Moz 33 | var prefixes = ['ms', 'Moz', 'Webkit', 'O']; 34 | var _cache = {}; 35 | 36 | function CustomStyle() {} 37 | 38 | CustomStyle.getProp = function get(propName, element) { 39 | // check cache only when no element is given 40 | if (arguments.length === 1 && typeof _cache[propName] === 'string') { 41 | return _cache[propName]; 42 | } 43 | 44 | element = element || document.documentElement; 45 | var style = element.style, prefixed, uPropName; 46 | 47 | // test standard property first 48 | if (typeof style[propName] === 'string') { 49 | return (_cache[propName] = propName); 50 | } 51 | 52 | // capitalize 53 | uPropName = propName.charAt(0).toUpperCase() + propName.slice(1); 54 | 55 | // test vendor specific properties 56 | for (var i = 0, l = prefixes.length; i < l; i++) { 57 | prefixed = prefixes[i] + uPropName; 58 | if (typeof style[prefixed] === 'string') { 59 | return (_cache[propName] = prefixed); 60 | } 61 | } 62 | 63 | //if all fails then set to undefined 64 | return (_cache[propName] = 'undefined'); 65 | }; 66 | 67 | CustomStyle.setProp = function set(propName, element, str) { 68 | var prop = this.getProp(propName); 69 | if (prop !== 'undefined') { 70 | element.style[prop] = str; 71 | } 72 | }; 73 | 74 | return CustomStyle; 75 | })(); 76 | 77 | function getFileName(url) { 78 | var anchor = url.indexOf('#'); 79 | var query = url.indexOf('?'); 80 | var end = Math.min( 81 | anchor > 0 ? anchor : url.length, 82 | query > 0 ? query : url.length); 83 | return url.substring(url.lastIndexOf('/', end) + 1, end); 84 | } 85 | 86 | /** 87 | * Returns scale factor for the canvas. It makes sense for the HiDPI displays. 88 | * @return {Object} The object with horizontal (sx) and vertical (sy) 89 | scales. The scaled property is set to false if scaling is 90 | not required, true otherwise. 91 | */ 92 | function getOutputScale(ctx) { 93 | var devicePixelRatio = window.devicePixelRatio || 1; 94 | var backingStoreRatio = ctx.webkitBackingStorePixelRatio || 95 | ctx.mozBackingStorePixelRatio || 96 | ctx.msBackingStorePixelRatio || 97 | ctx.oBackingStorePixelRatio || 98 | ctx.backingStorePixelRatio || 1; 99 | var pixelRatio = devicePixelRatio / backingStoreRatio; 100 | return { 101 | sx: pixelRatio, 102 | sy: pixelRatio, 103 | scaled: pixelRatio !== 1 104 | }; 105 | } 106 | 107 | /** 108 | * Scrolls specified element into view of its parent. 109 | * element {Object} The element to be visible. 110 | * spot {Object} An object with optional top and left properties, 111 | * specifying the offset from the top left edge. 112 | */ 113 | function scrollIntoView(element, spot) { 114 | // Assuming offsetParent is available (it's not available when viewer is in 115 | // hidden iframe or object). We have to scroll: if the offsetParent is not set 116 | // producing the error. See also animationStartedClosure. 117 | var parent = element.offsetParent; 118 | var offsetY = element.offsetTop + element.clientTop; 119 | var offsetX = element.offsetLeft + element.clientLeft; 120 | if (!parent) { 121 | console.error('offsetParent is not set -- cannot scroll'); 122 | return; 123 | } 124 | while (parent.clientHeight === parent.scrollHeight) { 125 | if (parent.dataset._scaleY) { 126 | offsetY /= parent.dataset._scaleY; 127 | offsetX /= parent.dataset._scaleX; 128 | } 129 | offsetY += parent.offsetTop; 130 | offsetX += parent.offsetLeft; 131 | parent = parent.offsetParent; 132 | if (!parent) { 133 | return; // no need to scroll 134 | } 135 | } 136 | if (spot) { 137 | if (spot.top !== undefined) { 138 | offsetY += spot.top; 139 | } 140 | if (spot.left !== undefined) { 141 | offsetX += spot.left; 142 | parent.scrollLeft = offsetX; 143 | } 144 | } 145 | parent.scrollTop = offsetY; 146 | } 147 | 148 | /** 149 | * Helper function to start monitoring the scroll event and converting them into 150 | * PDF.js friendly one: with scroll debounce and scroll direction. 151 | */ 152 | function watchScroll(viewAreaElement, callback) { 153 | var debounceScroll = function debounceScroll(evt) { 154 | if (rAF) { 155 | return; 156 | } 157 | // schedule an invocation of scroll for next animation frame. 158 | rAF = window.requestAnimationFrame(function viewAreaElementScrolled() { 159 | rAF = null; 160 | 161 | var currentY = viewAreaElement.scrollTop; 162 | var lastY = state.lastY; 163 | if (currentY !== lastY) { 164 | state.down = currentY > lastY; 165 | } 166 | state.lastY = currentY; 167 | callback(state); 168 | }); 169 | }; 170 | 171 | var state = { 172 | down: true, 173 | lastY: viewAreaElement.scrollTop, 174 | _eventHandler: debounceScroll 175 | }; 176 | 177 | var rAF = null; 178 | viewAreaElement.addEventListener('scroll', debounceScroll, true); 179 | return state; 180 | } 181 | 182 | /** 183 | * Use binary search to find the index of the first item in a given array which 184 | * passes a given condition. The items are expected to be sorted in the sense 185 | * that if the condition is true for one item in the array, then it is also true 186 | * for all following items. 187 | * 188 | * @returns {Number} Index of the first array element to pass the test, 189 | * or |items.length| if no such element exists. 190 | */ 191 | function binarySearchFirstItem(items, condition) { 192 | var minIndex = 0; 193 | var maxIndex = items.length - 1; 194 | 195 | if (items.length === 0 || !condition(items[maxIndex])) { 196 | return items.length; 197 | } 198 | if (condition(items[minIndex])) { 199 | return minIndex; 200 | } 201 | 202 | while (minIndex < maxIndex) { 203 | var currentIndex = (minIndex + maxIndex) >> 1; 204 | var currentItem = items[currentIndex]; 205 | if (condition(currentItem)) { 206 | maxIndex = currentIndex; 207 | } else { 208 | minIndex = currentIndex + 1; 209 | } 210 | } 211 | return minIndex; /* === maxIndex */ 212 | } 213 | 214 | /** 215 | * Generic helper to find out what elements are visible within a scroll pane. 216 | */ 217 | function getVisibleElements(scrollEl, views, sortByVisibility) { 218 | var top = scrollEl.scrollTop, bottom = top + scrollEl.clientHeight; 219 | var left = scrollEl.scrollLeft, right = left + scrollEl.clientWidth; 220 | 221 | function isElementBottomBelowViewTop(view) { 222 | var element = view.div; 223 | var elementBottom = 224 | element.offsetTop + element.clientTop + element.clientHeight; 225 | return elementBottom > top; 226 | } 227 | 228 | var visible = [], view, element; 229 | var currentHeight, viewHeight, hiddenHeight, percentHeight; 230 | var currentWidth, viewWidth; 231 | var firstVisibleElementInd = (views.length === 0) ? 0 : 232 | binarySearchFirstItem(views, isElementBottomBelowViewTop); 233 | 234 | for (var i = firstVisibleElementInd, ii = views.length; i < ii; i++) { 235 | view = views[i]; 236 | element = view.div; 237 | currentHeight = element.offsetTop + element.clientTop; 238 | viewHeight = element.clientHeight; 239 | 240 | if (currentHeight > bottom) { 241 | break; 242 | } 243 | 244 | currentWidth = element.offsetLeft + element.clientLeft; 245 | viewWidth = element.clientWidth; 246 | if (currentWidth + viewWidth < left || currentWidth > right) { 247 | continue; 248 | } 249 | hiddenHeight = Math.max(0, top - currentHeight) + 250 | Math.max(0, currentHeight + viewHeight - bottom); 251 | percentHeight = ((viewHeight - hiddenHeight) * 100 / viewHeight) | 0; 252 | 253 | visible.push({ 254 | id: view.id, 255 | x: currentWidth, 256 | y: currentHeight, 257 | view: view, 258 | percent: percentHeight 259 | }); 260 | } 261 | 262 | var first = visible[0]; 263 | var last = visible[visible.length - 1]; 264 | 265 | if (sortByVisibility) { 266 | visible.sort(function(a, b) { 267 | var pc = a.percent - b.percent; 268 | if (Math.abs(pc) > 0.001) { 269 | return -pc; 270 | } 271 | return a.id - b.id; // ensure stability 272 | }); 273 | } 274 | return {first: first, last: last, views: visible}; 275 | } 276 | 277 | /** 278 | * Event handler to suppress context menu. 279 | */ 280 | function noContextMenuHandler(e) { 281 | e.preventDefault(); 282 | } 283 | 284 | /** 285 | * Returns the filename or guessed filename from the url (see issue 3455). 286 | * url {String} The original PDF location. 287 | * @return {String} Guessed PDF file name. 288 | */ 289 | function getPDFFileNameFromURL(url) { 290 | var reURI = /^(?:([^:]+:)?\/\/[^\/]+)?([^?#]*)(\?[^#]*)?(#.*)?$/; 291 | // SCHEME HOST 1.PATH 2.QUERY 3.REF 292 | // Pattern to get last matching NAME.pdf 293 | var reFilename = /[^\/?#=]+\.pdf\b(?!.*\.pdf\b)/i; 294 | var splitURI = reURI.exec(url); 295 | var suggestedFilename = reFilename.exec(splitURI[1]) || 296 | reFilename.exec(splitURI[2]) || 297 | reFilename.exec(splitURI[3]); 298 | if (suggestedFilename) { 299 | suggestedFilename = suggestedFilename[0]; 300 | if (suggestedFilename.indexOf('%') !== -1) { 301 | // URL-encoded %2Fpath%2Fto%2Ffile.pdf should be file.pdf 302 | try { 303 | suggestedFilename = 304 | reFilename.exec(decodeURIComponent(suggestedFilename))[0]; 305 | } catch(e) { // Possible (extremely rare) errors: 306 | // URIError "Malformed URI", e.g. for "%AA.pdf" 307 | // TypeError "null has no properties", e.g. for "%2F.pdf" 308 | } 309 | } 310 | } 311 | return suggestedFilename || 'document.pdf'; 312 | } 313 | 314 | var ProgressBar = (function ProgressBarClosure() { 315 | 316 | function clamp(v, min, max) { 317 | return Math.min(Math.max(v, min), max); 318 | } 319 | 320 | function ProgressBar(id, opts) { 321 | this.visible = true; 322 | 323 | // Fetch the sub-elements for later. 324 | this.div = document.querySelector(id + ' .progress'); 325 | 326 | // Get the loading bar element, so it can be resized to fit the viewer. 327 | this.bar = this.div.parentNode; 328 | 329 | // Get options, with sensible defaults. 330 | this.height = opts.height || 100; 331 | this.width = opts.width || 100; 332 | this.units = opts.units || '%'; 333 | 334 | // Initialize heights. 335 | this.div.style.height = this.height + this.units; 336 | this.percent = 0; 337 | } 338 | 339 | ProgressBar.prototype = { 340 | 341 | updateBar: function ProgressBar_updateBar() { 342 | if (this._indeterminate) { 343 | this.div.classList.add('indeterminate'); 344 | this.div.style.width = this.width + this.units; 345 | return; 346 | } 347 | 348 | this.div.classList.remove('indeterminate'); 349 | var progressSize = this.width * this._percent / 100; 350 | this.div.style.width = progressSize + this.units; 351 | }, 352 | 353 | get percent() { 354 | return this._percent; 355 | }, 356 | 357 | set percent(val) { 358 | this._indeterminate = isNaN(val); 359 | this._percent = clamp(val, 0, 100); 360 | this.updateBar(); 361 | }, 362 | 363 | setWidth: function ProgressBar_setWidth(viewer) { 364 | if (viewer) { 365 | var container = viewer.parentNode; 366 | var scrollbarWidth = container.offsetWidth - viewer.offsetWidth; 367 | if (scrollbarWidth > 0) { 368 | this.bar.setAttribute('style', 'width: calc(100% - ' + 369 | scrollbarWidth + 'px);'); 370 | } 371 | } 372 | }, 373 | 374 | hide: function ProgressBar_hide() { 375 | if (!this.visible) { 376 | return; 377 | } 378 | this.visible = false; 379 | this.bar.classList.add('hidden'); 380 | document.body.classList.remove('loadingInProgress'); 381 | }, 382 | 383 | show: function ProgressBar_show() { 384 | if (this.visible) { 385 | return; 386 | } 387 | this.visible = true; 388 | document.body.classList.add('loadingInProgress'); 389 | this.bar.classList.remove('hidden'); 390 | } 391 | }; 392 | 393 | return ProgressBar; 394 | })(); 395 | -------------------------------------------------------------------------------- /static/viewerjs/ui_utils.js: -------------------------------------------------------------------------------- 1 | /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 | /* Copyright 2012 Mozilla Foundation 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | 'use strict'; 18 | 19 | var CSS_UNITS = 96.0 / 72.0; 20 | var DEFAULT_SCALE = 'auto'; 21 | var UNKNOWN_SCALE = 0; 22 | var MAX_AUTO_SCALE = 1.25; 23 | var SCROLLBAR_PADDING = 40; 24 | var VERTICAL_PADDING = 5; 25 | 26 | // optimised CSS custom property getter/setter 27 | var CustomStyle = (function CustomStyleClosure() { 28 | 29 | // As noted on: http://www.zachstronaut.com/posts/2009/02/17/ 30 | // animate-css-transforms-firefox-webkit.html 31 | // in some versions of IE9 it is critical that ms appear in this list 32 | // before Moz 33 | var prefixes = ['ms', 'Moz', 'Webkit', 'O']; 34 | var _cache = {}; 35 | 36 | function CustomStyle() {} 37 | 38 | CustomStyle.getProp = function get(propName, element) { 39 | // check cache only when no element is given 40 | if (arguments.length === 1 && typeof _cache[propName] === 'string') { 41 | return _cache[propName]; 42 | } 43 | 44 | element = element || document.documentElement; 45 | var style = element.style, prefixed, uPropName; 46 | 47 | // test standard property first 48 | if (typeof style[propName] === 'string') { 49 | return (_cache[propName] = propName); 50 | } 51 | 52 | // capitalize 53 | uPropName = propName.charAt(0).toUpperCase() + propName.slice(1); 54 | 55 | // test vendor specific properties 56 | for (var i = 0, l = prefixes.length; i < l; i++) { 57 | prefixed = prefixes[i] + uPropName; 58 | if (typeof style[prefixed] === 'string') { 59 | return (_cache[propName] = prefixed); 60 | } 61 | } 62 | 63 | //if all fails then set to undefined 64 | return (_cache[propName] = 'undefined'); 65 | }; 66 | 67 | CustomStyle.setProp = function set(propName, element, str) { 68 | var prop = this.getProp(propName); 69 | if (prop !== 'undefined') { 70 | element.style[prop] = str; 71 | } 72 | }; 73 | 74 | return CustomStyle; 75 | })(); 76 | 77 | function getFileName(url) { 78 | var anchor = url.indexOf('#'); 79 | var query = url.indexOf('?'); 80 | var end = Math.min( 81 | anchor > 0 ? anchor : url.length, 82 | query > 0 ? query : url.length); 83 | return url.substring(url.lastIndexOf('/', end) + 1, end); 84 | } 85 | 86 | /** 87 | * Returns scale factor for the canvas. It makes sense for the HiDPI displays. 88 | * @return {Object} The object with horizontal (sx) and vertical (sy) 89 | scales. The scaled property is set to false if scaling is 90 | not required, true otherwise. 91 | */ 92 | function getOutputScale(ctx) { 93 | var devicePixelRatio = window.devicePixelRatio || 1; 94 | var backingStoreRatio = ctx.webkitBackingStorePixelRatio || 95 | ctx.mozBackingStorePixelRatio || 96 | ctx.msBackingStorePixelRatio || 97 | ctx.oBackingStorePixelRatio || 98 | ctx.backingStorePixelRatio || 1; 99 | var pixelRatio = devicePixelRatio / backingStoreRatio; 100 | return { 101 | sx: pixelRatio, 102 | sy: pixelRatio, 103 | scaled: pixelRatio !== 1 104 | }; 105 | } 106 | 107 | /** 108 | * Scrolls specified element into view of its parent. 109 | * element {Object} The element to be visible. 110 | * spot {Object} An object with optional top and left properties, 111 | * specifying the offset from the top left edge. 112 | */ 113 | function scrollIntoView(element, spot) { 114 | // Assuming offsetParent is available (it's not available when viewer is in 115 | // hidden iframe or object). We have to scroll: if the offsetParent is not set 116 | // producing the error. See also animationStartedClosure. 117 | var parent = element.offsetParent; 118 | var offsetY = element.offsetTop + element.clientTop; 119 | var offsetX = element.offsetLeft + element.clientLeft; 120 | if (!parent) { 121 | console.error('offsetParent is not set -- cannot scroll'); 122 | return; 123 | } 124 | while (parent.clientHeight === parent.scrollHeight) { 125 | if (parent.dataset._scaleY) { 126 | offsetY /= parent.dataset._scaleY; 127 | offsetX /= parent.dataset._scaleX; 128 | } 129 | offsetY += parent.offsetTop; 130 | offsetX += parent.offsetLeft; 131 | parent = parent.offsetParent; 132 | if (!parent) { 133 | return; // no need to scroll 134 | } 135 | } 136 | if (spot) { 137 | if (spot.top !== undefined) { 138 | offsetY += spot.top; 139 | } 140 | if (spot.left !== undefined) { 141 | offsetX += spot.left; 142 | parent.scrollLeft = offsetX; 143 | } 144 | } 145 | parent.scrollTop = offsetY; 146 | } 147 | 148 | /** 149 | * Helper function to start monitoring the scroll event and converting them into 150 | * PDF.js friendly one: with scroll debounce and scroll direction. 151 | */ 152 | function watchScroll(viewAreaElement, callback) { 153 | var debounceScroll = function debounceScroll(evt) { 154 | if (rAF) { 155 | return; 156 | } 157 | // schedule an invocation of scroll for next animation frame. 158 | rAF = window.requestAnimationFrame(function viewAreaElementScrolled() { 159 | rAF = null; 160 | 161 | var currentY = viewAreaElement.scrollTop; 162 | var lastY = state.lastY; 163 | if (currentY !== lastY) { 164 | state.down = currentY > lastY; 165 | } 166 | state.lastY = currentY; 167 | callback(state); 168 | }); 169 | }; 170 | 171 | var state = { 172 | down: true, 173 | lastY: viewAreaElement.scrollTop, 174 | _eventHandler: debounceScroll 175 | }; 176 | 177 | var rAF = null; 178 | viewAreaElement.addEventListener('scroll', debounceScroll, true); 179 | return state; 180 | } 181 | 182 | /** 183 | * Use binary search to find the index of the first item in a given array which 184 | * passes a given condition. The items are expected to be sorted in the sense 185 | * that if the condition is true for one item in the array, then it is also true 186 | * for all following items. 187 | * 188 | * @returns {Number} Index of the first array element to pass the test, 189 | * or |items.length| if no such element exists. 190 | */ 191 | function binarySearchFirstItem(items, condition) { 192 | var minIndex = 0; 193 | var maxIndex = items.length - 1; 194 | 195 | if (items.length === 0 || !condition(items[maxIndex])) { 196 | return items.length; 197 | } 198 | if (condition(items[minIndex])) { 199 | return minIndex; 200 | } 201 | 202 | while (minIndex < maxIndex) { 203 | var currentIndex = (minIndex + maxIndex) >> 1; 204 | var currentItem = items[currentIndex]; 205 | if (condition(currentItem)) { 206 | maxIndex = currentIndex; 207 | } else { 208 | minIndex = currentIndex + 1; 209 | } 210 | } 211 | return minIndex; /* === maxIndex */ 212 | } 213 | 214 | /** 215 | * Generic helper to find out what elements are visible within a scroll pane. 216 | */ 217 | function getVisibleElements(scrollEl, views, sortByVisibility) { 218 | var top = scrollEl.scrollTop, bottom = top + scrollEl.clientHeight; 219 | var left = scrollEl.scrollLeft, right = left + scrollEl.clientWidth; 220 | 221 | function isElementBottomBelowViewTop(view) { 222 | var element = view.div; 223 | var elementBottom = 224 | element.offsetTop + element.clientTop + element.clientHeight; 225 | return elementBottom > top; 226 | } 227 | 228 | var visible = [], view, element; 229 | var currentHeight, viewHeight, hiddenHeight, percentHeight; 230 | var currentWidth, viewWidth; 231 | var firstVisibleElementInd = (views.length === 0) ? 0 : 232 | binarySearchFirstItem(views, isElementBottomBelowViewTop); 233 | 234 | for (var i = firstVisibleElementInd, ii = views.length; i < ii; i++) { 235 | view = views[i]; 236 | element = view.div; 237 | currentHeight = element.offsetTop + element.clientTop; 238 | viewHeight = element.clientHeight; 239 | 240 | if (currentHeight > bottom) { 241 | break; 242 | } 243 | 244 | currentWidth = element.offsetLeft + element.clientLeft; 245 | viewWidth = element.clientWidth; 246 | if (currentWidth + viewWidth < left || currentWidth > right) { 247 | continue; 248 | } 249 | hiddenHeight = Math.max(0, top - currentHeight) + 250 | Math.max(0, currentHeight + viewHeight - bottom); 251 | percentHeight = ((viewHeight - hiddenHeight) * 100 / viewHeight) | 0; 252 | 253 | visible.push({ 254 | id: view.id, 255 | x: currentWidth, 256 | y: currentHeight, 257 | view: view, 258 | percent: percentHeight 259 | }); 260 | } 261 | 262 | var first = visible[0]; 263 | var last = visible[visible.length - 1]; 264 | 265 | if (sortByVisibility) { 266 | visible.sort(function(a, b) { 267 | var pc = a.percent - b.percent; 268 | if (Math.abs(pc) > 0.001) { 269 | return -pc; 270 | } 271 | return a.id - b.id; // ensure stability 272 | }); 273 | } 274 | return {first: first, last: last, views: visible}; 275 | } 276 | 277 | /** 278 | * Event handler to suppress context menu. 279 | */ 280 | function noContextMenuHandler(e) { 281 | e.preventDefault(); 282 | } 283 | 284 | /** 285 | * Returns the filename or guessed filename from the url (see issue 3455). 286 | * url {String} The original PDF location. 287 | * @return {String} Guessed PDF file name. 288 | */ 289 | function getPDFFileNameFromURL(url) { 290 | var reURI = /^(?:([^:]+:)?\/\/[^\/]+)?([^?#]*)(\?[^#]*)?(#.*)?$/; 291 | // SCHEME HOST 1.PATH 2.QUERY 3.REF 292 | // Pattern to get last matching NAME.pdf 293 | var reFilename = /[^\/?#=]+\.pdf\b(?!.*\.pdf\b)/i; 294 | var splitURI = reURI.exec(url); 295 | var suggestedFilename = reFilename.exec(splitURI[1]) || 296 | reFilename.exec(splitURI[2]) || 297 | reFilename.exec(splitURI[3]); 298 | if (suggestedFilename) { 299 | suggestedFilename = suggestedFilename[0]; 300 | if (suggestedFilename.indexOf('%') !== -1) { 301 | // URL-encoded %2Fpath%2Fto%2Ffile.pdf should be file.pdf 302 | try { 303 | suggestedFilename = 304 | reFilename.exec(decodeURIComponent(suggestedFilename))[0]; 305 | } catch(e) { // Possible (extremely rare) errors: 306 | // URIError "Malformed URI", e.g. for "%AA.pdf" 307 | // TypeError "null has no properties", e.g. for "%2F.pdf" 308 | } 309 | } 310 | } 311 | return suggestedFilename || 'document.pdf'; 312 | } 313 | 314 | var ProgressBar = (function ProgressBarClosure() { 315 | 316 | function clamp(v, min, max) { 317 | return Math.min(Math.max(v, min), max); 318 | } 319 | 320 | function ProgressBar(id, opts) { 321 | this.visible = true; 322 | 323 | // Fetch the sub-elements for later. 324 | this.div = document.querySelector(id + ' .progress'); 325 | 326 | // Get the loading bar element, so it can be resized to fit the viewer. 327 | this.bar = this.div.parentNode; 328 | 329 | // Get options, with sensible defaults. 330 | this.height = opts.height || 100; 331 | this.width = opts.width || 100; 332 | this.units = opts.units || '%'; 333 | 334 | // Initialize heights. 335 | this.div.style.height = this.height + this.units; 336 | this.percent = 0; 337 | } 338 | 339 | ProgressBar.prototype = { 340 | 341 | updateBar: function ProgressBar_updateBar() { 342 | if (this._indeterminate) { 343 | this.div.classList.add('indeterminate'); 344 | this.div.style.width = this.width + this.units; 345 | return; 346 | } 347 | 348 | this.div.classList.remove('indeterminate'); 349 | var progressSize = this.width * this._percent / 100; 350 | this.div.style.width = progressSize + this.units; 351 | }, 352 | 353 | get percent() { 354 | return this._percent; 355 | }, 356 | 357 | set percent(val) { 358 | this._indeterminate = isNaN(val); 359 | this._percent = clamp(val, 0, 100); 360 | this.updateBar(); 361 | }, 362 | 363 | setWidth: function ProgressBar_setWidth(viewer) { 364 | if (viewer) { 365 | var container = viewer.parentNode; 366 | var scrollbarWidth = container.offsetWidth - viewer.offsetWidth; 367 | if (scrollbarWidth > 0) { 368 | this.bar.setAttribute('style', 'width: calc(100% - ' + 369 | scrollbarWidth + 'px);'); 370 | } 371 | } 372 | }, 373 | 374 | hide: function ProgressBar_hide() { 375 | if (!this.visible) { 376 | return; 377 | } 378 | this.visible = false; 379 | this.bar.classList.add('hidden'); 380 | document.body.classList.remove('loadingInProgress'); 381 | }, 382 | 383 | show: function ProgressBar_show() { 384 | if (this.visible) { 385 | return; 386 | } 387 | this.visible = true; 388 | document.body.classList.add('loadingInProgress'); 389 | this.bar.classList.remove('hidden'); 390 | } 391 | }; 392 | 393 | return ProgressBar; 394 | })(); 395 | --------------------------------------------------------------------------------