private static function collectArticlePaths(string $root) : Collection
    {
        return Collection::make(Util::getFileList($root, ['md']))->map(function ($item) {
            return
                preg_match('/(.*)\/([0-9]{4}\/[0-9]{2}\/\w+)\/article\.md$/', $item, $m) === 1
                    && file_exists("{$m[1]}/{$m[2]}/config.yml")
                ? "{$m[1]}/{$m[2]}"
                : null;
        })->filter();
    }
private static function collectArticlePaths(string $root) : Collection
    {
        return Collection::make(Util::getFileList($root, ['md']))->map(function ($item) {
            return
                preg_match('/(.*)\/([0-9]{4}\/[0-9]{2}\/\w+)\/article\.md$/', $item, $m) === 1
                    && file_exists("{$m[1]}/{$m[2]}/config.yml")
                ? "{$m[1]}/{$m[2]}"
                : null;
        })->filter();
    }
private static function collectArticlePaths ( string $ root ) : Collection { return Collection :: make ( Util :: getFileList ( $ root , [ 'md' ] ) ) -> map ( function ( $ item ) { return preg_match ( '/(.*)\/([0-9]{4}\/[0-9]{2}\/\w+)\/article\.md$/' , $ item , $ m ) === 1 && file_exists ( "{$m[1]}/{$m[2]}/config.yml" ) ? "{$m[1]}/{$m[2]}" : null ; } ) -> filter ( ) ; }
collect article paths
@param  string     $root path of contents/articles
@return Collection       article paths
collect article paths