|
@@ -0,0 +1,125 @@
|
|
|
+import * as ObjectClass from "./../enums/elements-class-enum";
|
|
|
+
|
|
|
+const TYPE = 0; // identifica se Ponto, Texto, Reta...
|
|
|
+const ID = 1; // identificador unico do objeto
|
|
|
+const DEFINITION = 2; // parametros dos quais o objeto depende (exemplo Reta depende de Ponto e Ponto => "2:IDPONTO1 IDPONTO2")
|
|
|
+const LIST = 3; // lista de identificadores de objetos dependentes do atual
|
|
|
+const LABEL = 4; // definicao do rotulo (valor/nome e se escondido ou nao)
|
|
|
+const DEFINED = 6; // 0 ou 1 (???)
|
|
|
+const COLOR = 5; // cor usando valor inteiro
|
|
|
+const HIDDEN = 7; // 0 (visivel) ou 1 (escondido)
|
|
|
+const PIXEL = 8; // LeScript usa (coordenada X e Y - inteiros)
|
|
|
+const FONT = 9; // 'Arial' T Tam: T = FONT.PLAIN, FONT.BOLD, FONT.ITALIC; Tam = 8, 9,...
|
|
|
+ // PROIBIDO: "Arial" T Tam, pois em caso contrario nao sera lido como parametro
|
|
|
+ // usa MARCAFNT = "\'" nao pode ser "\"" <[28/09/2006] agora vazio "">
|
|
|
+const LABEL_COLOR = 10; // cor de rotulo (tambem um inteiro) - inserido apos iGeom versao >= 2.9.9.31
|
|
|
+
|
|
|
+const OBJECT_LINE_REGEX = /^\{\w*(?:(?:\d+:@\|[^@]+@\|)|(?:\d+:[^,@|]+))\w*(?:,\w*(?:(?:\d+:@\|[^@]+@\|)|(?:\d+:[^,@\|]+)))+\w*\}!?$/.compile();
|
|
|
+
|
|
|
+export class FileParser {
|
|
|
+
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ * @param {string} content
|
|
|
+ */
|
|
|
+ constructor(content) {
|
|
|
+ this.content = content;
|
|
|
+ }
|
|
|
+
|
|
|
+ parse () {
|
|
|
+ const objects_list = []
|
|
|
+ this.content.split('\n')
|
|
|
+ .filter(str => !str.match(/^[#\[]/))
|
|
|
+ .map(str => {
|
|
|
+ if(!OBJECT_LINE_REGEX.test(str.trim())) {
|
|
|
+ console.error("Malformed object string in igeom file: ",str);
|
|
|
+ } else {
|
|
|
+ const object = this.parseObjectLine(str.trim());
|
|
|
+ objects_list.push(object);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ return objects_list;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ * @param {string} object_line
|
|
|
+ */
|
|
|
+ parseObjectLine (object_line) {
|
|
|
+ let current_char = '';
|
|
|
+ let current_pos = 0;
|
|
|
+ const map = new Map();
|
|
|
+ while(1==1) {
|
|
|
+ current_char = object_line[current_pos];
|
|
|
+ if(current_char == '}') {
|
|
|
+ current_pos += 1;
|
|
|
+ if(current_pos == object_line.length)
|
|
|
+ break;
|
|
|
+ current_char = object_line[current_pos]
|
|
|
+ current_pos += 1;
|
|
|
+ if(current_char != '!') {
|
|
|
+ console.warn("Malformed object string: ",object_line);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(current_char == TYPE) {
|
|
|
+ current_pos += 2;
|
|
|
+ let type = '';
|
|
|
+ while(object_line[current_pos] != ',') {
|
|
|
+ type += object_line[current_pos];
|
|
|
+ current_pos += 1;
|
|
|
+ }
|
|
|
+ map.set("type", ObjectClass.fromCodeToClass(parseInt(type)));
|
|
|
+ } else if(current_char == ID) {
|
|
|
+ current_pos += 2;
|
|
|
+ let id = '';
|
|
|
+ while(object_line[current_pos] != ',') {
|
|
|
+ id += object_line[current_pos];
|
|
|
+ current_pos += 1;
|
|
|
+ }
|
|
|
+ map.set("id", parseInt(id));
|
|
|
+ } else if(current_char == DEFINITION) {
|
|
|
+ current_pos += 2;
|
|
|
+ const param_list = [];
|
|
|
+ let word = '';
|
|
|
+ while(object_line[current_pos] != ',') {
|
|
|
+ if(object_line[current_pos] == ' ') {
|
|
|
+ param_list.push(Number(word));
|
|
|
+ word = '';
|
|
|
+ } else if(object_line[current_pos] == '@') {
|
|
|
+ current_pos += 2
|
|
|
+ while(1==1) {
|
|
|
+ const char = object_line[current_pos];
|
|
|
+ if(char == '@' && bject_line[current_pos + 1] == '|') {
|
|
|
+ current_pos += 1;
|
|
|
+ break;
|
|
|
+ } else {
|
|
|
+ word += object_line[current_pos];
|
|
|
+ }
|
|
|
+ current_pos += 1;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ word += object_line[current_pos];
|
|
|
+ }
|
|
|
+ current_pos += 1;
|
|
|
+ }
|
|
|
+ param_list.push(word);
|
|
|
+ map.set("param", param_list);
|
|
|
+ }
|
|
|
+ if(current_char == '{' || current_char == ' ') {
|
|
|
+ current_pos += 1;
|
|
|
+ continue;
|
|
|
+ } else {
|
|
|
+ console.warn("Malformed object string: ",object_line);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(current_pos != object_line.length) {
|
|
|
+ console.warn("Object string ",object_line, " parsing did not match its size: Processed: ",current_pos," Length: ", object_line.length);
|
|
|
+ }
|
|
|
+ return map;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|