#@+leo-ver=5-thin
#@+node:ekr.20040331151007: * @file niceNosent.py
#@+<< docstring >>
#@+node:ekr.20101112180523.5420: ** << docstring >>
""" Ensures that all descendants of @file-nosent nodes end
with exactly one newline, replaces all tabs with spaces, and
adds a newline before class and functions in the derived file.
"""
#@-<< docstring >>
#@@language python
#@@tabwidth -4
__version__ = "0.3"
#@+<< version history >>
#@+node:ekr.20040909122647: ** << version history >>
#@+at
#
# 0.2 EKR:
# - Use isAtNoSentinelsFileNode and atNoSentinelsFileNodeName.
# - Use g.os_path_x methods for better unicode support.
# 0.3 EKR:
# - Converted to 4.2 code base:
# - Use keywords.get('c') instead of g.top().
# - Use explicit positions everywhere.
# - removed reference to new_df.
#@-<< version history >>
#@+<< imports >>
#@+node:ekr.20040909122647.1: ** << imports >>
import leo.core.leoGlobals as g
#@-<< imports >>
NSPACES = ' '*4
nosentNodes = []
#@+others
#@+node:ekr.20050917082031: ** init
[docs]def init ():
'''Return True if the plugin has loaded successfully.'''
ok = not g.unitTesting
if ok:
g.registerHandler("save1",onPreSave)
g.registerHandler("save2",onPostSave)
g.plugin_signon(__name__)
return ok
#@+node:ekr.20040331151007.1: ** onPreSave
[docs]def onPreSave(tag=None, keywords=None):
"""Before saving an @nosent file, make sure that all nodes have a blank line at the end."""
global nosentNodes
c = keywords.get('c')
if c:
for p in c.all_positions():
if p.isAtNoSentinelsFileNode() and p.isDirty():
nosentNodes.append(p.copy())
for p2 in p.self_and_subtree():
s = p2.b
lastline = s.split("\n")[-1]
if lastline.strip():
c.setBodyString(p2,s+"\n")
#@+node:ekr.20040331151007.2: ** onPostSave
[docs]def onPostSave(tag=None, keywords=None):
"""After saving an @nosent file, replace all tabs with spaces."""
global nosentNodes
c = keywords.get('c')
if c:
at = c.atFileCommands
for p in nosentNodes:
g.red("node %s found" % p.h)
at.scanAllDirectives(p)
name = p.atNoSentinelsFileNodeName()
fname = g.os_path_join(at.default_directory,name)
f = open(fname,"r")
lines = f.readlines()
f.close()
#@+<< add a newline before def or class >>
#@+node:ekr.20040331151007.3: *3* << add a newline before def or class >>
for i, s in enumerate(lines):
ls = s.lstrip()
if ls.startswith("def ") or ls.startswith("class "):
try:
if lines[i-1].strip() != "":
lines[i] = "\n" + lines[i]
except IndexError:
pass
#@-<< add a newline before def or class >>
#@+<< replace tabs with spaces >>
#@+node:ekr.20040331151007.4: *3* << replace tabs with spaces >>
s = ''.join(lines)
fh = open(fname,"w")
fh.write(s.replace("\t",NSPACES))
fh.close()
#@-<< replace tabs with spaces >>
nosentNodes = []
#@-others
#@-leo