我正在尝试使用Python正确缩进和缩进asp代码。
与http://www.aspindent.com/类似,我正在尝试适当缩进和缩进正在使用的某些ASP代码。问题是,asp代码太长,无法由网站解析。
那是我决定自己尝试对其进行编程的时候。
在采用这种方法时,我遇到了一些需要帮助解决的问题。
这是示例代码的一部分,可能由我的程序解析
if some_bool then
code
code
code
end if
code
code
然后它将正确缩进代码,然后将其变成
if some_bool then
code
code
code
end if
code
code
如您所见,最后一个end if
也缩进了
我不确定如何正确地在结尾处插入if语句。我正在尝试在代码中维护DRY方法,我立即意识到尝试修复此部分可能会变得很奇怪。因此,对于这部分内容,一些提示将不胜感激。
最后,请让我知道是否还有其他缩进和缩进关键字,我也应该注意。
这是我到目前为止创建的代码。
"""
IF BOOL THEN
CODE
CODE
END IF
IF BOOL THEN
CODE
CODE
ELSEIF BOOL THEN
CODE
CODE
END IF
IF BOOL THEN
CODE
IF BOOL THEN
CODE
END IF
CODE
IF BOOL THEN
CODE
ELSEIF BOOL THEN
CODE
END IF
CODE
END IF
"""
import re, sys
def print_ln(space, string):
sys.stdout.write(" " * space + str(string))
sys.stdout.flush()
def main(string):
space = 0
for s in string:
print_ln(space, s)
if re.search("^\s*if.*then", str(s), re.IGNORECASE):
space += 4
if re.search("^\s*for", str(s), re.IGNORECASE):
space += 4
if re.search("^\s*elseif.*then", str(s), re.IGNORECASE):
space -= 4
if re.search("^\s*end if", str(s), re.IGNORECASE):
space -= 4
if re.search("^\s*next", str(s), re.IGNORECASE):
space -= 4
with open("scratch.html") as s:
main(s.readlines())
答案 0 :(得分:0)
压痕很容易,压痕很容易。缩进然后缩进需要对文本的打印方式进行一些预见,但也很容易。
要完成这项工作,我们需要将上述任务分解为各自的功能。这还包括将线条打印附加到这些功能上。这将控制何时打印和不打印。
下面的代码。
"""
IF BOOL THEN
CODE
CODE
END IF
IF BOOL THEN
CODE
CODE
ELSEIF BOOL THEN
CODE
CODE
END IF
IF BOOL THEN
CODE
IF BOOL THEN
CODE
END IF
CODE
IF BOOL THEN
CODE
ELSEIF BOOL THEN
CODE
END IF
CODE
END IF
"""
import re, sys
class Indenter:
def __init__(self, string):
self.space = 0
self.count = 0
self.string = string
def print_ln(self, string):
sys.stdout.write(" " * self.space + str(string))
sys.stdout.flush()
def indent(self):
self.print_ln(self.string[self.count])
self.space += 4
def dedent(self):
self.space -= 4
self.print_ln(self.string[self.count])
def dedent_indent(self):
self.space -= 4
self.print_ln(self.string[self.count])
self.space += 4
def main(self):
while self.count < len(self.string):
if re.search("^\s*if.*then", str(self.string[self.count]), re.IGNORECASE):
self.indent()
elif re.search("^\s*for", str(self.string[self.count]), re.IGNORECASE):
self.indent()
elif re.search("^\s*with", str(self.string[self.count]), re.IGNORECASE):
self.indent()
elif re.search("^\s*do until", str(self.string[self.count]), re.IGNORECASE):
self.indent()
elif re.search("^\s*do", str(self.string[self.count]), re.IGNORECASE):
self.indent()
elif re.search("^\s*Select Case", str(self.string[self.count]), re.IGNORECASE):
self.indent()
elif re.search("^\s*End Select", str(self.string[self.count]), re.IGNORECASE):
self.dedent()
elif re.search("^\s*loop", str(self.string[self.count]), re.IGNORECASE):
self.dedent()
elif re.search("^\s*end with", str(self.string[self.count]), re.IGNORECASE):
self.dedent()
elif re.search("^\s*end if", str(self.string[self.count]), re.IGNORECASE):
self.dedent()
elif re.search("^\s*next", str(self.string[self.count]), re.IGNORECASE):
self.dedent()
elif re.search("^\s*Case", str(self.string[self.count]), re.IGNORECASE):
self.dedent_indent()
elif re.search("^\s*else", str(self.string[self.count]), re.IGNORECASE):
self.dedent_indent()
elif re.search("^\s*elseif.*then", str(self.string[self.count]), re.IGNORECASE):
self.dedent_indent()
else:
self.print_ln(self.string[self.count])
self.count += 1
with open("scratch.html") as s:
ind = Indenter(s.readlines())
ind.main()