Ik heb een groot aantal php bestanden met een javadoc-style beschrijving bovenin:
De vorm is altijd hetzelfde: achter elk @keyword volgt direct de inhoud, behalve bij @file (want daar zit een newline achter). Ik wil nu de waardes van @file en @version uitlezen. Momenteel doe ik dat met onderstaande functie.
Omdat het aantal newlines bij de @file inhoud onbekend is, wordt alles gepakt tot aan @author. Hier zijn twee problemen mee: de description bevat nu ook telkens de string "@file". Hoe kan ik die eruit laten?
Ten tweede: als iemand nu eens niet de @author tag als eerste keyword gebruikt na @file, loopt dit in de soep. Ik zit eraan te denken of er geen generiekere manier is om een commentblok uit te lezen. Zo zou ik een array kunnen maken met alle toegestane keywords (@file, @author, @version, @todo, etc.) en dan alle keywords met een generieke regex uitlezen en in een array stoppen. Dan kan ik daarna kijken welke ik wel of niet wil doorsturen naar een andere functie.
Een vraag hierbij is: is zo'n generieke regex de beste oplossing hier en wie kan mij daar eventueel mee op weg helpen?
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
| /** * @file * Provides a toolbar that shows the top-level administration menu items and * links from other modules. * * Hier zou nog meer file-info kunnen staan. * * @author tweakerert <tweakerert@hotmail.com> * @version 23:47 29-12-2009 * @todo make some clever additions * @example admin.menu.toolbar([array]) */ |
De vorm is altijd hetzelfde: achter elk @keyword volgt direct de inhoud, behalve bij @file (want daar zit een newline achter). Ik wil nu de waardes van @file en @version uitlezen. Momenteel doe ik dat met onderstaande functie.
Omdat het aantal newlines bij de @file inhoud onbekend is, wordt alles gepakt tot aan @author. Hier zijn twee problemen mee: de description bevat nu ook telkens de string "@file". Hoe kan ik die eruit laten?
Ten tweede: als iemand nu eens niet de @author tag als eerste keyword gebruikt na @file, loopt dit in de soep. Ik zit eraan te denken of er geen generiekere manier is om een commentblok uit te lezen. Zo zou ik een array kunnen maken met alle toegestane keywords (@file, @author, @version, @todo, etc.) en dan alle keywords met een generieke regex uitlezen en in een array stoppen. Dan kan ik daarna kijken welke ik wel of niet wil doorsturen naar een andere functie.
Een vraag hierbij is: is zo'n generieke regex de beste oplossing hier en wie kan mij daar eventueel mee op weg helpen?
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| function module_info() { $return = array(); foreach (module_list() as $module) { $data = implode('', file(MODULE_PATH. "$module/$module.module")); preg_match('/\/\*\*(.+)(?=@author)/is', $data, $description); preg_match('/@version(.*)/i', $data, $version); $description = trim(preg_replace('/\r?\n *\* */', ' ', $description[1])); $version = trim($version[1]); if (isset($description) && isset($version)) { $return[] = array( 'description' => $description, 'version' => $version ); } } return $return; } |