Repository navigation
Expand file tree
/
Copy pathscratch.clj
More file actions
34 lines (30 loc) · 1.74 KB
/
Copy pathscratch.clj
File metadata and controls
34 lines (30 loc) · 1.74 KB
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
(require '[instaparse.core :as insta])
(def grammar
"A PEG grammar to validate and parse conventional commit messages."
(str
"<S> = (HEADER <EMPTY-LINE> FOOTER GIT-REPORT? <NEWLINE>*)
/ ( HEADER <EMPTY-LINE> BODY (<EMPTY-LINE> FOOTER)? GIT-REPORT? <NEWLINE>*)
/ (HEADER <EMPTY-LINE> BODY GIT-REPORT? <NEWLINE>*)
/ (HEADER GIT-REPORT? <NEWLINE>*);"
"<HEADER> = TYPE (<'('>SCOPE<')'>)? <':'> <SPACE> SUBJECT;"
"TYPE = 'feat' | 'fix' | 'refactor' | 'perf' | 'style' | 'test' | 'docs' | 'build' | 'ops' | 'chore';"
"SCOPE = #'[a-zA-Z0-9]+';"
"SUBJECT = TEXT ISSUE-REF? TEXT? !'.';"
"BODY = (!PRE-FOOTER PARAGRAPH) / (!PRE-FOOTER PARAGRAPH (<EMPTY-LINE> PARAGRAPH)*);"
"PARAGRAPH = (ISSUE-REF / TEXT / (NEWLINE !NEWLINE))+;"
"PRE-FOOTER = NEWLINE+ FOOTER;"
"FOOTER = FOOTER-ELEMENT (<NEWLINE> FOOTER-ELEMENT)*;"
"FOOTER-ELEMENT = FOOTER-TOKEN <':'> <WHITESPACE> FOOTER-VALUE;"
"FOOTER-TOKEN = ('BREAKING CHANGE' (<'('>SCOPE<')'>)?) / #'[a-zA-Z\\-^\\#]+';"
"FOOTER-VALUE = (ISSUE-REF / TEXT)+;"
"GIT-REPORT = (<EMPTY-LINE> / <NEWLINE>) COMMENT*;"
"COMMENT = <'#'> #'[^\\n]*' <NEWLINE?> ;"
"ISSUE-REF = <'#'> ISSUE-ID;"
"ISSUE-ID = #'([A-Z]+\\-)?[0-9]+';"
"TEXT = #'[^\\n\\#]+';"
"SPACE = ' ';"
"WHITESPACE = #'\\s';"
"NEWLINE = <'\n'>;"
"EMPTY-LINE = <'\n\n'>;"))
(def parser (insta/parser grammar))
(insta/parse parser "feat: adding a new awesome feature")