6060func initTangleHeaderArgs (): TangleHeaderArgs = initTable [LevelLangIndex , HeaderArgs ]()
6161
6262var
63- orgFile: string
6463 prevOrgLevel = - 1
6564 orgLevel = 0 .Natural
6665 fileData = initTable [string , string ]() # file, data
7473proc resetStateVars () =
7574 # # Reset all the state variables.
7675 # # This is called before reading each new Org file.
77- orgFile = " "
7876 prevOrgLevel = - 1
7977 orgLevel = 0 .Natural
8078 outFileName = " "
@@ -110,29 +108,28 @@ proc parseFilePermissions(octals: string): set[FilePermission] =
110108 dbg " permissions = {perm}"
111109 result = perm
112110
113- proc parseTangleHeaderProperties (hdrArgs: seq [ string ] , lnum: int , lang: string , onBeginSrc: bool ) =
111+ proc parseTangleHeaderProperties (file: string , lnum: int , haObj: LangAndArgs ) =
114112 # # Org header arguments related to tangling. See (org) Extracting Source Code.
115- # # ``hdrArgs`` is a sequence like @["KEY1 VAL1", "KEY2 VAL2", ..].
116113 let
117- (dir, basename, _) = splitFile (orgFile )
118- dbg " Org file = {orgFile }, dir={dir}, base name={basename}" , dvHigh
114+ (dir, basename, _) = splitFile (file )
115+ dbg " Org file = {file }, dir={dir}, base name={basename}" , dvHigh
119116 dbg (" " , prefix= " " ) # blank line
120- dbg " Line {lnum}, Lang {lang} - hdrArgs: {hdrArgs }"
117+ dbg " Line {lnum}, Lang {haObj. lang} - hdrArgs: {haObj.args }"
121118 var
122119 hArgs: HeaderArgs
123120 outfile = " "
124- if lang != " " :
121+ if haObj. lang != " " :
125122 let
126- langLower = lang.toLowerAscii ()
123+ langLower = haObj. lang.toLowerAscii ()
127124 ext = if tangledExt.hasKey (langLower):
128125 tangledExt[langLower]
129126 else :
130- lang
127+ haObj. lang
131128 outfile = dir / basename & " ." & ext
132129
133- if headerArgsDefaults.hasKey ((orgLevel, lang)):
134- hArgs = headerArgsDefaults[(orgLevel, lang)]
135- dbg " Line {lnum} - Using Org level {orgLevel} + lang {lang} scope, now hArgs = {hArgs}"
130+ if headerArgsDefaults.hasKey ((orgLevel, haObj. lang)):
131+ hArgs = headerArgsDefaults[(orgLevel, haObj. lang)]
132+ dbg " Line {lnum} - Using Org level {orgLevel} + lang {haObj. lang} scope, now hArgs = {hArgs}"
136133 else :
137134 hArgs = headerArgsDefaults[(orgLevel, " " )]
138135 dbg " Line {lnum} - Using only Org level {orgLevel} scope, now hArgs = {hArgs}"
@@ -146,13 +143,13 @@ proc parseTangleHeaderProperties(hdrArgs: seq[string], lnum: int, lang: string,
146143 else :
147144 outfile = hArgs.tangle
148145
149- for hdrArg in hdrArgs :
146+ for hdrArg in haObj.args :
150147 let
151148 hdrArgParts = hdrArg.strip.split (" " , maxsplit= 1 )
152- arg = hdrArgParts[0 ]
149+ argkey = hdrArgParts[0 ]
153150 argval = hdrArgParts[1 ]
154- dbg " arg={arg }, argval={argval}, onBeginSrc={onBeginSrc}, outfile={outfile}"
155- case arg
151+ dbg " argkey={argkey }, argval={argval}, onBeginSrc={onBeginSrc}, outfile={outfile}"
152+ case argkey
156153 of " tangle" :
157154 hArgs.tangle = argval
158155 case argval
@@ -171,7 +168,7 @@ proc parseTangleHeaderProperties(hdrArgs: seq[string], lnum: int, lang: string,
171168 of " no" :
172169 hArgs.padline = false
173170 else :
174- raise newException (OrgError , fmt (" The '{argval}' value for ':{arg }' is invalid. The only valid values are 'yes' and 'no'." ))
171+ raise newException (OrgError , fmt (" The '{argval}' value for ':{argkey }' is invalid. The only valid values are 'yes' and 'no'." ))
175172 of " shebang" :
176173 hArgs.shebang = argval
177174 of " mkdirp" :
@@ -181,13 +178,13 @@ proc parseTangleHeaderProperties(hdrArgs: seq[string], lnum: int, lang: string,
181178 of " no" :
182179 hArgs.mkdirp = false
183180 else :
184- raise newException (OrgError , fmt (" The '{argval}' value for ':{arg }' is invalid. The only valid values are 'yes' and 'no'." ))
181+ raise newException (OrgError , fmt (" The '{argval}' value for ':{argkey }' is invalid. The only valid values are 'yes' and 'no'." ))
185182 of " tangle-mode" :
186183 let octalPerm = argval.split (" #o" , maxsplit= 1 )
187184 if octalPerm.len != 2 :
188- raise newException (OrgError , fmt (" Line {lnum} - The header arg ':{arg }' has invalid file permissions syntax: {argval}" ))
185+ raise newException (OrgError , fmt (" Line {lnum} - The header argkey ':{argkey }' has invalid file permissions syntax: {argval}" ))
189186 if octalPerm[1 ].len < 3 :
190- raise newException (OrgError , fmt (" Line {lnum} - The header arg ':{arg }' has invalid file permissions syntax: {argval}" ))
187+ raise newException (OrgError , fmt (" Line {lnum} - The header argkey ':{argkey }' has invalid file permissions syntax: {argval}" ))
191188 let
192189 octalPermOwner = octalPerm[1 ][0 ]
193190 octalPermGroup = octalPerm[1 ][1 ]
@@ -210,7 +207,7 @@ proc parseTangleHeaderProperties(hdrArgs: seq[string], lnum: int, lang: string,
210207 # of "no":
211208 # hArgs.no-expand = false
212209 # else:
213- # raise newException(OrgError, fmt("The '{argval}' value for ':{arg }' is invalid. The only valid values are 'yes' and 'no'."))
210+ # raise newException(OrgError, fmt("The '{argval}' value for ':{argkey }' is invalid. The only valid values are 'yes' and 'no'."))
214211 # of "noweb":
215212 # case argval
216213 # of "yes":
@@ -229,16 +226,16 @@ proc parseTangleHeaderProperties(hdrArgs: seq[string], lnum: int, lang: string,
229226 styledEcho (fgYellow, " [WARN] " ,
230227 fgDefault, " Line " ,
231228 styleBright, $ lnum,
232- resetStyle, fmt" - ':{ arg } ' header argument is not supported at the moment. " )
229+ resetStyle, fmt" - ':{ argkey } ' header argument is not supported at the moment. " )
233230 else : # Ignore all other header args
234231 discard
235232
236233 # Update the default HeaderArgs for the current orgLevel+lang
237234 # scope, but only using the header args set using property keyword
238235 # or the drawer property.
239- if ( not onBeginSrc) :
240- dbg " ** Line {lnum}: Updating headerArgsDefaults[({orgLevel}, {lang})] to {hArgs}"
241- headerArgsDefaults[(orgLevel, lang)] = hArgs
236+ if haObj.argType != haBeginSrc :
237+ dbg " ** Line {lnum}: Updating headerArgsDefaults[({orgLevel}, {haObj. lang})] to {hArgs}"
238+ headerArgsDefaults[(orgLevel, haObj. lang)] = hArgs
242239
243240 dbg " [after] Line {lnum} - hArgs = {hArgs}"
244241 if outfile != " " :
@@ -247,7 +244,7 @@ proc parseTangleHeaderProperties(hdrArgs: seq[string], lnum: int, lang: string,
247244 outFileName = outfile
248245
249246 dbg " line={lnum}, onBeginSrc={onBeginSrc}, hArgs.tangle={hArgs.tangle} outfile={outfile} | outFileName={outFileName}"
250- if onBeginSrc :
247+ if haObj.argType == haBeginSrc :
251248 if hArgs.tangle != " no" :
252249 doAssert outFileName != " "
253250 dbg " line {lnum}: buffering enabled for `{outFileName}'"
@@ -337,7 +334,7 @@ proc updateHeaderArgsDefault() =
337334 discard
338335 prevOrgLevel = orgLevel
339336
340- proc getHeaderArgs (line: string , lnum: int ): LangAndArgs =
337+ proc getHeaderArgs (file: string , line: string , lnum: int ): LangAndArgs =
341338 # # Get well-formatted header args.
342339 # #
343340 # # Examples:
@@ -369,7 +366,7 @@ proc getHeaderArgs(line: string, lnum: int): LangAndArgs =
369366 spaceSepParts[0 ].toLowerAscii () == " #+property:" and
370367 spaceSepParts[1 ].toLowerAscii ().startsWith (" header-args" ):
371368 doAssert spaceSepParts[2 ][0 ] == ':' ,
372- fmt" { orgFile } :{ lnum} :: { line} " & " \n " &
369+ fmt" { file } :{ lnum} :: { line} " & " \n " &
373370 " : The first switch in 'header-args' property must be a key with ':' prefix."
374371 headerArgsRaw = spaceSepParts[2 .. spaceSepParts.high]
375372 let
@@ -381,7 +378,7 @@ proc getHeaderArgs(line: string, lnum: int): LangAndArgs =
381378 elif spaceSepParts.len >= 3 and
382379 spaceSepParts[0 ].toLowerAscii ().startsWith (" :header-args" ):
383380 doAssert spaceSepParts[1 ][0 ] == ':' ,
384- fmt" { orgFile } :{ lnum} :: { line} " & " \n " &
381+ fmt" { file } :{ lnum} :: { line} " & " \n " &
385382 " : The first switch in 'header-args' drawer property must be a key with ':' prefix."
386383 headerArgsRaw = spaceSepParts[1 .. spaceSepParts.high]
387384 let
@@ -417,7 +414,7 @@ proc getHeaderArgs(line: string, lnum: int): LangAndArgs =
417414 headerArgs.add (headerArgPair)
418415 return (haType, lang, headerArgs)
419416
420- proc lineAction ( line: string , lnum: int ) =
417+ proc parseLine (file: string , line: string , lnum: int ) =
421418 # # On detection of "#+begin_src" with ":tangle foo", enable
422419 # # recording of LINE, next line onwards to global table ``fileData``.
423420 # # On detection of "#+end_src", stop that recording.
@@ -426,13 +423,13 @@ proc lineAction(line: string, lnum: int) =
426423 dbg " orgLevel = {orgLevel}"
427424 updateHeaderArgsDefault ()
428425 let
429- (haType, haLang, haArgs) = getHeaderArgs (line, lnum)
426+ haObj = getHeaderArgs (file, line, lnum)
430427 dbg " [line {lnum}] {line}" , dvHigh
431- if haType != haNone:
432- dbg " getHeaderArgs: line {lnum}:: {haType}, {haLang}, {haArgs }"
433- if haType in {haPropertyKwd, haPropertyDrawer, haPropertyDrawerAppend}:
434- dbg " Property header-args found [Lang={haLang }]: {haArgs }"
435- parseTangleHeaderProperties (haArgs , lnum, haLang, false )
428+ if haObj.argType != haNone:
429+ dbg " getHeaderArgs: line {lnum}:: {haObj }"
430+ if haObj.argType in {haPropertyKwd, haPropertyDrawer, haPropertyDrawerAppend}:
431+ dbg " Property header-args found [Lang={haObj.lang }]: {haObj.args }"
432+ parseTangleHeaderProperties (file , lnum, haObj )
436433 else :
437434 let
438435 lineParts = line.strip.split (" :" )
@@ -461,8 +458,8 @@ proc lineAction(line: string, lnum: int) =
461458 fileData[outFileName] = lineAdjust (line, blockIndent)
462459 dbg " extra indentation: {blockIndent}"
463460 firstLineSrcBlock = false
464- elif haType == haBeginSrc:
465- parseTangleHeaderProperties (haArgs , lnum, haLang, true )
461+ elif haObj.argType == haBeginSrc:
462+ parseTangleHeaderProperties (file , lnum, haObj )
466463
467464proc writeFiles () =
468465 # # Write the files from ``fileData``.
@@ -502,12 +499,11 @@ proc doOrgTangle(file: string) =
502499 # # Tangle Org file ``file``.
503500 if file.toLowerAscii.endsWith (" .org" ): # Ignore files with names not ending in ".org"
504501 resetStateVars ()
505- orgFile = file
506- styledEcho (" Parsing " , styleBright, orgFile, resetStyle, " .." )
502+ styledEcho (" Parsing " , styleBright, file, resetStyle, " .." )
507503 var lnum = 1
508- for line in lines (orgFile ):
504+ for line in lines (file ):
509505 dbg " {lnum}: {line}" , dvHigh
510- lineAction ( line, lnum)
506+ parseLine (file, line, lnum)
511507 inc lnum
512508 writeFiles ()
513509 echo " "
0 commit comments