diff --git a/.gitignore b/.gitignore
index 1a2180d..8062a9f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -26,3 +26,6 @@ build/
doc/api/
/web/swadesh
/web/tibetan-lexicon-layout
+/web/style/.sass-cache/
+/web/style/*.css
+/web/eittland-files/GIS/
diff --git a/Dockerfile b/Dockerfile
index c8fcc3c..8fe9775 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -2,15 +2,18 @@ FROM google/dart:2.7
WORKDIR /app
-RUN mkdir /pub-cache
+# Get Dart dependencies
+RUN mkdir -p /pub-cache
ENV PUB_CACHE=/pub-cache
ENV PATH="${PATH}:/pub-cache/bin"
RUN pub global activate webdev
-# RUN pub global activate stagehand
-
ADD pubspec.* /app/
RUN pub get
-ADD . /app/
RUN pub get --offline
-# EXPOSE 8010
+RUN apt update && apt install ruby-sass ruby-dev build-essential -y
+RUN gem install sass-listen
+
+ADD . /app/
+
+CMD ["./start.sh"]
diff --git a/TODOs.org b/TODOs.org
new file mode 100644
index 0000000..0dc9cbf
--- /dev/null
+++ b/TODOs.org
@@ -0,0 +1,30 @@
+* TODO Organization of HTML [4/4]
+** DONE Add link to images that don’t have any
+ CLOSED: [2020-05-05 mar. 13:31]
+** DONE Add English links detection
+ CLOSED: [2020-05-05 mar. 13:31]
+** DONE Add button to display TOC
+ CLOSED: [2020-04-28 mar. 22:30]
+** DONE Add share links [5/5]
+ CLOSED: [2020-04-29 mer. 00:03]
+*** DONE Add Twitter share
+ CLOSED: [2020-04-28 mar. 23:22]
+*** DONE Add Reddit share
+ CLOSED: [2020-04-28 mar. 23:23]
+*** DONE Add Facebook share
+ CLOSED: [2020-04-28 mar. 23:23]
+*** DONE Add LinkedIn share
+ CLOSED: [2020-04-29 mer. 00:03]
+*** DONE Add Email share
+ CLOSED: [2020-04-29 mer. 00:03]
+* TODO Styling [5/5]
+** DONE Images
+ CLOSED: [2020-05-05 mar. 13:31]
+** DONE Mobile version
+ CLOSED: [2020-05-05 mar. 13:31]
+** DONE Tables
+ CLOSED: [2020-05-02 Sat 12:09]
+** DONE Hint bubbles for phonetics (Ñyqy)
+ CLOSED: [2020-04-28 mar. 22:31]
+** DONE Links
+ CLOSED: [2020-04-29 mer. 00:03]
diff --git a/docker-compose.yml b/docker-compose.yml
index 3b2af8f..8ff6606 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -4,8 +4,7 @@ services:
web:
build: .
ports:
- - "8010:8010"
- command: webdev serve --release web:8010 --hostname 0.0.0.0
+ - "8010:8080"
restart: always
volumes:
- ./web/:/app/web/
diff --git a/pubspec.yaml b/pubspec.yaml
index 0dd65d7..96b0265 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -8,7 +8,7 @@ environment:
sdk: '>=2.5.0 <3.0.0'
dependencies:
- js: '^0.6.1+1'
+ html: '^0.14.0+3'
dev_dependencies:
build_runner: ^1.8.0
diff --git a/start.sh b/start.sh
new file mode 100755
index 0000000..c655788
--- /dev/null
+++ b/start.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+sass --watch web/style/:web/style -tcompressed &
+webdev serve --release --hostname 0.0.0.0
diff --git a/web/TEMPLATE b/web/TEMPLATE
index ee87fdd..3b54745 100644
--- a/web/TEMPLATE
+++ b/web/TEMPLATE
@@ -1,5 +1,5 @@
# -*- mode: org; org-confirm-babel-evaluate: nil -*-
-#+TITLE: Une Grammaire du TEMPLATE
+#+TITLE: TEMPLATE
#+HTML_HEAD:
#+HTML_HEAD:
#+HTML_HEAD:
diff --git a/web/css/dark.scss b/web/css/dark.scss
deleted file mode 100644
index 35733ef..0000000
--- a/web/css/dark.scss
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- Copyright (C) 2019-2020 Lucien Cartier-Tilet
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as
- published by the Free Software Foundation, either version 3 of the
- License, or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see .
-*/
-
-$bg: #2c3e50;
-$darkerbg: #34495e;
-$textcolor: #ecf0f1;
-$tablecolor: #263646;
-
-html {
- background-color: $darkerbg;
-}
-
-thead {
- tr {
- @extend html;
- }
-}
-
-.tooltiptext {
- @extend html;
-}
-
-.tooltiptext::after {
- border-color: $darkerbg transparent transparent transparent;
-}
-
-body {
- color: $textcolor;
-}
-
-.title {
- @extend body;
-}
-
-a {
- @extend body;
-}
-
-th {
- border: 1px solid $tablecolor;
-}
-
-td {
- @extend th;
-}
-
-pre {
- @extend th;
-}
-
-table {
- border: 2px solid $tablecolor;
-}
-
-#content {
- background-color: $bg;
-}
-
-#postamble{
- background-color: $bg;
-}
diff --git a/web/css/htmlize.css b/web/css/htmlize.css
deleted file mode 100644
index 37a52d0..0000000
--- a/web/css/htmlize.css
+++ /dev/null
@@ -1,765 +0,0 @@
-.org-bold {
- /* bold */
- font-weight: bold;
-}
-
-.org-bold-italic {
- /* bold-italic */
- font-weight: bold;
- font-style: italic;
-}
-
-.org-buffer-menu-buffer {
- /* buffer-menu-buffer */
- font-weight: bold;
-}
-
-.org-builtin {
- /* font-lock-builtin-face */
- color: #7a378b;
-}
-
-.org-button {
- /* button */
- text-decoration: underline;
-}
-
-.org-calendar-today {
- /* calendar-today */
- text-decoration: underline;
-}
-
-.org-change-log-acknowledgement {
- /* change-log-acknowledgement */
- color: #b22222;
-}
-
-.org-change-log-conditionals {
- /* change-log-conditionals */
- color: #a0522d;
-}
-
-.org-change-log-date {
- /* change-log-date */
- color: #8b2252;
-}
-
-.org-change-log-email {
- /* change-log-email */
- color: #a0522d;
-}
-
-.org-change-log-file {
- /* change-log-file */
- color: #0000ff;
-}
-
-.org-change-log-function {
- /* change-log-function */
- color: #a0522d;
-}
-
-.org-change-log-list {
- /* change-log-list */
- color: #a020f0;
-}
-
-.org-change-log-name {
- /* change-log-name */
- color: #008b8b;
-}
-
-.org-comint-highlight-input {
- /* comint-highlight-input */
- font-weight: bold;
-}
-
-.org-comint-highlight-prompt {
- /* comint-highlight-prompt */
- color: #00008b;
-}
-
-.org-comment {
- /* font-lock-comment-face */
- color: #999988;
- font-style: italic;
-}
-
-.org-comment-delimiter {
- /* font-lock-comment-delimiter-face */
- color: #999988;
- font-style: italic;
-}
-
-.org-completions-annotations {
- /* completions-annotations */
- font-style: italic;
-}
-
-.org-completions-common-part {
- /* completions-common-part */
- color: #000000;
- background-color: #ffffff;
-}
-
-.org-completions-first-difference {
- /* completions-first-difference */
- font-weight: bold;
-}
-
-.org-constant {
- /* font-lock-constant-face */
- color: #008b8b;
-}
-
-.org-diary {
- /* diary */
- color: #ff0000;
-}
-
-.org-diff-context {
- /* diff-context */
- color: #7f7f7f;
-}
-
-.org-diff-file-header {
- /* diff-file-header */
- background-color: #b3b3b3;
- font-weight: bold;
-}
-
-.org-diff-function {
- /* diff-function */
- background-color: #cccccc;
-}
-
-.org-diff-header {
- /* diff-header */
- background-color: #cccccc;
-}
-
-.org-diff-hunk-header {
- /* diff-hunk-header */
- background-color: #cccccc;
-}
-
-.org-diff-index {
- /* diff-index */
- background-color: #b3b3b3;
- font-weight: bold;
-}
-
-.org-diff-nonexistent {
- /* diff-nonexistent */
- background-color: #b3b3b3;
- font-weight: bold;
-}
-
-.org-diff-refine-change {
- /* diff-refine-change */
- background-color: #d9d9d9;
-}
-
-.org-dired-directory {
- /* dired-directory */
- color: #0000ff;
-}
-
-.org-dired-flagged {
- /* dired-flagged */
- color: #ff0000;
- font-weight: bold;
-}
-
-.org-dired-header {
- /* dired-header */
- color: #228b22;
-}
-
-.org-dired-ignored {
- /* dired-ignored */
- color: #7f7f7f;
-}
-
-.org-dired-mark {
- /* dired-mark */
- color: #008b8b;
-}
-
-.org-dired-marked {
- /* dired-marked */
- color: #ff0000;
- font-weight: bold;
-}
-
-.org-dired-perm-write {
- /* dired-perm-write */
- color: #b22222;
-}
-
-.org-dired-symlink {
- /* dired-symlink */
- color: #a020f0;
-}
-
-.org-dired-warning {
- /* dired-warning */
- color: #ff0000;
- font-weight: bold;
-}
-
-.org-doc {
- /* font-lock-doc-face */
- color: #8b2252;
-}
-
-.org-escape-glyph {
- /* escape-glyph */
- color: #a52a2a;
-}
-
-.org-file-name-shadow {
- /* file-name-shadow */
- color: #7f7f7f;
-}
-
-.org-flyspell-duplicate {
- /* flyspell-duplicate */
- color: #cdad00;
- font-weight: bold;
- text-decoration: underline;
-}
-
-.org-flyspell-incorrect {
- /* flyspell-incorrect */
- color: #ff4500;
- font-weight: bold;
- text-decoration: underline;
-}
-
-.org-fringe {
- /* fringe */
- background-color: #f2f2f2;
-}
-
-.org-function-name {
- /* font-lock-function-name-face */
- color: teal;
-}
-
-.org-header-line {
- /* header-line */
- color: #333333;
- background-color: #e5e5e5;
-}
-
-.org-help-argument-name {
- /* help-argument-name */
- font-style: italic;
-}
-
-.org-highlight {
- /* highlight */
- background-color: #b4eeb4;
-}
-
-.org-holiday {
- /* holiday */
- background-color: #ffc0cb;
-}
-
-.org-isearch {
- /* isearch */
- color: #b0e2ff;
- background-color: #cd00cd;
-}
-
-.org-isearch-fail {
- /* isearch-fail */
- background-color: #ffc1c1;
-}
-
-.org-italic {
- /* italic */
- font-style: italic;
-}
-
-.org-keyword {
- /* font-lock-keyword-face */
- color: #0086b3;
-}
-
-.org-lazy-highlight {
- /* lazy-highlight */
- background-color: #afeeee;
-}
-
-.org-link {
- /* link */
- color: #0000ff;
- text-decoration: underline;
-}
-
-.org-link-visited {
- /* link-visited */
- color: #8b008b;
- text-decoration: underline;
-}
-
-.org-log-edit-header {
- /* log-edit-header */
- color: #a020f0;
-}
-
-.org-log-edit-summary {
- /* log-edit-summary */
- color: #0000ff;
-}
-
-.org-log-edit-unknown-header {
- /* log-edit-unknown-header */
- color: #b22222;
-}
-
-.org-match {
- /* match */
- background-color: #ffff00;
-}
-
-.org-next-error {
- /* next-error */
- background-color: #eedc82;
-}
-
-.org-nobreak-space {
- /* nobreak-space */
- color: #a52a2a;
- text-decoration: underline;
-}
-
-.org-org-archived {
- /* org-archived */
- color: #7f7f7f;
-}
-
-.org-org-block {
- /* org-block */
- color: #7f7f7f;
-}
-
-.org-org-block-begin-line {
- /* org-block-begin-line */
- color: #b22222;
-}
-
-.org-org-block-end-line {
- /* org-block-end-line */
- color: #b22222;
-}
-
-.org-org-checkbox {
- /* org-checkbox */
- font-weight: bold;
-}
-
-.org-org-checkbox-statistics-done {
- /* org-checkbox-statistics-done */
- color: #228b22;
- font-weight: bold;
-}
-
-.org-org-checkbox-statistics-todo {
- /* org-checkbox-statistics-todo */
- color: #ff0000;
- font-weight: bold;
-}
-
-.org-org-clock-overlay {
- /* org-clock-overlay */
- background-color: #ffff00;
-}
-
-.org-org-code {
- /* org-code */
- color: #7f7f7f;
-}
-
-.org-org-column {
- /* org-column */
- background-color: #e5e5e5;
-}
-
-.org-org-column-title {
- /* org-column-title */
- background-color: #e5e5e5;
- font-weight: bold;
- text-decoration: underline;
-}
-
-.org-org-date {
- /* org-date */
- color: #a020f0;
- text-decoration: underline;
-}
-
-.org-org-document-info {
- /* org-document-info */
- color: #191970;
-}
-
-.org-org-document-info-keyword {
- /* org-document-info-keyword */
- color: #7f7f7f;
-}
-
-.org-org-document-title {
- /* org-document-title */
- color: #191970;
- font-size: 144%;
- font-weight: bold;
-}
-
-.org-org-done {
- /* org-done */
- color: #228b22;
- font-weight: bold;
-}
-
-.org-org-drawer {
- /* org-drawer */
- color: #0000ff;
-}
-
-.org-org-ellipsis {
- /* org-ellipsis */
- color: #b8860b;
- text-decoration: underline;
-}
-
-.org-org-footnote {
- /* org-footnote */
- color: #a020f0;
- text-decoration: underline;
-}
-
-.org-org-formula {
- /* org-formula */
- color: #b22222;
-}
-
-.org-org-headline-done {
- /* org-headline-done */
- color: #bc8f8f;
-}
-
-.org-org-hide {
- /* org-hide */
- color: #ffffff;
-}
-
-.org-org-latex-and-export-specials {
- /* org-latex-and-export-specials */
- color: #8b4513;
-}
-
-.org-org-level-1 {
- /* org-level-1 */
- color: #0000ff;
-}
-
-.org-org-level-2 {
- /* org-level-2 */
- color: #a0522d;
-}
-
-.org-org-level-3 {
- /* org-level-3 */
- color: #a020f0;
-}
-
-.org-org-level-4 {
- /* org-level-4 */
- color: #b22222;
-}
-
-.org-org-level-5 {
- /* org-level-5 */
- color: #228b22;
-}
-
-.org-org-level-6 {
- /* org-level-6 */
- color: #008b8b;
-}
-
-.org-org-level-7 {
- /* org-level-7 */
- color: #7a378b;
-}
-
-.org-org-level-8 {
- /* org-level-8 */
- color: #8b2252;
-}
-
-.org-org-link {
- /* org-link */
- color: #0000ff;
- text-decoration: underline;
-}
-
-.org-org-meta-line {
- /* org-meta-line */
- color: #b22222;
-}
-
-.org-org-mode-line-clock {
- /* org-mode-line-clock */
- color: #000000;
- background-color: #bfbfbf;
-}
-
-.org-org-mode-line-clock-overrun {
- /* org-mode-line-clock-overrun */
- color: #000000;
- background-color: #ff0000;
-}
-
-.org-org-quote {
- /* org-quote */
- color: #7f7f7f;
-}
-
-.org-org-scheduled {
- /* org-scheduled */
- color: #006400;
-}
-
-.org-org-scheduled-previously {
- /* org-scheduled-previously */
- color: #b22222;
-}
-
-.org-org-scheduled-today {
- /* org-scheduled-today */
- color: #006400;
-}
-
-.org-org-sexp-date {
- /* org-sexp-date */
- color: #a020f0;
-}
-
-.org-org-special-keyword {
- /* org-special-keyword */
- color: #a020f0;
-}
-
-.org-org-table {
- /* org-table */
- color: #0000ff;
-}
-
-.org-org-tag {
- /* org-tag */
- font-weight: bold;
-}
-
-.org-org-target {
- /* org-target */
- text-decoration: underline;
-}
-
-.org-org-time-grid {
- /* org-time-grid */
- color: #b8860b;
-}
-
-.org-org-todo {
- /* org-todo */
- color: #ff0000;
- font-weight: bold;
-}
-
-.org-org-upcoming-deadline {
- /* org-upcoming-deadline */
- color: #b22222;
-}
-
-.org-org-verbatim {
- /* org-verbatim */
- color: #7f7f7f;
-}
-
-.org-org-verse {
- /* org-verse */
- color: #7f7f7f;
-}
-
-.org-org-warning {
- /* org-warning */
- color: #ff0000;
- font-weight: bold;
-}
-
-.org-outline-1 {
- /* outline-1 */
- color: #0000ff;
-}
-
-.org-outline-2 {
- /* outline-2 */
- color: #a0522d;
-}
-
-.org-outline-3 {
- /* outline-3 */
- color: #a020f0;
-}
-
-.org-outline-4 {
- /* outline-4 */
- color: #b22222;
-}
-
-.org-outline-5 {
- /* outline-5 */
- color: #228b22;
-}
-
-.org-outline-6 {
- /* outline-6 */
- color: #008b8b;
-}
-
-.org-outline-7 {
- /* outline-7 */
- color: #7a378b;
-}
-
-.org-outline-8 {
- /* outline-8 */
- color: #8b2252;
-}
-
-.org-preprocessor {
- /* font-lock-preprocessor-face */
- color: #7a378b;
-}
-
-.org-query-replace {
- /* query-replace */
- color: #b0e2ff;
- background-color: #cd00cd;
-}
-
-.org-regexp-grouping-backslash {
- /* font-lock-regexp-grouping-backslash */
- font-weight: bold;
-}
-
-.org-regexp-grouping-construct {
- /* font-lock-regexp-grouping-construct */
- font-weight: bold;
-}
-
-.org-region {
- /* region */
- background-color: #eedc82;
-}
-
-.org-secondary-selection {
- /* secondary-selection */
- background-color: #ffff00;
-}
-
-.org-shadow {
- /* shadow */
- color: #7f7f7f;
-}
-
-.org-show-paren-match {
- /* show-paren-match */
- background-color: #40e0d0;
-}
-
-.org-show-paren-mismatch {
- /* show-paren-mismatch */
- color: #ffffff;
- background-color: #a020f0;
-}
-
-.org-string {
- /* font-lock-string-face */
- color: #dd1144;
-}
-
-.org-tool-bar {
- /* tool-bar */
- color: #000000;
- background-color: #bfbfbf;
-}
-
-.org-tooltip {
- /* tooltip */
- color: #000000;
- background-color: #ffffe0;
-}
-
-.org-trailing-whitespace {
- /* trailing-whitespace */
- background-color: #ff0000;
-}
-
-.org-type {
- /* font-lock-type-face */
- color: #228b22;
-}
-
-.org-underline {
- /* underline */
- text-decoration: underline;
-}
-
-.org-variable-name {
- /* font-lock-variable-name-face */
- color: teal;
-}
-
-.org-warning {
- /* font-lock-warning-face */
- color: #ff0000;
- font-weight: bold;
-}
-
-.org-widget-button {
- /* widget-button */
- font-weight: bold;
-}
-
-.org-widget-button-pressed {
- /* widget-button-pressed */
- color: #ff0000;
-}
-
-.org-widget-documentation {
- /* widget-documentation */
- color: #006400;
-}
-
-.org-widget-field {
- /* widget-field */
- background-color: #d9d9d9;
-}
-
-.org-widget-inactive {
- /* widget-inactive */
- color: #7f7f7f;
-}
-
-.org-widget-single-line-field {
- /* widget-single-line-field */
- background-color: #d9d9d9;
-}
-
-/*# sourceMappingURL=htmlize.css.map */
diff --git a/web/css/htmlize.min.css b/web/css/htmlize.min.css
deleted file mode 100644
index a34a2bf..0000000
--- a/web/css/htmlize.min.css
+++ /dev/null
@@ -1,620 +0,0 @@
-.org-bold {
- font-weight: 700;
-}
-
-.org-bold-italic {
- font-weight: 700;
- font-style: italic;
-}
-
-.org-buffer-menu-buffer {
- font-weight: 700;
-}
-
-.org-builtin {
- color: #7a378b;
-}
-
-.org-button {
- text-decoration: underline;
-}
-
-.org-calendar-today {
- text-decoration: underline;
-}
-
-.org-change-log-acknowledgement {
- color: #b22222;
-}
-
-.org-change-log-conditionals {
- color: sienna;
-}
-
-.org-change-log-date {
- color: #8b2252;
-}
-
-.org-change-log-email {
- color: sienna;
-}
-
-.org-change-log-file {
- color: #00f;
-}
-
-.org-change-log-function {
- color: sienna;
-}
-
-.org-change-log-list {
- color: #a020f0;
-}
-
-.org-change-log-name {
- color: #008b8b;
-}
-
-.org-comint-highlight-input {
- font-weight: 700;
-}
-
-.org-comint-highlight-prompt {
- color: #00008b;
-}
-
-.org-comment {
- color: #998;
- font-style: italic;
-}
-
-.org-comment-delimiter {
- color: #998;
- font-style: italic;
-}
-
-.org-completions-annotations {
- font-style: italic;
-}
-
-.org-completions-common-part {
- color: #000;
- background-color: #fff;
-}
-
-.org-completions-first-difference {
- font-weight: 700;
-}
-
-.org-constant {
- color: #008b8b;
-}
-
-.org-diary {
- color: red;
-}
-
-.org-diff-context {
- color: #7f7f7f;
-}
-
-.org-diff-file-header {
- background-color: #b3b3b3;
- font-weight: 700;
-}
-
-.org-diff-function {
- background-color: #ccc;
-}
-
-.org-diff-header {
- background-color: #ccc;
-}
-
-.org-diff-hunk-header {
- background-color: #ccc;
-}
-
-.org-diff-index {
- background-color: #b3b3b3;
- font-weight: 700;
-}
-
-.org-diff-nonexistent {
- background-color: #b3b3b3;
- font-weight: 700;
-}
-
-.org-diff-refine-change {
- background-color: #d9d9d9;
-}
-
-.org-dired-directory {
- color: #00f;
-}
-
-.org-dired-flagged {
- color: red;
- font-weight: 700;
-}
-
-.org-dired-header {
- color: #228b22;
-}
-
-.org-dired-ignored {
- color: #7f7f7f;
-}
-
-.org-dired-mark {
- color: #008b8b;
-}
-
-.org-dired-marked {
- color: red;
- font-weight: 700;
-}
-
-.org-dired-perm-write {
- color: #b22222;
-}
-
-.org-dired-symlink {
- color: #a020f0;
-}
-
-.org-dired-warning {
- color: red;
- font-weight: 700;
-}
-
-.org-doc {
- color: #8b2252;
-}
-
-.org-escape-glyph {
- color: brown;
-}
-
-.org-file-name-shadow {
- color: #7f7f7f;
-}
-
-.org-flyspell-duplicate {
- color: #cdad00;
- font-weight: 700;
- text-decoration: underline;
-}
-
-.org-flyspell-incorrect {
- color: #ff4500;
- font-weight: 700;
- text-decoration: underline;
-}
-
-.org-fringe {
- background-color: #f2f2f2;
-}
-
-.org-function-name {
- color: teal;
-}
-
-.org-header-line {
- color: #333;
- background-color: #e5e5e5;
-}
-
-.org-help-argument-name {
- font-style: italic;
-}
-
-.org-highlight {
- background-color: #b4eeb4;
-}
-
-.org-holiday {
- background-color: pink;
-}
-
-.org-isearch {
- color: #b0e2ff;
- background-color: #cd00cd;
-}
-
-.org-isearch-fail {
- background-color: #ffc1c1;
-}
-
-.org-italic {
- font-style: italic;
-}
-
-.org-keyword {
- color: #0086b3;
-}
-
-.org-lazy-highlight {
- background-color: #afeeee;
-}
-
-.org-link {
- color: #00f;
- text-decoration: underline;
-}
-
-.org-link-visited {
- color: #8b008b;
- text-decoration: underline;
-}
-
-.org-log-edit-header {
- color: #a020f0;
-}
-
-.org-log-edit-summary {
- color: #00f;
-}
-
-.org-log-edit-unknown-header {
- color: #b22222;
-}
-
-.org-match {
- background-color: #ff0;
-}
-
-.org-next-error {
- background-color: #eedc82;
-}
-
-.org-nobreak-space {
- color: brown;
- text-decoration: underline;
-}
-
-.org-org-archived {
- color: #7f7f7f;
-}
-
-.org-org-block {
- color: #7f7f7f;
-}
-
-.org-org-block-begin-line {
- color: #b22222;
-}
-
-.org-org-block-end-line {
- color: #b22222;
-}
-
-.org-org-checkbox {
- font-weight: 700;
-}
-
-.org-org-checkbox-statistics-done {
- color: #228b22;
- font-weight: 700;
-}
-
-.org-org-checkbox-statistics-todo {
- color: red;
- font-weight: 700;
-}
-
-.org-org-clock-overlay {
- background-color: #ff0;
-}
-
-.org-org-code {
- color: #7f7f7f;
-}
-
-.org-org-column {
- background-color: #e5e5e5;
-}
-
-.org-org-column-title {
- background-color: #e5e5e5;
- font-weight: 700;
- text-decoration: underline;
-}
-
-.org-org-date {
- color: #a020f0;
- text-decoration: underline;
-}
-
-.org-org-document-info {
- color: #191970;
-}
-
-.org-org-document-info-keyword {
- color: #7f7f7f;
-}
-
-.org-org-document-title {
- color: #191970;
- font-size: 144%;
- font-weight: 700;
-}
-
-.org-org-done {
- color: #228b22;
- font-weight: 700;
-}
-
-.org-org-drawer {
- color: #00f;
-}
-
-.org-org-ellipsis {
- color: #b8860b;
- text-decoration: underline;
-}
-
-.org-org-footnote {
- color: #a020f0;
- text-decoration: underline;
-}
-
-.org-org-formula {
- color: #b22222;
-}
-
-.org-org-headline-done {
- color: #bc8f8f;
-}
-
-.org-org-hide {
- color: #fff;
-}
-
-.org-org-latex-and-export-specials {
- color: #8b4513;
-}
-
-.org-org-level-1 {
- color: #00f;
-}
-
-.org-org-level-2 {
- color: sienna;
-}
-
-.org-org-level-3 {
- color: #a020f0;
-}
-
-.org-org-level-4 {
- color: #b22222;
-}
-
-.org-org-level-5 {
- color: #228b22;
-}
-
-.org-org-level-6 {
- color: #008b8b;
-}
-
-.org-org-level-7 {
- color: #7a378b;
-}
-
-.org-org-level-8 {
- color: #8b2252;
-}
-
-.org-org-link {
- color: #00f;
- text-decoration: underline;
-}
-
-.org-org-meta-line {
- color: #b22222;
-}
-
-.org-org-mode-line-clock {
- color: #000;
- background-color: #bfbfbf;
-}
-
-.org-org-mode-line-clock-overrun {
- color: #000;
- background-color: red;
-}
-
-.org-org-quote {
- color: #7f7f7f;
-}
-
-.org-org-scheduled {
- color: #006400;
-}
-
-.org-org-scheduled-previously {
- color: #b22222;
-}
-
-.org-org-scheduled-today {
- color: #006400;
-}
-
-.org-org-sexp-date {
- color: #a020f0;
-}
-
-.org-org-special-keyword {
- color: #a020f0;
-}
-
-.org-org-table {
- color: #00f;
-}
-
-.org-org-tag {
- font-weight: 700;
-}
-
-.org-org-target {
- text-decoration: underline;
-}
-
-.org-org-time-grid {
- color: #b8860b;
-}
-
-.org-org-todo {
- color: red;
- font-weight: 700;
-}
-
-.org-org-upcoming-deadline {
- color: #b22222;
-}
-
-.org-org-verbatim {
- color: #7f7f7f;
-}
-
-.org-org-verse {
- color: #7f7f7f;
-}
-
-.org-org-warning {
- color: red;
- font-weight: 700;
-}
-
-.org-outline-1 {
- color: #00f;
-}
-
-.org-outline-2 {
- color: sienna;
-}
-
-.org-outline-3 {
- color: #a020f0;
-}
-
-.org-outline-4 {
- color: #b22222;
-}
-
-.org-outline-5 {
- color: #228b22;
-}
-
-.org-outline-6 {
- color: #008b8b;
-}
-
-.org-outline-7 {
- color: #7a378b;
-}
-
-.org-outline-8 {
- color: #8b2252;
-}
-
-.org-preprocessor {
- color: #7a378b;
-}
-
-.org-query-replace {
- color: #b0e2ff;
- background-color: #cd00cd;
-}
-
-.org-regexp-grouping-backslash {
- font-weight: 700;
-}
-
-.org-regexp-grouping-construct {
- font-weight: 700;
-}
-
-.org-region {
- background-color: #eedc82;
-}
-
-.org-secondary-selection {
- background-color: #ff0;
-}
-
-.org-shadow {
- color: #7f7f7f;
-}
-
-.org-show-paren-match {
- background-color: #40e0d0;
-}
-
-.org-show-paren-mismatch {
- color: #fff;
- background-color: #a020f0;
-}
-
-.org-string {
- color: #d14;
-}
-
-.org-tool-bar {
- color: #000;
- background-color: #bfbfbf;
-}
-
-.org-tooltip {
- color: #000;
- background-color: #ffffe0;
-}
-
-.org-trailing-whitespace {
- background-color: red;
-}
-
-.org-type {
- color: #228b22;
-}
-
-.org-underline {
- text-decoration: underline;
-}
-
-.org-variable-name {
- color: teal;
-}
-
-.org-warning {
- color: red;
- font-weight: 700;
-}
-
-.org-widget-button {
- font-weight: 700;
-}
-
-.org-widget-button-pressed {
- color: red;
-}
-
-.org-widget-documentation {
- color: #006400;
-}
-
-.org-widget-field {
- background-color: #d9d9d9;
-}
-
-.org-widget-inactive {
- color: #7f7f7f;
-}
-
-.org-widget-single-line-field {
- background-color: #d9d9d9;
-}
-
-/*# sourceMappingURL=htmlize.min.css.map */
diff --git a/web/css/light.scss b/web/css/light.scss
deleted file mode 100644
index ee571bf..0000000
--- a/web/css/light.scss
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- Copyright (C) 2019-2020 Lucien Cartier-Tilet
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as
- published by the Free Software Foundation, either version 3 of the
- License, or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see .
-*/
-
-$bg: #eee;
-$darkerbg: #ddd;
-$textcolor: #444;
-
-html {
- background-color: $bg;
-}
-
-thead {
- tr {
- @extend html;
- }
-}
-
-.tooltiptext {
- @extend html;
-}
-
-.tooltiptext::after {
- border-color: $darkerbg transparent transparent transparent;
-}
-
-body {
- color: $textcolor;
-}
-
-.title {
- @extend body;
-}
-
-a {
- @extend body;
-}
-
-th {
- border: 1px solid $textcolor;
-}
-
-td {
- @extend th;
-}
-
-pre {
- @extend th;
-}
-
-table {
- border: 2px solid $textcolor;
-}
-
-#content {
- background-color: $darkerbg;
-}
-
-#postamble{
- @extend #content;
-}
diff --git a/web/css/main.scss b/web/css/main.scss
deleted file mode 100644
index 021d303..0000000
--- a/web/css/main.scss
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- Copyright (C) 2019-2020 Lucien Cartier-Tilet
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as
- published by the Free Software Foundation, either version 3 of the
- License, or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see .
-*/
-
-@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic|Roboto+Slab:400,700|Inconsolata:400,700);
-
-@font-face {
- font-family: "DoulosSIL";
- font-display: swap;
- src: url("https://langue.phundrak.com/fonts/DoulosSIL-R.woff");
-}
-
-@font-face {
- font-family: "Noto Sans Runes";
- font-display: swap;
- src: url("../fonts/NotoSansRunic-Regular.ttf");
-}
-
-@font-face {
- font-family: "Helvetica Neue";
- font-display: swap;
- src: url("../fonts/HelveticaNeue.ttf");
-}
-
-body {
- font-family: "Noto Sans Runes", "DoulosSIL", "Lato", "proxima-nova", "Helvetica Neue", Arial, sans-serif;
- font-weight: normal;
- overflow-x: hidden;
- font-size: 105%;
- height: 100%;
- margin: 10px;
-}
-
-#postamble {
- text-align: center;
- margin-bottom: 20px;
-}
-
-#content {
- max-width: 1100px;
- margin: 20px auto;
- padding: 20px;
- box-shadow: 5px 5px 7px rgba(1, 1, 1, .6);
-}
-
-hr {
- display: block;
- margin-top: 0.5em;
- margin-bottom: 0.5em;
- margin-left: auto;
- margin-right: auto;
- border-style: inset;
- border-width: 1px;
-}
-
-.outline-2 {
- margin: 0 2px;
- padding: 0 10px;
-}
-
-.outline-text-2 {
- @extend .outline-2;
- margin-bottom: 20px;
-}
-
-.outline-4 {
- @extend .outline-2;
-}
-
-.outline-text-4 {
- @extend .outline-text-2;
-}
-
-.outline-5 {
- @extend .outline-2;
-}
-
-.outline-text-5 {
- @extend .outline-text-2;
-}
-
-.outline-6 {
- @extend .outline-2;
-}
-
-.outline-text-6 {
- @extend .outline-text-2;
-}
-
-h1 {
- @extend legend;
- font-size: 4em;
- box-shadow: inset 0 -50px 0 #1abc9c;
-}
-
-h2 {
- @extend legend;
- font-size: 150%;
- box-shadow: inset 0 -20px 0 #16a085;
-}
-
-h3 {
- @extend legend;
- font-size: 125%;
- box-shadow: inset 0 -16px 0 #27ae60;
-}
-
-h4 {
- @extend legend;
- font-size: 115%;
- box-shadow: inset 0 -15px 0 #e67e22;
-}
-
-h5 {
- @extend legend;
- font-size: 110%;
- box-shadow: inset 0 -14px 0 #9b59b6;
-}
-
-h4,
-h5 {
- font-weight: 300;
-}
-
-p {
- text-align: justify;
-}
-
-$linkColor: #9b59b6;
-
-a {
- text-decoration: none;
- box-shadow: inset 0 -3px 0 $linkColor;
- transition: all .3s ease-out;
-}
-
-a:hover {
- box-shadow: inset 0 -21px 0 $linkColor;
- transition: all .3s ease-in;
-}
-
-a[href^="img/"],
-a[href^="img/"]:hover {
- box-shadow: 0 0;
-}
-
-.figure {
- display: block;
- overflow-x: auto;
-
- p {
- margin: 0 0;
- }
-}
-
-.largetable {
- display: block;
- overflow-x: auto;
-}
-
-img {
- margin: auto;
-}
-
-legend {
- font-family: "Roboto Slab", "ff-tisa-web-pro", "Georgia", Arial, sans-serif;
- font-weight: 700;
- display: inline-block;
-}
-
-table {
- margin: auto;
- border-collapse: collapse;
-}
-
-th,
-td {
- padding: 10px;
-}
-
-.vertical {
- writing-mode: vertical-rl;
- text-align: right;
-}
-
-pre {
- box-shadow: 3px 3px 3px rgba(1, 1, 1, .6);
-}
-
-/* scrollbar *****************************************************************/
-
-/* width */
-::-webkit-scrollbar {
- width: 5px;
- height: 5px;
-}
-
-/* Track */
-::-webkit-scrollbar-track {
- border-radius: 10px;
-}
-
-/* Handle */
-::-webkit-scrollbar-thumb {
- background: #7f8c8d;
- border-radius: 10px;
-}
-
-/* Theme switcher ************************************************************/
-
-.themeBtn {
- position: fixed;
- bottom: 25px;
- right: 25px;
- padding-top:10px;
- height: 40px;
- width: 50px;
- border-radius: 25px;
- background-color: #1e5b50;
- text-align: center;
- box-shadow: 3px 3px 6px rgba(1, 1, 1, .6);
- cursor: pointer;
-
- .fas {
- font-size: 30px;
- }
-}
diff --git a/web/css/nyqy.scss b/web/css/nyqy.scss
deleted file mode 100644
index bac0baf..0000000
--- a/web/css/nyqy.scss
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- Copyright (C) 2019-2020 Lucien Cartier-Tilet
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as
- published by the Free Software Foundation, either version 3 of the
- License, or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see .
-*/
-
-.tooltip {
- position: relative;
- display: inline-block;
- border-bottom: 1px dotted #1e5b50;
-
- .tooltiptext {
- visibility: hidden;
- width: 120px;
- text-align: center;
- padding: 5px 0;
- border-radius: 6px;
-
- /* position the tooltip text */
- position: absolute;
- z-index: 1;
- bottom: 125;
- left: 50%;
- margin-left: -60%;
-
- /* Fade in tooltip */
- opacity: 0;
- transition: opacity 0.3s;
-
- }
-
- .tooltiptext::after {
- content: "";
- top: 100%;
- margin-left: -5%;
- border-width: 5px;
- border-style: solid;
- transition: opacity 0.2s;
- }
-}
-
-.tooltip:hover {
- .tooltiptext {
- visibility: visible;
- opacity: 1;
- }
-}
-
-.tooltiptext {
- padding: 7px !important;
-}
-
-.largetable {
- $tablepadding: 40px;
- padding-top: $tablepadding !important;
- padding-bottom: $tablepadding !important;
-}
diff --git a/web/dart/cookie.dart b/web/dart/cookie.dart
deleted file mode 100644
index 7dbef43..0000000
--- a/web/dart/cookie.dart
+++ /dev/null
@@ -1,11 +0,0 @@
-@JS()
-library cookie;
-
-import 'package:js/js.dart';
-
-@JS()
-class Cookies {
- // external factory Cookie();
- external static String get(String name);
- external static void set(String name, String value);
-}
diff --git a/web/dart/main.dart b/web/dart/main.dart
index db6bd35..5b17663 100644
--- a/web/dart/main.dart
+++ b/web/dart/main.dart
@@ -1,66 +1,9 @@
-@JS()
-library main;
+import './reorganize_html.dart' show reorganizeHtml;
+import './theme.dart' show enableThemeChanger, setTheme;
-import 'dart:html';
-
-import 'package:js/js.dart';
-
-import './cookie.dart';
-
-void main() {
- reorganizeHtml();
- createThemeSwitcher();
- themeSwitch(isThemeDark());
- querySelector('.themeBtn').onClick.listen(themeSwitchMouse);
-}
-
-String cookieThemeName = 'theme';
-
-void createThemeSwitcher() {
- // set the correct CSS depending on the cookie, dark is enabled by default
- var isDark = isThemeDark();
- // Set the correct symbol in the theme switcher button
- querySelector('body').append(DivElement()..className = 'themeBtn');
- querySelector('.themeBtn')
- .children
- .add(Element.tag('i')..className = 'fas fa-' + (isDark ? 'sun' : 'moon'));
-}
-
-bool isThemeDark() {
- if (Cookies.get(cookieThemeName) == 'light') {
- return false;
- }
- Cookies.set(cookieThemeName, 'dark');
- return true;
-}
-
-void reorganizeHtml() {
- // Add a
element after the content div
- querySelector('#content').appendHtml('
');
-
- // Move the postamble in the content div
- querySelector('#content').append(querySelector('#postamble'));
-
- for (var table in querySelectorAll('table')) {
- var largetable = DivElement();
- largetable.className = 'largetable';
- table.before(largetable);
- largetable.children.add(table);
- }
-}
-
-bool setTheme(bool dark) {
- Cookies.set(cookieThemeName, (dark ? 'dark' : 'light'));
- return !dark;
-}
-
-void themeSwitch(bool isDark) {
- querySelector('.fas').className = 'fas fa-' + (isDark ? 'sun' : 'moon');
- querySelector('#theme').attributes['href'] =
- 'https://langue.phundrak.com/css/' + (isDark ? 'dark' : 'light') + '.css';
-}
-
-void themeSwitchMouse(MouseEvent event) {
- bool isDark = setTheme(!isThemeDark());
- themeSwitch(isDark);
+Future main() async {
+ await setTheme();
+ await reorganizeHtml().then((_) {
+ enableThemeChanger();
+ });
}
diff --git a/web/dart/navbar.dart b/web/dart/navbar.dart
new file mode 100644
index 0000000..4e404af
--- /dev/null
+++ b/web/dart/navbar.dart
@@ -0,0 +1,149 @@
+import 'dart:html';
+
+import './parse_sitemap.dart' show parseSitemap;
+
+// Returns the title of the current webpage
+String getPageTitle() {
+ return querySelector('title').text;
+}
+
+Element makeIcon(List classes, [String id]) {
+ final icon = Element.tag('i')..classes.addAll(classes);
+ if (id != null) {
+ icon.attributes['id'] = id;
+ }
+ return icon;
+}
+
+Future makeToc() async {
+ return Element.li()
+ ..attributes['id'] = 'toc-drop'
+ ..classes.addAll(['nav-item', 'has-dropdown'])
+ ..append(Element.a()
+ ..attributes['href'] = 'javascript:void(0)'
+ ..append(makeIcon(['fas', 'fa-list-ol'], 'tocBtn')));
+}
+
+Future makePages() async {
+ var pages = Element.ul()
+ ..attributes['id'] = 'drop-page'
+ ..classes.add('dropdown');
+ await parseSitemap().then((final sitemap) => {
+ sitemap.forEach((url, name) {
+ final link = Element.li()
+ ..classes.add('dropdown-item')
+ ..insertAdjacentElement(
+ 'afterBegin',
+ Element.a()
+ ..attributes['href'] = url
+ ..innerText = name);
+ pages.insertAdjacentElement('beforeEnd', link);
+ })
+ });
+ return Element.li()
+ ..append(Element.a()
+ ..attributes['href'] = 'javascript:void(0)'
+ ..append(makeIcon(['fas', 'fa-flag'])))
+ ..classes.addAll(['nav-item', 'has-dropdown'])
+ ..insertAdjacentElement('beforeEnd', pages);
+}
+
+Element makeShareLink(Element icon, String url) {
+ return Element.li()
+ ..classes.add('dropdown-item')
+ ..append(Element.a()
+ ..attributes['href'] = url
+ ..attributes['target'] = '_blank'
+ ..append(icon));
+}
+
+Future makeShare() async {
+ return Element.li()
+ ..classes.addAll(['nav-item', 'has-dropdown'])
+ ..append(Element.a()
+ ..attributes['href'] = 'javascript:void(0)'
+ ..append(makeIcon(['fas', 'fa-share-alt'])))
+ ..append(Element.ul()
+ ..classes.add('dropdown')
+ ..attributes['id'] = 'drop-share'
+ ..append(makeShareLink(
+ makeIcon(['fab', 'fa-twitter-square']),
+ 'https://twitter.com/share?text=${getPageTitle()}'
+ '&url=${window.location.href}'))
+ ..append(makeShareLink(makeIcon(['fab', 'fa-reddit-square']),
+ 'https://www.reddit.com/submit?title=${getPageTitle()}s&url=${window.location.href}'))
+ ..append(makeShareLink(makeIcon(['fas', 'fa-envelope-square']),
+ 'mailto:?subject=${getPageTitle}&body=${window.location.href}'))
+ ..append(makeShareLink(
+ makeIcon(['fab', 'fa-linkedin']),
+ 'https://www.linkedin.com/shareArticle?mini=true&url=${window.location.href}'
+ '&title=${getPageTitle()}'))
+ ..append(makeShareLink(makeIcon(['fab', 'fa-facebook-square']),
+ 'https://www.facebook.com/sharer/sharer.php?u=${window.location.href}')));
+}
+
+Future makeThemeChanger() async {
+ Element makeThemeItem(String t_btnId, Element t_icon, String t_text) {
+ return Element.li()
+ ..classes.add('dropdown-item')
+ ..append(Element.span()
+ ..attributes['id'] = t_btnId
+ ..append(t_icon)
+ ..appendText(' $t_text'));
+ }
+
+ return Element.li()
+ ..classes.addAll(['nav-item', 'has-dropdown'])
+ ..append(Element.a()
+ ..attributes['href'] = 'javascript:void(0)'
+ ..append(Element.span()
+ ..classes.add('fa-stack')
+ ..style.verticalAlign = 'top'
+ ..append(makeIcon(['fas', 'fa-sun', 'fa-stack-1x'])
+ ..style.fontSize = '0.9em')
+ ..append(makeIcon(['fas', 'fa-moon', 'fa-stack-1x']))))
+ ..append(Element.ul()
+ ..classes.add('dropdown')
+ ..attributes['id'] = 'theme-dropdown'
+ ..append(makeThemeItem('lightBtn', makeIcon(['fas', 'fa-sun']), 'Clair'))
+ ..append(
+ makeThemeItem('darkBtn', makeIcon(['fas', 'fa-lightbulb']), 'Sombre'))
+ ..append(
+ makeThemeItem('blackBtn', makeIcon(['fas', 'fa-moon']), 'Noir')));
+}
+
+Future makeHome() async {
+ return Element.li()
+ ..classes.add('nav-item')
+ ..insertAdjacentElement(
+ 'afterBegin',
+ Element.a()
+ ..attributes['href'] = '/'
+ ..append(makeIcon(['fas', 'fa-home'])));
+}
+
+// Add a navbar atop of the HTML body, containing two buttons:
+// - One back to home
+// - A dropdown to each page detected in the sitemap
+Future makeNavbar() async {
+ final navbar_content = Element.ul()..classes.add('navbar-nav');
+ final home = await makeHome();
+ final pages = await makePages();
+ final toc = await makeToc();
+ final share = await makeShare();
+ final theme = await makeThemeChanger();
+
+ navbar_content
+ ..append(home)
+ ..append(pages)
+ ..append(toc)
+ ..append(share)
+ ..append(theme);
+
+ // Navbar content added to navbar
+ final navbar = Element.nav()
+ ..classes.add('navbar')
+ ..append(navbar_content);
+
+ return navbar;
+}
diff --git a/web/dart/parse_sitemap.dart b/web/dart/parse_sitemap.dart
new file mode 100644
index 0000000..33ccd94
--- /dev/null
+++ b/web/dart/parse_sitemap.dart
@@ -0,0 +1,43 @@
+import 'dart:html' show HttpRequest;
+
+import 'package:html/parser.dart' show parse;
+import 'package:html/dom.dart' show Element;
+
+// Get the sitemap content
+Future getSitemap() async {
+ const path = 'sitemap.html';
+ try {
+ return await HttpRequest.getString(path);
+ } catch (e) {
+ print('Couldn’t open $path');
+ }
+ return 'Error';
+}
+
+// Parse the list of elements and detect pages from this list
+Map detectPages(List sitemap, [String prefix]) {
+ final links = {};
+ for (var elem in sitemap) {
+ if (elem.outerHtml.contains('index')) {
+ continue;
+ } else if (elem.innerHtml.startsWith('> parseSitemap() async {
+ final content = await getSitemap();
+ final sitemap = parse(content).getElementsByClassName('org-ul')[0].children;
+ return detectPages(sitemap);
+}
diff --git a/web/dart/reorganize_html.dart b/web/dart/reorganize_html.dart
new file mode 100644
index 0000000..a16988a
--- /dev/null
+++ b/web/dart/reorganize_html.dart
@@ -0,0 +1,71 @@
+import 'dart:html';
+
+import './navbar.dart' show makeNavbar;
+
+Future makeHeader() async {
+ var header = Element.tag('header');
+ header
+ ..append(Element.img()
+ ..attributes['src'] =
+ 'https://cdn.phundrak.com/img/mahakala-monochrome.png'
+ ..attributes['alt'] = 'Logo de Phundrak'
+ ..attributes['heigh'] = '150px'
+ ..attributes['width'] = '150px')
+ ..append(querySelector('h1'));
+ var subt = querySelector('.subtitle');
+ if (subt != null) {
+ header.append(subt);
+ }
+ return header;
+}
+
+Future wrapTables() async {
+ for (var table in querySelectorAll('table')) {
+ var largetable = DivElement()..className = 'largetable';
+ table.before(largetable);
+ largetable.children.add(table);
+ }
+}
+
+// All images that are not nested inside a link will be linkified to themselves.
+void linkifyImg() {
+ querySelectorAll('img').forEach((img) {
+ print(img.attributes['src']);
+ print(img.parent.tagName);
+ if (img.parent.tagName == 'P') {
+ final link = Element.a()..attributes['href'] = img.attributes['src'];
+ img.insertAdjacentElement('beforeBegin', link);
+ link.append(img);
+ }
+ });
+}
+
+Future reorganizeHtml() async {
+ final content = querySelector('#content');
+
+ // Make navbar
+ await makeNavbar().then((navbar) {
+ querySelector('body').insertAdjacentElement('afterBegin', navbar);
+ });
+
+ // Make header
+ await makeHeader().then((header) {
+ content.insertAdjacentElement('beforeBegin', header);
+ final subtitle = querySelector('.subtitle');
+ if (subtitle != null) {
+ header.append(subtitle);
+ }
+ });
+
+ // wrap tables in container for better SCSS display
+ await wrapTables();
+
+ linkifyImg();
+
+ // Add correct class to TOC
+ querySelector('#toc-drop')
+ .append(querySelector('#table-of-contents')..classes.add('dropdown'));
+
+ // Remove all
tags from HTML
+ querySelectorAll('br').forEach((br) => br.remove());
+}
diff --git a/web/dart/theme.dart b/web/dart/theme.dart
new file mode 100644
index 0000000..823a3f9
--- /dev/null
+++ b/web/dart/theme.dart
@@ -0,0 +1,53 @@
+import 'dart:html';
+
+class Theme {
+ String _name;
+ String _icon;
+
+ Theme(String t_name, String t_icon) {
+ _name = t_name;
+ _icon = t_icon;
+ }
+
+ String getIcon() => _icon;
+ String getName() => _name;
+}
+
+final themes = {
+ 'light': Theme('light', 'fa-sun'),
+ 'dark': Theme('dark', 'fa-lightbulb'),
+ 'black': Theme('black', 'fa-moon')
+};
+
+final localStorage = window.localStorage;
+
+var currentTheme = themes[localStorage['theme']];
+
+void enableThemeChanger() {
+ final darkBtn = querySelector('#darkBtn');
+ final lightBtn = querySelector('#lightBtn');
+ final blackBtn = querySelector('#blackBtn');
+
+ lightBtn.onClick.listen((_) => switchTheme(themes['light']));
+ darkBtn.onClick.listen((_) => switchTheme(themes['dark']));
+ blackBtn.onClick.listen((_) => switchTheme(themes['black']));
+}
+
+Future setTheme() async {
+ if (currentTheme == null) {
+ currentTheme = themes['light'];
+ localStorage['theme'] = currentTheme.getName();
+ }
+ querySelector('body')
+ ..classes.clear()
+ ..classes.add(currentTheme.getName());
+}
+
+void switchTheme(Theme currentTheme) {
+ // Set HTML theme
+ querySelector('body')
+ ..classes.clear()
+ ..classes.add(currentTheme.getName());
+ // Set storage theme
+ localStorage['theme'] = currentTheme.getName();
+}
diff --git a/web/eittland-files/Old city of Ðeberget.png b/web/eittland-files/Old city of Ðeberget.png
deleted file mode 100644
index 0ee5a60..0000000
Binary files a/web/eittland-files/Old city of Ðeberget.png and /dev/null differ
diff --git a/web/eittland-files/eittland-detailed.wonderdraft_map b/web/eittland-files/eittland-detailed.wonderdraft_map
deleted file mode 100644
index d9ff752..0000000
Binary files a/web/eittland-files/eittland-detailed.wonderdraft_map and /dev/null differ
diff --git a/web/eittland-files/eittlandic_sacrifice.xcf b/web/eittland-files/eittlandic_sacrifice.xcf
deleted file mode 100644
index a82037e..0000000
Binary files a/web/eittland-files/eittlandic_sacrifice.xcf and /dev/null differ
diff --git a/web/eittland.org b/web/eittland.org
index a8e6f52..de848fd 100644
--- a/web/eittland.org
+++ b/web/eittland.org
@@ -1,5 +1,5 @@
# -*- org-confirm-babel-evaluate: nil -*-
-#+TITLE: Une Grammaire de l’Eittlandais
+#+TITLE: Eittlandais
#+LANGUAGE: fr
#+HTML_HEAD:
#+HTML_HEAD:
@@ -195,7 +195,6 @@
similaire à celui du sud de l’Angleterre, grâce au Gulf Stream malgré sa
latitude élevée, similaire à celle de l’Écosse.
- #+ATTR_HTML: :width 100%
#+ATTR_LATEX: :float sideways
#+CAPTION: Biomes eittlandais
#+NAME: img:map-biomes
@@ -343,13 +342,11 @@
Kalmar reconnu Eittlainde comme pays indépendant, mais intégra tout de même
les colonies groënlandaises de l’Eittlande à l’Union.
- #+ATTR_HTML: :width 100%
#+ATTR_LATEX: :float sideways
#+CAPTION: États eittlandais
#+NAME: img:eittland-states
[[file:img/eittland/map-political.png][file:img/eittland/map-political.png]]
- #+ATTR_HTML: :width 100%
#+ATTR_LATEX: :float sideways
#+CAPTION: Provinces eittlandaises
#+NAME: img:eittland-provinces
@@ -459,7 +456,6 @@
l’Écosse et le nord de l’Angleterre.
#+NAME: img:map-world
- #+ATTR_HTML: :width 100%
#+CAPTION: Emplacement d’Eittlande dans l’Océan Atlantique.
[[file:img/eittland/map-world.jpg][file:img/eittland/map-world.jpg]]
@@ -467,7 +463,6 @@
principaux lieux et principales villes du pays avec la carte [[img:map-simple]]
#+NAME: img:map-simple
- #+ATTR_HTML: :width 100%
#+CAPTION: Carte simplifiée d’Eittlande
[[file:img/eittland/map-simple.jpg][file:img/eittland/map-simple.jpg]]
@@ -476,7 +471,6 @@
#+NAME: img:map-typo
#+ATTR_LATEX: :float sideways
- #+ATTR_HTML: :width 100%
#+CAPTION: Topologie d’Eittlande
[[file:img/eittland/map-hq.jpg][file:img/eittland/map-hq.jpg]]
@@ -651,7 +645,6 @@
#+ATTR_LATEX: :float sideways
#+CAPTION: Liste des rois Eittlandais de 915 à 1392
| <4> | <4> | <4> | <4> | <4> | <4> | <4> | <4> | <4> | <4> |
- | | | | | | | | | | |
| roi | naissance | mort | âge | règne | co-roi | naissance | mort | âge | règne |
|-------------------------------+-----------+------+-----+-----------+---------------------------------+-----------+------+-----+-----------|
| Ásmundor I, Ingólfrson | 876 | 932 | 56 | 915-935 | - | | | | |
@@ -977,14 +970,14 @@
(conlanging/tree-to-dot eittlandic-vowels)
#+END_SRC
- #+BEGIN_SRC dot :file img/eittland/vowel-feature-tree.png :var input=vow-dot :exports results
+ #+BEGIN_SRC dot :file img/eittland/vowel-feature-tree.png :var input=vow-dot :exports results :cache yes
$input
#+END_SRC
#+NAME: arbre:vowels
- #+ATTR_HTML: :alt Arbre des voyelles de l’Eittlandais :width 100%
+ #+ATTR_HTML: :alt Arbre des voyelles de l’Eittlandais :class gentree
#+ATTR_LATEX: :float sideways
#+CAPTION: Arbre des caractéristiques distinctives des voyelles de l’Eittlandais
- #+RESULTS:
+ #+RESULTS[401d3c4bfc06b5ba8a491d6cad9f4d624edc4d9f]:
[[file:img/eittland/vowel-feature-tree.png]]
*** Diphtongues
@@ -1213,7 +1206,7 @@
$input
#+END_SRC
#+NAME: arbre:cons
- #+ATTR_HTML: :alt Arbre des consonnes de l’Eittlandais :width 100%
+ #+ATTR_HTML: :alt Arbre des consonnes de l’Eittlandais :class gentree
#+ATTR_LATEX: :float sideways
#+CAPTION: Arbre des caractéristiques distinctives des consonnes de l’Eittlandais
#+RESULTS[c8ade388ef8459b89ca4c74696b0bd21fba46d34]:
diff --git a/web/en/img/nyqy/basic-syntax.png b/web/en/img/nyqy/basic-syntax.png
index 60dee93..4c63d7d 100644
Binary files a/web/en/img/nyqy/basic-syntax.png and b/web/en/img/nyqy/basic-syntax.png differ
diff --git a/web/en/img/nyqy/consonant-feature-tree.png b/web/en/img/nyqy/consonant-feature-tree.png
index c9efa08..c8a5219 100644
Binary files a/web/en/img/nyqy/consonant-feature-tree.png and b/web/en/img/nyqy/consonant-feature-tree.png differ
diff --git a/web/en/img/nyqy/vowel-feature-tree.png b/web/en/img/nyqy/vowel-feature-tree.png
index 4c0b5e0..54644a0 100644
Binary files a/web/en/img/nyqy/vowel-feature-tree.png and b/web/en/img/nyqy/vowel-feature-tree.png differ
diff --git a/web/en/nyqy.org b/web/en/nyqy.org
index 9465cce..10f40ba 100644
--- a/web/en/nyqy.org
+++ b/web/en/nyqy.org
@@ -1,5 +1,5 @@
# -*- org-confirm-babel-evaluate: nil -*-
-#+TITLE: Grammar of Ñyqy
+#+TITLE: Ñyqy
#+include: ../headers
#+language: en
#+HTML_HEAD_EXTRA:
@@ -440,7 +440,7 @@
$input
#+END_SRC
#+NAME: arbre:vowels
- #+ATTR_HTML: :alt Arbre des voyelles du Ñyqy :align center
+ #+ATTR_HTML: :alt Arbre des voyelles du Ñyqy :class gentree
#+ATTR_LATEX: :float sideways
#+CAPTION: Arbre des caractéristiques des voyelles du Ñyqy
#+RESULTS[e1f2ca12b3da614823629b888c369ed0ddf3e4a5]:
@@ -483,7 +483,7 @@
$input
#+END_SRC
#+NAME: arbre:cons
- #+ATTR_HTML: :alt Arbre des consonnes du Ñyqy :align center
+ #+ATTR_HTML: :alt Arbre des consonnes du Ñyqy :class gentree
#+ATTR_LATEX: :float sideways
#+CAPTION: Arbre des caractéristiques des consonnes du Ñyqy
#+RESULTS[ea6462370981c1a011d17d703545ec6e6f38f4de]:
diff --git a/web/headers b/web/headers
index 33d5c4d..4f1cc71 100644
--- a/web/headers
+++ b/web/headers
@@ -30,15 +30,11 @@
#+HTML_HEAD_EXTRA:
#+HTML_HEAD_EXTRA:
#+HTML_HEAD_EXTRA:
-#+HTML_HEAD_EXTRA:
-#+HTML_HEAD_EXTRA:
-#+HTML_HEAD_EXTRA:
+#+HTML_HEAD_EXTRA:
#+HTML_HEAD_EXTRA:
#+HTML_HEAD_EXTRA:
-#+HTML_HEAD_EXTRA:
-#+HTML_HEAD_EXTRA:
-#+HTML_HEAD_EXTRA:
-#+INFOJS_OPT: view:info home:https://langue.phundrak.com toc:t
+#+HTML_HEAD_EXTRA:
+#+HTML_HEAD_EXTRA:
# ### MACROS ###################################################################
#+MACRO: newline @@latex:\hspace{0pt}\\@@ @@html:
@@
diff --git a/web/hjelp.org b/web/hjelp.org
index 0ad3b1d..1447849 100644
--- a/web/hjelp.org
+++ b/web/hjelp.org
@@ -1,5 +1,5 @@
# -*- org-confirm-babel-evaluate: nil -*-
-#+TITLE: Une Grammaire du Hjelp
+#+TITLE: Hjelp
#+HTML_HEAD:
#+HTML_HEAD:
#+HTML_HEAD:
diff --git a/web/img/eittland/cons-feature-tree.png b/web/img/eittland/cons-feature-tree.png
index d3ccee9..f3b94c3 100644
Binary files a/web/img/eittland/cons-feature-tree.png and b/web/img/eittland/cons-feature-tree.png differ
diff --git a/web/img/eittland/map-pure-landmass.svg b/web/img/eittland/map-pure-landmass.svg
deleted file mode 100644
index cc6c86e..0000000
--- a/web/img/eittland/map-pure-landmass.svg
+++ /dev/null
@@ -1,848 +0,0 @@
-
\ No newline at end of file
diff --git a/web/img/eittland/religious-pop.png b/web/img/eittland/religious-pop.png
index c0019f2..90e31d2 100644
Binary files a/web/img/eittland/religious-pop.png and b/web/img/eittland/religious-pop.png differ
diff --git a/web/img/nyqy/basic-syntax.png b/web/img/nyqy/basic-syntax.png
index 0754929..025a9ff 100644
Binary files a/web/img/nyqy/basic-syntax.png and b/web/img/nyqy/basic-syntax.png differ
diff --git a/web/img/nyqy/consonant-feature-tree.png b/web/img/nyqy/consonant-feature-tree.png
index f97e163..951d68c 100644
Binary files a/web/img/nyqy/consonant-feature-tree.png and b/web/img/nyqy/consonant-feature-tree.png differ
diff --git a/web/img/nyqy/syntax-nominal-clauses.png b/web/img/nyqy/syntax-nominal-clauses.png
new file mode 100644
index 0000000..7e7c034
Binary files /dev/null and b/web/img/nyqy/syntax-nominal-clauses.png differ
diff --git a/web/img/nyqy/vowel-feature-tree.png b/web/img/nyqy/vowel-feature-tree.png
index 5cc6405..21f6b31 100644
Binary files a/web/img/nyqy/vowel-feature-tree.png and b/web/img/nyqy/vowel-feature-tree.png differ
diff --git a/web/img/taso/consonant-feature-tree.png b/web/img/taso/consonant-feature-tree.png
index 6be4311..76658c9 100644
Binary files a/web/img/taso/consonant-feature-tree.png and b/web/img/taso/consonant-feature-tree.png differ
diff --git a/web/img/taso/vowel-feature-tree.png b/web/img/taso/vowel-feature-tree.png
index bfd666e..95c86ef 100644
Binary files a/web/img/taso/vowel-feature-tree.png and b/web/img/taso/vowel-feature-tree.png differ
diff --git a/web/index.org b/web/index.org
index 0b68dc3..732667c 100644
--- a/web/index.org
+++ b/web/index.org
@@ -1,6 +1,5 @@
# -*- org-confirm-babel-evaluate: nil -*-
#+TITLE: Langues construites de P’undrak
-#+INFOJS_OPT: view:showall toc:1
#+HTML_HEAD:
#+HTML_HEAD:
#+HTML_HEAD:
diff --git a/web/matter.org b/web/matter.org
index 9f4ed3d..61c471c 100644
--- a/web/matter.org
+++ b/web/matter.org
@@ -1,5 +1,5 @@
# -*- org-confirm-babel-evaluate: nil -*-
-#+TITLE: Une Grammaire du Mattér
+#+TITLE: Mattér
#+HTML_HEAD:
#+HTML_HEAD:
#+HTML_HEAD:
diff --git a/web/nyqy.org b/web/nyqy.org
index 4994516..09cbfcf 100644
--- a/web/nyqy.org
+++ b/web/nyqy.org
@@ -1,13 +1,12 @@
# -*- org-confirm-babel-evaluate: nil -*-
-#+TITLE: Une Grammaire du Ñyqy
+#+TITLE: Ñyqy
#+SUBTITLE: Un détail de la langue construite prototype du Ñyqy, et une rapide description de son peuple et sa culture
#+HTML_HEAD_EXTRA:
#+HTML_HEAD_EXTRA:
#+HTML_HEAD_EXTRA:
-#+HTML_HEAD_EXTRA:
#+INCLUDE: headers
#+OPTIONS: auto-id:t
-#+MACRO: nyqy (eval (conlanging/nyqy-to-phonetics $1))
+#+MACRO: nyqy (eval (conlanging/nyqy-to-org $1))
#+LATEX_HEADER_EXTRA: \usepackage{enumitem}
#+STARTUP: content
@@ -152,6 +151,8 @@
- 2 :: deuxième personne
- 3 :: troisième personne
- ABS :: absolutif
+ - art.indef :: article indéfini
+ - art.def :: article défini
- DAT :: datif
- ERG :: ergatif
- F :: féminin
@@ -406,13 +407,13 @@
# "dependent-marking", or mixed?
# - Give some examples of each type of marking the language exhibits.
Le Ñyqy est une langue qui apparaît comme étant fortement analytique et
- isolationniste, reposant principalement sur sa syntaxe afin d’exprimer sa
- grammaire et très peu sur des règles morphologiques. La large majorité des
+ isolationniste, reposant quasi exclusivement sur sa syntaxe afin d’exprimer
+ sa grammaire et très peu sur des règles morphologiques. La large majorité des
mots sont monosyllabiques ou bisyllabiques, et les phrases s’articulent
souvent autour de morphèmes liés monosyllabiques que l’on peut interpréter
comme étant des particules grammaticales. Voici un exemple de phrase en Ñyqy
avec sa traduction et son détail grammatical :
- 1. {{{nyqy(ñe pom ñy)}}}
+ 1. {{{nyqy(ñe pom qy)}}}
maison GEN 1sg
@@ -427,6 +428,11 @@
1sg OPT boire
Je souhaite boire
+ 4. {{{nyqy(bó mygú cé pim i coq op zé qy zúmu op)}}}
+
+ art.def singe POSS.1sg pomme art.indef manger-PST 3sg 1sg voir-PST
+
+ J’ai vu le singe qui a mangé une pomme à moi
Dans l’exemple n°1, nous pouvons remarquer l’absence d’un verbe « être », ce
qui est un exemple des prédicats existentiels qui ne requièrent pas de verbe
@@ -436,11 +442,11 @@
montrant que le Ñyqy est une langue dont la tête de ses diverses
constructions grammaticales est finale et non initiale.
- L’exemple n°2 nous montre la méthode utilisée en Ñyqy afin d’employer le
- duel : il s’agit d’affixer le nombre « deux » à l’élément que nous souhaitons
- infléchir. Ainsi, {{{nyqy(bú qi)}}} peut être considéré comme le pronom personnel
- de la seconde personne du singulier infléchis afin de devenir le pronom
- personnel de la seconde personne du duel.
+ Le deuxième exemple nous montre la méthode utilisée en Ñyqy afin d’employer
+ le duel : il s’agit d’affixer le nombre « deux » à l’élément que nous
+ souhaitons infléchir. Ainsi, {{{nyqy(bú qi)}}} peut être considéré comme le pronom
+ personnel de la seconde personne du singulier infléchis afin de devenir le
+ pronom personnel de la seconde personne du duel.
Le troisième exemple présente un exemple d’ordre basique des constituants
d’une clause simple, où l’on peut voir une suite SV dans cette clause
@@ -450,6 +456,14 @@
[[#h-26aa65ba-2694-4c63-bf91-258dad3b0430]], il s’agit de la méthode principale
d’inflexion des verbes du Ñyqy.
+ Enfin, le quatrième exemple nous donne un aperçu de la syntaxe, avec un
+ positionnement différent des articles définis et indéfinis par rapport au
+ nom, ainsi qu’un exemple de référence dans une clause subordonnée à un
+ élément extérieur qu’elle définit, ici le pronom de la troisième personne
+ {{{nyqy(zé)}}} se référant à {{{nyqy(mygú)}}}. On voit également que la clause principale
+ a un ordre de ses constituants en OSV tandis que la subordonnée a un ordre de
+ ses relatives en OVS.
+
** Inventaire phonologique et translittération
:PROPERTIES:
:CUSTOM_ID: h-f9f0a2a0-98a6-49d5-b943-98daa6078d3a
@@ -529,11 +543,14 @@
(conlanging/tree-to-dot nyqy-vowels)
#+END_SRC
+ #+RESULTS[7197a00f9fd897443b1727910097ffe6aceb2ada]: vow-tree
+ : graph{graph[dpi=300];node[shape=plaintext];graph[bgcolor="transparent"];0[label="[vowel]"];1[label="[back]"];0 -- 1;11[label="[tense]"];1 -- 11;111[label="[high]"];11 -- 111;1111[label="/u/"];111 -- 1111;112[label="{high}"];11 -- 112;1121[label="/ɤ/"];112 -- 1121;12[label="{tense}"];1 -- 12;121[label="[high]"];12 -- 121;1211[label="/ʊ/"];121 -- 1211;122[label="{high}"];12 -- 122;1221[label="/ɔ/"];122 -- 1221;2[label="{back}"];0 -- 2;21[label="[tense]"];2 -- 21;211[label="[high]"];21 -- 211;2111[label="/y/"];211 -- 2111;212[label="{high}"];21 -- 212;2121[label="/ø/"];212 -- 2121;22[label="{tense}"];2 -- 22;221[label="[high]"];22 -- 221;2211[label="/ɪ/"];221 -- 2211;222[label="{high}"];22 -- 222;2221[label="/ɛ/"];222 -- 2221;}
+
#+BEGIN_SRC dot :file img/nyqy/vowel-feature-tree.png :var input=vow-tree :exports results :eval yes
$input
#+END_SRC
#+NAME: arbre:vowels
- #+ATTR_HTML: :alt Arbre des voyelles du Ñyqy :align center :width 100%
+ #+ATTR_HTML: :alt Arbre des voyelles du Ñyqy :class gentree
#+CAPTION: Arbre des caractéristiques des voyelles du Ñyqy
#+RESULTS:
[[file:img/nyqy/vowel-feature-tree.png]]
@@ -634,7 +651,7 @@
$input
#+END_SRC
#+NAME: arbre:cons
- #+ATTR_HTML: :alt Arbre des consonnes du Ñyqy :align center :width 100%
+ #+ATTR_HTML: :alt Arbre des consonnes du Ñyqy :class gentree
#+ATTR_LATEX: :float sideways
#+CAPTION: Arbre des caractéristiques des consonnes du Ñyqy
#+RESULTS:
@@ -954,51 +971,51 @@
:PROPERTIES:
:CUSTOM_ID: h-add29401-0e7d-45bb-93de-e53286dc4a2d
:END:
- Le Ñyqy est une langue dont sa tête de groupes grammaticaux est généralement
- en fin du-dit groupe. On peut voir avec l’arbre [[arbre:syntaxe:basique]] que la
- structure générale d’une phrase standard démarre avec des éléments divers
- liés à la clause principale s’il y en a, auxquels on se référera généralement
- en tant qu’éléments /obliques/. Ces éléments ne sont liés au verbe ni par une
- relation grammaticale ergative, ni dative, ni absolutive. Ensuite vient la
- phrase nominale ergative, précédant la phrase dative, elle-même précédant la
- phrase verbale, contenant une phrase nominale absolutive et le verbe de la
- phrase, le dernier élément d’une phrase {{{nyqy(ñyqy)}}}. Les sous chapitres
- suivants détailleront la composition de chacun de ces éléments.
+ # Le Ñyqy est une langue dont sa tête de groupes grammaticaux est généralement
+ # en fin du-dit groupe. On peut voir avec l’arbre [[arbre:syntaxe:basique]] que la
+ # structure générale d’une phrase standard démarre avec des éléments divers
+ # liés à la clause principale s’il y en a, auxquels on se référera généralement
+ # en tant qu’éléments /obliques/. Ces éléments ne sont liés au verbe ni par une
+ # relation grammaticale ergative, ni dative, ni absolutive. Ensuite vient la
+ # phrase nominale ergative, précédant la phrase dative, elle-même précédant la
+ # phrase verbale, contenant une phrase nominale absolutive et le verbe de la
+ # phrase, le dernier élément d’une phrase {{{nyqy(ñyqy)}}}. Les sous chapitres
+ # suivants détailleront la composition de chacun de ces éléments.
- #+NAME: basic-syntax-tree
- #+BEGIN_SRC emacs-lisp :noweb yes :exports none :eval yes :cache yes
- (setq-local nyqy-syntax-tree
- '("S"
- ("Obl")
- ("S'"
- ("NPerg"
- ("NP"))
- ("VP"
- ("NPdat"
- ("NP"))
- ("VP'"
- ("NPabs"
- ("NP"
- ("S")
- ("NP'"
- ("Adj")
- ("N"))))
- ("V'"
- ("Mood")
- ("Tense")
- ("V")
- ("Neg")))))))
- (conlanging/tree-to-dot nyqy-syntax-tree)
- #+END_SRC
+ # #+NAME: basic-syntax-tree
+ # #+BEGIN_SRC emacs-lisp :noweb yes :exports none :eval yes :cache yes
+ # (setq-local nyqy-syntax-tree
+ # '("S"
+ # ("Obl")
+ # ("S'"
+ # ("NPerg"
+ # ("NP"))
+ # ("VP"
+ # ("NPdat"
+ # ("NP"))
+ # ("VP'"
+ # ("NPabs"
+ # ("NP"
+ # ("S")
+ # ("NP'"
+ # ("Adj")
+ # ("N"))))
+ # ("V'"
+ # ("Mood")
+ # ("Tense")
+ # ("V")
+ # ("Neg")))))))
+ # (conlanging/tree-to-dot nyqy-syntax-tree)
+ # #+END_SRC
- #+BEGIN_SRC dot :file img/nyqy/basic-syntax.png :var input=basic-syntax-tree :exports results :eval yes
- $input
- #+END_SRC
- #+NAME: arbre:syntaxe:basique
- #+attr_html: :alt Arbre de syntaxe basique du Ñyqy :width 800px
- #+CAPTION: Arbre de syntaxe basique du Ñyqy
- #+RESULTS:
- [[file:img/nyqy/basic-syntax.png]]
+ # #+BEGIN_SRC dot :file img/nyqy/basic-syntax.png :var input=basic-syntax-tree :exports results :eval yes
+ # $input
+ # #+END_SRC
+ # #+NAME: arbre:syntaxe:basique
+ # #+attr_html: :alt Arbre de syntaxe basique du Ñyqy :class gentree
+ # #+CAPTION: Arbre de syntaxe basique du Ñyqy
+ # #+RESULTS:
+ # [[file:img/nyqy/basic-syntax.png]]
*** Ordre des constituants dans les clauses principales
:PROPERTIES:
@@ -1010,15 +1027,29 @@
# - Specific to the main clause constituent order: What is the pragmatically
# neutral order of constituents (A/S, P, and V) in basic clauses of the
# language?
- En Ñyqy, l’ordre des éléments principaux de la phrase typique suit un ordre
- SV pour les phrases transitives et APV pour les phrases intransitives. Il
- est toutefois à noter que l’agent est nécessairement précédé par un élément
- datif. Il est cependant possible lorsqu’aucun élément datif n’est à
- mentionner d’utiliser le terme {{{nyqy(bóq)}}} signifiant « rien, aucun ».
+ # En Ñyqy, l’ordre des éléments principaux de la phrase typique suit un ordre
+ # SV pour les phrases transitives et APV pour les phrases intransitives. Il
+ # est toutefois à noter que l’agent est nécessairement précédé par un élément
+ # datif. Il est cependant possible lorsqu’aucun élément datif n’est à
+ # mentionner d’utiliser le terme {{{nyqy(bóq)}}} signifiant « rien, aucun ».
- Il est également à noter que selon les recherches actuelles, rien ne nous
- laisse à penser qu’un autre ordre de ces constituants était possible en Ñyqy
- mis à par l’ajout d’autres éléments obliques en début de phrase.
+ # Il est également à noter que selon les recherches actuelles, rien ne nous
+ # laisse à penser qu’un autre ordre de ces constituants était possible en Ñyqy
+ # mis à par l’ajout d’autres éléments obliques en début de phrase.
+ Le Ñyqy est une langue particulière quant il s’agit de l’ordre de ses
+ éléments principaux dans ses phrases et clauses principales. Tout d’abord,
+ il est bon de noter que le Ñyqy est une langue qui est à 100% ergative.
+ Ainsi, cette langue considère les expérienceurs de verbes intransitifs et
+ les patients de verbes transitifs comme objets, tandis que les agents de
+ verbes transitifs sont considérés comme sujets. En connaissant cela, on peut
+ donc dire que l’ordre typique d’une clause principale Ñyqy est donc OSV.
+
+ Il s’agit d’un ordre de constituants qui est très rare dans les langues
+ naturelles, ce qui explique pourquoi chacune des langues descendant du Ñyqy
+ ne suivent pas cet ordre. La majorité a évolué en SOV, et une minorité des
+ autres langues a quant à elle évolué en OVS. Il est également intéressant de
+ marquer qu’au même moment, chacune a évolué de manière à ce que sa syntaxe
+ soit définie par des règles suivant le couple Nominatif-Accusatif.
*** Ordre des constituants dans les clauses verbales
:PROPERTIES:
@@ -1033,6 +1064,160 @@
:CUSTOM_ID: h-130f774a-bc58-46ca-a172-c413c8236366
:END:
# - Describe the order(s) of elements in the noun phrase.
+ Dans un groupe nominal, on retrouve en son centre le nom défini par
+ plusieurs éléments pouvant le caractériser, tels que des adjectifs, des
+ phrases relatives, des démonstratifs, des numéraux, des possessifs ou des
+ éléments génitifs. En résumé, l’ordre des éléments est le suivant :
+
+ #+begin_center
+ Gen-Adj-Dem-Num_{12}-Poss-N-Num_{6}-Adj-Rel
+ #+end_center
+
+ Afin de mieux visualiser l’arbre syntaxique des groupes nominaux en Ñyqy, on
+ peut se référer à la figure [[nom-clause-syntax-tree]]. On peut constater que le
+ Ñyqy est une langue qui est donc fortement ascendante (/head-final/), la
+ majorité des constituants d’une clause nominale venant après le nom.
+
+ #+NAME: nom-syntax-tree
+ #+BEGIN_SRC emacs-lisp :exports none :eval yes :cache yes
+ (setq-local nominal-group-syntax-tree
+ '("N'"
+ ("N'"
+ ("GEN")
+ ("N'"
+ ("Adj")
+ ("N'"
+ ("Dem")
+ ("N'"
+ ("Num₁₂")
+ ("N'"
+ ("Poss")
+ ("N"))
+ ("Num₆")))
+ ("Adj")))
+ ("Rel")))
+ (conlanging/tree-to-dot nominal-group-syntax-tree)
+ #+END_SRC
+
+ #+RESULTS[b65d47c0e3188121f8bcbde11627477b0a6b2904]: nom-syntax-tree
+ : graph{graph[dpi=300];node[shape=plaintext];graph[bgcolor="transparent"];0[label="N'"];1[label="N'"];0 -- 1;11[label="GEN"];1 -- 11;12[label="N'"];1 -- 12;121[label="Adj"];12 -- 121;122[label="N'"];12 -- 122;1221[label="Dem"];122 -- 1221;1222[label="N'"];122 -- 1222;12221[label="Num₁₂"];1222 -- 12221;12222[label="N'"];1222 -- 12222;122221[label="Poss"];12222 -- 122221;122222[label="N"];12222 -- 122222;12223[label="Num₆"];1222 -- 12223;123[label="Adj"];12 -- 123;2[label="Rel"];0 -- 2;}
+
+ #+BEGIN_SRC dot :file img/nyqy/syntax-nominal-clauses.png :var input=nom-syntax-tree :exports results :eval yes :cache yes :class gentree
+ $input
+ #+END_SRC
+ #+NAME: nom-clause-syntax-tree
+ #+ATTR_HTML: :alt Arbre syntaxique des clauses nominales du Ñyqy :class gentree
+ #+ATTR_LATEX: :height 12cm
+ #+CAPTION: Arbre syntaxique des clauses nominales du Ñyqy
+ #+RESULTS[901e0acb85c38044b47c5a3bacee9aaf7df72251]:
+ [[file:img/nyqy/syntax-nominal-clauses.png]]
+
+**** Possessifs
+ :PROPERTIES:
+ :CUSTOM_ID: h-506f68a1-a9de-4d1c-a674-075f130af6a8
+ :END:
+ Concernant les possessifs, ceux-ci se situent directement avant le nom afin
+ de marquer la possession de l’élément par une personne ou une autre entité.
+ Cela dépend du possessif employé. Par exemple « mon chat » se traduit par
+ {{{nyqy(cé oz)}}}.
+ | | |
+ | cé | oz |
+ | POSS.1sg | chat |
+
+**** Numéraux
+ :PROPERTIES:
+ :CUSTOM_ID: h-26b82cb5-1316-46cb-b9c5-279bbded3cc5
+ :END:
+ Pour ce qui est des numéraux, la règle générale est que les unités suivent
+ le nom, tandis que les sixaines le précèdent. Par exemple, « mes vingt
+ chats » se traduit par {{{nyqy(né ñy cé oz qi)}}}.
+ | | | | |
+ | né ñy | cé | oz | qi |
+ | 3×6 | POSS.1sg | chat | 2 |
+
+ # TODO autres types de numéraux
+
+ La position des unités impliquent donc que l’article indéfini {{{nyqy(i),}}}
+ dérivé du chiffre « un » {{{nyqy(mi)}}}, suit immédiatement le nom. Par exemple,
+ « un chat » se traduit par {{{nyqy(oz i)}}}.
+ | | |
+ | oz | i |
+ | chat | art.indef |
+
+**** Démonstratifs
+ :PROPERTIES:
+ :CUSTOM_ID: h-7e9ab73d-0396-440a-aa14-7a5ba680da6f
+ :END:
+ Concernant le démonstratif, ceux-ci se situe précédant les sixaines en Ñyqy,
+ et donc précédant le nom. Ainsi, si l’on souhaite traduire « ces vingt chats
+ à moi » (le génitif relative est ici pour contrecarrer l’impossibilité en
+ français d’utiliser un démostratif et un possessif en même temps), on a donc
+ {{{nyqy(bóc né ñy cé oz qi)}}}.
+ | | | | | |
+ | bóc | né ñy | cé | oz | qi |
+ | DEM.prox | 3×6 | POSS.1sg | chat | 2 |
+
+ La position du démonstratif dans la clause nominale implique également une
+ position identique pour un article défini en Ñyqy. Ainsi, si l’on souhaite
+ traduire « les vingt chats à moi » (à nouveau, le génitif est utilisé ici dû
+ aux limitations du Français), on obtient {{{nyqy(bó né ñy cé oz qi)}}}.
+ | | | | | |
+ | bó | né ñy | cé | oz | qi |
+ | art.def | 3×6 | POSS.1sg | chat | 2 |
+
+**** Adjectifs
+ :PROPERTIES:
+ :CUSTOM_ID: h-f0c023d2-ead0-412b-8ed3-d02507af0256
+ :END:
+ Concernant les adjectifs, ceux-ci se divisent en plusieurs classes :
+ - Adjectifs d’opinion
+ - Adjectifs de taille
+ - Adjectifs de quantité
+ - Adjectifs d’âge
+ - Adjectifs d’origine
+ - Adjectifs d’objectif
+ - Adjectifs de matériaux
+ - Adjectifs de forme
+ - Adjectifs de couleur
+ En Ñyqy, ils apparaissent dans l’ordre ci-dessus et sont classés par
+ objectivité, et tous viennent après le nom à l’exception des adjectifs
+ d’opinion. Ainsi, les adjectifs les plus subjectifs arrivent en premier, et
+ les adjectifs les plus objectifs arrivent en dernier.
+
+ Il est à noter que :
+ - les adjectifs de forme et de matériaux ne peuvent se faire que via
+ l’utilisation d’un génitif de type « NOM GEN » (par exemple « carré GEN
+ table » pour dire « table carrée »)
+ - que les adjectifs d’origine ne se forment qu’avec une particule locative
+ - que les adjectifs d’objectif ne se forment qu’avec une particule
+ instrumentative.
+
+ Ainsi, si l’on souhaite traduire « un gros vieux chat noir et beau », on
+ obtient {{{nyqy(syg oz goñ noc zuj)}}}.
+ | syg | oz | i | goñ | noc | zuj |
+ | beau | chat | art.indef | gros | vieux | noir |
+
+**** Génitif
+ :PROPERTIES:
+ :CUSTOM_ID: h-f5a28bb8-103e-4f96-979c-89df0286ae36
+ :END:
+ Ensuite vient le génitif qui se situe avant les adjectifs d’opinion. On y
+ trouvera donc exclusivement la particule grammaticale {{{nyqy(pom)}}} qui sert à
+ marquer le génitif, précédée par une clause nominale qui définira la clause
+ nominale actuelle. Par exemple, « le chat de mon voisin » peut se traduire
+ par {{{nyqy(cé wóseq pom bó oz)}}}.
+ | cé | wóseq | pom | bó | oz |
+ | POSS.1sg | voisin | GEN | art.def | chat |
+
+**** Clauses relatives
+ :PROPERTIES:
+ :CUSTOM_ID: h-00f9960f-b515-4fb0-be59-b53573607b8e
+ :END:
+ Enfin, les clauses relatives arrivent à la fin des clauses nominales. Ainsi,
+ si l’on souhaite dire « mon chat qui mange est beau », on obtient la traduction
+ {{{nyqy(cé oz coq syg)}}}.
+ | cé | oz | coq | syg |
+ | POSS.1sg | chat | manger | beau |
*** Phrases adpositionelles
:PROPERTIES:
@@ -1995,11 +2180,6 @@
Ce qui donne donc 1052.
-** Références
- :PROPERTIES:
- :CUSTOM_ID: h-39866d3e-b4f9-4885-8581-53f7342ddf0c
- :END:
-
* Dictionnaire
:PROPERTIES:
:CUSTOM_ID: h-33a20978-20d6-4a26-8286-016d6c64b654
@@ -2012,10 +2192,10 @@
- {{{nyqy(beñ)}}} ::
1. (n) dents
2. (v) mordre, croquer
- - {{{nyqy(bóbó)}}} ::
- 1. (n) cœur
- 2. (adj) ému (le cœur qui bat à cause d’une émotion)
- 3. (adj) essouflé
+ - {{{nyqy(bó)}}} ::
+ 1. (art def) le, la, les, article défini. Voir /bóc/
+ - {{{nyqy(bóc)}}} ::
+ 1. (n) ceci, ça, démonstratif de proximité
- {{{nyqy(bú)}}} ::
1. (pron) deuxième personne
@@ -2023,6 +2203,8 @@
:PROPERTIES:
:CUSTOM_ID: h-fb76cf3b-d664-4ab6-9531-320d0b8f0807
:END:
+ - {{{nyqy(cé)}}} ::
+ 1. (poss) mon, ma, mes, possesseur de la première personne
- {{{nyqy(co)}}} ::
1. (gp.SUBJ.PST) marqueur pour verbes du subjonctif accomplis
2. (nbr) cinq
@@ -2103,6 +2285,8 @@
:PROPERTIES:
:CUSTOM_ID: h-3f1fd2e3-6863-4eef-89a8-7aab21873f87
:END:
+ - {{{nyqy(i)}}} ::
+ 1. (art indef) un, une, des, article defini. Voir /mi/
- {{{nyqy(icm)}}} ::
1. (n) bras
2. (n) branche (arbre)
@@ -2130,6 +2314,8 @@
:PROPERTIES:
:CUSTOM_ID: h-eb766e30-8f82-4df0-b912-978542459362
:END:
+ - {{{nyqy(még)}}} ::
+ 1. (adv) beaucoup, très
- {{{nyqy(meém)}}} ::
1. (n) grand-mère (affectueux)
- {{{nyqy(meq)}}} ::
@@ -2154,6 +2340,8 @@
1. (n) maison (bâtiment), habitation
- {{{nyqy(muz)}}} ::
1. (n) rouge, pourpre, fruit
+ - {{{nyqy(mygú)}}} ::
+ 1. (n) singe
** N
:PROPERTIES:
@@ -2161,6 +2349,9 @@
:END:
- {{{nyqy(né)}}} ::
1. (nbr) trois
+ - {{{nyqy(noc)}}} ::
+ 1. (n) vieillesse, grand âge
+ 2. (adj) vieux, âgé
- {{{nyqy(nó)}}} ::
1. (n) poitrine, seins (attribut féminin)
2. (adj) maternité
@@ -2174,6 +2365,8 @@
:END:
- {{{nyqy(ñe)}}} ::
1. (n) maison
+ - {{{nyqy(ñocm)}}} ::
+ 1. (n) personne, humain, quelqu’un
- {{{nyqy(ñójb)}}} ::
1. (n) oiseau
- {{{nyqy(ñuné)}}} ::
@@ -2302,6 +2495,9 @@
1. (n) souffle, voir /sujéq/ et /só/
2. (n) vent
3. (adj) fraîcheur, froid
+ - {{{nyqy(syg)}}} ::
+ 1. (n) beauté
+ 2. (adj) beau
** U
:PROPERTIES:
@@ -2332,6 +2528,10 @@
- {{{nyqy(wésyqun)}}} ::
1. (n) Shaman. Aspirant aux esprits, aux âmes, aux dieux. Voir aussi
/wésy/, /qun/
+ - {{{nyqy(wóseq)}}} ::
+ 1. (n) voisin
+ 2. (adj) proche
+ 3. (adj) voisin
- {{{nyqy(wó)}}} ::
1. (n) humain
2. (adj) d’apparence humaine
@@ -2389,6 +2589,85 @@
1. (n) chose, objet abstrait
- {{{nyqy(zuj)}}} ::
1. (n) nuit, noir, ombre
+ 2. (adj) noir, sombre
+ - {{{nyqy(zúmu)}}} ::
+ 1. (vt) voir
+
+* Notes :noexport:
+ :PROPERTIES:
+ :CUSTOM_ID: h-1905bd91-a4c5-4b60-acea-5ed10bc655af
+ :END:
+ À corriger :
+ - ñy = 6
+ - qy = 1sg
+
+** Ñyqy syntax
+ :PROPERTIES:
+ :CUSTOM_ID: h-cd39b6f7-85e0-4168-a89d-829fa1dec5c3
+ :END:
+ Prep ⊃ ((NDem ∨ NNum ∨ NPoss ⊃ NAdj) & (NAdj ⊃ NGen) & (NGen ⊃ NRel))
+ Posp ⊃ ((AdjN ∨ RelN ⊃ DemN & NumN & PossN) & (DemN ∨ NumN ∨ PossN ⊃ GenN))
+
+ Lang D of [[https://docs.google.com/spreadsheets/d/1ZJV1C8g-u8PbZIEHp8t7JT8SSyY7ZetEZ5oBJJn0g2U/edit#gid=0][this chart]], evolving to F.
+
+ Le Ñyqy est une langue ascendante (/head-final/ en anglais). Ordre des
+ éléments :
+ - NAdj
+
+ Opinion-N-Size-Quantity-Age-Origin-Purpose-Material-Shape-Color
+
+ Shape et Material => GEN, Origin => LOC, Purpose => INST
+
+ | ycoj | pim | még | goñ | ñy | cojmuj |
+ | bonne | pomme | très | grosse | nombreuse | rouge |
+ - NRel
+
+ pomme que je mange
+ - DemN
+ | bóc | oz |
+ | ce | chat |
+
+ - def.art N
+
+ /bó/ from /bóc/
+
+ la pomme :
+ | bó | pim |
+ | def.art | pomme |
+ - NumNNum
+ - Num_{12} N Num_{6}
+
+ Les unités suivent le groupe nominal tandis que les sixaines le précèdent.
+ Penser à 6x éléments + y.
+
+ 20 pommes (litt 3×6 pommes 2)
+ | né | ñy | pim | qi |
+ | 3 | 6 | pomme | 2 |
+ - N art.indef
+
+ /i/ from /mi/
+
+ une pomme :
+ | pim | i |
+ | pomme | indef.art |
+ - ordNum N
+
+ Les nombres ordinaux viennent intégralement avant le nom
+ - Declarative numbers: declNum Gen N
+
+ Pomme première :
+ | mi | pom | pim |
+ | 1 | GEN | pomme |
+ - PossN
+
+ Comme en français, /ma pomme/
+ - GenN
+
+ Comme le /’s/ en anglais, maison de moi :
+ | ñy | pom | ñe |
+ | 1sg | GEN | maison |
+
+ Gen-Adj-Dem-Num-Poss-N-Num-Adj-Rel
* Choses à faire [2/4] :noexport:
:PROPERTIES:
@@ -2471,6 +2750,12 @@
et sa phonétique soient sur une ligne différente de la définition, avec la
définition qui est indentée.
+** TODO Compléter la liste Swadesh [1/3]
+ :PROPERTIES:
+ :CUSTOM_ID: h-32a2f3e6-0d2d-4693-99d8-d912446ddedf
+ :END:
+ Compléter la liste du fichier [[file:swadesh.org::#h-a5b4a65c-68ab-4630-b054-da816d679cfd][Swadesh#Ñyqy]].
+
** TODO Simplifier les fonctions du layer ~conlanging~
:PROPERTIES:
:CUSTOM_ID: h-b6fca087-e439-4bdf-bd26-43803d424a40
@@ -2479,12 +2764,6 @@
serait temps de simplifier les fonctions et réduire le nombre d’entre elles
dans le layer ~conlanging~.
-** TODO Compléter la liste Swadesh [1/3]
- :PROPERTIES:
- :CUSTOM_ID: h-32a2f3e6-0d2d-4693-99d8-d912446ddedf
- :END:
- Compléter la liste du fichier [[file:swadesh.org::#h-a5b4a65c-68ab-4630-b054-da816d679cfd][Swadesh#Ñyqy]].
-
*** DONE dot tree
CLOSED: [2020-01-29 mer. 21:50]
:PROPERTIES:
diff --git a/web/sitemap.org b/web/sitemap.org
index 192fd79..8013695 100644
--- a/web/sitemap.org
+++ b/web/sitemap.org
@@ -1,10 +1,10 @@
#+TITLE: Sitemap for project langue-phundrak-com-org
- [[file:index.org][Langues construites de P’undrak]]
-- [[file:eittland.org][Une Grammaire de l’Eittlandais]]
-- [[file:hjelp.org][Une Grammaire du Hjelp]]
-- [[file:matter.org][Une Grammaire du Mattér]]
-- [[file:taso.org][Une Grammaire du Tãso]]
-- [[file:nyqy.org][Une Grammaire du Ñyqy]]
+- [[file:eittland.org][Eittlandais]]
+- [[file:hjelp.org][Hjelp]]
+- [[file:matter.org][Mattér]]
+- [[file:taso.org][Tãso]]
+- [[file:nyqy.org][Ñyqy]]
- en
- - [[file:en/nyqy.org][Grammar of Ñyqy]]
\ No newline at end of file
+ - [[file:en/nyqy.org][Ñyqy]]
diff --git a/web/style/style.scss b/web/style/style.scss
new file mode 100644
index 0000000..e4181ec
--- /dev/null
+++ b/web/style/style.scss
@@ -0,0 +1,591 @@
+@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic|Roboto+Slab:400,700|Inconsolata:400,700);
+@font-face {
+ font-family: "DoulosSIL";
+ font-display: swap;
+ src: url("/fonts/DoulosSIL-R.woff");
+}
+@font-face {
+ font-family: "Noto Sans Runes";
+ font-display: swap;
+ src: url("../fonts/NotoSansRunic-Regular.ttf");
+}
+@font-face {
+ font-family: "Helvetica Neue";
+ font-display: swap;
+ src: url("../fonts/HelveticaNeue.ttf");
+}
+
+/* Variables *****************************************************************/
+
+$switch-small-screen: "only screen and (max-width: 600px)";
+$switch-smaller-screen: "only screen and (max-width: 400px)";
+
+$navbar-height: 70px;
+$postamble-height: 55px;
+
+// Themes /////////////////////////////////////////////////////////////////////
+
+$dark: rgba( 52, 73, 94, 1);
+$black: rgba( 0, 0, 0, 1);
+$accent1: rgba( 93, 115, 126, 1);
+$accent2: rgba( 92, 172, 126, 1);
+$accent3: rgba(197, 193, 155, 1);
+$light: #eee;
+$grey1: #f8f8f8;
+$grey2: #dbe1e8;
+$grey3: #b2becd;
+$grey4: #6c7983;
+$grey5: #454e56;
+$grey6: #12181b;
+
+// Accent 1
+// Black
+$gradient-accent1-black-left: linear-gradient(to left, $black, $accent1, $accent1);
+$gradient-accent1-black-right: linear-gradient(to right, $black, $accent1, $accent1);
+// Dark
+$gradient-accent1-dark-left: linear-gradient(to left, $dark, $accent1);
+$gradient-accent1-dark-right: linear-gradient(to right, $dark, $accent1);
+// Light
+$gradient-accent1-light-left: linear-gradient(to left, $light, $accent1);
+$gradient-accent1-light-right: linear-gradient(to right, $light, $accent1);
+// Accent 2
+// Black
+$gradient-accent2-black-left: linear-gradient(to left, $black, $accent2, $accent2);
+$gradient-accent2-black-right: linear-gradient(to right, $black, $accent2, $accent2);
+// Dark
+$gradient-accent2-dark-left: linear-gradient(to left, $dark, $accent2);
+$gradient-accent2-dark-right: linear-gradient(to right, $dark, $accent2);
+// Light
+$gradient-accent2-light-left: linear-gradient(to left, $light, $accent2);
+$gradient-accent2-light-right: linear-gradient(to right, $light, $accent2);
+// Accent 3
+// Black
+$gradient-accent3-black-left: linear-gradient(to left, $black, $accent3, $accent3);
+$gradient-accent3-black-right: linear-gradient(to right, $black, $accent3, $accent3);
+// Dark
+$gradient-accent3-dark-left: linear-gradient(to left, $dark, $accent3);
+$gradient-accent3-dark-right: linear-gradient(to right, $dark, $accent3);
+// Light
+$gradient-accent3-light-left: linear-gradient(to left, $light, $accent3);
+$gradient-accent3-light-right: linear-gradient(to right, $light, $accent3);
+
+.light {
+ $bg-nav: $gradient-accent3-light-right;
+ $border-color: $accent1;
+
+ color: $dark;
+ background: $light;
+
+ transition: background 500ms ease-in-out, color 1s ease-in-out;
+
+ pre {
+ box-shadow: 3px 3px $dark;
+ border-color: $light;
+ }
+
+ pre.src {
+ &::before {
+ background-color: $light;
+ color: $dark;
+ }
+ }
+
+ .navbar, header {
+ background: $bg-nav;
+ }
+
+ .status {
+ background: $gradient-accent3-light-left;
+ color: $dark;
+ }
+
+ .tooltip {
+ border-bottom: 1px dotted $accent3;
+
+ .tooltiptext {
+ background-color: $accent3;
+ color: $dark;
+
+ &::after {
+ border-color: $accent3 transparent transparent transparent;
+ }
+ }
+ }
+
+ .dropdown {
+ background: $accent3;
+ color: $dark;
+ }
+
+ #content {
+ a {
+ box-shadow: inset 0 -3px 0 $accent3;
+ transition: box-shadow 300ms ease-in-out;
+
+ &:hover {
+ box-shadow: inset 0 -23px 0 $accent3;
+ transition: box-shadow 300ms ease-in-out;
+ }
+ }
+ }
+
+ table, th, td {
+ border: 1px solid $dark;
+ }
+
+ th {
+ background: darken($light, 5%);
+ }
+
+ .gentree {
+ filter: invert(0%);
+ transition: filter 1s ease-in-out;
+ }
+}
+
+.dark, .black {
+ $bg-nav: $gradient-accent2-dark-right;
+ $border-color: $dark;
+
+ color: $light;
+ background: $dark;
+
+ transition: background 500ms ease-in-out, color 1s ease-in-out;
+
+ pre {
+ box-shadow: 3px 3px $dark;
+ border: none;
+ }
+
+ pre.src {
+ &::before {
+ background-color: $dark;
+ color: $light;
+ }
+ }
+
+ .navbar, header {
+ background: $bg-nav;
+ }
+
+ .status {
+ background: $gradient-accent2-dark-left;
+ color: $light;
+ }
+
+ .tooltip {
+ border-bottom: 1px dotted $accent1;
+
+ .tooltiptext {
+ background-color: $accent1;
+ color: $light;
+
+ &::after {
+ border-color: $accent1 transparent transparent transparent;
+ }
+ }
+ }
+
+ .dropdown {
+ background: $accent3;
+ color: $dark;
+ }
+
+ #content {
+ a {
+ box-shadow: inset 0 -3px 0 $accent2;
+ transition: box-shadow 300ms ease-in-out;
+
+ &:hover {
+ box-shadow: inset 0 -23px 0 $accent2;
+ transition: box-shadow 300ms ease-in-out;
+ }
+ }
+ }
+
+ table, th, td {
+ border: 1px solid $accent1;
+ }
+
+ th {
+ background: darken($dark, 2.5%);
+ }
+
+ .gentree {
+ filter: invert(100%);
+ transition: filter 1s ease-in-out;
+ }
+}
+
+.black {
+ $bg-nav: $gradient-accent1-black-right;
+
+ background: $black;
+
+ pre {
+ box-shadow: 3px 3px $light;
+ border: none;
+ }
+
+ pre.src {
+ &::before {
+ background-color: $black;
+ color: $light;
+ }
+ }
+
+ .navbar, header {
+ background: $bg-nav;
+ }
+
+ .status {
+ background: $gradient-accent1-black-left;
+ }
+
+ .dropdown {
+ background: $dark;
+ color: $light;
+ }
+
+ #content {
+ a {
+ box-shadow: inset 0 -3px 0 $accent1;
+ transition: box-shadow 300ms ease-in-out;
+
+ &:hover {
+ box-shadow: inset 0 -23px 0 $accent1;
+ transition: box-shadow 300ms ease-in-out;
+ }
+ }
+ }
+
+ table, th, td {
+ border: 1px solid $light;
+ }
+
+ th {
+ background: lighten($black, 15%);
+ }
+}
+
+/* Style *********************************************************************/
+
+* {
+ outline: none;
+}
+
+body {
+ margin: 0;
+ padding: 0;
+ font-family: "Noto Sans Runes", "DoulosSIL", "Lato", "proxima-nova", "Helvetica Neue", Arial, sans-serif;
+ font-size: 1.2em;
+
+ transition: background 500ms ease-in-out, color 1s ease-in-out;
+
+ header, .navbar {
+ transition: background 500ms ease-in-out, color 1s ease-in-out;
+ ul {
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+ }
+ }
+}
+
+a {
+ color: currentColor;
+ text-decoration: none;
+}
+
+.navbar {
+ position: fixed;
+ top: 0;
+ z-index: 4;
+ height: $navbar-height;
+ width: 100%;
+}
+
+.navbar-nav {
+ display: flex;
+ align-items: center;
+ justify-content: space-evenly;
+ height: 100%;
+}
+
+header {
+ padding: 1em;
+ margin-top: $navbar-height;
+ margin-bottom: 1em;
+ padding-bottom: 6em;
+ text-align: center;
+ clip-path: polygon(50% 0%, 100% 0, 100% 80%, 50% 100%, 0 80%, 0 0);
+ transition: background 500ms ease-in-out;
+
+ .title {
+ font-size: 5em;
+ margin: 0;
+ @media #{$switch-small-screen} {
+ font-size: 3em;
+ }
+ }
+
+ .subtitle {
+ font-size: 1.2em;
+ }
+}
+
+.dropdown {
+ position: absolute;
+ opacity: 0;
+ z-index: -1;
+
+ border-bottom-right-radius: 8px;
+ border-bottom-left-radius: 8px;
+
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+ min-height: 3rem;
+ margin-top: 1rem;
+ padding: 0.5rem;
+ top: 0;
+
+ box-shadow: rgba(2, 8, 20, 0.1) 0px 0.175em 0.5em;
+ transform: translateX(-40%);
+
+ transition: opacity 500ms ease-in-out, top 500ms ease-in-out;
+}
+
+.has-dropdown {
+ &:focus-within {
+ .dropdown {
+ opacity: 1;
+ top: $navbar-height;
+ z-index: 5;
+ pointer-events: auto;
+ }
+
+ #table-of-contents {
+ top: $navbar-height / 1.3;
+ opacity: 1;
+ z-index: 5;
+ height: 500%;
+ pointer-events: auto;
+ }
+ }
+}
+
+#theme-dropdown {
+ width: 250px;
+ flex-direction: row;
+ transform: translateX(-75%);
+}
+
+#drop-page {
+ flex-direction: column;
+ transform: translateX(-40%);
+ li {
+ padding: 5px;
+ }
+}
+
+#drop-share {
+ li {
+ padding: 10px;
+ }
+}
+
+.dropdown-item {
+ cursor: pointer;
+
+ a {
+ width: 100%;
+ height: 100%;
+ size: 0.7rem;
+ padding-left: 10px;
+ padding-right: 10px;
+ font-weight: bold;
+ }
+}
+
+#table-of-contents {
+ flex-direction: column;
+ padding: 20px;
+ float: right;
+ overflow-y: auto;
+ height: 0%;
+ width: 75%;
+ min-width: 350px;
+ transform: translateX(-45%);
+ font-size: 0.9em;
+ top: -40px;
+
+ transition: height 500ms ease-in-out, opacity 500ms ease-in-out, top 500ms ease-in-out;
+
+ li {
+ padding: 5px 0;
+ }
+
+ h2 {
+ font-size: 1.2em;
+ }
+
+ #text-table-of-contents {
+ height: 100%;
+ }
+}
+
+#content {
+ padding: 50px;
+ padding-top: 0;
+ max-width: 1000px;
+ margin: 0 auto;
+ text-align: justify;
+
+ a {
+ font-style: italic;
+ }
+}
+
+#postamble {
+ display: grid;
+ grid-template-areas: 'author email date';
+
+ @media #{$switch-small-screen} {
+ grid-template-areas: 'author date' 'email email';
+ }
+
+ @media #{$switch-smaller-screen} {
+ grid-template-areas: 'author' 'date' 'email';
+ }
+
+ font-size: 0.8em;
+ align-content: space-evenly;
+ text-align: center;
+
+ p {
+ margin: 10px 0;
+ }
+
+ .author {
+ grid-area: author;
+ }
+
+ .email {
+ grid-area: email;
+ }
+
+ .date {
+ grid-area: date;
+ }
+}
+
+h1, h2, h3, h4, h5, h6 {
+ text-align: center;
+}
+
+h2 {
+ font-size: 2.5em;
+ @media #{$switch-small-screen} {
+ font-size: 1.75em;
+ }
+}
+
+h3 {
+ font-size: 2em;
+
+ @media #{$switch-small-screen} {
+ font-size: 1.5em;
+ }
+}
+
+h4 {
+ font-size: 1.5em;
+
+ @media #{$switch-small-screen} {
+ font-size: 1.3em;
+ }
+}
+
+h5 {
+ font-size: 1.25em;
+
+ @media #{$switch-small-screen} {
+ font-size: 1.2em;
+ }
+}
+
+.tooltip {
+ position: relative;
+ display: inline-block;
+
+ .tooltiptext {
+ visibility: hidden;
+
+ margin-left: -60px; /* Half the width */
+ bottom: 100%;
+ left: 10%;
+ padding: 5px 10px;
+ text-align: center;
+ border-radius: 6px;
+
+ position: absolute;
+ z-index: 5;
+
+
+ &::after {
+ content: " ";
+ position: absolute;
+ top: 100%; /* At the bottom of the tooltip */
+ left: 50%;
+ margin-left: -5px;
+ border-width: 5px;
+ border-style: solid;
+ }
+ }
+
+ &:hover {
+ .tooltiptext {
+ visibility: visible;
+ }
+ }
+}
+
+blockquote {
+ padding: 0;
+ margin: 20px;
+ font-style: italic;
+}
+
+.largetable {
+ overflow-y: auto;
+ margin-top:20px;
+ margin-bottom: 20px;
+}
+
+table {
+ margin: 0 auto;
+}
+
+th, td {
+ white-space: nowrap;
+ padding: 10px;
+}
+
+img {
+ max-height: 600px;
+ max-width: 100%;
+}
+
+.figure {
+ padding: 0;
+}
+
+ul {
+ padding-inline-start: 20px;
+}
+
+pre.src {
+ overflow-y: auto;
+
+}
diff --git a/web/taso.org b/web/taso.org
index b3e7a58..ae257a8 100644
--- a/web/taso.org
+++ b/web/taso.org
@@ -1,5 +1,5 @@
# -*- org-confirm-babel-evaluate: nil -*-
-#+TITLE: Une Grammaire du Tãso
+#+TITLE: Tãso
#+HTML_HEAD:
#+HTML_HEAD:
#+HTML_HEAD:
@@ -251,7 +251,7 @@
$input
#+END_SRC
#+NAME: arbre:vow
- #+ATTR_HTML: :alt Arbre des voyelles du Tãso :align center :width 100%
+ #+ATTR_HTML: :alt Arbre des voyelles du Tãso :class gentree
#+ATTR_LATEX: :float sideways
#+CAPTION: Arbre des caractéristiques des voyelles du Tãso
#+RESULTS[eff961e714f2313ac2e974637800b18d5c11c928]:
@@ -357,7 +357,7 @@
$input
#+END_SRC
#+NAME: arbre:cons
- #+ATTR_HTML: :alt Arbre des consonnes du Tãso :align center :width 100%
+ #+ATTR_HTML: :alt Arbre des consonnes du Tãso :class gentree
#+ATTR_LATEX: :float sideways
#+CAPTION: Arbre des caractéristiques des consonnes du Tãso
#+RESULTS[9bf7d97ca85780e74e9fbb5fc69cbc9800439890]: