Files
archived-php-langspec/tools/split.php
Peter Kokot be010b4435 Sync final newlines
- Redundant final newlines trimmed into one
- Missing final newlines added where can be added

According to POSIX, a line is a sequence of zero or more non-' <newline>'
characters plus a terminating '<newline>' character. [1] Files should
normally have at least one final newline character although not
mandatory.

[1] http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_206
2018-10-01 20:21:21 +02:00

65 lines
2.2 KiB
PHP

<?php
$data = file($argv[1]);
$filename = null;
$counter = 0;
$split_data = [];
$counts = [];
$filerefs = [];
$filecounts = [];
foreach($data as $line) {
if($line[0] == '#') {
// main header
if($line[1] != '#') {
$filename = sprintf("%02d-%s.md", $counter, strtolower(str_replace(" ", "-", trim(substr($line, 1)))));
echo $filename, "\n";
$counter++;
$split_data[$filename] = '';
}
// sub-header
$refname = trim(ltrim($line, '#'));
$refname = str_replace(" ", "-", $refname);
$refname = strtolower(preg_replace("/[^-_A-Za-z0-9]/", "", $refname));
if(!empty($references[$refname])) {
@$counts[$refname]++;
$orig_refname = $refname;
$refname .= "-".$counts[$refname];
// Local references for repeating names may be different from global ones
if(!isset($filecounts[$filename][$orig_refname])) {
$filecounts[$filename][$orig_refname] = 0;
$filerefs[$filename][$refname] = $orig_refname;
} else {
@$filecounts[$filename][$orig_refname]++;
$filerefs[$filename][$refname] = $orig_refname . "-" . $filecounts[$filename][$orig_refname];
}
}
$references[$refname] = $filename;
}
$split_data[$filename] .= $line;
}
foreach($split_data as $filename => $contents) {
$contents = preg_replace_callback('@\[(.*?)\]\(#(.*?)\)@', function($data) use($references, $filename, $filerefs) {
if(empty($references[$data[2]])) {
return $data[0];
}
if($references[$data[2]]) {
$filepart = $references[$data[2]];
} else {
$filepart = $filename;
}
if(!empty($filerefs[$filepart][$data[2]])) {
// replace global ref with local one
$refname = $filerefs[$filepart][$data[2]];
} else {
$refname = $data[2];
}
if($filepart == $filename) {
$filepart = "";
}
$res = sprintf("[%s](%s#%s)", $data[1], $filepart, $refname);
return $res;
}, $contents);
file_put_contents($filename, $contents);
}