def func(self): """ This command handles all the in-editor :-style commands. Since each command is small and very limited, this makes for a more efficient presentation. """ caller = self.caller editor = self.editor linebuffer = self.linebuffer lstart, lend = self.lstart, self.lend cmd = self.cmdstring echo_mode = self.editor.echo_mode string = "" if cmd == ":": # Echo buffer if self.linerange: buf = linebuffer[lstart:lend] string = editor.display_buffer(buf=buf, offset=lstart) else: string = editor.display_buffer() elif cmd == "::": # Echo buffer without the line numbers and syntax parsing if self.linerange: buf = linebuffer[lstart:lend] string = editor.display_buffer(buf=buf, offset=lstart, linenums=False) else: string = editor.display_buffer(linenums=False) self.caller.msg(string, data={"raw": True}) return elif cmd == ":::": # Insert single colon alone on a line editor.update_buffer(editor.buffer + "\n:") if echo_mode: string = "Single ':' added to buffer." elif cmd == ":h": # help entry string = editor.display_help() elif cmd == ":w": # save without quitting string = editor.save_buffer(quitting=False) elif cmd == ":wq": # save and quit string = editor.save_buffer(quitting=True) string += " " + editor.quit() elif cmd == ":q": # quit. If not saved, will ask if self.editor.unsaved: prompt_yesno( caller, "Save before quitting?", yescode= "self.caller.ndb._lineeditor.save_buffer(quitting=True)\nself.caller.ndb._lineeditor.quit()", nocode= "self.caller.msg(self.caller.ndb._lineeditor.quit())", default="Y") else: string = editor.quit() elif cmd == ":q!": # force quit, not checking saving string = editor.quit() elif cmd == ":u": # undo string = editor.update_undo(-1) elif cmd == ":uu": # redo string = editor.update_undo(1) elif cmd == ":UU": # reset buffer editor.update_buffer(editor.pristine_buffer) string = "Reverted all changes to the buffer back to original state." elif cmd == ":dd": # :dd <l> - delete line <l> buf = linebuffer[:lstart] + linebuffer[lend:] editor.update_buffer(buf) string = "Deleted %s." % (self.lstr) elif cmd == ":dw": # :dw <w> - delete word in entire buffer # :dw <l> <w> delete word only on line(s) <l> if not self.arg1: string = "You must give a search word to delete." else: if not self.linerange: lstart = 0 lend = self.cline + 1 string = "Removed %s for lines %i-%i." % ( self.arg1, lstart + 1, lend + 1) else: string = "Removed %s for %s." % (self.arg1, self.lstr) sarea = "\n".join(linebuffer[lstart:lend]) sarea = re.sub(r"%s" % self.arg1.strip("\'").strip('\"'), "", sarea, re.MULTILINE) buf = linebuffer[:lstart] + sarea.split( "\n") + linebuffer[lend:] editor.update_buffer(buf) elif cmd == ":DD": # clear buffer editor.update_buffer("") string = "Cleared %i lines from buffer." % self.nlines elif cmd == ":y": # :y <l> - yank line(s) to copy buffer cbuf = linebuffer[lstart:lend] editor.copy_buffer = cbuf string = "%s, %s yanked." % (self.lstr.capitalize(), cbuf) elif cmd == ":x": # :x <l> - cut line to copy buffer cbuf = linebuffer[lstart:lend] editor.copy_buffer = cbuf buf = linebuffer[:lstart] + linebuffer[lend:] editor.update_buffer(buf) string = "%s, %s cut." % (self.lstr.capitalize(), cbuf) elif cmd == ":p": # :p <l> paste line(s) from copy buffer if not editor.copy_buffer: string = "Copy buffer is empty." else: buf = linebuffer[:lstart] + editor.copy_buffer + linebuffer[ lstart:] editor.update_buffer(buf) string = "Copied buffer %s to %s." % (editor.copy_buffer, self.lstr) elif cmd == ":i": # :i <l> <txt> - insert new line new_lines = self.args.split('\n') if not new_lines: string = "You need to enter a new line and where to insert it." else: buf = linebuffer[:lstart] + new_lines + linebuffer[lstart:] editor.update_buffer(buf) string = "Inserted %i new line(s) at %s." % (len(new_lines), self.lstr) elif cmd == ":r": # :r <l> <txt> - replace lines new_lines = self.args.split('\n') if not new_lines: string = "You need to enter a replacement string." else: buf = linebuffer[:lstart] + new_lines + linebuffer[lend:] editor.update_buffer(buf) string = "Replaced %i line(s) at %s." % (len(new_lines), self.lstr) elif cmd == ":I": # :I <l> <txt> - insert text at beginning of line(s) <l> if not self.args: string = "You need to enter text to insert." else: buf = linebuffer[:lstart] + [ "%s%s" % (self.args, line) for line in linebuffer[lstart:lend] ] + linebuffer[lend:] editor.update_buffer(buf) string = "Inserted text at beginning of %s." % self.lstr elif cmd == ":A": # :A <l> <txt> - append text after end of line(s) if not self.args: string = "You need to enter text to append." else: buf = linebuffer[:lstart] + [ "%s%s" % (line, self.args) for line in linebuffer[lstart:lend] ] + linebuffer[lend:] editor.update_buffer(buf) string = "Appended text to end of %s." % self.lstr elif cmd == ":s": # :s <li> <w> <txt> - search and replace words in entire buffer or on certain lines if not self.arg1 or not self.arg2: string = "You must give a search word and something to replace it with." else: if not self.linerange: lstart = 0 lend = self.cline + 1 string = "Search-replaced %s -> %s for lines %i-%i." % ( self.arg1, self.arg2, lstart + 1, lend) else: string = "Search-replaced %s -> %s for %s." % ( self.arg1, self.arg2, self.lstr) sarea = "\n".join(linebuffer[lstart:lend]) regex = r"%s|^%s(?=\s)|(?<=\s)%s(?=\s)|^%s$|(?<=\s)%s$" regarg = self.arg1.strip("\'").strip('\"') if " " in regarg: regarg = regarg.replace(" ", " +") sarea = re.sub( regex % (regarg, regarg, regarg, regarg, regarg), self.arg2.strip("\'").strip('\"'), sarea, re.MULTILINE) buf = linebuffer[:lstart] + sarea.split( "\n") + linebuffer[lend:] editor.update_buffer(buf) elif cmd == ":f": # :f <l> flood-fill buffer or <l> lines of buffer. width = 78 if not self.linerange: lstart = 0 lend = self.cline + 1 string = "Flood filled lines %i-%i." % (lstart + 1, lend) else: string = "Flood filled %s." % self.lstr fbuf = "\n".join(linebuffer[lstart:lend]) fbuf = utils.fill(fbuf, width=width) buf = linebuffer[:lstart] + fbuf.split("\n") + linebuffer[lend:] editor.update_buffer(buf) elif cmd == ":fi": # :fi <l> indent buffer or lines <l> of buffer. indent = " " * 4 if not self.linerange: lstart = 0 lend = self.cline + 1 string = "Indented lines %i-%i." % (lstart + 1, lend) else: string = "Indented %s." % self.lstr fbuf = [indent + line for line in linebuffer[lstart:lend]] buf = linebuffer[:lstart] + fbuf + linebuffer[lend:] editor.update_buffer(buf) elif cmd == ":fd": # :fi <l> indent buffer or lines <l> of buffer. if not self.linerange: lstart = 0 lend = self.cline + 1 string = "Removed left margin (dedented) lines %i-%i." % ( lstart + 1, lend) else: string = "Removed left margin (dedented) %s." % self.lstr fbuf = "\n".join(linebuffer[lstart:lend]) fbuf = utils.dedent(fbuf) buf = linebuffer[:lstart] + fbuf.split("\n") + linebuffer[lend:] editor.update_buffer(buf) elif cmd == ":echo": # set echoing on/off editor.echo_mode = not editor.echo_mode string = "Echo mode set to %s" % editor.echo_mode caller.msg(string)
def func(self): """ This command handles all the in-editor :-style commands. Since each command is small and very limited, this makes for a more efficient presentation. """ caller = self.caller editor = self.editor linebuffer = self.linebuffer lstart, lend = self.lstart, self.lend cmd = self.cmdstring echo_mode = self.editor.echo_mode string = "" if cmd == ":": # Echo buffer if self.linerange: buf = linebuffer[lstart:lend] string = editor.display_buffer(buf=buf, offset=lstart) else: string = editor.display_buffer() elif cmd == "::": # Echo buffer without the line numbers and syntax parsing if self.linerange: buf = linebuffer[lstart:lend] string = editor.display_buffer(buf=buf, offset=lstart, linenums=False) else: string = editor.display_buffer(linenums=False) self.caller.msg(string, raw=True) return elif cmd == ":::": # Insert single colon alone on a line editor.update_buffer(editor.buffer + "\n:") if echo_mode: string = "Single ':' added to buffer." elif cmd == ":h": # help entry string = editor.display_help() elif cmd == ":w": # save without quitting string = editor.save_buffer() elif cmd == ":wq": # save and quit string = editor.save_buffer() string += " " + editor.quit() elif cmd == ":q": # quit. If not saved, will ask if self.editor.unsaved: prompt_yesno(caller, "Save before quitting?", yescode = "self.caller.ndb._lineeditor.save_buffer(quitting=True)\nself.caller.ndb._lineeditor.quit()", nocode = "self.caller.msg(self.caller.ndb._lineeditor.quit())", default="Y") else: string = editor.quit() elif cmd == ":q!": # force quit, not checking saving string = editor.quit() elif cmd == ":u": # undo string = editor.update_undo(-1) elif cmd == ":uu": # redo string = editor.update_undo(1) elif cmd == ":UU": # reset buffer editor.update_buffer(editor.pristine_buffer) string = "Reverted all changes to the buffer back to original state." elif cmd == ":dd": # :dd <l> - delete line <l> buf = linebuffer[:lstart] + linebuffer[lend:] editor.update_buffer(buf) string = "Deleted %s." % (self.lstr) elif cmd == ":dw": # :dw <w> - delete word in entire buffer # :dw <l> <w> delete word only on line(s) <l> if not self.arg1: string = "You must give a search word to delete." else: if not self.linerange: lstart = 0 lend = self.cline + 1 string = "Removed %s for lines %i-%i." % (self.arg1, lstart + 1, lend + 1) else: string = "Removed %s for %s." % (self.arg1, self.lstr) sarea = "\n".join(linebuffer[lstart:lend]) sarea = re.sub(r"%s" % self.arg1.strip("\'").strip('\"'), "", sarea, re.MULTILINE) buf = linebuffer[:lstart] + sarea.split("\n") + linebuffer[lend:] editor.update_buffer(buf) elif cmd == ":DD": # clear buffer editor.update_buffer("") string = "Cleared %i lines from buffer." % self.nlines elif cmd == ":y": # :y <l> - yank line(s) to copy buffer cbuf = linebuffer[lstart:lend] editor.copy_buffer = cbuf string = "%s, %s yanked." % (self.lstr.capitalize(), cbuf) elif cmd == ":x": # :x <l> - cut line to copy buffer cbuf = linebuffer[lstart:lend] editor.copy_buffer = cbuf buf = linebuffer[:lstart] + linebuffer[lend:] editor.update_buffer(buf) string = "%s, %s cut." % (self.lstr.capitalize(), cbuf) elif cmd == ":p": # :p <l> paste line(s) from copy buffer if not editor.copy_buffer: string = "Copy buffer is empty." else: buf = linebuffer[:lstart] + editor.copy_buffer + linebuffer[lstart:] editor.update_buffer(buf) string = "Copied buffer %s to %s." % (editor.copy_buffer, self.lstr) elif cmd == ":i": # :i <l> <txt> - insert new line new_lines = self.args.split('\n') if not new_lines: string = "You need to enter a new line and where to insert it." else: buf = linebuffer[:lstart] + new_lines + linebuffer[lstart:] editor.update_buffer(buf) string = "Inserted %i new line(s) at %s." % (len(new_lines), self.lstr) elif cmd == ":r": # :r <l> <txt> - replace lines new_lines = self.args.split('\n') if not new_lines: string = "You need to enter a replacement string." else: buf = linebuffer[:lstart] + new_lines + linebuffer[lend:] editor.update_buffer(buf) string = "Replaced %i line(s) at %s." % (len(new_lines), self.lstr) elif cmd == ":I": # :I <l> <txt> - insert text at beginning of line(s) <l> if not self.args: string = "You need to enter text to insert." else: buf = linebuffer[:lstart] + ["%s%s" % (self.args, line) for line in linebuffer[lstart:lend]] + linebuffer[lend:] editor.update_buffer(buf) string = "Inserted text at beginning of %s." % self.lstr elif cmd == ":A": # :A <l> <txt> - append text after end of line(s) if not self.args: string = "You need to enter text to append." else: buf = linebuffer[:lstart] + ["%s%s" % (line, self.args) for line in linebuffer[lstart:lend]] + linebuffer[lend:] editor.update_buffer(buf) string = "Appended text to end of %s." % self.lstr elif cmd == ":s": # :s <li> <w> <txt> - search and replace words # in entire buffer or on certain lines if not self.arg1 or not self.arg2: string = "You must give a search word and something to replace it with." else: if not self.linerange: lstart = 0 lend = self.cline + 1 string = "Search-replaced %s -> %s for lines %i-%i." % (self.arg1, self.arg2, lstart + 1 , lend) else: string = "Search-replaced %s -> %s for %s." % (self.arg1, self.arg2, self.lstr) sarea = "\n".join(linebuffer[lstart:lend]) regex = r"%s|^%s(?=\s)|(?<=\s)%s(?=\s)|^%s$|(?<=\s)%s$" regarg = self.arg1.strip("\'").strip('\"') if " " in regarg: regarg = regarg.replace(" ", " +") sarea = re.sub(regex % (regarg, regarg, regarg, regarg, regarg), self.arg2.strip("\'").strip('\"'), sarea, re.MULTILINE) buf = linebuffer[:lstart] + sarea.split("\n") + linebuffer[lend:] editor.update_buffer(buf) elif cmd == ":f": # :f <l> flood-fill buffer or <l> lines of buffer. width = 78 if not self.linerange: lstart = 0 lend = self.cline + 1 string = "Flood filled lines %i-%i." % (lstart + 1 , lend) else: string = "Flood filled %s." % self.lstr fbuf = "\n".join(linebuffer[lstart:lend]) fbuf = utils.fill(fbuf, width=width) buf = linebuffer[:lstart] + fbuf.split("\n") + linebuffer[lend:] editor.update_buffer(buf) elif cmd == ":fi": # :fi <l> indent buffer or lines <l> of buffer. indent = " " * 4 if not self.linerange: lstart = 0 lend = self.cline + 1 string = "Indented lines %i-%i." % (lstart + 1 , lend) else: string = "Indented %s." % self.lstr fbuf = [indent + line for line in linebuffer[lstart:lend]] buf = linebuffer[:lstart] + fbuf + linebuffer[lend:] editor.update_buffer(buf) elif cmd == ":fd": # :fi <l> indent buffer or lines <l> of buffer. if not self.linerange: lstart = 0 lend = self.cline + 1 string = "Removed left margin (dedented) lines %i-%i." % (lstart + 1 , lend) else: string = "Removed left margin (dedented) %s." % self.lstr fbuf = "\n".join(linebuffer[lstart:lend]) fbuf = utils.dedent(fbuf) buf = linebuffer[:lstart] + fbuf.split("\n") + linebuffer[lend:] editor.update_buffer(buf) elif cmd == ":echo": # set echoing on/off editor.echo_mode = not editor.echo_mode string = "Echo mode set to %s" % editor.echo_mode caller.msg(string)
def format_output(self, obj, avail_cmdset): """ Helper function that creates a nice report about an object. returns a string. """ string = "\n{wName/key{n: {c%s{n (%s)" % (obj.name, obj.dbref) if hasattr(obj, "aliases") and obj.aliases.all(): string += "\n{wAliases{n: %s" % (", ".join(utils.make_iter(str(obj.aliases)))) if hasattr(obj, "sessid") and obj.sessid: string += "\n{wsession{n: %s" % obj.sessid elif hasattr(obj, "sessions") and obj.sessions: string += "\n{wsession(s){n: %s" % (", ".join(str(sess.sessid) for sess in obj.sessions)) if hasattr(obj, "has_player") and obj.has_player: string += "\n{wPlayer{n: {c%s{n" % obj.player.name perms = obj.player.permissions if obj.player.is_superuser: perms = ["<Superuser>"] elif not perms: perms = ["<None>"] string += "\n{wPlayer Perms{n: %s" % (", ".join(perms)) string += "\n{wTypeclass{n: %s (%s)" % (obj.typeclass.typename, obj.typeclass_path) if hasattr(obj, "location"): string += "\n{wLocation{n: %s" % obj.location if obj.location: string += " (#%s)" % obj.location.id if hasattr(obj, "destination"): string += "\n{wDestination{n: %s" % obj.destination if obj.destination: string += " (#%s)" % obj.destination.id perms = obj.permissions if perms: perms_string = (", ".join(perms)) else: perms_string = "Default" if obj.is_superuser: perms_string += " [Superuser]" string += "\n{wPermissions{n: %s" % perms_string locks = str(obj.locks) if locks: locks_string = utils.fill("; ".join([lock for lock in locks.split(';')]), indent=6) else: locks_string = " Default" string += "\n{wLocks{n:%s" % locks_string if not (len(obj.cmdset.all()) == 1 and obj.cmdset.current.key == "Empty"): # list the current cmdsets all_cmdsets = obj.cmdset.all() + (hasattr(obj, "player") and obj.player and obj.player.cmdset.all() or []) all_cmdsets.sort(key=lambda x:x.priority, reverse=True) string += "\n{wCurrent Cmdset(s){n:\n %s" % ("\n ".join("%s (prio %s)" % (cmdset.path, cmdset.priority) for cmdset in all_cmdsets)) # list the commands available to this object avail_cmdset = sorted([cmd.key for cmd in avail_cmdset if cmd.access(obj, "cmd")]) cmdsetstr = utils.fill(", ".join(avail_cmdset), indent=2) string += "\n{wCommands available to %s (all cmdsets + exits and external cmds){n:\n %s" % (obj.key, cmdsetstr) if hasattr(obj, "scripts") and hasattr(obj.scripts, "all") and obj.scripts.all(): string += "\n{wScripts{n:\n %s" % obj.scripts # add the attributes string += self.format_attributes(obj) # add the contents exits = [] pobjs = [] things = [] if hasattr(obj, "contents"): for content in obj.contents: if content.destination: exits.append(content) elif content.player: pobjs.append(content) else: things.append(content) if exits: string += "\n{wExits{n: %s" % ", ".join([exit.name for exit in exits]) if pobjs: string += "\n{wCharacters{n: %s" % ", ".join(["{c%s{n" % pobj.name for pobj in pobjs]) if things: string += "\n{wContents{n: %s" % ", ".join([cont.name for cont in obj.contents if cont not in exits and cont not in pobjs]) separator = "-"*78 #output info return '%s\n%s\n%s' % ( separator, string.strip(), separator )