diff --git a/src/build/FreeDatas2HTML.js b/src/build/FreeDatas2HTML.js new file mode 100644 index 0000000..9c42dc9 --- /dev/null +++ b/src/build/FreeDatas2HTML.js @@ -0,0 +1,291 @@ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +var compare = require("natural-orderby").compare; +var errors = require("./errors.js"); +import { ParserForCSV } from "./ParserForCSV"; +import { ParserForHTML } from "./ParserForHTML"; +import { ParserForJSON } from "./ParserForJSON"; +import { Render } from "./Render"; +var FreeDatas2HTML = (function () { + function FreeDatas2HTML(datasFormat, datas2Parse, datasRemoteSource) { + if (datas2Parse === void 0) { datas2Parse = ""; } + this._datasViewElt = undefined; + this.stopIfParseErrors = false; + this._datasCounterElt = undefined; + this._datasSortingFunctions = []; + this._fields2Rend = []; + this.datasFilters = []; + this.datasSortingFields = []; + this._fields = []; + this._datas = []; + this._datas2Rend = []; + this._nbDatasValid = 0; + this.datasRender = new Render(); + switch (datasFormat) { + case "CSV": + this.parser = new ParserForCSV(); + break; + case "HTML": + this.parser = new ParserForHTML(); + break; + case "JSON": + this.parser = new ParserForJSON(); + break; + } + if (datas2Parse.trim() !== "") + this.parser.datas2Parse = datas2Parse.trim(); + else if (datasRemoteSource !== undefined) + this.parser.setRemoteSource(datasRemoteSource); + } + FreeDatas2HTML.checkInDOMById = function (checkedElt) { + var searchEltInDOM = document.getElementById(checkedElt.id); + if (searchEltInDOM === null) + throw new Error(errors.converterElementNotFound + checkedElt.id); + else { + checkedElt.eltDOM = searchEltInDOM; + return checkedElt; + } + }; + Object.defineProperty(FreeDatas2HTML.prototype, "datasViewElt", { + set: function (elt) { + this._datasViewElt = FreeDatas2HTML.checkInDOMById(elt); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FreeDatas2HTML.prototype, "datasCounterElt", { + set: function (counterDisplayElement) { + this._datasCounterElt = FreeDatas2HTML.checkInDOMById(counterDisplayElement); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FreeDatas2HTML.prototype, "datas", { + get: function () { + return this._datas; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FreeDatas2HTML.prototype, "fields", { + get: function () { + return this._fields; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FreeDatas2HTML.prototype, "datas2Rend", { + get: function () { + return this._datas2Rend; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FreeDatas2HTML.prototype, "nbDatasValid", { + get: function () { + return this._nbDatasValid; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(FreeDatas2HTML.prototype, "fields2Rend", { + get: function () { + return this._fields2Rend; + }, + set: function (fields) { + if (fields.length === 0) + this._fields2Rend = fields; + else { + for (var _i = 0, fields_1 = fields; _i < fields_1.length; _i++) { + var field = fields_1[_i]; + if (!this.checkFieldExist(field)) + throw new Error(errors.converterFieldNotFound); + else + this._fields2Rend.push(field); + } + } + }, + enumerable: true, + configurable: true + }); + FreeDatas2HTML.prototype.checkFieldExist = function (nb) { + if (this.parser.parseResults === undefined || this.parser.parseResults.fields[nb] === undefined) + return false; + else + return true; + }; + FreeDatas2HTML.prototype.realFields2Rend = function () { + if (this._fields2Rend.length === 0) + return this._fields; + else { + var realFields = []; + for (var i = 0; i < this._fields.length; i++) { + if (this._fields2Rend.indexOf(i) !== -1) + realFields.push(this._fields[i]); + } + return realFields; + } + }; + FreeDatas2HTML.prototype.checkField2Rend = function (nb) { + if (this.realFields2Rend()[nb] === undefined) + return false; + else + return true; + }; + Object.defineProperty(FreeDatas2HTML.prototype, "datasSortingFunctions", { + set: function (SortingFunctions) { + this._datasSortingFunctions = []; + for (var _i = 0, SortingFunctions_1 = SortingFunctions; _i < SortingFunctions_1.length; _i++) { + var checkedFunction = SortingFunctions_1[_i]; + if (!this.checkFieldExist(checkedFunction.datasFieldNb)) + throw new Error(errors.converterFieldNotFound); + else + this._datasSortingFunctions.push(checkedFunction); + } + }, + enumerable: true, + configurable: true + }); + FreeDatas2HTML.prototype.getSortingFunctionForField = function (datasFieldNb) { + for (var _i = 0, _a = this._datasSortingFunctions; _i < _a.length; _i++) { + var checkedFunction = _a[_i]; + if (checkedFunction.datasFieldNb === datasFieldNb) + return checkedFunction; + } + return undefined; + }; + FreeDatas2HTML.prototype.run = function () { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4, this.parser.parse()]; + case 1: + _a.sent(); + if (this.parser.parseResults === undefined) + throw new Error(errors.parserFail); + else { + if (this.stopIfParseErrors && this.parser.parseResults.errors !== undefined) + throw new Error(errors.parserMeetErrors); + else { + this._fields = this.parser.parseResults.fields; + this._datas = this.parser.parseResults.datas; + if (this._fields2Rend.length === 0) + this.datasRender.fields = this._fields; + else + this.datasRender.fields = this.realFields2Rend(); + if (this._datasViewElt !== undefined) + this.refreshView(); + return [2, true]; + } + } + return [2]; + } + }); + }); + }; + FreeDatas2HTML.prototype.refreshView = function () { + if (this._fields.length === 0 || this._datasViewElt === undefined) + throw new Error(errors.converterRefreshFail); + else { + this._datas2Rend = this.datas2HTML(); + this.datasRender.datas = this._datas2Rend; + this._datasViewElt.eltDOM.innerHTML = this.datasRender.rend2HTML(); + if (this._datasCounterElt !== undefined) + this._datasCounterElt.eltDOM.innerHTML = "" + this._nbDatasValid; + for (var _i = 0, _a = this.datasSortingFields; _i < _a.length; _i++) { + var field = _a[_i]; + field.field2HTML(); + } + if (this.pagination !== undefined) + this.pagination.pages2HTML(); + } + }; + FreeDatas2HTML.prototype.datas2HTML = function () { + if (this.datasSortedField !== undefined) { + var field_1 = this._fields[this.datasSortedField.datasFieldNb]; + var fieldOrder_1 = this.datasSortedField.order; + if (this.getSortingFunctionForField(this.datasSortedField.datasFieldNb) !== undefined) { + var myFunction_1 = this.getSortingFunctionForField(this.datasSortedField.datasFieldNb); + this._datas.sort(function (a, b) { return myFunction_1.sort(a[field_1], b[field_1], fieldOrder_1); }); + } + else + this._datas.sort(function (a, b) { return compare({ order: fieldOrder_1 })(a[field_1], b[field_1]); }); + } + var firstData = 0; + if (this.pagination !== undefined && this.pagination.selectedValue !== undefined && this.pagination.pages !== undefined && this.pagination.pages.selectedValue !== undefined) + firstData = this.pagination.selectedValue * (this.pagination.pages.selectedValue - 1); + var maxData = (this.pagination !== undefined && this.pagination.selectedValue !== undefined) ? this.pagination.selectedValue : this._datas.length; + var datas2Display = []; + var nbVisible = 0, nbTotal = 0; + for (var row in this._datas) { + var valid = true, i = 0; + while (this.datasFilters[i] !== undefined && valid === true) { + valid = this.datasFilters[i].dataIsOk(this._datas[row]); + i++; + } + if (valid && nbTotal >= firstData && nbVisible < maxData) { + datas2Display.push(this._datas[row]); + nbVisible++; + nbTotal++; + } + else if (valid) + nbTotal++; + } + this._nbDatasValid = nbTotal; + if (this._fields2Rend.length !== 0) { + var newDatas2Display = []; + for (var row in datas2Display) { + var i = 0, newData = {}; + for (var field in datas2Display[row]) { + if (this._fields2Rend.indexOf(i) !== -1) + newData[field] = datas2Display[row][field]; + i++; + } + newDatas2Display.push(newData); + } + datas2Display = newDatas2Display; + } + return datas2Display; + }; + return FreeDatas2HTML; +}()); +export { FreeDatas2HTML }; +export { Pagination } from "./Pagination"; +export { Render } from "./Render"; +export { SearchEngine } from "./SearchEngine"; +export { Selector } from "./Selector"; +export { SortingField } from "./SortingField"; diff --git a/src/build/Pagination.js b/src/build/Pagination.js new file mode 100644 index 0000000..8c268be --- /dev/null +++ b/src/build/Pagination.js @@ -0,0 +1,114 @@ +var errors = require("./errors.js"); +import { FreeDatas2HTML } from "./FreeDatas2HTML"; +var Pagination = (function () { + function Pagination(converter, pagesElt, pagesName) { + if (pagesName === void 0) { pagesName = "Pages"; } + if (converter.fields.length === 0) + throw new Error(errors.paginationNeedDatas); + else { + this._pages = { displayElement: FreeDatas2HTML.checkInDOMById(pagesElt), name: pagesName }; + this._converter = converter; + } + } + Pagination.isPositiveInteger = function (nb) { + return (Number.isInteger(nb) === false || nb <= 0) ? false : true; + }; + Object.defineProperty(Pagination.prototype, "selectedValue", { + get: function () { + return this._selectedValue; + }, + set: function (value) { + if (value !== undefined) { + if (!Pagination.isPositiveInteger(value)) + throw new Error(errors.needPositiveInteger); + if (this.options !== undefined && this.options.values.indexOf(value) === -1) + throw new Error(errors.paginationNeedByfaultValueBeInOptions); + } + this._selectedValue = value; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Pagination.prototype, "options", { + get: function () { + return this._options; + }, + set: function (options) { + if (options !== undefined) { + options.displayElement = FreeDatas2HTML.checkInDOMById(options.displayElement); + var realValues = []; + for (var _i = 0, _a = options.values; _i < _a.length; _i++) { + var option = _a[_i]; + if (!Pagination.isPositiveInteger(option)) + throw new Error(errors.needPositiveInteger); + if (realValues.indexOf(option) === -1) + realValues.push(option); + else + console.log(errors.paginationOptionsDuplicatedValues); + } + if (realValues.length < 2) + throw new Error(errors.paginationNeedOptionsValues); + options.values = realValues; + if (this.selectedValue !== undefined && options.values.indexOf(this.selectedValue) === -1) + throw new Error(errors.paginationNeedByfaultValueBeInOptions); + options.name = (options.name === undefined) ? "Pagination" : options.name; + } + this._options = options; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Pagination.prototype, "pages", { + get: function () { + return this._pages; + }, + enumerable: true, + configurable: true + }); + Pagination.prototype.options2HTML = function () { + if (this._options === undefined) + throw new Error(errors.pagination2HTMLFail); + else { + var selectorsHTML = ""; + this._options.displayElement.eltDOM.innerHTML = selectorsHTML; + var selectElement_1 = document.getElementById("freeDatas2HTMLPaginationSelector"); + if (this._selectedValue !== undefined) + selectElement_1.value = "" + (this._options.values.indexOf(this._selectedValue) + 1); + var pagination_1 = this; + selectElement_1.addEventListener("change", function (e) { + if (selectElement_1.value === "0") + pagination_1._selectedValue = undefined; + else + pagination_1._selectedValue = pagination_1._options.values[Number(selectElement_1.value) - 1]; + pagination_1._converter.refreshView(); + }); + } + }; + Pagination.prototype.pages2HTML = function () { + if (this._selectedValue === undefined || this._converter.nbDatasValid <= this._selectedValue) + this.pages.displayElement.eltDOM.innerHTML = ""; + else { + var nbPages = Math.ceil(this._converter.nbDatasValid / this._selectedValue); + var selectorsHTML = ""; + this.pages.displayElement.eltDOM.innerHTML = selectorsHTML; + var selectElement_2 = document.getElementById("freeDatas2HTMLPagesSelector"); + this.pages.selectedValue = 1; + var pagination_2 = this; + selectElement_2.addEventListener("change", function (e) { + pagination_2.pages.selectedValue = Number(selectElement_2.value); + pagination_2._converter.refreshView(); + }); + } + }; + return Pagination; +}()); +export { Pagination }; diff --git a/src/build/ParserForCSV.js b/src/build/ParserForCSV.js new file mode 100644 index 0000000..3d72232 --- /dev/null +++ b/src/build/ParserForCSV.js @@ -0,0 +1,172 @@ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +var Papa = require("papaparse"); +var errors = require("./errors.js"); +import { RemoteSource } from "./RemoteSource"; +var ParserForCSV = (function () { + function ParserForCSV(datasRemoteSource) { + this._datas2Parse = ""; + this._parseResults = undefined; + this.options = { + delimiter: "", + newline: "", + quoteChar: '"', + escapeChar: '"', + transformHeader: function (field, index) { return field.trim(); }, + preview: 0, + comments: "", + fastMode: undefined, + transform: undefined + }; + this._privateOptions = { + header: true, + download: false, + downloadRequestHeaders: undefined, + skipEmptyLines: "greedy", + withCredentials: undefined + }; + if (datasRemoteSource !== undefined) + this._datasRemoteSource = datasRemoteSource; + else + this._datasRemoteSource = new RemoteSource({ url: "" }); + } + ParserForCSV.prototype.setRemoteSource = function (source) { + this._datasRemoteSource = new RemoteSource(source); + }; + Object.defineProperty(ParserForCSV.prototype, "datasRemoteSource", { + get: function () { + return this._datasRemoteSource; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ParserForCSV.prototype, "datas2Parse", { + get: function () { + return this._datas2Parse; + }, + set: function (datas) { + if (datas.trim().length === 0) + throw new Error(errors.parserNeedDatas); + else + this._datas2Parse = datas.trim(); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ParserForCSV.prototype, "parseResults", { + get: function () { + return this._parseResults; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ParserForCSV.prototype, "privateOptions", { + get: function () { + return this._privateOptions; + }, + enumerable: true, + configurable: true + }); + ParserForCSV.prototype.parse = function () { + return __awaiter(this, void 0, void 0, function () { + var parser, parseContent, _i, _a, header; + var _this = this; + return __generator(this, function (_b) { + parser = this; + parseContent = ""; + if (parser._datasRemoteSource.url !== "") { + parseContent = parser._datasRemoteSource.url; + this._privateOptions.download = true; + this._privateOptions.withCredentials = parser._datasRemoteSource.withCredentials; + if (parser._datasRemoteSource.headers !== undefined) { + this._privateOptions.downloadRequestHeaders = {}; + for (_i = 0, _a = parser._datasRemoteSource.headers; _i < _a.length; _i++) { + header = _a[_i]; + this._privateOptions.downloadRequestHeaders[header.key] = header.value; + } + } + } + else if (parser._datas2Parse !== "") + parseContent = parser._datas2Parse; + else + throw new Error(errors.parserNeedSource); + return [2, new Promise(function (resolve, reject) { + Papa.parse(parseContent, { + delimiter: _this.options.delimiter, + newline: _this.options.newline, + quoteChar: _this.options.quoteChar, + escapeChar: _this.options.escapeChar, + header: true, + transformHeader: _this.options.transformHeader, + preview: _this.options.preview, + comments: _this.options.comments, + complete: function (results) { + var realFields = [], parseErrors = []; + for (var _i = 0, _a = results.meta.fields; _i < _a.length; _i++) { + var field = _a[_i]; + var checkField = field.trim(); + if (checkField !== "" && realFields.indexOf(checkField) === -1) + realFields.push(checkField); + else + parseErrors.push({ row: -1, message: errors.parserFieldNameFail }); + } + if (realFields.length === 0) + reject(new Error(errors.parserFieldsNotFound)); + else { + parser._parseResults = + { + datas: results.data, + errors: parseErrors.concat(results.errors), + fields: realFields, + }; + resolve(true); + } + }, + download: _this._privateOptions.download, + downloadRequestHeaders: _this._privateOptions.downloadRequestHeaders, + skipEmptyLines: "greedy", + fastMode: _this.options.fastMode, + withCredentials: _this._privateOptions.withCredentials, + transform: _this.options.transform + }); + })]; + }); + }); + }; + return ParserForCSV; +}()); +export { ParserForCSV }; diff --git a/src/build/ParserForHTML.js b/src/build/ParserForHTML.js new file mode 100644 index 0000000..8979435 --- /dev/null +++ b/src/build/ParserForHTML.js @@ -0,0 +1,173 @@ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +var errors = require("./errors.js"); +import { RemoteSource } from "./RemoteSource"; +var ParserForHTML = (function () { + function ParserForHTML(datasRemoteSource) { + this._document2Parse = document; + this._parseResults = undefined; + this._fieldsSelector = "table > thead > tr > th"; + this._rowsSelector = "table > tbody > tr"; + this._datasSelector = "tr > td"; + if (datasRemoteSource !== undefined) + this._datasRemoteSource = datasRemoteSource; + else + this._datasRemoteSource = new RemoteSource({ url: "" }); + } + ParserForHTML.prototype.setRemoteSource = function (source) { + this._datasRemoteSource = new RemoteSource(source); + }; + Object.defineProperty(ParserForHTML.prototype, "datasRemoteSource", { + get: function () { + return this._datasRemoteSource; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ParserForHTML.prototype, "document2Parse", { + get: function () { + return this._document2Parse; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ParserForHTML.prototype, "fieldsSelector", { + get: function () { + return this._fieldsSelector; + }, + set: function (selector) { + if (selector.trim() === "") + throw new Error(errors.parserSelectorsIsEmpty); + else + this._fieldsSelector = selector.trim(); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ParserForHTML.prototype, "rowsSelector", { + get: function () { + return this._rowsSelector; + }, + set: function (selector) { + if (selector.trim() === "") + throw new Error(errors.parserSelectorsIsEmpty); + else + this._rowsSelector = selector.trim(); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ParserForHTML.prototype, "datasSelector", { + get: function () { + return this._datasSelector; + }, + set: function (selector) { + if (selector.trim() === "") + throw new Error(errors.parserSelectorsIsEmpty); + else + this._datasSelector = selector.trim(); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ParserForHTML.prototype, "parseResults", { + get: function () { + return this._parseResults; + }, + enumerable: true, + configurable: true + }); + ParserForHTML.prototype.parse = function () { + return __awaiter(this, void 0, void 0, function () { + var realFields, datas, parseErrors, settings, response, responseHTML, parserDOM, fields, i, checkField, rows, datasElts, i, dataObject, j; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + realFields = [], datas = [], parseErrors = []; + if (!(this._datasRemoteSource.url !== "")) return [3, 3]; + settings = this._datasRemoteSource.getFetchSettings(); + return [4, fetch(this._datasRemoteSource.url, settings)]; + case 1: + response = _a.sent(); + if (!response.ok) + throw new Error(errors.parserRemoteFail); + return [4, response.text()]; + case 2: + responseHTML = _a.sent(); + parserDOM = new DOMParser(); + this._document2Parse = parserDOM.parseFromString(responseHTML, "text/html"); + _a.label = 3; + case 3: + fields = this._document2Parse.querySelectorAll(this._fieldsSelector); + if (fields.length === 0) + throw new Error(errors.parserElementsNotFound + this._fieldsSelector); + for (i = 0; i < fields.length; i++) { + checkField = (fields[i].textContent + "").trim(); + if (checkField !== "" && realFields.indexOf(checkField) === -1) + realFields.push(checkField); + else + parseErrors.push({ row: -1, message: errors.parserFieldNameFail }); + } + if (realFields.length === 0) + throw new Error(errors.parserFieldsNotFound); + rows = this._document2Parse.querySelectorAll(this._rowsSelector); + for (i = 0; i < rows.length; i++) { + datasElts = rows[i].querySelectorAll(this._datasSelector); + if (datasElts.length !== realFields.length) + parseErrors.push({ row: i, message: errors.parserNumberOfFieldsFail }); + dataObject = {}; + for (j = 0; j < datasElts.length && j < realFields.length; j++) + dataObject[realFields[j]] = datasElts[j].textContent + ""; + if (Object.keys(dataObject).length !== 0) + datas.push(dataObject); + else + parseErrors.push({ row: i, message: errors.parserLineWithoutDatas }); + } + this._parseResults = + { + datas: datas, + errors: parseErrors, + fields: realFields, + }; + return [2]; + } + }); + }); + }; + return ParserForHTML; +}()); +export { ParserForHTML }; diff --git a/src/build/ParserForJSON.js b/src/build/ParserForJSON.js new file mode 100644 index 0000000..a1a71f0 --- /dev/null +++ b/src/build/ParserForJSON.js @@ -0,0 +1,185 @@ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +var errors = require("./errors.js"); +import { RemoteSource } from "./RemoteSource"; +var ParserForJSON = (function () { + function ParserForJSON(datasRemoteSource) { + this._datas2Parse = ""; + this._parseResults = undefined; + if (datasRemoteSource !== undefined) + this._datasRemoteSource = datasRemoteSource; + else + this._datasRemoteSource = new RemoteSource({ url: "" }); + } + ParserForJSON.prototype.setRemoteSource = function (source) { + this._datasRemoteSource = new RemoteSource(source); + }; + Object.defineProperty(ParserForJSON.prototype, "datasRemoteSource", { + get: function () { + return this._datasRemoteSource; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ParserForJSON.prototype, "datas2Parse", { + get: function () { + return this._datas2Parse; + }, + set: function (datas) { + if (datas.trim().length === 0) + throw new Error(errors.parserNeedDatas); + else + this._datas2Parse = datas.trim(); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(ParserForJSON.prototype, "parseResults", { + get: function () { + return this._parseResults; + }, + enumerable: true, + configurable: true + }); + ParserForJSON.prototype.parse = function () { + return __awaiter(this, void 0, void 0, function () { + var parser, parseContent, settings, response, datasParsed, typesOkForValue, fields, datas, parseErrors, nbFields, nbDatas, goodFields, i, i, dataObject, nbObjFields, j, i, _i, datasParsed_1, data, dataObject, field; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: + parser = this; + parseContent = ""; + if (!(parser._datasRemoteSource.url !== "")) return [3, 3]; + settings = parser._datasRemoteSource.getFetchSettings(); + return [4, fetch(parser._datasRemoteSource.url, settings)]; + case 1: + response = _a.sent(); + if (!response.ok) + throw new Error(errors.parserRemoteFail); + return [4, response.text()]; + case 2: + parseContent = _a.sent(); + return [3, 4]; + case 3: + if (parser._datas2Parse !== "") + parseContent = parser._datas2Parse; + else + throw new Error(errors.parserNeedSource); + _a.label = 4; + case 4: + datasParsed = JSON.parse(parseContent); + typesOkForValue = ["boolean", "number", "string"]; + fields = [], datas = [], parseErrors = []; + if (Array.isArray(datasParsed.fields) && Array.isArray(datasParsed.datas)) { + nbFields = datasParsed.fields.length, nbDatas = datasParsed.datas.length; + goodFields = []; + fields = datasParsed.fields; + for (i = 0; i < nbFields; i++) { + if (typeof fields[i] !== "string") + parseErrors.push({ row: -1, message: errors.parserTypeError + typeof fields[i] }); + else { + fields[i] = fields[i].trim(); + if (fields[i] !== "" && goodFields.indexOf(fields[i]) === -1) + goodFields.push(fields[i]); + else + parseErrors.push({ row: -1, message: errors.parserFieldNameFail }); + } + } + fields = goodFields; + console.log(datasParsed.fields); + console.log(goodFields); + if (fields.length === 0) + throw new Error(errors.parserFail); + for (i = 0; i < nbDatas; i++) { + dataObject = {}, nbObjFields = datasParsed.datas[i].length; + if (nbObjFields !== nbFields) + parseErrors.push({ row: i, message: errors.parserNumberOfFieldsFail }); + for (j = 0; j < nbObjFields && j < nbFields; j++) { + if (typesOkForValue.indexOf(typeof datasParsed.datas[i][j]) === -1) + parseErrors.push({ row: i, message: errors.parserTypeError + typeof datasParsed.datas[i][j] }); + else + dataObject[fields[j]] = datasParsed.datas[i][j] + ""; + } + if (Object.keys(dataObject).length !== 0) + datas.push(dataObject); + else + parseErrors.push({ row: i, message: errors.parserLineWithoutDatas }); + } + } + else { + i = 0; + for (_i = 0, datasParsed_1 = datasParsed; _i < datasParsed_1.length; _i++) { + data = datasParsed_1[_i]; + dataObject = {}; + for (field in data) { + field = field.trim(); + if (field === "") + parseErrors.push({ row: -1, message: errors.parserFieldNameFail }); + else if (typesOkForValue.indexOf(typeof data[field]) === -1) + parseErrors.push({ row: i, message: errors.parserTypeError + typeof data[field] }); + else { + if (fields.indexOf(field) === -1) + fields.push(field); + if (dataObject[field] !== undefined) + parseErrors.push({ row: i, message: errors.parserFieldNameFail }); + else + dataObject[field] = data[field] + ""; + } + } + if (Object.keys(dataObject).length !== 0) + datas.push(dataObject); + else + parseErrors.push({ row: i, message: errors.parserLineWithoutDatas }); + i++; + } + if (fields.length === 0) + throw new Error(errors.parserFail); + } + parser._parseResults = + { + datas: datas, + errors: parseErrors, + fields: fields, + }; + return [2]; + } + }); + }); + }; + return ParserForJSON; +}()); +export { ParserForJSON }; diff --git a/src/build/RemoteSource.js b/src/build/RemoteSource.js new file mode 100644 index 0000000..626d48c --- /dev/null +++ b/src/build/RemoteSource.js @@ -0,0 +1,79 @@ +var errors = require("./errors.js"); +var RemoteSource = (function () { + function RemoteSource(RemoteSettings) { + this.allowedUrlProtocol = ["https:", "http:"]; + this._url = ""; + this._headers = []; + this._withCredentials = false; + if (RemoteSettings.url !== "") + this.url = RemoteSettings.url; + if (RemoteSettings.headers !== undefined) + this.headers = RemoteSettings.headers; + if (RemoteSettings.withCredentials !== undefined) + this.withCredentials = RemoteSettings.withCredentials; + } + Object.defineProperty(RemoteSource.prototype, "url", { + get: function () { + return this._url; + }, + set: function (url) { + if (url.trim().length === 0) + throw new Error(errors.remoteSourceNeedUrl); + else { + try { + var checkUrl = new URL(url); + if (this.allowedUrlProtocol.indexOf(checkUrl.protocol) === -1) + throw new Error(); + } + catch (e) { + console.error(e); + throw new Error(errors.remoteSourceUrlFail); + } + this._url = url.trim(); + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(RemoteSource.prototype, "headers", { + get: function () { + return this._headers; + }, + set: function (headers) { + var forbiddenHeadersNames = ["Accept-Charset", "Accept-Encoding", "Access-Control-Request-Headers", "Access-Control-Request-Method", "Connection", "Content-Length", "Cookie", "Cookie2", "Date", "DNT", "Expect", "Host", "Keep-Alive", "Origin", "Referer", "TE", "Trailer", "Transfer-Encoding", "Upgrade", "Via"]; + for (var _i = 0, headers_1 = headers; _i < headers_1.length; _i++) { + var header = headers_1[_i]; + header.key = header.key.trim(); + if (header.key.startsWith("Sec-") || header.key.startsWith("Proxy-") || forbiddenHeadersNames.indexOf(header.key) !== -1) + console.error(errors.remoteSourceHeaderIsUnallowed); + else + this._headers.push({ key: header.key, value: header.value.trim() }); + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(RemoteSource.prototype, "withCredentials", { + get: function () { + return this._withCredentials; + }, + set: function (credentials) { + this._withCredentials = credentials; + }, + enumerable: true, + configurable: true + }); + RemoteSource.prototype.getFetchSettings = function () { + var headers = new Headers(); + if (this._headers !== undefined) { + for (var _i = 0, _a = this._headers; _i < _a.length; _i++) { + var header = _a[_i]; + headers.append(header.key, header.value); + } + } + var credentials = (this._withCredentials) ? "include" : "omit"; + return { method: "GET", headers: headers, credentials: credentials }; + }; + return RemoteSource; +}()); +export { RemoteSource }; diff --git a/src/build/Render.js b/src/build/Render.js new file mode 100644 index 0000000..15afb9c --- /dev/null +++ b/src/build/Render.js @@ -0,0 +1,66 @@ +var errors = require("./errors.js"); +var Render = (function () { + function Render(settings) { + if (settings === void 0) { settings = Render.defaultSettings; } + this._fields = []; + this.datas = []; + this.settings = settings; + } + Object.defineProperty(Render.prototype, "fields", { + get: function () { + return this._fields; + }, + set: function (fields) { + if (fields.length === 0) + throw new Error(errors.renderNeedFields); + else + this._fields = fields; + }, + enumerable: true, + configurable: true + }); + Render.prototype.rend2HTML = function () { + if (this._fields.length === 0) + throw new Error(errors.renderNeedFields); + else { + var datasHTML = this.settings.allBegining; + if (this.settings.fieldsBegining !== undefined && this.settings.fieldDisplaying !== undefined && this.settings.fieldsEnding !== undefined) { + datasHTML += this.settings.fieldsBegining; + for (var _i = 0, _a = this._fields; _i < _a.length; _i++) { + var field = _a[_i]; + datasHTML += this.settings.fieldDisplaying.replace("#FIELDNAME", field); + } + datasHTML += this.settings.fieldsEnding; + } + datasHTML += this.settings.linesBegining; + for (var _b = 0, _c = this.datas; _b < _c.length; _b++) { + var row = _c[_b]; + datasHTML += this.settings.lineBegining; + for (var _d = 0, _e = this._fields; _d < _e.length; _d++) { + var field = _e[_d]; + if (row[field] !== undefined) + datasHTML += this.settings.dataDisplaying.replace("#VALUE", row[field]).replace("#FIELDNAME", field); + else + datasHTML += this.settings.dataDisplaying.replace("#VALUE", "").replace("#FIELDNAME", field); + } + datasHTML += this.settings.lineEnding; + } + datasHTML += this.settings.linesEnding + this.settings.allEnding; + return datasHTML; + } + }; + Render.defaultSettings = { + allBegining: "