浏览代码

Syntax highting for pseudo code

Kolja Strohm 6 年之前
父节点
当前提交
d290c49730

+ 2 - 1
src/bk/BKNodePlacement.java

@@ -10,6 +10,7 @@ import animation.AnimationController;
 import animation.PseudoCodeNode;
 import animation.PseudoCodeNode.CodeAction;
 import graph.LayeredGraphNode;
+import lib.TextLayoutHelper;
 
 /**
  * The main stage of the BK node placement algorithm.
@@ -75,7 +76,7 @@ public class BKNodePlacement extends AnimatedAlgorithm {
     @Override
     public PseudoCodeNode createPseudocodeTree( JTree tree )
     {
-        PseudoCodeNode root = new PseudoCodeNode( "BK Node Placement Algorithm", tree );
+        PseudoCodeNode root = new PseudoCodeNode( TextLayoutHelper.setupPseudoCodeStage("BK Node Placement Algorithm"), tree );
         root.setSelected( true );
         conflictsNode = conftion.createPseudocodeTree( tree );
         layout1Node = layouts[ 0 ].createPseudocodeTree( tree );

+ 2 - 1
src/bk/BlockCalc.java

@@ -12,6 +12,7 @@ import animation.PseudoCodeNode.CodeAction;
 import bk.ExtremalLayoutCalc.LayoutType;
 import graph.LayeredGraphEdge;
 import graph.LayeredGraphNode;
+import lib.TextLayoutHelper;
 
 /**
  * The stage of the BK node placement algorithm where the blocks are computed.
@@ -295,7 +296,7 @@ public class BlockCalc implements AlgorithmStage {
 
     @Override
     public PseudoCodeNode createPseudocodeTree( JTree tree ) {
-        PseudoCodeNode root = new PseudoCodeNode( "Vertical alignment", tree );
+        PseudoCodeNode root = new PseudoCodeNode( TextLayoutHelper.setupPseudoCodeStage("Vertical alignment"), tree );
         loopNode = new PseudoCodeNode( "Loop through all nodes...", tree );
         do {
             LayeredGraphNode current = graph.getContainedLayers().get( calcLayerIndex() ).get( calcNodeIndex( nodeIndex ) );

+ 3 - 3
src/bk/Combine.java

@@ -264,9 +264,9 @@ public class Combine implements AlgorithmStage {
 
     @Override
     public PseudoCodeNode createPseudocodeTree( JTree tree ) {
-        PseudoCodeNode root = new PseudoCodeNode( "Balancing", tree );
-        alignNode = new PseudoCodeNode( "Align Layouts", tree );
-        setNode = new PseudoCodeNode( "Align to assignment of smallest width", tree );
+        PseudoCodeNode root = new PseudoCodeNode( TextLayoutHelper.setupPseudoCodeStage("Balancing"), tree );
+        alignNode = new PseudoCodeNode( TextLayoutHelper.setupPseudoCodeStage("Align Layouts"), tree );
+        setNode = new PseudoCodeNode( TextLayoutHelper.setupPseudoCodeStage("Align to assignment of smallest width"), tree );
         loopNode = new PseudoCodeNode( "Set coordinates to average median of aligned candidates", tree );
         for( int i = 0; i < graph.getContainedNodes().size(); i++ )
         {

+ 4 - 3
src/bk/Compaction.java

@@ -11,6 +11,7 @@ import animation.PseudoCodeNode;
 import animation.PseudoCodeNode.CodeAction;
 import bk.ExtremalLayoutCalc.LayoutType;
 import graph.LayeredGraphNode;
+import lib.TextLayoutHelper;
 
 /**
  * The stage of compacting the layout.
@@ -466,11 +467,11 @@ public class Compaction implements AlgorithmStage{
 
     @Override
     public PseudoCodeNode createPseudocodeTree( JTree tree ) {
-        PseudoCodeNode root = new PseudoCodeNode( "Horizontal compaction", tree );
-        placeNode = new PseudoCodeNode( "Root coordinates relative to sink", tree );
+        PseudoCodeNode root = new PseudoCodeNode( TextLayoutHelper.setupPseudoCodeStage("Horizontal compaction"), tree );
+        placeNode = new PseudoCodeNode( TextLayoutHelper.setupPseudoCodeStage("Root coordinates relative to sink"), tree );
         placeLoopNode = new PseudoCodeNode( "Loop through root nodes...", tree );
         placeNode.add( placeLoopNode );
-        applyNode = new PseudoCodeNode( "Absolute coordinates", tree );
+        applyNode = new PseudoCodeNode( TextLayoutHelper.setupPseudoCodeStage("Absolute coordinates"), tree );
         applyLoopNode = new PseudoCodeNode( "Loop through all nodes...", tree );
         applyNode.add( applyLoopNode );
         root.add( placeNode );

+ 15 - 14
src/bk/ConflictDetection.java

@@ -405,33 +405,34 @@ public class ConflictDetection implements AlgorithmStage {
 
     @Override
     public PseudoCodeNode createPseudocodeTree(JTree tree) {
-        PseudoCodeNode root = new PseudoCodeNode("Preprocessing (mark type 1 conflicts)", tree);
+        PseudoCodeNode root = new PseudoCodeNode(TextLayoutHelper.setupPseudoCodeStage("Preprocessing (mark type 1 conflicts)"), tree);
         lines = new PseudoCodeNode[16];
-        lines[ 0 ] = new PseudoCodeNode( "for i=1 to |L|-2 do", tree );
+        String vars[] = { "i", "L", "k0", "l", "l1", "k1", "k", "v" };
+        lines[ 0 ] = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "for i=1 to |L|-2 do", vars ), tree );
         root.add( lines[ 0 ] );
-        lines[ 1 ] = new PseudoCodeNode( "k0 = 0; l = 0;", tree );
+        lines[ 1 ] = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "k0 = 0; l = 0;", vars ), tree );
         lines[ 0 ].add( lines[ 1 ] );
-        lines[ 2 ] = new PseudoCodeNode( "for l1=0 to |L[i+1]|-1 do", tree );
+        lines[ 2 ] = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "for l1=0 to |L[i+1]|-1 do", vars ), tree );
         lines[ 0 ].add( lines[ 2 ] );
-        lines[ 3 ] = new PseudoCodeNode( "if l1==|L[i+1]|-1 or L[i+1][l1] incident to inner segment between L[i+1] and L[i] then", tree );
+        lines[ 3 ] = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "if l1==|L[i+1]|-1 or L[i+1][l1] incident to inner segment between L[i+1] and L[i] then", vars ), tree );
         lines[ 2 ].add( lines[ 3 ] );
-        lines[ 4 ] = new PseudoCodeNode( "k1 = |Li|-1;", tree );
+        lines[ 4 ] = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "k1 = |L[i]|-1;", vars ), tree );
         lines[ 3 ].add( lines[ 4 ] );
-        lines[ 5 ] = new PseudoCodeNode( "if L[i+1][l1] incident to inner segment between L[i+1] and L[i] then", tree );
+        lines[ 5 ] = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "if L[i+1][l1] incident to inner segment between L[i+1] and L[i] then", vars ), tree );
         lines[ 3 ].add( lines[ 5 ] );
-        lines[ 6 ] = new PseudoCodeNode( "k1 = pos(pred(L[i+1][l1])[0]);", tree );
+        lines[ 6 ] = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "k1 = pos(pred(L[i+1][l1])[0]);", vars ), tree );
         lines[ 5 ].add( lines[ 6 ] );
-        lines[ 8 ] = new PseudoCodeNode( "while l <= l1 do", tree );
+        lines[ 8 ] = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "while l <= l1 do", vars ), tree );
         lines[ 3 ].add( lines[ 8 ] );
-        lines[ 9 ] = new PseudoCodeNode( "foreach v in pred(L[i+1][l]) do", tree );
+        lines[ 9 ] = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "foreach v in pred(L[i+1][l]) do", vars ), tree );
         lines[ 8 ].add( lines[ 9 ] );
-        lines[ 10 ] = new PseudoCodeNode( "if k < k0 or k > k1 then mark segment (v,L[i+1][l]);", tree );
+        lines[ 10 ] = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "if k < k0 or k > k1 then mark segment (v,L[i+1][l]);", vars ), tree );
         lines[ 9 ].add( lines[ 10 ] );
-        lines[ 12 ] = new PseudoCodeNode( "l = l+1;", tree );
+        lines[ 12 ] = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "l = l+1;", vars ), tree );
         lines[ 8 ].add( lines[ 12 ] );
-        lines[ 14 ] = new PseudoCodeNode( "k0 = k1;", tree );
+        lines[ 14 ] = new PseudoCodeNode( TextLayoutHelper.setupPseudoCode( "k0 = k1;", vars ), tree );
         lines[ 3 ].add( lines[ 14 ] );
-        lines[ 15 ] = new PseudoCodeNode( "mark conflicts in aubgraphs", tree );
+        lines[ 15 ] = new PseudoCodeNode( TextLayoutHelper.setupPseudoCodeStage( "mark conflicts in subgraphs" ), tree );
         root.add( lines[ 15 ] );
         for( int i = 0; i < graph.getContainedNodes().size(); i++ )
         {

+ 4 - 4
src/bk/ExtremalLayoutCalc.java

@@ -69,13 +69,13 @@ public class ExtremalLayoutCalc implements AlgorithmStage {
     @Override
     public PseudoCodeNode createPseudocodeTree( JTree tree ) {
         if( type == LayoutType.TOP_BOTTOM_LEFT )
-            pseudoCode = new PseudoCodeNode( "Extremal layout: leftmost upper", tree );
+            pseudoCode = new PseudoCodeNode( TextLayoutHelper.setupPseudoCodeStage("Extremal layout: leftmost upper"), tree );
         if( type == LayoutType.TOP_BOTTOM_RIGHT )
-            pseudoCode = new PseudoCodeNode( "Extremal layout: rightmost upper", tree );
+            pseudoCode = new PseudoCodeNode( TextLayoutHelper.setupPseudoCodeStage("Extremal layout: rightmost upper"), tree );
         if( type == LayoutType.BOTTOM_TOP_LEFT )
-            pseudoCode = new PseudoCodeNode( "Extremal layout: leftmost lower", tree );;
+            pseudoCode = new PseudoCodeNode( TextLayoutHelper.setupPseudoCodeStage("Extremal layout: leftmost lower"), tree );;
         if( type == LayoutType.BOTTOM_TOP_RIGHT )
-            pseudoCode = new PseudoCodeNode( "Extremal layout: rightmost lower", tree );
+            pseudoCode = new PseudoCodeNode( TextLayoutHelper.setupPseudoCodeStage("Extremal layout: rightmost lower"), tree );
         bcNode = bc.createPseudocodeTree( tree );
         cpNode = cp.createPseudocodeTree( tree );
         pseudoCode.add( bcNode );

+ 38 - 0
src/lib/TextLayoutHelper.java

@@ -19,4 +19,42 @@ public class TextLayoutHelper {
             return s.substring( 0, lenght );
         return s;
     }
+    
+    private static String[] keywords = { "for", "do", "to", "then", "else", "if", "foreach", "while", "or", "and" };
+    private static String[] delimiter = { "\\+", "\\-", "\\[", "\\]", "\\|", " ", "^", "$", "\\=", "\\,", "\\(", "\\;" };
+    
+    private static String getDelimiterRegex()
+    {
+        String reg = "(";
+        for( String d : delimiter )
+        {
+            reg += d + "|";
+        }
+        reg = reg.substring( 0, reg.length() - 1 ) + ")";
+        return reg;
+    }
+    
+    public static String setupPseudoCodeStage( String s )
+    {
+        return "<html><font color=#FDD017>"+s+"</font></html>";
+    }
+    
+    public static String setupPseudoCode( String s, String[] vars )
+    {
+        System.out.print( s + " -> " );
+        String delimiter = getDelimiterRegex();
+        String ret = "<html>";
+        String current = s.replaceAll( "&", "&amp" ).replaceAll( "<", "&lt").replaceAll( ">", "&gt");
+        for( String k : keywords )
+        {
+            current = current.replaceAll( delimiter + "(" + k + ")" + delimiter, "$1<font color=orange>$2</font>$3" );
+        }
+        for( String v : vars )
+        {
+            current = current.replaceAll( delimiter + "(" + v + ")" + delimiter, "$1<font color=#3BB9FF>$2</font>$3" );
+        }
+        ret += current + "</html>";
+        System.out.println( ret );
+        return ret;
+    }
 }

+ 3 - 2
src/view/PseudoCodeRenderer.java

@@ -110,14 +110,15 @@ public class PseudoCodeRenderer extends DefaultTreeCellRenderer {
         this.setClosedIcon( new ImageIcon( rowNumerImg ) );
         this.setOpenIcon( new ImageIcon( rowNumerImg ) );
         this.setLeafIcon( new ImageIcon( rowNumerImg ) );
-        Component c = super.getTreeCellRendererComponent(tree, value, arg2, arg3, arg4, arg5, arg6);
+        super.getTreeCellRendererComponent(tree, value, arg2, arg3, arg4, arg5, arg6);
         specialColor = null;
         if(node.isSelected()) {
             specialColor = new Color(0x2d6099);
         } else if (node.hasBreakPoint()) {
             specialColor = RenderHelper.BREAKPOINT_COLOR;
         }
-        return c;
+        setText((String)node.getUserObject());
+        return this;
     }
 
 }