@@ -1494,7 +1494,7 @@ public function getClassSynopsisElement(DOMDocument $doc, array $classMap): ?DOM
1494
1494
$ parentClassName = self ::getClassSynopsisFilename ($ parent );
1495
1495
$ includeElement = $ this ->createIncludeElement (
1496
1496
$ doc ,
1497
- "xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class. $ parentClassName')/db:partintro/db:section/db:classsynopsis/db:fieldsynopsis[preceding-sibling::db:classsynopsisinfo[1][@role='comment' and text()='& Properties; ']])) "
1497
+ "xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class. $ parentClassName')/db:partintro/db:section/db:classsynopsis/db:fieldsynopsis[preceding-sibling::db:classsynopsisinfo[1][@role='comment' and text()='Properties']])) "
1498
1498
);
1499
1499
$ classSynopsis ->appendChild ($ includeElement );
1500
1500
}
@@ -1512,7 +1512,7 @@ public function getClassSynopsisElement(DOMDocument $doc, array $classMap): ?DOM
1512
1512
$ classSynopsis ->appendChild (new DOMText ("\n " ));
1513
1513
$ includeElement = $ this ->createIncludeElement (
1514
1514
$ doc ,
1515
- "xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class. $ className')/db:refentry/db:refsect1[@role='description']/descendant::db:constructorsynopsis[not(@role='procedural')] "
1515
+ "xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class. $ className')/db:refentry/db:refsect1[@role='description']/descendant::db:constructorsynopsis[not(@role='procedural')]) "
1516
1516
);
1517
1517
$ classSynopsis ->appendChild ($ includeElement );
1518
1518
}
@@ -1530,7 +1530,7 @@ public function getClassSynopsisElement(DOMDocument $doc, array $classMap): ?DOM
1530
1530
$ classSynopsis ->appendChild (new DOMText ("\n " ));
1531
1531
$ includeElement = $ this ->createIncludeElement (
1532
1532
$ doc ,
1533
- "xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class. $ className')/db:refentry/db:refsect1[@role='description']/descendant::db:destructorsynopsis[not(@role='procedural')] "
1533
+ "xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class. $ className')/db:refentry/db:refsect1[@role='description']/descendant::db:destructorsynopsis[not(@role='procedural')]) "
1534
1534
);
1535
1535
$ classSynopsis ->appendChild ($ includeElement );
1536
1536
}
@@ -2440,7 +2440,150 @@ function generateClassSynopses(array $classMap): array {
2440
2440
*/
2441
2441
function replaceClassSynopses (string $ targetDirectory , array $ classMap ): array
2442
2442
{
2443
- throw new Exception ("Not yet implemented! " );
2443
+ $ classSynopses = [];
2444
+
2445
+ $ it = new RecursiveIteratorIterator (
2446
+ new RecursiveDirectoryIterator ($ targetDirectory ),
2447
+ RecursiveIteratorIterator::LEAVES_ONLY
2448
+ );
2449
+
2450
+ foreach ($ it as $ file ) {
2451
+ $ pathName = $ file ->getPathName ();
2452
+ if (!preg_match ('/\.xml$/i ' , $ pathName )) {
2453
+ continue ;
2454
+ }
2455
+
2456
+ $ xml = file_get_contents ($ pathName );
2457
+ if ($ xml === false ) {
2458
+ continue ;
2459
+ }
2460
+
2461
+ if (stripos ($ xml , "<classsynopsis " ) === false ) {
2462
+ continue ;
2463
+ }
2464
+
2465
+ $ replacedXml = preg_replace (
2466
+ [
2467
+ "/&([A-Za-z0-9._{}%-]+?;)/ " ,
2468
+ "/<(\/)*xi:([A-Za-z]+?)/ "
2469
+ ],
2470
+ [
2471
+ "REPLACED-ENTITY-$1 " ,
2472
+ "<$1XI$2 " ,
2473
+ ],
2474
+ $ xml
2475
+ );
2476
+
2477
+ $ doc = new DOMDocument ();
2478
+ $ doc ->formatOutput = false ;
2479
+ $ doc ->preserveWhiteSpace = true ;
2480
+ $ doc ->validateOnParse = true ;
2481
+ $ success = $ doc ->loadXML ($ replacedXml );
2482
+ if (!$ success ) {
2483
+ echo "Failed opening $ pathName \n" ;
2484
+ continue ;
2485
+ }
2486
+
2487
+ $ docComparator = new DOMDocument ();
2488
+ $ docComparator ->preserveWhiteSpace = false ;
2489
+ $ docComparator ->formatOutput = true ;
2490
+
2491
+ $ classSynopsisElements = [];
2492
+ foreach ($ doc ->getElementsByTagName ("classsynopsis " ) as $ element ) {
2493
+ $ classSynopsisElements [] = $ element ;
2494
+ }
2495
+
2496
+ foreach ($ classSynopsisElements as $ classSynopsis ) {
2497
+ if (!$ classSynopsis instanceof DOMElement) {
2498
+ continue ;
2499
+ }
2500
+
2501
+ $ firstChild = $ classSynopsis ->firstElementChild ;
2502
+ if ($ firstChild === null ) {
2503
+ continue ;
2504
+ }
2505
+ $ firstChild = $ firstChild ->firstElementChild ;
2506
+ if ($ firstChild === null ) {
2507
+ continue ;
2508
+ }
2509
+ $ className = $ firstChild ->textContent ;
2510
+ if (!isset ($ classMap [$ className ])) {
2511
+ continue ;
2512
+ }
2513
+ $ classInfo = $ classMap [$ className ];
2514
+
2515
+ $ newClassSynopsis = $ classInfo ->getClassSynopsisElement ($ doc , $ classMap );
2516
+ if ($ newClassSynopsis === null ) {
2517
+ continue ;
2518
+ }
2519
+
2520
+ // Check if there is any change - short circuit if there is not any.
2521
+
2522
+ $ xml1 = $ doc ->saveXML ($ classSynopsis );
2523
+ $ xml1 = preg_replace (
2524
+ [
2525
+ "/&([A-Za-z0-9._{}%-]+?;)/ " ,
2526
+ "/<xi:([A-Za-z]+?)/ " ,
2527
+ '#</xi:([A-Za-z]+?)# ' ,
2528
+ ],
2529
+ [
2530
+ "REPLACED-ENTITY-$1 " ,
2531
+ "<XI$1 " ,
2532
+ "<XI$1 " ,
2533
+ ],
2534
+ $ xml1
2535
+ );
2536
+ $ docComparator ->loadXML ($ xml1 );
2537
+ $ xml1 = $ docComparator ->saveXML ();
2538
+
2539
+ $ classSynopsis ->parentNode ->replaceChild ($ newClassSynopsis , $ classSynopsis );
2540
+
2541
+ $ xml2 = $ doc ->saveXML ($ newClassSynopsis );
2542
+ $ xml2 = preg_replace (
2543
+ [
2544
+ "/&([A-Za-z0-9._{}%-]+?;)/ " ,
2545
+ "/<xi:([A-Za-z]+?)/ " ,
2546
+ '#</xi:([A-Za-z]+?)# ' ,
2547
+ ],
2548
+ [
2549
+ "REPLACED-ENTITY-$1 " ,
2550
+ "<XI$1 " ,
2551
+ "</XI$1 " ,
2552
+ ],
2553
+ $ xml2
2554
+ );
2555
+
2556
+ $ docComparator ->loadXML ($ xml2 );
2557
+ $ xml2 = $ docComparator ->saveXML ();
2558
+
2559
+
2560
+ if ($ xml1 === $ xml2 ) {
2561
+ continue ;
2562
+ }
2563
+
2564
+ // Return the updated XML
2565
+
2566
+ $ replacedXml = $ doc ->saveXML ();
2567
+
2568
+ $ replacedXml = preg_replace (
2569
+ [
2570
+ "/REPLACED-ENTITY-([A-Za-z0-9._{}%-]+?;)/ " ,
2571
+ "/<phpdoc:classref\s+xmlns:phpdoc= \"([a-z0-9.:\/]+) \"\s+xmlns= \"([a-z0-9.:\/]+) \"\s+xmlns:xi= \"([a-z0-9.:\/]+) \"\s+xml:id= \"([a-z0-9._-]+) \"\s*>/i " ,
2572
+ "/<phpdoc:classref\s+xmlns:phpdoc= \"([a-z0-9.:\/]+) \"\s+xmlns= \"([a-z0-9.:\/]+) \"\s+xmlns:xlink= \"([a-z0-9.:\/]+) \"\s+xmlns:xi= \"([a-z0-9.:\/]+) \"\s+xml:id= \"([a-z0-9._-]+) \"\s*>/i " ,
2573
+ ],
2574
+ [
2575
+ "&$1 " ,
2576
+ "<phpdoc:classref xml:id= \"$4 \" xmlns:phpdoc= \"$1 \" xmlns= \"$2 \" xmlns:xi= \"$4 \"> " ,
2577
+ "<phpdoc:classref xml:id= \"$5 \" xmlns:phpdoc= \"$1 \" xmlns= \"$2 \" xmlns:xlink= \"$3 \" xmlns:xi= \"$4 \"> " ,
2578
+ ],
2579
+ $ replacedXml
2580
+ );
2581
+
2582
+ $ classSynopses [$ pathName ] = $ replacedXml ;
2583
+ }
2584
+ }
2585
+
2586
+ return $ classSynopses ;
2444
2587
}
2445
2588
2446
2589
/**
@@ -2715,13 +2858,12 @@ function initPhpParser() {
2715
2858
$ context ->forceRegeneration = isset ($ options ["f " ]) || isset ($ options ["force-regeneration " ]);
2716
2859
$ context ->forceParse = $ context ->forceRegeneration || $ printParameterStats || $ verify || $ generateClassSynopses || $ replaceClassSynopses || $ generateMethodSynopses || $ replaceMethodSynopses ;
2717
2860
2718
- $ targetClassSynopses = $ argv [$ optind + 1 ] ?? null ;
2719
- if ($ replaceClassSynopses && $ targetClassSynopses === null ) {
2861
+ $ targetSynopses = $ argv [$ argc - 1 ] ?? null ;
2862
+ if ($ replaceClassSynopses && $ targetSynopses === null ) {
2720
2863
die ("A target class synopsis directory must be provided for. \n" );
2721
2864
}
2722
2865
2723
- $ targetMethodSynopses = $ argv [$ optind + 1 + ($ targetClassSynopses !== null )] ?? null ;
2724
- if ($ replaceMethodSynopses && $ targetMethodSynopses === null ) {
2866
+ if ($ replaceMethodSynopses && $ targetSynopses === null ) {
2725
2867
die ("A target method synopsis directory must be provided. \n" );
2726
2868
}
2727
2869
@@ -2884,7 +3026,7 @@ function(?ArgInfo $aliasArg, ?ArgInfo $aliasedArg) use ($aliasFunc, $aliasedFunc
2884
3026
}
2885
3027
2886
3028
if ($ replaceClassSynopses ) {
2887
- $ classSynopses = replaceClassSynopses ($ targetClassSynopses , $ classMap );
3029
+ $ classSynopses = replaceClassSynopses ($ targetSynopses , $ classMap );
2888
3030
2889
3031
foreach ($ classSynopses as $ filename => $ content ) {
2890
3032
if (file_put_contents ($ filename , $ content )) {
@@ -2912,7 +3054,7 @@ function(?ArgInfo $aliasArg, ?ArgInfo $aliasedArg) use ($aliasFunc, $aliasedFunc
2912
3054
}
2913
3055
2914
3056
if ($ replaceMethodSynopses ) {
2915
- $ methodSynopses = replaceMethodSynopses ($ targetMethodSynopses , $ funcMap , $ aliasMap );
3057
+ $ methodSynopses = replaceMethodSynopses ($ targetSynopses , $ funcMap , $ aliasMap );
2916
3058
2917
3059
foreach ($ methodSynopses as $ filename => $ content ) {
2918
3060
if (file_put_contents ($ filename , $ content )) {
0 commit comments