Support for grammar rule category enable/disable

This commit is contained in:
Simon Rozman 2024-08-05 15:48:57 +02:00
parent 6740b14a17
commit eef106c53f
3 changed files with 123 additions and 6 deletions

View File

@ -61,6 +61,32 @@ BesService.registerByElement(el)
Po potrebi lahko spremljamo dogodke v servisu tako, da ob registraciji servisa dodamo instanco razreda, v katerem implementiramo metode, ki jih servis kliče ob posameznih dogodkih. Primer takega razreda, ki doda prikaz statusne ikone, je v datoteki `samples\common.js`.
### Kategorije pravopisnih pravil
Privzeto servis preverja vnaprej določen nabor pravopisnih pravil. Pravila so razdeljena v kategorije (skupine) in za vsak servis posebej lahko vklapljamo ali izklapljamo vsa pravopisna pravila iz določene kategorije z uporabo metod `enableCategory()` in `disableCategory()`.
Primer:
```JavaScript
// Registriramo servis za naš urejevalnik.
BesService
.registerByElement(el)
.enableCategory('BESANA_CAT_6')
.disableCategory('BESANA_CAT_1')
.disableCategory('BESANA_CAT_2')
```
Kategorije pravopisnih pravil so:
ID | opis
-------------+------------------------------------------------
BESANA_CAT_1 | strogo slogovne napake
BESANA_CAT_2 | slogovne napake
BESANA_CAT_3 | slogovno-slovnične napake
BESANA_CAT_4 | strogo slovnične napake
BESANA_CAT_5 | slovnične napake
BESANA_CAT_6 | nomotehnične napake (potrebuje posebno licenco)
## Navodila za razvijalce
Programsko kodo v tem repozitoriju razvijamo s programom Visual Studio Code. Potrebna je namestitev vtičnika `esbenp.prettier-vscode`.

View File

@ -0,0 +1,31 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>BesService &lt;div contenteditable="true"&gt; Example</title>
<link rel="stylesheet" href="../styles.css" />
<link rel="stylesheet" href="styles.css" />
<script>const besUrl = 'http://localhost:225/api/v2';</script>
<script src="../service.js"></script>
<script src="common.js"></script>
</head>
<body>
<p class="my-block">This is an example of a simple <code>&lt;div contenteditable="true"&gt;</code> edit control with style grammar rules disabled. Compare the proofing results with <a href="div-contenteditable.html">the default example</a>.</p>
<div id="my-editor" class="my-block my-control" contenteditable="true">
<p>Tukaj vpišite besedilo ki ga želite popraviti.</p>
<p>Prišla je njena lepa hčera. Smatram da tega nebi bilo potrebno storiti. Predavanje je trajalo dve ure. S njim grem v Kamnik. Janez jutri nebo prišel. Prišel je z 100 idejami.</p>
<p>To velja tudi v Bledu. To se je zgodilo na velikemu vrtu. Prišel je na Kamnik. On je včeraj prišel z svojo torbo. Dve žemlje prosim. Pogosto brskam po temu forumu. Prišel je včeraj in sicer s otroci. To ne vem. Pogleda vse kar daš v odložišče. Nisem jo videl. Ona izgleda dobro. Pri zanikanju ne smete uporabljati tožilnik. Vlak gre v Ljubljano čez Zidani Most. Skočil je čez okno. Slovenija meji na avstrijo. Jaz pišem v Slovenščini vsak Torek. Novica, da je skupina 25 planincev hodila pod vodstvom gorskega vodnika je napačna in zavajujoča. Želim da poješ kosmizailo. Jaz pogosto brskam po temu forumu. Med tem ko je iskal ključe, so se odprla vrata. V takoimenovanem skladišču je bilo veliko ljudi. V sobi sta dve mize. Stekel je h mami. Videl sem Jurčič Micko. To je bil njegov življenski cilj. Po vrsti popravite vse kar želite. Preden zaspiva mi prebere pravljico. Prišel je s stricom. Oni zadanejo tarčo. Mi gremo teči po polju. Mi gremo peči kruh. Usedel se je k miza. Postreži kosilo! Skul je veslanje z dvemi vesli.</p>
<p>Na mizo nisem položil knjigo.</p>
<p>Kvazimodo ji je ponavadi prinesel hrano in pijačo, medtem ko je spala, da ne bi videla njegov iznakažen in grd obraz. Poleg tega ji je pustil tudi piščalko, da bi ga lahko priklicala, če bi bilo to potrebno. Kvazimodo se je odločil, da razveseli Esmeraldo in ji obljubi, da ji bo pripeljal Febusa. Toda Febus ni želel priti. Kvazimodo ji je raje lagal, da ni mogel najti Febusa, kot da Esmeraldi pove resnico, ker bi ona trpela.</p>
</div>
<bes-popup-el/>
<script>
BesService
.registerByElement(document.getElementById('my-editor'), new BesStatusIconEventSink())
.enableCategory('BESANA_CAT_6')
.disableCategory('BESANA_CAT_1')
.disableCategory('BESANA_CAT_2')
</script>
</body>
</html>

View File

@ -36,6 +36,8 @@ class BesService {
this.hostElement = hostElement
this.textElement = textElement
this.eventSink = eventSink
this.enabledCategories = []
this.disabledCategories = []
this.results = [] // Results of grammar-checking, one per each block/paragraph of text
this.createCorrectionPanel()
@ -132,6 +134,42 @@ class BesService {
BesService.getServiceByElement(hostElement)?.unregister()
}
/**
* Enables all grammar rules of the given category.
*
* @param {String} cat Category ID. For the list of category IDs, see Readme.md.
*/
enableCategory(cat) {
this.enabledCategories.push(cat)
this.disabledCategories = this.disabledCategories.filter(
value => value !== cat
)
if (this.timer) clearTimeout(this.timer)
this.timer = setTimeout(() => {
this.proofAll()
delete this.timer
}, 10)
return this
}
/**
* Disables all grammar rules of the given category.
*
* @param {String} cat Category ID. For the list of category IDs, see Readme.md.
*/
disableCategory(cat) {
this.enabledCategories = this.enabledCategories.filter(
value => value !== cat
)
this.disabledCategories.push(cat)
if (this.timer) clearTimeout(this.timer)
this.timer = setTimeout(() => {
this.proofAll()
delete this.timer
}, 10)
return this
}
/**
* Called initially when grammar-checking run is started
*/
@ -518,7 +556,10 @@ class BesTreeService extends BesService {
x.markup ? { markup: x.text } : { text: x.text }
)
}),
language: node.lang ? node.lang : 'sl'
language: node.lang ? node.lang : 'sl',
enabledCategories: this.enabledCategories.join(','),
disabledCategories: this.disabledCategories.join(','),
enabledOnly: 'false'
})
}),
{ signal }
@ -845,7 +886,11 @@ class BesDOMService extends BesTreeService {
service = new BesDOMService(hostElement, eventSink)
if (service.eventSink && 'register' in service.eventSink)
service.eventSink.register(service)
service.proofAll()
// Defer proofing giving user a chance to configure the service.
service.timer = setTimeout(() => {
service.proofAll()
delete service.timer
}, 10)
return service
}
@ -933,7 +978,11 @@ class BesCKService extends BesTreeService {
service = new BesCKService(hostElement, ckEditorInstance, eventSink)
if (service.eventSink && 'register' in service.eventSink)
service.eventSink.register(service)
service.proofAll()
// Defer proofing giving user a chance to configure the service.
service.timer = setTimeout(() => {
service.proofAll()
delete service.timer
}, 10)
return service
}
@ -1154,7 +1203,10 @@ class BesPlainTextService extends BesService {
}
]
}),
language: this.hostElement.lang ? this.hostElement.lang : 'sl'
language: this.hostElement.lang ? this.hostElement.lang : 'sl',
enabledCategories: this.enabledCategories.join(','),
disabledCategories: this.disabledCategories.join(','),
enabledOnly: 'false'
})
}),
{ signal }
@ -1409,7 +1461,11 @@ class BesDOMPlainTextService extends BesPlainTextService {
service = new BesDOMPlainTextService(hostElement, eventSink)
if (service.eventSink && 'register' in service.eventSink)
service.eventSink.register(service)
service.proofAll()
// Defer proofing giving user a chance to configure the service.
service.timer = setTimeout(() => {
service.proofAll()
delete service.timer
}, 10)
return service
}
@ -1551,7 +1607,11 @@ class BesTAService extends BesPlainTextService {
service = new BesTAService(hostElement, eventSink)
if (service.eventSink && 'register' in service.eventSink)
service.eventSink.register(service)
service.proofAll()
// Defer proofing giving user a chance to configure the service.
service.timer = setTimeout(() => {
service.proofAll()
delete service.timer
}, 10)
return service
}