in reply to PerlMonks Editor
That is nice, because it attempts to be PerlMonks markup aware.
Here's the thing I use to edit nodes locally using any editor, whether vi, Netscape Composer, or whatever.
As you can see, the default editor I have hardcoded is my local installation of Mozilla Editor (formerly aka Netscape Composer, I think).
use LWP::UserAgent;
use HTML::Entities qw( decode_entities );
use HTTP::Request::Common qw(POST);
use Getopt::Long;
use strict;
use warnings;
my $base_url = "http://perlmonks.org/";
my $edit_cmd = '"C:\\Program Files\\mozilla.org\\Mozilla\\mozilla.exe"
+ -editor "file://%s"';
my $node_id;
my $username;
my $password;
GetOptions(
'node_id|id=s' => \$node_id,
'username=s' => \$username,
'password|pw=s' => \$password,
'editor|edit_cmd=s' => \$edit_cmd,
);
$edit_cmd =~ /%s/ or $edit_cmd .= ' "%s"';
sub prompt_for
{
my $p = shift;
print "\n$p: ";
local $_ = <>;
chomp;
$_ =~ /^$/ and die "aborted.\n";
$_
}
$node_id ||= prompt_for('NodeID');
$username ||= prompt_for('UserName');
$password ||= prompt_for('Password');
my %params = (
op => 'login',
user => $username,
ticker => 'yes',
displaytype => 'xml',
xmlstyle => 'flat',
node_id => $node_id,
);
my $ua = LWP::UserAgent->new;
$ua->agent("NodeEditor/0.1 ");
my $params = join '&', map { $_ . '=' . $params{$_} } keys %params;
my $req = HTTP::Request->new( GET => $base_url.'?'.$params );
my $res = $ua->request($req);
$res->is_success or die "GET Error: " . $res->status_line . "\n";
$_ = $res->content;
my( $title ) = /<node .*\btitle="([^"]*)"/;
my( $text ) = /<doctext\b[^>]*>(.*)<\/doctext>/s;
$text = decode_entities( $text );
my $text_has_dos_eoln = $text =~ /\r\n/ && $text !~ /[^\r]\n/;
$text =~ s/\r//g;
my $filename = "node_$node_id.html";
my $perl_filename = "$ENV{TMP}/$filename";
open F, "> $perl_filename" or die "write $perl_filename - $!\n";
print F "<html><head><title>$title</title></head><body>\n$text\n</body
+></html>\n";
close F;
print "\n";
system sprintf $edit_cmd, $perl_filename;
open F, "< $perl_filename" or die "read $perl_filename - $!\n";
$_ = do { local $/; <F> };
close F;
s/^<!DOCTYPE[^>]*>\s*//i;
my( $new_title, $new_text ) =
/^<html><head><title>([^<]*)<\/title><\/head><body>(.*)<\/body><\/html
+>/s
or die "you screwed up the format!";
#die "title='$new_title'\n\n'$new_text'\n\n";
$text_has_dos_eoln and $new_text =~ s/\n/\r\n/g;
$req = POST $base_url, [ %params,
sexisgood => "update",
note_title => $new_title,
note_doctext => $new_text,
passwd => $password,
];
$res = $ua->request($req);
$res->is_success or die "POST Error: " . $res->status_line . "\n";
print $res->status_line, "\n";
We're building the house of the future together.
Re^2: PerlMonks Editor
by GrandFather (Saint) on Apr 18, 2006 at 22:08 UTC
|
This looks pertinent to version 2 of the editor - scrape the node being replied to (to allow quoted material from the OP) and post the reply directly. Thanks for the reply!
DWIM is Perl's answer to Gödel
| [reply] |
|
In your code the following line
use constant kParaSpace => 4;
appears to be the setting for the gap between paragraphs when the paragraph tags are used.
When I tested your editor the gap between paragraphs is rather wider than seems to be the norm in most PerlMonks posts. Perhaps kParaSpace should be set to 2?
This is a minor nitpick; otherwise this is very slick. Kudos to you...
Scott
PS: This node was written (mostly)using your editor:)
| [reply] [d/l] |
|
Your analysis is quite correct Scott. That feature was jammed in just before I posted the code immediately before leaving on holiday over Easter so the gap hasn't been fine tuned. However I suspect it may be influenced by things such as the default font being used by the Text widget and perhpas by various system settings and display resolution.
A number of things such as that could be made user preferences when the code is more fully developed.
Glad to hear that you are using it for real BTW - Kudos to you :). (It's really a rather preliminary version.)
DWIM is Perl's answer to Gödel
| [reply] |
|
| [reply] |
Re^2: PerlMonks Editor, console editor wrapper, unix strain (pm_vi)
by jakobi (Pilgrim) on Oct 03, 2009 at 15:41 UTC
|
My thanx for the console offline editor (and also to GrandFather for this thread).
I've slightly modified it for Unix, which will hopefully be
forgiven by jdporter. It should still support Windows, just as
before. And until I find a willing victim, I'll keep this version working
|
For my personally, the main advantage of this solution over PMEdit
is that the script wraps around your standard editor, and I thus can
avoid TK and WYSIAYCEHTG.
It's also quite useful to take a peek at the PM-html source of a
node, e.g. how the heck did that fellow monk manage a blue background
(A: class=settings_key; grey is class=readmore)? Especially nice with
vim highlighting and the original whitespace (alternatively follow the
xml link or add ;displaytype=xml to the URL).
Changes include:
- .netrc-support for credentials plus use of $EDITOR (set e.g. to vi, gvim, or gvim.exe)
- skip upload if temporary file is unchanged
- allow use of http urls, perlmonks.org w/o protocol, and non-numerical 'node='-type id's
- 20091004: be a bit less obscure on a missing -id. Some better
guesses for a windows _netrc, and a notion of shortcuts (e.g.
self for this very node; short cut are builtin or in a user-defined file $0.short).
For backup, both the original and the new editor buffer are kept in /tmp (un-versioned, un-dated).
This pretty much implements the rest of what I perceived as missing features.
Possible Todos:
- add options to just read or write to allow use in vim autocommands
(e.g. vimdiff or reading two or three nodes into the same buffer; and
probably also very helpful for the everything-in-one-vim fraction,
which I don't belong to -> very low pri)
Known Bugs:
- I don't see any way to use this script with the private scratchpad,
as displaymode=private and viewmode=xml within an URL seem to clash
(server side, not pm_vi).
- changes to home node or scratchpad are silently discarded by PM.
- no idea what the corresponding _netrc location on windows would be.
Search for ZZZ to update my guesswork. Or change some profile for cmd to
provide $ENV{HOME} and place a .netrc (or _netrc) file in this dir.
- AFAIK perlmonks.org has 64K limits on at least some of its nodes.
Prod me if there's a need to replace the (.*) regex capture group
with real code; but much to my enjoyment, the 64K regex
pattern/capture-group 'stretch' limit seems to be ancient history
(since at least 5.8, as tested with a simple ([\s\S]*)).
Currently the script prints out a paranoid 20K reminder asking
the user to double-check larger nodes (20K may well expand upto the 64K range
with HTML entities).
- 20091009: title entity encoding issue fixed (I think)
A diff -u is a bit long compared to the script (given that I
touched only 3 locations, excluding whitespace, comments and 2
variables...), so here's the script in full:
| [reply] [d/l] [select] |
|
| [reply] |
|
|