$ext) { $line_linux = [ "{$ext_name}", implode('
', $ext['ext-depends-linux'] ?? $ext['ext-depends-unix'] ?? $ext['ext-depends'] ?? []), implode('
', $ext['ext-suggests-linux'] ?? $ext['ext-suggests-unix'] ?? $ext['ext-suggests'] ?? []), implode('
', $ext['lib-depends-linux'] ?? $ext['lib-depends-unix'] ?? $ext['lib-depends'] ?? []), implode('
', $ext['lib-suggests-linux'] ?? $ext['lib-suggests-unix'] ?? $ext['lib-suggests'] ?? []), ]; $this->applyMaxLen($max_linux, $line_linux); if ($this->isSupported($ext, 'Linux') && !$this->isEmptyLine($line_linux)) { $md_lines_linux[] = $line_linux; } $line_macos = [ "{$ext_name}", implode('
', $ext['ext-depends-macos'] ?? $ext['ext-depends-unix'] ?? $ext['ext-depends'] ?? []), implode('
', $ext['ext-suggests-macos'] ?? $ext['ext-suggests-unix'] ?? $ext['ext-suggests'] ?? []), implode('
', $ext['lib-depends-macos'] ?? $ext['lib-depends-unix'] ?? $ext['lib-depends'] ?? []), implode('
', $ext['lib-suggests-macos'] ?? $ext['lib-suggests-unix'] ?? $ext['lib-suggests'] ?? []), ]; $this->applyMaxLen($max_macos, $line_macos); if ($this->isSupported($ext, 'macOS') && !$this->isEmptyLine($line_macos)) { $md_lines_macos[] = $line_macos; } $line_windows = [ "{$ext_name}", implode('
', $ext['ext-depends-windows'] ?? $ext['ext-depends-win'] ?? $ext['ext-depends'] ?? []), implode('
', $ext['ext-suggests-windows'] ?? $ext['ext-suggests-win'] ?? $ext['ext-suggests'] ?? []), implode('
', $ext['lib-depends-windows'] ?? $ext['lib-depends-win'] ?? $ext['lib-depends'] ?? []), implode('
', $ext['lib-suggests-windows'] ?? $ext['lib-suggests-win'] ?? $ext['lib-suggests'] ?? []), ]; $this->applyMaxLen($max_windows, $line_windows); if ($this->isSupported($ext, 'Windows') && !$this->isEmptyLine($line_windows)) { $md_lines_windows[] = $line_windows; } $line_freebsd = [ "{$ext_name}", implode('
', $ext['ext-depends-freebsd'] ?? $ext['ext-depends-bsd'] ?? $ext['ext-depends-unix'] ?? $ext['ext-depends'] ?? []), implode('
', $ext['ext-suggests-freebsd'] ?? $ext['ext-suggests-bsd'] ?? $ext['ext-suggests-unix'] ?? $ext['ext-suggests'] ?? []), implode('
', $ext['lib-depends-freebsd'] ?? $ext['lib-depends-bsd'] ?? $ext['lib-depends-unix'] ?? $ext['lib-depends'] ?? []), implode('
', $ext['lib-suggests-freebsd'] ?? $ext['lib-suggests-bsd'] ?? $ext['lib-suggests-unix'] ?? $ext['lib-suggests'] ?? []), ]; $this->applyMaxLen($max_freebsd, $line_freebsd); if ($this->isSupported($ext, 'BSD') && !$this->isEmptyLine($line_freebsd)) { $md_lines_freebsd[] = $line_freebsd; } } // Generate markdown if (!empty($md_lines_linux)) { $content .= "### Linux\n\n"; $content .= '| '; $pads = ['Extension Name', 'Required Extensions', 'Suggested Extensions', 'Required Libraries', 'Suggested Libraries']; // 生成首行 $content .= implode(' | ', array_map(fn ($i, $pad) => str_pad($pad, $max_linux[$i]), array_keys($pads), $pads)); $content .= ' |' . PHP_EOL; // 生成第二行表格分割符 | --- | --- | --- | --- | --- | $content .= '| '; $content .= implode(' | ', array_map(fn ($i, $pad) => str_pad('', $max_linux[$i], '-'), array_keys($pads), $pads)); $content .= ' |' . PHP_EOL; foreach ($md_lines_linux as $line) { $content .= '| ' . implode(' | ', array_map(fn ($i, $pad) => str_pad($line[$i], $max_linux[$i]), array_keys($line), $line)) . ' |' . PHP_EOL; } } if (!empty($md_lines_macos)) { $content .= "\n\n### macOS\n\n"; $content .= '| '; $pads = ['Extension Name', 'Required Extensions', 'Suggested Extensions', 'Required Libraries', 'Suggested Libraries']; // 生成首行 $content .= implode(' | ', array_map(fn ($i, $pad) => str_pad($pad, $max_macos[$i]), array_keys($pads), $pads)); $content .= ' |' . PHP_EOL; // 生成第二行表格分割符 | --- | --- | --- | --- | --- | $content .= '| '; $content .= implode(' | ', array_map(fn ($i, $pad) => str_pad('', $max_macos[$i], '-'), array_keys($pads), $pads)); $content .= ' |' . PHP_EOL; foreach ($md_lines_macos as $line) { $content .= '| ' . implode(' | ', array_map(fn ($i, $pad) => str_pad($line[$i], $max_macos[$i]), array_keys($line), $line)) . ' |' . PHP_EOL; } } if (!empty($md_lines_windows)) { $content .= "\n\n### Windows\n\n"; $content .= '| '; $pads = ['Extension Name', 'Required Extensions', 'Suggested Extensions', 'Required Libraries', 'Suggested Libraries']; // 生成首行 $content .= implode(' | ', array_map(fn ($i, $pad) => str_pad($pad, $max_windows[$i]), array_keys($pads), $pads)); $content .= ' |' . PHP_EOL; // 生成第二行表格分割符 | --- | --- | --- | --- | --- | $content .= '| '; $content .= implode(' | ', array_map(fn ($i, $pad) => str_pad('', $max_windows[$i], '-'), array_keys($pads), $pads)); $content .= ' |' . PHP_EOL; foreach ($md_lines_windows as $line) { $content .= '| ' . implode(' | ', array_map(fn ($i, $pad) => str_pad($line[$i], $max_windows[$i]), array_keys($line), $line)) . ' |' . PHP_EOL; } } if (!empty($md_lines_freebsd)) { $content .= "\n\n### FreeBSD\n\n"; $content .= '| '; $pads = ['Extension Name', 'Required Extensions', 'Suggested Extensions', 'Required Libraries', 'Suggested Libraries']; // 生成首行 $content .= implode(' | ', array_map(fn ($i, $pad) => str_pad($pad, $max_freebsd[$i]), array_keys($pads), $pads)); $content .= ' |' . PHP_EOL; // 生成第二行表格分割符 | --- | --- | --- | --- | --- | $content .= '| '; $content .= implode(' | ', array_map(fn ($i, $pad) => str_pad('', $max_freebsd[$i], '-'), array_keys($pads), $pads)); $content .= ' |' . PHP_EOL; foreach ($md_lines_freebsd as $line) { $content .= '| ' . implode(' | ', array_map(fn ($i, $pad) => str_pad($line[$i], $max_freebsd[$i]), array_keys($line), $line)) . ' |' . PHP_EOL; } } $this->output->writeln($content); return static::SUCCESS; } private function applyMaxLen(array &$max, array $lines): void { foreach ($max as $k => $v) { $max[$k] = max($v, strlen($lines[$k])); } } private function isSupported(array $ext, string $os): bool { return !in_array($ext['support'][$os] ?? 'yes', ['no', 'wip']); } private function isEmptyLine(array $line): bool { return $line[1] === '' && $line[2] === '' && $line[3] === '' && $line[4] === ''; } }