annotate .cms/lib/codemirror/src/display/highlight_worker.js @ 0:78edf6b517a0 draft

24.10
author Coffee CMS <info@coffee-cms.ru>
date Fri, 11 Oct 2024 22:40:23 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
1 import { getContextBefore, highlightLine, processLine } from "../line/highlight.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
2 import { copyState } from "../modes.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
3 import { bind } from "../util/misc.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
4
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
5 import { runInOp } from "./operations.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
6 import { regLineChange } from "./view_tracking.js"
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
7
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
8 // HIGHLIGHT WORKER
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
9
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
10 export function startWorker(cm, time) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
11 if (cm.doc.highlightFrontier < cm.display.viewTo)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
12 cm.state.highlight.set(time, bind(highlightWorker, cm))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
13 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
14
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
15 function highlightWorker(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
16 let doc = cm.doc
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
17 if (doc.highlightFrontier >= cm.display.viewTo) return
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
18 let end = +new Date + cm.options.workTime
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
19 let context = getContextBefore(cm, doc.highlightFrontier)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
20 let changedLines = []
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
21
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
22 doc.iter(context.line, Math.min(doc.first + doc.size, cm.display.viewTo + 500), line => {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
23 if (context.line >= cm.display.viewFrom) { // Visible
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
24 let oldStyles = line.styles
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
25 let resetState = line.text.length > cm.options.maxHighlightLength ? copyState(doc.mode, context.state) : null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
26 let highlighted = highlightLine(cm, line, context, true)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
27 if (resetState) context.state = resetState
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
28 line.styles = highlighted.styles
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
29 let oldCls = line.styleClasses, newCls = highlighted.classes
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
30 if (newCls) line.styleClasses = newCls
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
31 else if (oldCls) line.styleClasses = null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
32 let ischange = !oldStyles || oldStyles.length != line.styles.length ||
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
33 oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
34 for (let i = 0; !ischange && i < oldStyles.length; ++i) ischange = oldStyles[i] != line.styles[i]
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
35 if (ischange) changedLines.push(context.line)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
36 line.stateAfter = context.save()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
37 context.nextLine()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
38 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
39 if (line.text.length <= cm.options.maxHighlightLength)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
40 processLine(cm, line.text, context)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
41 line.stateAfter = context.line % 5 == 0 ? context.save() : null
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
42 context.nextLine()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
43 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
44 if (+new Date > end) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
45 startWorker(cm, cm.options.workDelay)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
46 return true
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
47 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
48 })
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
49 doc.highlightFrontier = context.line
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
50 doc.modeFrontier = Math.max(doc.modeFrontier, context.line)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
51 if (changedLines.length) runInOp(cm, () => {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
52 for (let i = 0; i < changedLines.length; i++)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
53 regLineChange(cm, changedLines[i], "text")
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
54 })
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
55 }