FluentUI: urejevalniki in prikaz kode
1. Pregled in namen
Stanje: mešano — štirje gradniki [Live] (vsak z lastnim
nosilcem, vključno s codeEditor()) plus preklop
urejevalnik/označevanje (preklop WYSIWYG, namerno voden zunaj te strani
— nosilec wvdsmd), navedeno po odseku.
Ta stran razvršča štiri različne gradnike urejevalnika/prikaza kode in poveže vsak vir resnice — ne nadomešča nobene dokumentacije vtičnikov. Ciljna publika: vsak razvijalec, ki se mora odločiti, kateri gradnik je pravi za „prikaz kode„ proti „urejanje kode“ proti „urejanje vsebine wiki„ (odsek 5).
2. Predpogoji
- Za
codeEditor(): DokuWiki z omogočenim vtičnikomwkfluentuiin naloženimhelper_plugin_wkfluentui_widgets. - Za GeSHi: nobenih — osnovna funkcija, vedno na voljo.
- Za urejevalnik Markdown: omogočen vtičnik
wvdsmd, stran nosi oznako Markdown (samodejno zaznano).
3. Pojmi
Skupen vzorec vseh štirih gradnikov: postopno izboljšanje nad delujočim textarea — ista konvencija kot pri razširitvah JS Helper-API (brez druge poti kode, izris ostane format shranjevanja).
| Gradnik | Kaj je to | Uporaba | Nosilec / vir resnice | Stanje |
|---|---|---|---|---|
| GeSHi (izris kode) | Skladenjsko poudarjanje ob izrisu — ni urejevalnik, brez lastnega API-ja | <code sql>…</code>/<file> v besedilu wiki in fenced-code-bloki (```lang) v vdelavah Markdown ({{md>…}} / <markdown>); oznaka jezika = ime jezika GeSHi | Jedro DokuWiki (inc/parser/xhtml.php → vključen GeSHi); videz prek žetonov --wk-wiki-code-* | izvedeno (jedro) |
| Urejevalnik izvorne kode | CodeMirror, postopno nad navadnim <textarea> — brez JavaScripta textarea ostane povsem funkcionalna | vsak administratorski modul prek codeEditor() (prvi porabnik: SQL Workbench v wksqliteds) | skupna kopija pod wkfluentui/cm/ + gradnik codeEditor() (pogodba: odseka 6/7 spodaj) | izvedeno |
| Standardni urejevalnik DokuWiki | jedrni urejevalnik strani: orodna vrstica (krepko/povezava/…) + textarea + predogled, tok osnutka/zaklepa | vsaka wiki-stran, do=edit | Jedro DokuWiki | izvedeno (jedro) |
| Urejevalnik Markdown | vključen EasyMDE nadomesti textarea na straneh Markdown; vrstica oznake ostane nevidna, tok shranjevanja/osnutka DokuWiki nespremenjen; rezervni način brez JS = textarea | strani z oznako Markdown (samodejno zaznano) | vtičnik wvdsmd — vir resnice: Markdown (wvdsmd) | izvedeno |
4. Prvi koraki
Minimalen primer: aktivirati urejevalnik CodeMirror prek obstoječega textarea SQL.
/** @var helper_plugin_wkfluentui_widgets $widgets */
$widgets = plugin_load('helper', 'wkfluentui_widgets');
?>
<textarea id="sql-input" name="sql"></textarea>
<?php echo $widgets->codeEditor('sql-input', 'sql'); ?>
Napačno: usmeriti codeEditor() na textarea, ki ob klicu še ni v
DOM (npr. klic pred oznako <textarea>). Aktivacijski izris
napotuje prek id na element, ki mora obstajati — vrstni red v zgornjem
primeru (textarea najprej) je zavezujoč.
5. Uporaba: vodnik „kateri gradnik za kaj"
| Potreba | Gradnik |
|---|---|
| Prikazati kodo v vsebini | <code lang> (GeSHi) — nikoli vdelati urejevalnika |
| Urediti kodo/SQL v administratorskem modulu | codeEditor() (en klic ob textarea, brez potrebe po vtičniku-lokalnem vendoringu) |
| Urediti vsebino wiki | jedrni urejevalnik; strani Markdown samodejno prek wvdsmd |
| Brez obnove urejevalnikov v slogu Monaco/VS Code | namerna meja, tako kot mehanika postavitve (layout) |
6. API referenca: codeEditor()
| Metapodatek | Vrednost |
|---|---|
| Jezik | PHP |
| Imenski prostor | helper_plugin_wkfluentui_widgets |
| Datoteka | lib/plugins/wkfluentui/helper/widgets.php |
| Vidnost | public |
| Stabilnost | stabilno (raven 1) |
public function codeEditor(string $textareaId, string $language, array $opts = []): string
Povzetek: priskrbi aktivacijski izris brez <script>
(atributi data-wk-code-editor) za obstoječo, poimenovano
textarea; scripts/codeeditor.js (postopno izboljšanje) jo ob
nalaganju nadomesti z instanco CodeMirror.
Vrnjena vrednost: string — aktivacijski izris. Prazen niz pri
neznani oznaki $language ali praznem $textareaId — v obeh
primerih textarea ostane nedotaknjena, navadna textarea, brez napake.
7. Parametri, možnosti in stanja
| Parameter | Tip | Obvezno | Opis |
|---|---|---|---|
$textareaId | string | Da | id obstoječega ciljnega textarea |
$language | string | Da | ena od sql|php|css|javascript|markdown; vsaka druga oznaka vrne prazen niz |
$opts['submitId'] | string | Ne | id gumba za pošiljanje, ki ga klikne Ctrl+Enter — urejevalnik prej sinhronizira v textarea |
Dostop do instance (odjemalec): wkCodeEditor.get(textareaId) —
null, dokler/če CodeMirror ni naložen; razrešiti ob kliku, ne ob
gradnji strani. Dogodek wk-codeeditor-ready se dodatno sproži na
textarea.
Leno nalaganje: sredstva vendor se naložijo le na straneh z vsaj eno aktivacijsko oznako — brez povečanja obsega po celotnem spletnem mestu.
Vendoring (utemeljen popravek specifikacije): skupna kopija
CodeMirror (5.65.16 + načini sql/php/css/javascript/markdown skupaj z
odvisnostmi clike/xml/htmlmixed, datoteka licence MIT) leži pod
wkfluentui/cm/ — ne v prvotno začrtanem vendor/cm/, ker
spletna plast DokuWiki zavrne neposreden dostop do map vendor/
(empirično preverjeno na tej instanci, 404).
Vedenje ob napaki:
| Pogoj | Vedenje |
|---|---|
neznana oznaka $language | vrne prazen niz, textarea ostane nedotaknjena |
prazen $textareaId | vrne prazen niz |
| ciljna textarea ne obstaja v DOM | brez napake PHP (gradnik ne preverja DOM); scripts/codeeditor.js ob nalaganju ne najde cilja in ničesar ne aktivira — tiha degradacija na strani odjemalca |
8. Popolni primeri: preklop urejevalnik ↔ označevanje [Live]
Nosilec wvdsmd — vir: lib/plugins/wvdsmd/script.js.
Na straneh Markdown orodna vrstica EasyMDE nosi preklop med pogledom
urejevalnika (EasyMDE z orodno vrstico oblikovanja in predogledom) in
pogledom označevanja (surova textarea, vključno z vidno vrstico
oznake — enako stanju brez JS). Preklop deluje kadar koli v obe smeri in
učinkuje takoj, brez shranjevanja; nazadnje izbrani pogled si sistem
zapomni po uporabniku (localStorage,
wk-editor-view:<login>); vsak preklop se naznani prek regije
aria-live. Lastnosti:
- Označevanje ostane format shranjevanja (Markdown) — oba pogleda urejata isto osnovno textarea, brez ponovne serializacije, zato so preklopi po zasnovi brez izgub (bajtno enako izvorno besedilo, potrjeno v testnem zagonu).
- Rezervni način brez JS ostane surova textarea; preklop obstaja le v pogledu, izboljšanem z JS.
- Strani s sintakso DokuWiki ohranijo jedrni urejevalnik z lastno orodno vrstico sintakse in gumbom „predogled“ — tam obstaja le en pogled urejanja, preklop bi bil brez pomena.
Poglobitev — konkretni ukazi orodne vrstice: dve podstrani dokumentirata, katere žetone sintakse DokuWiki/Markdown vstavljajo orodne vrstice urejevalnika (EasyMDE za Markdown, jedrna orodna vrstica za sintakso DokuWiki), po shemi kategorij predstavitvenega nabora DevExpress ASPxHtmlEditor (https://demos.devexpress.com/ASPxHTMLEditorDemos/Default.aspx), a prenesenih na dejanski ciljni format te knjižnice namesto splošnih oznak HTML:
- Oblikovanje — znakovne/odstavkovne oblike kot žetoni sintakse
- Tabele in mediji — sintaksa tabel, medijev in povezav
9. Omejitve in robni primeri
- GeSHi določi seznam jezikov; neznane oznake se izrišejo kot navadno besedilo (brez napake). Enako velja v vdelavah Markdown:
ParsedownRendererpriwvdsdwmdpoudari fenced-bloke z znano oznako jezika prek poti GeSHi DokuWiki (p_xhtml_cached_geshi()); bloki brez oznake ali z neznano oznako ostanejo surovi Parsedown<pre>— degradirano, nikoli izgubljeno. Oznaka pogonaparsedown-1.7.4-geshi1izniči stare predpomnilnike. - CodeMirror/EasyMDE sta vključena (brez povezave, brez odvisnosti od CDN) — posodobitve so namerne, različicirane spremembe vtičnika.
- Površine urejevalnika ležijo v panelu z vsebino in sledijo receptu zapolnjevanja panela iz datagrid (sestavine 1–3 veljajo enako za urejevalnike).
- Brez obnove urejevalnikov v slogu Monaco/VS Code (odsek 5).
10. Dostopnost in združljivost
- Celoten pregled: Accessibility (konsolidirano, tu ni podvojeno).
- Brez JavaScripta vsak gradnik ostane navadna, povsem dostopna textarea.
- CodeMirror/EasyMDE sta vključena — združljivost brskalnikov sledi lastnim opombam izdaje vsakega ponudnika (v tej knjižnici ni ločeno testirano).
11. Odpravljanje težav
Simptom: codeEditor() ne izriše ničesar (prazen niz), čeprav
textarea in jezik izgledata pravilno.
Vzrok: $language nosi oznako zunaj
sql/php/css/javascript/markdown (paziti na velike/male
črke — preverjanje je natančno, brez normalizacije).
Rešitev: preveriti oznako glede na natančen seznam v odseku 7.
Simptom: fenced-code-blok Markdown ni poudarjen.
Vzrok: neznana ali manjkajoča oznaka jezika za tremi obrnjenimi narekovaji, ali predpomnilnik še nosi staro oznako pogona.
Rešitev: preveriti oznako jezika glede na seznam GeSHi; ob sumu na
zastarel predpomnilnik: oznaka pogona parsedown-1.7.4-geshi1 vsili
izničenje.
12. Sorodne teme
- DW-urejevalnik: oblikovanje · DW-urejevalnik: tabele in mediji — poglobitev orodne vrstice oblikovanja
- DW-urejevalnik: Adaptivity · DW-urejevalnik: Accessibility — Adaptivity/Accessibility
- Markdown (wvdsmd) — avtorstvo Markdown (oznaka, EasyMDE, uvoz/izvoz)
- SQLite Data Studio: Admin-Oberfläche — SQL Workbench (porabnik CodeMirror)
- FluentUI: namizni DataGrid — predstavitveni pregled · FluentUI: skrbniško območje podrobno — paneli, v katerih živijo urejevalniki
- FluentUI: javni API pomočnika — konvencija „postopno izboljšanje„