;;; gblogger.el --- new Atom Blogger API client ;;; $Id$ ;;; $Author:$ ;;; Description: ATOM Blogger API ;;; Keywords: g-client, Blogger Atom API ;;{{{ LCD Archive entry: ;;; LCD Archive Entry: ;;; g-client| T. V. Raman |raman@cs.cornell.edu ;;; An emacs interface to Google services| ;;; $Date: 2006-09-28 09:37:06 -0700 (Thu, 28 Sep 2006) $ | ;;; $Revision$ | ;;; Location undetermined ;;; License: GPL ;;; ;;}}} ;;{{{ Copyright: ;;; Copyright (c) 2005--2006, Google Inc. ;;; All rights reserved. ;;; Redistribution and use in source and binary forms, with or without modification, ;;; are permitted provided that the following conditions are met: ;;; * Redistributions of source code must retain the above copyright notice, ;;; this list of conditions and the following disclaimer. ;;; * Redistributions in binary form must reproduce the above copyright notice, ;;; this list of conditions and the following disclaimer in the documentation ;;; and/or other materials provided with the distribution. ;;; * The name of the author may not be used to endorse or promote products ;;; derived from this software without specific prior written permission. ;;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" ;;; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ;;; ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE ;;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE ;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ;;; HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, ;;; STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY ;;; WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ;;; SUCH DAMAGE. ;;}}} ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Commentary: ;;{{{ introduction ;;; Simple wrapper using Curl to post/edit Blogger.com Blogs ;;; posts are edited as XML ;;;nxml-mode is highly recommend and will be used if available. ;;;Usage: ;;; gblogger-blog -- Show feed of current user's blogs ;;; gblogger-new-entry -- Create a new post ;;; gblogger-edit-entry -- Edit previously posted entry ;;; gblogger-delete-entry -- Delete previously posted entry ;;; Commands prompt for the URI of the entry being manipulated --- ;;; this is the service.edit URI. ;;; You can customize things via custom. ;;}}} ;;{{{ Required modules (require 'cl) (require 'derived) (require 'g-utils) (require 'g-auth) (require 'g-app) ;;}}} ;;{{{ customizations (defgroup gblogger nil "Emacs client for posting to blogger." :group 'g) (defcustom gblogger-user-email nil "Mail address that identifies blogger user." :type '(choice (const :tag "none" nil) (string :tag "username@gmail.com" "")) :group 'gblogger) (defcustom gblogger-user-password nil "Password for authenticating to reader account." :type '(radio (const :tag "Prompt for password" nil) (string :tag "Save password in .emacs")) :group 'gblogger) (defcustom gblogger-author (user-full-name) "Author name under which we post." :type 'string :group 'gblogger) (defvar gblogger-generator-name "http://purl.org/net/emacs-gblogger/" "Name of this generator.") (defvar gblogger-publish-action nil "This is set up by the various interactive comands to trigger the appropriate action when one is ready to publish.") (defvar gblogger-new-entry-template " %s %s %s
" "Template for new Blogger entries.") ;;}}} ;;{{{ constants: (defconst gblogger-service-name "blogger" "Service name for accessing Blogger.") (defconst gblogger-base-url "http://www.blogger.com/feeds/default/blogs" "Base url for blogger access.") (defsubst gblogger-p (service) "Check if this is blogger." (declare (special gblogger-service-name)) (string-equal service gblogger-service-name)) ;;}}} ;;{{{ blogger Authenticate (defsubst make-gblogger-auth () "Make a new gblogger auth handle." (declare (special gblogger-service-name gblogger-user-email gblogger-user-password)) (make-g-auth :service gblogger-service-name :email gblogger-user-email :password gblogger-user-password)) (defvar gblogger-auth-handle (make-gblogger-auth) "Gblogger auth handle. Holds user's email address, password, and the auth token received from the server.") ;;}}} ;;{{{ Interactive Commands: ;;;###autoload (defun gblogger-blog () "Retrieve and display feed of feeds after authenticating." (interactive) (declare (special gblogger-auth-handle gblogger-base-url)) (g-app-view gblogger-auth-handle gblogger-base-url)) ;;;###autoload (defun gblogger-atom-display (feed-url) "Retrieve and display specified feed after authenticating." (interactive (list (read-from-minibuffer "Feed: " (browse-url-url-at-point)))) (declare (special gblogger-auth-handle)) (g-app-view gblogger-auth-handle feed-url)) (defun gblogger-get-entry (url) "Retrieve specified entry. `url' is the URL of the entry" (declare (special gblogger-auth-handle)) (save-excursion (set-buffer (g-app-get-entry gblogger-auth-handle url)) (current-buffer))) ;;;###autoload (defun gblogger-edit-entry (url) "Retrieve entry and prepare it for editting. The retrieved entry is placed in a buffer ready for editing. `url' is the URL of the entry." (interactive (list (read-from-minibuffer "Entry URL:"))) (declare (special gblogger-auth-handle)) (let ((buffer (g-app-get-entry gblogger-auth-handle url))) (save-excursion (set-buffer buffer) (setq g-app-publish-action 'g-app-put-entry) (g-xsl-transform-region (point-min) (point-max) g-atom-edit-filter) (goto-char (point-min)) (flush-lines "^ *$")) (switch-to-buffer buffer) (goto-char (point-min)) (search-forward "content" nil t) ;(search-backward "") (insert (format " " label)))) ;;}}} ;;{{{ Reset auth handle: ;;;###autoload (defun gblogger-sign-out() "Resets client so you can start with a different userid." (interactive) (declare (special gblogger-auth-handle gblogger-user-email gblogger-user-password)) (message "Signing out %s from blogger" (g-auth-email gblogger-auth-handle)) (setq gblogger-user-email nil gblogger-user-password nil) (setq gblogger-auth-handle (make-gblogger-auth))) ;;;###autoload (defun gblogger-sign-in() "Resets client so you can start with a different userid." (interactive) (declare (special gblogger-auth-handle gblogger-user-email )) (setq gblogger-user-email (read-from-minibuffer "User Email:")) (setq gblogger-auth-handle (make-gblogger-auth)) (g-authenticate gblogger-auth-handle)) ;;}}} (provide 'gblogger) ;;{{{ end of file ;;; local variables: ;;; folded-file: t ;;; byte-compile-dynamic: t ;;; end: ;;}}}