commit abe0934abf3d94a216f7ea0be3a493cee606cfbf
parent eb1ecd963a268a189f6206bb8e0f382ca823d7a8
Author: lou woell <lou@repetitions.de>
Date:   Sun,  6 Sep 2026 08:58:05 +0200

move meta data from code into data directory

Diffstat:
Mdata/de_auerbach/types.json | 45+++++++++++++++++++++++++--------------------
Mdata/de_stern/types.json | 45+++++++++++++++++++++++++--------------------
Mdata/en_elwes/types.json | 45+++++++++++++++++++++++++--------------------
Mdata/fr_appuhn/types.json | 45+++++++++++++++++++++++++--------------------
Mdata/fr_saisset/types.json | 45+++++++++++++++++++++++++--------------------
Mdata/la_spinoza/types.json | 44++++++++++++++++++++++++--------------------
Mlisp/ethics.lisp | 91++++++++++++++++++++++++++++++++++++-------------------------------------------
Mreadme.md | 55++++++++++++++++++++++++++++++++-----------------------
8 files changed, 222 insertions(+), 193 deletions(-)

diff --git a/data/de_auerbach/types.json b/data/de_auerbach/types.json @@ -1,22 +1,27 @@ { - "ethica": "Ethik", - "pars": "Teil", - "definitiones": "Definitionen", - "definitio": "Definition", - "explicatio": "Erläuterung", - "axiomata": "Axiome", - "axioma": "Axiom", - "propositio": "Lehrsatz", - "demonstratio": "Beweis", - "corollarium": "Folgesatz", - "aliter": "Anderer Beweis", - "scholium": "Anmerkung", - "appendix": "Anhang", - "praefatio": "Vorrede", - "lemma": "Lehnsatz", - "postulatum": "Postulat", - "postulata": "Postulate", - "affectuum definitiones": "Definitionen der Affekte", - "affectuum generalis definitio": "Allgemeine Definition der Affekte", - "caput": "§" + "name": "German (Auerbach)", + "language": "de", + "translator": "Auerbach", + "types":{ + "ethica": "Ethik", + "pars": "Teil", + "definitiones": "Definitionen", + "definitio": "Definition", + "explicatio": "Erläuterung", + "axiomata": "Axiome", + "axioma": "Axiom", + "propositio": "Lehrsatz", + "demonstratio": "Beweis", + "corollarium": "Folgesatz", + "aliter": "Anderer Beweis", + "scholium": "Anmerkung", + "appendix": "Anhang", + "praefatio": "Vorrede", + "lemma": "Lehnsatz", + "postulatum": "Postulat", + "postulata": "Postulate", + "affectuum definitiones": "Definitionen der Affekte", + "affectuum generalis definitio": "Allgemeine Definition der Affekte", + "caput": "§" + } } diff --git a/data/de_stern/types.json b/data/de_stern/types.json @@ -1,22 +1,27 @@ { - "ethica": "Ethik", - "pars": "Teil", - "definitiones": "Definitionen", - "definitio": "Definition", - "explicatio": "Erläuterung", - "axiomata": "Axiome", - "axioma": "Axiom", - "propositio": "Lehrsatz", - "demonstratio": "Beweis", - "corollarium": "Zusatz", - "aliter": "Anderer Beweis", - "scholium": "Anmerkung", - "appendix": "Anhang", - "praefatio": "Vorwort", - "lemma": "Hilfssatz", - "postulatum": "Postulat", - "postulata": "Postulate", - "affectuum definitiones": "Definitionen der Affekte", - "affectuum generalis definitio": "Allgemeine Definition der Affekte", - "caput": "§" + "name": "German (Stern)", + "language": "de", + "translator": "Jakob Stern", + "types": { + "ethica": "Ethik", + "pars": "Teil", + "definitiones": "Definitionen", + "definitio": "Definition", + "explicatio": "Erläuterung", + "axiomata": "Axiome", + "axioma": "Axiom", + "propositio": "Lehrsatz", + "demonstratio": "Beweis", + "corollarium": "Zusatz", + "aliter": "Anderer Beweis", + "scholium": "Anmerkung", + "appendix": "Anhang", + "praefatio": "Vorwort", + "lemma": "Hilfssatz", + "postulatum": "Postulat", + "postulata": "Postulate", + "affectuum definitiones": "Definitionen der Affekte", + "affectuum generalis definitio": "Allgemeine Definition der Affekte", + "caput": "§" + } } diff --git a/data/en_elwes/types.json b/data/en_elwes/types.json @@ -1,22 +1,27 @@ { - "ethica": "Ethics", - "pars": "Part", - "definitiones": "Definitions", - "definitio": "Definition", - "explicatio": "Explanation", - "axiomata": "Axioms", - "axioma": "Axiom", - "propositio": "Proposition", - "demonstratio": "Proof", - "corollarium": "Corollary", - "aliter": "Another Proof", - "scholium": "Note", - "appendix": "Appendix", - "praefatio": "Preface", - "lemma": "Lemma", - "postulatum": "Postulate", - "postulata": "Postulates", - "affectuum definitiones": "Definitions of the Emotions", - "affectuum generalis definitio": "General Definition of the Emotions", - "caput": "Paragraph" + "name": "English (Elwes)", + "language": "en", + "translator": "Elwes", + "types": { + "ethica": "Ethics", + "pars": "Part", + "definitiones": "Definitions", + "definitio": "Definition", + "explicatio": "Explanation", + "axiomata": "Axioms", + "axioma": "Axiom", + "propositio": "Proposition", + "demonstratio": "Proof", + "corollarium": "Corollary", + "aliter": "Another Proof", + "scholium": "Note", + "appendix": "Appendix", + "praefatio": "Preface", + "lemma": "Lemma", + "postulatum": "Postulate", + "postulata": "Postulates", + "affectuum definitiones": "Definitions of the Emotions", + "affectuum generalis definitio": "General Definition of the Emotions", + "caput": "Paragraph" + } } diff --git a/data/fr_appuhn/types.json b/data/fr_appuhn/types.json @@ -1,22 +1,27 @@ { - "ethica": "Éthique", - "pars": "Partie", - "definitiones": "Définitions", - "definitio": "Définition", - "explicatio": "Explication", - "axiomata": "Axiomes", - "axioma": "Axiome", - "propositio": "Proposition", - "demonstratio": "Démonstration", - "corollarium": "Corollaire", - "aliter": "Autre Démonstration", - "scholium": "Scolie", - "appendix": "Appendice", - "praefatio": "Préface", - "lemma": "Lemme", - "postulatum": "Postulat", - "postulata": "Postulats", - "affectuum definitiones": "Définitions des Affections", - "affectuum generalis definitio": "Définition Générale des Affections", - "caput": "Chapitre" + "name": "French (Apphun)", + "language": "fr", + "translator": "Apphun", + "types": { + "ethica": "Éthique", + "pars": "Partie", + "definitiones": "Définitions", + "definitio": "Définition", + "explicatio": "Explication", + "axiomata": "Axiomes", + "axioma": "Axiome", + "propositio": "Proposition", + "demonstratio": "Démonstration", + "corollarium": "Corollaire", + "aliter": "Autre Démonstration", + "scholium": "Scolie", + "appendix": "Appendice", + "praefatio": "Préface", + "lemma": "Lemme", + "postulatum": "Postulat", + "postulata": "Postulats", + "affectuum definitiones": "Définitions des Affections", + "affectuum generalis definitio": "Définition Générale des Affections", + "caput": "Chapitre" + } } diff --git a/data/fr_saisset/types.json b/data/fr_saisset/types.json @@ -1,22 +1,27 @@ { - "ethica": "Éthique", - "pars": "Partie", - "definitiones": "Définitions", - "definitio": "Définition", - "explicatio": "Explication", - "axiomata": "Axiomes", - "axioma": "Axiome", - "propositio": "Proposition", - "demonstratio": "Démonstration", - "corollarium": "Corollaire", - "aliter": "Autre Démonstration", - "scholium": "Scholie", - "appendix": "Appendice", - "praefatio": "Préface", - "lemma": "Lemme", - "postulatum": "Postulat", - "postulata": "Postulats", - "affectuum definitiones": "Définition des Passions", - "affectuum generalis definitio": "Définition Générale des Passions", - "caput": "Chapitre" + "name": "French (Saisset)", + "language": "fr", + "translator": "Saisset", + "types": { + "ethica": "Éthique", + "pars": "Partie", + "definitiones": "Définitions", + "definitio": "Définition", + "explicatio": "Explication", + "axiomata": "Axiomes", + "axioma": "Axiome", + "propositio": "Proposition", + "demonstratio": "Démonstration", + "corollarium": "Corollaire", + "aliter": "Autre Démonstration", + "scholium": "Scholie", + "appendix": "Appendice", + "praefatio": "Préface", + "lemma": "Lemme", + "postulatum": "Postulat", + "postulata": "Postulats", + "affectuum definitiones": "Définition des Passions", + "affectuum generalis definitio": "Définition Générale des Passions", + "caput": "Chapitre" + } } diff --git a/data/la_spinoza/types.json b/data/la_spinoza/types.json @@ -1,22 +1,26 @@ { - "ethica": "Ethica", - "pars": "Pars", - "definitiones": "definitiones", - "definitio": "definitio", - "explicatio": "explicatio", - "axiomata": "axiomata", - "axioma": "axioma", - "propositio": "propositio", - "demonstratio": "demonstratio", - "corollarium": "corollarium", - "aliter": "aliter", - "scholium": "scholium", - "appendix": "appendix", - "praefatio": "praefatio", - "lemma": "lemma", - "postulatum": "postulatum", - "postulata": "postulata", - "affectuum definitiones": "affectuum definitiones", - "affectuum generalis definitio": "affectuum generalis definitio", - "caput": "caput" + "name": "Latin (Orig.)", + "language": "la", + "types": { + "ethica": "Ethica", + "pars": "Pars", + "definitiones": "Definitiones", + "definitio": "Definitio", + "explicatio": "Explicatio", + "axiomata": "Axiomata", + "axioma": "Axioma", + "propositio": "Propositio", + "demonstratio": "Demonstratio", + "corollarium": "Corollarium", + "aliter": "Aliter", + "scholium": "Scholium", + "appendix": "Appendix", + "praefatio": "Praefatio", + "lemma": "Lemma", + "postulatum": "Postulatum", + "postulata": "Postulata", + "affectuum definitiones": "Affectuum Definitiones", + "affectuum generalis definitio": "Affectuum Generalis Definitio", + "caput": "Caput" + } } diff --git a/lisp/ethics.lisp b/lisp/ethics.lisp @@ -6,10 +6,11 @@ (ql:quickload :lou.spinoza.ethics) -(defpackage ethics +(defpackage :ethics (:use :cl) + (:export #:write-ethics) (:local-nicknames - (:md :markdown) + (:md :markdown.cl) (:jzon :com.inuoe.jzon))) (in-package :ethics) @@ -17,44 +18,37 @@ ;; --- Importing Data (defparameter config - '(:build-dir #p"../build/" - :meta-data #p"../data/meta.json" - :versions - ((:key :latin - :name "Latin (orig.)" - :file "latin.html" - :data #p"../data/la_spinoza/") - (:key :elwes - :name "English (Elwes)" - :file "english.html" - :data #p"../data/en_elwes/") - (:key :stern - :name "German (Stern)" - :file "de_stern.html" - :data #p"../data/de_stern/") - (:key :auerbach - :name "German (Auerbach)" - :file "de_auerbach.html" - :data #p"../data/de_auerbach/") - (:key :saisset - :name "French (Saisset)" - :file "fr_saisset.html" - :data #p"../data/fr_saisset/") - (:key :appuhn - :name "French (Appuhn)" - :file "fr_appuhn.html" - :data #p"../data/fr_appuhn/")))) + '(:build-dir #p"../build/" + :meta-data #p"../data/meta.json" + :data-dir #p"../data")) -(defun read-version (tbl version) - (loop :for path :in (uiop:directory-files (getf version :data)) - :as type := (pathname-type path) - :when (string= type "md") - :do (setf (gethash (getf version :key) - (gethash (pathname-name path) tbl)) +(defun import-versions (config tbl) + (loop :for path :in (uiop:subdirectories (getf config :data-dir)) + :as fname := (car (last (pathname-directory path))) + :as data := (read-version fname path tbl) + :collect (list + :key fname + :path path + :name (gethash "name" data) + :translator (gethash "translator" data) + :language (gethash "language" data) + :types (gethash "types" data) + :meta data + :file (make-pathname :name fname :type "html")) + :into versions + :finally (return (cons tbl versions)))) + +(defun read-version (key dir tbl) + (loop :with meta := nil + :for path :in (uiop:directory-files dir) + :as ftype := (pathname-type path) + :as fname := (pathname-name path) + :when (string= ftype "md") + :do (setf (gethash key (gethash fname tbl)) (uiop:read-file-string path)) - :when (string= type "json") - :do (setf (gethash (getf version :key) tbl) - (jzon:parse path)))) + :when (string= ftype "json") + :do (setf meta (jzon:parse path)) + :finally (return meta))) (defun get-nodes (tbl nodes) (when nodes @@ -72,18 +66,15 @@ (defun build-tree (tbl) (loop :for node :being :each :hash-value :in tbl :as children := (gethash "children" node) - :do - (make-links tbl (gethash "id" node) (gethash "ref" node)) - (setf (gethash :child-nodes node) - (get-nodes tbl children)) + :do (make-links tbl (gethash "id" node) (gethash "ref" node)) + (setf (gethash :child-nodes node) + (get-nodes tbl children)) :finally (return (gethash "ethica" tbl)))) (defun import-ethics (config) (let ((tbl (jzon:parse (getf config :meta-data)))) - (loop :for v :in (getf config :versions) - :do (read-version tbl v)) (build-tree tbl) - tbl)) + (import-versions config tbl))) ;; --- @@ -102,14 +93,14 @@ (defun make-node (node vkey types &optional (level 1)) (clip:process #p"../html/node.chtml" - :node node + :node node :level level - :vkey vkey + :vkey vkey :types types)) (defun write-ethics () - (let ((ethica (import-ethics config)) - (versions (getf config :versions))) + (destructuring-bind (ethica &rest versions) + (import-ethics config) (process-to-file #p"../html/index.chtml" #p"../build/index.html" :versions versions) @@ -122,4 +113,4 @@ :tree (gethash "ethica" ethica) :name (getf version :name) :vkey key - :types (gethash key ethica)))))) + :types (getf version :types)))))) diff --git a/readme.md b/readme.md @@ -23,33 +23,42 @@ node has fields: Each subdirectory of data contains one version of the text. Each version of the text is split into one file per node, named by the id of the node. The files are -Markdown formatted. Each version also requires a file `types.json` that maps -each type of node to a name to be used for that type of node in the text -version. +Markdown formatted. Each version directory also must contain exactly one json +file containing meta data specific to that text version. The json object in that +file must at least contain the + +- `types` field maping each type of node to a name to be used for that type of + node in the text version and the +- `name` field, specifying the name of the text version presentde to the user. e.g. `data/de_stern/types.json` looks like this: ```json { - "ethica": "Ethik", - "pars": "Teil", - "definitiones": "Definitionen", - "definitio": "Definition", - "explicatio": "Erläuterung", - "axiomata": "Axiome", - "axioma": "Axiom", - "propositio": "Lehrsatz", - "demonstratio": "Beweis", - "corollarium": "Zusatz", - "aliter": "Anderer Beweis", - "scholium": "Anmerkung", - "appendix": "Anhang", - "praefatio": "Vorwort", - "lemma": "Hilfssatz", - "postulatum": "Postulat", - "postulata": "Postulate", - "affectuum definitiones": "Definitionen der Affekte", - "affectuum generalis definitio": "Allgemeine Definition der Affekte", - "caput": "§" + "name": "German (Stern)", + "language": "de", + "translator": "Jakob Stern", + "types": { + "ethica": "Ethik", + "pars": "Teil", + "definitiones": "Definitionen", + "definitio": "Definition", + "explicatio": "Erläuterung", + "axiomata": "Axiome", + "axioma": "Axiom", + "propositio": "Lehrsatz", + "demonstratio": "Beweis", + "corollarium": "Zusatz", + "aliter": "Anderer Beweis", + "scholium": "Anmerkung", + "appendix": "Anhang", + "praefatio": "Vorwort", + "lemma": "Hilfssatz", + "postulatum": "Postulat", + "postulata": "Postulate", + "affectuum definitiones": "Definitionen der Affekte", + "affectuum generalis definitio": "Allgemeine Definition der Affekte", + "caput": "§" + } } ```