code: protected function resortChangelog($changelog)
      {
          // cleanup whitespace
          foreach ($changelog as $i => $line) {
              $changelog[$i] = rtrim($line);
          }
          $changelog = array_filter($changelog);
  
          $i = 0;
          ArrayHelper::multisort($changelog, function ($line) use (&$i) {
              if (preg_match('/^- (Chg|Enh|Bug|New)( #\d+(, #\d+)*)?: .+/', $line, $m)) {
                  $o = ['Bug' => 'C', 'Enh' => 'D', 'Chg' => 'E', 'New' => 'F'];
                  return $o[$m[1]] . ' ' . (!empty($m[2]) ? $m[2] : 'AAAA' . $i++);
              }
  
              return 'B' . $i++;
          }, SORT_ASC, SORT_NATURAL);
  
          // re-add leading and trailing lines
          array_unshift($changelog, '');
          $changelog[] = '';
          $changelog[] = '';
  
          return $changelog;
      }
docs: Ensure sorting of the changelog lines.
  @param string[] $changelog
  @return string[]