diff --git a/lib/CProject.php b/lib/CProject.php index ab88159..e0b35d5 100644 --- a/lib/CProject.php +++ b/lib/CProject.php @@ -43,6 +43,7 @@ class CProject { $this->longdesc = file_get_contents($this->dir.'README.txt'); $this->longdesc = str_replace("\r", "", $this->longdesc); // filter windows CR + $this->longdesc = preg_replace("~[\s\t]*$~s", "", $this->longdesc); // filter trailing spaces at line endings // Guess 'last update' time if (preg_match('~\n(\d\d\d\d-\d\d-\d\d)~', $this->longdesc, $matches)) { @@ -94,7 +95,7 @@ class CProject { while(strpos($this->longdesc, "\n\n\n") !== false) { $this->longdesc = str_replace("\n\n\n", "\n\n", $this->longdesc); } - $this->longdesc = rtrim($this->longdesc, "\n"); + $this->longdesc = rtrim($this->longdesc, "\n")."\n"; $this->prefix_html = $prefix_html; @@ -146,7 +147,10 @@ class CProject { // then move the files // A release entry is marked by any string following the date field. - preg_match_all('~^(\d\d\d\d-\d\d-\d\d):? (.+?)\n[\s\t]*\n~ms', $this->longdesc, $matches, PREG_SET_ORDER); + // Add one more NL than we really want, for regex reasons + $this->longdesc .= "\n"; + + preg_match_all('~^(\d\d\d\d-\d\d-\d\d)\s?:? (.+?)\n\n~ms', $this->longdesc, $matches, PREG_SET_ORDER); do { // Ensure changelog exists @@ -167,12 +171,21 @@ class CProject { break; } - // Ensure all downloads can be assigned to tags + // Ensure all downloads can be assigned to tags. + // In the event of a download matching multiple tags, it'll + // be assigned to the newest (topmost) entry $found_idx = []; + $render_per_tag = []; foreach($this->downloads as $idx => $filename) { foreach(array_keys($known_tags) as $tagname) { if (stripos($filename, $tagname) !== false) { - $found_idx[$filename] = true; + $found_idx[$idx] = $tagname; + + if (! isset($render_per_tag[$tagname])) { + $render_per_tag[$tagname] = []; + } + $render_per_tag[$tagname][$idx] = $filename; + break; // next file } } } @@ -191,18 +204,30 @@ class CProject { ); } + $this->longdesc = substr($this->longdesc, 0, strlen($this->longdesc)-1); // Strip the extra NL we added + $this->longdesc = text2html($this->longdesc); foreach($known_tags as $tag_name => $tag_idx) { - $this->longdesc = str_replace('${{TAG_'.$tag_idx.'}}', $this->renderDownloadsBlock(false, $tag_name), $this->longdesc); + $this->longdesc = str_replace( + '${{TAG_'.$tag_idx.'}}', + $this->renderDownloadsBlock($render_per_tag[$tag_name], false), + $this->longdesc + ); } + $this->longdesc = str_replace("\n
", "", $this->longdesc); + // Skip displaying the global downloads area // This flag also indicates that the content has been pre-HTMLified $this->downloads_section_was_replaced = true; - error_log("[".$this->projname."] successful upgrade\n"); + // Successful upgrade } while(false); + + if (! $this->downloads_section_was_replaced) { + $this->longdesc = substr($this->longdesc, 0, strlen($this->longdesc)-1); // Strip the extra NL we added + } } public function numDownloads() { @@ -256,18 +281,7 @@ class CProject { } } - public function renderDownloadsBlock($include_header=false, $filter='') { - $render_downloads = []; - if (strlen($filter)) { - foreach($this->downloads as $idx => $filename) { - if (stripos($filename, $filter) !== false) { - $render_downloads[$idx] = $filename; - } - } - } else { - $render_downloads = $this->downloads; - } - + public function renderDownloadsBlock($render_downloads, $include_header=false) { if (! count($render_downloads)) { return; } @@ -309,12 +323,14 @@ class CProject { -

+
+ +
downloads_section_was_replaced) { ?> - renderDownloadsBlock(true, '')?> + renderDownloadsBlock($this->downloads, true)?>