From 3e11dbf377f2b60a27c1eaa4b4e997f30b48e25a Mon Sep 17 00:00:00 2001
From: Aayush <suranaaayush98@gmail.com>
Date: Mon, 26 Aug 2019 16:47:51 +0530
Subject: [PATCH] parser for pd_message->ascii_art

---
 pd/nw/pd_message_parser.js | 201 +++++++++++++++++++++++++++++++++++++
 1 file changed, 201 insertions(+)
 create mode 100644 pd/nw/pd_message_parser.js

diff --git a/pd/nw/pd_message_parser.js b/pd/nw/pd_message_parser.js
new file mode 100644
index 000000000..c5fcab6d1
--- /dev/null
+++ b/pd/nw/pd_message_parser.js
@@ -0,0 +1,201 @@
+//Example message
+"use strict";
+
+var pd_message = "#X obj 36 60 inlet;\n#X obj 36 416 outlet;\n#X obj 68 387 send;\n#X obj 93 282 loadbang;\n#X msg 93 308 dollarzero;\n#X obj 93 334 canvasinfo 1;\n#X msg 93 359 symbol \$1-result;\n#X connect 0 0 5 0;\n#X connect 1 0 4 0;\n#X connect 3 0 2 0;\n#X connect 4 0 3 0;\n#X connect 4 1 0 0;"
+var x=parse_pd_message(pd_message);
+alert(x);
+document.getElementById("demo").innerHTML = x;
+function makeArray(w, h, val) {
+    var arr = [];
+    for(let i = 0; i < h; i++) {
+        arr[i] = [];
+        for(let j = 0; j < w-1; j++) {
+            arr[i][j] = val;
+        }
+        arr[i][h-1]="\n<br>";
+    }
+    return arr;
+}
+
+function compare(a,b) {
+    if ( a.x < b.x ) return -1;
+    if ( a.x > b.x ) return 1;
+    return a.y - b.y;
+}
+
+function make_connection(matrix, connection, object1, object2, cell_x1, cell_y1, cell_x2, cell_y2) {
+    if ( cell_y1 == cell_y2 ) {
+        for ( let i = cell_x1+1 ; i < cell_x2 ; i++ ) {
+            matrix[i][cell_y1] = "|";
+        }
+    } else if ( cell_y1 < cell_y2 ) {
+        for ( let i = cell_x1+1 ; i < cell_x2 - 2; i++ ) {
+            matrix[i][cell_y1] = "|";
+        }
+        matrix[cell_x2-2][cell_y1] = "+";
+        for ( let j = cell_y1 + 1 ; j < cell_y2  ; j++ ) {
+            matrix[cell_x2 - 2][j] = "-";
+        }
+        matrix[cell_x2 - 2][cell_y2] = "+";
+        matrix[cell_x2 - 1][cell_y2] = "|";               
+   } else {
+        for ( let i = cell_x1+1 ; i < cell_x2 - 2; i++ ) {
+            matrix[i][cell_y1] = "|";
+        }
+        matrix[cell_x2-2][cell_y1] = "+";
+        for ( let j = cell_y1 - 1 ; j > cell_y2  ; j-- ) {
+            matrix[cell_x2 - 2][j] = "-";
+        }       
+        matrix[cell_x2 - 2][cell_y2] = "+";
+        matrix[cell_x2 - 1][cell_y2] = "|";
+    }
+}
+
+function parse_pd_message(message) {
+    var i,j,l,lines,
+        splitted_str,
+        temp_str,
+        obj_msg_info = [],
+        connection_info = [],
+        count = 0,
+        counter = 0,
+        str_count = 0,
+        object_msg_index_info = {},
+        matrix = makeArray(100,100,' ');
+
+    message.replace("\n" ,"");
+    lines = message.split(";");
+
+    for ( i = 0 ; i<lines.length-1 ; i++ ) {
+        lines[i].replace(";\n","");
+        splitted_str = lines[i].split(" ");
+        
+        if ( splitted_str[1] == "connect") {
+            connection_info.push({start : splitted_str[2],
+                                end : splitted_str[4],
+                                point1 : splitted_str[3],
+                                point2 : splitted_str[5]});
+        } else {
+            temp_str = splitted_str.slice(4,splitted_str.length);
+            obj_msg_info.push({type : splitted_str[1],
+                                x : splitted_str[2],
+                                y : splitted_str[3],
+                                obj_no : count,
+                                text : temp_str,
+                                cell_start_x : 0,
+                                cell_start_y : 0,
+                                cell_end_x : 0,
+                                cell_end_y : 0});
+            count = count+1;
+        }
+    }
+
+    obj_msg_info.sort(compare);
+    i=0;
+    j=0;
+    counter=0;
+    while( counter < obj_msg_info.length ) {
+            if(counter == 0) {
+                obj_msg_info[counter].cell_start_x = i;
+                obj_msg_info[counter].cell_start_y = j;
+                matrix[i][j] = "[";
+                j++;
+                str_count=0;
+                for ( l = j ; l < j + obj_msg_info[counter].text[0].length ; l++ ) {
+                    matrix[i][l] = obj_msg_info[counter].text[0][str_count];
+                    str_count++;
+                }
+                j=l;
+                if (obj_msg_info[counter].type == "obj")
+                    matrix[i][j]="]";
+                else 
+                    matrix[i][j]="(";
+                obj_msg_info[counter].cell_end_x = i;
+                obj_msg_info[counter].cell_end_y = j;
+                counter+=1;
+            }
+            else {
+                if (obj_msg_info[counter].x == obj_msg_info[counter-1].x) {
+                    j += 5;
+                    j += (obj_msg_info[counter].y  - obj_msg_info[counter-1].y)/50;
+                    j = Math.floor(j);
+                    obj_msg_info[counter].cell_start_x = i;
+                    obj_msg_info[counter].cell_start_y = j;
+                    matrix[i][j] = "[";
+                    j++;
+                    str_count=0;
+                    for ( l = j ; l < j + obj_msg_info[counter].text[0].length ; l++ ) {
+                        matrix[i][l] = obj_msg_info[counter].text[0][str_count];
+                        str_count++;
+                    }
+                    j=l;
+                    if (obj_msg_info[counter].type == "obj")
+                        matrix[i][j]="]";
+                    else 
+                        matrix[i][j]="(";
+                    obj_msg_info[counter].cell_end_x = i;
+                    obj_msg_info[counter].cell_end_y = j;
+                }
+                else {
+                    i += 3;
+                    i += (obj_msg_info[counter].x  - obj_msg_info[counter-1].x)/10;
+                    i = Math.floor(i);
+                    j = ( obj_msg_info[counter].y)/50;
+                    j = Math.floor(j);
+                    obj_msg_info[counter].cell_start_x = i;
+                    obj_msg_info[counter].cell_start_y = j;
+                    matrix[i][j] = "[";
+                    j++;
+                    str_count=0;
+                    for ( l = j ; l < j + obj_msg_info[counter].text[0].length ; l++ ) {
+                        matrix[i][l] = obj_msg_info[counter].text[0][str_count];
+                        str_count++;
+                    }
+                    j=l;
+                    if (obj_msg_info[counter].type == "obj")
+                        matrix[i][j]="]";
+                    else 
+                        matrix[i][j]="(";
+                    obj_msg_info[counter].cell_end_x = i;
+                    obj_msg_info[counter].cell_end_y = j;
+                    }
+                    counter+=1;
+            }
+        }
+
+        for ( i = 0 ; i < obj_msg_info.length ; i++ ) {
+                                    //alert([obj_msg_info[i].obj_no,obj_msg_info[i].cell_start_x,obj_msg_info[i].cell_start_y,obj_msg_info[i].cell_end_x,obj_msg_info[i].cell_end_y]);
+            object_msg_index_info[obj_msg_info[i].obj_no] = {cell_start_x:obj_msg_info[i].cell_start_x,
+                                                            cell_start_y:obj_msg_info[i].cell_start_y,
+                                                            cell_end_x:obj_msg_info[i].cell_end_x,
+                                                            cell_end_y:obj_msg_info[i].cell_end_y};
+            
+        }
+        for ( i = 0 ; i < connection_info.length ; i++ ) {
+            if ( object_msg_index_info[connection_info[i].start].cell_start_x < object_msg_index_info[connection_info[i].end].cell_start_x ) {
+                if ( connection_info[i].point1 == 0 && connection_info[i].point2 == 0 ) {
+                    make_connection(matrix,connection_info[i], object_msg_index_info[connection_info[i].start], object_msg_index_info[connection_info[i].end], object_msg_index_info[connection_info[i].start].cell_start_x, object_msg_index_info[connection_info[i].start].cell_start_y, object_msg_index_info[connection_info[i].end].cell_start_x, object_msg_index_info[connection_info[i].end].cell_start_y );
+                } else if ( connection_info[i].point1 == 0 && connection_info[i].point2 != 0 ) {
+                    make_connection(matrix,connection_info[i], object_msg_index_info[connection_info[i].start], object_msg_index_info[connection_info[i].end], object_msg_index_info[connection_info[i].start].cell_start_x, object_msg_index_info[connection_info[i].start].cell_start_y, object_msg_index_info[connection_info[i].end].cell_end_x , object_msg_index_info[connection_info[i].end].cell_end_y );
+                } else if ( connection_info[i].point1 != 0 && connection_info[i].point2 == 0 ) { 
+                    make_connection(matrix,connection_info[i], object_msg_index_info[connection_info[i].start], object_msg_index_info[connection_info[i].end], object_msg_index_info[connection_info[i].start].cell_end_x, object_msg_index_info[connection_info[i].start].cell_end_y, object_msg_index_info[connection_info[i].end].cell_start_x, object_msg_index_info[connection_info[i].end].cell_start_y );
+                } else {
+                    make_connection(matrix,connection_info[i], object_msg_index_info[connection_info[i].start], object_msg_index_info[connection_info[i].end], object_msg_index_info[connection_info[i].start].cell_end_x, object_msg_index_info[connection_info[i].start].cell_end_y, object_msg_index_info[connection_info[i].end].cell_end_x , object_msg_index_info[connection_info[i].end].cell_end_y );
+                }
+            } else {
+                if ( connection_info[i].point1 == 0 && connection_info[i].point2 == 0 ) {
+                    make_connection(matrix,connection_info[i], object_msg_index_info[connection_info[i].end], object_msg_index_info[connection_info[i].start], object_msg_index_info[connection_info[i].end].cell_start_x, object_msg_index_info[connection_info[i].end].cell_start_y,
+                        object_msg_index_info[connection_info[i].start].cell_start_x, object_msg_index_info[connection_info[i].start].cell_start_y);
+                } else if ( connection_info[i].point1 == 0 && connection_info[i].point2 != 0 ) {
+                    make_connection(matrix,connection_info[i], object_msg_index_info[connection_info[i].end], object_msg_index_info[connection_info[i].start], object_msg_index_info[connection_info[i].end].cell_end_x , object_msg_index_info[connection_info[i].end].cell_end_y,
+                        object_msg_index_info[connection_info[i].start].cell_start_x, object_msg_index_info[connection_info[i].start].cell_start_y);
+                } else if ( connection_info[i].point1 != 0 && connection_info[i].point2 == 0 ) {
+                    make_connection(matrix,connection_info[i], object_msg_index_info[connection_info[i].end], object_msg_index_info[connection_info[i].start],  object_msg_index_info[connection_info[i].end].cell_start_x, object_msg_index_info[connection_info[i].end].cell_start_y,
+                    object_msg_index_info[connection_info[i].start].cell_end_x, object_msg_index_info[connection_info[i].start].cell_end_y);
+                } else {
+                    make_connection(matrix,connection_info[i], object_msg_index_info[connection_info[i].end], object_msg_index_info[connection_info[i].start], object_msg_index_info[connection_info[i].end].cell_end_x , object_msg_index_info[connection_info[i].end].cell_end_y, object_msg_index_info[connection_info[i].start].cell_end_x, object_msg_index_info[connection_info[i].start].cell_end_y );
+                }
+            }
+        }
+    return matrix;
+}
\ No newline at end of file
-- 
GitLab