This commit is contained in:
torsten 2026-02-21 11:02:49 +01:00
parent 08eb83a0a5
commit 34d27386d5
19 changed files with 9136 additions and 10496 deletions

File diff suppressed because it is too large Load diff

View file

@ -1,7 +1,7 @@
{
"id": "calc-craft",
"name": "CalcCraft",
"version": "2.2.7",
"version": "2.3.7",
"minAppVersion": "0.15.0",
"description": "have formulas like in excel a1+a2, or sum()",
"author": "klaudyu",

View file

@ -119,24 +119,26 @@ td.label-cell.row {
/* Hide original text when showing computed value */
.cm-table-widget .table-cell-wrapper.calc-overlay-cell:not(:focus-within) {
position: relative;
color: transparent;
position: relative;
font-size: 0; /* Collapse the text so it doesn't affect layout */
line-height: 0;
}
/* Base overlay - inherits color from parent cell */
.cm-table-widget .table-cell-wrapper.calc-overlay-cell:not(:focus-within)::after {
content: attr(data-calc-display);
position: absolute;
inset: 0;
display: flex;
align-items: center;
white-space: pre;
color: inherit; /* ← Changed from var(--text-normal) to inherit */
pointer-events: none;
padding: 0 4px;
content: attr(data-calc-display);
position: relative; /* Changed from absolute */
display: inline-block; /* Changed to allow sizing */
white-space: pre;
color: inherit;
font-size: 1rem; /* Restore normal font size */
line-height: normal; /* Restore normal line height */
padding: 0 4px;
vertical-align: middle;
}
/* Formula cell overlays - inherit formula colors */
.cm-table-widget .formula-cell-colorenabled .table-cell-wrapper.calc-overlay-cell:not(:focus-within)::after {
color: var(--CalcCraft_formula_font_color_light);
@ -180,4 +182,55 @@ td.label-cell.row {
.theme-dark .cm-table-widget .cell-children-highlight .table-cell-wrapper.calc-overlay-cell:not(:focus-within)::after {
color: var(--CalcCraft_formula_font_children_dark);
}
}
/* Make table cells position relative for absolute positioning of labels */
table th,
table td {
position: relative;
}
/* Add padding to table to make room for labels */
table {
margin-left: 25px;
margin-top: 20px;
}
/* Column labels - display above th/td elements */
th[data-col-letter]::before,
td[data-col-letter]::before {
content: attr(data-col-letter);
position: absolute;
top: -18px;
left: 50%;
transform: translateX(-50%);
font-size: 0.75em;
color: var(--text-muted);
font-weight: normal;
pointer-events: none;
white-space: nowrap;
z-index: 1;
}
/* Row labels - display to the left of first cell in each row */
tr th:first-child[data-row-number]::after,
tr td:first-child[data-row-number]::after {
content: attr(data-row-number);
position: absolute;
left: -25px;
top: 50%;
#transform: translateY(-50%);
font-size: 0.75em;
color: var(--text-muted);
font-weight: normal;
pointer-events: none;
white-space: nowrap;
}
/* Escaped text cells - look like normal text, not formulas */
.cm-table-widget .escaped-text-cell .table-cell-wrapper.calc-overlay-cell:not(:focus-within)::after {
color: var(--text-normal); /* Normal text color, not formula color */
}

View file

@ -10,27 +10,53 @@ class GdscriptSyntaxPlugin extends obsidian.Plugin {
// onload, so continue to try and define the language until it is.
const setupInterval = setInterval(() => {
if (CodeMirror && CodeMirror.defineSimpleMode) {
const KEYWORDS = new Set([
'and','as','assert','await','break','breakpoint','const','continue','elif','else','enum',
'for','if','in','master','mastersync','match','not','null','or','pass','preload',
'puppet','puppetsync','remote','remotesync','return','self','setget','static','tool',
'var','while','yield'
]);
const mode = {
start: [
{ regex: /\b0x[0-9a-f]+\b/i, token: "number" },
{ regex: /\b-?\d+\b/, token: "number" },
{ regex: /\b0x[0-9a-f]+\b/i, token: 'number' },
{ regex: /\b-?\d+\b/, token: 'number' },
{ regex: /#.+/, token: 'comment' },
{ regex: /\s*(@onready|@export)\b/, token: 'keyword' },
{ regex: /\b(?:and|as|assert|await|break|breakpoint|const|continue|elif|else|enum|for|if|in|is|master|mastersync|match|not|null|or|pass|preload|puppet|puppetsync|remote|remotesync|return|self|setget|static|tool|var|while|yield)\b/, token: 'keyword' },
{ regex: /[()\[\]{},]/, token: "meta" },
{ regex: /[()\[\]{},]/, token: 'meta' },
// The words following func, class_name and class should be highlighted as attributes,
// so push onto the definition stack
{ regex: /\b(func|class_name|class|extends|signal)\b/, token: "keyword", push: "definition" },
{ regex: /\b(func|class_name|class|extends|signal|is)\b/, token: 'keyword', push: 'definition' },
{ regex: /@?(?:("|')(?:(?!\1)[^\n\\]|\\[\s\S])*\1(?!"|')|"""(?:[^\\]|\\[\s\S])*?""")/, token: "string" },
{ regex: /@?(?:("|')(?:(?!\1)[^\n\\]|\\[\s\S])*\1(?!"|')|"""(?:[^\\]|\\[\s\S])*?""")/, token: 'string' },
{ regex: /\$[\w\/]+\b/, token: 'variable' },
{ regex: /\:[\s]*$/, token: 'operator' },
{ regex: /\:[ ]*/, token: 'meta', push: 'var_type' },
{ regex: /\->[ ]*/, token: 'operator', push: 'definition' },
{ regex: /\+|\*|-|\/|:=|>|<|\^|&|\||%|~|=/, token: "operator" },
{ regex: /\+|\*|-|\/|:=|>|<|\^|&|\||%|~|=/, token: 'operator' },
{ regex: /\b(?:false|true)\b/, token: 'number' },
{ regex: /\b[A-Z][A-Z_\d]*\b/, token: 'operator' },
// Function calls on objects: object.doSomething()
{
regex: /(\.)([A-Za-z_]\w*)(?=\s*\()/,
token: ['operator', 'variable'],
},
// Normal function calls: doSomething()
{
regex: /[A-Za-z_]\w*(?=\s*\()/,
token: 'variable',
},
{
regex: /[A-Za-z_]\w*/,
token: (match) => {
const word = Array.isArray(match) ? match[0] : match;
return KEYWORDS.has(word) ? 'keyword' : null;
}
},
],
var_type: [
{ regex: /(\w+)/, token: 'attribute', pop: true },

View file

@ -6,5 +6,5 @@
"isDesktopOnly": false,
"minAppVersion": "1.5.12",
"name": "GDScript Syntax Highlighting",
"version": "1.0.3"
"version": "1.1.0"
}

View file

@ -1,4 +1,6 @@
{
"copyLinkToElemenetAnchorTo100": false,
"copyFrameLinkByName": false,
"disableDoubleClickTextEditing": false,
"folder": "",
"cropFolder": "",
@ -39,6 +41,9 @@
"overrideObsidianFontSize": false,
"dynamicStyling": "colorful",
"isLeftHanded": false,
"desktopUIMode": "tray",
"tabletUIMode": "compact",
"phoneUIMode": "mobile",
"iframeMatchExcalidrawTheme": true,
"matchTheme": false,
"matchThemeAlways": false,
@ -72,6 +77,7 @@
"focusOnFileTab": true,
"openInMainWorkspace": true,
"showLinkBrackets": true,
"syncElementLinkWithText": false,
"allowCtrlClick": true,
"forceWrap": false,
"pageTransclusionCharLimit": 200,
@ -119,9 +125,7 @@
"mdBorderColor": "Black",
"mdCSS": "",
"scriptEngineSettings": {},
"defaultTrayMode": true,
"compactModeOnTablets": true,
"previousRelease": "2.16.1",
"previousRelease": "2.20.5",
"showReleaseNotes": true,
"compareManifestToPluginVersion": true,
"showNewVersionNotification": true,
@ -130,6 +134,7 @@
"taskboneEnabled": false,
"taskboneAPIkey": "",
"pinnedScripts": [],
"sidepanelTabs": [],
"customPens": [
{
"type": "default",
@ -484,6 +489,7 @@
"aiEnabled": true,
"openAIAPIToken": "",
"openAIDefaultTextModel": "gpt-3.5-turbo-1106",
"openAIDefaultTextModelMaxTokens": 4096,
"openAIDefaultVisionModel": "gpt-4o",
"openAIDefaultImageGenerationModel": "dall-e-3",
"openAIURL": "https://api.openai.com/v1/chat/completions",
@ -811,6 +817,9 @@
"alignment": "center",
"margin": "normal"
},
"disableContextMenu": false,
"defaultTrayMode": true,
"compactModeOnTablets": true,
"autosaveInterval": 15000,
"mathjaxSourceURL": "https://cdn.jsdelivr.net/npm/mathjax@3.2.1/es5/tex-svg.js"
}

File diff suppressed because one or more lines are too long

View file

@ -1,12 +1,12 @@
{
"id": "obsidian-excalidraw-plugin",
"name": "Excalidraw",
"version": "2.16.1",
"version": "2.20.5",
"minAppVersion": "1.5.7",
"description": "An Obsidian plugin to edit and view Excalidraw drawings",
"description": "Sketch Your Mind. An Obsidian plugin to edit and view Excalidraw drawings. Enter the world of 4D Visual PKM.",
"author": "Zsolt Viczian",
"authorUrl": "https://excalidraw-obsidian.online",
"fundingUrl": "https://ko-fi.com/zsolt",
"helpUrl": "https://github.com/zsviczian/obsidian-excalidraw-plugin#readme",
"isDesktopOnly": false
}
}

File diff suppressed because one or more lines are too long