@@ -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,145 @@ 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
+ ],
2528
+ [
2529
+ "REPLACED-ENTITY-$1 " ,
2530
+ "<$1XI$2 " ,
2531
+ ],
2532
+ $ xml1
2533
+ );
2534
+ $ docComparator ->loadXML ($ xml1 );
2535
+ $ xml1 = $ docComparator ->saveXML ();
2536
+
2537
+ $ classSynopsis ->parentNode ->replaceChild ($ newClassSynopsis , $ classSynopsis );
2538
+
2539
+ $ xml2 = $ doc ->saveXML ($ newClassSynopsis );
2540
+ $ xml2 = preg_replace (
2541
+ [
2542
+ "/&([A-Za-z0-9._{}%-]+?;)/ " ,
2543
+ "/<(\/)*xi:([A-Za-z]+?)/ " ,
2544
+ ],
2545
+ [
2546
+ "REPLACED-ENTITY-$1 " ,
2547
+ "<$1XI$2 " ,
2548
+ ],
2549
+ $ xml2
2550
+ );
2551
+
2552
+ $ docComparator ->loadXML ($ xml2 );
2553
+ $ xml2 = $ docComparator ->saveXML ();
2554
+
2555
+ if ($ xml1 === $ xml2 ) {
2556
+ continue ;
2557
+ }
2558
+
2559
+ // Return the updated XML
2560
+
2561
+ $ replacedXml = $ doc ->saveXML ();
2562
+
2563
+ $ replacedXml = preg_replace (
2564
+ [
2565
+ "/REPLACED-ENTITY-([A-Za-z0-9._{}%-]+?;)/ " ,
2566
+ "/<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 " ,
2567
+ "/<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 " ,
2568
+ ],
2569
+ [
2570
+ "&$1 " ,
2571
+ "<phpdoc:classref xml:id= \"$4 \" xmlns:phpdoc= \"$1 \" xmlns= \"$2 \" xmlns:xi= \"$4 \"> " ,
2572
+ "<phpdoc:classref xml:id= \"$5 \" xmlns:phpdoc= \"$1 \" xmlns= \"$2 \" xmlns:xlink= \"$3 \" xmlns:xi= \"$4 \"> " ,
2573
+ ],
2574
+ $ replacedXml
2575
+ );
2576
+
2577
+ $ classSynopses [$ pathName ] = $ replacedXml ;
2578
+ }
2579
+ }
2580
+
2581
+ return $ classSynopses ;
2444
2582
}
2445
2583
2446
2584
/**
@@ -2715,13 +2853,12 @@ function initPhpParser() {
2715
2853
$ context ->forceRegeneration = isset ($ options ["f " ]) || isset ($ options ["force-regeneration " ]);
2716
2854
$ context ->forceParse = $ context ->forceRegeneration || $ printParameterStats || $ verify || $ generateClassSynopses || $ replaceClassSynopses || $ generateMethodSynopses || $ replaceMethodSynopses ;
2717
2855
2718
- $ targetClassSynopses = $ argv [$ optind + 1 ] ?? null ;
2719
- if ($ replaceClassSynopses && $ targetClassSynopses === null ) {
2856
+ $ targetSynopses = $ argv [$ argc - 1 ] ?? null ;
2857
+ if ($ replaceClassSynopses && $ targetSynopses === null ) {
2720
2858
die ("A target class synopsis directory must be provided for. \n" );
2721
2859
}
2722
2860
2723
- $ targetMethodSynopses = $ argv [$ optind + 1 + ($ targetClassSynopses !== null )] ?? null ;
2724
- if ($ replaceMethodSynopses && $ targetMethodSynopses === null ) {
2861
+ if ($ replaceMethodSynopses && $ targetSynopses === null ) {
2725
2862
die ("A target method synopsis directory must be provided. \n" );
2726
2863
}
2727
2864
@@ -2884,7 +3021,7 @@ function(?ArgInfo $aliasArg, ?ArgInfo $aliasedArg) use ($aliasFunc, $aliasedFunc
2884
3021
}
2885
3022
2886
3023
if ($ replaceClassSynopses ) {
2887
- $ classSynopses = replaceClassSynopses ($ targetClassSynopses , $ classMap );
3024
+ $ classSynopses = replaceClassSynopses ($ targetSynopses , $ classMap );
2888
3025
2889
3026
foreach ($ classSynopses as $ filename => $ content ) {
2890
3027
if (file_put_contents ($ filename , $ content )) {
@@ -2912,7 +3049,7 @@ function(?ArgInfo $aliasArg, ?ArgInfo $aliasedArg) use ($aliasFunc, $aliasedFunc
2912
3049
}
2913
3050
2914
3051
if ($ replaceMethodSynopses ) {
2915
- $ methodSynopses = replaceMethodSynopses ($ targetMethodSynopses , $ funcMap , $ aliasMap );
3052
+ $ methodSynopses = replaceMethodSynopses ($ targetSynopses , $ funcMap , $ aliasMap );
2916
3053
2917
3054
foreach ($ methodSynopses as $ filename => $ content ) {
2918
3055
if (file_put_contents ($ filename , $ content )) {
0 commit comments