Advertisement
Guest User

Untitled

a guest
Feb 23rd, 2020
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var types = [];
  2. var interfaces = [];
  3. var methods = [];
  4.  
  5. var typeMapping = {
  6.     'Boolean': 'bool',
  7.     'True': 'bool',
  8.     'Integer': 'int',
  9.     'Integer64': 'int64',
  10.     'Float': 'float64',
  11.     'String': 'string',
  12. };
  13.  
  14. var typeRewrites = {
  15.     'LoginUrl': 'LoginURL',
  16. }
  17.  
  18. function typePostProcess(str) {
  19.     if (typeRewrites.hasOwnProperty(str)) {
  20.         return typeRewrites[str];
  21.     }
  22.  
  23.     return str;
  24. }
  25.  
  26. function underBarToUpperCamel(str) {
  27.     return str.split('_').map(function (s) {
  28.         if (s === 'id') {
  29.             return 'ID';
  30.         }
  31.  
  32.         if (s === 'url') {
  33.             return 'URL';
  34.         }
  35.  
  36.         return s.charAt(0).toUpperCase() + s.slice(1)
  37.     }).join('');
  38. }
  39.  
  40. function underbarToCamel(str) {
  41.     var res = underBarToUpperCamel(str);
  42.  
  43.     return res.charAt(0).toLowerCase() + res.slice(1);
  44. }
  45.  
  46. function resolveType(type, description) {
  47.     if (type.includes('InlineKeyboardMarkup')) {
  48.         return '*ReplyMarkup';
  49.     }
  50.  
  51.     if (type.includes('InputFile')) {
  52.         return '*InputFile';
  53.     }
  54.  
  55.     if (type.includes('Float')) {
  56.         return 'float64';
  57.     }
  58.  
  59.     if (description.includes('64 bit integer')) {
  60.         type = 'Integer64';
  61.     }
  62.  
  63.     if (type.includes('Array of Array of')) {
  64.         var arrayType = /Array of Array of (.+)/.exec(type)[1];
  65.         if (typeMapping.hasOwnProperty(arrayType)) {
  66.             return '[][]' + typeMapping[arrayType];
  67.         }
  68.  
  69.         return '[][]*' + typePostProcess(arrayType);
  70.     }
  71.  
  72.     if (type.includes('Array of ')) {
  73.         var arrayType = /Array of (.+)/.exec(type)[1];
  74.         if (typeMapping.hasOwnProperty(arrayType)) {
  75.             return '[]' + typeMapping[arrayType];
  76.         }
  77.  
  78.         return '[]*' + typePostProcess(arrayType);
  79.     }
  80.  
  81.     if (typeMapping.hasOwnProperty(type)) {
  82.         return typeMapping[type];
  83.     }
  84.  
  85.     return '*' + typePostProcess(type);
  86. }
  87.  
  88. function handleMethod(elem) {
  89.     var elems = elem.nextUntil('h3, h4');
  90.     var rows = elems.filter('table').find('tbody tr');
  91.     var name = elem.text();
  92.     var params = [];
  93.  
  94.     for (var i = 0; i < rows.length; i++) {
  95.         var row = $(rows[i]);
  96.         var cols = $(row.find('td'));
  97.         var param = $(cols[0]).text();
  98.         var type = $(cols[1]).text();
  99.         type = resolveType(type, '');
  100.  
  101.         params.push({
  102.             name: underbarToCamel(param),
  103.             json: param,
  104.             type: type,
  105.         });
  106.     }
  107.  
  108.     methods.push({
  109.         name: name,
  110.         params: params,
  111.     });
  112. }
  113.  
  114. function handleConcreteType(elem, rows) {
  115.     var name = typePostProcess(elem.text());
  116.     var typeDesc = elem.next('p').text();
  117.     var fields = [];
  118.  
  119.     for (var i = 0; i < rows.length; i++) {
  120.         var row = $(rows[i]);
  121.         var cols = $(row.find('td'));
  122.         var field = $(cols[0]).text();
  123.         var type = $(cols[1]).text();
  124.         var description = $(cols[2]).text();
  125.         type = resolveType(type, description);
  126.  
  127.         fields.push({
  128.             name: typePostProcess(underBarToUpperCamel(field)),
  129.             json: field,
  130.             type: type,
  131.         });
  132.     }
  133.  
  134.     types.push({
  135.         name: name,
  136.         description: typeDesc,
  137.         fields: fields,
  138.         interface: '',
  139.     });
  140. }
  141.  
  142. function handleInterface(elem, list) {
  143.     var name = typePostProcess(elem.text());
  144.     var iterfaceDesc = elem.next('p').text();
  145.     var interfaceTypes = [];
  146.  
  147.     for (var i = 0; i < list.length; i++) {
  148.         var item = $(list[i]);
  149.         var type = item.text();
  150.  
  151.         interfaceTypes.push({
  152.             name: typePostProcess(type),
  153.         });
  154.     }
  155.  
  156.     interfaces.push({
  157.         name: name,
  158.         description: iterfaceDesc,
  159.         types: interfaceTypes,
  160.     });
  161. }
  162.  
  163. function handleType(elem) {
  164.     var elems = elem.nextUntil('h3, h4');
  165.     var list = elems.filter('ul').find('li');
  166.     var rows = elems.filter('table').find('tbody tr');
  167.     if (list.length > 0) {
  168.         handleInterface(elem, list);
  169.     } else {
  170.         handleConcreteType(elem, rows);
  171.     }
  172. }
  173.  
  174. // Collect types, interfaces and methods
  175.  
  176. var headers = $('.anchor').parent().filter('h4');
  177.  
  178. interfaces.push({
  179.     name: 'ReplyMarkup',
  180.     description: 'This object represents reply markup.',
  181.     types: [],
  182. });
  183.  
  184. for (var i = 0; i < headers.length; i++) {
  185.     var header = $(headers[i]);
  186.     var headerText = header.text();
  187.     if (headerText.length === 0 || headerText.includes(" ")) {
  188.         continue;
  189.     }
  190.  
  191.     if (headerText[0] === headerText[0].toUpperCase()) {
  192.         handleType(header);
  193.     } else {
  194.         handleMethod(header);
  195.     }
  196. }
  197.  
  198. // Set type interfaces
  199.  
  200. for (var i = 0; i < types.length; i++) {
  201.     var type = types[i];
  202.     for (var j = 0; j < interfaces.length; j++) {
  203.         var interface = interfaces[j];
  204.         var stop = false;
  205.         for (var subtype of interface.types) {
  206.             if (type.name === subtype.name) {
  207.                 types[i].interface = interface.name;
  208.                 stop = true;
  209.                 break;
  210.             }
  211.         }
  212.  
  213.         if (stop) {
  214.             break;
  215.         }
  216.     }
  217. }
  218.  
  219. var schema = {
  220.     types: types,
  221.     interfaces: interfaces,
  222.     methods: methods,
  223. }
  224.  
  225. var interfaceLines = [];
  226.  
  227. for (const interface of interfaces) {
  228.     interfaceLines.push('// ' + interface.name + ' - ' + type.description + "\n");
  229.     interfaceLines.push('type ' + interface.name + ' interface {' + "\n");
  230.     interfaceLines.push('   ' + interface.name + '()' + "\n");
  231.     interfaceLines.push('}' + "\n\n");
  232. }
  233.  
  234. var typeLines = [];
  235.  
  236. for (const type of types) {
  237.     typeLines.push('// ' + type.name + ' - ' + type.description + "\n");
  238.     typeLines.push('type ' + type.name + ' struct {' + "\n");
  239.     for (const field of type.fields) {
  240.         typeLines.push('    ' + field.name + ' ' + field.type + ' `json:"' + field.json + '"`' + "\n");
  241.     }
  242.     typeLines.push('}' + "\n\n");
  243. }
  244.  
  245. var golangCode = interfaceLines.join('') + typeLines.join('');
  246.  
  247. console.log(golangCode);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement