diff --git a/.agents/skills/livecodes/language-support/references/languages.md b/.agents/skills/livecodes/language-support/references/languages.md index 1fa694624d..a8b04f02cc 100644 --- a/.agents/skills/livecodes/language-support/references/languages.md +++ b/.agents/skills/livecodes/language-support/references/languages.md @@ -142,6 +142,7 @@ Enabled via `processors` config: | Perl | `perl`, `pl`, `pm` | Perl runtime | | Pascal | `pascal`, `pas`, `pp`, `pas2js` | pas2js (Pascal -> JS, WASM) | | Ada (Wasm) | `ada`, `ada-wasm`, `adb`, `ads`, `hac`, `wasm.ada` | HAC (Ada -> WASM) | +| D (Wasm) | `d-wasm`, `d`, `di`, `dlang`, `dmd` | DMD (D -> WASM) | | Gleam | `gleam` | Gleam language | | Elm | `elm` | Elm compiler (WASM) | | Haskell | `haskell`, `hs`, `lhs` | MicroHs (not GHC) | diff --git a/docs/docs/languages/d-wasm.mdx b/docs/docs/languages/d-wasm.mdx new file mode 100644 index 0000000000..1589ab04ba --- /dev/null +++ b/docs/docs/languages/d-wasm.mdx @@ -0,0 +1,141 @@ +# D (Wasm) + +D is a general-purpose, statically typed, compiled programming language with C-like syntax, garbage collection, and a rich standard library. + +D in LiveCodes is compiled to WebAssembly by [DMD](https://dlang.org/) and run in the browser, with +no server. It uses the WebAssembly backend of [dkorpel's dmd-explorer](https://dkorpel.github.io/dmd-explorer/), +packaged as [`@live-codes/dlang-wasm`](https://www.npmjs.com/package/@live-codes/dlang-wasm). + +## Usage + +Demo: + +import LiveCodes from '../../src/components/LiveCodes.tsx'; + +export const dConfig = { + activeEditor: 'script', + script: { + language: 'd-wasm', + content: `import std.stdio;\n +void main() +{ + writeln("Hello, World!"); +}`, + }, + mode: 'simple', + editor: 'auto', + tools: { + status: 'full', + }, +}; + + + +### Communication with JavaScript + +The program runs in the context of the result page. A few helpers are available in the browser global +`livecodes.d` object: + +- `livecodes.d.input`: the standard input passed to the program. +- `livecodes.d.loaded`: a promise that resolves when the compiler has downloaded and the program + has run. Other helpers should be used after it resolves. +- `livecodes.d.output`: the program's output (standard output and standard error, in the order they + were written). +- `livecodes.d.error`: the compiler diagnostics, if the code failed to compile. +- `livecodes.d.exitCode`: the exit code of the program. +- `livecodes.d.run`: compiles and runs the code again with new input, returning a promise that + resolves with `output`, `error` and `exitCode`. + +The same object is also available as `livecodes.dlang`. + +Example: + + + +```d +import std.stdio; + +void main() +{ + writeln("Hello, World!"); +} +``` + +Templates, ranges and the algorithms in Phobos behave as expected: + +```d +import std.stdio; +import std.algorithm : map, sum; +import std.range : iota; + +void main() +{ + auto squares = iota(1, 6).map!(x => x * x); + writeln(squares); // [1, 4, 9, 16, 25] + writeln(squares.sum); // 55 +} +``` + +`readln` reads from the **stdin** pane, in the same way as the other console languages. + +## Language Info + +### Name + +`d-wasm` + +### Aliases / Extensions + +`d`, `di`, `dlang`, `dmd` + +### Editor + +`script` + +## Compiler + +[DMD](https://dlang.org/) (the D reference compiler) compiled to WebAssembly, with druntime and +Phobos, from [dkorpel's dmd-explorer](https://dkorpel.github.io/dmd-explorer/). + +### Version + +`DMD`: v2.113 + +## Code Formatting + +Not currently supported. + +## Live Reload + +By default, new code changes are sent to the result page for re-evaluation without a full page reload. This behavior can be disabled by adding the code comment `// __livecodes_reload__` to the D code, which forces a full page reload. + +This comment can be added in the [`hiddenContent` property of the editor](../configuration/configuration-object.mdx#markup) for embedded playgrounds. + +## Example Usage + +```d +import std.stdio; + +void main() +{ + int sum = 0; + foreach (i; 1 .. 6) + { + sum += i; + } + writeln("Sum = ", sum); // Sum = 15 + writeln("Mean = ", sum / 5); // Mean = 3 +} +``` + +## Starter Template + +https://livecodes.io/?template=d-wasm + +## Links + +- [D official website](https://dlang.org/) +- [D language specification](https://dlang.org/spec/spec.html) +- [D language tour](https://tour.dlang.org/) +- [Learn D in Y minutes](https://learnxinyminutes.com/docs/d/) +- [@live-codes/dlang-wasm](https://www.npmjs.com/package/@live-codes/dlang-wasm) diff --git a/docs/src/components/LanguageSliders.tsx b/docs/src/components/LanguageSliders.tsx index 393d686d37..9fb6e0ddc4 100644 --- a/docs/src/components/LanguageSliders.tsx +++ b/docs/src/components/LanguageSliders.tsx @@ -94,6 +94,7 @@ export default function Sliders() { { name: 'objcpp-wasm', title: 'Objective-C++ (Wasm)' }, { name: 'cobol-wasm', title: 'COBOL (Wasm)' }, { name: 'fortran', title: 'Fortran' }, + { name: 'd-wasm', title: 'D (Wasm)' }, { name: 'rust-wasm', title: 'Rust (Wasm)' }, { name: 'swift-wasm', title: 'Swift (Wasm)' }, { name: 'haskell', title: 'Haskell' }, diff --git a/docs/src/components/TemplateList.tsx b/docs/src/components/TemplateList.tsx index 9703d55ab2..feb3952f94 100644 --- a/docs/src/components/TemplateList.tsx +++ b/docs/src/components/TemplateList.tsx @@ -50,6 +50,7 @@ const templates = [ { name: 'c-wasm', title: 'C (Wasm) Starter', thumbnail: 'c.svg' }, { name: 'cobol-wasm', title: 'COBOL Starter', thumbnail: 'cobol.svg' }, { name: 'fortran-wasm', title: 'Fortran Starter', thumbnail: 'fortran.svg' }, + { name: 'd-wasm', title: 'D Starter', thumbnail: 'd.svg' }, { name: 'cpp-wasm', title: 'C++ (Wasm) Starter', thumbnail: 'cpp.svg' }, { name: 'objc-wasm', title: 'Objective-C (Wasm) Starter', thumbnail: 'objective-c.svg' }, { name: 'rust-wasm', title: 'Rust (Wasm) Starter', thumbnail: 'rust.svg' }, diff --git a/functions/vendors/templates.js b/functions/vendors/templates.js index 9834c0e64d..76924caf52 100644 --- a/functions/vendors/templates.js +++ b/functions/vendors/templates.js @@ -52,6 +52,7 @@ export const starterTemplates = { "objc-wasm": "Objective-C (Wasm) Starter", "cobol-wasm": "COBOL Starter", "fortran-wasm": "Fortran Starter", + "d-wasm": "D Starter", "rust-wasm": "Rust (Wasm) Starter", "swift-wasm": "Swift (Wasm) Starter", "zig-wasm": "Zig (Wasm) Starter", diff --git a/scripts/build.js b/scripts/build.js index cc79d610e3..15e8f3d1c1 100644 --- a/scripts/build.js +++ b/scripts/build.js @@ -229,6 +229,7 @@ const iifeBuild = () => 'languages/cpp/lang-cpp-script.ts', 'languages/clang-wasm/lang-clang-wasm-script.ts', 'languages/fortran-wasm/lang-fortran-wasm-script.ts', + 'languages/d-wasm/lang-d-wasm-script.ts', 'languages/cobol-wasm/lang-cobol-wasm-script.ts', 'languages/go-wasm/lang-go-wasm-script.ts', 'languages/csharp-wasm/lang-csharp-wasm-script.ts', diff --git a/server/php/inc/starter-templates.json b/server/php/inc/starter-templates.json index 63b164e539..b2af230bfe 100644 --- a/server/php/inc/starter-templates.json +++ b/server/php/inc/starter-templates.json @@ -52,6 +52,7 @@ "objc-wasm": "Objective-C (Wasm) Starter", "cobol-wasm": "COBOL Starter", "fortran-wasm": "Fortran Starter", + "d-wasm": "D Starter", "rust-wasm": "Rust (Wasm) Starter", "swift-wasm": "Swift (Wasm) Starter", "zig-wasm": "Zig (Wasm) Starter", diff --git a/src/livecodes/UI/command-menu-actions.ts b/src/livecodes/UI/command-menu-actions.ts index a088cf673c..6a19304ecd 100644 --- a/src/livecodes/UI/command-menu-actions.ts +++ b/src/livecodes/UI/command-menu-actions.ts @@ -308,6 +308,7 @@ export const getCommandMenuActions = ({ 'objc-wasm', 'cobol-wasm', 'fortran-wasm', + 'd-wasm', 'rust-wasm', 'swift-wasm', 'zig-wasm', diff --git a/src/livecodes/assets/templates/d.svg b/src/livecodes/assets/templates/d.svg new file mode 100644 index 0000000000..8f2f56bc69 --- /dev/null +++ b/src/livecodes/assets/templates/d.svg @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + diff --git a/src/livecodes/html/language-info.html b/src/livecodes/html/language-info.html index 843afed019..df49270f6b 100644 --- a/src/livecodes/html/language-info.html +++ b/src/livecodes/html/language-info.html @@ -602,6 +602,42 @@

C# (Wasm)

+
+

D (Wasm)

+
+ D compiled to WebAssembly by + DMD, running entirely in the + browser. +
+ +

Diagrams

(Experimental)
diff --git a/src/livecodes/i18n/locales/ar/language-info.lokalise.json b/src/livecodes/i18n/locales/ar/language-info.lokalise.json index 9cffd85e61..0447c7ed5c 100644 --- a/src/livecodes/i18n/locales/ar/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/ar/language-info.lokalise.json @@ -192,6 +192,15 @@ "csharpWasm.name": { "translation": "C# (Wasm)" }, + "d-wasm.desc": { + "translation": "يتم تجميع D إلى WebAssembly بواسطة DMD، وتعمل بالكامل داخل المتصفح." + }, + "d-wasm.link": { + "translation": " الموقع الرسمي لـ D مواصفات لغة D جولة في لغة D تعلم X في Y دقيقة، حيث X = D وثائق LiveCodes تحميل قالب البدء " + }, + "d-wasm.name": { + "translation": "D (Wasm)" + }, "diagrams.desc1": { "translation": "(تجريبي)" }, diff --git a/src/livecodes/i18n/locales/ar/language-info.ts b/src/livecodes/i18n/locales/ar/language-info.ts index a2838d9ca6..41531bea8a 100644 --- a/src/livecodes/i18n/locales/ar/language-info.ts +++ b/src/livecodes/i18n/locales/ar/language-info.ts @@ -111,6 +111,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1> <2>وثائق لغة C# <3> <4> تعلم X في دقائق Y، حيث X = C# <5> <6> وثائق LiveCodes <7> <8> تحميل قالب البدء ', name: 'C# (Wasm)', }, + 'd-wasm': { + desc: 'يتم تجميع D إلى WebAssembly بواسطة <1>DMD، وتعمل بالكامل داخل المتصفح.', + link: '<1> <2>الموقع الرسمي لـ D <3> <4>مواصفات لغة D <5> <6>جولة في لغة D <7> <8>تعلم X في Y دقيقة، حيث X = D <9> <10>وثائق LiveCodes <11> <12>تحميل قالب البدء ', + name: 'D (Wasm)', + }, diagrams: { desc1: '(تجريبي)', desc2: 'رسومات بيانية كبرمجة. يدعم:', diff --git a/src/livecodes/i18n/locales/ar/translation.lokalise.json b/src/livecodes/i18n/locales/ar/translation.lokalise.json index b59238f279..8c045f3f0f 100644 --- a/src/livecodes/i18n/locales/ar/translation.lokalise.json +++ b/src/livecodes/i18n/locales/ar/translation.lokalise.json @@ -1971,6 +1971,9 @@ "templates.starter.csharp-wasm": { "translation": "قالب C# (Wasm)" }, + "templates.starter.d-wasm": { + "translation": "قالب D" + }, "templates.starter.d3": { "translation": "قالب D3" }, diff --git a/src/livecodes/i18n/locales/ar/translation.ts b/src/livecodes/i18n/locales/ar/translation.ts index b192d9ce38..7b719d0bf4 100644 --- a/src/livecodes/i18n/locales/ar/translation.ts +++ b/src/livecodes/i18n/locales/ar/translation.ts @@ -996,6 +996,7 @@ const translation: I18nTranslation = { cpp: 'قالب C++', 'cpp-wasm': 'قالب C++ (Wasm)', 'csharp-wasm': 'قالب C# (Wasm)', + 'd-wasm': 'قالب D', d3: 'قالب D3', daisyui: 'قالب daisyUI', diagrams: 'قالب الرسوم البيانية', diff --git a/src/livecodes/i18n/locales/bn/language-info.lokalise.json b/src/livecodes/i18n/locales/bn/language-info.lokalise.json index 637743f6a3..47a2f4a2e5 100644 --- a/src/livecodes/i18n/locales/bn/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/bn/language-info.lokalise.json @@ -192,6 +192,15 @@ "csharpWasm.name": { "translation": "C# (Wasm)" }, + "d-wasm.desc": { + "translation": "D DMD দ্বারা WebAssembly-তে কম্পাইল করা হয় এবং সম্পূর্ণভাবে ব্রাউজারে চলে।" + }, + "d-wasm.link": { + "translation": " D অফিসিয়াল ওয়েবসাইট D ভাষা স্পেসিফিকেশন D ভাষা ট্যুর Y মিনিটে X শিখুন, যেখানে X=D লাইভকোডস ডকুমেন্টেশন স্টার্টার টেমপ্লেট লোড করুন " + }, + "d-wasm.name": { + "translation": "D (Wasm)" + }, "diagrams.desc1": { "translation": "(পরীক্ষামূলক)" }, diff --git a/src/livecodes/i18n/locales/bn/language-info.ts b/src/livecodes/i18n/locales/bn/language-info.ts index 29ab84cefd..a9ec413195 100644 --- a/src/livecodes/i18n/locales/bn/language-info.ts +++ b/src/livecodes/i18n/locales/bn/language-info.ts @@ -111,6 +111,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1> <2>C# ভাষা ডকুমেন্টেশন <3> <4>Y মিনিটে X শিখুন, যেখানে X=C# <5> <6>LiveCodes ডকুমেন্টেশন <7> <8>স্টার্টার টেমপ্লেট লোড করুন ', name: 'C# (Wasm)', }, + 'd-wasm': { + desc: 'D <1>DMD দ্বারা WebAssembly-তে কম্পাইল করা হয় এবং সম্পূর্ণভাবে ব্রাউজারে চলে।', + link: '<1> <2>D অফিসিয়াল ওয়েবসাইট <3> <4>D ভাষা স্পেসিফিকেশন <5> <6>D ভাষা ট্যুর <7> <8>Y মিনিটে X শিখুন, যেখানে X=D <9> <10>লাইভকোডস ডকুমেন্টেশন <11> <12>স্টার্টার টেমপ্লেট লোড করুন ', + name: 'D (Wasm)', + }, diagrams: { desc1: '(পরীক্ষামূলক)', desc2: 'কোড-হিসাবে-ডায়াগ্রাম। সমর্থন করে:', diff --git a/src/livecodes/i18n/locales/bn/translation.lokalise.json b/src/livecodes/i18n/locales/bn/translation.lokalise.json index b42e2be2b0..b20db58da1 100644 --- a/src/livecodes/i18n/locales/bn/translation.lokalise.json +++ b/src/livecodes/i18n/locales/bn/translation.lokalise.json @@ -1971,6 +1971,9 @@ "templates.starter.csharp-wasm": { "translation": "C# (Wasm) স্টার্টার" }, + "templates.starter.d-wasm": { + "translation": "D স্টার্টার" + }, "templates.starter.d3": { "translation": "D3 স্টার্টার" }, diff --git a/src/livecodes/i18n/locales/bn/translation.ts b/src/livecodes/i18n/locales/bn/translation.ts index d562058e1c..2909de69fc 100644 --- a/src/livecodes/i18n/locales/bn/translation.ts +++ b/src/livecodes/i18n/locales/bn/translation.ts @@ -996,6 +996,7 @@ const translation: I18nTranslation = { cpp: 'C++ স্টার্টার', 'cpp-wasm': 'C++ (Wasm) স্টার্টার', 'csharp-wasm': 'C# (Wasm) স্টার্টার', + 'd-wasm': 'D স্টার্টার', d3: 'D3 স্টার্টার', daisyui: 'daisyUI স্টার্টার', diagrams: 'Diagrams স্টার্টার', diff --git a/src/livecodes/i18n/locales/de/language-info.lokalise.json b/src/livecodes/i18n/locales/de/language-info.lokalise.json index 0f40d74b57..3885d58cba 100644 --- a/src/livecodes/i18n/locales/de/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/de/language-info.lokalise.json @@ -192,6 +192,15 @@ "csharpWasm.name": { "translation": "C# (Wasm)" }, + "d-wasm.desc": { + "translation": "D wird von DMD nach WebAssembly kompiliert und läuft vollständig im Browser." + }, + "d-wasm.link": { + "translation": " Offizielle Website von D D-Sprachspezifikation D Sprachführung Lerne X in Y Minuten, wobei X = D LiveCodes-Dokumentation Startervorlage laden " + }, + "d-wasm.name": { + "translation": "D (Wasm)" + }, "diagrams.desc1": { "translation": "(Experimentell)" }, diff --git a/src/livecodes/i18n/locales/de/language-info.ts b/src/livecodes/i18n/locales/de/language-info.ts index c23d622d5d..262639c238 100644 --- a/src/livecodes/i18n/locales/de/language-info.ts +++ b/src/livecodes/i18n/locales/de/language-info.ts @@ -113,6 +113,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1> <2>Dokumentation der Sprache C# <3> <4> Lernen Sie X in Y Minuten, wobei X=C# <5> <6> LiveCodes Dokumentation <7> <8> Laden Sie die Startvorlage ', name: 'C# (Wasm)', }, + 'd-wasm': { + desc: 'D wird von <1>DMD nach WebAssembly kompiliert und läuft vollständig im Browser.', + link: '<1> <2>Offizielle Website von D <3> <4>D-Sprachspezifikation <5> <6>D Sprachführung <7> <8>Lerne X in Y Minuten, wobei X = D <9> <10>LiveCodes-Dokumentation <11> <12>Startervorlage laden ', + name: 'D (Wasm)', + }, diagrams: { desc1: '(Experimentell)', desc2: 'Diagramme als Code. Unterstützt:', diff --git a/src/livecodes/i18n/locales/de/translation.lokalise.json b/src/livecodes/i18n/locales/de/translation.lokalise.json index 77dcad0c02..c0fc6c8503 100644 --- a/src/livecodes/i18n/locales/de/translation.lokalise.json +++ b/src/livecodes/i18n/locales/de/translation.lokalise.json @@ -1971,6 +1971,9 @@ "templates.starter.csharp-wasm": { "translation": "C# (Wasm)-Starter" }, + "templates.starter.d-wasm": { + "translation": "D-Starter" + }, "templates.starter.d3": { "translation": "D3-Starter" }, diff --git a/src/livecodes/i18n/locales/de/translation.ts b/src/livecodes/i18n/locales/de/translation.ts index 70dda525df..e9defc5f53 100644 --- a/src/livecodes/i18n/locales/de/translation.ts +++ b/src/livecodes/i18n/locales/de/translation.ts @@ -998,6 +998,7 @@ const translation: I18nTranslation = { cpp: 'C++-Starter', 'cpp-wasm': 'C++ (Wasm)-Starter', 'csharp-wasm': 'C# (Wasm)-Starter', + 'd-wasm': 'D-Starter', d3: 'D3-Starter', daisyui: 'daisyUI-Starter', diagrams: 'Diagramm-Starter', diff --git a/src/livecodes/i18n/locales/en/language-info.lokalise.json b/src/livecodes/i18n/locales/en/language-info.lokalise.json index 3aa9b19a7c..3a5927087d 100644 --- a/src/livecodes/i18n/locales/en/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/en/language-info.lokalise.json @@ -256,6 +256,18 @@ "notes": "", "translation": "C# (Wasm)" }, + "d-wasm.desc": { + "notes": "### ###\n\n\n", + "translation": "D compiled to WebAssembly by DMD, running entirely in the browser." + }, + "d-wasm.link": { + "notes": "### ###\n
  • \n\n### ###\n\n\n### ###\n
  • \n\n### ###\n\n\n### ###\n
  • \n\n### ###\n\n\n### ###\n
  • \n\n### ###\n\n\n### ###\n
  • \n\n### ###\n\n\n### ###\n
  • \n\n### ###\n\n\n", + "translation": " D official website D language specification D language tour Learn X in Y minutes, where X=D LiveCodes Documentation Load starter template " + }, + "d-wasm.name": { + "notes": "", + "translation": "D (Wasm)" + }, "diagrams.desc1": { "notes": "", "translation": "(Experimental)" diff --git a/src/livecodes/i18n/locales/en/language-info.ts b/src/livecodes/i18n/locales/en/language-info.ts index d1fd6417bd..59e146c7d9 100644 --- a/src/livecodes/i18n/locales/en/language-info.ts +++ b/src/livecodes/i18n/locales/en/language-info.ts @@ -119,6 +119,11 @@ const languageInfo = { link: '<1> <2>C# language documentation <3> <4>Learn X in Y minutes, where X=C# <5> <6>LiveCodes Documentation <7> <8>Load starter template ', name: 'C# (Wasm)', }, + 'd-wasm': { + desc: 'D compiled to WebAssembly by <1>DMD, running entirely in the browser.', + link: '<1> <2>D official website <3> <4>D language specification <5> <6>D language tour <7> <8>Learn X in Y minutes, where X=D <9> <10>LiveCodes Documentation <11> <12>Load starter template ', + name: 'D (Wasm)', + }, diagrams: { desc1: '(Experimental)', desc2: 'Diagrams-as-code. Supports:', diff --git a/src/livecodes/i18n/locales/en/translation.lokalise.json b/src/livecodes/i18n/locales/en/translation.lokalise.json index d8d8ceb184..f7990a76fe 100644 --- a/src/livecodes/i18n/locales/en/translation.lokalise.json +++ b/src/livecodes/i18n/locales/en/translation.lokalise.json @@ -2628,6 +2628,10 @@ "notes": "", "translation": "C# (Wasm) Starter" }, + "templates.starter.d-wasm": { + "notes": "", + "translation": "D Starter" + }, "templates.starter.d3": { "notes": "", "translation": "D3 Starter" diff --git a/src/livecodes/i18n/locales/en/translation.ts b/src/livecodes/i18n/locales/en/translation.ts index ab7866dad1..a368d5972b 100644 --- a/src/livecodes/i18n/locales/en/translation.ts +++ b/src/livecodes/i18n/locales/en/translation.ts @@ -1003,6 +1003,7 @@ const translation = { cpp: 'C++ Starter', 'cpp-wasm': 'C++ (Wasm) Starter', 'csharp-wasm': 'C# (Wasm) Starter', + 'd-wasm': 'D Starter', d3: 'D3 Starter', daisyui: 'daisyUI Starter', diagrams: 'Diagrams Starter', diff --git a/src/livecodes/i18n/locales/es/language-info.lokalise.json b/src/livecodes/i18n/locales/es/language-info.lokalise.json index 7b059552a3..39bac57f40 100644 --- a/src/livecodes/i18n/locales/es/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/es/language-info.lokalise.json @@ -192,6 +192,15 @@ "csharpWasm.name": { "translation": "C# (Wasm)" }, + "d-wasm.desc": { + "translation": "D compilado a WebAssembly por DMD, ejecutándose íntegramente en el navegador." + }, + "d-wasm.link": { + "translation": " Página web oficial de D Especificación del lenguaje D Tour del lenguaje D Aprende X en Y minutos, donde X = D Documentación de LiveCodes Cargar plantilla de inicio " + }, + "d-wasm.name": { + "translation": "D (Wasm)" + }, "diagrams.desc1": { "translation": "(Experimental)" }, diff --git a/src/livecodes/i18n/locales/es/language-info.ts b/src/livecodes/i18n/locales/es/language-info.ts index f4fe59abc5..e519db1429 100644 --- a/src/livecodes/i18n/locales/es/language-info.ts +++ b/src/livecodes/i18n/locales/es/language-info.ts @@ -112,6 +112,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1> <2>Documentación del lenguaje C# <3> <4> Aprenda X en Y minutos, donde X=C# <5> <6> Documentación de LiveCodes <7> <8> Cargue la plantilla de inicio ', name: 'C# (Wasm)', }, + 'd-wasm': { + desc: 'D compilado a WebAssembly por <1>DMD, ejecutándose íntegramente en el navegador.', + link: '<1> <2>Página web oficial de D <3> <4>Especificación del lenguaje D <5> <6>Tour del lenguaje D <7> <8>Aprende X en Y minutos, donde X = D <9> <10>Documentación de LiveCodes <11> <12>Cargar plantilla de inicio ', + name: 'D (Wasm)', + }, diagrams: { desc1: '(Experimental)', desc2: 'Diagramas como código. Soporta:', diff --git a/src/livecodes/i18n/locales/es/translation.lokalise.json b/src/livecodes/i18n/locales/es/translation.lokalise.json index 7f94058ecc..ae4253147e 100644 --- a/src/livecodes/i18n/locales/es/translation.lokalise.json +++ b/src/livecodes/i18n/locales/es/translation.lokalise.json @@ -1971,6 +1971,9 @@ "templates.starter.csharp-wasm": { "translation": "Inicio C# (Wasm)" }, + "templates.starter.d-wasm": { + "translation": "Inicio D" + }, "templates.starter.d3": { "translation": "Inicio D3" }, diff --git a/src/livecodes/i18n/locales/es/translation.ts b/src/livecodes/i18n/locales/es/translation.ts index 8c67cb6395..d167c42597 100644 --- a/src/livecodes/i18n/locales/es/translation.ts +++ b/src/livecodes/i18n/locales/es/translation.ts @@ -996,6 +996,7 @@ const translation: I18nTranslation = { cpp: 'Inicio C++', 'cpp-wasm': 'Inicio C++ (Wasm)', 'csharp-wasm': 'Inicio C# (Wasm)', + 'd-wasm': 'Inicio D', d3: 'Inicio D3', daisyui: 'Inicio daisyUI', diagrams: 'Inicio Diagramas', diff --git a/src/livecodes/i18n/locales/fa/language-info.lokalise.json b/src/livecodes/i18n/locales/fa/language-info.lokalise.json index 472c93c427..e61a2d9ebb 100644 --- a/src/livecodes/i18n/locales/fa/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/fa/language-info.lokalise.json @@ -192,6 +192,15 @@ "csharpWasm.name": { "translation": "C# (Wasm)" }, + "d-wasm.desc": { + "translation": "D توسط DMD به WebAssembly کامپایل می‌شود و کاملاً در مرورگر اجرا می‌شود." + }, + "d-wasm.link": { + "translation": " وب‌سایت رسمی D مشخصات زبان D تور زبان D یادگیری X در Y دقیقه، که X=D مستندات لایوکدز بارگذاری قالب شروع " + }, + "d-wasm.name": { + "translation": "D (Wasm)" + }, "diagrams.desc1": { "translation": "(آزمایشی)" }, diff --git a/src/livecodes/i18n/locales/fa/language-info.ts b/src/livecodes/i18n/locales/fa/language-info.ts index 277ffd09f0..49d563bfd1 100644 --- a/src/livecodes/i18n/locales/fa/language-info.ts +++ b/src/livecodes/i18n/locales/fa/language-info.ts @@ -112,6 +112,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1> <2>مستندات زبان #C <3> <4>یادگیری X در Y دقیقه، جایی که X=C# <5> <6>مستندات LiveCodes <7> <8>بارگذاری قالب شروع کننده ', name: 'C# (Wasm)', }, + 'd-wasm': { + desc: 'D توسط <1>DMD به WebAssembly کامپایل می‌شود و کاملاً در مرورگر اجرا می‌شود.', + link: '<1> <2>وب‌سایت رسمی D <3> <4>مشخصات زبان D <5> <6>تور زبان D <7> <8>یادگیری X در Y دقیقه، که X=D <9> <10>مستندات لایوکدز <11> <12>بارگذاری قالب شروع ', + name: 'D (Wasm)', + }, diagrams: { desc1: '(آزمایشی)', desc2: 'نمودارها به صورت کد. پشتیبانی از:', diff --git a/src/livecodes/i18n/locales/fa/translation.lokalise.json b/src/livecodes/i18n/locales/fa/translation.lokalise.json index dc2bede4fd..905c675853 100644 --- a/src/livecodes/i18n/locales/fa/translation.lokalise.json +++ b/src/livecodes/i18n/locales/fa/translation.lokalise.json @@ -1971,6 +1971,9 @@ "templates.starter.csharp-wasm": { "translation": "شروع کننده C# (Wasm)" }, + "templates.starter.d-wasm": { + "translation": "شروع کننده D" + }, "templates.starter.d3": { "translation": "شروع کننده D3" }, diff --git a/src/livecodes/i18n/locales/fa/translation.ts b/src/livecodes/i18n/locales/fa/translation.ts index b59ac5b97e..2b7263659b 100644 --- a/src/livecodes/i18n/locales/fa/translation.ts +++ b/src/livecodes/i18n/locales/fa/translation.ts @@ -997,6 +997,7 @@ const translation: I18nTranslation = { cpp: 'شروع کننده C++', 'cpp-wasm': 'شروع کننده C++ (Wasm)', 'csharp-wasm': 'شروع کننده C# (Wasm)', + 'd-wasm': 'شروع کننده D', d3: 'شروع کننده D3', daisyui: 'شروع کننده daisyUI', diagrams: 'شروع کننده نمودارها', diff --git a/src/livecodes/i18n/locales/fr/language-info.lokalise.json b/src/livecodes/i18n/locales/fr/language-info.lokalise.json index a570fd3ec0..5157c8fab7 100644 --- a/src/livecodes/i18n/locales/fr/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/fr/language-info.lokalise.json @@ -192,6 +192,15 @@ "csharpWasm.name": { "translation": "C# (Wasm)" }, + "d-wasm.desc": { + "translation": "D compilé en WebAssembly par DMD, s'exécutant entièrement dans le navigateur." + }, + "d-wasm.link": { + "translation": " Site officiel de D Spécification du langage D Tour du langage D Apprenez X en Y minutes, où X = D Documentation LiveCodes Charger un modèle de démarrage " + }, + "d-wasm.name": { + "translation": "D (Wasm)" + }, "diagrams.desc1": { "translation": "(Expérimental)" }, diff --git a/src/livecodes/i18n/locales/fr/language-info.ts b/src/livecodes/i18n/locales/fr/language-info.ts index 5dbe8b80bf..dbe5be9557 100644 --- a/src/livecodes/i18n/locales/fr/language-info.ts +++ b/src/livecodes/i18n/locales/fr/language-info.ts @@ -112,6 +112,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1> <2>Documentation sur le langage C# <3> <4> Apprenez X en Y minutes, où X=C# <5> <6> Documentation LiveCodes <7> <8> Charger le modèle de démarrage ', name: 'C# (Wasm)', }, + 'd-wasm': { + desc: "D compilé en WebAssembly par <1>DMD, s'exécutant entièrement dans le navigateur.", + link: '<1> <2>Site officiel de D <3> <4>Spécification du langage D <5> <6>Tour du langage D <7> <8>Apprenez X en Y minutes, où X = D <9> <10>Documentation LiveCodes <11> <12>Charger un modèle de démarrage ', + name: 'D (Wasm)', + }, diagrams: { desc1: '(Expérimental)', desc2: 'Diagrammes sous forme de code. Prend en charge :', diff --git a/src/livecodes/i18n/locales/fr/translation.lokalise.json b/src/livecodes/i18n/locales/fr/translation.lokalise.json index 8c6f6ee8cf..09b40d9059 100644 --- a/src/livecodes/i18n/locales/fr/translation.lokalise.json +++ b/src/livecodes/i18n/locales/fr/translation.lokalise.json @@ -1971,6 +1971,9 @@ "templates.starter.csharp-wasm": { "translation": "Démarrage C# (Wasm)" }, + "templates.starter.d-wasm": { + "translation": "Démarrage D" + }, "templates.starter.d3": { "translation": "Démarrage D3" }, diff --git a/src/livecodes/i18n/locales/fr/translation.ts b/src/livecodes/i18n/locales/fr/translation.ts index e4b42bf928..cbb57761ae 100644 --- a/src/livecodes/i18n/locales/fr/translation.ts +++ b/src/livecodes/i18n/locales/fr/translation.ts @@ -998,6 +998,7 @@ const translation: I18nTranslation = { cpp: 'Démarrage C++', 'cpp-wasm': 'Démarrage C++ (Wasm)', 'csharp-wasm': 'Démarrage C# (Wasm)', + 'd-wasm': 'Démarrage D', d3: 'Démarrage D3', daisyui: 'Démarrage daisyUI', diagrams: 'Démarrage Diagrammes', diff --git a/src/livecodes/i18n/locales/hi/language-info.lokalise.json b/src/livecodes/i18n/locales/hi/language-info.lokalise.json index 6130a1afa4..a8602ccb42 100644 --- a/src/livecodes/i18n/locales/hi/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/hi/language-info.lokalise.json @@ -192,6 +192,15 @@ "csharpWasm.name": { "translation": "C# (Wasm)" }, + "d-wasm.desc": { + "translation": "D को DMD द्वारा WebAssembly में संकलित किया जाता है, जो पूरी तरह से ब्राउज़र में चलता है।" + }, + "d-wasm.link": { + "translation": " D आधिकारिक वेबसाइट D भाषा विनिर्देश D भाषा टूर Y मिनट में X सीखें, जहाँ X=D लाइवकोड्स दस्तावेज़ीकरण स्टार्टर टेम्पलेट लोड करें " + }, + "d-wasm.name": { + "translation": "D (Wasm)" + }, "diagrams.desc1": { "translation": "(प्रायोगिक)" }, diff --git a/src/livecodes/i18n/locales/hi/language-info.ts b/src/livecodes/i18n/locales/hi/language-info.ts index 6378e336ef..e6e6f30bbb 100644 --- a/src/livecodes/i18n/locales/hi/language-info.ts +++ b/src/livecodes/i18n/locales/hi/language-info.ts @@ -112,6 +112,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1> <2>सी# भाषा दस्तावेज़ीकरण <3> <4>एक्स को वाई मिनटों में सीखें, जहां एक्स=सी# <5> <6>लाइवकोड दस्तावेज़ीकरण <7> <8>स्टार्टर टेम्पलेट लोड करें ', name: 'C# (Wasm)', }, + 'd-wasm': { + desc: 'D को <1>DMD द्वारा WebAssembly में संकलित किया जाता है, जो पूरी तरह से ब्राउज़र में चलता है।', + link: '<1> <2>D आधिकारिक वेबसाइट <3> <4>D भाषा विनिर्देश <5> <6>D भाषा टूर <7> <8>Y मिनट में X सीखें, जहाँ X=D <9> <10>लाइवकोड्स दस्तावेज़ीकरण <11> <12>स्टार्टर टेम्पलेट लोड करें ', + name: 'D (Wasm)', + }, diagrams: { desc1: '(प्रायोगिक)', desc2: 'कोड के रूप में आरेख। समर्थन करता है:', diff --git a/src/livecodes/i18n/locales/hi/translation.lokalise.json b/src/livecodes/i18n/locales/hi/translation.lokalise.json index 50ddbb6bda..bd32d66fe2 100644 --- a/src/livecodes/i18n/locales/hi/translation.lokalise.json +++ b/src/livecodes/i18n/locales/hi/translation.lokalise.json @@ -1971,6 +1971,9 @@ "templates.starter.csharp-wasm": { "translation": "C# (Wasm) स्टार्टर" }, + "templates.starter.d-wasm": { + "translation": "D स्टार्टर" + }, "templates.starter.d3": { "translation": "D3 स्टार्टर" }, diff --git a/src/livecodes/i18n/locales/hi/translation.ts b/src/livecodes/i18n/locales/hi/translation.ts index 6e55916bee..1194034c04 100644 --- a/src/livecodes/i18n/locales/hi/translation.ts +++ b/src/livecodes/i18n/locales/hi/translation.ts @@ -996,6 +996,7 @@ const translation: I18nTranslation = { cpp: 'C++ स्टार्टर', 'cpp-wasm': 'C++ (Wasm) स्टार्टर', 'csharp-wasm': 'C# (Wasm) स्टार्टर', + 'd-wasm': 'D स्टार्टर', d3: 'D3 स्टार्टर', daisyui: 'daisyUI स्टार्टर', diagrams: 'आरेख स्टार्टर', diff --git a/src/livecodes/i18n/locales/hu/language-info.lokalise.json b/src/livecodes/i18n/locales/hu/language-info.lokalise.json index 2fae13696f..6df56e54c5 100644 --- a/src/livecodes/i18n/locales/hu/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/hu/language-info.lokalise.json @@ -192,6 +192,15 @@ "csharpWasm.name": { "translation": "C# (Wasm)" }, + "d-wasm.desc": { + "translation": "A D a DMD segítségével WebAssembly-re fordul, és teljes egészében a böngészőben fut." + }, + "d-wasm.link": { + "translation": " A D hivatalos weboldala D nyelvi specifikáció D nyelvi túra Tanulj meg X-et Y perc alatt, ahol X=D LiveCodes dokumentáció Indító sablon betöltése " + }, + "d-wasm.name": { + "translation": "D (Wasm)" + }, "diagrams.desc1": { "translation": "(Kísérleti)" }, diff --git a/src/livecodes/i18n/locales/hu/language-info.ts b/src/livecodes/i18n/locales/hu/language-info.ts index 3ecf913ae5..e6b178d781 100644 --- a/src/livecodes/i18n/locales/hu/language-info.ts +++ b/src/livecodes/i18n/locales/hu/language-info.ts @@ -113,6 +113,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1> <2>C# nyelvi dokumentáció <3> <4>Tanulj X-et Y perc alatt, ahol X=C# <5> <6>LiveCodes dokumentáció <7> <8>Kezdő sablon betöltése ', name: 'C# (Wasm)', }, + 'd-wasm': { + desc: 'A D a <1>DMD segítségével WebAssembly-re fordul, és teljes egészében a böngészőben fut.', + link: '<1> <2>A D hivatalos weboldala <3> <4>D nyelvi specifikáció <5> <6>D nyelvi túra <7> <8>Tanulj meg X-et Y perc alatt, ahol X=D <9> <10>LiveCodes dokumentáció <11> <12>Indító sablon betöltése ', + name: 'D (Wasm)', + }, diagrams: { desc1: '(Kísérleti)', desc2: 'Diagramok-kódként. Támogatja:', diff --git a/src/livecodes/i18n/locales/hu/translation.lokalise.json b/src/livecodes/i18n/locales/hu/translation.lokalise.json index 5ad93207f0..17f2b46fb2 100644 --- a/src/livecodes/i18n/locales/hu/translation.lokalise.json +++ b/src/livecodes/i18n/locales/hu/translation.lokalise.json @@ -1971,6 +1971,9 @@ "templates.starter.csharp-wasm": { "translation": "C# (Wasm) kezdő" }, + "templates.starter.d-wasm": { + "translation": "D kezdő" + }, "templates.starter.d3": { "translation": "D3 kezdő" }, diff --git a/src/livecodes/i18n/locales/hu/translation.ts b/src/livecodes/i18n/locales/hu/translation.ts index 8c614f588b..15a4e6e9c0 100644 --- a/src/livecodes/i18n/locales/hu/translation.ts +++ b/src/livecodes/i18n/locales/hu/translation.ts @@ -997,6 +997,7 @@ const translation: I18nTranslation = { cpp: 'C++ kezdő', 'cpp-wasm': 'C++ (Wasm) kezdő', 'csharp-wasm': 'C# (Wasm) kezdő', + 'd-wasm': 'D kezdő', d3: 'D3 kezdő', daisyui: 'daisyUI kezdő', diagrams: 'Diagramok kezdő', diff --git a/src/livecodes/i18n/locales/id/language-info.lokalise.json b/src/livecodes/i18n/locales/id/language-info.lokalise.json index 7c8be50542..570030c2a6 100644 --- a/src/livecodes/i18n/locales/id/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/id/language-info.lokalise.json @@ -192,6 +192,15 @@ "csharpWasm.name": { "translation": "C# (Wasm)" }, + "d-wasm.desc": { + "translation": "D dikompilasi ke WebAssembly oleh DMD, berjalan sepenuhnya di dalam browser." + }, + "d-wasm.link": { + "translation": " Situs web resmi D Spesifikasi bahasa D Tur bahasa D Belajar X dalam Y menit, di mana X = D Dokumentasi LiveCodes Muat templat awal " + }, + "d-wasm.name": { + "translation": "D (Wasm)" + }, "diagrams.desc1": { "translation": "(Eksperimental)" }, diff --git a/src/livecodes/i18n/locales/id/language-info.ts b/src/livecodes/i18n/locales/id/language-info.ts index bc6d0467e7..03d6c57a8e 100644 --- a/src/livecodes/i18n/locales/id/language-info.ts +++ b/src/livecodes/i18n/locales/id/language-info.ts @@ -113,6 +113,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1> <2>Dokumentasi bahasa C# <3> <4>Pelajari X dalam Y menit, dengan X=C# <5> <6>Dokumentasi LiveCodes <7> <8>Muat template pemula ', name: 'C# (Wasm)', }, + 'd-wasm': { + desc: 'D dikompilasi ke WebAssembly oleh <1>DMD, berjalan sepenuhnya di dalam browser.', + link: '<1> <2>Situs web resmi D <3> <4>Spesifikasi bahasa D <5> <6>Tur bahasa D <7> <8>Belajar X dalam Y menit, di mana X = D <9> <10>Dokumentasi LiveCodes <11> <12>Muat templat awal ', + name: 'D (Wasm)', + }, diagrams: { desc1: '(Eksperimental)', desc2: 'Diagram-sebagai-kode. Mendukung:', diff --git a/src/livecodes/i18n/locales/id/translation.lokalise.json b/src/livecodes/i18n/locales/id/translation.lokalise.json index 66df0cffab..47ce60c852 100644 --- a/src/livecodes/i18n/locales/id/translation.lokalise.json +++ b/src/livecodes/i18n/locales/id/translation.lokalise.json @@ -1971,6 +1971,9 @@ "templates.starter.csharp-wasm": { "translation": "Pemula C# (Wasm)" }, + "templates.starter.d-wasm": { + "translation": "Pemula D" + }, "templates.starter.d3": { "translation": "Pemula D3" }, diff --git a/src/livecodes/i18n/locales/id/translation.ts b/src/livecodes/i18n/locales/id/translation.ts index 71bad67074..fd6180395c 100644 --- a/src/livecodes/i18n/locales/id/translation.ts +++ b/src/livecodes/i18n/locales/id/translation.ts @@ -996,6 +996,7 @@ const translation: I18nTranslation = { cpp: 'Pemula C++', 'cpp-wasm': 'Pemula C++ (Wasm)', 'csharp-wasm': 'Pemula C# (Wasm)', + 'd-wasm': 'Pemula D', d3: 'Pemula D3', daisyui: 'Pemula daisyUI', diagrams: 'Pemula Diagram', diff --git a/src/livecodes/i18n/locales/it/language-info.lokalise.json b/src/livecodes/i18n/locales/it/language-info.lokalise.json index 6bd459e148..53042e8e1f 100644 --- a/src/livecodes/i18n/locales/it/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/it/language-info.lokalise.json @@ -192,6 +192,15 @@ "csharpWasm.name": { "translation": "C# (Wasm)" }, + "d-wasm.desc": { + "translation": "D compilato in WebAssembly da DMD, eseguito interamente nel browser." + }, + "d-wasm.link": { + "translation": " Sito web ufficiale di D Specifica del linguaggio D Tour del linguaggio D Impara X in Y minuti, dove X = D Documentazione di LiveCodes Carica il modello di avvio " + }, + "d-wasm.name": { + "translation": "D (Wasm)" + }, "diagrams.desc1": { "translation": "(Sperimentale)" }, diff --git a/src/livecodes/i18n/locales/it/language-info.ts b/src/livecodes/i18n/locales/it/language-info.ts index a894e3c498..5536561e6e 100644 --- a/src/livecodes/i18n/locales/it/language-info.ts +++ b/src/livecodes/i18n/locales/it/language-info.ts @@ -112,6 +112,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1> <2>Documentazione sul linguaggio C# <3> <4> Imparare X in Y minuti, dove X=C# <5> <6> Documentazione LiveCodes <7> <8> Carica il modello iniziale ', name: 'C# (Wasm)', }, + 'd-wasm': { + desc: 'D compilato in WebAssembly da <1>DMD, eseguito interamente nel browser.', + link: '<1> <2>Sito web ufficiale di D <3> <4>Specifica del linguaggio D <5> <6>Tour del linguaggio D <7> <8>Impara X in Y minuti, dove X = D <9> <10>Documentazione di LiveCodes <11> <12>Carica il modello di avvio ', + name: 'D (Wasm)', + }, diagrams: { desc1: '(Sperimentale)', desc2: 'Diagrammi come codice. Supporta:', diff --git a/src/livecodes/i18n/locales/it/translation.lokalise.json b/src/livecodes/i18n/locales/it/translation.lokalise.json index df72eb124c..fbc62938c2 100644 --- a/src/livecodes/i18n/locales/it/translation.lokalise.json +++ b/src/livecodes/i18n/locales/it/translation.lokalise.json @@ -1971,6 +1971,9 @@ "templates.starter.csharp-wasm": { "translation": "Starter C# (Wasm)" }, + "templates.starter.d-wasm": { + "translation": "Starter D" + }, "templates.starter.d3": { "translation": "Starter D3" }, diff --git a/src/livecodes/i18n/locales/it/translation.ts b/src/livecodes/i18n/locales/it/translation.ts index d06368db46..b67c6fe4f0 100644 --- a/src/livecodes/i18n/locales/it/translation.ts +++ b/src/livecodes/i18n/locales/it/translation.ts @@ -997,6 +997,7 @@ const translation: I18nTranslation = { cpp: 'Starter C++', 'cpp-wasm': 'Starter C++ (Wasm)', 'csharp-wasm': 'Starter C# (Wasm)', + 'd-wasm': 'Starter D', d3: 'Starter D3', daisyui: 'Starter daisyUI', diagrams: 'Starter Diagrammi', diff --git a/src/livecodes/i18n/locales/ja/language-info.lokalise.json b/src/livecodes/i18n/locales/ja/language-info.lokalise.json index 003af91a09..96896268d0 100644 --- a/src/livecodes/i18n/locales/ja/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/ja/language-info.lokalise.json @@ -192,6 +192,15 @@ "csharpWasm.name": { "translation": "C# (Wasm)" }, + "d-wasm.desc": { + "translation": "D は DMD によって WebAssembly にコンパイルされ、ブラウザ内で完全に実行されます。" + }, + "d-wasm.link": { + "translation": " D 公式サイト D 言語仕様 D 言語ツアー 「Y分でXを学ぶ」(X=D) LiveCodes ドキュメント スターターテンプレートを読み込む " + }, + "d-wasm.name": { + "translation": "D (Wasm)" + }, "diagrams.desc1": { "translation": "(実験的)" }, diff --git a/src/livecodes/i18n/locales/ja/language-info.ts b/src/livecodes/i18n/locales/ja/language-info.ts index 3035393447..d1cf93881d 100644 --- a/src/livecodes/i18n/locales/ja/language-info.ts +++ b/src/livecodes/i18n/locales/ja/language-info.ts @@ -112,6 +112,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1> <2>C# 言語のドキュメント <3> <4>X を Y 分で学習します (X=C の場合)# <5> <6>LiveCodesドキュメンテーション <7> <8>スターターテンプレートをロードする ', name: 'C# (Wasm)', }, + 'd-wasm': { + desc: 'D は <1>DMD によって WebAssembly にコンパイルされ、ブラウザ内で完全に実行されます。', + link: '<1> <2>D 公式サイト <3> <4>D 言語仕様 <5> <6>D 言語ツアー <7> <8>「Y分でXを学ぶ」(X=D) <9> <10>LiveCodes ドキュメント <11> <12>スターターテンプレートを読み込む ', + name: 'D (Wasm)', + }, diagrams: { desc1: '(実験的)', desc2: 'コードとしての図表。サポート:', diff --git a/src/livecodes/i18n/locales/ja/translation.lokalise.json b/src/livecodes/i18n/locales/ja/translation.lokalise.json index 6c8c6c8989..408515a6fc 100644 --- a/src/livecodes/i18n/locales/ja/translation.lokalise.json +++ b/src/livecodes/i18n/locales/ja/translation.lokalise.json @@ -1971,6 +1971,9 @@ "templates.starter.csharp-wasm": { "translation": "C#(Wasm)スターター" }, + "templates.starter.d-wasm": { + "translation": "Dスターター" + }, "templates.starter.d3": { "translation": "D3スターター" }, diff --git a/src/livecodes/i18n/locales/ja/translation.ts b/src/livecodes/i18n/locales/ja/translation.ts index 1683c8e497..ff4f4c6064 100644 --- a/src/livecodes/i18n/locales/ja/translation.ts +++ b/src/livecodes/i18n/locales/ja/translation.ts @@ -997,6 +997,7 @@ const translation: I18nTranslation = { cpp: 'C++スターター', 'cpp-wasm': 'C++(Wasm)スターター', 'csharp-wasm': 'C#(Wasm)スターター', + 'd-wasm': 'Dスターター', d3: 'D3スターター', daisyui: 'daisyUIスターター', diagrams: 'ダイアグラムスターター', diff --git a/src/livecodes/i18n/locales/nl/language-info.lokalise.json b/src/livecodes/i18n/locales/nl/language-info.lokalise.json index 475696dba9..f16a44febd 100644 --- a/src/livecodes/i18n/locales/nl/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/nl/language-info.lokalise.json @@ -192,6 +192,15 @@ "csharpWasm.name": { "translation": "C# (Wasm)" }, + "d-wasm.desc": { + "translation": "D wordt door DMD gecompileerd naar WebAssembly en draait volledig in de browser." + }, + "d-wasm.link": { + "translation": " Officiële website van D D-taalspecificatie D taaltour Leer X in Y minuten, waarbij X = D LiveCodes-documentatie Starterssjabloon laden " + }, + "d-wasm.name": { + "translation": "D (Wasm)" + }, "diagrams.desc1": { "translation": "(Experimenteel)" }, diff --git a/src/livecodes/i18n/locales/nl/language-info.ts b/src/livecodes/i18n/locales/nl/language-info.ts index 164da152f1..558fa2d990 100644 --- a/src/livecodes/i18n/locales/nl/language-info.ts +++ b/src/livecodes/i18n/locales/nl/language-info.ts @@ -112,6 +112,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1> <2>C#-taaldocumentatie <3> <4>Leer X in Y minuten, waarbij X=C# <5> <6>LiveCodes Documentatie <7> <8>Startsjabloon laden ', name: 'C# (Wasm)', }, + 'd-wasm': { + desc: 'D wordt door <1>DMD gecompileerd naar WebAssembly en draait volledig in de browser.', + link: '<1> <2>Officiële website van D <3> <4>D-taalspecificatie <5> <6>D taaltour <7> <8>Leer X in Y minuten, waarbij X = D <9> <10>LiveCodes-documentatie <11> <12>Starterssjabloon laden ', + name: 'D (Wasm)', + }, diagrams: { desc1: '(Experimenteel)', desc2: 'Diagrammen als code. Ondersteunt:', diff --git a/src/livecodes/i18n/locales/nl/translation.lokalise.json b/src/livecodes/i18n/locales/nl/translation.lokalise.json index 6d15d7fad6..ef30f62d0f 100644 --- a/src/livecodes/i18n/locales/nl/translation.lokalise.json +++ b/src/livecodes/i18n/locales/nl/translation.lokalise.json @@ -1971,6 +1971,9 @@ "templates.starter.csharp-wasm": { "translation": "C# (Wasm)-starter" }, + "templates.starter.d-wasm": { + "translation": "D-starter" + }, "templates.starter.d3": { "translation": "D3-starter" }, diff --git a/src/livecodes/i18n/locales/nl/translation.ts b/src/livecodes/i18n/locales/nl/translation.ts index 7e9b636c88..1a1109093b 100644 --- a/src/livecodes/i18n/locales/nl/translation.ts +++ b/src/livecodes/i18n/locales/nl/translation.ts @@ -997,6 +997,7 @@ const translation: I18nTranslation = { cpp: 'C++-starter', 'cpp-wasm': 'C++ (Wasm)-starter', 'csharp-wasm': 'C# (Wasm)-starter', + 'd-wasm': 'D-starter', d3: 'D3-starter', daisyui: 'daisyUI-starter', diagrams: 'Diagrammen-starter', diff --git a/src/livecodes/i18n/locales/pt/language-info.lokalise.json b/src/livecodes/i18n/locales/pt/language-info.lokalise.json index e2bf2819f5..ffc35b6ec4 100644 --- a/src/livecodes/i18n/locales/pt/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/pt/language-info.lokalise.json @@ -192,6 +192,15 @@ "csharpWasm.name": { "translation": "C# (Wasm)" }, + "d-wasm.desc": { + "translation": "D compilado para WebAssembly pelo DMD, executado na íntegra no navegador." + }, + "d-wasm.link": { + "translation": " Site oficial do D Especificação da linguagem D Tour pela linguagem D Aprenda X em Y minutos, onde X = D Documentação do LiveCodes Carregar modelo inicial " + }, + "d-wasm.name": { + "translation": "D (Wasm)" + }, "diagrams.desc1": { "translation": "(Experimental)" }, diff --git a/src/livecodes/i18n/locales/pt/language-info.ts b/src/livecodes/i18n/locales/pt/language-info.ts index 1e542fb8ba..95355064e8 100644 --- a/src/livecodes/i18n/locales/pt/language-info.ts +++ b/src/livecodes/i18n/locales/pt/language-info.ts @@ -112,6 +112,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1> <2>Documentação da linguagem C# <3> <4> Aprenda X em Y minutos, onde X=C# <5> <6> Documentação LiveCodes <7> <8> Carregar modelo inicial ', name: 'C# (Wasm)', }, + 'd-wasm': { + desc: 'D compilado para WebAssembly pelo <1>DMD, executado na íntegra no navegador.', + link: '<1> <2>Site oficial do D <3> <4>Especificação da linguagem D <5> <6>Tour pela linguagem D <7> <8>Aprenda X em Y minutos, onde X = D <9> <10>Documentação do LiveCodes <11> <12>Carregar modelo inicial ', + name: 'D (Wasm)', + }, diagrams: { desc1: '(Experimental)', desc2: 'Diagramas como código. Suporta:', diff --git a/src/livecodes/i18n/locales/pt/translation.lokalise.json b/src/livecodes/i18n/locales/pt/translation.lokalise.json index aa8debfe63..54a56130a0 100644 --- a/src/livecodes/i18n/locales/pt/translation.lokalise.json +++ b/src/livecodes/i18n/locales/pt/translation.lokalise.json @@ -1971,6 +1971,9 @@ "templates.starter.csharp-wasm": { "translation": "Iniciante C# (Wasm)" }, + "templates.starter.d-wasm": { + "translation": "Iniciante D" + }, "templates.starter.d3": { "translation": "Iniciante D3" }, diff --git a/src/livecodes/i18n/locales/pt/translation.ts b/src/livecodes/i18n/locales/pt/translation.ts index 1bc08b3c99..cc93458c63 100644 --- a/src/livecodes/i18n/locales/pt/translation.ts +++ b/src/livecodes/i18n/locales/pt/translation.ts @@ -997,6 +997,7 @@ const translation: I18nTranslation = { cpp: 'Iniciante C++', 'cpp-wasm': 'Iniciante C++ (Wasm)', 'csharp-wasm': 'Iniciante C# (Wasm)', + 'd-wasm': 'Iniciante D', d3: 'Iniciante D3', daisyui: 'Iniciante daisyUI', diagrams: 'Iniciante Diagrams', diff --git a/src/livecodes/i18n/locales/ru/language-info.lokalise.json b/src/livecodes/i18n/locales/ru/language-info.lokalise.json index 065ac297a6..a397a84a49 100644 --- a/src/livecodes/i18n/locales/ru/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/ru/language-info.lokalise.json @@ -192,6 +192,15 @@ "csharpWasm.name": { "translation": "C# (Wasm)" }, + "d-wasm.desc": { + "translation": "D компилируется в WebAssembly с помощью DMD и полностью выполняется в браузере." + }, + "d-wasm.link": { + "translation": " Официальный сайт D Спецификация языка D Тур по языку D «Изучите X за Y минут», где X = D Документация LiveCodes Загрузить стартовый шаблон " + }, + "d-wasm.name": { + "translation": "D (Wasm)" + }, "diagrams.desc1": { "translation": "(Экспериментально)" }, diff --git a/src/livecodes/i18n/locales/ru/language-info.ts b/src/livecodes/i18n/locales/ru/language-info.ts index 7d53b29f06..18c1b9f17b 100644 --- a/src/livecodes/i18n/locales/ru/language-info.ts +++ b/src/livecodes/i18n/locales/ru/language-info.ts @@ -113,6 +113,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1> <2>Документация по языку C# <3> <4> Узнайте X за Y минут, где X=C# <5> <6> Документация LiveCodes <7> <8> Загрузите стартовый шаблон ', name: 'C# (Wasm)', }, + 'd-wasm': { + desc: 'D компилируется в WebAssembly с помощью <1>DMD и полностью выполняется в браузере.', + link: '<1> <2>Официальный сайт D <3> <4>Спецификация языка D <5> <6>Тур по языку D <7> <8>«Изучите X за Y минут», где X = D <9> <10>Документация LiveCodes <11> <12>Загрузить стартовый шаблон ', + name: 'D (Wasm)', + }, diagrams: { desc1: '(Экспериментально)', desc2: 'Диаграммы как код. Поддерживает:', diff --git a/src/livecodes/i18n/locales/ru/translation.lokalise.json b/src/livecodes/i18n/locales/ru/translation.lokalise.json index 5778dcbf95..ec8c67ad93 100644 --- a/src/livecodes/i18n/locales/ru/translation.lokalise.json +++ b/src/livecodes/i18n/locales/ru/translation.lokalise.json @@ -1971,6 +1971,9 @@ "templates.starter.csharp-wasm": { "translation": "Стартер C# (Wasm)" }, + "templates.starter.d-wasm": { + "translation": "Стартер D" + }, "templates.starter.d3": { "translation": "Стартер D3" }, diff --git a/src/livecodes/i18n/locales/ru/translation.ts b/src/livecodes/i18n/locales/ru/translation.ts index a66e97ded6..e9f7029b8e 100644 --- a/src/livecodes/i18n/locales/ru/translation.ts +++ b/src/livecodes/i18n/locales/ru/translation.ts @@ -996,6 +996,7 @@ const translation: I18nTranslation = { cpp: 'Стартер C++', 'cpp-wasm': 'Стартер C++ (Wasm)', 'csharp-wasm': 'Стартер C# (Wasm)', + 'd-wasm': 'Стартер D', d3: 'Стартер D3', daisyui: 'Стартер daisyUI', diagrams: 'Стартер диаграмм', diff --git a/src/livecodes/i18n/locales/tr/language-info.lokalise.json b/src/livecodes/i18n/locales/tr/language-info.lokalise.json index c24dda41e7..8e1d342fe8 100644 --- a/src/livecodes/i18n/locales/tr/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/tr/language-info.lokalise.json @@ -192,6 +192,15 @@ "csharpWasm.name": { "translation": "C# (Wasm)" }, + "d-wasm.desc": { + "translation": "D, DMD tarafından WebAssembly’ye derlenir ve tamamen tarayıcı içinde çalışır." + }, + "d-wasm.link": { + "translation": " D resmi web sitesi D dil spesifikasyonu D dil turu Y dakikada X'i öğrenin, burada X=D LiveCodes Belgeleri Başlangıç şablonunu yükle " + }, + "d-wasm.name": { + "translation": "D (Wasm)" + }, "diagrams.desc1": { "translation": "(Deneysel)" }, diff --git a/src/livecodes/i18n/locales/tr/language-info.ts b/src/livecodes/i18n/locales/tr/language-info.ts index d5d18f7de6..f072ea97e3 100644 --- a/src/livecodes/i18n/locales/tr/language-info.ts +++ b/src/livecodes/i18n/locales/tr/language-info.ts @@ -112,6 +112,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1> <2>C# dil dokümantasyonu <3> <4>Y Dakikada X Öğrenin, X=C# <5> <6>LiveCodes Dokümantasyonu <7> <8>Başlangıç şablonunu yükle ', name: 'C# (Wasm)', }, + 'd-wasm': { + desc: 'D, <1>DMD tarafından WebAssembly’ye derlenir ve tamamen tarayıcı içinde çalışır.', + link: "<1> <2>D resmi web sitesi <3> <4>D dil spesifikasyonu <5> <6>D dil turu <7> <8>Y dakikada X'i öğrenin, burada X=D <9> <10>LiveCodes Belgeleri <11> <12>Başlangıç şablonunu yükle ", + name: 'D (Wasm)', + }, diagrams: { desc1: '(Deneysel)', desc2: 'Kod olarak diyagramlar. Destekledikleri:', diff --git a/src/livecodes/i18n/locales/tr/translation.lokalise.json b/src/livecodes/i18n/locales/tr/translation.lokalise.json index c1fd9a1e2e..fef8e96051 100644 --- a/src/livecodes/i18n/locales/tr/translation.lokalise.json +++ b/src/livecodes/i18n/locales/tr/translation.lokalise.json @@ -1971,6 +1971,9 @@ "templates.starter.csharp-wasm": { "translation": "C# (Wasm) Başlangıç" }, + "templates.starter.d-wasm": { + "translation": "D Başlangıç" + }, "templates.starter.d3": { "translation": "D3 Başlangıç" }, diff --git a/src/livecodes/i18n/locales/tr/translation.ts b/src/livecodes/i18n/locales/tr/translation.ts index e0d07f1935..58e5dfc274 100644 --- a/src/livecodes/i18n/locales/tr/translation.ts +++ b/src/livecodes/i18n/locales/tr/translation.ts @@ -997,6 +997,7 @@ const translation: I18nTranslation = { cpp: 'C++ Başlangıç', 'cpp-wasm': 'C++ (Wasm) Başlangıç', 'csharp-wasm': 'C# (Wasm) Başlangıç', + 'd-wasm': 'D Başlangıç', d3: 'D3 Başlangıç', daisyui: 'daisyUI Başlangıç', diagrams: 'Diyagramlar Başlangıç', diff --git a/src/livecodes/i18n/locales/ur/language-info.lokalise.json b/src/livecodes/i18n/locales/ur/language-info.lokalise.json index 5edc90fd8f..8c27972788 100644 --- a/src/livecodes/i18n/locales/ur/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/ur/language-info.lokalise.json @@ -192,6 +192,15 @@ "csharpWasm.name": { "translation": "C# (Wasm)" }, + "d-wasm.desc": { + "translation": "D DMD کے ذریعے WebAssembly میں مرتب کیا جاتا ہے، جو مکمل طور پر براؤزر میں چلتا ہے۔" + }, + "d-wasm.link": { + "translation": " D آفیشل ویب سائٹ D زبان کی تفصیلات D زبان کا دورہ Y منٹ میں X سیکھیں، جہاں X=D لائیو کوڈز دستاویزات اسٹارٹر ٹیمپلیٹ لوڈ کریں " + }, + "d-wasm.name": { + "translation": "D (Wasm)" + }, "diagrams.desc1": { "translation": "(تجرباتی)" }, diff --git a/src/livecodes/i18n/locales/ur/language-info.ts b/src/livecodes/i18n/locales/ur/language-info.ts index ed2b461a39..ee9a1d3e92 100644 --- a/src/livecodes/i18n/locales/ur/language-info.ts +++ b/src/livecodes/i18n/locales/ur/language-info.ts @@ -113,6 +113,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1> <2> C# زبان کی دستاویزات <3> <4> Y منٹوں میں X سیکھیں، جہاں X=C# <5> <6> LiveCodes ڈاکومینٹیشن <7> <8> شروع کریں ', name: 'C# (Wasm)', }, + 'd-wasm': { + desc: 'D <1>DMD کے ذریعے WebAssembly میں مرتب کیا جاتا ہے، جو مکمل طور پر براؤزر میں چلتا ہے۔', + link: '<1> <2>D آفیشل ویب سائٹ <3> <4>D زبان کی تفصیلات <5> <6>D زبان کا دورہ <7> <8>Y منٹ میں X سیکھیں، جہاں X=D <9> <10>لائیو کوڈز دستاویزات <11> <12>اسٹارٹر ٹیمپلیٹ لوڈ کریں ', + name: 'D (Wasm)', + }, diagrams: { desc1: '(تجرباتی)', desc2: 'کوڈ کے طور پر خاکے۔ معاونت کرتا ہے:', diff --git a/src/livecodes/i18n/locales/ur/translation.lokalise.json b/src/livecodes/i18n/locales/ur/translation.lokalise.json index 18f444566e..c830900131 100644 --- a/src/livecodes/i18n/locales/ur/translation.lokalise.json +++ b/src/livecodes/i18n/locales/ur/translation.lokalise.json @@ -1971,6 +1971,9 @@ "templates.starter.csharp-wasm": { "translation": "C# (واسم) شروعاتی" }, + "templates.starter.d-wasm": { + "translation": "D شروعاتی" + }, "templates.starter.d3": { "translation": "D3 شروعاتی" }, diff --git a/src/livecodes/i18n/locales/ur/translation.ts b/src/livecodes/i18n/locales/ur/translation.ts index 98147ee70a..73f962da93 100644 --- a/src/livecodes/i18n/locales/ur/translation.ts +++ b/src/livecodes/i18n/locales/ur/translation.ts @@ -996,6 +996,7 @@ const translation: I18nTranslation = { cpp: 'سی++ شروعاتی', 'cpp-wasm': 'سی++ (واسم) شروعاتی', 'csharp-wasm': 'C# (واسم) شروعاتی', + 'd-wasm': 'D شروعاتی', d3: 'D3 شروعاتی', daisyui: 'daisyUI شروعاتی', diagrams: 'ڈایاگرامز شروعاتی', diff --git a/src/livecodes/i18n/locales/zh-CN/language-info.lokalise.json b/src/livecodes/i18n/locales/zh-CN/language-info.lokalise.json index 6030018064..62e481aa39 100644 --- a/src/livecodes/i18n/locales/zh-CN/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/zh-CN/language-info.lokalise.json @@ -192,6 +192,15 @@ "csharpWasm.name": { "translation": "C# (Wasm)" }, + "d-wasm.desc": { + "translation": "D 由 DMD 编译为 WebAssembly,完全在浏览器中运行。" + }, + "d-wasm.link": { + "translation": " D 官方网站 D 语言规范 D 语言导览 《Y分钟学会X》,其中X=D LiveCodes 文档 加载入门模板 " + }, + "d-wasm.name": { + "translation": "D (Wasm)" + }, "diagrams.desc1": { "translation": "(实验性)" }, diff --git a/src/livecodes/i18n/locales/zh-CN/language-info.ts b/src/livecodes/i18n/locales/zh-CN/language-info.ts index eff5c264d1..31c50ef7c9 100644 --- a/src/livecodes/i18n/locales/zh-CN/language-info.ts +++ b/src/livecodes/i18n/locales/zh-CN/language-info.ts @@ -111,6 +111,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1> <2> C# 语言文档 <3> <4>在 Y 分钟内学习 X,其中 X=C# <5> <6> LiveCodes 文档 <7> <8>加载入门模板 ', name: 'C# (Wasm)', }, + 'd-wasm': { + desc: 'D 由 <1>DMD 编译为 WebAssembly,完全在浏览器中运行。', + link: '<1> <2>D 官方网站 <3> <4>D 语言规范 <5> <6>D 语言导览 <7> <8>《Y分钟学会X》,其中X=D <9> <10>LiveCodes 文档 <11> <12>加载入门模板 ', + name: 'D (Wasm)', + }, diagrams: { desc1: '(实验性)', desc2: '使用代码绘制图表。支持:', diff --git a/src/livecodes/i18n/locales/zh-CN/translation.lokalise.json b/src/livecodes/i18n/locales/zh-CN/translation.lokalise.json index 2fb10a92c1..fcd92ab6a4 100644 --- a/src/livecodes/i18n/locales/zh-CN/translation.lokalise.json +++ b/src/livecodes/i18n/locales/zh-CN/translation.lokalise.json @@ -1971,6 +1971,9 @@ "templates.starter.csharp-wasm": { "translation": "C#(WASM)启动模板" }, + "templates.starter.d-wasm": { + "translation": "D 启动模板" + }, "templates.starter.d3": { "translation": "D3 启动模板" }, diff --git a/src/livecodes/i18n/locales/zh-CN/translation.ts b/src/livecodes/i18n/locales/zh-CN/translation.ts index 740a43b357..6e6646cbf2 100644 --- a/src/livecodes/i18n/locales/zh-CN/translation.ts +++ b/src/livecodes/i18n/locales/zh-CN/translation.ts @@ -994,6 +994,7 @@ const translation: I18nTranslation = { cpp: 'C++ 启动模板', 'cpp-wasm': 'C++(WASM)启动模板', 'csharp-wasm': 'C#(WASM)启动模板', + 'd-wasm': 'D 启动模板', d3: 'D3 启动模板', daisyui: 'daisyUI 启动模板', diagrams: '图表启动模板', diff --git a/src/livecodes/languages/d-wasm/__tests__/lang-d-wasm.spec.ts b/src/livecodes/languages/d-wasm/__tests__/lang-d-wasm.spec.ts new file mode 100644 index 0000000000..3c8b48503b --- /dev/null +++ b/src/livecodes/languages/d-wasm/__tests__/lang-d-wasm.spec.ts @@ -0,0 +1,28 @@ +import { dWasm } from '../lang-d-wasm'; + +describe('D (Wasm) language spec', () => { + test('is registered as d-wasm, with the wasm compiler script', () => { + expect(dWasm.name).toBe('d-wasm'); + expect(dWasm.title).toBe('D (Wasm)'); + expect(dWasm.compiler).toMatchObject({ + scriptType: 'text/d-wasm', + compiledCodeLanguage: 'd-wasm', + liveReload: true, + }); + }); + + test('accepts the common D extensions', () => { + expect(dWasm.extensions).toEqual(expect.arrayContaining(['d', 'di', 'dlang', 'dmd'])); + }); + + test('warns that the first run is a large download', () => { + // The DMD runtime is ~5.5 MB compressed (25 MB inflated); the app shows a loading indicator. + expect(dWasm.largeDownload).toBe(true); + }); + + test('provides D editor support in all editors', () => { + expect(dWasm.editor).toBe('script'); + expect(dWasm.editorSupport?.monaco?.language).toBe('d'); + expect(dWasm.editorSupport?.codejar?.language).toBe('d'); + }); +}); diff --git a/src/livecodes/languages/d-wasm/index.ts b/src/livecodes/languages/d-wasm/index.ts new file mode 100644 index 0000000000..7c6cf784a8 --- /dev/null +++ b/src/livecodes/languages/d-wasm/index.ts @@ -0,0 +1 @@ +export * from './lang-d-wasm'; diff --git a/src/livecodes/languages/d-wasm/lang-d-wasm-script.ts b/src/livecodes/languages/d-wasm/lang-d-wasm-script.ts new file mode 100644 index 0000000000..254e92f37f --- /dev/null +++ b/src/livecodes/languages/d-wasm/lang-d-wasm-script.ts @@ -0,0 +1,221 @@ +/* eslint-disable no-console */ +import { getErrorMessage } from '../../utils/utils'; +import { dlangWasmBaseUrl } from '../../vendors'; +import { createWorkerRunner, type Runner } from '../worker-runner'; + +// One runner for one language. The compiler itself is @live-codes/dlang-wasm (DMD compiled to +// WebAssembly), loaded from its CDN build: the IIFE defines `self.dlangWasm`, which the worker +// reaches with importScripts. It compiles and runs the program in place, because a browser has no +// linker subprocess to hand a binary to. +const SCRIPT_TYPE = 'text/d-wasm'; + +interface RunResult { + input: string; + output: string | null; + error: string | null; + exitCode: number | null; +} + +interface DWasmApi { + ready: boolean; + input: string; + output: string | null; + error: string | null; + exitCode: number | null; + loaded: Promise; + init: Promise | null; + runner: Runner | null; + run: (input?: string) => Promise; +} + +declare const window: Window & { + livecodes: Record; +}; + +const getWorkerSrc = () => ` +importScripts(${JSON.stringify(dlangWasmBaseUrl + 'dist/dlang-wasm.global.js')}); + +let compilerPromise = null; + +const getCompiler = () => { + compilerPromise = + compilerPromise || + self.dlangWasm + .createCompiler('d', { + baseUrl: ${JSON.stringify(dlangWasmBaseUrl + 'assets/')}, + }) + .then(async (compiler) => { + // Compile druntime up front so the first Run only pays for the program. + await compiler.warm(); + return compiler; + }); + return compilerPromise; +}; + +addEventListener('message', async (event) => { + const { id, code, input } = event.data; + try { + const compiler = await getCompiler(); + const result = await compiler.run(code, input); + postMessage({ + id, + result: { + output: result.output, + // The package reports diagnostics as an array; empty on a clean compile. + errors: result.errors || [], + exitCode: result.exitCode, + }, + }); + } catch (error) { + postMessage({ id, error: String((error && error.message) || error) }); + } +}); + +getCompiler().then( + () => postMessage({ type: 'ready' }), + (error) => postMessage({ type: 'error', message: String((error && error.message) || error) }), +); +`; + +// A single compile + run is normally quick; a long timeout guards against hangs (e.g. an infinite +// loop in the user program) by killing and respawning the worker. The wasm call cannot be +// interrupted any other way. +const RUN_TIMEOUT_MS = 120000; + +/** + * Reads the program out of the result page. + * + * The result page writes the code inline as the `innerHTML` of a + * ` +`.trimStart(), + }, + style: { + language: 'css', + content: ` +.container, +.container button { + text-align: center; + font: 1em sans-serif; +} +.logo { + width: 150px; +} +`.trimStart(), + }, + script: { + language: 'd', + content: ` +import std.stdio; +import std.string : strip; +import std.conv : to; + +void main() +{ + writeln("D"); + int count = readln().strip().to!int; + writeln(count + 1); +} +`.trimStart(), + }, +}; diff --git a/src/livecodes/templates/starter/index.ts b/src/livecodes/templates/starter/index.ts index 6647ec7b83..1342107608 100644 --- a/src/livecodes/templates/starter/index.ts +++ b/src/livecodes/templates/starter/index.ts @@ -20,6 +20,7 @@ import { coffeescriptStarter } from './coffeescript-starter'; import { commonlispStarter } from './commonlisp-starter'; import { cppStarter } from './cpp-starter'; import { csharpWasmStarter } from './csharp-wasm-starter'; +import { dWasmStarter } from './d-wasm-starter'; import { d3Starter } from './d3-starter'; import { daisyuiStarter } from './daisyui-starter'; import { diagramsStarter } from './diagrams-starter'; @@ -141,6 +142,7 @@ export const starterTemplates = [ objcWasmStarter, cobolWasmStarter, fortranWasmStarter, + dWasmStarter, rustWasmStarter, swiftWasmStarter, zigWasmStarter, diff --git a/src/livecodes/vendors.ts b/src/livecodes/vendors.ts index 44fc5d65c5..d2badfe390 100644 --- a/src/livecodes/vendors.ts +++ b/src/livecodes/vendors.ts @@ -140,6 +140,8 @@ export const ddietrCmThemesBaseUrl = /* @__PURE__ */ getUrl( '@ddietr/codemirror-themes@1.4.2/dist/theme/', ); +export const dlangWasmBaseUrl = /* @__PURE__ */ getUrl('@live-codes/dlang-wasm@0.1.0/'); + export const doppioJvmBaseUrl = 'https://unpkg.com/@seth0x41/doppio@1.0.0/'; export const dotUrl = /* @__PURE__ */ getUrl('dot@1.1.3/doT.js'); @@ -364,7 +366,7 @@ export const monacoBaseUrl = /* @__PURE__ */ getUrl('@live-codes/monaco-editor@0 export const monacoEmacsUrl = /* @__PURE__ */ getUrl('monaco-emacs@0.3.0/dist/monaco-emacs.js'); export const monacoLanguagesBaseUrl = /* @__PURE__ */ getUrl( - '@live-codes/monaco-languages@0.3.10/dist/', + '@live-codes/monaco-languages@0.3.11/dist/', ); export const monacoThemesBaseUrl = /* @__PURE__ */ getUrl('monaco-themes@0.4.4/themes/'); diff --git a/src/sdk/models.ts b/src/sdk/models.ts index 2ade86ec3c..b1dc2a4692 100644 --- a/src/sdk/models.ts +++ b/src/sdk/models.ts @@ -192,6 +192,11 @@ export type Language = | 'ftn' | 'fortran-wasm' | 'lfortran' + | 'd' + | 'di' + | 'dlang' + | 'dmd' + | 'd-wasm' | 'cpp-wasm' | 'cppwasm' | 'wasm.cpp' @@ -491,6 +496,7 @@ export type TemplateName = | 'cpp-wasm' | 'objc-wasm' | 'fortran-wasm' + | 'd-wasm' | 'cobol-wasm' | 'java' | 'csharp-wasm' diff --git a/storybook/_stories/EmbedOptions/template.ts b/storybook/_stories/EmbedOptions/template.ts index 081df37858..39ab1ecc63 100644 --- a/storybook/_stories/EmbedOptions/template.ts +++ b/storybook/_stories/EmbedOptions/template.ts @@ -51,6 +51,7 @@ const storyDef: StoryDef = { CWasm: { props: { template: 'c-wasm' } }, CppWasm: { props: { template: 'cpp-wasm' } }, ObjcWasm: { props: { template: 'objc-wasm' } }, + DWasm: { props: { template: 'd-wasm' } }, CobolWasm: { props: { template: 'cobol-wasm' }, storyName: 'COBOL (Wasm)' }, FortranWasm: { props: { template: 'fortran-wasm' }, storyName: 'Fortran (Wasm)' }, RustWasm: { props: { template: 'rust-wasm' } }, diff --git a/storybook/preact/stories/EmbedOptions/template.stories.ts b/storybook/preact/stories/EmbedOptions/template.stories.ts index a9e2264a5f..9425051cdd 100644 --- a/storybook/preact/stories/EmbedOptions/template.stories.ts +++ b/storybook/preact/stories/EmbedOptions/template.stories.ts @@ -66,6 +66,7 @@ export const CWasm = livecodesStory({ template: 'c-wasm' }); export const CppWasm = livecodesStory({ template: 'cpp-wasm' }); export const ObjcWasm = livecodesStory({ template: 'objc-wasm' }); export const FortranWasm = livecodesStory({ template: 'fortran-wasm' }); +export const DWasm = livecodesStory({ template: 'd-wasm' }); export const RustWasm = livecodesStory({ template: 'rust-wasm' }); export const SwiftWasm = livecodesStory({ template: 'swift-wasm' }); export const ZigWasm = livecodesStory({ template: 'zig-wasm' }); diff --git a/storybook/react/stories/EmbedOptions/template.stories.ts b/storybook/react/stories/EmbedOptions/template.stories.ts index a9e2264a5f..9425051cdd 100644 --- a/storybook/react/stories/EmbedOptions/template.stories.ts +++ b/storybook/react/stories/EmbedOptions/template.stories.ts @@ -66,6 +66,7 @@ export const CWasm = livecodesStory({ template: 'c-wasm' }); export const CppWasm = livecodesStory({ template: 'cpp-wasm' }); export const ObjcWasm = livecodesStory({ template: 'objc-wasm' }); export const FortranWasm = livecodesStory({ template: 'fortran-wasm' }); +export const DWasm = livecodesStory({ template: 'd-wasm' }); export const RustWasm = livecodesStory({ template: 'rust-wasm' }); export const SwiftWasm = livecodesStory({ template: 'swift-wasm' }); export const ZigWasm = livecodesStory({ template: 'zig-wasm' }); diff --git a/storybook/solid/stories/EmbedOptions/template.stories.ts b/storybook/solid/stories/EmbedOptions/template.stories.ts index a9e2264a5f..9425051cdd 100644 --- a/storybook/solid/stories/EmbedOptions/template.stories.ts +++ b/storybook/solid/stories/EmbedOptions/template.stories.ts @@ -66,6 +66,7 @@ export const CWasm = livecodesStory({ template: 'c-wasm' }); export const CppWasm = livecodesStory({ template: 'cpp-wasm' }); export const ObjcWasm = livecodesStory({ template: 'objc-wasm' }); export const FortranWasm = livecodesStory({ template: 'fortran-wasm' }); +export const DWasm = livecodesStory({ template: 'd-wasm' }); export const RustWasm = livecodesStory({ template: 'rust-wasm' }); export const SwiftWasm = livecodesStory({ template: 'swift-wasm' }); export const ZigWasm = livecodesStory({ template: 'zig-wasm' }); diff --git a/storybook/svelte/stories/EmbedOptions/template.stories.ts b/storybook/svelte/stories/EmbedOptions/template.stories.ts index a9e2264a5f..9425051cdd 100644 --- a/storybook/svelte/stories/EmbedOptions/template.stories.ts +++ b/storybook/svelte/stories/EmbedOptions/template.stories.ts @@ -66,6 +66,7 @@ export const CWasm = livecodesStory({ template: 'c-wasm' }); export const CppWasm = livecodesStory({ template: 'cpp-wasm' }); export const ObjcWasm = livecodesStory({ template: 'objc-wasm' }); export const FortranWasm = livecodesStory({ template: 'fortran-wasm' }); +export const DWasm = livecodesStory({ template: 'd-wasm' }); export const RustWasm = livecodesStory({ template: 'rust-wasm' }); export const SwiftWasm = livecodesStory({ template: 'swift-wasm' }); export const ZigWasm = livecodesStory({ template: 'zig-wasm' }); diff --git a/storybook/vue/stories/EmbedOptions/template.stories.ts b/storybook/vue/stories/EmbedOptions/template.stories.ts index a9e2264a5f..9425051cdd 100644 --- a/storybook/vue/stories/EmbedOptions/template.stories.ts +++ b/storybook/vue/stories/EmbedOptions/template.stories.ts @@ -66,6 +66,7 @@ export const CWasm = livecodesStory({ template: 'c-wasm' }); export const CppWasm = livecodesStory({ template: 'cpp-wasm' }); export const ObjcWasm = livecodesStory({ template: 'objc-wasm' }); export const FortranWasm = livecodesStory({ template: 'fortran-wasm' }); +export const DWasm = livecodesStory({ template: 'd-wasm' }); export const RustWasm = livecodesStory({ template: 'rust-wasm' }); export const SwiftWasm = livecodesStory({ template: 'swift-wasm' }); export const ZigWasm = livecodesStory({ template: 'zig-wasm' }); diff --git a/storybook/web-components/stories/EmbedOptions/template.stories.ts b/storybook/web-components/stories/EmbedOptions/template.stories.ts index a9e2264a5f..9425051cdd 100644 --- a/storybook/web-components/stories/EmbedOptions/template.stories.ts +++ b/storybook/web-components/stories/EmbedOptions/template.stories.ts @@ -66,6 +66,7 @@ export const CWasm = livecodesStory({ template: 'c-wasm' }); export const CppWasm = livecodesStory({ template: 'cpp-wasm' }); export const ObjcWasm = livecodesStory({ template: 'objc-wasm' }); export const FortranWasm = livecodesStory({ template: 'fortran-wasm' }); +export const DWasm = livecodesStory({ template: 'd-wasm' }); export const RustWasm = livecodesStory({ template: 'rust-wasm' }); export const SwiftWasm = livecodesStory({ template: 'swift-wasm' }); export const ZigWasm = livecodesStory({ template: 'zig-wasm' }); diff --git a/vendor-licenses.md b/vendor-licenses.md index f46ea0731e..6c1d2e0339 100644 --- a/vendor-licenses.md +++ b/vendor-licenses.md @@ -344,6 +344,10 @@ wabt.js: [Apache-2.0 license](https://github.com/AssemblyScript/wabt.js/blob/182 wacl: [BSD 3-Clause License](https://github.com/ecky-l/wacl/blob/9daacabb0102a9986f33263261350edfeebdd83b/LICENSE) +@live-codes/dlang-wasm: [MIT License](https://github.com/live-codes/browser-d/blob/main/LICENSE) + +DMD / druntime / Phobos (Wasm): [BSL-1.0 License](https://github.com/dlang/dmd/blob/master/LICENSE.txt) + @live-codes/cobol-wasm: [MIT License](https://github.com/live-codes/browser-cobol/blob/main/LICENSE) (the [@live-codes/cobol-wasm](https://www.npmjs.com/package/@live-codes/cobol-wasm) package's own code is MIT, but it ships GnuCOBOL in its assets and so declares `(MIT AND GPL-3.0-or-later)`. Neither GnuCOBOL nor Clang is bundled by LiveCodes; both are loaded at run time) GnuCOBOL (Wasm): [GPL-3.0-or-later License](https://github.com/OCamlPro/gnucobol/blob/master/COPYING) (the COBOL compiler, shipped in `@live-codes/cobol-wasm`'s assets and loaded at run time by LiveCodes. Its `libcob` runtime is [LGPL-3.0-or-later](https://github.com/OCamlPro/gnucobol/blob/master/COPYING.LESSER), as is the GMP library it links)