@gjsify/gtksource-core 0.56.0 → 0.58.0

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.
Files changed (61) hide show
  1. package/lib/esm/buffer-vectors.js +3 -0
  2. package/lib/esm/buffer.js +5 -0
  3. package/lib/esm/coerce.js +1 -0
  4. package/lib/esm/color.js +1 -0
  5. package/lib/esm/conformance.js +1 -0
  6. package/lib/esm/editor-driver.js +0 -0
  7. package/lib/esm/editor-session.js +2 -0
  8. package/lib/esm/fallback-schemes.js +2 -0
  9. package/lib/esm/gutter-paint-vectors.js +8 -0
  10. package/lib/esm/gutter-renderer.js +1 -0
  11. package/lib/esm/gutter.js +1 -0
  12. package/lib/esm/highlight-controller.js +1 -0
  13. package/lib/esm/highlighter.js +1 -0
  14. package/lib/esm/index.js +1 -1
  15. package/lib/esm/init-vectors.js +1 -0
  16. package/lib/esm/init.js +1 -0
  17. package/lib/esm/language-manager.js +1 -0
  18. package/lib/esm/line-store.js +1 -0
  19. package/lib/esm/managers-vectors.js +1 -0
  20. package/lib/esm/signals.js +1 -0
  21. package/lib/esm/style-scheme.js +1 -0
  22. package/lib/esm/text-iter.js +1 -0
  23. package/lib/esm/token-styler.js +1 -0
  24. package/lib/esm/view-vectors.js +1 -0
  25. package/lib/types/buffer-vectors.d.ts +42 -0
  26. package/lib/types/buffer-vectors.gjs.spec.d.ts +2 -0
  27. package/lib/types/buffer-vectors.spec.d.ts +2 -0
  28. package/lib/types/buffer.d.ts +110 -0
  29. package/lib/types/buffer.spec.d.ts +2 -0
  30. package/lib/types/coerce.d.ts +2 -0
  31. package/lib/types/color.d.ts +6 -0
  32. package/lib/types/conformance.d.ts +5 -0
  33. package/lib/types/editor-driver.d.ts +70 -0
  34. package/lib/types/editor-session.d.ts +62 -0
  35. package/lib/types/editor-session.spec.d.ts +2 -0
  36. package/lib/types/fallback-schemes.d.ts +4 -0
  37. package/lib/types/gutter-paint-vectors.d.ts +37 -0
  38. package/lib/types/gutter-renderer.d.ts +115 -0
  39. package/lib/types/gutter.d.ts +20 -0
  40. package/lib/types/gutter.spec.d.ts +2 -0
  41. package/lib/types/highlight-controller.d.ts +24 -0
  42. package/lib/types/highlighter.d.ts +33 -0
  43. package/lib/types/highlighter.spec.d.ts +2 -0
  44. package/lib/types/index.d.ts +16 -0
  45. package/lib/types/init-vectors.d.ts +10 -0
  46. package/lib/types/init.d.ts +1 -0
  47. package/lib/types/init.gjs.spec.d.ts +2 -0
  48. package/lib/types/init.spec.d.ts +2 -0
  49. package/lib/types/language-manager.d.ts +35 -0
  50. package/lib/types/line-store.d.ts +9 -0
  51. package/lib/types/managers-vectors.d.ts +25 -0
  52. package/lib/types/managers-vectors.gjs.spec.d.ts +2 -0
  53. package/lib/types/managers-vectors.spec.d.ts +2 -0
  54. package/lib/types/managers.spec.d.ts +2 -0
  55. package/lib/types/signals.d.ts +12 -0
  56. package/lib/types/style-scheme.d.ts +55 -0
  57. package/lib/types/text-iter.d.ts +21 -0
  58. package/lib/types/token-styler.d.ts +27 -0
  59. package/lib/types/view-vectors.d.ts +85 -0
  60. package/lib/types/view-vectors.gjs.spec.d.ts +2 -0
  61. package/package.json +10 -3
@@ -0,0 +1,3 @@
1
+ import"./_virtual/_rolldown/runtime.js";const e=`héllo
2
+ 😀 wörld`,iterAt=(e,t)=>{let n=e.get_start_iter();return n.set_offset(t),n},bounds=e=>{let[t,n,r]=e.get_selection_bounds();return[t,n.get_offset(),r.get_offset()]},logging=(e,t)=>{let n=[];for(let r of t)e.connect(r,((e,...t)=>{let[i,a]=t;n.push(r===`mark-set`?`${r}:${i.get_offset()}:${a.name}`:r)}));return n},typed=(e,t)=>{e.begin_user_action(),e.insert_at_cursor(t,-1),e.end_user_action()},t=[{rule:`setting text puts the cursor after it, counted in characters`,observe:t=>{let n=new t.Buffer;return n.text=e,[n.cursor_position,bounds(n)]},shows:[13,[!1,13,13]]},{rule:`the two marks are named insert and selection_bound`,observe:e=>{let t=new e.Buffer;return[t.get_insert().name,t.get_selection_bound().name]},shows:[`insert`,`selection_bound`]},{rule:`TextIter.set_offset counts characters; a negative or too large offset is the end`,observe:t=>{let n=new t.Buffer;return n.text=e,[iterAt(n,8).get_offset(),iterAt(n,999).get_offset(),iterAt(n,-1).get_offset()]},shows:[8,13,13]},{rule:`get_text between two iterators`,observe:t=>{let n=new t.Buffer;return n.text=e,n.get_text(n.get_start_iter(),iterAt(n,8),!1)},shows:`héllo
3
+ 😀 `},{rule:`move_mark on insert reports mark-set, then cursor-moved, even for the same place`,observe:t=>{let n=new t.Buffer;n.text=e;let r=logging(n,[`mark-set`,`cursor-moved`]);return n.move_mark(n.get_insert(),iterAt(n,3)),n.move_mark(n.get_insert(),iterAt(n,3)),r},shows:[`mark-set:3:insert`,`cursor-moved`,`mark-set:3:insert`,`cursor-moved`]},{rule:`move_mark on selection_bound reports mark-set only and makes a selection`,observe:t=>{let n=new t.Buffer;n.text=e,n.move_mark(n.get_insert(),iterAt(n,3));let r=logging(n,[`mark-set`,`cursor-moved`]);n.move_mark(n.get_selection_bound(),iterAt(n,5));let[,i,a]=n.get_selection_bounds();return[r,bounds(n),n.get_text(i,a,!1)]},shows:[[`mark-set:5:selection_bound`],[!0,3,5],`lo`]},{rule:`get_selection_bounds is ordered whichever mark is first`,observe:t=>{let n=new t.Buffer;return n.text=e,n.move_mark(n.get_insert(),iterAt(n,5)),n.move_mark(n.get_selection_bound(),iterAt(n,3)),[bounds(n),n.cursor_position]},shows:[[!0,3,5],5]},{rule:`moving a mark to 0 through a handler-built iterator`,observe:t=>{let n=new t.Buffer;n.text=e;let r=[];n.connect(`mark-set`,((e,t,n)=>{r.push([t.get_offset(),n.name])}));let i=n.get_start_iter();return i.set_offset(0),n.move_mark(n.get_insert(),i),[r,n.cursor_position]},shows:[[[0,`insert`]],0]},{rule:`a user action brackets its edits with begin and end, the outermost only`,observe:e=>{let t=new e.Buffer,n=logging(t,[`begin-user-action`,`end-user-action`]);t.begin_user_action(),t.begin_user_action(),t.insert_at_cursor(`a`,-1),t.end_user_action();let r=[...n];return t.end_user_action(),[r,n]},shows:[[`begin-user-action`],[`begin-user-action`,`end-user-action`]]},{rule:`undo and redo of a user action restore the text and report in order`,observe:e=>{let t=new e.Buffer,n=logging(t,[`undo`,`redo`]);typed(t,`abc`);let r=[t.can_undo,t.can_redo];t.undo();let i=[t.text,t.can_undo,t.can_redo,t.cursor_position];return t.redo(),[r,i,t.text,t.cursor_position,n]},shows:[[!0,!1],[``,!1,!0,0],`abc`,3,[`undo`,`redo`]]},{rule:`several edits in one user action are one undo step`,observe:e=>{let t=new e.Buffer;t.begin_user_action(),t.insert_at_cursor(`x`,-1),t.insert_at_cursor(`yz`,-1),t.end_user_action(),t.undo();let n=[t.text,t.can_undo];return t.redo(),[n,t.text]},shows:[[``,!1],`xyz`]},{rule:`an edit outside a user action is undoable too`,observe:e=>{let t=new e.Buffer;t.insert_at_cursor(`abc`,-1);let n=t.can_undo;return t.undo(),[n,t.text]},shows:[!0,``]},{rule:`undoing a delete brings the text and the cursor back, redo deletes again`,observe:e=>{let t=new e.Buffer;t.text=`abcd`,t.begin_user_action(),t.delete(iterAt(t,1),iterAt(t,3)),t.end_user_action();let n=[t.text,t.cursor_position];t.undo();let r=[t.text,t.cursor_position];return t.redo(),[n,r,[t.text,t.cursor_position]]},shows:[[`ad`,2],[`abcd`,4],[`ad`,1]]},{rule:`setting text is not undoable and drops the history`,observe:e=>{let t=new e.Buffer;typed(t,`x`),t.text=`unrec`;let n=[t.can_undo,t.can_redo];return t.undo(),[n,t.text]},shows:[[!1,!1],`unrec`]},{rule:`connect_after runs after the plain handlers, whichever was connected first`,observe:e=>{let t=new e.Buffer,n=[];return t.connect_after(`cursor-moved`,(()=>n.push(`after`))),t.connect(`cursor-moved`,(()=>n.push(`plain`))),t.move_mark(t.get_insert(),t.get_start_iter()),n},shows:[`plain`,`after`]},{rule:`connecting a signal the buffer does not have throws`,observe:e=>{try{return new e.Buffer().connect(`no-such-signal`,(()=>{})),!1}catch{return!0}},shows:!0},{rule:`set_language(null) leaves no language`,observe:e=>{let t=new e.Buffer;return t.set_language(null),t.language},shows:null}];export{t as GTKSOURCE_BUFFER_VECTORS};
@@ -0,0 +1,5 @@
1
+ import"./_virtual/_rolldown/runtime.js";import{SignalEmitter as e}from"./signals.js";import{TextIter as t,TextMark as n}from"./text-iter.js";const r=new Set([`changed`,`mark-set`,`begin-user-action`,`end-user-action`,`undo`,`redo`,`cursor-moved`,`notify::language`,`notify::style-scheme`,`notify::highlight-syntax`,`notify::cursor-position`,`notify::can-undo`,`notify::can-redo`]);var GtkSourceBuffer=class extends e{constructor(e=``){super(),this.lines=[``],this.lineStarts=[0],this.startsValidTo=1,this.cursor=0,this.bound=0,this.insertMark=new n(`insert`),this.boundMark=new n(`selection_bound`),this.undoStack=[],this.redoStack=[],this.open=null,this.depth=0,this.recording=!0,this.reportedUndo=!1,this.reportedRedo=!1,this.lang=null,this.scheme=null,this.highlight=!0;let{text:t=``,highlightSyntax:r=!0}=typeof e==`string`?{text:e}:e;t!==``&&(this.lines=t.split(`
2
+ `)),this.highlight=r!==!1&&String(r)!==`false`}get text(){return this.lines.join(`
3
+ `)}set text(e){this.recording=!1;try{this.replace(0,this.length,e??``),this.placeCursor(this.length)}finally{this.recording=!0}this.undoStack=[],this.redoStack=[],this.open&&(this.open.edits.length=0),this.syncUndoState()}get length(){return this.offsetOfLine(this.lines.length-1)+this.lines[this.lines.length-1].length}get lineCount(){return this.lines.length}getLine(e){let t=this.lines[e];if(t===void 0)throw RangeError(`Buffer: line ${e} is outside 0..${this.lines.length-1}`);return t}getLines(){return[...this.lines]}offsetOfLine(e){if(e<0||e>=this.lines.length)throw RangeError(`Buffer: line ${e} is outside 0..${this.lines.length-1}`);for(;this.startsValidTo<=e;){let e=this.startsValidTo-1;this.lineStarts[this.startsValidTo]=this.lineStarts[e]+this.lines[e].length+1,this.startsValidTo++}return this.lineStarts[e]}lineOfOffset(e){this.checkOffset(e);let t=0,n=this.lines.length-1;for(;t<n;){let r=t+n+1>>1;this.offsetOfLine(r)<=e?t=r:n=r-1}return t}getText(e=0,t=this.length){if(this.checkOffset(e),this.checkOffset(t),e>t)throw RangeError(`Buffer: range ${e}..${t} is reversed`);return this.text.slice(e,t)}insert(e,t){this.replace(e,e,t)}delete(e,t){if(typeof e==`number`&&typeof t==`number`){this.replace(e,t,``);return}let n=typeof e==`number`?e:this.ownIter(e,`delete`),r=typeof t==`number`?t:this.ownIter(t,`delete`);this.replace(Math.min(n,r),Math.max(n,r),``)}replace(e,t,n){if(this.checkOffset(e),this.checkOffset(t),e>t)throw RangeError(`Buffer: range ${e}..${t} is reversed`);let r=this.lineOfOffset(e),i=this.lineOfOffset(t),a=this.offsetOfLine(r),o=this.offsetOfLine(i),s=this.lines.slice(r,i+1).join(`
4
+ `).slice(e-a,t-a);if(s===``&&n===``)return;let c=(this.lines[r].slice(0,e-a)+n+this.lines[i].slice(t-o)).split(`
5
+ `);this.lines.splice(r,i-r+1,...c),this.startsValidTo=Math.min(this.startsValidTo,r+1);let l=this.cursor,shift=r=>r>=t?r-s.length+n.length:r>e?e+n.length:r;this.cursor=shift(this.cursor),this.bound=shift(this.bound);let u={start:e,removedText:s,insertedText:n,firstLine:r,removedLines:i-r+1,insertedLines:c.length};this.record(u,l),this.emit(`changed`,u),this.cursor!==l&&this.emit(`notify::cursor-position`),this.emit(`cursor-moved`)}get cursorPosition(){return this.cursor}get cursor_position(){return new t(this,this.cursor).get_offset()}get selectionBoundPosition(){return this.bound}selectRange(e,t){this.checkOffset(e),this.checkOffset(t),e!==this.cursor&&this.moveInsert(e),t!==this.bound&&this.moveBound(t)}placeCursor(e){this.selectRange(e,e)}moveInsert(e){this.cursor=e,this.emit(`mark-set`,new t(this,e),this.insertMark),this.emit(`cursor-moved`),this.emit(`notify::cursor-position`)}moveBound(e){this.bound=e,this.emit(`mark-set`,new t(this,e),this.boundMark)}get_insert(){return this.insertMark}get_selection_bound(){return this.boundMark}get_start_iter(){return new t(this,0)}get_end_iter(){return new t(this,this.length)}get_selection_bounds(){let e=Math.min(this.cursor,this.bound),n=Math.max(this.cursor,this.bound);return[e!==n,new t(this,e),new t(this,n)]}get_text(e,t,n){let r=this.ownIter(e,`get_text`),i=this.ownIter(t,`get_text`);return this.getText(Math.min(r,i),Math.max(r,i))}move_mark(e,t){let n=this.ownIter(t,`move_mark`);if(e===this.insertMark)this.moveInsert(n);else if(e===this.boundMark)this.moveBound(n);else throw Error(`GtkSource.Buffer.move_mark: only the 'insert' and 'selection_bound' marks exist`)}insert_at_cursor(e,t){if(t!==-1)throw Error(`GtkSource.Buffer.insert_at_cursor: only len -1 is implemented`);this.insert(this.cursor,e)}set_language(e){this.language=e}set_style_scheme(e){this.styleScheme=e}begin_user_action(){this.depth++>0||(this.open={edits:[],before:this.cursor},this.emit(`begin-user-action`))}end_user_action(){if(this.depth===0||--this.depth>0)return;let e=this.open;this.open=null,e&&e.edits.length>0&&this.push(e),this.emit(`end-user-action`)}get can_undo(){return this.undoStack.length>0}get can_redo(){return this.redoStack.length>0}undo(){let e=this.depth===0?this.undoStack.pop():void 0;e&&(this.emit(`undo`),this.applyHistory(()=>{for(let t of[...e.edits].reverse())this.replace(t.start,t.start+t.insertedText.length,t.removedText)}),this.moveInsert(e.before),this.moveBound(e.before),this.redoStack.push(e),this.syncUndoState())}redo(){let e=this.depth===0?this.redoStack.pop():void 0;if(!e)return;this.emit(`redo`),this.applyHistory(()=>{for(let t of e.edits)this.replace(t.start,t.start+t.removedText.length,t.insertedText)});let t=e.edits[e.edits.length-1],n=t.start+t.insertedText.length;this.moveInsert(n),this.moveBound(n),this.undoStack.push(e),this.syncUndoState()}applyHistory(e){this.recording=!1;try{e()}finally{this.recording=!0}}record(e,t){this.recording&&(this.redoStack=[],this.open?this.open.edits.push(e):this.push({edits:[e],before:t}))}push(e){this.undoStack.push(e),this.syncUndoState()}syncUndoState(){let e=this.can_undo,t=this.can_redo,n=e!==this.reportedUndo,r=t!==this.reportedRedo;this.reportedUndo=e,this.reportedRedo=t,n&&this.emit(`notify::can-undo`),r&&this.emit(`notify::can-redo`)}checkSignal(e){if(!r.has(e))throw Error(`GtkSource.Buffer: signal '${e}' is not implemented`)}ownIter(e,n){if(!(e instanceof t)||e.source!==this)throw TypeError(`GtkSource.Buffer.${n}: the iterator belongs to another buffer`);return e.utf16Offset}get language(){return this.lang}set language(e){e!==this.lang&&(this.lang=e,this.emit(`notify::language`))}get styleScheme(){return this.scheme}set styleScheme(e){e!==this.scheme&&(this.scheme=e,this.emit(`notify::style-scheme`))}get highlightSyntax(){return this.highlight}set highlightSyntax(e){e!==this.highlight&&(this.highlight=e,this.emit(`notify::highlight-syntax`))}checkOffset(e){if(!Number.isInteger(e)||e<0||e>this.length)throw RangeError(`Buffer: offset ${e} is outside 0..${this.length}`)}};export{GtkSourceBuffer as Buffer,GtkSourceBuffer,t as TextIter,n as TextMark};
@@ -0,0 +1 @@
1
+ import"./_virtual/_rolldown/runtime.js";function toBoolean(e,t){if(typeof e==`boolean`)return e;if(e===`true`)return!0;if(e===`false`)return!1;throw TypeError(`${t}: ${JSON.stringify(e)} is not a boolean`)}function toNumber(e,t){let n=typeof e==`string`&&e.trim()!==``?Number(e):e;if(typeof n!=`number`||!Number.isFinite(n))throw TypeError(`${t}: ${JSON.stringify(e)} is not a number`);return n}export{toBoolean,toNumber};
@@ -0,0 +1 @@
1
+ import"./_virtual/_rolldown/runtime.js";function parseColor(e){let t=/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/.exec(e.trim());if(!t)return;let n=t[1];n.length===3&&(n=[...n].map(e=>e+e).join(``)),n.length===6&&(n+=`ff`);let r=parseInt(n.slice(0,2),16),i=parseInt(n.slice(2,4),16),a=parseInt(n.slice(4,6),16);return parseInt(n.slice(6,8),16)<<24|r<<16|i<<8|a|0}export{parseColor};
@@ -0,0 +1 @@
1
+ import{GTKSOURCE_BUFFER_VECTORS as e}from"./buffer-vectors.js";import{GTKSOURCE_INIT_VECTORS as t}from"./init-vectors.js";import{GTKSOURCE_MANAGER_VECTORS as n}from"./managers-vectors.js";import{GTKSOURCE_VIEW_DEFAULT_VECTORS as r,GTKSOURCE_VIEW_SURFACE_VECTORS as i}from"./view-vectors.js";import{GUTTER_PAINT_VECTORS as a}from"./gutter-paint-vectors.js";export{e as GTKSOURCE_BUFFER_VECTORS,t as GTKSOURCE_INIT_VECTORS,n as GTKSOURCE_MANAGER_VECTORS,r as GTKSOURCE_VIEW_DEFAULT_VECTORS,i as GTKSOURCE_VIEW_SURFACE_VECTORS,a as GUTTER_PAINT_VECTORS};
File without changes
@@ -0,0 +1,2 @@
1
+ import"./_virtual/_rolldown/runtime.js";import{SignalEmitter as e}from"./signals.js";import{Buffer as t}from"./buffer.js";import{GutterLines as n,GutterRendererText as r,parseMarkup as i}from"./gutter-renderer.js";import{StyleSchemeManager as a}from"./style-scheme.js";import{HighlightController as o}from"./highlight-controller.js";function leadingWhitespace(e){return/^[ \t]*/.exec(e)[0]}function cellOf(e){if(!(e instanceof r))return{text:``,runs:null};if(e.markup!==null){let t=i(e.markup);return{text:t.map(e=>e.text).join(``),runs:t}}return{text:e.text??``,runs:null}}var EditorSession=class extends e{constructor(e,n=a.getDefault(),r=`light`){super(),this.driver=e,this.schemes=n,this.bufferHandlers=[],this.mirroring=!1,this.fromNative=!1,this.gutters=null,this.props={autoIndent:!1,indentWidth:-1,showLineNumbers:!1,monospace:!1,editable:!0,highlightCurrentLine:!1,cursorVisible:!0,leftMargin:0,rightMargin:0,topMargin:0,bottomMargin:0},this.variant=r,e.bind(this),this.attach(new t)}get buffer(){return this.current}set buffer(e){e!==this.current&&(this.attach(e),this.emit(`notify::buffer`))}attach(e){if(this.current){for(let e of this.bufferHandlers.splice(0))this.current.disconnect(e);this.controller.dispose()}this.current=e,this.bufferHandlers.push(e.connect(`changed`,(e,t)=>this.onBufferChanged(t)),e.connect(`mark-set`,()=>this.onBufferCursor())),this.mirroring=!0;try{this.driver.setText(e.text)}finally{this.mirroring=!1}this.controller=new o(e,this.driver,this.schemes,this.variant),this.driver.setLineCount(e.lineCount),this.driver.setSelection(e.cursorPosition,e.cursorPosition),this.pushLayout()}onBufferChanged(e){if(!this.fromNative){this.mirroring=!0;try{this.driver.replaceRange(e.start,e.start+e.removedText.length,e.insertedText)}finally{this.mirroring=!1}}e.insertedLines!==e.removedLines&&this.driver.setLineCount(this.current.lineCount)}onBufferCursor(){this.fromNative||this.mirroring||this.driver.setSelection(this.current.selectionBoundPosition,this.current.cursorPosition)}bindGutters(e){this.gutters=e,e.watch(e=>{e.window_type===3&&this.driver.invalidateGutter()})}leftRenderers(){let e=this.gutters?.get(3);return{renderers:e?.renderers??[],positions:e?.positions??[]}}metricsOf(e,t){return{position:t,widthRequest:e.width_request,marginStart:e.margin_start,marginEnd:e.margin_end}}gutterColumns(){let{renderers:e,positions:t}=this.leftRenderers();return e.map((e,n)=>this.metricsOf(e,t[n]))}queryGutter(e,t){let{renderers:r,positions:i}=this.leftRenderers();if(r.length===0||this.gutters===null)return[];let a=new n(this.gutters.view,this.current,e,t);return r.map((n,r)=>{let o=n.vfunc_query_data,s=[];for(let r=e;r<=t;r++)o?.call(n,a,r),s.push(cellOf(n));return{...this.metricsOf(n,i[r]),cells:s}})}onNativeEdit(e,t,n){if(!this.mirroring){this.fromNative=!0,this.current.begin_user_action();try{this.current.replace(e,e+t,n)}finally{this.fromNative=!1,this.current.end_user_action()}if(this.props.autoIndent&&n===`
2
+ `){let t=leadingWhitespace(this.current.getLine(this.current.lineOfOffset(e)));t!==``&&(this.current.insert(e+1,t),this.driver.setSelection(this.current.cursorPosition,this.current.cursorPosition))}}}onNativeSelection(e,t){if(this.mirroring)return;let clamp=e=>Math.min(Math.max(0,e),this.current.length);this.fromNative=!0;try{this.current.selectRange(clamp(t),clamp(e))}finally{this.fromNative=!1}}setProp(e,t,n){this.props[e]!==t&&(this.props[e]=t,this.emit(`notify::${n}`),this.pushLayout())}pushLayout(){let{props:e}=this;this.driver.setLayout({showLineNumbers:e.showLineNumbers,monospace:e.monospace,editable:e.editable,highlightCurrentLine:e.highlightCurrentLine,cursorVisible:e.cursorVisible,leftMargin:e.leftMargin,rightMargin:e.rightMargin,topMargin:e.topMargin,bottomMargin:e.bottomMargin})}get autoIndent(){return this.props.autoIndent}set autoIndent(e){this.setProp(`autoIndent`,e,`auto-indent`)}get indentWidth(){return this.props.indentWidth}set indentWidth(e){this.setProp(`indentWidth`,e,`indent-width`)}get showLineNumbers(){return this.props.showLineNumbers}set showLineNumbers(e){this.setProp(`showLineNumbers`,e,`show-line-numbers`)}get monospace(){return this.props.monospace}set monospace(e){this.setProp(`monospace`,e,`monospace`)}get editable(){return this.props.editable}set editable(e){this.setProp(`editable`,e,`editable`)}get highlightCurrentLine(){return this.props.highlightCurrentLine}set highlightCurrentLine(e){this.setProp(`highlightCurrentLine`,e,`highlight-current-line`)}get cursorVisible(){return this.props.cursorVisible}set cursorVisible(e){this.setProp(`cursorVisible`,e,`cursor-visible`)}get leftMargin(){return this.props.leftMargin}set leftMargin(e){this.setProp(`leftMargin`,e,`left-margin`)}get rightMargin(){return this.props.rightMargin}set rightMargin(e){this.setProp(`rightMargin`,e,`right-margin`)}get topMargin(){return this.props.topMargin}set topMargin(e){this.setProp(`topMargin`,e,`top-margin`)}get bottomMargin(){return this.props.bottomMargin}set bottomMargin(e){this.setProp(`bottomMargin`,e,`bottom-margin`)}setColorScheme(e){this.variant=e,this.controller.setColorScheme(e)}dispose(){for(let e of this.bufferHandlers.splice(0))this.current.disconnect(e);this.controller.dispose()}};export{EditorSession,leadingWhitespace};
@@ -0,0 +1,2 @@
1
+ import"./_virtual/_rolldown/runtime.js";const scheme=(e,t,n)=>`<?xml version="1.0" encoding="UTF-8"?>\n<style-scheme id="${e}" name="${t}" version="1.0">\n${Object.entries(n).map(([e,t])=>` <style name="${e}" ${t}/>`).join(`
2
+ `)}\n</style-scheme>\n`,e=`Adwaita`,t=`Adwaita-dark`,n=scheme(e,`Adwaita (gjsify fallback)`,{text:`foreground="#2e3436" background="#ffffff"`,selection:`background="#a8c8f0"`,cursor:`foreground="#2e3436"`,"current-line":`background="#f0f0f0"`,"line-numbers":`foreground="#8a8f92" background="#f6f5f4"`,"current-line-number":`foreground="#2e3436" background="#f0f0f0"`,"def:comment":`foreground="#77767b" italic="true"`,"def:shebang":`foreground="#77767b" italic="true"`,"def:doc-comment-element":`foreground="#77767b" italic="true"`,"def:keyword":`foreground="#a51d2d" bold="true"`,"def:statement":`foreground="#a51d2d" bold="true"`,"def:preprocessor":`foreground="#813d9c"`,"def:type":`foreground="#1a5fb4"`,"def:builtin":`foreground="#1a5fb4"`,"def:function":`foreground="#1a5fb4"`,"def:identifier":`foreground="#1a5fb4"`,"def:constant":`foreground="#26a269"`,"def:number":`foreground="#26a269"`,"def:decimal":`foreground="#26a269"`,"def:base-n-integer":`foreground="#26a269"`,"def:floating-point":`foreground="#26a269"`,"def:boolean":`foreground="#26a269"`,"def:string":`foreground="#c64600"`,"def:character":`foreground="#c64600"`,"def:special-char":`foreground="#c64600" bold="true"`,"def:special-constant":`foreground="#c64600"`,"def:operator":`foreground="#5e5c64"`,"def:error":`foreground="#c01c28" underline="error"`,"def:note":`foreground="#813d9c" bold="true"`}),r=scheme(t,`Adwaita Dark (gjsify fallback)`,{text:`foreground="#ebebeb" background="#1e1e1e"`,selection:`background="#35516e"`,cursor:`foreground="#ebebeb"`,"current-line":`background="#2a2a2a"`,"line-numbers":`foreground="#8a8a8a" background="#242424"`,"current-line-number":`foreground="#ebebeb" background="#2a2a2a"`,"def:comment":`foreground="#9a9996" italic="true"`,"def:shebang":`foreground="#9a9996" italic="true"`,"def:doc-comment-element":`foreground="#9a9996" italic="true"`,"def:keyword":`foreground="#ff7b63" bold="true"`,"def:statement":`foreground="#ff7b63" bold="true"`,"def:preprocessor":`foreground="#dc8add"`,"def:type":`foreground="#78aeed"`,"def:builtin":`foreground="#78aeed"`,"def:function":`foreground="#78aeed"`,"def:identifier":`foreground="#78aeed"`,"def:constant":`foreground="#8ff0a4"`,"def:number":`foreground="#8ff0a4"`,"def:decimal":`foreground="#8ff0a4"`,"def:base-n-integer":`foreground="#8ff0a4"`,"def:floating-point":`foreground="#8ff0a4"`,"def:boolean":`foreground="#8ff0a4"`,"def:string":`foreground="#ffbe6f"`,"def:character":`foreground="#ffbe6f"`,"def:special-char":`foreground="#ffbe6f" bold="true"`,"def:special-constant":`foreground="#ffbe6f"`,"def:operator":`foreground="#c0bfbc"`,"def:error":`foreground="#ff7b63" underline="error"`,"def:note":`foreground="#dc8add" bold="true"`});export{t as FALLBACK_DARK_ID,e as FALLBACK_LIGHT_ID,r as fallbackDarkScheme,n as fallbackLightScheme};
@@ -0,0 +1,8 @@
1
+ import"./_virtual/_rolldown/runtime.js";let e=0;function recording(t){let n=[];class Recorder extends t.GtkSource.GutterRendererText{vfunc_query_data(e,t){n.push({line:t,first:e.get_first(),last:e.get_last(),cursor:e.is_cursor(t)}),this.text=`#${t}`}}return{renderer:new(t.GObject.registerClass({GTypeName:`GoVecRecorder${++e}`},Recorder))({width_request:40}),queries:n}}function firstPass(e){let t=[];for(let n of e){if(t.includes(n.line))break;t.push(n.line)}return t}async function shown(e,t,n,r=0){let i=new e.GtkSource.View;i.buffer.text=n;let a=i.get_gutter(3),{renderer:o,queries:s}=recording(e);return a.insert(o,r),await t.present(i),{view:i,gutter:a,renderer:o,queries:s}}function numbered(t){class Numbered extends t.GtkSource.GutterRendererText{constructor(...e){super(...e),this.seen=[]}get start_value(){return this.stored??0}set start_value(e){this.stored=e,this.queue_draw()}vfunc_query_data(e,t){this.text=String(this.start_value+t),this.seen.push([t,this.text])}}let{ParamSpec:n,ParamFlags:r}=t.GObject;return t.GObject.registerClass({GTypeName:`GoVecNumbered${++e}`,Properties:{"start-value":n.uint(`start-value`,``,``,r.READWRITE,0,1e3,0)}},Numbered)}const t=[{rule:`vfunc_query_data runs once per visible line, in order, with the visible range and the cursor line`,paints:!0,unlocks:[`GtkSource.GutterRenderer.vfunc_query_data`],async observe(e,t){let{queries:n}=await shown(e,t,`a
2
+ b
3
+ c`),r=n.slice(0,firstPass(n).length);return{lines:r.map(e=>e.line),range:[r[0]?.first,r[0]?.last],cursor:r.map(e=>e.cursor)}},shows:{lines:[0,1,2],range:[0,2],cursor:[!1,!1,!0]}},{rule:`queue_draw on the renderer and on the gutter, however often, costs one more pass`,paints:!0,async observe(e,t){let{renderer:n,gutter:r,queries:i}=await shown(e,t,`a
4
+ b
5
+ c`);return await t.settle(),i.length=0,n.queue_draw(),n.queue_draw(),r.queue_draw(),await t.settle(),i.map(e=>e.line)},shows:[0,1,2]},{rule:`a removed renderer is asked nothing more`,paints:!0,async observe(e,t){let{renderer:n,gutter:r,queries:i}=await shown(e,t,`a
6
+ b
7
+ c`);return await t.settle(),r.remove(n),i.length=0,r.queue_draw(),await t.settle(),i.length},shows:0},{rule:`a registered GutterRendererText subclass keeps its declared property and sets its text in query_data`,paints:!0,async observe(e,t){let n=numbered(e),r=new e.GtkSource.View;r.buffer.text=`a
8
+ b`;let i=new n({start_value:16,width_request:30});r.get_gutter(3).insert(i,0),await t.present(r);let a=i.seen.slice(0,2);return i.start_value=100,i.seen=[],await t.settle(),{before:a,after:i.seen.slice(0,2),width:i.width_request}},shows:{before:[[0,`16`],[1,`17`]],after:[[0,`100`],[1,`101`]],width:30}},{rule:`a registered GutterRendererText subclass is a renderer with its property and widget properties set`,paints:!1,async observe(e){let t=new(numbered(e))({start_value:7,margin_start:3,width_request:20});return[t instanceof e.GtkSource.GutterRendererText,t.start_value,t.margin_start,t.text]},shows:[!0,7,3,null]}];export{t as GUTTER_PAINT_VECTORS};
@@ -0,0 +1 @@
1
+ import"./_virtual/_rolldown/runtime.js";import{GIR_TYPE as e,GObjectObject as t}from"@gjsify/adwaita-core";const n=3,r=[[`margin_start`,`marginStart`,0],[`margin_end`,`marginEnd`,0],[`width_request`,`widthRequest`,-1],[`focusable`,`focusable`,!1],[`focus_on_click`,`focusOnClick`,!0]],i=new Set(r.map(([e])=>e));function snakeCase(e){return e.replace(/-/g,`_`).replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}function byteSlice(e,t){if(t<0)return e;let n=0,r=0;for(let i of e){let e=i.codePointAt(0),a=e<128?1:e<2048?2:e<65536?3:4;if(n+a>t)break;n+=a,r+=i.length}return e.slice(0,r)}const a=new WeakMap;function stateOf(e){let t=a.get(e);return t===void 0&&(t={owner:null,widget:new Map(r.map(([e,,t])=>[e,t]))},a.set(e,t)),t}var o=class GutterRenderer extends t{static{this[e]=`GtkSource.GutterRenderer`}constructor(e={}){let t={},n={};for(let[r,a]of Object.entries(e))(i.has(snakeCase(r))?t:n)[r]=a;if(super(n),new.target===GutterRenderer)throw TypeError(`Cannot instantiate abstract type GtkSourceGutterRenderer`);for(let[e,n]of Object.entries(t))this[e]=n}get_view(){return stateOf(this).owner?.get_view()??null}get view(){return this.get_view()}queue_draw(){stateOf(this).owner?.queue_draw()}attach(e){stateOf(this).owner=e}widgetProperty(e,t){let n=stateOf(this);return t!==void 0&&n.widget.get(e)!==t&&(n.widget.set(e,t),n.owner?.queue_draw()),n.widget.get(e)}};for(let[e,t]of r)for(let n of new Set([e,t]))Object.defineProperty(o.prototype,n,{get(){return this.widgetProperty(e)},set(t){this.widgetProperty(e,t)},enumerable:!0});var GutterRendererText=class extends o{constructor(e={}){let{text:t,markup:n,...r}=e;super(r),t!==void 0&&(this.text=t),n!==void 0&&(this.markup=n)}get text(){return this.plain??null}set text(e){this.plain=e,this.marked=null}get markup(){return this.marked??null}set markup(e){this.marked=e,this.plain=null}set_text(e,t){this.text=byteSlice(e,t)}set_markup(e,t){this.markup=byteSlice(e,t)}},GutterLines=class{constructor(e,t,n,r){this.owner=e,this.text=t,this.first=n,this.last=r}get_first(){return this.first}get_last(){return this.last}get_buffer(){return this.text}get_view(){return this.owner}is_cursor(e){return this.text.lineOfOffset(this.text.cursorPosition)===e}},Gutter=class{constructor(e,t,n=()=>{}){this.owner=e,this.window_type=t,this.listener=n,this.placed=[]}get_view(){return this.owner}get view(){return this.owner}insert(e,t){return e.get_view()===null?(e.attach(this),this.placed.push({renderer:e,position:t}),this.sort(),this.queue_draw(),!0):!1}remove(e){let t=this.placed.findIndex(t=>t.renderer===e);t<0||(this.placed.splice(t,1),e.attach(null),this.queue_draw())}reorder(e,t){let n=this.placed.find(t=>t.renderer===e);n!==void 0&&(n.position=t,this.sort(),this.queue_draw())}queue_draw(){this.listener(this)}get renderers(){return this.placed.map(e=>e.renderer)}get positions(){return this.placed.map(e=>e.position)}sort(){this.placed.sort((e,t)=>e.position-t.position)}},GutterSet=class{constructor(e){this.view=e,this.gutters=new Map,this.listener=()=>{}}watch(e){this.listener=e}get(e){if(e!==3&&e!==4)return null;let t=this.gutters.get(e);return t===void 0&&(t=new Gutter(this.view,e,e=>this.listener(e)),this.gutters.set(e,t)),t}};const s={amp:`&`,lt:`<`,gt:`>`,quot:`"`,apos:`'`},c={b:`bold`,i:`italic`,u:`underline`,s:`strikethrough`};function parseMarkup(e){let t=[],n=[],r=/<(\/?)([a-zA-Z]+)[^>]*>|([^<]+)/g;for(let i=r.exec(e);i!==null;i=r.exec(e)){if(i[3]===void 0){if(i[1]===`/`){let e=n.lastIndexOf(i[2]);e>=0&&n.splice(e,1)}else i[0].endsWith(`/>`)||n.push(i[2]);continue}let e=i[3].replace(/&(amp|lt|gt|quot|apos);/g,(e,t)=>s[t]),styled=e=>n.some(t=>c[t]===e);t.push({text:e,bold:styled(`bold`),italic:styled(`italic`),underline:styled(`underline`),strikethrough:styled(`strikethrough`)})}return t}export{Gutter,GutterLines,o as GutterRenderer,GutterRendererText,GutterSet,n as WINDOW_LEFT,parseMarkup};
@@ -0,0 +1 @@
1
+ import"./_virtual/_rolldown/runtime.js";function digitCount(e,t=2){return Math.max(t,String(Math.max(1,e)).length)}function gutterWidth(e,t,n,r=2){return Math.ceil(digitCount(e,r)*t+2*n)}function visibleLines(e,t,n,r,i){if(e<=0)return null;let a=0,o=e-1;for(;a<o;){let e=a+o>>1;n(e)<=r?a=e+1:o=e}let s=a;if(t(s)>=i||n(s)<=r)return null;for(a=s,o=e-1;a<o;){let e=a+o+1>>1;t(e)<i?a=e:o=e-1}return{first:s,last:a}}function emphasisedLine(e,t){return e?t:-1}export{digitCount,emphasisedLine,gutterWidth,visibleLines};
@@ -0,0 +1 @@
1
+ import"./_virtual/_rolldown/runtime.js";import{IncrementalHighlighter as e}from"./highlighter.js";import{StyleSchemeManager as t,paletteOf as n}from"./style-scheme.js";import{TokenStyler as r}from"./token-styler.js";var HighlightController=class{constructor(e,n,r=t.getDefault(),i=`light`){this.buffer=e,this.sink=n,this.schemes=r,this.highlighter=null,this.styler=null,this.handlers=[],this.variant=i,this.handlers.push(e.connect(`changed`,(e,t)=>this.onChanged(t)),e.connect(`notify::language`,()=>this.rebuild()),e.connect(`notify::style-scheme`,()=>this.rebuild()),e.connect(`notify::highlight-syntax`,()=>this.rebuild())),this.rebuild()}get scheme(){let e=this.buffer.styleScheme;return e?this.schemes.variantOf(e,this.variant):this.schemes.getDefaultFor(this.variant)}setColorScheme(e){e!==this.variant&&(this.variant=e,this.rebuild(!1))}dispose(){for(let e of this.handlers.splice(0))this.buffer.disconnect(e)}rebuild(t=!0){let i=this.scheme,a=this.buffer.language;if(i&&this.sink.setPalette(n(i,this.variant)),!a||!i||!this.buffer.highlightSyntax){this.highlighter=null,this.styler=null,this.sink.clearAll();return}(t||!this.highlighter||this.highlighter.tokenizer!==a.tokenizer)&&(this.highlighter=new e(a.tokenizer),this.highlighter.reset(this.buffer.getLines())),this.styler=new r(a.definition,i),this.paint(0,this.buffer.lineCount-1)}onChanged(e){if(this.sink.spliceLines(e.firstLine,e.removedLines,e.insertedLines),!this.highlighter)return;let t=this.highlighter.update(this.buffer.getLines(),{first:e.firstLine,removed:e.removedLines,inserted:e.insertedLines});this.paint(t.first,t.last)}paint(e,t){let{highlighter:n,styler:r}=this;if(!(!n||!r))for(let i=e;i<=t;i++)this.sink.paintLine(i,this.buffer.offsetOfLine(i),r.runsOf(n.tokensOf(i)))}};export{HighlightController};
@@ -0,0 +1 @@
1
+ import"./_virtual/_rolldown/runtime.js";import{INITIAL_STATE as e}from"./tokenizer.js";function sameState(e,t){return e.stack.length===t.stack.length?e.stack.every((e,n)=>e===t.stack[n]):!1}var IncrementalHighlighter=class{constructor(e){this.tokenizer=e,this.results=[]}get lineCount(){return this.results.length}tokensOf(e){let t=this.results[e];if(!t)throw RangeError(`IncrementalHighlighter: line ${e} is outside 0..${this.results.length-1}`);return t.tokens}reset(t){this.results=[];let n=e;for(let e of t){let t=this.tokenizer.tokenize(e,n);this.results.push(t),n=t.state}return t.length===0?null:{first:0,last:t.length-1}}update(t,n){let{first:r,removed:i,inserted:a}=n;if(r<0||i<1||a<1||r+i>this.results.length)throw RangeError(`IncrementalHighlighter: edit ${JSON.stringify(n)} does not fit ${this.results.length} lines`);if(t.length!==this.results.length-i+a)throw RangeError(`IncrementalHighlighter: ${t.length} lines do not match the edit`);let o=this.results[r+i-1].state,s=Array.from({length:a},()=>void 0);this.results.splice(r,i,...s);let c=r,l=r===0?e:this.results[r-1].state;for(;c<r+a;c++){let e=this.tokenizer.tokenize(t[c],l);this.results[c]=e,l=e.state}let u=r+a-1;for(;!sameState(l,o)&&c<t.length;){o=this.results[c].state;let e=this.tokenizer.tokenize(t[c],l);this.results[c]=e,l=e.state,u=c,c++}return{first:r,last:u}}};export{IncrementalHighlighter,sameState};
package/lib/esm/index.js CHANGED
@@ -1 +1 @@
1
- import"./types.js";import{UnsupportedRegexError as e,translateRegex as t}from"./regex.js";import{XmlParseError as n,childElements as r,decodeEntities as i,parseXml as a,textContent as o}from"./xml.js";import{keywordPattern as s,parseLanguage as c}from"./lang.js";import{parseStyleScheme as l,resolveStyle as u}from"./style.js";import{INITIAL_STATE as d,Tokenizer as f,schemeStyleName as p}from"./tokenizer.js";export{d as INITIAL_STATE,f as Tokenizer,e as UnsupportedRegexError,n as XmlParseError,r as childElements,i as decodeEntities,s as keywordPattern,c as parseLanguage,l as parseStyleScheme,a as parseXml,u as resolveStyle,p as schemeStyleName,o as textContent,t as translateRegex};
1
+ import{SignalEmitter as e}from"./signals.js";import{TextIter as t,TextMark as n}from"./text-iter.js";import{Buffer as r}from"./buffer.js";import{toBoolean as i,toNumber as a}from"./coerce.js";import{parseColor as o}from"./color.js";import"./editor-driver.js";import{Gutter as s,GutterLines as c,GutterRenderer as l,GutterRendererText as u,GutterSet as d,WINDOW_LEFT as f,parseMarkup as p}from"./gutter-renderer.js";import{UnsupportedRegexError as m,translateRegex as h}from"./regex.js";import{XmlParseError as g,childElements as _,decodeEntities as v,parseXml as y,textContent as b}from"./xml.js";import{keywordPattern as x,parseLanguage as S}from"./lang.js";import{INITIAL_STATE as C,Tokenizer as w,schemeStyleName as T}from"./tokenizer.js";import{IncrementalHighlighter as E,sameState as D}from"./highlighter.js";import{parseStyleScheme as O,resolveStyle as k}from"./style.js";import{FALLBACK_DARK_ID as A,FALLBACK_LIGHT_ID as j,fallbackDarkScheme as M,fallbackLightScheme as N}from"./fallback-schemes.js";import{StyleScheme as P,StyleSchemeManager as F,paletteOf as I}from"./style-scheme.js";import{TokenStyler as L}from"./token-styler.js";import{HighlightController as R}from"./highlight-controller.js";import{EditorSession as z,leadingWhitespace as B}from"./editor-session.js";import{digitCount as V,emphasisedLine as H,gutterWidth as U,visibleLines as W}from"./gutter.js";import"./types.js";import{Language as G,LanguageManager as K}from"./language-manager.js";import{LineStore as q}from"./line-store.js";import{init as J}from"./init.js";export{r as Buffer,r as GtkSourceBuffer,z as EditorSession,A as FALLBACK_DARK_ID,j as FALLBACK_LIGHT_ID,s as Gutter,c as GutterLines,l as GutterRenderer,u as GutterRendererText,d as GutterSet,R as HighlightController,C as INITIAL_STATE,E as IncrementalHighlighter,G as Language,K as LanguageManager,q as LineStore,e as SignalEmitter,P as StyleScheme,F as StyleSchemeManager,t as TextIter,n as TextMark,L as TokenStyler,w as Tokenizer,m as UnsupportedRegexError,f as WINDOW_LEFT,g as XmlParseError,_ as childElements,v as decodeEntities,V as digitCount,H as emphasisedLine,M as fallbackDarkScheme,N as fallbackLightScheme,U as gutterWidth,J as init,x as keywordPattern,B as leadingWhitespace,I as paletteOf,o as parseColor,S as parseLanguage,p as parseMarkup,O as parseStyleScheme,y as parseXml,k as resolveStyle,D as sameState,T as schemeStyleName,b as textContent,i as toBoolean,a as toNumber,h as translateRegex,W as visibleLines};
@@ -0,0 +1 @@
1
+ import"./_virtual/_rolldown/runtime.js";const e=[{rule:`init is a function on the namespace`,observe:e=>typeof e.init,shows:`function`},{rule:`init() returns undefined`,observe:e=>e.init(),shows:void 0},{rule:`a second init() is harmless and also returns undefined`,observe:e=>(e.init(),e.init()),shows:void 0}];export{e as GTKSOURCE_INIT_VECTORS};
@@ -0,0 +1 @@
1
+ import"./_virtual/_rolldown/runtime.js";function init(){}export{init};
@@ -0,0 +1 @@
1
+ import"./_virtual/_rolldown/runtime.js";import{parseLanguage as e}from"./lang.js";import{Tokenizer as t}from"./tokenizer.js";const splitList=e=>(e??``).split(`;`).map(e=>e.trim()).filter(e=>e!==``);function globMatches(e,t){let n=e.replace(/[.+^${}()|[\]\\]/g,`\\$&`).replace(/\*/g,`.*`).replace(/\?/g,`.`);return RegExp(`^${n}$`).test(t)}var Language=class{constructor(e){this.definition=e}get id(){return this.definition.id}get name(){return this.definition.name??this.definition.id}get section(){return this.definition.section??`Others`}get globs(){return splitList(this.definition.metadata.globs)}get mimeTypes(){return splitList(this.definition.metadata.mimetypes)}get tokenizer(){return this.cached??=new t(this.definition)}},n=class LanguageManager{constructor(){this.languages=new Map}static getDefault(){return LanguageManager.instance??=new LanguageManager}static get_default(){return LanguageManager.getDefault()}get languageIds(){return[...this.languages.keys()].sort()}addLanguageFromXml(t,n={}){let r=new Language(e(t,n));return this.languages.set(r.id,r),r}getLanguage(e){return this.languages.get(e)??null}get_language(e){return this.getLanguage(e)}guessLanguage(e,t){let n=[...this.languages.values()].sort((e,t)=>e.id.localeCompare(t.id));if(e!==null){let t=e.slice(Math.max(e.lastIndexOf(`/`),e.lastIndexOf(`\\`))+1),r=n.find(e=>e.globs.some(e=>globMatches(e,t)));if(r)return r}return t===null?null:n.find(e=>e.mimeTypes.includes(t))??null}};export{Language,n as LanguageManager};
@@ -0,0 +1 @@
1
+ import"./_virtual/_rolldown/runtime.js";var LineStore=class{constructor(){this.slots=[]}get(e){return this.slots[e]}set(e,t){for(;this.slots.length<=e;)this.slots.push(void 0);this.slots[e]=t}splice(e,t,n){for(;this.slots.length<e+t;)this.slots.push(void 0);return this.slots.splice(e,t,...Array.from({length:n},()=>void 0)).filter(e=>e!==void 0)}clear(){let e=this.slots.filter(e=>e!==void 0);return this.slots=[],e}};export{LineStore};
@@ -0,0 +1 @@
1
+ import"./_virtual/_rolldown/runtime.js";const e=[{rule:`LanguageManager.get_default() is one instance`,observe:e=>e.LanguageManager.get_default()===e.LanguageManager.get_default(),shows:!0},{rule:`get_language of an id nothing registered is null`,observe:e=>e.LanguageManager.get_default().get_language(`no-such-language`),shows:null},{rule:`StyleSchemeManager.get_default() is one instance`,observe:e=>e.StyleSchemeManager.get_default()===e.StyleSchemeManager.get_default(),shows:!0},{rule:`get_scheme of an id nothing registered is null`,observe:e=>e.StyleSchemeManager.get_default().get_scheme(`no-such-scheme`),shows:null},{rule:`the stock Adwaita scheme is there and answers to its id`,observe:e=>e.StyleSchemeManager.get_default().get_scheme(`Adwaita`)?.id,shows:`Adwaita`},{rule:`a new Buffer holds the empty text`,observe:e=>new e.Buffer().text,shows:``},{rule:`a new Buffer has no language`,observe:e=>new e.Buffer().language,shows:null},{rule:`a Buffer built with a text property reads it back`,observe:e=>new e.Buffer({text:`LDA #$01`}).text,shows:`LDA #$01`}];export{e as GTKSOURCE_MANAGER_VECTORS};
@@ -0,0 +1 @@
1
+ import"./_virtual/_rolldown/runtime.js";let e=1;var SignalEmitter=class{constructor(){this.handlers=new Map}connect(e,t){return this.add(e,t,!1)}connect_after(e,t){return this.add(e,t,!0)}checkSignal(e){}add(t,n,r){this.checkSignal(t);let i=e++;return this.handlers.set(i,{name:t,callback:n,after:r}),i}disconnect(e){if(!this.handlers.delete(e))throw Error(`No signal handler with id ${e} on this object`)}emit(e,...t){let n=Array.from(this.handlers.values()).filter(t=>t.name===e);for(let e of[!1,!0])for(let r of n)r.after===e&&r.callback(this,...t)}};export{SignalEmitter};
@@ -0,0 +1 @@
1
+ import"./_virtual/_rolldown/runtime.js";import{parseColor as e}from"./color.js";import{parseStyleScheme as t,resolveStyle as n}from"./style.js";import{FALLBACK_DARK_ID as r,FALLBACK_LIGHT_ID as i,fallbackDarkScheme as a,fallbackLightScheme as o}from"./fallback-schemes.js";var StyleScheme=class{constructor(e,t){this.definition=e,this.lookup=t}get id(){return this.definition.id}get name(){return this.definition.name??this.definition.id}get parentId(){return this.definition.parentScheme}getStyle(e){return n(this.definition,e,this.lookup)}};const s={foreground:-13749194,background:-1,selection:-5715728,lineNumber:-7696494},c={foreground:-1315861,background:-14803426,selection:-13282962,lineNumber:-7697782};function paletteOf(t,n){let r=n===`dark`?c:s,color=t=>t===void 0?void 0:e(t),i=t.getStyle(`text`),a=t.getStyle(`selection`),o=t.getStyle(`current-line`),l=t.getStyle(`line-numbers`),u=t.getStyle(`current-line-number`),d=color(i?.foreground)??r.foreground,f=color(i?.background)??r.background,p=color(l?.foreground)??r.lineNumber,m=color(l?.background)??f,h=color(o?.background)??0;return{dark:n===`dark`,foreground:d,background:f,selectionBackground:color(a?.background)??r.selection,currentLineBackground:h,lineNumberForeground:p,lineNumberBackground:m,currentLineNumberForeground:color(u?.foreground)??d,currentLineNumberBackground:color(u?.background)??h}}var l=class StyleSchemeManager{static getDefault(){return StyleSchemeManager.instance??=new StyleSchemeManager}static get_default(){return StyleSchemeManager.getDefault()}constructor(e=!0){if(this.definitions=new Map,this.fallbacks=new Set,e)for(let e of[o,a]){let n=t(e);this.definitions.set(n.id,n),this.fallbacks.add(n.id)}}get schemeIds(){return[...this.definitions.keys()].sort()}isFallback(e){return this.fallbacks.has(e)}addScheme(e){return this.definitions.set(e.id,e),this.fallbacks.delete(e.id),this.wrap(e)}addSchemeFromXml(e){return this.addScheme(t(e))}getScheme(e){let t=this.definitions.get(e);return t?this.wrap(t):null}get_scheme(e){return this.getScheme(e)}getDefaultFor(e){return this.getScheme(e===`dark`?r:i)}variantOf(e,t){let n=e.id.endsWith(`-dark`);if(n===(t===`dark`))return e;let r=n?e.id.slice(0,-5):`${e.id}-dark`;return this.getScheme(r)??e}wrap(e){return new StyleScheme(e,e=>this.definitions.get(e))}};export{StyleScheme,l as StyleSchemeManager,paletteOf};
@@ -0,0 +1 @@
1
+ import"./_virtual/_rolldown/runtime.js";var TextIter=class{constructor(e,t){this.source=e,this.offset=t}get utf16Offset(){return this.offset}get_offset(){let e=0,t=this.source.getText(0,this.offset);for(let n=0;n<t.length;n++){let r=t.charCodeAt(n);if(r>=55296&&r<=56319&&n+1<t.length){let e=t.charCodeAt(n+1);e>=56320&&e<=57343&&n++}e++}return e}set_offset(e){if(!Number.isInteger(e))throw TypeError(`TextIter.set_offset: ${e} is not an integer`);let t=this.source.getText(),n=0;for(let r=0;e>=0&&r<e&&n<t.length;r++)n+=t.codePointAt(n)>65535?2:1;this.offset=e<0||n>=t.length?this.source.length:n}},TextMark=class{constructor(e){this.name=e}};export{TextIter,TextMark};
@@ -0,0 +1 @@
1
+ import"./_virtual/_rolldown/runtime.js";import{parseColor as e}from"./color.js";import{schemeStyleName as t}from"./tokenizer.js";var TokenStyler=class{constructor(e,t){this.language=e,this.scheme=t,this.cache=new Map}styleFor(n){if(this.cache.has(n))return this.cache.get(n);let r=this.scheme.getStyle(t(this.language,n)),i;if(r){let t=r.foreground===void 0?void 0:e(r.foreground),n=r.background===void 0?void 0:e(r.background),a=r.underline!==void 0&&r.underline!==`none`,o=r.bold===!0,s=r.italic===!0,c=r.strikethrough===!0;(t!==void 0||n!==void 0||o||s||a||c)&&(i={foreground:t,background:n,bold:o,italic:s,underline:a,strikethrough:c})}return this.cache.set(n,i),i}runsOf(e){let t=[];for(let n of e){let e=this.styleFor(n.style);e&&n.end>n.start&&t.push({start:n.start,end:n.end,style:e})}return t}};export{TokenStyler};
@@ -0,0 +1 @@
1
+ import"./_virtual/_rolldown/runtime.js";const e=[{property:`auto-indent`,member:`autoIndent`,shows:!1},{property:`indent-width`,member:`indentWidth`,shows:-1},{property:`show-line-numbers`,member:`showLineNumbers`,shows:!1},{property:`highlight-current-line`,member:`highlightCurrentLine`,shows:!1},{property:`monospace`,member:`monospace`,shows:!1},{property:`editable`,member:`editable`,shows:!0},{property:`cursor-visible`,member:`cursorVisible`,shows:!0},{property:`left-margin`,member:`leftMargin`,shows:0},{property:`right-margin`,member:`rightMargin`,shows:0},{property:`top-margin`,member:`topMargin`,shows:0},{property:`bottom-margin`,member:`bottomMargin`,shows:0}],pick=(e,t)=>Object.fromEntries(t.map(t=>[t,e[t]])),t=[{rule:`Gtk.TextWindowType carries the typelib numbers`,instance:!1,observe:({Gtk:e})=>pick(e.TextWindowType,[`WIDGET`,`TEXT`,`LEFT`,`RIGHT`,`TOP`]),shows:{WIDGET:1,TEXT:2,LEFT:3,RIGHT:4,TOP:5}},{rule:`Gtk.PolicyType carries the typelib numbers`,instance:!1,observe:({Gtk:e})=>pick(e.PolicyType,[`ALWAYS`,`AUTOMATIC`,`NEVER`,`EXTERNAL`]),shows:{ALWAYS:0,AUTOMATIC:1,NEVER:2,EXTERNAL:3}},{rule:`Gtk.TextDirection carries the typelib numbers`,instance:!1,observe:({Gtk:e})=>pick(e.TextDirection,[`NONE`,`LTR`,`RTL`]),shows:{NONE:0,LTR:1,RTL:2}},{rule:`cursor_visible is true by default and the property and accessors agree`,instance:!0,observe:({GtkSource:e})=>{let t=new e.View,n=[t.cursor_visible,t.get_cursor_visible()];t.cursor_visible=!1;let r=[t.cursor_visible,t.get_cursor_visible()];return t.set_cursor_visible(!0),[n,r,[t.cursor_visible,t.get_cursor_visible()]]},shows:[[!0,!0],[!1,!1],[!0,!0]]},{rule:`set_editable and the editable property agree`,instance:!0,observe:({GtkSource:e})=>{let t=new e.View;t.set_editable(!1);let n=[t.editable,t.get_editable()];return t.editable=!0,[n,[t.editable,t.get_editable()]]},shows:[[!1,!1],[!0,!0]]},{rule:`highlight_current_line and show_line_numbers are plain boolean properties`,instance:!0,observe:({GtkSource:e})=>{let t=new e.View,n=[t.highlight_current_line,t.show_line_numbers];return t.highlight_current_line=!0,t.show_line_numbers=!0,[n,[t.highlight_current_line,t.show_line_numbers]]},shows:[[!1,!1],[!0,!0]]},{rule:`vadjustment and hadjustment are two stable, distinct adjustments`,instance:!0,observe:({GtkSource:e})=>{let t=new e.View;return[t.vadjustment===t.get_vadjustment(),t.vadjustment===t.hadjustment,t.vadjustment.get_value()]},shows:[!0,!1,0]},{rule:`direction is LTR by default and set_direction is read back`,instance:!0,observe:({Gtk:e,GtkSource:t})=>{let n=new t.View,r=n.get_direction();return n.set_direction(e.TextDirection.RTL),[r,n.get_direction()]},shows:[1,2]},{rule:`a fresh view has no sibling and no parent`,instance:!0,observe:({GtkSource:e})=>{let t=new e.View;return[t.get_next_sibling(),t.get_parent()]},shows:[null,null]},{rule:`a scrolled window starts AUTOMATIC on both axes and set_policy is read back`,instance:!1,observe:({Gtk:e})=>{let t=new e.ScrolledWindow,n=t.get_policy();return t.set_policy(e.PolicyType.NEVER,e.PolicyType.ALWAYS),[n,t.get_policy()]},shows:[[1,1],[2,0]]},{rule:`set_policy refuses a value that is not a Gtk.PolicyType`,instance:!1,observe:({Gtk:e})=>{let t=new e.ScrolledWindow;try{return t.set_policy(7,1),`accepted`}catch{return`threw`}},shows:`threw`},{rule:`a scrolled window adopts the view adjustment it is given`,instance:!0,observe:({Gtk:e,GtkSource:t})=>{let n=new t.View,r=new e.ScrolledWindow;return r.set_vadjustment(n.vadjustment),[r.get_vadjustment()===n.vadjustment,r.vadjustment===n.vadjustment]},shows:[!0,!0]},{rule:`get_gutter answers one gutter per side, LEFT and RIGHT apart`,instance:!0,observe:({Gtk:e,GtkSource:t})=>{let n=new t.View,{LEFT:r,RIGHT:i}=e.TextWindowType;return[n.get_gutter(r)!==null,n.get_gutter(r)===n.get_gutter(r),n.get_gutter(i)===n.get_gutter(i),n.get_gutter(r)!==n.get_gutter(i)]},shows:[!0,!0,!0,!0]},{rule:`a gutter knows its view and its side`,instance:!0,observe:({Gtk:e,GtkSource:t})=>{let n=new t.View,r=n.get_gutter(e.TextWindowType.LEFT),i=n.get_gutter(e.TextWindowType.RIGHT);return[r.get_view()===n,r.view===n,r.window_type,i.window_type]},shows:[!0,!0,3,4]},{rule:`get_gutter answers null for a side that has no gutter`,instance:!0,observe:({Gtk:e,GtkSource:t})=>{let n=new t.View,{TEXT:r,WIDGET:i,TOP:a}=e.TextWindowType;return[n.get_gutter(r),n.get_gutter(i),n.get_gutter(a)]},shows:[null,null,null]},{rule:`a text renderer starts empty with the widget defaults`,instance:!0,observe:({GtkSource:e})=>{let t=new e.GutterRendererText;return[t.text,t.markup,t.margin_start,t.margin_end,t.width_request,t.focusable,t.focus_on_click,t.get_view()]},shows:[null,null,0,0,-1,!1,!0,null]},{rule:`a text renderer takes widget properties at construction, snake_case or camelCase`,instance:!0,observe:({GtkSource:e})=>{let t=new e.GutterRendererText({margin_start:12,margin_end:8,width_request:36,focusable:!0,focus_on_click:!1,text:`q`}),n=new e.GutterRendererText({marginStart:3});return n.marginStart=5,[t.margin_start,t.margin_end,t.width_request,t.focusable,t.focus_on_click,t.text,n.margin_start]},shows:[12,8,36,!0,!1,`q`,5]},{rule:`a renderer refuses a property it does not have`,instance:!0,observe:({GtkSource:e})=>{try{return new e.GutterRendererText({bogus:1}),`accepted`}catch{return`threw`}},shows:`threw`},{rule:`GutterRenderer is abstract`,instance:!0,observe:({GtkSource:e})=>{try{return new e.GutterRenderer,`accepted`}catch{return`threw`}},shows:`threw`},{rule:`text and markup replace each other, and a length cuts the string in bytes`,instance:!0,observe:({GtkSource:e})=>{let t=new e.GutterRendererText;t.set_text(`abcdef`,3);let n=[t.text,t.markup];t.set_markup(`<b>x</b>`,-1);let r=[t.text,t.markup];return t.text=`zz`,[n,r,[t.text,t.markup]]},shows:[[`abc`,null],[null,`<b>x</b>`],[`zz`,null]]},{rule:`insert claims a renderer for the view, a second insert is refused, remove gives it back`,instance:!0,observe:({Gtk:e,GtkSource:t})=>{let n=new t.View,r=n.get_gutter(e.TextWindowType.LEFT),i=n.get_gutter(e.TextWindowType.RIGHT),a=new t.GutterRendererText,o=r.insert(a,0),s=a.get_view()===n,c=[r.insert(a,1),i.insert(a,1)];return r.remove(a),[o,s,c,a.get_view(),i.insert(a,0)]},shows:[!0,!0,[!1,!1],null,!0]},{rule:`reorder and queue_draw answer nothing`,instance:!0,observe:({Gtk:e,GtkSource:t})=>{let n=new t.View().get_gutter(e.TextWindowType.LEFT),r=new t.GutterRendererText;return n.insert(r,0),[n.reorder(r,3),n.queue_draw(),r.queue_draw()]},shows:[void 0,void 0,void 0]}];export{e as GTKSOURCE_VIEW_DEFAULT_VECTORS,t as GTKSOURCE_VIEW_SURFACE_VECTORS};
@@ -0,0 +1,42 @@
1
+ interface IterLike {
2
+ get_offset(): number;
3
+ set_offset(offset: number): void;
4
+ }
5
+ interface MarkLike {
6
+ readonly name: string | null;
7
+ }
8
+ /** The part of a `GtkSource.Buffer` the vectors read. */
9
+ export interface BufferLike {
10
+ text: string;
11
+ readonly language: unknown;
12
+ readonly cursor_position: number;
13
+ readonly can_undo: boolean;
14
+ readonly can_redo: boolean;
15
+ get_start_iter(): IterLike;
16
+ get_end_iter(): IterLike;
17
+ get_insert(): MarkLike;
18
+ get_selection_bound(): MarkLike;
19
+ get_selection_bounds(): [boolean, IterLike, IterLike];
20
+ get_text(start: IterLike, end: IterLike, includeHidden: boolean): string;
21
+ move_mark(mark: MarkLike, where: IterLike): void;
22
+ insert_at_cursor(text: string, len: number): void;
23
+ delete(start: IterLike, end: IterLike): void;
24
+ begin_user_action(): void;
25
+ end_user_action(): void;
26
+ undo(): void;
27
+ redo(): void;
28
+ set_language(language: null): void;
29
+ connect(name: string, callback: (...args: never[]) => void): number;
30
+ connect_after(name: string, callback: (...args: never[]) => void): number;
31
+ }
32
+ /** The part of `GtkSource` the vectors read. */
33
+ export interface GtkSourceBufferLike {
34
+ Buffer: new (properties?: any) => BufferLike;
35
+ }
36
+ export interface GtkSourceBufferVector {
37
+ readonly rule: string;
38
+ readonly observe: (GtkSource: GtkSourceBufferLike) => unknown;
39
+ readonly shows: unknown;
40
+ }
41
+ export declare const GTKSOURCE_BUFFER_VECTORS: readonly GtkSourceBufferVector[];
42
+ export {};
@@ -0,0 +1,2 @@
1
+ declare const _default: () => Promise<void>;
2
+ export default _default;
@@ -0,0 +1,2 @@
1
+ declare const _default: () => Promise<void>;
2
+ export default _default;
@@ -0,0 +1,110 @@
1
+ import type { Language } from './language-manager.js';
2
+ import { SignalEmitter } from './signals.js';
3
+ import type { StyleScheme } from './style-scheme.js';
4
+ import { TextIter, TextMark } from './text-iter.js';
5
+ /** What `changed` carries: one contiguous replacement. */
6
+ export interface TextEdit {
7
+ readonly start: number;
8
+ readonly removedText: string;
9
+ readonly insertedText: string;
10
+ /** The lines `[firstLine, firstLine + removedLines)` of the old text became `insertedLines` lines. */
11
+ readonly firstLine: number;
12
+ readonly removedLines: number;
13
+ readonly insertedLines: number;
14
+ }
15
+ /** What a `.blp` may construct a buffer with: `buffer: GtkSource.Buffer { text: "…"; }`. */
16
+ export interface BufferProps {
17
+ text?: string;
18
+ highlightSyntax?: boolean;
19
+ }
20
+ export declare class GtkSourceBuffer extends SignalEmitter {
21
+ private lines;
22
+ /** `lineStarts[i]` is the offset of line `i`; valid for `i < startsValidTo`. */
23
+ private lineStarts;
24
+ private startsValidTo;
25
+ private cursor;
26
+ private bound;
27
+ private readonly insertMark;
28
+ private readonly boundMark;
29
+ private undoStack;
30
+ private redoStack;
31
+ private open;
32
+ private depth;
33
+ private recording;
34
+ private reportedUndo;
35
+ private reportedRedo;
36
+ private lang;
37
+ private scheme;
38
+ private highlight;
39
+ constructor(init?: string | BufferProps);
40
+ get text(): string;
41
+ /**
42
+ * Replaces everything. Like `gtk_text_buffer_set_text` — a delete and an insert — the
43
+ * insert mark ends after the new text, so the cursor lands at the end.
44
+ */
45
+ set text(value: string);
46
+ get length(): number;
47
+ get lineCount(): number;
48
+ /** Line `index` without its terminator. */
49
+ getLine(index: number): string;
50
+ /** A copy of every line. */
51
+ getLines(): string[];
52
+ offsetOfLine(index: number): number;
53
+ lineOfOffset(offset: number): number;
54
+ getText(start?: number, end?: number): string;
55
+ insert(offset: number, text: string): void;
56
+ /** Offsets in UTF-16 units, or the two `TextIter`s of `gtk_text_buffer_delete` (any order). */
57
+ delete(start: number | TextIter, end: number | TextIter): void;
58
+ /** The one mutation every other one goes through. An edit that changes nothing emits nothing. */
59
+ replace(start: number, end: number, text: string): void;
60
+ /** `GtkTextBuffer:cursor-position`. */
61
+ get cursorPosition(): number;
62
+ /** The GJS spelling of `GtkTextBuffer:cursor-position`, in characters like `TextIter.get_offset`. */
63
+ get cursor_position(): number;
64
+ /** Where `selection_bound` is; equal to `cursorPosition` when nothing is selected. */
65
+ get selectionBoundPosition(): number;
66
+ /** Moves both marks like `gtk_text_buffer_select_range`; a mark already there is left alone. */
67
+ selectRange(cursor: number, bound: number): void;
68
+ /** Collapses the selection onto `offset`. */
69
+ placeCursor(offset: number): void;
70
+ private moveInsert;
71
+ private moveBound;
72
+ get_insert(): TextMark;
73
+ get_selection_bound(): TextMark;
74
+ get_start_iter(): TextIter;
75
+ get_end_iter(): TextIter;
76
+ /** `[has_selection, start, end]`, start before end whichever mark is which. */
77
+ get_selection_bounds(): [boolean, TextIter, TextIter];
78
+ /** The buffer has no tags, so no text is hidden and `include_hidden` changes nothing. */
79
+ get_text(start: TextIter, end: TextIter, _includeHidden: boolean): string;
80
+ move_mark(mark: TextMark, where: TextIter): void;
81
+ /** Only `len` -1 (the whole string): GTK counts bytes there, and nothing here needs a prefix. */
82
+ insert_at_cursor(text: string, len: number): void;
83
+ set_language(language: Language | null): void;
84
+ set_style_scheme(scheme: StyleScheme | null): void;
85
+ /** Edits between the outermost begin and its end are one undo step. */
86
+ begin_user_action(): void;
87
+ end_user_action(): void;
88
+ get can_undo(): boolean;
89
+ get can_redo(): boolean;
90
+ undo(): void;
91
+ redo(): void;
92
+ private applyHistory;
93
+ private record;
94
+ private push;
95
+ private syncUndoState;
96
+ protected checkSignal(name: string): void;
97
+ private ownIter;
98
+ /** `GtkSource.Buffer:language` — what to highlight with; `null` highlights nothing. */
99
+ get language(): Language | null;
100
+ set language(value: Language | null);
101
+ /** `GtkSource.Buffer:style-scheme`; `null` lets the view pick one for the light/dark mode. */
102
+ get styleScheme(): StyleScheme | null;
103
+ set styleScheme(value: StyleScheme | null);
104
+ /** `GtkSource.Buffer:highlight-syntax`, on by default. */
105
+ get highlightSyntax(): boolean;
106
+ set highlightSyntax(value: boolean);
107
+ private checkOffset;
108
+ }
109
+ export { GtkSourceBuffer as Buffer };
110
+ export { TextIter, TextMark } from './text-iter.js';
@@ -0,0 +1,2 @@
1
+ declare const _default: () => Promise<void>;
2
+ export default _default;
@@ -0,0 +1,2 @@
1
+ export declare function toBoolean(value: unknown, name: string): boolean;
2
+ export declare function toNumber(value: unknown, name: string): number;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * `#rgb`, `#rrggbb` and `#rrggbbaa` (CSS puts the alpha LAST: Learn6502's `#00000018` is a
3
+ * barely-there black). Anything else — named colours, `rgb()` — is `undefined`; a scheme
4
+ * that uses them loses that colour rather than crashing the editor.
5
+ */
6
+ export declare function parseColor(value: string): number | undefined;
@@ -0,0 +1,5 @@
1
+ export * from './buffer-vectors.js';
2
+ export * from './init-vectors.js';
3
+ export * from './managers-vectors.js';
4
+ export * from './view-vectors.js';
5
+ export * from './gutter-paint-vectors.js';
@@ -0,0 +1,70 @@
1
+ import type { MarkupRun } from './gutter-renderer.js';
2
+ import type { EditorPalette } from './style-scheme.js';
3
+ import type { StyledRun } from './token-styler.js';
4
+ /** The size a left-gutter renderer asks for, in device-independent pixels. */
5
+ export interface GutterMetrics {
6
+ /** The insert position: below 0 the column sits left of the line numbers, otherwise right of them. */
7
+ readonly position: number;
8
+ readonly widthRequest: number;
9
+ readonly marginStart: number;
10
+ readonly marginEnd: number;
11
+ }
12
+ /** What a renderer showed for one line: plain `text`, and `runs` when it was set as `markup`. */
13
+ export interface GutterCell {
14
+ readonly text: string;
15
+ readonly runs: readonly MarkupRun[] | null;
16
+ }
17
+ /** One renderer's column for the lines `first..last`: `cells[i]` is line `first + i`. */
18
+ export interface GutterColumn extends GutterMetrics {
19
+ readonly cells: readonly GutterCell[];
20
+ }
21
+ /** What the driver reports back. Offsets are UTF-16 code units, valid AFTER the edit. */
22
+ export interface EditorHost {
23
+ /** The user replaced `removedLength` characters at `start` with `inserted`. */
24
+ onNativeEdit(start: number, removedLength: number, inserted: string): void;
25
+ onNativeSelection(start: number, end: number): void;
26
+ /** The left gutter's renderers, in paint order and without cells. */
27
+ gutterColumns(): readonly GutterMetrics[];
28
+ /**
29
+ * Asks every left-gutter renderer to fill its cell for each line of `first..last` (inclusive) with
30
+ * `vfunc_query_data`, the lines the driver is about to paint. Call it once per paint pass.
31
+ */
32
+ queryGutter(first: number, last: number): readonly GutterColumn[];
33
+ }
34
+ export interface EditorLayout {
35
+ readonly showLineNumbers: boolean;
36
+ readonly monospace: boolean;
37
+ readonly editable: boolean;
38
+ readonly highlightCurrentLine: boolean;
39
+ /** `GtkTextView:cursor-visible`: whether the insertion cursor is drawn. */
40
+ readonly cursorVisible: boolean;
41
+ /** The `left-margin` … `bottom-margin` of `Gtk.TextView`, in device-independent pixels. */
42
+ readonly leftMargin: number;
43
+ readonly rightMargin: number;
44
+ readonly topMargin: number;
45
+ readonly bottomMargin: number;
46
+ }
47
+ /** Where highlighted runs go. Spans live on the text, so they follow lines through edits. */
48
+ export interface HighlightSink {
49
+ /** Lines `[first, first + removed)` were replaced by `inserted` lines; drop what they carried. */
50
+ spliceLines(first: number, removed: number, inserted: number): void;
51
+ /** Replace everything painted on `line` (which starts at `lineStart`) with `runs`. */
52
+ paintLine(line: number, lineStart: number, runs: readonly StyledRun[]): void;
53
+ clearAll(): void;
54
+ setPalette(palette: EditorPalette): void;
55
+ }
56
+ export interface EditorDriver extends HighlightSink {
57
+ bind(host: EditorHost): void;
58
+ /** Replaces the whole text and forgets every span: the buffer was swapped. */
59
+ setText(text: string): void;
60
+ /** Mirrors a programmatic edit into the widget's text. */
61
+ replaceRange(start: number, end: number, text: string): void;
62
+ setSelection(start: number, end: number): void;
63
+ setLineCount(count: number): void;
64
+ setLayout(layout: EditorLayout): void;
65
+ /**
66
+ * A left-gutter renderer was added, moved, resized or asked to repaint. Idempotent and cheap: a
67
+ * burst of calls costs one repaint per task, as `queue_draw` does in GTK.
68
+ */
69
+ invalidateGutter(): void;
70
+ }
@@ -0,0 +1,62 @@
1
+ import { Buffer } from './buffer.js';
2
+ import type { EditorDriver, EditorHost, GutterColumn, GutterMetrics } from './editor-driver.js';
3
+ import type { GutterSet } from './gutter-renderer.js';
4
+ import { StyleSchemeManager } from './style-scheme.js';
5
+ import type { ColorSchemeVariant } from './style-scheme.js';
6
+ import { SignalEmitter } from './signals.js';
7
+ /** The leading blanks of `line`: what `auto-indent` carries onto the next line. */
8
+ export declare function leadingWhitespace(line: string): string;
9
+ export declare class EditorSession extends SignalEmitter implements EditorHost {
10
+ private readonly driver;
11
+ private readonly schemes;
12
+ private current;
13
+ private controller;
14
+ private readonly bufferHandlers;
15
+ private mirroring;
16
+ private fromNative;
17
+ private variant;
18
+ private gutters;
19
+ private props;
20
+ constructor(driver: EditorDriver, schemes?: StyleSchemeManager, variant?: ColorSchemeVariant);
21
+ get buffer(): Buffer;
22
+ set buffer(value: Buffer);
23
+ private attach;
24
+ private onBufferChanged;
25
+ private onBufferCursor;
26
+ /** Paints the left gutter of `gutters`: its changes reach the driver, and `queryGutter` answers from it. */
27
+ bindGutters(gutters: GutterSet): void;
28
+ private leftRenderers;
29
+ private metricsOf;
30
+ gutterColumns(): readonly GutterMetrics[];
31
+ queryGutter(first: number, last: number): readonly GutterColumn[];
32
+ onNativeEdit(start: number, removedLength: number, inserted: string): void;
33
+ onNativeSelection(start: number, end: number): void;
34
+ private setProp;
35
+ private pushLayout;
36
+ get autoIndent(): boolean;
37
+ set autoIndent(value: boolean);
38
+ /** Held and read back; Android has no Tab key to apply it to (see the package README). */
39
+ get indentWidth(): number;
40
+ set indentWidth(value: number);
41
+ get showLineNumbers(): boolean;
42
+ set showLineNumbers(value: boolean);
43
+ get monospace(): boolean;
44
+ set monospace(value: boolean);
45
+ get editable(): boolean;
46
+ set editable(value: boolean);
47
+ get highlightCurrentLine(): boolean;
48
+ set highlightCurrentLine(value: boolean);
49
+ get cursorVisible(): boolean;
50
+ set cursorVisible(value: boolean);
51
+ get leftMargin(): number;
52
+ set leftMargin(value: number);
53
+ get rightMargin(): number;
54
+ set rightMargin(value: number);
55
+ get topMargin(): number;
56
+ set topMargin(value: number);
57
+ get bottomMargin(): number;
58
+ set bottomMargin(value: number);
59
+ /** Re-tints for the light/dark change; the tokens are kept. */
60
+ setColorScheme(variant: ColorSchemeVariant): void;
61
+ dispose(): void;
62
+ }
@@ -0,0 +1,2 @@
1
+ declare const _default: () => Promise<void>;
2
+ export default _default;
@@ -0,0 +1,4 @@
1
+ export declare const FALLBACK_LIGHT_ID = "Adwaita";
2
+ export declare const FALLBACK_DARK_ID = "Adwaita-dark";
3
+ export declare const fallbackLightScheme: string;
4
+ export declare const fallbackDarkScheme: string;
@@ -0,0 +1,37 @@
1
+ import type { GtkSourceViewSurfaceLike, ViewLike } from './view-vectors.js';
2
+ /** The `GtkSource.GutterLines` members a renderer reads in `vfunc_query_data`. */
3
+ export interface GutterLinesLike {
4
+ get_first(): number;
5
+ get_last(): number;
6
+ is_cursor(line: number): boolean;
7
+ }
8
+ /** The slice of `GObject` a registered renderer subclass uses. */
9
+ export interface GObjectLike {
10
+ registerClass<T>(meta: object, klass: T): T;
11
+ ParamSpec: {
12
+ uint(name: string, nick: string, blurb: string, flags: any, min: number, max: number, def: number): unknown;
13
+ };
14
+ ParamFlags: {
15
+ READWRITE: unknown;
16
+ };
17
+ }
18
+ /** Where a pass happens: a window with a main loop on GJS, the document on the web. */
19
+ export interface GutterPaintHarness {
20
+ /** Puts `view` where it is painted and resolves once its first pass has run. */
21
+ present(view: ViewLike): Promise<void>;
22
+ /** Resolves once the repaint a `queue_draw` asked for would have run. */
23
+ settle(): Promise<void>;
24
+ }
25
+ export interface GutterPaintSurface extends GtkSourceViewSurfaceLike {
26
+ GObject: GObjectLike;
27
+ }
28
+ export interface GutterPaintVector {
29
+ readonly rule: string;
30
+ /** Needs a painted pass, so a door without pixels skips it. */
31
+ readonly paints: boolean;
32
+ /** `Class.vfunc_name` entries of `UNLOCKED_VFUNCS` this vector proves against GJS. */
33
+ readonly unlocks?: readonly string[];
34
+ readonly observe: (ns: GutterPaintSurface, harness: GutterPaintHarness) => Promise<unknown>;
35
+ readonly shows: unknown;
36
+ }
37
+ export declare const GUTTER_PAINT_VECTORS: readonly GutterPaintVector[];
@@ -0,0 +1,115 @@
1
+ import { GIR_TYPE, GObjectObject } from '@gjsify/adwaita-core';
2
+ import type { Buffer } from './buffer.js';
3
+ /** `Gtk.TextWindowType`: the two sides that carry a gutter. */
4
+ export declare const WINDOW_LEFT = 3;
5
+ declare const WIDGET_PROPERTIES: readonly [readonly ["margin_start", "marginStart", 0], readonly ["margin_end", "marginEnd", 0], readonly ["width_request", "widthRequest", -1], readonly ["focusable", "focusable", false], readonly ["focus_on_click", "focusOnClick", true]];
6
+ type WidgetPropertyName = (typeof WIDGET_PROPERTIES)[number][0];
7
+ export interface GutterRendererProperties {
8
+ margin_start?: number;
9
+ margin_end?: number;
10
+ width_request?: number;
11
+ focusable?: boolean;
12
+ focus_on_click?: boolean;
13
+ }
14
+ export interface GutterRendererTextProperties extends GutterRendererProperties {
15
+ text?: string | null;
16
+ markup?: string | null;
17
+ }
18
+ export declare abstract class GutterRenderer extends GObjectObject {
19
+ static [GIR_TYPE]: string;
20
+ margin_start: number;
21
+ marginStart: number;
22
+ margin_end: number;
23
+ marginEnd: number;
24
+ width_request: number;
25
+ widthRequest: number;
26
+ focusable: boolean;
27
+ focus_on_click: boolean;
28
+ focusOnClick: boolean;
29
+ /** Widget properties are held here; every other key is a property a registered subclass declares. */
30
+ constructor(properties?: GutterRendererProperties & Record<string, unknown>);
31
+ /** The view of the gutter this renderer sits in, `null` while it sits in none. */
32
+ get_view(): object | null;
33
+ get view(): object | null;
34
+ /** Asks the gutter to repaint this column; the driver paints once per task however often this is called. */
35
+ queue_draw(): void;
36
+ /** @internal Set by `Gutter.insert` and `remove`; not part of GtkSource. */
37
+ attach(gutter: Gutter | null): void;
38
+ /** @internal The held widget properties, for the driver that sizes the column. */
39
+ widgetProperty(name: WidgetPropertyName, value?: number | boolean): number | boolean;
40
+ }
41
+ /** A renderer that shows one string. `text` and `markup` replace each other, as in GtkSource. */
42
+ export declare class GutterRendererText extends GutterRenderer {
43
+ private plain;
44
+ private marked;
45
+ constructor(properties?: GutterRendererTextProperties & Record<string, unknown>);
46
+ get text(): string | null;
47
+ set text(value: string | null);
48
+ get markup(): string | null;
49
+ set markup(value: string | null);
50
+ /** `length` counts bytes, `-1` takes the whole string. */
51
+ set_text(text: string, length: number): void;
52
+ set_markup(markup: string, length: number): void;
53
+ }
54
+ /**
55
+ * `GtkSource.GutterLines`, the subset a renderer reads in `vfunc_query_data`: the visible range and
56
+ * where the cursor is. The rest (`add_class`, `get_line_yrange` …) is absent.
57
+ */
58
+ export declare class GutterLines {
59
+ private readonly owner;
60
+ private readonly text;
61
+ private readonly first;
62
+ private readonly last;
63
+ constructor(owner: object, text: Buffer, first: number, last: number);
64
+ get_first(): number;
65
+ get_last(): number;
66
+ get_buffer(): Buffer;
67
+ get_view(): object;
68
+ is_cursor(line: number): boolean;
69
+ }
70
+ /** Heard by the editor session: a column was added, moved, resized or asked to repaint. */
71
+ export type GutterListener = (gutter: Gutter) => void;
72
+ export declare class Gutter {
73
+ private readonly owner;
74
+ readonly window_type: number;
75
+ private readonly listener;
76
+ private readonly placed;
77
+ constructor(owner: object, window_type: number, listener?: GutterListener);
78
+ get_view(): object;
79
+ get view(): object;
80
+ /** Claims `renderer` at `position` (lower is nearer the left); `false` when another gutter holds it. */
81
+ insert(renderer: GutterRenderer, position: number): boolean;
82
+ remove(renderer: GutterRenderer): void;
83
+ reorder(renderer: GutterRenderer, position: number): void;
84
+ queue_draw(): void;
85
+ /** @internal Left to right; renderers at one position keep the order they were inserted in. */
86
+ get renderers(): readonly GutterRenderer[];
87
+ /** @internal The position each renderer was inserted at, parallel to `renderers`. */
88
+ get positions(): readonly number[];
89
+ private sort;
90
+ }
91
+ /** The gutters of one view, made when first asked for. */
92
+ export declare class GutterSet {
93
+ readonly view: object;
94
+ private readonly gutters;
95
+ private listener;
96
+ constructor(view: object);
97
+ /** @internal The editor session hears of every change to a gutter of this view. */
98
+ watch(listener: GutterListener): void;
99
+ /** `gtk_source_view_get_gutter`: `null` for a side that has no gutter. */
100
+ get(windowType: number): Gutter | null;
101
+ }
102
+ /** One stretch of a renderer's `markup`, with the Pango styles the drivers can paint. */
103
+ export interface MarkupRun {
104
+ readonly text: string;
105
+ readonly bold: boolean;
106
+ readonly italic: boolean;
107
+ readonly underline: boolean;
108
+ readonly strikethrough: boolean;
109
+ }
110
+ /**
111
+ * Pango markup reduced to what a gutter paints: `<b>`, `<i>`, `<u>`, `<s>` and the five entities.
112
+ * Any other tag (`<span>`, `<big>` …) is dropped and its text kept.
113
+ */
114
+ export declare function parseMarkup(markup: string): MarkupRun[];
115
+ export {};
@@ -0,0 +1,20 @@
1
+ /** Digits needed to write `lineCount`; never fewer than `minDigits`, so a 9-line file does not jitter at line 10. */
2
+ export declare function digitCount(lineCount: number, minDigits?: number): number;
3
+ /** Total gutter width in pixels: the widest label plus padding on both sides. */
4
+ export declare function gutterWidth(lineCount: number, digitWidth: number, padding: number, minDigits?: number): number;
5
+ /**
6
+ * The lines whose vertical extent meets `[viewTop, viewBottom)`, found by binary search over
7
+ * the layout's line tops so a 10 000-line file draws the ~40 labels it shows, not 10 000.
8
+ * `lineBottom(i)` is the bottom edge of line `i`; both edges are in the same pixel space as
9
+ * the view range. `null` when nothing is visible.
10
+ */
11
+ export declare function visibleLines(lineCount: number, lineTop: (line: number) => number, lineBottom: (line: number) => number, viewTop: number, viewBottom: number): {
12
+ first: number;
13
+ last: number;
14
+ } | null;
15
+ /**
16
+ * The line whose number carries the `current-line-number` style, or `-1`. The style rides on
17
+ * `highlight-current-line`: that property defaults to false, so a read-only snippet's first
18
+ * line (where the caret rests at offset 0) must not look picked out.
19
+ */
20
+ export declare function emphasisedLine(highlightCurrentLine: boolean, caretLine: number): number;
@@ -0,0 +1,2 @@
1
+ declare const _default: () => Promise<void>;
2
+ export default _default;
@@ -0,0 +1,24 @@
1
+ import type { Buffer } from './buffer.js';
2
+ import type { HighlightSink } from './editor-driver.js';
3
+ import { StyleSchemeManager } from './style-scheme.js';
4
+ import type { ColorSchemeVariant, StyleScheme } from './style-scheme.js';
5
+ export declare class HighlightController {
6
+ private readonly buffer;
7
+ private readonly sink;
8
+ private readonly schemes;
9
+ private highlighter;
10
+ private styler;
11
+ private variant;
12
+ private readonly handlers;
13
+ constructor(buffer: Buffer, sink: HighlightSink, schemes?: StyleSchemeManager, variant?: ColorSchemeVariant);
14
+ /** The scheme actually in force: the buffer's (its other-mode sibling when one exists), else the default. */
15
+ get scheme(): StyleScheme | null;
16
+ setColorScheme(variant: ColorSchemeVariant): void;
17
+ dispose(): void;
18
+ /**
19
+ * Full repaint. `retokenize` is false for a pure re-tint: the tokens did not change, only what they look like.
20
+ */
21
+ private rebuild;
22
+ private onChanged;
23
+ private paint;
24
+ }
@@ -0,0 +1,33 @@
1
+ import type { LineState, Token, Tokenizer } from './tokenizer.js';
2
+ /** Lines `first..last`, both inclusive. */
3
+ export interface LineRange {
4
+ readonly first: number;
5
+ readonly last: number;
6
+ }
7
+ /** `lines[first .. first + removed)` of the old text are now `lines[first .. first + inserted)`. */
8
+ export interface LineEdit {
9
+ readonly first: number;
10
+ readonly removed: number;
11
+ readonly inserted: number;
12
+ }
13
+ /**
14
+ * Two line states are the same when the same span contexts are open. The tokenizer hands out
15
+ * the same node object for the same context every time (its candidate lists are cached), so
16
+ * identity is the right comparison; if it ever returned fresh nodes this would only cost
17
+ * speed — the propagation would run to the end of the document — never correctness.
18
+ */
19
+ export declare function sameState(a: LineState, b: LineState): boolean;
20
+ export declare class IncrementalHighlighter {
21
+ readonly tokenizer: Tokenizer;
22
+ private results;
23
+ constructor(tokenizer: Tokenizer);
24
+ get lineCount(): number;
25
+ tokensOf(line: number): readonly Token[];
26
+ /** Tokenizes the whole text; returns the range now valid, `null` for no lines. */
27
+ reset(lines: readonly string[]): LineRange | null;
28
+ /**
29
+ * Applies one line edit. `lines` is the NEW full text, already edited. Returns the lines
30
+ * whose tokens were recomputed — the ones a renderer must repaint.
31
+ */
32
+ update(lines: readonly string[], edit: LineEdit): LineRange;
33
+ }
@@ -0,0 +1,2 @@
1
+ declare const _default: () => Promise<void>;
2
+ export default _default;
@@ -4,3 +4,19 @@ export * from './style.js';
4
4
  export * from './regex.js';
5
5
  export * from './xml.js';
6
6
  export * from './tokenizer.js';
7
+ export * from './signals.js';
8
+ export * from './color.js';
9
+ export * from './buffer.js';
10
+ export * from './language-manager.js';
11
+ export * from './style-scheme.js';
12
+ export * from './fallback-schemes.js';
13
+ export * from './token-styler.js';
14
+ export * from './highlighter.js';
15
+ export * from './highlight-controller.js';
16
+ export * from './editor-driver.js';
17
+ export * from './editor-session.js';
18
+ export * from './line-store.js';
19
+ export * from './gutter.js';
20
+ export * from './gutter-renderer.js';
21
+ export * from './coerce.js';
22
+ export * from './init.js';
@@ -0,0 +1,10 @@
1
+ /** The part of `GtkSource` the vectors read. */
2
+ export interface GtkSourceInitLike {
3
+ init(): unknown;
4
+ }
5
+ export interface GtkSourceInitVector {
6
+ readonly rule: string;
7
+ readonly observe: (GtkSource: GtkSourceInitLike) => unknown;
8
+ readonly shows: unknown;
9
+ }
10
+ export declare const GTKSOURCE_INIT_VECTORS: readonly GtkSourceInitVector[];
@@ -0,0 +1 @@
1
+ export declare function init(): void;
@@ -0,0 +1,2 @@
1
+ declare const _default: () => Promise<void>;
2
+ export default _default;
@@ -0,0 +1,2 @@
1
+ declare const _default: () => Promise<void>;
2
+ export default _default;
@@ -0,0 +1,35 @@
1
+ import { Tokenizer } from './tokenizer.js';
2
+ import type { LanguageDefinition } from './types.js';
3
+ export declare class Language {
4
+ readonly definition: LanguageDefinition;
5
+ private cached;
6
+ constructor(definition: LanguageDefinition);
7
+ get id(): string;
8
+ get name(): string;
9
+ get section(): string;
10
+ get globs(): string[];
11
+ get mimeTypes(): string[];
12
+ /** Built on first use: compiling every pattern is the expensive part of loading a language. */
13
+ get tokenizer(): Tokenizer;
14
+ }
15
+ export declare class LanguageManager {
16
+ private static instance;
17
+ /** `GtkSource.LanguageManager.get_default()`. */
18
+ static getDefault(): LanguageManager;
19
+ /** GJS spelling of {@link getDefault}. */
20
+ static get_default(): LanguageManager;
21
+ private readonly languages;
22
+ get languageIds(): string[];
23
+ /**
24
+ * Parses and registers a `.lang` file. Constructs the core does not model land in
25
+ * `language.definition.unsupported`; pass `strict` to throw on them instead.
26
+ */
27
+ addLanguageFromXml(xml: string, options?: {
28
+ strict?: boolean;
29
+ }): Language;
30
+ getLanguage(id: string): Language | null;
31
+ /** GJS spelling of {@link getLanguage}. */
32
+ get_language(id: string): Language | null;
33
+ /** `gtk_source_language_manager_guess_language()`: by file name first, then by content type. */
34
+ guessLanguage(filename: string | null, contentType: string | null): Language | null;
35
+ }
@@ -0,0 +1,9 @@
1
+ export declare class LineStore<T> {
2
+ private slots;
3
+ get(line: number): T | undefined;
4
+ set(line: number, value: T | undefined): void;
5
+ /** Returns the values that were dropped, so the caller can release what they hold. */
6
+ splice(first: number, removed: number, inserted: number): T[];
7
+ /** Empties every slot and returns the values that were held. */
8
+ clear(): T[];
9
+ }
@@ -0,0 +1,25 @@
1
+ /** The part of `GtkSource` the vectors read. */
2
+ export interface GtkSourceManagersLike {
3
+ LanguageManager: {
4
+ get_default(): {
5
+ get_language(id: string): unknown;
6
+ };
7
+ };
8
+ StyleSchemeManager: {
9
+ get_default(): {
10
+ get_scheme(id: string): {
11
+ id: string;
12
+ } | null;
13
+ };
14
+ };
15
+ Buffer: new (properties?: any) => {
16
+ text: string;
17
+ language: unknown;
18
+ };
19
+ }
20
+ export interface GtkSourceManagersVector {
21
+ readonly rule: string;
22
+ readonly observe: (GtkSource: GtkSourceManagersLike) => unknown;
23
+ readonly shows: unknown;
24
+ }
25
+ export declare const GTKSOURCE_MANAGER_VECTORS: readonly GtkSourceManagersVector[];
@@ -0,0 +1,2 @@
1
+ declare const _default: () => Promise<void>;
2
+ export default _default;
@@ -0,0 +1,2 @@
1
+ declare const _default: () => Promise<void>;
2
+ export default _default;
@@ -0,0 +1,2 @@
1
+ declare const _default: () => Promise<void>;
2
+ export default _default;
@@ -0,0 +1,12 @@
1
+ export declare class SignalEmitter {
2
+ private readonly handlers;
3
+ connect(name: string, callback: (self: this, ...args: never[]) => void): number;
4
+ /** `g_signal_connect_after`: runs once every plain handler of the emission has run. */
5
+ connect_after(name: string, callback: (self: this, ...args: never[]) => void): number;
6
+ /** An emitter that knows its signals overrides this and throws for a name it does not have. */
7
+ protected checkSignal(_name: string): void;
8
+ private add;
9
+ /** Removes exactly the handler `connect` returned this id for; an id nothing holds throws. */
10
+ disconnect(id: number): void;
11
+ protected emit(name: string, ...args: unknown[]): void;
12
+ }
@@ -0,0 +1,55 @@
1
+ import type { ResolvedStyle, StyleSchemeDefinition } from './types.js';
2
+ export type ColorSchemeVariant = 'light' | 'dark';
3
+ export declare class StyleScheme {
4
+ readonly definition: StyleSchemeDefinition;
5
+ private readonly lookup;
6
+ constructor(definition: StyleSchemeDefinition, lookup: (id: string) => StyleSchemeDefinition | undefined);
7
+ get id(): string;
8
+ get name(): string;
9
+ get parentId(): string | undefined;
10
+ /** `text`, `line-numbers`, `def:keyword`, …; throws on a parent-scheme loop or a missing parent. */
11
+ getStyle(name: string): ResolvedStyle | undefined;
12
+ }
13
+ /** The colours the view itself paints — everything that is not a syntax token. ARGB ints. */
14
+ export interface EditorPalette {
15
+ readonly dark: boolean;
16
+ readonly foreground: number;
17
+ readonly background: number;
18
+ readonly selectionBackground: number;
19
+ readonly currentLineBackground: number;
20
+ readonly lineNumberForeground: number;
21
+ readonly lineNumberBackground: number;
22
+ readonly currentLineNumberForeground: number;
23
+ readonly currentLineNumberBackground: number;
24
+ }
25
+ /** Reads the palette off a scheme; a style the scheme (and its parents) lack takes a neutral default. */
26
+ export declare function paletteOf(scheme: StyleScheme, variant: ColorSchemeVariant): EditorPalette;
27
+ export declare class StyleSchemeManager {
28
+ private static instance;
29
+ /** `GtkSource.StyleSchemeManager.get_default()`. */
30
+ static getDefault(): StyleSchemeManager;
31
+ /** GJS spelling of {@link getDefault}. */
32
+ static get_default(): StyleSchemeManager;
33
+ private readonly definitions;
34
+ private readonly fallbacks;
35
+ /** @param withFallbacks register this package's own `Adwaita`/`Adwaita-dark` stand-ins. */
36
+ constructor(withFallbacks?: boolean);
37
+ get schemeIds(): string[];
38
+ /** Whether `id` is still this package's stand-in rather than a scheme the consumer supplied. */
39
+ isFallback(id: string): boolean;
40
+ /** Adds a scheme, replacing one with the same id (that is how the real Adwaita replaces the stand-in). */
41
+ addScheme(definition: StyleSchemeDefinition): StyleScheme;
42
+ addSchemeFromXml(xml: string): StyleScheme;
43
+ getScheme(id: string): StyleScheme | null;
44
+ /** GJS spelling of {@link getScheme}. */
45
+ get_scheme(id: string): StyleScheme | null;
46
+ /** The scheme to use when nothing was chosen: the stand-in or real `Adwaita` / `Adwaita-dark`. */
47
+ getDefaultFor(variant: ColorSchemeVariant): StyleScheme | null;
48
+ /**
49
+ * The same scheme for the other mode, found by the `<id>-dark` naming convention
50
+ * (`Learn6502` / `Learn6502-dark`). `scheme` itself when it already is the asked variant
51
+ * or has no sibling — never a guess across unrelated schemes.
52
+ */
53
+ variantOf(scheme: StyleScheme, variant: ColorSchemeVariant): StyleScheme;
54
+ private wrap;
55
+ }
@@ -0,0 +1,21 @@
1
+ /** What an iterator needs of its buffer. */
2
+ export interface TextIterSource {
3
+ readonly length: number;
4
+ getText(start?: number, end?: number): string;
5
+ }
6
+ export declare class TextIter {
7
+ readonly source: TextIterSource;
8
+ private offset;
9
+ /** Made by a buffer, never by a caller: GTK hands iterators out, it does not take them in. `source` is the owning buffer. */
10
+ constructor(source: TextIterSource, utf16Offset: number);
11
+ /** The offset in UTF-16 units, the buffer's own measure; not part of the `Gtk.TextIter` surface. */
12
+ get utf16Offset(): number;
13
+ get_offset(): number;
14
+ /** Like `gtk_text_iter_set_offset`: a negative offset, or one past the end, is the end. */
15
+ set_offset(charOffset: number): void;
16
+ }
17
+ /** One of the two marks every buffer has, `insert` and `selection_bound`. */
18
+ export declare class TextMark {
19
+ readonly name: string | null;
20
+ constructor(name: string | null);
21
+ }
@@ -0,0 +1,27 @@
1
+ import type { Token } from './tokenizer.js';
2
+ import type { LanguageDefinition } from './types.js';
3
+ import type { StyleScheme } from './style-scheme.js';
4
+ /** What one run of text looks like. Colours are signed ARGB ints. */
5
+ export interface RunStyle {
6
+ readonly foreground?: number;
7
+ readonly background?: number;
8
+ readonly bold: boolean;
9
+ readonly italic: boolean;
10
+ readonly underline: boolean;
11
+ readonly strikethrough: boolean;
12
+ }
13
+ /** `[start, end)` within one line. */
14
+ export interface StyledRun {
15
+ readonly start: number;
16
+ readonly end: number;
17
+ readonly style: RunStyle;
18
+ }
19
+ export declare class TokenStyler {
20
+ private readonly language;
21
+ private readonly scheme;
22
+ private readonly cache;
23
+ constructor(language: LanguageDefinition, scheme: StyleScheme);
24
+ /** `undefined` when the scheme gives the style nothing to paint: the run keeps the text colour. */
25
+ styleFor(tokenStyle: string): RunStyle | undefined;
26
+ runsOf(tokens: readonly Token[]): StyledRun[];
27
+ }
@@ -0,0 +1,85 @@
1
+ export interface GtkSourceViewDefaultsVector {
2
+ readonly property: string;
3
+ /** The member a port spells it as. */
4
+ readonly member: string;
5
+ readonly shows: boolean | number;
6
+ }
7
+ export declare const GTKSOURCE_VIEW_DEFAULT_VECTORS: readonly GtkSourceViewDefaultsVector[];
8
+ interface AdjustmentLike {
9
+ get_value(): number;
10
+ }
11
+ export interface ViewLike {
12
+ cursor_visible: boolean;
13
+ editable: boolean;
14
+ highlight_current_line: boolean;
15
+ show_line_numbers: boolean;
16
+ readonly vadjustment: AdjustmentLike;
17
+ readonly hadjustment: AdjustmentLike;
18
+ get_cursor_visible(): boolean;
19
+ set_cursor_visible(value: boolean): void;
20
+ get_editable(): boolean;
21
+ set_editable(value: boolean): void;
22
+ get_vadjustment(): AdjustmentLike;
23
+ get_direction(): number;
24
+ set_direction(direction: number): void;
25
+ get_first_child(): unknown;
26
+ get_next_sibling(): unknown;
27
+ get_parent(): unknown;
28
+ get_gutter(windowType: number): GutterLike | null;
29
+ buffer: {
30
+ text: string;
31
+ };
32
+ }
33
+ export interface GutterRendererLike {
34
+ text: string | null;
35
+ markup: string | null;
36
+ margin_start: number;
37
+ marginStart: number;
38
+ margin_end: number;
39
+ width_request: number;
40
+ focusable: boolean;
41
+ focus_on_click: boolean;
42
+ get_view(): unknown;
43
+ set_text(text: string, length: number): void;
44
+ set_markup(markup: string, length: number): void;
45
+ queue_draw(): void;
46
+ }
47
+ export interface GutterLike {
48
+ readonly view: unknown;
49
+ readonly window_type: number;
50
+ get_view(): unknown;
51
+ insert(renderer: GutterRendererLike, position: number): boolean;
52
+ remove(renderer: GutterRendererLike): void;
53
+ reorder(renderer: GutterRendererLike, position: number): void;
54
+ queue_draw(): void;
55
+ }
56
+ export interface ScrolledWindowLike {
57
+ readonly vadjustment: AdjustmentLike;
58
+ get_policy(): [number, number];
59
+ set_policy(h: number, v: number): void;
60
+ set_vadjustment(adjustment: AdjustmentLike): void;
61
+ get_vadjustment(): AdjustmentLike;
62
+ }
63
+ /** The parts of `Gtk` and `GtkSource` the slice-4 and slice-6 vectors read. */
64
+ export interface GtkSourceViewSurfaceLike {
65
+ Gtk: {
66
+ TextWindowType: Record<string, number>;
67
+ PolicyType: Record<string, number>;
68
+ TextDirection: Record<string, number>;
69
+ ScrolledWindow: new (properties?: any) => ScrolledWindowLike;
70
+ };
71
+ GtkSource: {
72
+ View: new (properties?: any) => ViewLike;
73
+ GutterRenderer: new (properties?: any) => GutterRendererLike;
74
+ GutterRendererText: new (properties?: any) => GutterRendererLike;
75
+ };
76
+ }
77
+ export interface GtkSourceViewSurfaceVector {
78
+ readonly rule: string;
79
+ /** Whether a `GtkSource.View` instance is built, which needs a display on GJS. */
80
+ readonly instance: boolean;
81
+ readonly observe: (ns: GtkSourceViewSurfaceLike) => unknown;
82
+ readonly shows: unknown;
83
+ }
84
+ export declare const GTKSOURCE_VIEW_SURFACE_VECTORS: readonly GtkSourceViewSurfaceVector[];
85
+ export {};
@@ -0,0 +1,2 @@
1
+ declare const _default: () => Promise<void>;
2
+ export default _default;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gjsify/gtksource-core",
3
- "version": "0.56.0",
3
+ "version": "0.58.0",
4
4
  "description": "Headless GtkSourceView language/style parsing (renderer-free) — parse .lang and style scheme XML into typed data with JS regex translation, strict unsupported reporting",
5
5
  "type": "module",
6
6
  "module": "lib/esm/index.js",
@@ -9,6 +9,10 @@
9
9
  ".": {
10
10
  "types": "./lib/types/index.d.ts",
11
11
  "default": "./lib/esm/index.js"
12
+ },
13
+ "./conformance": {
14
+ "types": "./lib/types/conformance.d.ts",
15
+ "default": "./lib/esm/conformance.js"
12
16
  }
13
17
  },
14
18
  "files": [
@@ -41,9 +45,12 @@
41
45
  "style-scheme",
42
46
  "headless"
43
47
  ],
48
+ "dependencies": {
49
+ "@gjsify/adwaita-core": "^0.58.0"
50
+ },
44
51
  "devDependencies": {
45
- "@gjsify/cli": "^0.56.0",
46
- "@gjsify/unit": "^0.56.0",
52
+ "@gjsify/cli": "^0.58.0",
53
+ "@gjsify/unit": "^0.58.0",
47
54
  "@types/node": "^25.9.2",
48
55
  "typescript": "^6.0.3"
49
56
  },