File: RevtagParser.php

package info (click to toggle)
php-doc 20250827~git.abe740d%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 71,968 kB
  • sloc: xml: 985,760; php: 25,504; javascript: 671; sh: 177; makefile: 37
file content (105 lines) | stat: -rw-r--r-- 4,075 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
<?php
/**
 *  +----------------------------------------------------------------------+
 *  | Copyright (c) 1997-2023 The PHP Group                                |
 *  +----------------------------------------------------------------------+
 *  | This source file is subject to version 3.01 of the PHP license,      |
 *  | that is bundled with this package in the file LICENSE, and is        |
 *  | available through the world-wide-web at the following url:           |
 *  | https://www.php.net/license/3_01.txt.                                |
 *  | If you did not receive a copy of the PHP license and are unable to   |
 *  | obtain it through the world-wide-web, please send a note to          |
 *  | license@php.net, so we can mail you a copy immediately.              |
 *  +----------------------------------------------------------------------+
 *  | Authors:     André L F S Bacci <ae php.net>                          |
 *  +----------------------------------------------------------------------+
 *  | Description: Parse revision and credits from XML comments.           |
 *  +----------------------------------------------------------------------+
 */

require_once __DIR__ . '/all.php';

class RevtagInfo
{
    public string $revision = "";
    public string $maintainer = "";
    public string $status = "";
    public string $credits = "";
    public array  $errors = [];
}

class RevtagParser
{
    static function parseDir( string $lang , RevcheckFileList $list )
    {
        foreach( $list->iterator() as $entry )
            $entry->revtag = RevtagParser::parseFile( $lang . '/' . $entry->file );
    }

    public static function parseFile( string $filename ): RevtagInfo|null
    {
        $doc = XmlUtil::loadFile( $filename );
        $ret = new RevtagInfo;
        RevtagParser::parseNodeRecurse( $doc , $ret , $filename );
        return $ret;
    }

    public static function parseText( string $contents ): RevtagInfo|null
    {
        $doc = XmlUtil::loadText( $contents );
        $ret = new RevtagInfo;
        RevtagParser::parseNodeRecurse( $doc , $ret );
        return $ret;
    }

    public static function parseNodeRecurse( DOMNode $node , RevtagInfo $ret , $filename = "" )
    {
        if ( $node->nodeType == XML_COMMENT_NODE )
            RevtagParser::parseComment( $node , $ret , $filename );

        foreach( $node->childNodes as $child )
            RevtagParser::parseNodeRecurse( $child , $ret , $filename );
    }

    public static function parseComment( DOMNode $node , RevtagInfo $ret , $filename = "" )
    {
        $text = trim( $node->textContent );

        if ( str_starts_with( $text , "EN-" ) )
        {
            // /EN-Revision:\s*(\S+)\s*Maintainer:\s*(\S+)\s*Status:\s*(\S+)/       // restrict maintainer without spaces
            // /EN-Revision:\s*(\S+)\s*Maintainer:\s(.*?)\sStatus:\s*(\S+)/         // accepts maintainer with spaces

            $match = [];
            $regex = "/EN-Revision:\s*(\S+)\s*Maintainer:\s(.*?)\sStatus:\s*(\S+)/";
            if ( preg_match( $regex , $text , $match ) )
            {
                $ret->revision = trim( $match[1] );
                $ret->maintainer = trim( $match[2] );
                $ret->status = trim( $match[3] );

                if ( $ret->revision != "" && strlen( $ret->revision ) != 40 )
                    $ret->errors[] = "Wrong hash size: {$ret->revision}";
                if ( $ret->maintainer == "" )
                    $ret->errors[] = "Empty maintainer.";
                if ( $ret->status == "" )
                    $ret->errors[] = "Empty status.";
            }
            else
                $ret->errors[] = "No revtag.";
        }

        if ( str_starts_with( $text , "CREDITS:" ) )
        {
            $match = [];
            $regex = "/CREDITS:(.*)/";
            if ( preg_match( $regex , $text , $match ) )
            {
                $ret->credits = trim( $match[1] );

                if ( $ret->credits == "" )
                    $ret->errors[] = "Empty credits.";
            }
        }
    }
}