Skip to content

Instantly share code, notes, and snippets.

@rarous
Created March 2, 2011 11:09
Show Gist options
  • Select an option

  • Save rarous/850783 to your computer and use it in GitHub Desktop.

Select an option

Save rarous/850783 to your computer and use it in GitHub Desktop.
Closure deps.js generator
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('//', '/')
}
@stej
Copy link

stej commented Mar 4, 2011

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 ', '

@rarous
Copy link
Author

rarous commented Mar 4, 2011

dík za hint k -join

-replace není k [string].Replace ekvivalentní, protože funguje na regexu

@rarous
Copy link
Author

rarous commented Mar 4, 2011

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...

@stej
Copy link

stej commented Mar 4, 2011

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..

@rarous
Copy link
Author

rarous commented Mar 4, 2011

@stej
Copy link

stej commented Mar 4, 2011

Jak to neni copy paste do konzole, tak jsem hrozně shnilej. Ve chvílích nudy se na to zkusím mrknout :)

@rarous
Copy link
Author

rarous commented Mar 4, 2011

svn co http://closure-library.googlecode.com/svn/trunk/closure/goog goog
Write-JsDeps goog '../../../' @()

@stej
Copy link

stej commented Mar 4, 2011

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 ', '
}
?

@rarous
Copy link
Author

rarous commented Mar 4, 2011

jenže dynamickej lookup má pěknej (negativní) vliv na performance, potřebuju to mít co možná nejrychlejší :)

@stej
Copy link

stej commented Mar 5, 2011

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).

@rarous
Copy link
Author

rarous commented Mar 5, 2011

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 :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment