mirror of
https://github.com/dwolfe884/obsidian-x86-flow-graph.git
synced 2026-07-22 07:30:26 +00:00
omg I cannot believe this recursive works
This commit is contained in:
parent
2744b68a42
commit
e304b29bbd
4 changed files with 209 additions and 16 deletions
35
main.js
35
main.js
|
|
@ -74,12 +74,41 @@ var MyPlugin = class extends import_obsidian.Plugin {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
this.addCommand({
|
this.addCommand({
|
||||||
id: "create-file",
|
id: "create-flow-diagram",
|
||||||
name: "Sample create file command",
|
name: "Convert x86 assembly into a flow diagram on a canvas",
|
||||||
editorCallback: (editor, view) => {
|
editorCallback: (editor, view) => {
|
||||||
console.log(editor.getSelection());
|
console.log(editor.getSelection());
|
||||||
console.log(this.app.vault.getName());
|
console.log(this.app.vault.getName());
|
||||||
this.app.vault.create("./testing.md", editor.getSelection());
|
let nodes = [];
|
||||||
|
var tmp = editor.getSelection().split("\n");
|
||||||
|
let lines = [];
|
||||||
|
var nodeid = 1;
|
||||||
|
var workingx = 0;
|
||||||
|
var workingy = 0;
|
||||||
|
tmp.forEach((element) => {
|
||||||
|
if (element != "") {
|
||||||
|
lines.push(element);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var currnode = "```\n";
|
||||||
|
lines.forEach((line, linenum) => {
|
||||||
|
console.log(line);
|
||||||
|
if (line.split("")[0] == " " || line.split("")[0] == " ") {
|
||||||
|
if (line.trim().split("")[0] == "j") {
|
||||||
|
currnode = currnode + line + "```";
|
||||||
|
nodes.push({ "id": nodeid, "x": workingx, "y": workingy, "width": 250, "height": 300, "type": "text", "text": currnode });
|
||||||
|
nodeid = nodeid + 1;
|
||||||
|
workingy = workingy + 350;
|
||||||
|
currnode = "```\n";
|
||||||
|
} else {
|
||||||
|
currnode = currnode + line + "\n";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var thing = '{ "nodes":' + JSON.stringify(nodes) + "}";
|
||||||
|
console.log(thing);
|
||||||
|
this.app.vault.create("./testing.canvas", thing);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
this.addCommand({
|
this.addCommand({
|
||||||
|
|
|
||||||
|
|
@ -1,2 +1,6 @@
|
||||||
|
<button id="butt">
|
||||||
|
Throw shit at fan
|
||||||
|
</button>
|
||||||
|
|
||||||
<script src="prototype.js">
|
<script src="prototype.js">
|
||||||
</script>
|
</script>
|
||||||
150
prototype.js
vendored
150
prototype.js
vendored
|
|
@ -1,29 +1,155 @@
|
||||||
|
var nodeid = 1;
|
||||||
|
var edgeid = 5555
|
||||||
|
var workingx = 0;
|
||||||
|
var workingy = 0;
|
||||||
var input =
|
var input =
|
||||||
`
|
`
|
||||||
mov [ebp+var_4] 0 # i = 0
|
mov [ebp+var_4] 0 # i = 0
|
||||||
jmp short loc_401016 # jump inside of loop
|
jmp loc_401016 # jump inside of loop
|
||||||
loc_40100D
|
loc_40100D
|
||||||
mov eax, [ebp+var_4]
|
mov eax, [ebp+var_4]
|
||||||
add eax, 1 # add 1 to i
|
add eax, 1 # add 1 to i
|
||||||
mov [ebp+var_4], 1
|
mov [ebp+var_4], 1
|
||||||
loc_401016:
|
loc_401016
|
||||||
cmp [ebp+var_4], 64h # check if i is less than 100
|
cmp [ebp+var_4], 64h # check if i is less than 100
|
||||||
jge short loc_40102F # if it is, jump out of loop
|
jge loc_40102F # if it is, jump out of loop
|
||||||
mov ecx, [ebp+var_4] # otherwise print value of i
|
mov ecx, [ebp+var_4] # otherwise print value of i
|
||||||
push ecx
|
push ecx
|
||||||
push offset aID; "i equals %d\\n"
|
push offset aID; "i equals %d\\n"
|
||||||
call printf
|
call printf
|
||||||
add esp, 8
|
add esp, 8
|
||||||
jmp short loc_40100D # jump to increment step
|
jmp loc_40100D # jump to increment step
|
||||||
loc_40102F`
|
loc_40102F`
|
||||||
|
var nodes = []
|
||||||
|
var edges = [] //{"id":"d1e0d15da69178a9","fromNode":"4018052da21dde12","fromSide":"bottom","toNode":"0afaa4e14a75cfe1","toSide":"top","label":"false"}
|
||||||
|
var tmp = input.split("\n")
|
||||||
|
var lines = []
|
||||||
|
var fromnode = -1
|
||||||
|
//Recursive function to visit each node and generate the other nodes
|
||||||
|
//Returns when it either hits the end of the assembly or returns to a node that has already been added
|
||||||
|
function generatenodes(linenum, text, fromnode){
|
||||||
|
console.log(locations)
|
||||||
|
retarray = MakeNodeFromLineToNextJump(linenum, text, fromnode)
|
||||||
|
var newnode = retarray[0]
|
||||||
|
fromnode = newnode['id']
|
||||||
|
console.log("fromnode is " + fromnode)
|
||||||
|
var whereto = retarray[1]
|
||||||
|
//Check if node is already in list
|
||||||
|
var wegood = nodeAlredyAdded(newnode)
|
||||||
|
if(wegood){
|
||||||
|
return
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
nodes.push(newnode)
|
||||||
|
}
|
||||||
|
console.log("{ \"nodes\":"+JSON.stringify(nodes) + "}")
|
||||||
|
console.log("need to jump here: " + whereto)
|
||||||
|
//We are at the end of the file
|
||||||
|
if(whereto == "fin"){
|
||||||
|
return
|
||||||
|
}
|
||||||
|
generatenodes(locations[whereto[0]], text, fromnode)
|
||||||
|
if(whereto.length == 2){
|
||||||
|
console.log("Oh boy, we at a split")
|
||||||
|
console.log("going to line: " + whereto[1])
|
||||||
|
generatenodes(whereto[1], text, fromnode)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
//This function returns true if the node has already been added to the nodes array
|
||||||
|
function nodeAlredyAdded(checknode){
|
||||||
|
var retval = false
|
||||||
|
nodes.forEach(node => {
|
||||||
|
if(checknode["startline"] == node["startline"] && checknode["endline"] == node["endline"]){
|
||||||
|
retval = true
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return retval
|
||||||
|
}
|
||||||
|
|
||||||
|
//This function takes a line number and the assembly and creates a node from that line to the next jump instruction
|
||||||
|
//It then returns the new node at retarray[0] and the location to jump to at retarray[1]
|
||||||
|
//TODO: FIgure out nodeid, x, and y values
|
||||||
|
function MakeNodeFromLineToNextJump(linenum, text, fromnode) {
|
||||||
|
var currnode = "```\n"
|
||||||
|
var i = linenum
|
||||||
|
var newnode
|
||||||
|
var jmploc
|
||||||
|
console.log("curr line: " + i)
|
||||||
|
while(i < text.length){
|
||||||
|
var line = text[i]
|
||||||
|
console.log("currently processing this line: " + line)
|
||||||
|
//if(line.split("")[0] == '\t' || line.split("")[0] == " "){
|
||||||
|
if(line.trim().split("")[0] == 'j'){
|
||||||
|
currnode = currnode + line + "\n```"
|
||||||
|
newnode = {"id":nodeid, "x": workingx, "y": workingy, "width": 550,"height": 25*currnode.split("\n").length, "type": "text", "text": currnode, "startline": linenum,"endline": i}
|
||||||
|
nodeid = nodeid + 1
|
||||||
|
workingy = workingy + 350
|
||||||
|
//Only parse the first node
|
||||||
|
console.log(line.trim().slice(0,3))
|
||||||
|
if(fromnode != -1){
|
||||||
|
var newedge = {"id":edgeid,"fromNode":fromnode,"fromSide":"bottom","toNode":newnode["id"],"toSide":"top","label":""}
|
||||||
|
edges.push(newedge)
|
||||||
|
edgeid = edgeid + 1
|
||||||
|
}
|
||||||
|
if(line.trim().slice(0,3) == 'jmp'){
|
||||||
|
jmploc = [line.trim().slice(line.trim().indexOf(" ")+1,line.length).split("#")[0].trim()]
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
jmploc = [line.trim().slice(line.trim().indexOf(" ")+1,line.length).split("#")[0].trim(),i+1]
|
||||||
|
}
|
||||||
|
i = text.length+20
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
currnode = currnode + line + "\n"
|
||||||
|
}
|
||||||
|
/*}
|
||||||
|
else{
|
||||||
|
//TODO: Handle location lines
|
||||||
|
}*/
|
||||||
|
i = i + 1
|
||||||
|
}
|
||||||
|
//We got to the end of the assembly
|
||||||
|
if(i != text.length+21)
|
||||||
|
{
|
||||||
|
currnode = currnode + "```"
|
||||||
|
newnode = {"id":nodeid, "x": workingx, "y": workingy, "width": 550,"height": 25*currnode.split("\n").length, "type": "text", "text": currnode, "startline": linenum,"endline": i}
|
||||||
|
jmploc = "fin"
|
||||||
|
nodeid = nodeid + 1
|
||||||
|
workingy = workingy + 350
|
||||||
|
if(fromnode != -1){
|
||||||
|
var newedge = {"id":edgeid,"fromNode":fromnode,"fromSide":"bottom","toNode":newnode["id"],"toSide":"top","label":""}
|
||||||
|
edges.push(newedge)
|
||||||
|
edgeid = edgeid + 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return [newnode, jmploc]
|
||||||
|
}
|
||||||
|
|
||||||
//NOTE: If there are \n in strings or comments it will fuck up
|
//NOTE: If there are \n in strings or comments it will fuck up
|
||||||
|
|
||||||
input.split("\n").slice(1,input.split("\n").length).forEach((element, ids) => {
|
function starter() {
|
||||||
const myre = /^\w.*/
|
tmp.forEach(element => {
|
||||||
//if("\t")
|
if(element != ""){
|
||||||
console.log(myre.exec(element))
|
lines.push(element)
|
||||||
if(myre.exec(element) != null){
|
}
|
||||||
console.log("At index: " + ids)
|
});
|
||||||
}
|
|
||||||
});
|
locations = {}
|
||||||
|
|
||||||
|
lines.forEach((line,linenum) => {
|
||||||
|
//Only look at lines that could be locations
|
||||||
|
if(line.split("")[0] != '\t' && line.split("")[0] != " "){
|
||||||
|
//Cut out white space and comments (#)
|
||||||
|
var newkey = line.trim().split("#")[0].trim()
|
||||||
|
if (!locations[newkey]) {
|
||||||
|
locations[newkey] = linenum;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
generatenodes(0,lines,fromnode)
|
||||||
|
console.log("{ \"nodes\":"+JSON.stringify(nodes) + ",\"edges\":" + JSON.stringify(edges) + "}")
|
||||||
|
}
|
||||||
|
document.getElementById("butt").addEventListener("click",starter)
|
||||||
|
//generatenodes(0,lines)
|
||||||
|
|
|
||||||
36
src/index.ts
36
src/index.ts
|
|
@ -75,7 +75,41 @@ export default class MyPlugin extends Plugin {
|
||||||
editorCallback: (editor: Editor, view: MarkdownView) => {
|
editorCallback: (editor: Editor, view: MarkdownView) => {
|
||||||
console.log(editor.getSelection());
|
console.log(editor.getSelection());
|
||||||
console.log(this.app.vault.getName());
|
console.log(this.app.vault.getName());
|
||||||
this.app.vault.create("./testing.md",editor.getSelection())
|
let nodes: { id: number; x: number; y: number; width: number; height: number; type: string; text: string; }[] = []
|
||||||
|
var tmp = editor.getSelection().split("\n")
|
||||||
|
let lines: string[] = []
|
||||||
|
var nodeid = 1;
|
||||||
|
var workingx = 0;
|
||||||
|
var workingy = 0;
|
||||||
|
tmp.forEach(element => {
|
||||||
|
if(element != ""){
|
||||||
|
lines.push(element)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var currnode = "```\n"
|
||||||
|
|
||||||
|
lines.forEach((line,linenum) => {
|
||||||
|
console.log(line)
|
||||||
|
if(line.split("")[0] == '\t' || line.split("")[0] == " "){
|
||||||
|
if(line.trim().split("")[0] == 'j'){
|
||||||
|
currnode = currnode + line + "\n```"
|
||||||
|
nodes.push({"id":nodeid, "x": workingx, "y": workingy, "width": 250,"height": 300, "type": "text", "text": currnode})
|
||||||
|
nodeid = nodeid + 1
|
||||||
|
workingy = workingy + 350
|
||||||
|
currnode = "```\n"
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
currnode = currnode + line + "\n"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
//TODO: Handle location lines
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var thing = "{ \"nodes\":"+JSON.stringify(nodes) + "}"
|
||||||
|
console.log(thing)
|
||||||
|
this.app.vault.create("./testing.canvas",thing)
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
// This adds a complex command that can check whether the current state of the app allows execution of the command
|
// This adds a complex command that can check whether the current state of the app allows execution of the command
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue