-
-
Notifications
You must be signed in to change notification settings - Fork 2.3k
/
Copy pathgenerate_accessors_phpdoc.php
127 lines (110 loc) · 4.11 KB
/
generate_accessors_phpdoc.php
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
<?php
$nFiles = 0;
$nFilesTotal = 0;
$nClasses = 0;
$nClassesTotal = 0;
file_put_contents(
dirname(__FILE__) . '/phpdoc.txt',
getPhpDocForDir(dirname(dirname(__FILE__)) . '/framework') . getPhpDocStats()
// getPhpDocForDir(dirname(dirname(__FILE__)) . '/framework/caching') . getPhpDocStats()
// getPhpDocForDir(dirname(dirname(__FILE__)) . '/framework/base/CModel.php') . getPhpDocStats()
);
function getPhpDocStats()
{
global $nFiles, $nFilesTotal, $nClasses, $nClassesTotal;
return "\n\nComments for $nClasses classes in $nFiles files (processed $nClassesTotal classes in $nFilesTotal files)\n";
}
function getPhpDocForDir($dirName)
{
global $nFiles, $nFilesTotal;
$phpdocDir = "";
$files = new RegexIterator(
new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($dirName)
), '#^.+\.php$#i', RecursiveRegexIterator::GET_MATCH);
foreach ($files as $file) {
$phpdocFile = getPhpDocForFile($file[0]);
if ($phpdocFile != "") {
$phpdocDir .= "\n[ " . $file[0] . " ]\n";
$phpdocDir .= $phpdocFile;
$nFiles++;
}
$nFilesTotal++;
}
return $phpdocDir;
}
function getPhpDocForFile($fileName)
{
global $nClasses, $nClassesTotal;
$phpdoc = "";
$file = str_replace("\r", "", str_replace("\t", " ", file_get_contents($fileName, true)));
$classes = match('#\n(?:abstract )?class (?<name>\w+) extends .+\{(?<content>.+)\n\}(\n|$)#', $file);
foreach ($classes as &$class) {
$gets = match(
'#\* @return (?<type>\w+)(?: (?<comment>(?:(?!\*/|\* @).)+?)(?:(?!\*/).)+|[\s\n]*)\*/' .
'[\s\n]{2,}public function (?<kind>get)(?<name>\w+)\((?:,? ?\$\w+ ?= ?[^,]+)*\)#',
$class['content']);
$sets = match(
'#\* @param (?<type>\w+) \$\w+(?: (?<comment>(?:(?!\*/|\* @).)+?)(?:(?!\*/).)+|[\s\n]*)\*/' .
'[\s\n]{2,}public function (?<kind>set)(?<name>\w+)\(\$\w+(?:, ?\$\w+ ?= ?[^,]+)*\)#',
$class['content']);
$acrs = array_merge($gets, $sets);
//print_r($acrs); continue;
$props = array();
foreach ($acrs as &$acr) {
$acr['name'] = camelCase($acr['name']);
$acr['comment'] = trim(preg_replace('#(^|\n)\s+\*\s?#', '$1 * ', $acr['comment']));
$props[$acr['name']][$acr['kind']] = array(
'type' => $acr['type'],
'comment' => fixSentence($acr['comment']),
);
}
/*foreach ($props as $propName => &$prop) // I don't like write-only props...
if (!isset($prop['get']))
unset($props[$propName]);*/
if (count($props) > 0) {
$phpdoc .= "\n" . $class['name'] . ":\n";
$phpdoc .= " *\n";
foreach ($props as $propName => &$prop) {
$phpdoc .= ' * @';
/*if (isset($prop['get']) && isset($prop['set'])) // Few IDEs support complex syntax
$phpdoc .= 'property';
elseif (isset($prop['get']))
$phpdoc .= 'property-read';
elseif (isset($prop['set']))
$phpdoc .= 'property-write';*/
$phpdoc .= 'property';
$phpdoc .= ' ' . getPropParam($prop, 'type') . " $$propName " . getPropParam($prop, 'comment') . "\n";
}
$phpdoc .= " *\n";
$nClasses++;
}
$nClassesTotal++;
}
return $phpdoc;
}
function match($pattern, $subject)
{
$sets = array();
preg_match_all($pattern . 'suU', $subject, $sets, PREG_SET_ORDER);
foreach ($sets as &$set)
foreach ($set as $i => $match)
if (is_numeric($i) /*&& $i != 0*/)
unset($set[$i]);
return $sets;
}
function camelCase($str)
{
return strtolower(substr($str, 0, 1)) . substr($str, 1);
}
function fixSentence($str)
{
if ($str == '')
return '';
return strtoupper(substr($str, 0, 1)) . substr($str, 1) . ($str[strlen($str) - 1] != '.' ? '.' : '');
}
function getPropParam($prop, $param)
{
return isset($prop['get']) ? $prop['get'][$param] : $prop['set'][$param];
}
?>