Commit 7589d339 authored by wycers's avatar wycers
Browse files

submission card

parent b52cff0d
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -42,7 +42,9 @@
		"prettier": "^3.1.1",
		"prettier-plugin-svelte": "^3.1.2",
		"prettier-plugin-tailwindcss": "^0.5.9",
		"prism-themes": "^1.9.0",
		"prisma": "^5.11.0",
		"refractor": "^4.8.1",
		"sass": "^1.71.1",
		"svelte": "^4.2.7",
		"svelte-check": "^3.6.0",
@@ -65,6 +67,7 @@
		"@milkdown/plugin-clipboard": "^7.3.5",
		"@milkdown/plugin-emoji": "^7.3.5",
		"@milkdown/plugin-math": "^7.3.5",
		"@milkdown/plugin-prism": "^7.3.5",
		"@milkdown/preset-commonmark": "^7.3.5",
		"@milkdown/preset-gfm": "^7.3.5",
		"@milkdown/prose": "^7.3.5",
@@ -85,6 +88,7 @@
		"katex": "^0.16.9",
		"lodash": "^4.17.21",
		"moment": "^2.30.1",
		"monaco-editor": "^0.47.0",
		"mysql2": "^3.9.2",
		"oslo": "^1.1.3",
		"svelte-radix": "^1.0.3",
+109 −3
Original line number Diff line number Diff line
@@ -26,6 +26,9 @@ dependencies:
  '@milkdown/plugin-math':
    specifier: ^7.3.5
    version: 7.3.5(@milkdown/core@7.3.5)(@milkdown/ctx@7.3.5)(@milkdown/prose@7.3.5)(@milkdown/transformer@7.3.5)
  '@milkdown/plugin-prism':
    specifier: ^7.3.5
    version: 7.3.5(@milkdown/core@7.3.5)(@milkdown/ctx@7.3.5)(@milkdown/prose@7.3.5)(@milkdown/transformer@7.3.5)
  '@milkdown/preset-commonmark':
    specifier: ^7.3.5
    version: 7.3.5(@milkdown/core@7.3.5)(@milkdown/ctx@7.3.5)(@milkdown/prose@7.3.5)(@milkdown/transformer@7.3.5)
@@ -86,6 +89,9 @@ dependencies:
  moment:
    specifier: ^2.30.1
    version: 2.30.1
  monaco-editor:
    specifier: ^0.47.0
    version: 0.47.0
  mysql2:
    specifier: ^3.9.2
    version: 3.9.2
@@ -181,9 +187,15 @@ devDependencies:
  prettier-plugin-tailwindcss:
    specifier: ^0.5.9
    version: 0.5.11(prettier-plugin-svelte@3.2.2)(prettier@3.2.5)
  prism-themes:
    specifier: ^1.9.0
    version: 1.9.0
  prisma:
    specifier: ^5.11.0
    version: 5.11.0
  refractor:
    specifier: ^4.8.1
    version: 4.8.1
  sass:
    specifier: ^1.71.1
    version: 1.71.1
@@ -932,6 +944,23 @@ packages:
      - supports-color
    dev: false

  /@milkdown/plugin-prism@7.3.5(@milkdown/core@7.3.5)(@milkdown/ctx@7.3.5)(@milkdown/prose@7.3.5)(@milkdown/transformer@7.3.5):
    resolution: {integrity: sha512-y7VHqT4Ep385kA3/WNSAqSxsYbNvpHS7DOapzizteRqhBM1j08Jo96KJPjt9ZtkzXJWKMPhM9jwyhafECx1n4w==}
    peerDependencies:
      '@milkdown/core': ^7.2.0
      '@milkdown/ctx': ^7.2.0
      '@milkdown/prose': ^7.2.0
    dependencies:
      '@milkdown/core': 7.3.5(@milkdown/ctx@7.3.5)(@milkdown/prose@7.3.5)(@milkdown/transformer@7.3.5)
      '@milkdown/ctx': 7.3.5
      '@milkdown/prose': 7.3.5
      '@milkdown/utils': 7.3.5(@milkdown/core@7.3.5)(@milkdown/ctx@7.3.5)(@milkdown/prose@7.3.5)(@milkdown/transformer@7.3.5)
      refractor: 4.8.1
      tslib: 2.6.2
    transitivePeerDependencies:
      - '@milkdown/transformer'
    dev: false

  /@milkdown/preset-commonmark@7.3.5(@milkdown/core@7.3.5)(@milkdown/ctx@7.3.5)(@milkdown/prose@7.3.5)(@milkdown/transformer@7.3.5):
    resolution: {integrity: sha512-oSG/BV3Sv4BRjHczFrZ6zc42amwVoSxY/+GHMImMKBRpqLcBApfizo8sTpyp572wYmpTl/8Ycll2V+8h1gLraA==}
    peerDependencies:
@@ -2278,6 +2307,11 @@ packages:
    resolution: {integrity: sha512-RM21doTkeywTC+kAzlt25a+YIj0DITJIL729xPlrV91oowIGgthEXWFXNQ9wpm/44eCyn01xYt9AfK69esGEyQ==}
    dev: true

  /@types/hast@2.3.10:
    resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==}
    dependencies:
      '@types/unist': 2.0.10

  /@types/hast@3.0.4:
    resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==}
    dependencies:
@@ -2314,6 +2348,9 @@ packages:
    dependencies:
      undici-types: 5.26.5

  /@types/prismjs@1.26.3:
    resolution: {integrity: sha512-A0D0aTXvjlqJ5ZILMz3rNfDBOx9hHxLZYv2by47Sm/pqW35zzjusrZTryatjN/Rf8Us2gZrJD+KeHbUSTux1Cw==}

  /@types/pug@2.0.10:
    resolution: {integrity: sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==}
    dev: true
@@ -2328,7 +2365,6 @@ packages:

  /@types/unist@2.0.10:
    resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==}
    dev: false

  /@types/unist@3.0.2:
    resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==}
@@ -2791,9 +2827,14 @@ packages:
    engines: {node: '>=10'}
    dev: false

  /character-entities-legacy@3.0.0:
    resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==}

  /character-entities@2.0.2:
    resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==}
    dev: false

  /character-reference-invalid@2.0.1:
    resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==}

  /check-error@1.0.3:
    resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==}
@@ -2856,6 +2897,9 @@ packages:
  /color-name@1.1.4:
    resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}

  /comma-separated-tokens@2.0.3:
    resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}

  /commander@4.1.1:
    resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
    engines: {node: '>= 6'}
@@ -2929,7 +2973,6 @@ packages:
    resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==}
    dependencies:
      character-entities: 2.0.2
    dev: false

  /deep-eql@4.1.3:
    resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==}
@@ -3559,6 +3602,20 @@ packages:
    dependencies:
      function-bind: 1.1.2

  /hast-util-parse-selector@3.1.1:
    resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==}
    dependencies:
      '@types/hast': 2.3.10

  /hastscript@7.2.0:
    resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==}
    dependencies:
      '@types/hast': 2.3.10
      comma-separated-tokens: 2.0.3
      hast-util-parse-selector: 3.1.1
      property-information: 6.4.1
      space-separated-tokens: 2.0.2

  /highlight.js@11.9.0:
    resolution: {integrity: sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==}
    engines: {node: '>=12.0.0'}
@@ -3614,6 +3671,15 @@ packages:
  /inherits@2.0.4:
    resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}

  /is-alphabetical@2.0.1:
    resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==}

  /is-alphanumerical@2.0.1:
    resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==}
    dependencies:
      is-alphabetical: 2.0.1
      is-decimal: 2.0.1

  /is-binary-path@2.1.0:
    resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
    engines: {node: '>=8'}
@@ -3632,6 +3698,9 @@ packages:
    dependencies:
      hasown: 2.0.1

  /is-decimal@2.0.1:
    resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==}

  /is-extglob@2.1.1:
    resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
    engines: {node: '>=0.10.0'}
@@ -3646,6 +3715,9 @@ packages:
    dependencies:
      is-extglob: 2.1.1

  /is-hexadecimal@2.0.1:
    resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==}

  /is-module@1.0.0:
    resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==}
    dev: true
@@ -4437,6 +4509,10 @@ packages:
    resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==}
    dev: false

  /monaco-editor@0.47.0:
    resolution: {integrity: sha512-VabVvHvQ9QmMwXu4du008ZDuyLnHs9j7ThVFsiJoXSOQk18+LF89N4ADzPbFenm0W4V2bGHnFBztIRQTgBfxzw==}
    dev: false

  /mri@1.2.0:
    resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
    engines: {node: '>=4'}
@@ -4629,6 +4705,18 @@ packages:
      callsites: 3.1.0
    dev: true

  /parse-entities@4.0.1:
    resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==}
    dependencies:
      '@types/unist': 2.0.10
      character-entities: 2.0.2
      character-entities-legacy: 3.0.0
      character-reference-invalid: 2.0.1
      decode-named-character-reference: 1.0.2
      is-alphanumerical: 2.0.1
      is-decimal: 2.0.1
      is-hexadecimal: 2.0.1

  /path-exists@4.0.0:
    resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
    engines: {node: '>=8'}
@@ -4924,6 +5012,10 @@ packages:
      react-is: 18.2.0
    dev: true

  /prism-themes@1.9.0:
    resolution: {integrity: sha512-tX2AYsehKDw1EORwBps+WhBFKc2kxfoFpQAjxBndbZKr4fRmMkv47XN0BghC/K1qwodB1otbe4oF23vUTFDokw==}
    dev: true

  /prisma@5.11.0:
    resolution: {integrity: sha512-KCLiug2cs0Je7kGkQBN9jDWoZ90ogE/kvZTUTgz2h94FEo8pczCkPH7fPNXkD1sGU7Yh65risGGD1HQ5DF3r3g==}
    engines: {node: '>=16.13'}
@@ -4937,6 +5029,9 @@ packages:
    requiresBuild: true
    optional: true

  /property-information@6.4.1:
    resolution: {integrity: sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==}

  /prosemirror-changeset@2.2.1:
    resolution: {integrity: sha512-J7msc6wbxB4ekDFj+n9gTW/jav/p53kdlivvuppHsrZXCaQdVgRghoZbSS3kwrRyAstRVQ4/+u5k7YfLgkkQvQ==}
    dependencies:
@@ -5128,6 +5223,14 @@ packages:
    dependencies:
      picomatch: 2.3.1

  /refractor@4.8.1:
    resolution: {integrity: sha512-/fk5sI0iTgFYlmVGYVew90AoYnNMP6pooClx/XKqyeeCQXrL0Kvgn8V0VEht5ccdljbzzF1i3Q213gcntkRExg==}
    dependencies:
      '@types/hast': 2.3.10
      '@types/prismjs': 1.26.3
      hastscript: 7.2.0
      parse-entities: 4.0.1

  /regenerator-runtime@0.14.1:
    resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
    dev: false
@@ -5405,6 +5508,9 @@ packages:
    engines: {node: '>=0.10.0'}
    optional: true

  /space-separated-tokens@2.0.2:
    resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}

  /sqlstring@2.3.3:
    resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==}
    engines: {node: '>= 0.6'}
+29 −5
Original line number Diff line number Diff line
<script lang="ts">
	import { Editor, rootCtx, defaultValueCtx } from '@milkdown/core';
	import { Editor, rootCtx, defaultValueCtx, editorViewOptionsCtx } from '@milkdown/core';
	import { commonmark } from '@milkdown/preset-commonmark';
	import { gfm } from '@milkdown/preset-gfm';
	import { math } from '@milkdown/plugin-math';
	import { prism, prismConfig } from '@milkdown/plugin-prism';
	import { clipboard } from '@milkdown/plugin-clipboard';
	import { nord } from '@milkdown/theme-nord';
	import 'katex/dist/katex.min.css';
	import '@milkdown/theme-nord/style.css';
	import 'prism-themes/themes/prism-nord.css';

	import markdown from 'refractor/lang/markdown';
	import css from 'refractor/lang/css';
	import javascript from 'refractor/lang/javascript';
	import typescript from 'refractor/lang/typescript';
	import jsx from 'refractor/lang/jsx';
	import tsx from 'refractor/lang/tsx';

	export let defaultValue = '';
	export let editable = true;

	function editor(dom) {
		Editor.make()
			.config((ctx) => {
				ctx.set(rootCtx, dom);
				ctx.set(defaultValueCtx, defaultValue);
				ctx.set(prismConfig.key, {
					configureRefractor: (refractor) => {
						refractor.register(markdown);
						refractor.register(css);
						refractor.register(javascript);
						refractor.register(typescript);
						refractor.register(jsx);
						refractor.register(tsx);
					}
				});
				ctx.update(editorViewOptionsCtx, (prev) => ({
					...prev,
					editable: () => editable,
					attributes: { class: 'max-w-full', spellcheck: 'false' }
				}));
			})
			.config(nord)
			.use(commonmark)
			.use(prism)
			.use(gfm)
			.use(math)
			.use(clipboard)
@@ -25,6 +52,3 @@
</script>

<div  use:editor />

<style>
</style>
+43 −0
Original line number Diff line number Diff line
<script lang="ts">
	import { onDestroy, onMount } from 'svelte';
	import type * as Monaco from 'monaco-editor/esm/vs/editor/editor.api';
	import { cn } from '$lib/utils';

	let editor: Monaco.editor.IStandaloneCodeEditor;
	let monaco: typeof Monaco;
	let editorContainer: HTMLElement;
	export let value: string;
	export let language: 'cpp' | 'java';

	let model: Monaco.editor.ITextModel;
	let mounted = false;
	$: if (mounted) {
		monaco.editor.setModelLanguage(model, language);
	}

	onMount(async () => {
		// Import our 'monaco.ts' file here
		// (onMount() will only be executed in the browser, which is what we want)
		monaco = (await import('./monaco')).default;

		// Your monaco instance is ready, let's display some code!
		const editor = monaco.editor.create(editorContainer);
		model = monaco.editor.createModel(value, language);
		model.onDidChangeContent((e) => {
			value = editor.getValue();
		});
		editor.setModel(model);

		mounted = true;
	});

	onDestroy(() => {
		monaco?.editor.getModels().forEach((model) => model.dispose());
		editor?.dispose();
	});

	let className: string | undefined | null = undefined;
	export { className as class };
</script>

<div class={cn(className)} {...$$restProps} bind:this={editorContainer} />
+40 −0
Original line number Diff line number Diff line
import * as monaco from 'monaco-editor';

// Import the workers in a production-safe way.
// This is different than in Monaco's documentation for Vite,
// but avoids a weird error ("Unexpected usage") at runtime
import editorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker';
// import cssWorker from 'monaco-editor/esm/vs/language/css/css.worker?worker';
// import htmlWorker from 'monaco-editor/esm/vs/language/html/html.worker?worker';
import jsonWorker from 'monaco-editor/esm/vs/language/json/json.worker?worker';
// import tsWorker from 'monaco-editor/esm/vs/language/typescript/ts.worker?worker';
// import cppWorker from 'monaco-editor/esm/vs/language/cpp/cpp.worker?worker';
// import javaWorker from 'monaco-editor/esm/vs/language/java/';

self.MonacoEnvironment = {
	getWorker: function (_: string, label: string) {
		switch (label) {
			case 'json':
				return new jsonWorker();
			// case 'css':
			// case 'scss':
			// case 'less':
			// 	return new cssWorker();
			// case 'html':
			// case 'handlebars':
			// case 'razor':
			// 	return new htmlWorker();
			// case 'typescript':
			// case 'javascript':
			// 	return new tsWorker();
			// case 'cpp':
			// 	return new cppWorker();
			// case 'java':
			// 	return new javaWorker();
			default:
				return new editorWorker();
		}
	}
};

export default monaco;
Loading