Skip to content

Commit 0594793

Browse files
committed
Refactor: Remove global var orgFile
1 parent 52e88a7 commit 0594793

File tree

1 file changed

+39
-43
lines changed

1 file changed

+39
-43
lines changed

src/ntangle.nim

Lines changed: 39 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,6 @@ type
6060
func initTangleHeaderArgs(): TangleHeaderArgs = initTable[LevelLangIndex, HeaderArgs]()
6161

6262
var
63-
orgFile: string
6463
prevOrgLevel = -1
6564
orgLevel = 0.Natural
6665
fileData = initTable[string, string]() # file, data
@@ -74,7 +73,6 @@ var
7473
proc 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

467464
proc 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

Comments
 (0)