use strict; use WWW::Mechanize; >> my $agent = WWW::Mechanize->new( autocheck => 1 ); > > $agent->get('http://cgi.darwinawards.com/cgi/random.pl'); > >> my $content = $agent->content( format => "text" ); | >my $cr = chr 169; > |$content =~ s/.*\d\d\s+Urban Legend//s; > |$content =~ s/.*\d\d\s+Personal Account//s; > |$content =~ s/.*Reader Submission\s+Pending Acceptance//s; > >$content =~ s/\s*DarwinAwards\.com\s*$cr.*//s; > $content =~ s/.*?\([^\)]*?\d{2}[^\)]*\) //s; > $content =~ s/.*Darwin\s?Award\s?Nominee//si; > $content =~ s/.*Confirmed \S+\s?by Darwin//si; > $content =~ s/.*Honorable Mentions//s; > $content =~ s/submitted by.*//si; > $content =~ s/109876543210.*//s; > $content =~ s/^\s+//; | > print $content; #### (add-to-list 'load-path "~/.site-lisp") (autoload 'b-xref "b-xref.el" "Cross-references perl symbols" t) #### (defun b-xref () (interactive) (let ((output-buffer-name (concat "*b-xref-" (buffer-name) "*"))) (let ((old-buffer (get-buffer output-buffer-name))) (if old-buffer (kill-buffer old-buffer))) (let ((point (point)) (mark (if mark-active (mark) (point))) (orig-buffer (current-buffer)) (buffer (get-buffer-create (concat "*b-xref-" (buffer-name) "*")))) (save-excursion (save-restriction (widen) (copy-to-buffer buffer (point-min) (point-max)) (set-buffer buffer) (b-xref-mode) (buffer-disable-undo) (let ((jots (b-xref-summarize (sort (let ((xref (b-xref-buffer orig-buffer))) (b-xref-filter-lines xref (point->line (min point mark)) (point->line (max point mark)))) 'b-xref-alist->)))) (mapc 'b-xref-do-jots jots)) (set-buffer-modified-p nil) (toggle-read-only))) (display-buffer buffer)))) (defvar b-xref-bin "perl") (defvar b-xref-jot ">") (defvar b-xref-fill "|") (defvar b-xref-fill-space " ") (defvar b-xref-mode-map nil "Keymap for B::Xref major mode.") (if b-xref-mode-map nil (setq b-xref-mode-map (make-sparse-keymap))) (defun b-xref-mode () "Major mode for viewing B::Xref data overlayed on perl code. Special commands: \\{b-xref-mode-map}" (interactive) (kill-all-local-variables) (fundamental-mode) (setq major-mode 'b-xref-mode) (setq mode-name "B::Xref") (use-local-map b-xref-mode-map) (run-hooks 'b-xref-hook)) (defun point->line (point) (let ((line 1)) (save-excursion (goto-char (point-min)) (while (< (point) point) (incf line) (forward-line))) line)) ; (defun b-xref-summarize (xref) (loop with xref-output for (subname line pack type name event) in xref do (let ((key (list pack name))) (let ((pair (assoc key xref-output))) (if pair (let ((lines (cdr pair))) (or (member line lines) (nconc lines (list line)))) (push (cons key (list line)) xref-output)))) finally (return xref-output))) (defun b-xref-filter-lines (xref start end) (let ((to-find (loop for (subname line pack type name event) in xref when (and (>= line start) (<= line end)) collect (list pack name)))) (remove-if-not (lambda (i) (member (list (nth 2 i) (nth 4 i)) to-find)) xref))) (defun b-xref-list-> (a b) "Sorts a list so larger numbers go first, then shorter lists." (if (and (numberp (car a)) (numberp (car b))) (or (> (car a) (car b)) (and (= (car a) (car b)) (b-xref-list-> (cdr a) (cdr b)))) (and (null a) (not (null b))))) (defun b-xref-alist-> (a b) "Sorts the elements of an alist with `b-xref-list->'" (b-xref-list-> (cdr a) (cdr b))) ; (sort xref-output 'b-xref-alist->))))) (require 'cl) (defsubst min-list (list) (reduce 'min list)) (defsubst max-list (list) (reduce 'max list)) (defsubst line->point (line) (goto-line line) (point)) (defun b-xref-do-jots (pair) "Make space for jots and call `b-xref-jot-line' to place them." (string-rectangle (point-min) (progn (goto-char (point-max)) (beginning-of-line) (point)) b-xref-fill-space) (let ((name (concat (nth 0 (car pair)) ":" (nth 1 (car pair)))) (lines (cdr pair))) (let ((min-line (min-list lines)) (max-line (max-list lines))) (delete-rectangle (line->point min-line) (+ 1 (line->point max-line))) (string-rectangle (line->point min-line) (line->point max-line) b-xref-fill) (mapcar (lambda (l) (b-xref-jot-line l name)) lines)))) (defun b-xref-jot-line (line name) "Jot a note on LINE." (goto-char (line->point line)) (delete-char 1) (insert (propertize b-xref-jot 'help-echo name 'point-entered (message-displayer name)))) (defun message-displayer (message) (lexical-let ((lexical-message message)) (lambda (old-point new-point) (display-message-or-buffer lexical-message)))) ;(setq message-displayer-cache nil) ;(defadvice message-displayer (around singleton-displayer) ; (let ((cached-function (assoc (ad-get-arg 1) message-displayer-cache))) ; (if (not cached-function) ; (push (cons (ad-get-arg 1) ad-do-it) message-displayer-cache)) ; (cdr (assoc (ad-get-arg 1) message-displayer-cache)))) ;(ad-activate 'message-displayer) (defun b-xref-buffer (buffer) "Runs a buffer through 'perl -MO=Xref,-raw' and returns the parsed data." (save-excursion (save-restriction (set-buffer buffer) (widen) (goto-char (point-min)) (let ((perl (if (looking-at auto-mode-interpreter-regexp) (match-string 2) (or b-xref-bin "perl"))) (infile (if (buffer-modified-p) (error "TODO: Copy modified buffer to temp file.") (buffer-file-name))) (buffer (generate-new-buffer "*b-xref-raw*"))) (let ((rc (call-process perl infile buffer nil "-MO=Xref,-raw"))) (or (zerop rc) (error "%s exited with %d" perl rc))) (let ((xref-output (b-xref-read-raw buffer "-"))) (kill-buffer buffer) xref-output))))) (defun trim (str) (rtrim (ltrim str))) (defun ltrim (str) (replace-regexp-in-string "^ +" "" str)) (defun rtrim (str) (replace-regexp-in-string " +$" "" str)) (defun b-xref-read-raw (buffer filename) "Reads the output from 'perl -MO=Xref,-raw'." (save-excursion (save-restriction (set-buffer buffer) (widen) (goto-char (point-min)) (let (xref-output (xref-regexp (concat "^" (regexp-quote filename) (let ((pad (- 16 (length filename)))) (if (> pad 0) (make-string pad ? ) "")) " \\(............[^ \n]*\\)" " \\(.....[^ \n]*\\)" " \\(............[^ \n]*\\)" " \\(....[^ \n]*\\)" " \\(................[^ \n]*\\)" " \\([^\n]+\\)\n"))) (while (re-search-forward xref-regexp nil t) (or (bolp) (forward-line)) (let ((subname (trim (match-string 1))) (line (string-to-number (trim (match-string 2)))) (pack (trim (match-string 3))) (type (trim (match-string 4))) (name (trim (match-string 5))) (event (trim (match-string 6)))) (push (list subname line pack type name event) xref-output))) xref-output)))) (provide 'b-xref)