Compare commits

...

2 commits
v0.1.8 ... main

Author SHA1 Message Date
Leon Mika 9f14a895fa Fixed caret position for append transforms
All checks were successful
Build / build (push) Successful in 39s
Release Build / build (push) Successful in 3m59s
2026-05-04 22:00:12 +10:00
Leon Mika 44a5b664a0 Removed UCL processors
All checks were successful
Build / build (push) Successful in 40s
2026-05-04 21:34:39 +10:00
3 changed files with 46 additions and 38 deletions

View file

@ -12,11 +12,19 @@ class TextProcessor {
setCodeMirrorEditor(editor) {
this._editor = editor;
window.runtime.EventsOn("process-text-response", (data) => {
const cursorPos = this._editor.state.selection.main.head;
const appendInsertPos = this._appendInsertPos;
this._appendInsertPos = undefined;
let newSelection;
const changes = data.output.map(span => {
if (span.append) {
const insertAt = appendInsertPos !== undefined ? appendInsertPos : span.pos + span.len;
if (cursorPos === insertAt) {
newSelection = { anchor: insertAt + span.text.length };
}
return {
from: span.pos + span.len,
to: span.pos + span.len,
from: insertAt,
to: insertAt,
insert: span.text,
};
} else {
@ -27,7 +35,11 @@ class TextProcessor {
};
}
});
this._editor.dispatch({ changes: changes });
const transaction = { changes: changes };
if (newSelection) {
transaction.selection = newSelection;
}
this._editor.dispatch(transaction);
});
window.runtime.EventsOn("request-text-process", (data) => {
this.runTextCommand(data.action);
@ -44,12 +56,14 @@ class TextProcessor {
let inputs = [];
if (shouldBeAll) {
this._appendInsertPos = this._editor.state.selection.main.head;
inputs.push({
text: this._editor.state.doc.toString(),
pos: 0,
len: this._editor.state.doc.length,
});
} else {
this._appendInsertPos = undefined;
inputs = ranges.map(r => ({
text: this._editor.state.doc.slice(r.from, r.to).toString(),
pos: r.from,

2
go.mod
View file

@ -3,6 +3,7 @@ module dequoter
go 1.25
require (
github.com/google/uuid v1.6.0
github.com/kirsle/configdir v0.0.0-20170128060238-e45d2f54772f
github.com/wailsapp/wails/v2 v2.10.2
gopkg.in/yaml.v3 v3.0.1
@ -49,7 +50,6 @@ require (
github.com/go-viper/mapstructure/v2 v2.5.0 // indirect
github.com/godbus/dbus/v5 v5.1.0 // indirect
github.com/golang-jwt/jwt/v4 v4.5.2 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/gorilla/websocket v1.5.3 // indirect
github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e // indirect
github.com/labstack/echo/v4 v4.13.3 // indirect

View file

@ -14,6 +14,7 @@ import (
"text/template"
"github.com/google/uuid"
"gopkg.in/yaml.v3"
"ucl.lmika.dev/ucl"
)
@ -60,14 +61,25 @@ var TextFilters = map[string]TextProcessor{
return TextFilterResponse{Output: strings.ToLower(input)}, nil
},
},
"quote": {
Label: "String: Quote",
Filter: func(ctx context.Context, input string) (resp TextFilterResponse, err error) {
return TextFilterResponse{Output: strconv.Quote(input)}, nil
},
},
"unquote": {
Label: "String: Unquote",
Filter: func(ctx context.Context, input string) (resp TextFilterResponse, err error) {
out, err := strconv.Unquote(input)
endNL := ""
if strings.HasSuffix(input, "\n") {
endNL = "\n"
}
out, err := strconv.Unquote(strings.TrimSpace(input))
if err != nil {
return TextFilterResponse{}, err
}
return TextFilterResponse{Output: out}, nil
return TextFilterResponse{Output: out + endNL}, nil
},
},
"join-lines-with-commas": {
@ -176,6 +188,20 @@ var TextFilters = map[string]TextProcessor{
},
},
"uuid": {
Label: "Generate: UUID v4",
Filter: func(ctx context.Context, input string) (resp TextFilterResponse, err error) {
u, err := uuid.NewRandom()
if err != nil {
return TextFilterResponse{}, fmt.Errorf("failed to generate UUID: %w", err)
}
return TextFilterResponse{
Output: u.String(),
Append: true,
}, nil
},
},
"lines": {
Label: "Lines: Count",
Analyze: func(ctx context.Context, input string) (result string, err error) {
@ -265,22 +291,6 @@ var TextFilters = map[string]TextProcessor{
},
},
"ucl-evaluate": {
Label: "UCL: Evaluate",
Description: "Evaluates the input as a UCL expression and displays the result in the status bar.",
Analyze: func(ctx context.Context, input string) (result string, err error) {
res, err := uclInstFromContext(ctx).EvalString(ctx, input)
if err != nil {
if errors.Is(err, ucl.ErrNotConvertable) {
return "Evaluated successfully. No result.", err
}
return "", err
}
return fmt.Sprintf("Result: %v", res), nil
},
},
"sort-lines-asc": {
Label: "Lines: Sort A-Z",
Filter: func(ctx context.Context, input string) (resp TextFilterResponse, err error) {
@ -356,22 +366,6 @@ var TextFilters = map[string]TextProcessor{
},
},
},
"ucl-replace": {
Label: "UCL: Replace",
Description: "Evaluates the input as a UCL expression and replaces it with the result.",
Filter: func(ctx context.Context, input string) (resp TextFilterResponse, err error) {
res, err := uclInstFromContext(ctx).EvalString(ctx, input)
if err != nil {
if errors.Is(err, ucl.ErrNotConvertable) {
return TextFilterResponse{}, err
}
return TextFilterResponse{}, err
}
return TextFilterResponse{Output: fmt.Sprint(res)}, nil
},
},
}
type strPseudoVar struct {