Skip to content

Commit

Permalink
Add :UBReplace and :UBRegexReplace.
Browse files Browse the repository at this point in the history
  • Loading branch information
leninli committed Apr 27, 2012
1 parent d7fa308 commit a7598aa
Show file tree
Hide file tree
Showing 6 changed files with 85 additions and 2 deletions.
2 changes: 2 additions & 0 deletions plugin/UltraBlog.vim
Expand Up @@ -190,6 +190,8 @@ command! -nargs=* -complete=customlist,UBDelCmpl UBDel exec('py ub_del_item(<f-a
command! -nargs=* -complete=customlist,UBThisCmpl UBThis exec('py ub_blog_this(<f-args>)')
command! -nargs=+ UBFind exec('py ub_search(0, 1, <f-args>)')
command! -nargs=+ UBRegexSearch exec('py ub_search(1, 1, <f-args>)')
command! -nargs=+ UBReplace exec('py ub_replace(0, <f-args>)')
command! -nargs=+ UBRegexReplace exec('py ub_replace(1, <f-args>)')

" Auto-commands
autocmd! BufEnter * py __ub_on_buffer_enter()
Expand Down
47 changes: 47 additions & 0 deletions plugin/ultrablog/commands.py
Expand Up @@ -59,6 +59,13 @@ def ub_search(is_regexp, page_no, *keywords):
cmd = UBCmdSearch(is_regexp, page_no, *keywords)
cmd.execute()

@__ub_exception_handler
def ub_replace(is_regexp, needle, replacement):
''' List posts/pages which match the keywords given
'''
cmd = UBCmdReplace(is_regexp, needle, replacement)
cmd.execute()

@__ub_exception_handler
def ub_refresh_current_view():
''' Refresh current view
Expand Down Expand Up @@ -488,6 +495,46 @@ def regexp(expr, item):
vim.command("let @/='\\(%s\\)'" % '\\|'.join(self.keywords))
vim.command('setl hls')

class UBCmdReplace(UBCommand):
''' Context replace
'''
def __init__(self, isRegexp, needle, replacement):
UBCommand.__init__(self)
self.isRegexp = isRegexp
self.needle = needle
self.replacement = replacement
self.count = 0

def _preExec(self):
UBCmdReplace.doDefault()

def _exec(self):
conn = db.connect()
# Hook regexp function to sqlite3 if the current mode is regexp
if self.isRegexp:
def regexp(expr, item):
reg = re.compile(expr)
return reg.search(item) is not None
conn.connection.create_function('REGEXP', 2, regexp)
conn.connection.create_function('regex_replace', 3, regex_replace)
sql_replace = "update post set title=regex_replace(title,:needle,:replacement),content=regex_replace(content,:needle,:replacement)"
sql_count = "select count(*) from post where title regexp :needle or content regexp :needle"
rslt = conn.execute(sql_count, {'needle':self.needle.decode(self.enc)})
self.count = rslt.fetchone()[0]
else:
sql_replace = "update post set title=replace(title,:needle,:replacement),content=replace(content,:needle,:replacement)"
needle = '%%%s%%' % self.needle.decode(self.enc)
self.count = self.sess.query(Post).filter(or_(Post.title.like(needle),Post.content.like(needle))).count()
conn.execute(sql_replace, {'needle':self.needle.decode(self.enc), 'replacement':self.replacement.decode(self.enc)})
conn.close()

def _postExec(self):
UBCmdReplace.doDefault()
evt = UBReplaceCompleteEvent(self.count)
UBEventQueue.fireEvent(evt)
UBEventQueue.processEvents()
ub_echo(_('%d items substituted !') % self.count)

class UBCmdSave(UBCommand):
''' Save items
'''
Expand Down
4 changes: 2 additions & 2 deletions plugin/ultrablog/db.py
Expand Up @@ -89,14 +89,14 @@ def ub_upgrade():
conn = db.connect()
stmt = select([Post.type]).limit(1)
try:
result = conn.execute(stmt)
conn.execute(stmt)
except OperationalError:
sql = "alter table post add type varchar(32) not null default 'post'"
conn.execute(sql)

stmt = select([Post.status]).limit(1)
try:
result = conn.execute(stmt)
conn.execute(stmt)
except OperationalError:
sql = "alter table post add status varchar(32) not null default 'draft'"
conn.execute(sql)
Expand Down
1 change: 1 addition & 0 deletions plugin/ultrablog/events.py
Expand Up @@ -15,6 +15,7 @@ class UBPostSendEvent(UBEvent): pass
class UBPostSaveEvent(UBEvent): pass

class UBViewEnterEvent(UBEvent): pass
class UBReplaceCompleteEvent(UBEvent): pass

if __name__ == '__main__':
pass
17 changes: 17 additions & 0 deletions plugin/ultrablog/listeners.py
Expand Up @@ -160,6 +160,22 @@ def processEvent(evt):
vim.command('setl nowrap')
vim.command("command! -buffer -nargs=0 UBRefresh exec('py ub_refresh_current_view()')")

class UBReplaceCompleteListener(UBListener):
''' Listener for context replacement event
1. Refresh the current view if it is an list view of this post
2. Mark all list views of posts/pages outdated
'''
eventType = UBReplaceCompleteEvent

@staticmethod
def processEvent(evt):
if evt.srcObj <= 0: return
for nr in ub_get_buffers(['post_edit','page_edit','post_list','page_list','search_result_list']):
if nr == ub_get_bufnr('%'):
ub_refresh_current_view()
else:
ub_set_view_outdated(nr)

UBEventQueue.registerListener(UBDebugListener)
UBEventQueue.registerListener(UBTmplDelListener)
UBEventQueue.registerListener(UBTmplSaveListener)
Expand All @@ -168,6 +184,7 @@ def processEvent(evt):
UBEventQueue.registerListener(UBPostSendListener)
UBEventQueue.registerListener(UBPostSaveListener)
UBEventQueue.registerListener(UBViewEnterListener)
UBEventQueue.registerListener(UBReplaceCompleteListener)

if __name__ == '__main__':
pass
16 changes: 16 additions & 0 deletions plugin/ultrablog/util.py
Expand Up @@ -227,6 +227,8 @@ def __get_positive(val, default):
val = val is None and '<c-pagedown>' or val
elif opt == 'ub_hotkey_pageup':
val = val is None and '<c-pageup>' or val
elif opt == 'ub_hotkey_save_current_item':
val = val is None and '<c-s>' or val
elif opt == 'ub_tmpl_img_url':
val = val is None and "markdown###![%(file)s][]\n[%(file)s]:%(url)s" or val
elif opt == 'ub_default_template':
Expand Down Expand Up @@ -605,5 +607,19 @@ def ub_echo(msg):
cmd = '''echo "%s"''' % msg.replace('"', "'")
vim.command(cmd)

def raw(text):
"""Returns a raw string representation of text"""
escape_dict={'\a':r'\a', '\b':r'\b', '\c':r'\c', '\f':r'\f', '\n':r'\n',
'\r':r'\r', '\t':r'\t', '\v':r'\v', '\'':r'\'', '\"':r'\"',
'\0':r'\0', '\1':r'\1', '\2':r'\2', '\3':r'\3', '\4':r'\4',
'\5':r'\5', '\6':r'\6', '\7':r'\7', '\8':r'\8', '\9':r'\9'}
return "".join([escape_dict.get(char,char) for char in text])

def regex_replace(string, expr, repl):
r = re.compile(raw(expr))
return r.sub(repl, string)

if __name__ == '__main__':
pass
conn.connection.create_function('regex_replace', 3, regex_replace)
stmt = "update post set content=regex_replace(content,'abc', 'lenin')"

0 comments on commit a7598aa

Please sign in to comment.