Compare commits

...

3 commits

Author SHA1 Message Date
7fd6f8333e add JJController.ignore_paths back in 2025-02-12 11:00:32 +00:00
c61928a55a update static files 2025-02-12 11:00:14 +00:00
8800b4b11c remove codemirror-element
It's now a separate project
2025-02-12 10:59:55 +00:00
7 changed files with 6224 additions and 1305 deletions

View file

@ -1,13 +0,0 @@
NODE_BIN=node_modules/.bin
DEST=../thinks/static/thinks
$(DEST)/code-editor.mjs: code-editor.bundle.mjs
cp $< $@
code-editor.terser.mjs: code-editor.bundle.mjs
$(NODE_BIN)/terser --compress --mangle -- $< > $@
code-editor.bundle.mjs: code-editor.mjs
$(NODE_BIN)/rollup $< -f es -p @rollup/plugin-node-resolve -o $@

View file

@ -1,73 +0,0 @@
import {basicSetup} from "codemirror";
import {EditorView, keymap} from "@codemirror/view";
import {EditorState} from "@codemirror/state";
import {python} from "@codemirror/lang-python";
import {r} from "codemirror-lang-r";
import {vim} from "@replit/codemirror-vim";
import {indentWithTab} from "@codemirror/commands";
window.EditorView = EditorView;
const languages = {
'python': python,
'r': r
}
export function codemirror_editor(language, options) {
const language_plugin = languages[language];
options = Object.assign({
extensions: [
vim(),
basicSetup,
keymap.of([indentWithTab]),
EditorView.updateListener.of(update => {
if(!options?.onChange || update.changes.desc.empty) {
return;
}
options.onChange(update);
})
]
}, options);
let editor = new EditorView(options);
return editor;
}
export class CodeEditorElement extends HTMLElement {
constructor() {
super();
this.language = this.getAttribute('language') || '';
const shadowRoot = this.attachShadow({mode: 'open'});
}
connectedCallback() {
this.init_editor();
}
init_editor() {
const code = this.textContent;
const code_tag = this.shadowRoot;
this.codeMirror = codemirror_editor(
this.language,
{
doc: code,
parent: code_tag,
root: this.shadowRoot,
onChange: update => this.onChange(update)
}
);
}
onChange() {
const code = this.codeMirror.state.doc.toString();
this.value = code;
this.dispatchEvent(new CustomEvent('change'));
}
}
customElements.define("code-editor", CodeEditorElement);

View file

@ -1,20 +0,0 @@
{
"name": "codemirror-element",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"@codemirror/lang-python": "^6.1.2",
"@replit/codemirror-vim": "^6.2.0",
"@rollup/plugin-node-resolve": "^15.0.2",
"codemirror": "^6.0.1",
"codemirror-lang-r": "^0.1.0-2",
"rollup": "^3.20.6",
"terser": "^5.17.1"
}
}

View file

@ -34,6 +34,23 @@ class JJController:
git_url = settings.GIT_REPO_URL_TEMPLATE.format(name=self.think.slug)
self.run(['jj','git','remote','add','origin', git_url])
@ensure_jj
def ignore_paths(self, paths):
paths = self.clean_paths(paths)
gitignore = self.root / '.gitignore'
if len(paths) == 0:
return
if gitignore.exists():
with open(gitignore) as f:
ignored = f.read().strip().split('\n')
ignored += [p for p in paths if p not in ignored]
else:
ignored = paths
with open(gitignore, 'w') as f:
f.write('\n'.join(ignored))
@ensure_jj
def status(self):
res = self.run(['jj','st'])

File diff suppressed because one or more lines are too long

View file

@ -9,6 +9,7 @@
--editor-size: 50%;
--background: hsl(70,100%,95%);
--default-background: white;
--color: black;
--button-bg: #ddd;
}
@ -16,6 +17,7 @@
@media (prefers-color-scheme: dark) {
body {
--background: hsl(70,100%,8%);
--default-background: black;
--color: white;
--button-bg: #333;
}
@ -237,10 +239,9 @@ input {
z-index: 1;
}
& #code-editor {
& code-editor {
background: var(--default-background);
display: block;
max-width: 50vw;
padding-bottom: 10em;
}
}

View file

@ -6471,6 +6471,9 @@ var $author$project$App$ReloadPreview = {$: 'ReloadPreview'};
var $author$project$App$RunCommand = function (a) {
return {$: 'RunCommand', a: a};
};
var $author$project$App$RunningCommand = function (a) {
return {$: 'RunningCommand', a: a};
};
var $author$project$App$SaveContent = function (a) {
return {$: 'SaveContent', a: a};
};
@ -6826,7 +6829,11 @@ var $author$project$App$update = F2(
case 'RunCommand':
var cmd = msg.a;
return _Utils_Tuple2(
model,
_Utils_update(
model,
{
log: $author$project$App$RunningCommand(cmd)
}),
$elm$http$Http$post(
{
body: $elm$http$Http$multipartBody(
@ -7185,6 +7192,27 @@ var $elm$html$Html$Attributes$action = function (uri) {
};
var $elm$file$File$decoder = _File_decoder;
var $elm$html$Html$details = _VirtualDom_node('details');
var $elm$core$List$drop = F2(
function (n, list) {
drop:
while (true) {
if (n <= 0) {
return list;
} else {
if (!list.b) {
return list;
} else {
var x = list.a;
var xs = list.b;
var $temp$n = n - 1,
$temp$list = xs;
n = $temp$n;
list = $temp$list;
continue drop;
}
}
}
});
var $elm$html$Html$input = _VirtualDom_node('input');
var $elm$html$Html$Attributes$name = $elm$html$Html$Attributes$stringProperty('name');
var $author$project$App$form = F3(
@ -7207,6 +7235,18 @@ var $author$project$App$form = F3(
_List_Nil)
])));
});
var $elm$core$Dict$fromList = function (assocs) {
return A3(
$elm$core$List$foldl,
F2(
function (_v0, dict) {
var key = _v0.a;
var value = _v0.b;
return A3($elm$core$Dict$insert, key, value, dict);
}),
$elm$core$Dict$empty,
assocs);
};
var $elm$html$Html$nav = _VirtualDom_node('nav');
var $elm$virtual_dom$VirtualDom$MayPreventDefault = function (a) {
return {$: 'MayPreventDefault', a: a};
@ -7221,7 +7261,38 @@ var $elm$html$Html$Events$preventDefaultOn = F2(
var $elm$html$Html$section = _VirtualDom_node('section');
var $elm$html$Html$span = _VirtualDom_node('span');
var $elm$html$Html$summary = _VirtualDom_node('summary');
var $elm$core$Maybe$withDefault = F2(
function (_default, maybe) {
if (maybe.$ === 'Just') {
var value = maybe.a;
return value;
} else {
return _default;
}
});
var $author$project$App$editor_pane = function (model) {
var languages = $elm$core$Dict$fromList(
_List_fromArray(
[
_Utils_Tuple2('js', 'javascript'),
_Utils_Tuple2('mjs', 'javascript'),
_Utils_Tuple2('py', 'python'),
_Utils_Tuple2('r', 'r'),
_Utils_Tuple2('R', 'r'),
_Utils_Tuple2('elm', 'elm')
]));
var extension = A2(
$elm$core$Maybe$withDefault,
'',
$elm$core$List$head(
A2(
$elm$core$List$drop,
1,
A2($elm$core$String$split, '.', model.file_path))));
var language = A2(
$elm$core$Maybe$withDefault,
'',
A2($elm$core$Dict$get, extension, languages));
return A2(
$elm$html$Html$section,
_List_fromArray(
@ -7395,7 +7466,8 @@ var $author$project$App$editor_pane = function (model) {
_List_fromArray(
['target', 'value']),
$elm$json$Json$Decode$string))),
A2($elm$html$Html$Attributes$attribute, 'content', model.file_content)
A2($elm$html$Html$Attributes$attribute, 'content', model.file_content),
A2($elm$html$Html$Attributes$attribute, 'language', language)
]),
_List_fromArray(
[
@ -7578,6 +7650,7 @@ var $author$project$App$header = function (model) {
var $author$project$App$ToggleLog = function (a) {
return {$: 'ToggleLog', a: a};
};
var $elm$html$Html$code = _VirtualDom_node('code');
var $elm$html$Html$dd = _VirtualDom_node('dd');
var $elm$html$Html$div = _VirtualDom_node('div');
var $elm$html$Html$dl = _VirtualDom_node('dl');
@ -7668,6 +7741,28 @@ var $author$project$App$log_pane = function (model) {
]))
]))
]));
case 'RunningCommand':
var cmd = _v0.a;
return A2(
$elm$html$Html$div,
_List_Nil,
_List_fromArray(
[
A2(
$elm$html$Html$p,
_List_Nil,
_List_fromArray(
[
$elm$html$Html$text('Running command '),
A2(
$elm$html$Html$code,
_List_Nil,
_List_fromArray(
[
$elm$html$Html$text(cmd)
]))
]))
]));
case 'CommandResult':
var stdout = _v0.a;
var stderr = _v0.b;
@ -7792,27 +7887,6 @@ var $author$project$App$SetCommand = function (a) {
};
var $author$project$App$ShowCommitModal = {$: 'ShowCommitModal'};
var $author$project$App$Upload = {$: 'Upload'};
var $elm$core$List$drop = F2(
function (n, list) {
drop:
while (true) {
if (n <= 0) {
return list;
} else {
if (!list.b) {
return list;
} else {
var x = list.a;
var xs = list.b;
var $temp$n = n - 1,
$temp$list = xs;
n = $temp$n;
list = $temp$list;
continue drop;
}
}
}
});
var $elm$html$Html$li = _VirtualDom_node('li');
var $elm$core$Basics$not = _Basics_not;
var $elm$html$Html$Events$onClick = function (msg) {