-
-
Notifications
You must be signed in to change notification settings - Fork 8
/
Inline.R.psx.ps1
85 lines (66 loc) · 2.15 KB
/
Inline.R.psx.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
<#
.SYNOPSIS
R PipeScript Transpiler.
.DESCRIPTION
Transpiles R with Inline PipeScript into R.
Because R Scripts only allow single-line comments, this is done using a pair of comment markers.
# { or # PipeScript{ begins a PipeScript block
# } or # }PipeScript ends a PipeScript block
~~~r
# {
Uncommented lines between these two points will be ignored
# # Commented lines will become PipeScript / PowerShell.
# param($message = "hello world")
# "puts `"$message`""
# }
~~~
.EXAMPLE
Invoke-PipeScript {
$rScript = '
# {
Uncommented lines between these two points will be ignored
# # Commented lines will become PipeScript / PowerShell.
# param($message = "hello world")
# "print(`"$message`")"
# }
'
[OutputFile('.\HelloWorld.ps1.r')]$rScript
}
Invoke-PipeScript .\HelloWorld.ps1.r
#>
[ValidatePattern('\.r$')]
param(
# The command information. This will include the path to the file.
[Parameter(Mandatory,ValueFromPipeline)]
[Management.Automation.CommandInfo]
$CommandInfo,
# A dictionary of parameters.
[Collections.IDictionary]
$Parameter,
# A list of arguments.
[PSObject[]]
$ArgumentList
)
begin {
# We start off by declaring a number of regular expressions:
$startComment = '(?>\#\s{0,}(?:PipeScript)?\s{0,}\{)'
$endComment = '(?>\#\s{0,}\}\s{0,}(?:PipeScript)?\s{0,})'
$startRegex = "(?<PSStart>${startComment})"
$endRegex = "(?<PSEnd>${endComment})"
# Create a splat containing arguments to the core inline transpiler
$Splat = [Ordered]@{
StartPattern = $startRegex
EndPattern = $endRegex
# Using -LinePattern will skip any inline code not starting with #
LinePattern = "^\s{0,}\#\s{0,}"
}
}
process {
# Add parameters related to the file
$Splat.SourceFile = $commandInfo.Source -as [IO.FileInfo]
$Splat.SourceText = [IO.File]::ReadAllText($commandInfo.Source)
if ($Parameter) { $splat.Parameter = $Parameter }
if ($ArgumentList) { $splat.ArgumentList = $ArgumentList }
# Call the core inline transpiler.
.>PipeScript.Inline @Splat
}