1 package de.lathanda.eos.config;
3 import java.util.Iterator;
4 import java.util.LinkedList;
5 import java.util.Locale;
6 import java.util.ServiceLoader;
8 import org.w3c.dom.Document;
9 import org.w3c.dom.Element;
10 import org.w3c.dom.Node;
11 import org.w3c.dom.NodeList;
13 import de.lathanda.eos.base.extension.XMLProvider;
21 ServiceLoader<XMLProvider> sp = ServiceLoader.load(
XMLProvider.class);
22 LinkedList<Document> docs =
new LinkedList<>();
24 for(Document d : xml.getXML()) {
28 while (!docs.isEmpty()) {
29 Document d = docs.pop();
39 NodeList roots = d.getChildNodes();
40 for(
int i = 0; i < roots.getLength(); i++) {
41 Node n = roots.item(i);
42 if (n instanceof Element) {
43 Element e = (Element)n;
44 switch(e.getTagName()) {
61 String extid = e.getAttribute(
"extends");
63 scanLangBody(e, lc,
false);
65 private void scanLang(Element e)
throws UnknownNodeException {
66 String
id = e.getAttribute(
"id");
67 LanguageConfig lc = lang.getOrCreateLanguageConfig(
id);
68 scanLangBody(e, lc,
true);
70 private void scanLangBody(Element n, LanguageConfig lc,
boolean setParser)
throws UnknownNodeException {
71 Locale locale = Locale.getDefault();
72 var body = n.getChildNodes();
74 for(
int i = 0; i < body.getLength(); i++) {
75 Node node = body.item(i);
76 if (node.getNodeType() == Node.ELEMENT_NODE) {
77 Element e = (Element)node;
78 switch (e.getTagName()) {
83 String country = e.getAttribute(
"lang");
84 if (locale.getLanguage().equals(
new Locale(country).getLanguage())) {
89 throw new UnknownNodeException(node);
95 String parser = text.getAttribute(
"parser");
101 private void scanText(Element text, LanguageConfig lc)
throws UnknownNodeException {
102 var body = text.getChildNodes();
103 for(
int i = 0; i < body.getLength(); i++) {
104 Node node = body.item(i);
105 if (node.getNodeType() == Node.ELEMENT_NODE) {
106 Element e = (Element)node;
107 switch (e.getTagName()) {
109 lc.setLabel(e.getTextContent().trim());
112 lc.setTooltip(e.getTextContent().trim());
115 lc.setDescription(readHtmlContent(e));
130 lc.addMenuItem(e.getAttribute(
"id"), e.getAttribute(
"pid"), e.getAttribute(
"label"), e.getAttribute(
"action"), e.getTextContent().trim());
133 scanTemplates(e, lc);
136 throw new UnknownNodeException(node);
141 private void scanTemplates(Element templates, LanguageConfig lc)
throws UnknownNodeException {
142 var t = templates.getChildNodes();
143 for(
int i = 0; i < t.getLength(); i++) {
144 Node node = t.item(i);
145 if (node.getNodeType() == Node.ELEMENT_NODE) {
146 Element e = (Element)node;
147 switch (e.getTagName()) {
150 LangTemplate lt =
new LangTemplate();
151 lt.id = e.getAttribute(
"id");
152 var temp = e.getChildNodes();
153 for(
int j = 0; j < temp.getLength(); j++) {
154 Node node2 = temp.item(j);
155 if (node2.getNodeType() == Node.ELEMENT_NODE) {
156 Element ele = (Element)node2;
157 switch (ele.getTagName()) {
159 lt.label = ele.getTextContent().trim();
162 readTemplateContent(ele, lt);
165 throw new UnknownNodeException(node);
174 throw new UnknownNodeException(node);
179 private void scanSystem(Element e, LanguageConfig lc)
throws UnknownNodeException {
184 var labels = e.getChildNodes();
185 for(
int i = 0; i < labels.getLength(); i++) {
186 Node label = labels.item(i);
187 if (label.getNodeType() == Node.ELEMENT_NODE) {
188 Element lab = (Element)label;
189 switch (lab.getTagName()) {
191 lc.registerName(lab.getAttribute(
"id"), lab.getTextContent().trim());
194 throw new UnknownNodeException(lab);
200 private void scanModuleT(Element e, LanguageConfig lc)
throws UnknownNodeException {
201 LangModule lm = lc.getOrCreateLangModule(e.getAttribute(
"id"));
202 lm.javaclass = e.getAttribute(
"class");
203 var functions = e.getChildNodes();
204 for(
int i = 0; i < functions.getLength(); i++) {
205 Node
function = functions.item(i);
206 if (
function.getNodeType() == Node.ELEMENT_NODE) {
207 Element functionE = (Element)
function;
208 switch (functionE.getTagName()) {
210 lm.label = functionE.getTextContent().trim();
213 lm.tooltip = readHtmlContent(functionE);
216 lm.description = readHtmlContent(functionE);
219 scanFunction(functionE, lm, lc);
222 throw new UnknownNodeException(
function);
227 private void scanFunction(Element
function, LangModule module, LanguageConfig lc)
throws UnknownNodeException {
228 LangFunction lf = module.getOrCreateFunction(
function.getAttribute(
"id"));
229 var children =
function.getChildNodes();
230 var parameters =
function.getElementsByTagName(
"parameter");
231 for(
int i = lf.parameters.size(); i < parameters.getLength(); i++) {
232 lf.parameters.add(
new LangParameter());
234 Iterator<LangParameter> ip = lf.parameters.iterator();
235 for(
int i = 0; i < parameters.getLength(); i++) {
236 Node child = children.item(i);
237 if (child.getNodeType() == Node.ELEMENT_NODE) {
238 Element childE = (Element)child;
239 switch (childE.getTagName()) {
241 lf.label = childE.getTextContent().trim();
243 lf.tooltip = readHtmlContent(childE);
246 lf.description = readHtmlContent(childE);
249 LangParameter lp = ip.next();
250 scanParameter(childE, lp);
253 throw new UnknownNodeException(
function);
258 private void scanParameter(Element parameter, LangParameter lp)
throws UnknownNodeException {
259 lp.name = parameter.getAttribute(
"name");
260 var children = parameter.getChildNodes();
261 for(
int i = 0; i < children.getLength(); i++) {
262 Node child = children.item(i);
263 if (child.getNodeType() == Node.ELEMENT_NODE) {
264 Element childe = (Element)child;
265 switch (childe.getTagName()) {
267 lp.tooltip = readHtmlContent(childe);
270 lp.description = readHtmlContent(childe);
273 throw new UnknownNodeException(childe);
278 private void scanHelp(Element e, LanguageConfig lc)
throws UnknownNodeException {
279 LangHelp lh =
new LangHelp(e.getAttribute(
"id"));
280 lh.pid = e.getAttribute(
"parent");
283 var children = e.getChildNodes();
284 for(
int i = 0; i < children.getLength(); i++) {
285 Node child = children.item(i);
286 if (child.getNodeType() == Node.ELEMENT_NODE) {
287 Element childe = (Element)child;
288 switch (childe.getTagName()) {
290 lh.title = childe.getTextContent().trim();
293 lh.tooltip = childe.getTextContent().trim();
296 lh.description = readHtmlContent(childe);
299 lh.examples.add(childe.getAttribute(
"file"));
302 throw new UnknownNodeException(childe);
308 private void scanClassT(Element e, LanguageConfig lc)
throws UnknownNodeException {
309 LangClass langc = lc.getOrCreateLangClass(e.getAttribute(
"id"));
310 langc.description =
"";
311 langc.show = !e.getAttribute(
"show").equals(
"false");
312 if (e.getAttribute(
"scan").isBlank()) {
313 langc.scan =
new String[] {};
317 langc.scan = e.getAttribute(
"scan").split(
",");
318 for(
int i = 0; i < langc.scan.length; i++) {
319 langc.scan[i] = langc.scan[i].trim();
322 var children = e.getChildNodes();
323 for(
int i = 0; i < children.getLength(); i++) {
324 Node child = children.item(i);
325 if (child.getNodeType() == Node.ELEMENT_NODE) {
326 Element childe = (Element)child;
327 switch (childe.getTagName()) {
329 langc.label = childe.getTextContent().trim();
332 langc.tooltip = readHtmlContent(childe);
335 langc.description = readHtmlContent(childe);
338 langc.examples.add(childe.getAttribute(
"file"));
341 LangProperty lp = langc.getOrCreateProperty(childe.getAttribute(
"id"));
342 scanProperty(lp, childe);
345 LangMethod lm = langc.getOrCreateMethod(childe.getAttribute(
"id"));
346 scanMethod(lm, childe);
349 throw new UnknownNodeException(childe);
354 private void scanProperty(LangProperty lp, Element e)
throws UnknownNodeException {
355 lp.scan = e.getAttribute(
"scan");
356 assert(!lp.scan.isEmpty());
357 var children = e.getChildNodes();
358 for(
int i = 0; i < children.getLength(); i++) {
359 Node child = children.item(i);
360 if (child.getNodeType() == Node.ELEMENT_NODE) {
361 Element childe = (Element)child;
362 switch (childe.getTagName()) {
364 lp.label = childe.getTextContent().trim();
367 lp.tooltip = readHtmlContent(childe);
370 lp.description = readHtmlContent(childe);
373 throw new UnknownNodeException(childe);
378 private void scanMethod(LangMethod lm, Element e)
throws UnknownNodeException {
379 lm.scan = e.getAttribute(
"scan");
380 assert(!lm.scan.isEmpty());
381 var parameters = e.getElementsByTagName(
"parameter");
382 for(
int i= lm.parameters.size(); i < parameters.getLength(); i++) {
383 lm.parameters.add(
new LangParameter());
385 Iterator<LangParameter> ip = lm.parameters.iterator();
387 var children = e.getChildNodes();
388 for(
int i = 0; i < children.getLength(); i++) {
389 Node child = children.item(i);
390 if (child.getNodeType() == Node.ELEMENT_NODE) {
391 Element childe = (Element)child;
392 switch (childe.getTagName()) {
394 lm.label = childe.getTextContent().trim();
397 lm.tooltip = readHtmlContent(childe);
400 lm.description = readHtmlContent(childe);
403 LangParameter lp = ip.next();
404 scanParameter(childe, lp);
407 throw new UnknownNodeException(childe);
412 private void scanTypes(Element e)
throws UnknownNodeException {
414 var children = e.getChildNodes();
415 for(
int i = 0; i < children.getLength(); i++) {
416 Node child = children.item(i);
417 if (child.getNodeType() == Node.ELEMENT_NODE) {
418 Element childe = (Element)child;
419 switch (childe.getTagName()) {
427 throw new UnknownNodeException(childe);
434 private void scanModule(Element mod)
throws UnknownNodeException {
435 String javaclass = mod.getAttribute(
"class");
436 String
id = mod.getAttribute(
"id");
437 lang.registerModule(
id, javaclass);
438 var children = mod.getChildNodes();
439 for(
int i = 0; i < children.getLength(); i++) {
440 Node child = children.item(i);
441 if (child.getNodeType() == Node.ELEMENT_NODE) {
442 Element childe = (Element)child;
443 switch (childe.getTagName()) {
445 String f_id = childe.getAttribute(
"id");
446 String f_javamethod = childe.getAttribute(
"name");
447 String f_return = childe.getAttribute(
"return");
448 LinkedList<String> f_parameters =
new LinkedList<>();
449 var parameters = childe.getChildNodes();
450 for(
int j = 0; j < parameters.getLength(); j++) {
451 Node parameter = parameters.item(j);
452 if (parameter.getNodeType() == Node.ELEMENT_NODE) {
453 Element parae = (Element)parameter;
454 switch (parae.getTagName()) {
456 f_parameters.add(parae.getAttribute(
"type"));
459 throw new UnknownNodeException(childe);
463 lang.registerGlobalFunction(
id, f_id, f_javamethod, f_parameters, f_return);
466 throw new UnknownNodeException(childe);
472 private void scanClass(Element cls)
throws UnknownNodeException {
473 String javaclass = cls.getAttribute(
"class");
474 String
id = cls.getAttribute(
"id");
475 String pid = cls.getAttribute(
"super");
476 lang.registerClass(
id, pid, javaclass);
477 var children = cls.getChildNodes();
478 for(
int i = 0; i < children.getLength(); i++) {
479 Node child = children.item(i);
480 if (child.getNodeType() == Node.ELEMENT_NODE) {
481 Element childe = (Element)child;
482 switch (childe.getTagName()) {
484 String p_id = childe.getAttribute(
"id");
485 String p_type = childe.getAttribute(
"type");
486 String getter = childe.getAttribute(
"getter");
487 String setter = childe.getAttribute(
"setter");
488 String view = childe.getAttribute(
"view");
489 if (view.isEmpty()) {
492 lang.registerProperty(
id, p_id, p_type, getter, setter, view);
495 String m_id = childe.getAttribute(
"id");
496 String m_javamethod = childe.getAttribute(
"name");
497 String m_return = childe.getAttribute(
"return");
498 LinkedList<String> m_parameters =
new LinkedList<>();
499 var parameters = childe.getChildNodes();
500 for(
int j = 0; j < parameters.getLength(); j++) {
501 Node parameter = parameters.item(j);
502 if (parameter.getNodeType() == Node.ELEMENT_NODE) {
503 Element parae = (Element)parameter;
504 switch (parae.getTagName()) {
506 m_parameters.add(parae.getAttribute(
"type"));
509 throw new UnknownNodeException(childe);
513 lang.registerMethod(
id, m_id, m_javamethod, m_parameters, m_return);
516 throw new UnknownNodeException(childe);
521 private String readHtmlContent(Element e) {
522 StringBuilder text =
new StringBuilder();
523 var children = e.getChildNodes();
524 for(
int i = 0; i < children.getLength(); i++) {
525 Node child = children.item(i);
526 if (child.getNodeType() == Node.ELEMENT_NODE) {
527 Element childe = (Element)child;
528 switch (childe.getTagName()) {
530 text.append(
" ");
533 text.append(
" ");
536 if (childe.getTextContent().isEmpty()) {
537 text.append(
"<"+childe.getTagName()+
"/>");
539 text.append(
"<"+childe.getTagName()+
">");
540 text.append(childe.getTextContent());
541 text.append(
"</"+childe.getTagName()+
">");
545 text.append(child.getTextContent());
548 String html = text.toString();
549 html = html.replaceAll(
"\u00B1",
"±");
550 html = html.replaceAll(
"Ü",
"Ü");
551 html = html.replaceAll(
"ü",
"ü");
552 html = html.replaceAll(
"Ä",
"Ä");
553 html = html.replaceAll(
"ä",
"ä");
554 html = html.replaceAll(
"Ö",
"Ö");
555 html = html.replaceAll(
"ö",
"ö");
556 html = html.replaceAll(
"ß",
"ß");
559 private void readTemplateContent(Element e, LangTemplate lt) {
560 var children = e.getChildNodes();
561 boolean newline =
true;
564 StringBuilder text =
new StringBuilder();
565 for(
int i = 0; i < children.getLength(); i++) {
566 Node child = children.item(i);
567 if (child.getNodeType() == Node.ELEMENT_NODE) {
568 Element childe = (Element)child;
569 switch (childe.getTagName()) {
575 lt.start = text.length();
576 text.append(childe.getTextContent());
577 lt.length = text.length() - lt.start;
590 text.append(getPackedContent(child).replaceAll(
"^\\s+",
""));
592 text.append(getPackedContent(child));
596 lt.template = text.toString().replaceAll(
"\\s+$",
"");
598 private static String getPackedContent(Node element) {
599 if (element !=
null) {
600 String text = element.getTextContent();
602 return text.replaceAll(
"\\s+",
" ");
LangXMLScanner(Language lang)
String getLocalizedMessage()