@tricoteuses/tisseuse 0.13.3 → 0.13.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +76 -0
- package/dist/index.js +73 -64
- package/dist/server.js +21514 -21262
- package/dist/src/lib/articles.d.ts +18 -4
- package/dist/src/lib/cache.d.ts +2 -1
- package/dist/src/lib/index.d.ts +2 -2
- package/dist/src/lib/loaders/legifrance.d.ts +11 -9
- package/dist/src/lib/server/assemblee_amendment_search.d.ts +13 -0
- package/dist/src/lib/server/assemblee_amendment_search.test.d.ts +1 -0
- package/dist/src/lib/server/assemblee_document_search.d.ts +29 -0
- package/dist/src/lib/server/assemblee_document_search.test.d.ts +1 -0
- package/dist/src/lib/server/databases/index.d.ts +2 -2
- package/dist/src/lib/server/index.d.ts +5 -0
- package/dist/src/lib/server/legifrance_article_search.d.ts +23 -0
- package/dist/src/lib/server/legifrance_article_search.test.d.ts +1 -0
- package/dist/src/lib/server/parsed_bills.d.ts +1 -0
- package/dist/src/lib/server/senat_amendment_search.d.ts +12 -0
- package/dist/src/lib/server/senat_amendment_search.test.d.ts +1 -0
- package/dist/src/lib/server/senat_document_search.d.ts +17 -0
- package/dist/src/lib/server/senat_document_search.test.d.ts +1 -0
- package/dist/src/lib/server/senat_document_sources.d.ts +15 -0
- package/dist/src/lib/textes.d.ts +4 -4
- package/dist/src/scripts/configure_postgres_assemblee_document_triggers.d.ts +1 -0
- package/dist/src/scripts/configure_postgres_senat_document_triggers.d.ts +1 -0
- package/dist/src/scripts/index_postgres_assemblee_amendments.d.ts +1 -0
- package/dist/src/scripts/index_postgres_assemblee_texts.d.ts +1 -0
- package/dist/src/scripts/index_postgres_legifrance_articles.d.ts +1 -0
- package/dist/src/scripts/index_postgres_senat_amendments.d.ts +1 -0
- package/dist/src/scripts/index_postgres_senat_texts.d.ts +1 -0
- package/dist/src/scripts/profile_assemblee_document_parsing.d.ts +1 -0
- package/dist/src/scripts/sync_postgres_assemblee_document_content.d.ts +1 -0
- package/dist/src/scripts/sync_postgres_senat_document_content.d.ts +1 -0
- package/dist/{textes-Enqe3lpa.js → textes-BIJjrNwg.js} +2281 -2271
- package/package.json +16 -2
- /package/dist/src/{scripts/enrich_senat_documents.d.ts → lib/article_temporal_status.test.d.ts} +0 -0
package/README.md
CHANGED
|
@@ -39,6 +39,82 @@ Create a `.env` file to set configuration variables (you can use `example.env` a
|
|
|
39
39
|
npm run configure
|
|
40
40
|
```
|
|
41
41
|
|
|
42
|
+
### Pilote de recherche plein texte Légifrance
|
|
43
|
+
|
|
44
|
+
La projection native PostgreSQL `tisseuse.legifrance_article_search` indexe une ligne par version d’article Légifrance. Elle s’appuie sur le contenu déjà enrichi par Tisseuse lorsqu’il est disponible, sinon sur le bloc textuel source.
|
|
45
|
+
|
|
46
|
+
Exécuter la commande **sur le primaire PostgreSQL avec un rôle en écriture**, après les imports ; le contenu enrichi par Tisseuse est utilisé lorsqu’il est disponible :
|
|
47
|
+
|
|
48
|
+
```sh
|
|
49
|
+
npm run index:postgres:legifrance
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
La table, son `tsvector` français, ses index GIN/B-tree et une file durable d’articles sont créés par `npm run configure`. Cette configuration installe des triggers sur les articles source et sur les contenus enrichis : toute insertion, modification ou suppression place l’identifiant de l’article dans la file, dans la même transaction que la modification source. Lors de sa première installation, le trigger place aussi le corpus existant dans la file.
|
|
53
|
+
|
|
54
|
+
La CI `tricoteuses-legal-update` exécute la configuration puis vide la file après chaque import `jorf` ou `legi` qui a effectivement changé les données. L’indexeur traite la file par lots verrouillés et ne retire un identifiant qu’après avoir mis à jour ou supprimé sa projection dans la même transaction : une interruption laisse donc les travaux non terminés rejouables. Les articles inchangés ne sont pas réécrits grâce à leur hash source.
|
|
55
|
+
|
|
56
|
+
Pour demander explicitement une réconciliation complète, par exemple après une évolution de la projection :
|
|
57
|
+
|
|
58
|
+
```sh
|
|
59
|
+
npm run index:postgres:legifrance -- --all
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
La projection, la file et ses index suivent la réplication physique PostgreSQL ; ne pas exécuter cette commande sur un standby.
|
|
63
|
+
|
|
64
|
+
Pour les articles dont Légifrance fournit une date de début sentinelle (`2222-02-22` ou `2999-01-01`), la projection utilise `getArticleDateDebut`, le repli déjà employé par Tisseuse. Cette fonction peut retrouver un repère de création ou de signature dans le contexte de l’article ; elle ne transforme pas ce repère en période de vigueur certaine. La projection conserve aussi les bornes source et les classe dans `temporal_status` : `dated`, `open_ended`, `never_effective` ou `unknown`. Les recherches du droit applicable doivent limiter les résultats aux deux premiers statuts. Après une évolution de cette projection, lancer la réconciliation explicite `--all` avant d’interpréter les dates de l’ensemble du corpus avec la nouvelle logique.
|
|
65
|
+
|
|
66
|
+
Le pilote est exposé par Exploratrice à `GET /legifrance/recherche-plein-texte?q=...`, avec les filtres facultatifs `date=YYYY-MM-DD`, `nature`, `texte_cid` et `limit`.
|
|
67
|
+
|
|
68
|
+
### Contenus et recherche plein texte Assemblée nationale
|
|
69
|
+
|
|
70
|
+
Les documents de l’Assemblée nationale sont acquis depuis les URL institutionnelles déduites de `assemblee.documents`, puis stockés dans `tisseuse.assemblee_document_content`. Cette projection est la source de contenu d’Exploratrice : elle contient un HTML simplifié, sa version enrichie de liens lorsque disponible, le sommaire, la provenance et l’état d’acquisition. Le répertoire local `Documents/` peut servir à diagnostiquer ou à amorcer un import historique, mais n’est pas lu par le service web ou l’indexeur.
|
|
71
|
+
|
|
72
|
+
Exécuter ces commandes **sur le primaire PostgreSQL avec un rôle en écriture** :
|
|
73
|
+
|
|
74
|
+
```sh
|
|
75
|
+
npm run sync:postgres:assemblee-content -- --all
|
|
76
|
+
npm run index:postgres:assemblee -- --all
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
`npm run configure` doit être exécuté avec le rôle en écriture du schéma `tisseuse`. Les déclencheurs de `assemblee.documents` sont installés séparément avec `npm run configure:postgres:assemblee-triggers`, sous le rôle propriétaire du schéma `assemblee`. Les déclencheurs de `senat.dosleg_texte` et `senat.ameli_amd` le sont avec `npm run configure:postgres:senat-triggers`, sous le rôle propriétaire du schéma `senat`. Les pipelines d’import effectuent ces étapes avec les identifiants appropriés.
|
|
80
|
+
|
|
81
|
+
La première commande consomme la file des documents à acquérir, simplifier et enrichir. La seconde indexe dans `tisseuse.assemblee_text_search` les articles et les exposés des motifs comme résultats distincts. Les déclencheurs sur `assemblee.documents`, le hash du contenu et les files PostgreSQL permettent les mises à jour ciblées ; les options `--all` demandent une réconciliation complète.
|
|
82
|
+
|
|
83
|
+
Exploratrice et Moulineuse ne téléchargent jamais un document pendant une lecture. Lorsqu’un document source existe mais que son contenu n’est pas encore disponible, son état est conservé en base et l’interface doit l’indiquer au lieu de servir une copie locale périmée.
|
|
84
|
+
|
|
85
|
+
### Première itération de recherche plein texte Sénat
|
|
86
|
+
|
|
87
|
+
La recherche Sénat indexe les articles et les exposés des motifs des états documentaires `senat.dosleg_texte`. Elle conserve la source Akoma Ntoso institutionnelle, son rendu HTML et une projection PostgreSQL par fragment ; un résultat est donc toujours associé à un `texcod`, une étape et un dossier, jamais présenté comme une version du droit en vigueur.
|
|
88
|
+
|
|
89
|
+
Après l’import des tables Sénat, exécuter ces commandes **sur le primaire PostgreSQL avec un rôle d’écriture** :
|
|
90
|
+
|
|
91
|
+
```sh
|
|
92
|
+
npm run configure
|
|
93
|
+
npm run configure:postgres:senat-triggers
|
|
94
|
+
npm run sync:postgres:senat-content
|
|
95
|
+
npm run index:postgres:senat
|
|
96
|
+
npm run index:postgres:senat-amendments
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
`sync:postgres:senat-content` vide la file d’acquisition : il résout les URL `senat.dosleg_texte.texurl` vers `https://www.senat.fr/akomantoso/<nom>.akn.xml`, valide que la réponse est bien du XML Akoma Ntoso et conserve le XML, les rendus et les erreurs dans `tisseuse.senat_document_content`. Il ne doit jamais être exécuté par une requête utilisateur, un affichage Exploratrice ou un appel MCP.
|
|
100
|
+
|
|
101
|
+
`index:postgres:senat` vide la file d’indexation et produit `tisseuse.senat_text_search` depuis le contenu déjà stocké. Il peut donc recalculer l’index après une évolution du parseur ou des métadonnées sans relire le réseau. Pour réconcilier explicitement toutes les lignes, par exemple après un import Sénat qui modifie des libellés ou des dossiers :
|
|
102
|
+
|
|
103
|
+
```sh
|
|
104
|
+
npm run index:postgres:senat -- --all
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Pour forcer une nouvelle acquisition de l’ensemble du corpus, par exemple après une évolution du récupérateur :
|
|
108
|
+
|
|
109
|
+
```sh
|
|
110
|
+
npm run sync:postgres:senat-content -- --all
|
|
111
|
+
npm run index:postgres:senat
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Les documents sans URL, externes au Sénat, sans Akoma Ntoso ou en échec de parsing ont un statut explicite et ne sont pas silencieusement remplacés par un fichier local.
|
|
115
|
+
|
|
116
|
+
`index:postgres:senat-amendments` consomme la file AMELI et produit deux fragments distincts par amendement dans `tisseuse.senat_amendment_search` : `dispositif` depuis `senat.ameli_amd.dis` et `expose_sommaire` depuis `senat.ameli_amd.obj`. Les métadonnées parlementaires restent liées à chaque résultat. L'option `--all` réconcilie l'ensemble du corpus sans téléchargement réseau.
|
|
117
|
+
|
|
42
118
|
## Legal reference resolver
|
|
43
119
|
|
|
44
120
|
Tisseuse resolves legal references through a `LegiResolver`. The default
|
package/dist/index.js
CHANGED
|
@@ -1,71 +1,80 @@
|
|
|
1
|
-
import { $ as e, $t as t, A as n, An as r, At as i, B as a, Bn as o, Bt as s, C as c, Cn as l, Ct as u, D as d, Dn as f, Dt as p, E as m, En as ee, Et as te, F as
|
|
1
|
+
import { $ as e, $t as t, A as n, An as r, At as i, B as a, Bn as o, Bt as s, C as c, Cn as l, Ct as u, D as d, Dn as f, Dt as p, E as m, En as ee, Et as te, F as ne, Fn as re, Ft as h, G as ie, Gn as ae, Gt as oe, H as se, Hn as ce, Ht as le, I as ue, In as de, It as fe, J as pe, Jn as g, Jt as me, K as he, Kn as ge, Kt as _e, Ln as ve, Lt as ye, M as be, Mn as xe, Mt as Se, N as Ce, Nn as _, Nt as we, O as Te, On as v, Ot as y, P as Ee, Pn as De, Pt as Oe, Q as ke, Qt as b, R as x, Rn as S, Rt as C, S as w, Sn as T, St as Ae, T as je, Tn as Me, Tt as Ne, U as Pe, Un as Fe, Ut as Ie, V as Le, Vn as Re, Vt as ze, W as Be, Wn as Ve, Wt as He, X as Ue, Xt as We, Y as Ge, Yt as Ke, Z as qe, Zt as Je, _ as Ye, _n as Xe, _t as Ze, a as Qe, an as $e, at as et, b as tt, bn as nt, bt as rt, c as E, cn as it, ct as at, d as ot, dn as st, dt as D, en as ct, et as lt, f as O, fn as k, ft as A, g as ut, gn as dt, gt as ft, h as pt, hn as mt, ht, i as gt, in as _t, it as vt, j as yt, jn as j, jt as bt, k as xt, kn as M, kt as St, l as Ct, ln as wt, lt as Tt, m as Et, mn as Dt, mt as Ot, n as kt, nn as At, nt as jt, o as Mt, on as Nt, ot as Pt, p as Ft, pn as It, q as Lt, qn as Rt, qt as zt, r as Bt, rn as Vt, rt as N, s as Ht, sn as Ut, st as Wt, t as Gt, tn as Kt, tt as qt, u as Jt, un as Yt, ut as Xt, v as Zt, vn as Qt, vt as $t, w as en, wn as tn, wt as nn, x as rn, xn as an, xt as on, y as sn, yn as cn, yt as ln, z as P, zn as un, zt as dn } from "./textes-BIJjrNwg.js";
|
|
2
2
|
//#region ../../node_modules/@tricoteuses/legifrance/dist/legal/index.js
|
|
3
|
-
function
|
|
3
|
+
function fn(e, t) {
|
|
4
4
|
if (e != null) {
|
|
5
5
|
if (!Array.isArray(e)) return e;
|
|
6
6
|
for (let n of e) if (n["@debut"] <= t && t <= n["@fin"]) return n;
|
|
7
7
|
return e[0];
|
|
8
8
|
}
|
|
9
9
|
}
|
|
10
|
-
function* L(e) {
|
|
11
|
-
yield e, e.TM !== void 0 && (yield* L(e.TM));
|
|
12
|
-
}
|
|
13
10
|
//#endregion
|
|
14
11
|
//#region src/lib/articles.ts
|
|
15
|
-
var
|
|
12
|
+
var F = ["2222-02-22", "2999-01-01"];
|
|
13
|
+
function I(e) {
|
|
14
|
+
return [e, ...e.TM === void 0 ? [] : I(e.TM)];
|
|
15
|
+
}
|
|
16
|
+
function L(e) {
|
|
17
|
+
return e !== void 0 && F.includes(e);
|
|
18
|
+
}
|
|
19
|
+
function pn({ dateDebut: e, sourceDateDebut: t, sourceDateFin: n }) {
|
|
20
|
+
return t !== void 0 && n !== void 0 && !L(t) && !L(n) && n <= t ? "never_effective" : e === void 0 || L(e) ? "unknown" : n === "2999-01-01" ? "open_ended" : n === void 0 || L(n) ? "unknown" : n > e ? "dated" : "unknown";
|
|
21
|
+
}
|
|
22
|
+
var mn = (e) => {
|
|
16
23
|
if (e !== void 0) for (let t = 0; t < e.length; ++t) {
|
|
17
24
|
let n = k(new f(e, t));
|
|
18
25
|
if (typeof n == "string") return n;
|
|
19
26
|
}
|
|
20
|
-
},
|
|
27
|
+
}, R = (e) => (e === void 0 ? [] : Array.isArray(e) ? e : [e]).map((e) => mn(e["#text"])).find((e) => e !== void 0), hn = (e) => {
|
|
21
28
|
let t = e.META.META_SPEC.META_ARTICLE.DATE_DEBUT;
|
|
22
|
-
if (t !== void 0 && !
|
|
23
|
-
let n = e.CONTEXTE.TEXTE, r = n.TITRE_TXT, i = [...r === void 0 ? [] : (Array.isArray(r) ? r : [r]).map((e) => e["@debut"]), ...n.TM === void 0 ? [] :
|
|
29
|
+
if (t !== void 0 && !F.includes(t)) return t;
|
|
30
|
+
let n = e.CONTEXTE.TEXTE, r = n.TITRE_TXT, i = [...r === void 0 ? [] : (Array.isArray(r) ? r : [r]).map((e) => e["@debut"]), ...n.TM === void 0 ? [] : I(n.TM).map((e) => (Array.isArray(e.TITRE_TM) ? e.TITRE_TM : [e.TITRE_TM]).map((e) => e["@debut"])).flat()].filter((e) => !F.includes(e));
|
|
24
31
|
if (i.length > 0) return i.sort().at(-1);
|
|
25
32
|
let a = n["@date_publi"];
|
|
26
|
-
if (a !== void 0 && !
|
|
33
|
+
if (a !== void 0 && !F.includes(a)) return a;
|
|
27
34
|
let o = n["@date_signature"];
|
|
28
|
-
if (o !== void 0 && !
|
|
35
|
+
if (o !== void 0 && !F.includes(o)) return o;
|
|
29
36
|
let s = e.META.META_SPEC.META_ARTICLE.DATE_FIN;
|
|
30
|
-
if (s !== void 0 && !
|
|
31
|
-
let c =
|
|
37
|
+
if (s !== void 0 && !F.includes(s)) return s;
|
|
38
|
+
let c = R(r);
|
|
32
39
|
if (c !== void 0) return c;
|
|
33
|
-
if (
|
|
40
|
+
if (F.includes(t ?? "")) return t;
|
|
34
41
|
throw Error(`Missing date signature in article ${e.META.META_COMMUN.ID}`);
|
|
35
|
-
},
|
|
42
|
+
}, z = (e) => {
|
|
36
43
|
let t = e.META.META_SPEC.META_ARTICLE.DATE_DEBUT;
|
|
37
|
-
if (t !== void 0 && !
|
|
44
|
+
if (t !== void 0 && !F.includes(t)) return t;
|
|
38
45
|
let n = e.CONTEXTE.TEXTE, r = n["@date_signature"];
|
|
39
|
-
if (r !== void 0 && !
|
|
46
|
+
if (r !== void 0 && !F.includes(r)) return r;
|
|
40
47
|
let i = n["@date_publi"];
|
|
41
|
-
if (i !== void 0 && !
|
|
42
|
-
let a = n.TITRE_TXT, o = [...a === void 0 ? [] : (Array.isArray(a) ? a : [a]).map((e) => e["@debut"]), ...n.TM === void 0 ? [] :
|
|
48
|
+
if (i !== void 0 && !F.includes(i)) return i;
|
|
49
|
+
let a = n.TITRE_TXT, o = [...a === void 0 ? [] : (Array.isArray(a) ? a : [a]).map((e) => e["@debut"]), ...n.TM === void 0 ? [] : I(n.TM).map((e) => (Array.isArray(e.TITRE_TM) ? e.TITRE_TM : [e.TITRE_TM]).map((e) => e["@debut"])).flat()].filter((e) => !F.includes(e));
|
|
43
50
|
if (o.length > 0) return o.sort().at(-1);
|
|
44
51
|
let s = e.META.META_SPEC.META_ARTICLE.DATE_FIN;
|
|
45
|
-
if (s !== void 0 && !
|
|
46
|
-
let c =
|
|
52
|
+
if (s !== void 0 && !F.includes(s)) return s;
|
|
53
|
+
let c = R(a);
|
|
47
54
|
if (c !== void 0) return c;
|
|
48
|
-
if (
|
|
55
|
+
if (F.includes(t ?? "")) return t;
|
|
49
56
|
throw Error(`Missing date signature in article ${e.META.META_COMMUN.ID}`);
|
|
50
57
|
};
|
|
51
|
-
async function
|
|
58
|
+
async function gn(e, t, n, r) {
|
|
52
59
|
let i = await S(e, t, n);
|
|
53
60
|
if (i === void 0) return;
|
|
54
|
-
let a =
|
|
61
|
+
let a = z(i), o = i.META.META_COMMUN.ORIGINE;
|
|
62
|
+
if (o === "KALI") return;
|
|
63
|
+
let s = i.CONTEXTE.TEXTE;
|
|
55
64
|
if (s.TM === void 0) return;
|
|
56
|
-
let c =
|
|
65
|
+
let c = I(s.TM).reverse(), l;
|
|
57
66
|
switch (o) {
|
|
58
67
|
case "JORF":
|
|
59
68
|
l = c.map((e) => e.TITRE_TM["@id"]);
|
|
60
69
|
break;
|
|
61
70
|
case "LEGI":
|
|
62
|
-
l = c.map((e) =>
|
|
71
|
+
l = c.map((e) => fn(e.TITRE_TM, a)?.["@id"]);
|
|
63
72
|
break;
|
|
64
|
-
default:
|
|
73
|
+
default: g("getOrLoadArticleSiblingId origine", o);
|
|
65
74
|
}
|
|
66
|
-
return await (r === -1 ?
|
|
75
|
+
return await (r === -1 ? W : U)(e, t, n, a, i.num, l);
|
|
67
76
|
}
|
|
68
|
-
async function
|
|
77
|
+
async function B(e, t, n, r, i, a) {
|
|
69
78
|
let s = r[n];
|
|
70
79
|
if (s === void 0) {
|
|
71
80
|
let c = await o(e, t, n);
|
|
@@ -96,7 +105,7 @@ async function V(e, t, n, r, i, a) {
|
|
|
96
105
|
}
|
|
97
106
|
return s;
|
|
98
107
|
}
|
|
99
|
-
async function
|
|
108
|
+
async function V(e, t, n) {
|
|
100
109
|
let r = await o(e, t, n);
|
|
101
110
|
if (r === void 0) return;
|
|
102
111
|
let i = r.STRUCTURE_TA;
|
|
@@ -105,26 +114,26 @@ async function H(e, t, n) {
|
|
|
105
114
|
if (a !== void 0) return a[0]["@id"];
|
|
106
115
|
let s = i.LIEN_SECTION_TA;
|
|
107
116
|
if (s !== void 0) for (let n of s) {
|
|
108
|
-
let r = await
|
|
117
|
+
let r = await V(e, t, n["@id"]);
|
|
109
118
|
if (r !== void 0) return r;
|
|
110
119
|
}
|
|
111
120
|
}
|
|
112
|
-
async function
|
|
121
|
+
async function H(e, t, n) {
|
|
113
122
|
let r = await o(e, t, n);
|
|
114
123
|
if (r === void 0) return;
|
|
115
124
|
let i = r.STRUCTURE_TA;
|
|
116
125
|
if (i === void 0) return;
|
|
117
126
|
let a = i.LIEN_SECTION_TA;
|
|
118
127
|
if (a !== void 0) for (let n of a.toReversed()) {
|
|
119
|
-
let r = await
|
|
128
|
+
let r = await H(e, t, n["@id"]);
|
|
120
129
|
if (r !== void 0) return r;
|
|
121
130
|
}
|
|
122
131
|
return i.LIEN_ART?.at(-1)?.["@id"];
|
|
123
132
|
}
|
|
124
|
-
async function
|
|
133
|
+
async function U(e, t, n, r, i, a, o = 0, s = {}, c = void 0) {
|
|
125
134
|
let l = a[o];
|
|
126
135
|
if (l === void 0) return;
|
|
127
|
-
let u = await
|
|
136
|
+
let u = await B(e, t, l, s, n, c);
|
|
128
137
|
if (u === void 0) return;
|
|
129
138
|
let { area: d, index: f, sectionTa: p } = u, m = p.STRUCTURE_TA;
|
|
130
139
|
switch (d) {
|
|
@@ -134,31 +143,31 @@ async function W(e, t, n, r, i, a, o = 0, s = {}, c = void 0) {
|
|
|
134
143
|
let a = c[n];
|
|
135
144
|
if (a["@num"] !== i) {
|
|
136
145
|
let n = await S(e, t, a["@id"]);
|
|
137
|
-
if (n !== void 0 &&
|
|
146
|
+
if (n !== void 0 && z(n) <= r) return a["@id"];
|
|
138
147
|
}
|
|
139
148
|
}
|
|
140
149
|
let u = m.LIEN_SECTION_TA;
|
|
141
150
|
if (u !== void 0) for (let n of u) {
|
|
142
|
-
let r = await
|
|
151
|
+
let r = await V(e, t, n["@id"]);
|
|
143
152
|
if (r !== void 0) return r;
|
|
144
153
|
}
|
|
145
|
-
return await
|
|
154
|
+
return await U(e, t, n, r, i, a, o + 1, s, l);
|
|
146
155
|
}
|
|
147
156
|
case "LIEN_SECTION_TA": {
|
|
148
157
|
let c = m.LIEN_SECTION_TA;
|
|
149
158
|
for (let n = f + 1; n < c.length; n++) {
|
|
150
|
-
let r = await
|
|
159
|
+
let r = await V(e, t, c[n]["@id"]);
|
|
151
160
|
if (r !== void 0) return r;
|
|
152
161
|
}
|
|
153
|
-
return await
|
|
162
|
+
return await U(e, t, n, r, i, a, o + 1, s, l);
|
|
154
163
|
}
|
|
155
|
-
default:
|
|
164
|
+
default: g("moveToNextArticleId area", d);
|
|
156
165
|
}
|
|
157
166
|
}
|
|
158
|
-
async function
|
|
167
|
+
async function W(e, t, n, r, i, a, o = 0, s = {}, c = void 0) {
|
|
159
168
|
let l = a[o];
|
|
160
169
|
if (l === void 0) return;
|
|
161
|
-
let u = await
|
|
170
|
+
let u = await B(e, t, l, s, n, c);
|
|
162
171
|
if (u === void 0) return;
|
|
163
172
|
let { area: d, index: f, sectionTa: p } = u, m = p.STRUCTURE_TA;
|
|
164
173
|
switch (d) {
|
|
@@ -168,23 +177,23 @@ async function G(e, t, n, r, i, a, o = 0, s = {}, c = void 0) {
|
|
|
168
177
|
let a = c[n];
|
|
169
178
|
if (a["@num"] !== i) {
|
|
170
179
|
let n = await S(e, t, a["@id"]);
|
|
171
|
-
if (n !== void 0 &&
|
|
180
|
+
if (n !== void 0 && z(n) <= r) return a["@id"];
|
|
172
181
|
}
|
|
173
182
|
}
|
|
174
|
-
return await
|
|
183
|
+
return await W(e, t, n, r, i, a, o + 1, s, l);
|
|
175
184
|
}
|
|
176
185
|
case "LIEN_SECTION_TA": {
|
|
177
186
|
for (let n = f - 1; n >= 0; n--) {
|
|
178
|
-
let r = await
|
|
187
|
+
let r = await H(e, t, m.LIEN_SECTION_TA[n]["@id"]);
|
|
179
188
|
if (r !== void 0) return r;
|
|
180
189
|
}
|
|
181
190
|
let c = m.LIEN_ART;
|
|
182
|
-
return c === void 0 ? await
|
|
191
|
+
return c === void 0 ? await W(e, t, n, r, i, a, o + 1, s, l) : (u.area = "LIEN_ART", u.index = c.length, await W(e, t, n, r, i, a, o, s));
|
|
183
192
|
}
|
|
184
|
-
default:
|
|
193
|
+
default: g("moveToPreviousArticleId area", d);
|
|
185
194
|
}
|
|
186
195
|
}
|
|
187
|
-
var
|
|
196
|
+
var G = (e) => (t, n) => {
|
|
188
197
|
let r = e(t), i = e(n);
|
|
189
198
|
if (r !== i) return r.localeCompare(i);
|
|
190
199
|
let a = t.META.META_COMMUN, o = a.ORIGINE, s = n.META.META_COMMUN, c = s.ORIGINE;
|
|
@@ -203,13 +212,13 @@ var pn = (e) => (t, n) => {
|
|
|
203
212
|
if (m <= i) return 1;
|
|
204
213
|
}
|
|
205
214
|
throw Error(`TODO: Unable to sort articles ${a.ID} & ${s.ID} by date.`);
|
|
206
|
-
},
|
|
207
|
-
function
|
|
208
|
-
return
|
|
215
|
+
}, _n = new Intl.DateTimeFormat("fr-FR", { dateStyle: "long" });
|
|
216
|
+
function vn(e) {
|
|
217
|
+
return _n.format(new Date(e)).replace(/^1 /, "1er ");
|
|
209
218
|
}
|
|
210
219
|
//#endregion
|
|
211
220
|
//#region src/lib/json.ts
|
|
212
|
-
var
|
|
221
|
+
var yn = (e, t) => t instanceof Object && !Array.isArray(t) ? Object.keys(t).sort().reduce((e, n) => (e[n] = t[n], e), {}) : t;
|
|
213
222
|
//#endregion
|
|
214
223
|
//#region src/lib/markdown.ts
|
|
215
224
|
function K(e) {
|
|
@@ -218,7 +227,7 @@ function K(e) {
|
|
|
218
227
|
//#endregion
|
|
219
228
|
//#region src/lib/linkers/markdown.ts
|
|
220
229
|
async function q({ canutesDb: e, date: t, linkBaseUrl: n, linkType: r, previousContext: i, text: a }) {
|
|
221
|
-
let o =
|
|
230
|
+
let o = N(a), s = new f(o.output);
|
|
222
231
|
s.currentArticle = i?.currentArticle, s.currentText = i?.currentText;
|
|
223
232
|
let c = a, l = 0;
|
|
224
233
|
for await (let i of O({
|
|
@@ -272,7 +281,7 @@ async function q({ canutesDb: e, date: t, linkBaseUrl: n, linkType: r, previousC
|
|
|
272
281
|
c = c.slice(0, t.position.start + l) + n + c.slice(t.position.stop + l), l += n.length - (t.position.stop - t.position.start);
|
|
273
282
|
break;
|
|
274
283
|
}
|
|
275
|
-
default:
|
|
284
|
+
default: g("Link", i);
|
|
276
285
|
}
|
|
277
286
|
return {
|
|
278
287
|
context: s,
|
|
@@ -281,7 +290,7 @@ async function q({ canutesDb: e, date: t, linkBaseUrl: n, linkType: r, previousC
|
|
|
281
290
|
}
|
|
282
291
|
//#endregion
|
|
283
292
|
//#region src/lib/loaders/assemblee.ts
|
|
284
|
-
async function
|
|
293
|
+
async function bn(e, t, n) {
|
|
285
294
|
let r = t.get("Document");
|
|
286
295
|
r === void 0 && (r = /* @__PURE__ */ new Map(), t.set("Document", r));
|
|
287
296
|
let i = r.get(n);
|
|
@@ -291,7 +300,7 @@ async function _n(e, t, n) {
|
|
|
291
300
|
WHERE uid = ${n}
|
|
292
301
|
`)[0]?.data, r.set(n, i ?? null)), i ?? void 0;
|
|
293
302
|
}
|
|
294
|
-
async function
|
|
303
|
+
async function xn(e, t, n) {
|
|
295
304
|
let r = t.get("Document");
|
|
296
305
|
return r === void 0 && (r = /* @__PURE__ */ new Map(), t.set("Document", r)), (await e`
|
|
297
306
|
SELECT data, uid
|
|
@@ -299,7 +308,7 @@ async function vn(e, t, n) {
|
|
|
299
308
|
WHERE data ->> 'dossierRef' = ${n}
|
|
300
309
|
`).map(({ data: e, uid: t }) => (r.set(t, e ?? null), e));
|
|
301
310
|
}
|
|
302
|
-
async function
|
|
311
|
+
async function Sn(e, t, n) {
|
|
303
312
|
let r = t.get("DossierParlementaire");
|
|
304
313
|
r === void 0 && (r = /* @__PURE__ */ new Map(), t.set("DossierParlementaire", r));
|
|
305
314
|
let i = r.get(n);
|
|
@@ -430,10 +439,10 @@ var J = _("art(?:icle|icl|ic|i|s)?\\.?|al(?:inéa|inea|in|i)?\\.?", { flags: "i"
|
|
|
430
439
|
})), Z = v(X, r(a, { value: (e, t) => e === void 0 ? void 0 : {
|
|
431
440
|
...e,
|
|
432
441
|
position: t.position()
|
|
433
|
-
} }), r(
|
|
442
|
+
} }), r(P, { value: (e, t) => ({
|
|
434
443
|
...e,
|
|
435
444
|
position: t.position()
|
|
436
|
-
}) })), Q = j(_(" (?:du |de la |de l'|des |de |d')?", { flags: "i" }), { default: "" }),
|
|
445
|
+
}) })), Q = j(_(" (?:du |de la |de l'|des |de |d')?", { flags: "i" }), { default: "" }), Cn = _(".+?(?=\\s*(?:du |de la |de l'|des |de |d')?\\s*(?:art(?:icle|icl|ic|i|s)?\\.?|al(?:inéa|inea|in|i)?\\.?))", {
|
|
437
446
|
flags: "i",
|
|
438
447
|
value: (e, t) => ({
|
|
439
448
|
type: "texte",
|
|
@@ -447,7 +456,7 @@ var J = _("art(?:icle|icl|ic|i|s)?\\.?|al(?:inéa|inea|in|i)?\\.?", { flags: "i"
|
|
|
447
456
|
title: e[0].trim(),
|
|
448
457
|
position: t.position()
|
|
449
458
|
})
|
|
450
|
-
}),
|
|
459
|
+
}), wn = v(M([
|
|
451
460
|
Z,
|
|
452
461
|
Q,
|
|
453
462
|
Y
|
|
@@ -469,7 +478,7 @@ var J = _("art(?:icle|icl|ic|i|s)?\\.?|al(?:inéa|inea|in|i)?\\.?", { flags: "i"
|
|
|
469
478
|
position: t.position(),
|
|
470
479
|
type: "parent-enfant"
|
|
471
480
|
}) }), M([
|
|
472
|
-
|
|
481
|
+
Cn,
|
|
473
482
|
Q,
|
|
474
483
|
Y
|
|
475
484
|
], { value: (e, t) => {
|
|
@@ -489,6 +498,6 @@ var J = _("art(?:icle|icl|ic|i|s)?\\.?|al(?:inéa|inea|in|i)?\\.?", { flags: "i"
|
|
|
489
498
|
parent: e[2],
|
|
490
499
|
position: t.position(),
|
|
491
500
|
type: "parent-enfant"
|
|
492
|
-
}) }), Y, Z, $),
|
|
501
|
+
}) }), Y, Z, $), Tn = q;
|
|
493
502
|
//#endregion
|
|
494
|
-
export { f as TextParserContext, se as action,
|
|
503
|
+
export { f as TextParserContext, se as action, sn as actionDirective, Je as actionTargets, oe as addChildLeftToLastChild, Qe as addLinksOrReferencesToHtmlPage, Mt as addLinksToHtml, q as addLinksToMarkdown, Tn as addLinksToText, Ct as addPositionsToTableOfContentsItems, Dt as adjectifNumeralCardinal, mt as adjectifNumeralOrdinalCourt, C as adjectifTemporelSingulier, dt as adverbeMultiplicatifLatin, Oe as adverbeRelatif, v as alternatives, on as article, Ae as articles, g as assertNever, St as auPortion, i as auxPortions, he as buildArticlePortionTreeFromHtml, M as chain, Pt as chainTransformers, Pe as citation, Be as citationLigne, ie as citationSimple, pn as classifyArticleTemporalStatus, Gt as cleanTexteTitle, b as compoundReferencesSeparators, r as convert, Ue as convertHtmlElementsToText, _e as createEnumerationOrBoundedInterval, zt as createParentChildTreeFromReferences, k as date, qe as decodeNamedHtmlEntities, ke as decodeNumericHtmlEntities, u as definitionArticleDansCitation, nn as definitionArticleDansProjetOuPropositionLoi, ht as definitionDivision, n as definitionTexteFrancais, Ne as designationArticle, ft as designationDivision, dn as ditPluriel, s as ditSingulier, Ze as division, t as divisionTypes, $t as divisions, It as duDate, T as espace, h as espaceAdverbeRelatif, ct as europeanLawNatures, ve as extendLoadedArticle, Et as extractActionDirectiveAstsFromText, pt as extractActionDirectivesFromHtml, ut as extractActionDirectivesFromText, Ot as extractBillDefinitions, tt as extractCitationReferences, Lt as extractPortionSelectors, rn as extractReferences, w as extractReferencesWithOriginalTransformations, O as extractTextLinks, vn as formatLongDate, Kt as frenchLawNatures, hn as getArticleDateDebut, z as getArticleDateSignature, c as getExtractedReferences, en as getExtractedReferencesWithOriginalTransformations, Jt as getExtractedTableOfContentsFromTextBill, S as getOrLoadArticle, gn as getOrLoadArticleSiblingId, bn as getOrLoadDocument, xn as getOrLoadDocumentsByDossierParlementaireUid, Sn as getOrLoadDossierParlementaire, un as getOrLoadJo, o as getOrLoadSectionTa, Re as getOrLoadSectionsTa, ce as getOrLoadTexteVersion, Fe as getOrLoadTextekali, Ve as getOrLoadTextelr, ae as getOrLoadTextesVersions, ge as getOrLoadTexteslr, kt as getTexteVersionDateDebut, Bt as getTexteVersionDateSignature, yt as identificationTexteEuropeen, At as internationalLawNatures, ze as introPluriel, le as introSingulier, pe as isArticlePortionStructuralStart, L as isLegifranceSentinelDate, Vt as isTextAstAtomicReference, _t as isTextAstDivision, $e as isTextAstPortion, me as iterAtomicFirstParentReferences, Ke as iterAtomicReferences, We as iterIncludedReferences, Ft as iterReferenceLinks, yn as jsonReplacer, Nt as lawNatures, l as lettreAscii, Ie as liaisonPluriel, He as liaisonSingulier, Ht as linkTypes, te as listeArticles, je as listeReferencesSeules, Rt as loadArticles, Ut as localizationAdverbs, ln as natureDivisionSingulier, be as natureTexteFrancais, wt as newAssembleeObjectCache, Yt as newLegifranceObjectCache, st as newObjectCache, Wt as newReverseTransformationsMergedFromPositionsIterator, p as nomArticle, y as nomSpecialArticle, Xe as nombreAsTextAstNumber, Qt as nombreCardinal, cn as nombreRomainCardinal, nt as nombreRomainOrdinal, an as nombreRomainOu0iAsTextAstNumber, tn as nonLettre, Me as numero, rt as numeroDivision, Ce as numeroEtOuDateTexteFrancais, bt as numeroPortion, Ee as numeroTexteEuropeen, ne as numeroTexteFrancais, j as optional, ue as optionalEspaceDuTerritoire, xe as parseText, it as portionTypes, Se as portions, m as reference, d as referenceSeule, _ as regExp, fe as relatifPlurielPrepose, ye as relatifSingulierPrepose, De as repeat, e as replaceHtmlPatterns, lt as replacePattern, qt as replaceTextPatterns, Ye as resolveActionDirectivesFromHtml, Zt as resolveActionDirectivesFromText, Ge as resolvePortionSelector, at as reversePositionsSplitFromPositions, Tt as reverseTransformationFromPosition, Xt as reverseTransformationsMergedFromPositions, D as reverseTransformedInnerFragment, A as reverseTransformedReplacement, Y as searchArticle, J as searchArticleKeyword, wn as searchQueryReference, Z as searchTexte, X as searchTexteAbbreviations, jt as simplifyHtml, N as simplifyPlainText, vt as simplifyText, et as simplifyUnicodeCharacters, G as sortArticlesByDate, gt as sortTextesVersionsByDate, x as texte, P as texteEuropeen, a as texteFrancais, Le as texteInternational, we as unePortion, Te as uniteBasePreciseeSingulier, xt as uniteBaseSingulier, E as urlFromLegalId, re as variable, ee as virguleOuEspace, ot as walkTableOfContents, de as wordsTree };
|