Compare commits

..

No commits in common. "main" and "v0.1.6" have entirely different histories.
main ... v0.1.6

8 changed files with 35 additions and 82 deletions

View file

@ -26,14 +26,14 @@ jobs:
npm install
wails build -clean -platform darwin/arm64 -ldflags "-X main.VersionNumber=`git describe --tags --abbrev=0`"
- name: Release
uses: https://lmika.dev/actions/wails-release@v1.0.3
uses: https://lmika.dev/actions/wails-release@v1.0.2
with:
developer-id-cert-base64: ${{ secrets.MACOS_SIGN_P12 }}
developer-id-cert-password: ${{ secrets.MACOS_SIGN_PASSWORD }}
notarization-api-key-base64: ${{ secrets.MACOS_NOTARY_KEY }}
notarization-api-key-id: ${{ secrets.MACOS_NOTARY_KEY_ID }}
notarization-api-issuer-id: ${{ secrets.MACOS_NOTARY_ISSUER_ID }}
extra-build-flags: -ldflags "-X main.VersionNumber=${{ github.ref_name }}"
extra-build-flags: '-ldflags "-X main.VersionNumber=${{ forgejo.ref_name }}"'
s3-bucket: lmika-public-files
s3-key: Apps/Dequoter/{version}/{filename}
s3-region: ap-southeast-2

Binary file not shown.

Before

Width:  |  Height:  |  Size: 404 KiB

After

Width:  |  Height:  |  Size: 392 KiB

Binary file not shown.

View file

@ -6,12 +6,9 @@
.editor-mountpoint {
flex-grow: 1;
flex-shrink: 1;
min-height: 0;
overflow: hidden;
}
.status-bar {
flex-shrink: 0;
height: 2em;
background-color: rgb(245, 245, 245);
border-top: solid thin rgb(200, 200, 200);

View file

@ -12,19 +12,11 @@ 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: insertAt,
to: insertAt,
from: span.pos + span.len,
to: span.pos + span.len,
insert: span.text,
};
} else {
@ -35,11 +27,7 @@ class TextProcessor {
};
}
});
const transaction = { changes: changes };
if (newSelection) {
transaction.selection = newSelection;
}
this._editor.dispatch(transaction);
this._editor.dispatch({ changes: changes });
});
window.runtime.EventsOn("request-text-process", (data) => {
this.runTextCommand(data.action);
@ -56,14 +44,12 @@ 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,7 +3,6 @@ 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
@ -50,6 +49,7 @@ 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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 404 KiB

After

Width:  |  Height:  |  Size: 392 KiB

View file

@ -8,13 +8,11 @@ import (
"errors"
"fmt"
"regexp"
"sort"
"strconv"
"strings"
"text/template"
"github.com/google/uuid"
"gopkg.in/yaml.v3"
"ucl.lmika.dev/ucl"
)
@ -61,25 +59,14 @@ 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) {
endNL := ""
if strings.HasSuffix(input, "\n") {
endNL = "\n"
}
out, err := strconv.Unquote(strings.TrimSpace(input))
out, err := strconv.Unquote(input)
if err != nil {
return TextFilterResponse{}, err
}
return TextFilterResponse{Output: out + endNL}, nil
return TextFilterResponse{Output: out}, nil
},
},
"join-lines-with-commas": {
@ -188,20 +175,6 @@ 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) {
@ -291,38 +264,19 @@ var TextFilters = map[string]TextProcessor{
},
},
"sort-lines-asc": {
Label: "Lines: Sort A-Z",
Filter: func(ctx context.Context, input string) (resp TextFilterResponse, err error) {
lines := strings.Split(input, "\n")
sort.Strings(lines)
return TextFilterResponse{Output: strings.Join(lines, "\n")}, nil
},
},
"sort-lines-desc": {
Label: "Lines: Sort Z-A",
Filter: func(ctx context.Context, input string) (resp TextFilterResponse, err error) {
lines := strings.Split(input, "\n")
sort.Sort(sort.Reverse(sort.StringSlice(lines)))
return TextFilterResponse{Output: strings.Join(lines, "\n")}, nil
},
},
"unique-lines": {
Label: "Lines: Unique",
Filter: func(ctx context.Context, input string) (resp TextFilterResponse, err error) {
lines := strings.Split(input, "\n")
seen := make(map[string]struct{}, len(lines))
dst := make([]string, 0, len(lines))
for _, line := range lines {
if _, ok := seen[line]; ok {
continue
"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
}
seen[line] = struct{}{}
dst = append(dst, line)
return "", err
}
return TextFilterResponse{Output: strings.Join(dst, "\n")}, nil
return fmt.Sprintf("Result: %v", res), nil
},
},
@ -366,6 +320,22 @@ 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 {