fileFormatConverter.js 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. // this module converts JSON data into XML or YAML
  2. const jsl = require("svjsl");
  3. const jsonToYaml = require("json-to-pretty-yaml");
  4. const jsonToXml = require("js2xmlparser");
  5. const languages = require("./languages");
  6. const tr = require("./translate");
  7. const systemLangs = tr.systemLangs;
  8. const settings = require("../settings");
  9. /**
  10. * Converts a JSON object to a string representation of a XML, YAML, plain text or JSON (as fallback) object - based on a passed format string
  11. * @param {("xml"|"yaml"|"json"|"txt")} format Can be "xml", "yaml" or "txt", everything else will default to JSON
  12. * @param {Object} jsonInput
  13. * @param {String} [lang] Needed for converting to "txt"
  14. * @returns {String} String representation of the converted object
  15. */
  16. const auto = (format, jsonInput, lang) => {
  17. format = format.toLowerCase();
  18. switch(format)
  19. {
  20. case "yaml":
  21. return toYAML(jsonInput);
  22. case "xml":
  23. return toXML(jsonInput);
  24. case "txt":
  25. return toTXT(jsonInput, lang);
  26. case "json":
  27. default:
  28. return JSON.stringify(jsonInput, null, 4);
  29. }
  30. };
  31. const toYAML = jsonInput => {
  32. if(jsl.isEmpty(jsonInput))
  33. return jsonToYaml.stringify({});
  34. return jsonToYaml.stringify(jsonInput);
  35. };
  36. const toXML = jsonInput => {
  37. if(jsl.isEmpty(jsonInput))
  38. return jsonToXml.parse("data", {});
  39. return jsonToXml.parse("data", jsonInput);
  40. };
  41. /**
  42. * Converts a JSON object to plain text, according to the set conversion mapping
  43. * @param {Object} jsonInput
  44. * @param {String} lang
  45. */
  46. const toTXT = (jsonInput, lang) => {
  47. let returnText = tr(lang, "noConversionMapping", Object.keys(jsonInput).join(", "), "ERR_NO_CONV_MAPPING @ FFCONV");
  48. if(!jsonInput)
  49. returnText = tr(lang, "cantConvertToPlainText", "ERR_NO_JSON_INPUT @ FFCONV");
  50. if(jsonInput)
  51. {
  52. if(jsonInput.error === true)
  53. {
  54. if(jsonInput.internalError)
  55. returnText = tr(lang, "conversionInternalError", (jsonInput.code || 100), jsonInput.message, jsonInput.causedBy.join("\n- "), (jsonInput.additionalInfo ? jsonInput.additionalInfo : "X"));
  56. else
  57. returnText = tr(lang, "conversionGeneralError", (jsonInput.code || 100), jsonInput.message, jsonInput.causedBy.join("\n- "), (jsonInput.additionalInfo ? jsonInput.additionalInfo : "X"));
  58. }
  59. else
  60. {
  61. let categoryAliases = [];
  62. if((jsonInput.joke || (jsonInput.jokes && Array.isArray(jsonInput.jokes))) || (jsonInput.setup && jsonInput.delivery)) // endpoint: /joke
  63. {
  64. if(jsonInput.type == "single")
  65. returnText = jsonInput.joke;
  66. else if(jsonInput.type == "twopart")
  67. returnText = `${jsonInput.setup}\n\n${jsonInput.delivery}`;
  68. else if(jsonInput.type === undefined) // amount >= 2
  69. {
  70. returnText = "";
  71. jsonInput.jokes.forEach((joke, i) => {
  72. if(i != 0)
  73. returnText += "\n\n----------------------------------------------\n\n";
  74. if(joke.type == "single")
  75. returnText += joke.joke;
  76. else if(joke.type == "twopart")
  77. returnText += `${joke.setup}\n\n${joke.delivery}`;
  78. });
  79. }
  80. }
  81. else if(jsonInput.categories) // endpoint: /categories
  82. {
  83. jsonInput.categoryAliases.forEach(alias => {
  84. categoryAliases.push(`- ${alias.alias} -> ${alias.resolved}`);
  85. });
  86. returnText = tr(lang, "availableCategories", jsonInput.categories.map(c => `- ${c}`).join("\n"), categoryAliases.join("\n"));
  87. }
  88. else if(jsonInput.flags) // endpoint: /flags
  89. returnText = tr(lang, "availableFlags", jsonInput.flags.join('", "'));
  90. else if(jsonInput.ping) // endpoint: /ping
  91. returnText = `${jsonInput.ping}\n${tr(lang, "timestamp", jsonInput.timestamp)}`;
  92. else if(jsonInput.code) // endpoint: /langcode
  93. returnText = `${jsonInput.error ? tr(lang, "genericError", jsonInput.message) : tr(lang, "languageCode", jsonInput.code)}`;
  94. else if(jsonInput.defaultLanguage) // endpoint: /languages
  95. {
  96. let suppLangs = [];
  97. languages.jokeLangs().forEach(lang => {
  98. suppLangs.push(`${lang.name} [${lang.code}]`);
  99. });
  100. let sysLangs = systemLangs().map(lc => `${languages.codeToLanguage(lc)} [${lc}]`);
  101. let possLangs = [];
  102. jsonInput.possibleLanguages.forEach(pl => {
  103. possLangs.push(`${pl.name} [${pl.code}]`);
  104. });
  105. returnText = tr(lang, "languagesEndpoint", languages.codeToLanguage(jsonInput.defaultLanguage), jsonInput.defaultLanguage, languages.jokeLangs().length, suppLangs.sort().join(", "), sysLangs.length, sysLangs.sort().join(", "), possLangs.sort().join("\n"));
  106. }
  107. else if(jsonInput.version) // endpoint: /info
  108. {
  109. let suppLangs = [];
  110. languages.jokeLangs().forEach(lang => {
  111. suppLangs.push(`${lang.name} [${lang.code}]`);
  112. });
  113. let sysLangs = systemLangs().map(lc => `${languages.codeToLanguage(lc)} [${lc}]`);
  114. let idRanges = [];
  115. Object.keys(jsonInput.jokes.idRange).forEach(lc => {
  116. let lcIr = jsonInput.jokes.idRange[lc];
  117. idRanges.push(`${languages.codeToLanguage(lc)} [${lc}]: ${lcIr[0]}-${lcIr[1]}`);
  118. });
  119. let safeJokesAmounts = [];
  120. jsonInput.jokes.safeJokes.forEach(safeJokesObj => {
  121. safeJokesAmounts.push(`${languages.codeToLanguage(safeJokesObj.lang)} [${safeJokesObj.lang}]: ${safeJokesObj.count}`);
  122. });
  123. returnText = tr(lang, "infoEndpoint",
  124. settings.info.name, jsonInput.version, jsonInput.jokes.totalCount, jsonInput.jokes.categories.join(`", "`), jsonInput.jokes.flags.join('", "'),
  125. jsonInput.formats.join('", "'), jsonInput.jokes.types.join('", "'), jsonInput.jokes.submissionURL, idRanges.join("\n"), languages.jokeLangs().length,
  126. suppLangs.sort().join(", "), sysLangs.length, sysLangs.sort().join(", "), safeJokesAmounts.join("\n"), jsonInput.info
  127. );
  128. }
  129. else if(jsonInput.formats) // endpoint: /formats
  130. returnText = tr(lang, "availableFormats", `"${jsonInput.formats.join('", "')}"`);
  131. else if(Array.isArray(jsonInput) && jsonInput[0].usage && jsonInput[0].usage.method) // endpoint: /endpoints
  132. {
  133. returnText = `${tr(lang, "endpointsWord")}:\n\n\n`;
  134. jsonInput.forEach(ep => {
  135. returnText += `${tr(lang, "endpointDetails", ep.name, ep.description, ep.usage.method, ep.usage.url, (ep.usage.supportedParams.length > 0 ? `"${ep.usage.supportedParams.join('", "')}"` : "X"))}\n\n`;
  136. });
  137. }
  138. }
  139. }
  140. return returnText;
  141. };
  142. module.exports = { auto, toYAML, toXML, toTXT };