-
-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathCodeBlock.regex.ps1
79 lines (66 loc) · 1.31 KB
/
CodeBlock.regex.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
<#
.Synopsis
Matches a code block
.Description
Matches a Markdown code block.
Code blocks can start/end with 3 or more backticks or tildas, or 4 indented whitespaces
#>
param(
# If set, will only match fenced code blocks.
[Parameter(ValueFromPipelineByPropertyName)]
[switch]
$Fenced,
# The languages
[Parameter(ValueFromPipelineByPropertyName)]
[Alias('InfoText')]
[string]
$Language
)
process {
$fencedBlock =
@"
(?<FenceChar>[``\~]){3,} # Code fences start with tildas or backticks, repeated at least 3 times
$(
if (-not $Language) {
@"
(?<Language>[\S]+)? # Match an optional language (non-whitespace characters)
"@
} else {
@"
(?<Language> # Match a specific language
$language
)
"@
}
)
\s{0,} # Match but do not capture initial whitespace.
(?<Code> # Capture the <Code> block
(?:.|\s){0,}? # This is anything until
(?=\z|\k<FenceChar>{3,}) # the end of the string or the same matching fence chars
)
(?>\z|\k<FenceChar>{3,})
"@
$fourSpacesBlock = @"
(?m)
(^\s{4}(?<Code>\s{0,}\S.+?)$){1,} # Match one or more lines starting with at least four whitespace characters
"@
if ($Language) {
@"
(?>
$($fencedBlock -join '
|
')
)
"@
} else {
@"
(?>
$($fencedBlock -join '
|
')
|
$fourSpacesBlock
)
"@
}
}