@manuth/woltlab-compiler
Version:
A compiler for generating WoltLab-Package `.tar` Archives and other WoltLab-Package Components
153 lines • 5.68 kB
JavaScript
import { XML } from "../../Serialization/XML.js";
import { XMLEditor } from "../../Serialization/XMLEditor.js";
import { ImportFileCompiler } from "../ImportFileCompiler.js";
/**
* Provides the functionality to compile option-files.
*
* @template TInstruction
* The type of the instruction which can be compiled by this compiler.
*
* @template TCategory
* The type of the option-categories.
*
* @template TOption
* The type of the options.
*/
export class OptionFileCompiler extends ImportFileCompiler {
/**
* Initializes a new instance of the {@link OptionFileCompiler `OptionFileCompiler<TInstruction, TCategory, TOption>`} class.
*
* @param instruction
* The instruction to compile.
*/
constructor(instruction) {
super(instruction);
this.LanguageCategory = `${instruction.RootCategory}${instruction.OptionCategory ? `.${instruction.OptionCategory}` : ""}`;
}
/**
* Gets or sets the language-category which contains translations for options.
*/
get LanguageCategory() {
return this.languageCategory;
}
/**
* @inheritdoc
*/
set LanguageCategory(value) {
this.languageCategory = value;
}
/**
* @inheritdoc
*
* @returns
* The serialized import.
*/
CreateImport() {
let editor = new XMLEditor(super.CreateImport());
let categoriesElement = editor.CreateElement("categories");
let optionsElement = editor.CreateElement("options");
editor.Add(categoriesElement);
editor.Add(optionsElement);
for (let rootCategory of this.Item.Nodes) {
for (let category of rootCategory.GetAllNodes()) {
categoriesElement.Add(this.CreateCategory(category));
}
}
for (let rootCategory of this.Item.Nodes) {
for (let category of rootCategory.GetAllNodes()) {
if (category.Item) {
for (let option of category.Item.Options) {
optionsElement.Add(this.CreateOption(option));
}
}
}
}
return editor.Element;
}
/**
* @inheritdoc
*
* @returns
* The serialized deletion.
*/
CreateDelete() {
let editor = new XMLEditor(super.CreateDelete());
for (let categoryToDelete of this.Item.CategoriesToDelete) {
let categoryElement = editor.CreateElement("category");
editor.Add(categoryElement);
categoryElement.SetAttribute("name", categoryToDelete.Name);
}
for (let optionToDelete of this.Item.OptionsToDelete) {
let optionElement = editor.CreateElement("option");
editor.Add(optionElement);
optionElement.SetAttribute("name", optionToDelete.Name);
}
return editor.Element;
}
/**
* Serializes a category to xml.
*
* @param category
* The category to serialize.
*
* @returns
* The serialized category.
*/
CreateCategory(category) {
var _a, _b;
let document = XML.CreateDocument("category");
let editor = new XMLEditor(document.documentElement);
editor.SetAttribute("name", category.FullName);
if (category.Parent) {
editor.Add(editor.CreateTextElement("parent", category.Parent.FullName));
}
if ((_a = category.Item) === null || _a === void 0 ? void 0 : _a.ShowOrder) {
editor.Add(editor.CreateTextElement("showorder", category.Item.ShowOrder.toString()));
}
if (((_b = category.Item) === null || _b === void 0 ? void 0 : _b.EnableOptions.length) > 0) {
editor.Add(editor.CreateTextElement("options", category.Item.EnableOptions.join(",")));
}
return editor.Element;
}
/**
* Serializes an option to xml.
*
* @param option
* The option to serialize.
*
* @returns
* The serialized option.
*/
CreateOption(option) {
let document = XML.CreateDocument("option");
let editor = new XMLEditor(document.documentElement);
editor.SetAttribute("name", option.Name);
editor.Add(editor.CreateTextElement("categoryname", option.Category.Node.FullName));
editor.Add(editor.CreateTextElement("optiontype", option.Type));
if (option.DefaultValue) {
editor.Add(editor.CreateTextElement("defaultvalue", `${option.DefaultValue}`));
}
if (option.ShowOrder) {
editor.Add(editor.CreateTextElement("showorder", option.ShowOrder.toString()));
}
if (option.ValidationPattern) {
editor.Add(editor.CreateTextElement("validationpattern", option.ValidationPattern.source));
}
if (option.Items.length > 0) {
editor.Add(editor.CreateTextElement("selectoptions", option.Items.map((optionItem) => {
return `${optionItem.Value}:${this.LanguageCategory}.${option.Name}.${optionItem.Name}`;
}).join("\n")));
}
if (option.Options.length > 0) {
editor.Add(editor.CreateTextElement("options", option.Options.join(",")));
}
if (option.EnableOptions.length > 0) {
editor.Add(editor.CreateTextElement("enableoptions", option.EnableOptions.join(",")));
}
for (let additionalProperty in option.AdditionalProperties) {
editor.Add(editor.CreateTextElement(additionalProperty, `${option.AdditionalProperties[additionalProperty]}`));
}
return editor.Element;
}
}
//# sourceMappingURL=OptionFileCompiler.js.map