77 from rexplain .core .explainer import RegexExplainer
88 from rexplain .core .generator import ExampleGenerator
99 from rexplain .core .tester import RegexTester
10+ from rexplain .core .diagram import generate_railroad_diagram , generate_detailed_railroad_diagram
1011 from rexplain import __version__
1112except ImportError as e :
1213 print ("IMPORT ERROR:" , e , file = sys .stderr )
@@ -20,6 +21,10 @@ def generate(self, pattern, count=3):
2021 class RegexTester :
2122 def test (self , pattern , string ):
2223 return type ('Result' , (), {"matches" : True , "reason" : "[Stub] Always matches" , "to_dict" : lambda self : {"matches" : True , "reason" : "[Stub] Always matches" }})()
24+ def generate_railroad_diagram (pattern , output_path = None ):
25+ return f"[Stub] Diagram for: { pattern } "
26+ def generate_detailed_railroad_diagram (pattern , output_path = None ):
27+ return f"[Stub] Detailed diagram for: { pattern } "
2328 __version__ = "unknown"
2429
2530PROJECT_ABOUT = (
@@ -31,7 +36,7 @@ def test(self, pattern, string):
3136def main ():
3237 parser = argparse .ArgumentParser (
3338 description = 'rexplain: Regex explanation toolkit' ,
34- epilog = 'Examples:\n rexplain explain "^\\ d{3}-\\ d{2}-\\ d{4}$" --examples 2\n rexplain test "foo.*" "foobar"\n rexplain --version\n rexplain --about' ,
39+ epilog = 'Examples:\n rexplain explain "^\\ d{3}-\\ d{2}-\\ d{4}$" --examples 2\n rexplain test "foo.*" "foobar"\n rexplain diagram "^ \\ w+$" --output diagram.svg \n rexplain --version\n rexplain --about' ,
3540 formatter_class = argparse .RawTextHelpFormatter
3641 )
3742 parser .add_argument ('--version' , action = 'store_true' , help = 'Show version and exit' )
@@ -54,6 +59,12 @@ def main():
5459 test_parser .add_argument ('pattern' , help = 'Regex pattern to test' )
5560 test_parser .add_argument ('string' , help = 'String to test against the pattern' )
5661
62+ # rexplain diagram "pattern" --output diagram.svg
63+ diagram_parser = subparsers .add_parser ('diagram' , help = 'Generate a railroad diagram for a regex pattern' )
64+ diagram_parser .add_argument ('pattern' , help = 'Regex pattern to visualize' )
65+ diagram_parser .add_argument ('--output' , '-o' , help = 'Output file path for SVG (default: print to stdout)' )
66+ diagram_parser .add_argument ('--detailed' , '-d' , action = 'store_true' , help = 'Generate detailed diagram based on parsed components' )
67+
5768 args = parser .parse_args ()
5869
5970 # Handle global flags
@@ -90,6 +101,17 @@ def main():
90101 output = result .to_dict () if hasattr (result , 'to_dict' ) else result
91102 print (output )
92103 sys .exit (0 if getattr (result , 'matches' , False ) else 1 )
104+ elif args .command == 'diagram' :
105+ if args .detailed :
106+ result = generate_detailed_railroad_diagram (args .pattern , args .output )
107+ else :
108+ result = generate_railroad_diagram (args .pattern , args .output )
109+
110+ if not args .output :
111+ print (result )
112+ else :
113+ print (f"Diagram saved to: { result } " )
114+ sys .exit (0 )
93115 else :
94116 parser .print_help ()
95117 sys .exit (1 )
0 commit comments