-
-
Save rarous/850783 to your computer and use it in GitHub Desktop.
| function Write-JsDeps { | |
| param($root, $prefix, $exclusion) | |
| "// This file was autogenerated" | |
| "// Please do not edit." | |
| Get-ChildItem $root -Recurse -Include *.js -Exclude $exclusion | sort FullName | | |
| %{ Create-DepsLine $root $prefix $_.FullName } | |
| } | |
| function Create-DepsLine { | |
| param($root, $prefix, $path) | |
| $prefixedPath = Get-PrefixedPath $root $prefix $path | |
| $source = Get-Content $path -ReadCount 0 | |
| $provides = Parse 'provide' $source | |
| $requires = Parse 'require' $source | |
| "goog.addDependency('$prefixedPath', [$provides], [$requires]);" | |
| } | |
| $parsers = @{ provide = [regex] "goog\.provide\(([^\)]+)\)"; require = [regex] "goog\.require\(([^\)]+)\)" } | |
| function Parse { | |
| param($what, $from) | |
| ($parsers[$what].Matches($from ) | %{ $_.Groups[1].Value }) -join ', ' | |
| } | |
| function Get-PrefixedPath { | |
| $path.Replace($root, $prefix).Replace('\', '/').Replace('//', '/') | |
| } |
dík za hint k -join
-replace není k [string].Replace ekvivalentní, protože funguje na regexu
BTW, nešlo by výsledek matches nějak elegantně přes select -expandproperty transformovat rovnou na array? Nějak se mi to nepodařilo...
Jo, ten replace je regexi. Jedna z pomucek je
'[]{[]{[]{' -replace [regex]::Escape('[]{'), 'a'
ale proc pak fakt nepouzit ten stringovej replace, to je pravda :)
K tomu matches: kdyz das priklad, kterej si tu muzu spustit, tak se muzu mrknout..
Jak to neni copy paste do konzole, tak jsem hrozně shnilej. Ve chvílích nudy se na to zkusím mrknout :)
svn co http://closure-library.googlecode.com/svn/trunk/closure/goog goog
Write-JsDeps goog '../../../' @()
Zkouším. Poznámka:
PowerShell má dynamickej lookup proměnných. Takže $prefix si s klidným srdcem předávat nemusíš (a teď doufám, že se nepletu ;)).
K tomu array - tos myslel něco jako
function Parse {
param($what, $from)
($parsers[$what].Matches($from ) | %{ $_.Groups[1].Value }) -join ', '
}
?
jenže dynamickej lookup má pěknej (negativní) vliv na performance, potřebuju to mít co možná nejrychlejší :)
JJJJSK JKDJKJKDJDJKDJKDJK DJKLJKLJLKJKDJDLKJDJDKLJDKJLKDJKDJLKDJDJLK JDLJDKJDKJDKJDKJKJDKLJDLLLLLKJCKJCK JLCJCJCLLKJKJKJDJFKLJKJKJLKFKJFKJKLFJFKLJLKJ LJFJLJJJFLF
Tak to ti napsala dcera :) A teď já.
Dynamic lookup přece nemůže natolik zpomalit, ne? :) Každopádně pokud někdo chce velkou rychlost, tak PowerShell není dobrá volba (většinou).
Nepotřebuju velkou rychlost, ale pokud to běží 5 s místo 9 s tak jsem radši. :) Ta původní verze (opis Pythonu) běžela něco kolem 20 s a to je strašně moc. :)
Jinak díky dcerce a že pozdravuju :)
Jen taková poznámka - už jsem viděl vícekrát, že -include a -recurse (+ případně -exclude) dohromady někdy nefungují správně. Osobně bych šel do -filter a -recurse.
A jen pro obohacení mysli: existují operátory -join (spojední řetězců) a -replace (regex caseinsensitive replace). Jo a return je zbytečnej. Výsledek každe expression je propagován výš.
return $path.Replace($root, $prefix).Replace('', '/').Replace('//', '/')
->
$path -replace $root,$prefix -replace '','/ -replace '//',!/'
return [string]::Join(', ', $result)
->
$result -join ', '