database.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import { type_manager } from "./functions.js";
  2. import { project } from "./project.js";
  3. import { element } from "./element.js";
  4. import { element_builder } from "./element_builder.js";
  5. import { elements_list } from "./elements_list.js";
  6. import { submission } from "./submission.js";
  7. import { submissions_list } from "./submissions_list.js";
  8. import { parser } from "./parser.js";
  9. class database {
  10. #project;
  11. #submissions;
  12. #parse_element(name, content) {
  13. const builder = new element_builder();
  14. builder.name = name;
  15. builder.description = "";
  16. if (content.exists("description")) {
  17. builder.description = content.get("description");
  18. }
  19. const adder = (property, how) => {
  20. if (!content.exists(property)) {
  21. return;
  22. }
  23. const list = content.get(property);
  24. if (!type_manager.is_array(list)) {
  25. throw "Property " + property + " of " + name + " not array.";
  26. }
  27. list.forEach((item) => how(item));
  28. }
  29. adder("pictures", (target) => builder.add_picture(target));
  30. adder("order", (target) => builder.add_order(target));
  31. adder("meshes", (target) => builder.add_mesh(target));
  32. adder("solids", (target) => builder.add_solid(target));
  33. return builder.result;
  34. }
  35. #parse_elements(content) {
  36. const list = new elements_list();
  37. content.properties.forEach(name => {
  38. const loader = content.get_parser(name);
  39. list.append(this.#parse_element(name, loader));
  40. });
  41. return list;
  42. }
  43. #parse_submissions(content) {
  44. const list = new submissions_list();
  45. content.properties.forEach(title => {
  46. const loader = content.get_parser(title);
  47. const description = loader.get("description");
  48. const picture = loader.get("picture");
  49. const elements_parser = loader.get_parser("elements");
  50. const elements = this.#parse_elements(elements_parser);
  51. const result = new submission(
  52. title,
  53. description,
  54. picture,
  55. elements
  56. );
  57. list.append(result);
  58. });
  59. return list;
  60. }
  61. #load(content) {
  62. const loader = new parser(content, "root");
  63. const project = loader.get_parser("project");
  64. const submissions = loader.get_parser("submissions");
  65. this.#project = this.#parse_project(project);
  66. this.#submissions = this.#parse_submissions(submissions);
  67. }
  68. #parse_project(content) {
  69. const name = content.get("name");
  70. let description = "";
  71. if (content.exists("description")) {
  72. description = content.get("description");
  73. }
  74. return new project(name, description);
  75. }
  76. get project() {
  77. return this.#project;
  78. }
  79. get submissions() {
  80. return this.#submissions;
  81. }
  82. constructor(content) {
  83. if (!(content instanceof Object)) {
  84. throw "Content to into database from must be an object.";
  85. }
  86. this.#load(content);
  87. }
  88. }
  89. export { database };