package main
import (
"regexp"
"fmt"
)
func main() {
var re = regexp.MustCompile(`(?m)^([ ]{6})(- )((?!name)\w+[:](?:[ ]*(?=\n\1[ ]{4}\S)|[ ]*\S.+))((?:\n\1[ ]{2}.+)*?)(?:\n(\1[ ]{2})(name[ ]*[:])((?:[ ]*(?![>|])\S.+\b)|(?:(?:[ ]*[>|])?\n\5[ ]+.+)*))[ ]*$`)
var str = `// YAML Textmate grammar name property hoister
// Moves a later \`name\` key value pair in multi value block definition to the
// top of its
//
// # Notes
// - Indent size is assumed to be 2.
// - Indent level of names being hoisted is controlled by capture group $1,
// which is later referenced by $5, the indent level of all other properties
// - Other properties can be hoisted by replacing the two instances of \`name\`
// in the pattern. A couple inputs for simple nested, folded, and literal values
// (immediately after these notes) seem to work.
// - Syntax level comments in captures will probably need to be rearranged after
// applying this, and worst case (especially comments lower indents) break matching
- match: '\s*(\,)\s*'
name:
'Testing': Regex101.Debug.Nested.Name
- match: '\s*(\,)\s*'
name:
'Testing': Regex101.Debug.Nested.Name.TrailingWhitespace
- match: '\s*(\,)\s*'
# Comment
name:
'Testing': Regex101.Debug.Nested.Name.TrailingWhitespace
- match: '\s*(\,)\s*'
name: >
Wow this is a long name?
kind of sus
- match: '\s*(\,)\s*'
name: |
sus2
- name: meta.selector.stylus
match: '\s*(\,)\s*'
- match: \*
name: meta.selector.stylus
- match: '\s*(\&)([a-zA-Z0-9_-]+)\s*'
captures:
'2':
name: entity.other.attribute-name.parent-selector-suffix.stylus
name: meta.selector.stylus
- match: \s*(\&)\s*
name: meta.selector.stylus
- captures:
'1':
name: punctuation.definition.entity.css
match: '(\.)[a-zA-Z0-9_-]+'
name: entity.other.attribute-name.class.css
- captures:
'1':
name: punctuation.definition.entity.css
match: '(#)[a-zA-Z][a-zA-Z0-9_-]*'
name: entity.other.attribute-name.id.css
- captures:
'1':
name: punctuation.definition.entity.css
match: >-
(:+)(after|before|content|first-letter|first-line|host|(-(moz|webkit|ms)-)?selection)\b
name: entity.other.attribute-name.pseudo-element.css
- captures:
'1':
name: punctuation.definition.entity.css
match: >-
(:)((first|last)-child|(first|last|only)-of-type|empty|root|target|first|left|right)\b
name: entity.other.attribute-name.pseudo-class.css
- captures:
'1':
name: punctuation.definition.entity.css
match: >-
(:)(checked|enabled|default|disabled|indeterminate|invalid|optional|required|valid)\b
name: entity.other.attribute-name.pseudo-class.ui-state.css
- begin: '((:)not)(\()'
beginCaptures:
'1':
name: entity.other.attribute-name.pseudo-class.css
'2':
name: punctuation.definition.entity.css
'3':
name: punctuation.section.function.css
end: \)
endCaptures:
'0':
name: punctuation.section.function.css
patterns:
- include: '#selector'
- captures:
'1':
name: entity.other.attribute-name.pseudo-class.css
'2':
name: punctuation.definition.entity.css
'3':
name: punctuation.section.function.css
'4':
name: constant.numeric.css
'5':
name: punctuation.section.function.css
match: >-
((:)nth-(?:(?:last-)?child|(?:last-)?of-type))(\()(\-?(?:\d+n?|n)(?:\+\d+)?|even|odd)(\))
- match: '((:)dir)\s*(?:(\()(ltr|rtl)?(\)))?'
captures:
'1':
name: entity.other.attribute-name.pseudo-class.css
'2':
name: puncutation.definition.entity.css
'3':
name: punctuation.section.function.css
'4':
name: constant.language.css
'5':
name: punctuation.section.function.css
- match: '((:)lang)\s*(?:(\()(\w+(-\w+)?)?(\)))?'
captures:
'1':
name: entity.other.attribute-name.pseudo-class.css
'2':
name: puncutation.definition.entity.css
'3':
name: punctuation.section.function.css
'4':
name: constant.language.css
'6':
name: punctuation.section.function.css
- captures:
'1':
name: punctuation.definition.entity.css
match: '(:)(active|hover|link|visited|focus)\b'
name: entity.other.attribute-name.pseudo-class.css
- captures:
'1':
name: punctuation.definition.entity.css
match: '(::)(shadow)\b'
name: entity.other.attribute-name.pseudo-class.css`
var substitution = "$1$2$6$7\n$5$3$4"
fmt.Println(re.ReplaceAllString(str, substitution))
}
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Golang, please visit: https://golang.org/pkg/regexp/