mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-20 05:28:15 +02:00
Jauge de contexte, espace disque sur partage agrégé, panneau Fichiers
Trois défauts sans rapport entre eux, tous visibles à l'écran. Jauge de contexte bloquée à « 0 / N (0 %) » : le comptage exact vient de usage.prompt_tokens (include_usage), qu'un llama-server récent a cessé de renvoyer. On note désormais si l'usage est arrivé ; sinon la fin de tour publie l'estimation qui pilote déjà la compaction — approximative, mais jamais absente. Et la souscription envoie la valeur courante juste après le rattrapage : une page rechargée affichait zéro sur une discussion pourtant pleine, faute d'événement ctx_used dans la fenêtre rejouée. Espace disque : « il ne reste que 11,9 Go » sur un partage Unraid qui en a des centaines. /mnt/user est servi par shfs, un FUSE qui agrège plusieurs disques — statfs y renvoie l'espace d'un seul, et ce chiffre REFUSAIT l'installation du modèle. Les systèmes de fichiers qui approximent (FUSE, overlay, NFS, CIFS, Ceph, Gluster) sont reconnus par leur magie : leur chiffre reste affiché, précédé d'un « ~ », mais ne bloque plus rien. Panneau Fichiers : le panneau entier défilait, emportant vers le haut l'en-tête, le fil d'Ariane et le pied (occupation disque, bouton .zip) dès qu'il y avait quelques fichiers. Seule la liste défile maintenant ; le pied reste en bas et l'état vide se centre. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
895ff92ed8
commit
b405adea6c
5118 files changed
+1264007
-23
No files matched your search
+678
@@ -0,0 +1,678 @@
|
||||
/**
|
||||
* @import {
|
||||
* Code,
|
||||
* Construct,
|
||||
* State,
|
||||
* TokenizeContext,
|
||||
* Tokenizer
|
||||
* } from 'micromark-util-types'
|
||||
*/
|
||||
|
||||
import { factorySpace } from 'micromark-factory-space';
|
||||
import { asciiAlphanumeric, asciiAlpha, markdownLineEndingOrSpace, markdownLineEnding, markdownSpace } from 'micromark-util-character';
|
||||
/** @type {Construct} */
|
||||
export const htmlText = {
|
||||
name: 'htmlText',
|
||||
tokenize: tokenizeHtmlText
|
||||
};
|
||||
|
||||
/**
|
||||
* @this {TokenizeContext}
|
||||
* Context.
|
||||
* @type {Tokenizer}
|
||||
*/
|
||||
function tokenizeHtmlText(effects, ok, nok) {
|
||||
const self = this;
|
||||
/** @type {NonNullable<Code> | undefined} */
|
||||
let marker;
|
||||
/** @type {number} */
|
||||
let index;
|
||||
/** @type {State} */
|
||||
let returnState;
|
||||
return start;
|
||||
|
||||
/**
|
||||
* Start of HTML (text).
|
||||
*
|
||||
* ```markdown
|
||||
* > | a <b> c
|
||||
* ^
|
||||
* ```
|
||||
*
|
||||
* @type {State}
|
||||
*/
|
||||
function start(code) {
|
||||
effects.enter("htmlText");
|
||||
effects.enter("htmlTextData");
|
||||
effects.consume(code);
|
||||
return open;
|
||||
}
|
||||
|
||||
/**
|
||||
* After `<`, at tag name or other stuff.
|
||||
*
|
||||
* ```markdown
|
||||
* > | a <b> c
|
||||
* ^
|
||||
* > | a <!doctype> c
|
||||
* ^
|
||||
* > | a <!--b--> c
|
||||
* ^
|
||||
* ```
|
||||
*
|
||||
* @type {State}
|
||||
*/
|
||||
function open(code) {
|
||||
if (code === 33) {
|
||||
effects.consume(code);
|
||||
return declarationOpen;
|
||||
}
|
||||
if (code === 47) {
|
||||
effects.consume(code);
|
||||
return tagCloseStart;
|
||||
}
|
||||
if (code === 63) {
|
||||
effects.consume(code);
|
||||
return instruction;
|
||||
}
|
||||
|
||||
// ASCII alphabetical.
|
||||
if (asciiAlpha(code)) {
|
||||
effects.consume(code);
|
||||
return tagOpen;
|
||||
}
|
||||
return nok(code);
|
||||
}
|
||||
|
||||
/**
|
||||
* After `<!`, at declaration, comment, or CDATA.
|
||||
*
|
||||
* ```markdown
|
||||
* > | a <!doctype> c
|
||||
* ^
|
||||
* > | a <!--b--> c
|
||||
* ^
|
||||
* > | a <![CDATA[>&<]]> c
|
||||
* ^
|
||||
* ```
|
||||
*
|
||||
* @type {State}
|
||||
*/
|
||||
function declarationOpen(code) {
|
||||
if (code === 45) {
|
||||
effects.consume(code);
|
||||
return commentOpenInside;
|
||||
}
|
||||
if (code === 91) {
|
||||
effects.consume(code);
|
||||
index = 0;
|
||||
return cdataOpenInside;
|
||||
}
|
||||
if (asciiAlpha(code)) {
|
||||
effects.consume(code);
|
||||
return declaration;
|
||||
}
|
||||
return nok(code);
|
||||
}
|
||||
|
||||
/**
|
||||
* In a comment, after `<!-`, at another `-`.
|
||||
*
|
||||
* ```markdown
|
||||
* > | a <!--b--> c
|
||||
* ^
|
||||
* ```
|
||||
*
|
||||
* @type {State}
|
||||
*/
|
||||
function commentOpenInside(code) {
|
||||
if (code === 45) {
|
||||
effects.consume(code);
|
||||
return commentEnd;
|
||||
}
|
||||
return nok(code);
|
||||
}
|
||||
|
||||
/**
|
||||
* In comment.
|
||||
*
|
||||
* ```markdown
|
||||
* > | a <!--b--> c
|
||||
* ^
|
||||
* ```
|
||||
*
|
||||
* @type {State}
|
||||
*/
|
||||
function comment(code) {
|
||||
if (code === null) {
|
||||
return nok(code);
|
||||
}
|
||||
if (code === 45) {
|
||||
effects.consume(code);
|
||||
return commentClose;
|
||||
}
|
||||
if (markdownLineEnding(code)) {
|
||||
returnState = comment;
|
||||
return lineEndingBefore(code);
|
||||
}
|
||||
effects.consume(code);
|
||||
return comment;
|
||||
}
|
||||
|
||||
/**
|
||||
* In comment, after `-`.
|
||||
*
|
||||
* ```markdown
|
||||
* > | a <!--b--> c
|
||||
* ^
|
||||
* ```
|
||||
*
|
||||
* @type {State}
|
||||
*/
|
||||
function commentClose(code) {
|
||||
if (code === 45) {
|
||||
effects.consume(code);
|
||||
return commentEnd;
|
||||
}
|
||||
return comment(code);
|
||||
}
|
||||
|
||||
/**
|
||||
* In comment, after `--`.
|
||||
*
|
||||
* ```markdown
|
||||
* > | a <!--b--> c
|
||||
* ^
|
||||
* ```
|
||||
*
|
||||
* @type {State}
|
||||
*/
|
||||
function commentEnd(code) {
|
||||
return code === 62 ? end(code) : code === 45 ? commentClose(code) : comment(code);
|
||||
}
|
||||
|
||||
/**
|
||||
* After `<![`, in CDATA, expecting `CDATA[`.
|
||||
*
|
||||
* ```markdown
|
||||
* > | a <![CDATA[>&<]]> b
|
||||
* ^^^^^^
|
||||
* ```
|
||||
*
|
||||
* @type {State}
|
||||
*/
|
||||
function cdataOpenInside(code) {
|
||||
const value = "CDATA[";
|
||||
if (code === value.charCodeAt(index++)) {
|
||||
effects.consume(code);
|
||||
return index === value.length ? cdata : cdataOpenInside;
|
||||
}
|
||||
return nok(code);
|
||||
}
|
||||
|
||||
/**
|
||||
* In CDATA.
|
||||
*
|
||||
* ```markdown
|
||||
* > | a <![CDATA[>&<]]> b
|
||||
* ^^^
|
||||
* ```
|
||||
*
|
||||
* @type {State}
|
||||
*/
|
||||
function cdata(code) {
|
||||
if (code === null) {
|
||||
return nok(code);
|
||||
}
|
||||
if (code === 93) {
|
||||
effects.consume(code);
|
||||
return cdataClose;
|
||||
}
|
||||
if (markdownLineEnding(code)) {
|
||||
returnState = cdata;
|
||||
return lineEndingBefore(code);
|
||||
}
|
||||
effects.consume(code);
|
||||
return cdata;
|
||||
}
|
||||
|
||||
/**
|
||||
* In CDATA, after `]`, at another `]`.
|
||||
*
|
||||
* ```markdown
|
||||
* > | a <![CDATA[>&<]]> b
|
||||
* ^
|
||||
* ```
|
||||
*
|
||||
* @type {State}
|
||||
*/
|
||||
function cdataClose(code) {
|
||||
if (code === 93) {
|
||||
effects.consume(code);
|
||||
return cdataEnd;
|
||||
}
|
||||
return cdata(code);
|
||||
}
|
||||
|
||||
/**
|
||||
* In CDATA, after `]]`, at `>`.
|
||||
*
|
||||
* ```markdown
|
||||
* > | a <![CDATA[>&<]]> b
|
||||
* ^
|
||||
* ```
|
||||
*
|
||||
* @type {State}
|
||||
*/
|
||||
function cdataEnd(code) {
|
||||
if (code === 62) {
|
||||
return end(code);
|
||||
}
|
||||
if (code === 93) {
|
||||
effects.consume(code);
|
||||
return cdataEnd;
|
||||
}
|
||||
return cdata(code);
|
||||
}
|
||||
|
||||
/**
|
||||
* In declaration.
|
||||
*
|
||||
* ```markdown
|
||||
* > | a <!b> c
|
||||
* ^
|
||||
* ```
|
||||
*
|
||||
* @type {State}
|
||||
*/
|
||||
function declaration(code) {
|
||||
if (code === null || code === 62) {
|
||||
return end(code);
|
||||
}
|
||||
if (markdownLineEnding(code)) {
|
||||
returnState = declaration;
|
||||
return lineEndingBefore(code);
|
||||
}
|
||||
effects.consume(code);
|
||||
return declaration;
|
||||
}
|
||||
|
||||
/**
|
||||
* In instruction.
|
||||
*
|
||||
* ```markdown
|
||||
* > | a <?b?> c
|
||||
* ^
|
||||
* ```
|
||||
*
|
||||
* @type {State}
|
||||
*/
|
||||
function instruction(code) {
|
||||
if (code === null) {
|
||||
return nok(code);
|
||||
}
|
||||
if (code === 63) {
|
||||
effects.consume(code);
|
||||
return instructionClose;
|
||||
}
|
||||
if (markdownLineEnding(code)) {
|
||||
returnState = instruction;
|
||||
return lineEndingBefore(code);
|
||||
}
|
||||
effects.consume(code);
|
||||
return instruction;
|
||||
}
|
||||
|
||||
/**
|
||||
* In instruction, after `?`, at `>`.
|
||||
*
|
||||
* ```markdown
|
||||
* > | a <?b?> c
|
||||
* ^
|
||||
* ```
|
||||
*
|
||||
* @type {State}
|
||||
*/
|
||||
function instructionClose(code) {
|
||||
return code === 62 ? end(code) : instruction(code);
|
||||
}
|
||||
|
||||
/**
|
||||
* After `</`, in closing tag, at tag name.
|
||||
*
|
||||
* ```markdown
|
||||
* > | a </b> c
|
||||
* ^
|
||||
* ```
|
||||
*
|
||||
* @type {State}
|
||||
*/
|
||||
function tagCloseStart(code) {
|
||||
// ASCII alphabetical.
|
||||
if (asciiAlpha(code)) {
|
||||
effects.consume(code);
|
||||
return tagClose;
|
||||
}
|
||||
return nok(code);
|
||||
}
|
||||
|
||||
/**
|
||||
* After `</x`, in a tag name.
|
||||
*
|
||||
* ```markdown
|
||||
* > | a </b> c
|
||||
* ^
|
||||
* ```
|
||||
*
|
||||
* @type {State}
|
||||
*/
|
||||
function tagClose(code) {
|
||||
// ASCII alphanumerical and `-`.
|
||||
if (code === 45 || asciiAlphanumeric(code)) {
|
||||
effects.consume(code);
|
||||
return tagClose;
|
||||
}
|
||||
return tagCloseBetween(code);
|
||||
}
|
||||
|
||||
/**
|
||||
* In closing tag, after tag name.
|
||||
*
|
||||
* ```markdown
|
||||
* > | a </b> c
|
||||
* ^
|
||||
* ```
|
||||
*
|
||||
* @type {State}
|
||||
*/
|
||||
function tagCloseBetween(code) {
|
||||
if (markdownLineEnding(code)) {
|
||||
returnState = tagCloseBetween;
|
||||
return lineEndingBefore(code);
|
||||
}
|
||||
if (markdownSpace(code)) {
|
||||
effects.consume(code);
|
||||
return tagCloseBetween;
|
||||
}
|
||||
return end(code);
|
||||
}
|
||||
|
||||
/**
|
||||
* After `<x`, in opening tag name.
|
||||
*
|
||||
* ```markdown
|
||||
* > | a <b> c
|
||||
* ^
|
||||
* ```
|
||||
*
|
||||
* @type {State}
|
||||
*/
|
||||
function tagOpen(code) {
|
||||
// ASCII alphanumerical and `-`.
|
||||
if (code === 45 || asciiAlphanumeric(code)) {
|
||||
effects.consume(code);
|
||||
return tagOpen;
|
||||
}
|
||||
if (code === 47 || code === 62 || markdownLineEndingOrSpace(code)) {
|
||||
return tagOpenBetween(code);
|
||||
}
|
||||
return nok(code);
|
||||
}
|
||||
|
||||
/**
|
||||
* In opening tag, after tag name.
|
||||
*
|
||||
* ```markdown
|
||||
* > | a <b> c
|
||||
* ^
|
||||
* ```
|
||||
*
|
||||
* @type {State}
|
||||
*/
|
||||
function tagOpenBetween(code) {
|
||||
if (code === 47) {
|
||||
effects.consume(code);
|
||||
return end;
|
||||
}
|
||||
|
||||
// ASCII alphabetical and `:` and `_`.
|
||||
if (code === 58 || code === 95 || asciiAlpha(code)) {
|
||||
effects.consume(code);
|
||||
return tagOpenAttributeName;
|
||||
}
|
||||
if (markdownLineEnding(code)) {
|
||||
returnState = tagOpenBetween;
|
||||
return lineEndingBefore(code);
|
||||
}
|
||||
if (markdownSpace(code)) {
|
||||
effects.consume(code);
|
||||
return tagOpenBetween;
|
||||
}
|
||||
return end(code);
|
||||
}
|
||||
|
||||
/**
|
||||
* In attribute name.
|
||||
*
|
||||
* ```markdown
|
||||
* > | a <b c> d
|
||||
* ^
|
||||
* ```
|
||||
*
|
||||
* @type {State}
|
||||
*/
|
||||
function tagOpenAttributeName(code) {
|
||||
// ASCII alphabetical and `-`, `.`, `:`, and `_`.
|
||||
if (code === 45 || code === 46 || code === 58 || code === 95 || asciiAlphanumeric(code)) {
|
||||
effects.consume(code);
|
||||
return tagOpenAttributeName;
|
||||
}
|
||||
return tagOpenAttributeNameAfter(code);
|
||||
}
|
||||
|
||||
/**
|
||||
* After attribute name, before initializer, the end of the tag, or
|
||||
* whitespace.
|
||||
*
|
||||
* ```markdown
|
||||
* > | a <b c> d
|
||||
* ^
|
||||
* ```
|
||||
*
|
||||
* @type {State}
|
||||
*/
|
||||
function tagOpenAttributeNameAfter(code) {
|
||||
if (code === 61) {
|
||||
effects.consume(code);
|
||||
return tagOpenAttributeValueBefore;
|
||||
}
|
||||
if (markdownLineEnding(code)) {
|
||||
returnState = tagOpenAttributeNameAfter;
|
||||
return lineEndingBefore(code);
|
||||
}
|
||||
if (markdownSpace(code)) {
|
||||
effects.consume(code);
|
||||
return tagOpenAttributeNameAfter;
|
||||
}
|
||||
return tagOpenBetween(code);
|
||||
}
|
||||
|
||||
/**
|
||||
* Before unquoted, double quoted, or single quoted attribute value, allowing
|
||||
* whitespace.
|
||||
*
|
||||
* ```markdown
|
||||
* > | a <b c=d> e
|
||||
* ^
|
||||
* ```
|
||||
*
|
||||
* @type {State}
|
||||
*/
|
||||
function tagOpenAttributeValueBefore(code) {
|
||||
if (code === null || code === 60 || code === 61 || code === 62 || code === 96) {
|
||||
return nok(code);
|
||||
}
|
||||
if (code === 34 || code === 39) {
|
||||
effects.consume(code);
|
||||
marker = code;
|
||||
return tagOpenAttributeValueQuoted;
|
||||
}
|
||||
if (markdownLineEnding(code)) {
|
||||
returnState = tagOpenAttributeValueBefore;
|
||||
return lineEndingBefore(code);
|
||||
}
|
||||
if (markdownSpace(code)) {
|
||||
effects.consume(code);
|
||||
return tagOpenAttributeValueBefore;
|
||||
}
|
||||
effects.consume(code);
|
||||
return tagOpenAttributeValueUnquoted;
|
||||
}
|
||||
|
||||
/**
|
||||
* In double or single quoted attribute value.
|
||||
*
|
||||
* ```markdown
|
||||
* > | a <b c="d"> e
|
||||
* ^
|
||||
* ```
|
||||
*
|
||||
* @type {State}
|
||||
*/
|
||||
function tagOpenAttributeValueQuoted(code) {
|
||||
if (code === marker) {
|
||||
effects.consume(code);
|
||||
marker = undefined;
|
||||
return tagOpenAttributeValueQuotedAfter;
|
||||
}
|
||||
if (code === null) {
|
||||
return nok(code);
|
||||
}
|
||||
if (markdownLineEnding(code)) {
|
||||
returnState = tagOpenAttributeValueQuoted;
|
||||
return lineEndingBefore(code);
|
||||
}
|
||||
effects.consume(code);
|
||||
return tagOpenAttributeValueQuoted;
|
||||
}
|
||||
|
||||
/**
|
||||
* In unquoted attribute value.
|
||||
*
|
||||
* ```markdown
|
||||
* > | a <b c=d> e
|
||||
* ^
|
||||
* ```
|
||||
*
|
||||
* @type {State}
|
||||
*/
|
||||
function tagOpenAttributeValueUnquoted(code) {
|
||||
if (code === null || code === 34 || code === 39 || code === 60 || code === 61 || code === 96) {
|
||||
return nok(code);
|
||||
}
|
||||
if (code === 47 || code === 62 || markdownLineEndingOrSpace(code)) {
|
||||
return tagOpenBetween(code);
|
||||
}
|
||||
effects.consume(code);
|
||||
return tagOpenAttributeValueUnquoted;
|
||||
}
|
||||
|
||||
/**
|
||||
* After double or single quoted attribute value, before whitespace or the end
|
||||
* of the tag.
|
||||
*
|
||||
* ```markdown
|
||||
* > | a <b c="d"> e
|
||||
* ^
|
||||
* ```
|
||||
*
|
||||
* @type {State}
|
||||
*/
|
||||
function tagOpenAttributeValueQuotedAfter(code) {
|
||||
if (code === 47 || code === 62 || markdownLineEndingOrSpace(code)) {
|
||||
return tagOpenBetween(code);
|
||||
}
|
||||
return nok(code);
|
||||
}
|
||||
|
||||
/**
|
||||
* In certain circumstances of a tag where only an `>` is allowed.
|
||||
*
|
||||
* ```markdown
|
||||
* > | a <b c="d"> e
|
||||
* ^
|
||||
* ```
|
||||
*
|
||||
* @type {State}
|
||||
*/
|
||||
function end(code) {
|
||||
if (code === 62) {
|
||||
effects.consume(code);
|
||||
effects.exit("htmlTextData");
|
||||
effects.exit("htmlText");
|
||||
return ok;
|
||||
}
|
||||
return nok(code);
|
||||
}
|
||||
|
||||
/**
|
||||
* At eol.
|
||||
*
|
||||
* > 👉 **Note**: we can’t have blank lines in text, so no need to worry about
|
||||
* > empty tokens.
|
||||
*
|
||||
* ```markdown
|
||||
* > | a <!--a
|
||||
* ^
|
||||
* | b-->
|
||||
* ```
|
||||
*
|
||||
* @type {State}
|
||||
*/
|
||||
function lineEndingBefore(code) {
|
||||
effects.exit("htmlTextData");
|
||||
effects.enter("lineEnding");
|
||||
effects.consume(code);
|
||||
effects.exit("lineEnding");
|
||||
return lineEndingAfter;
|
||||
}
|
||||
|
||||
/**
|
||||
* After eol, at optional whitespace.
|
||||
*
|
||||
* > 👉 **Note**: we can’t have blank lines in text, so no need to worry about
|
||||
* > empty tokens.
|
||||
*
|
||||
* ```markdown
|
||||
* | a <!--a
|
||||
* > | b-->
|
||||
* ^
|
||||
* ```
|
||||
*
|
||||
* @type {State}
|
||||
*/
|
||||
function lineEndingAfter(code) {
|
||||
// Always populated by defaults.
|
||||
|
||||
return markdownSpace(code) ? factorySpace(effects, lineEndingAfterPrefix, "linePrefix", self.parser.constructs.disable.null.includes('codeIndented') ? undefined : 4)(code) : lineEndingAfterPrefix(code);
|
||||
}
|
||||
|
||||
/**
|
||||
* After eol, after optional whitespace.
|
||||
*
|
||||
* > 👉 **Note**: we can’t have blank lines in text, so no need to worry about
|
||||
* > empty tokens.
|
||||
*
|
||||
* ```markdown
|
||||
* | a <!--a
|
||||
* > | b-->
|
||||
* ^
|
||||
* ```
|
||||
*
|
||||
* @type {State}
|
||||
*/
|
||||
function lineEndingAfterPrefix(code) {
|
||||
effects.enter("htmlTextData");
|
||||
return returnState(code);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user