parent $thing parent $text parent $public object $note var $root dbref 'note var $root child_index 26 var $root fertile 1 var $root manager $note var $root owned [$note] var $root owners [$note] var $root writable [] var $root readable ['parameters, 'methods, 'code] var $text text [] var $root inited 1 var $located location $nowhere var $located obvious 1 var $messaged messages #[] var $described prose #[] var $has_verbs verbs #[["erase %this", ['erase_vrb, 'remote]], ["read|nread %this", ['read_vrb, 'remote]], ["write on %this", ['write_vrb, 'remote]], ["write at * on %this", ['write_at_vrb, 'remote]], ["write * on %this", ['write_str_vrb, 'remote]], ["copy from %this to *", ['copy_vrb, 'remote]], ["erase * on|from %this", ['erase_on_vrb, 'remote]]] var $gendered gender $gender_neuter var $named name ['uniq, "Generic Note"] var $named name_aliases ["note"] var $note seperator 0 var $public public [] var $root info ["Generic Note", "============", "", "For basic editing and saving of text.", "", "Descendant of $text", "", "Commands:", "", " \"erase * on %this\" rmt 'erase_on_vrb", " \"erase %this\" rmt 'erase_vrb", " \"read|nread %this\" rmt 'read_vrb", " \"write on %this\" rmt 'write_vrb", " \"write at * on %this\" rmt 'write_at_vrb", " \"write * on %this\" rmt 'write_str_vrb", " \"copy from %this to *\" rmt 'copy_vrb", "", "erase", "-----", "", "Erases all or part of the text. \"erase %this\" and \"erase all on %this\" erases all text from the note. \"erase <line(s)> on %this\" erases a line or lines from the note, example: \"erase 2-5 on %this\".", "", "read|nread", "----------", "", "Read the text. \"nread\" will read the text and prepend each line with it's relative number.", "", "write", "-----", "", "Write on the note using this command. \"write on %this\" will accept text after the command line and append it to the end. \"write <line> on %this\" will add the line to the end of the note. \"write at <line> on %this\" will accept text after the command line and place it in the text beginning at <line>.", "", "copy", "----", "", "Used to copy the text from the note to either another descendant of $note or if a method is specified it sends to that method instead.", "", "Maintenance", "===========", "", "As an owner of the note object you can set it as publicly writable or readable. The Note is a child of the generic public object, so you can do this by using the \"@public\" command (Syntax: `@public on note <+|-[w?ritable|r?eadable]>`). Writers following the system permissions scheme are also allowed to write on the note.", "", "The seperator can be changed using eval on the .set_seperator() method. This is not a command as most people don't change it."] method read_vrb arg vrb, [args]; var who, text, prose; who = sender(); if ((!(.is_publicly('readable))) && (!(.trusts(who)))) return who.tell((.name('def)) + " is not publicly readable!"); who.tell(.name('def)); prose = .prose('literal); if (prose) who.tell((| prose['short] |) || []); who.tell(.seperator()); text = .text(); if ((vrb == "nread") && text) text = $list.numbered_text(text); who.tell(text ? text | ["", "(nothing)", ""]); who.tell(.seperator()); who.tell(("You finish reading " + (.name('def))) + "."); . method write_vrb arg write, [args]; var who, line; who = sender(); if ((!(.is_publicly('writable))) && (!(.is_writable_by(who)))) return who.tell((.namef()) + " is not publicly writable!"); // because I'm odd lets do this all 1 one command. if (listlen(args) == 2) { line = "Now writing on " + (.name('def)); line = line + ", enter \".\" to finish and \"@abort\" to abort."; // who.tell(line); .add_text(who.read(line), who); } else { args = explode(args[1]); who.debug(args); } . method erase_on_vrb arg erase, str, prep, this; var line, nline, who, len, oldline; who = sender(); if ((!(.is_publicly('writable))) && (!(.is_writable_by(who)))) return who.tell((.namef()) + " is not publicly writable!"); if (!str) return who.tell("You must erase either a line, line number, or all"); catch any { if (match_begin("all", str)) { .del_text(); // if erase is null, this method was called by an editor if (erase) who.tell(("All text cleared from " + (.name('def))) + "."); } else { if (listlen(explode(str)) > 1) nline = toint(explode(str)[2]); else nline = toint(str); oldline = (.text())[nline]; .del_nline(nline); line = ("Line " + tostr(nline)) + " (\""; len = (who.linelen()) - (25 + strlen(.name('def))); line = line + ($string.chop(oldline, len)); line = (line + "\") erased from ") + (.name('def)); who.tell(line); } } with handler { switch (error()) { case ~range: who.tell("There are not that many lines in the text."); default: who.tell("Oops: " + ((traceback()[1])[2])); } } . method erase_vrb arg erase, this; var line, nline, len; if ((!(.is_publicly('writable))) && (!(.is_writable_by(sender())))) return sender().tell((.namef()) + " is not publicly writable!"); .del_text(); // if erase is null, this method was called by an editor originally. if (erase) sender().tell(("All text cleared from " + (.name('def))) + "."); . method add_text arg ntext, who, [args]; // if at they should be an int defining where to insert. if (sender() != this()) { if ((!(.is_publicly('writable))) && (!(.is_writable_by(sender())))) throw(~perm, "Permission Denied."); } if (ntext) { if (ntext == 'aborted) return; if (args) { if (!(| .ins_lines(ntext, args[1]) |)) who.tell(("There are not that many lines in " + (.name('ref))) + "."); } else { .set_text((.text()) + ntext); } who.tell(((("Line" + ((listlen(ntext) == 1) ? "" | "s")) + " added to ") + (.name('def))) + "."); } else { who.tell("Text not added."); } . method seperator return (type(seperator) == 'string) ? seperator | "---"; . method write_str_vrb arg write, str, prep, this; var who, line; who = sender(); if ((!(.is_publicly('writable))) && (!(.is_writable_by(who)))) return who.tell((.namef()) + " is not publicly writable!"); if (!str) return .tell(("Nothing to write on " + (.name('def))) + "!"); .add_text([str], sender()); . method write_at_vrb arg write, at, str, prep, this; var who, line, lines, syn; who = sender(); if ((!(.is_publicly('writable))) && (!(.is_writable_by(who)))) return who.tell((.namef()) + " is not publicly writable!"); syn = ((("`" + write) + " at [line] <line number> on ") + this) + "`"; str = explode(str); if ((str[1]) == "line") str = delete(str, 1); line = $string.is_numeric(str[1]); if (!at) $parse.tell_error(("Unknown line \"" + (str[1])) + "\".", syn, who); lines = listlen(.text()); if (line > (lines + 1)) $parse.tell_error(("There are only " + tostr(lines)) + " lines!", syn, who); .add_text(who.read(), who, line); . method copy_vrb arg com, from, this, prep, where; var obj, what; // this method is outdated, needs to be rewritten. // it probably doesn't even work. if ((!(.is_writable_by(sender()))) && (!(.is_publicly_readable()))) return sender().tell(("You cannot read the text on " + (.namef('ref))) + "."); if ("." in where) { where = $parse.reference(where); what = 1; } else { where = $parse.reference(where, ","); } obj = sender().match_env_nice(where[1]); if (!(obj.is_writable_by(sender()))) return .tell(("! " + (obj.namef('ref))) + " is not owned by you."); if ((obj.has_ancestor($note)) && (!(where[2]))) obj.add_text(text, sender()); // they want a method ref if (where[2]) { catch any { where = tosym(where[2]); if (what) { obj.(where)(text, sender()); sender().tell(((("Text copied to " + ($data.unparse(obj))) + ".") + tostr(where)) + "()."); } else { if (!(where in (obj.parameters()))) return .tell(("! parameter '" + tostr(where)) + " not found"); obj.eval([(tostr(where) + " = ") + ($data.unparse(.text()))]); } } with handler { $brandon.tell_traceback(traceback()); $parse.tell_error((traceback()[1])[2], ("`" + com) + " <obj>[.,<destination]`", sender()); } } sender().tell("Text copied from " + (.namef())); . method init_note .perms(caller(), $root); .set_readable(['methods, 'code]); . method init_for_core .perms(caller(), $sys); . method set_seperator arg newsep; .perms(sender(), 'manager); seperator = newsep; .