[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: gcalc.el --- A Google calculator interface
From: |
Christian Herenz |
Subject: |
Re: gcalc.el --- A Google calculator interface |
Date: |
Tue, 29 May 2007 07:19:56 +0200 |
User-agent: |
Thunderbird 2.0.0.0 (X11/20070418) |
I have a question, why should I want to use google calculator instead of
the build-in calculator (M-x calc)?
Greets, Christian
Daniel Jensen schrieb:
> Updated version, adds a customizable feature to copy results to the kill
> ring. (Suggested by Will. Thanks!)
>
>
> ;;; gcalc.el --- A Google calculator interface
>
> ;; Copyright (C) 2007 Daniel Jensen
>
> ;; Author: Daniel Jensen <address@hidden>
> ;; Created: 2007-05-27
> ;; Updated: 2007-05-28
> ;; Version: 2
> ;; Keywords: google calculator
>
> ;; This file is not part of GNU Emacs.
>
> ;; This program is free software; you can redistribute it and/or modify
> ;; it under the terms of the GNU General Public License as published by
> ;; the Free Software Foundation; either version 2 of the License, or
> ;; (at your option) any later version.
> ;;
> ;; This program is distributed in the hope that it will be useful,
> ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
> ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> ;; GNU General Public License for more details.
> ;;
> ;; You should have received a copy of the GNU General Public License
> ;; along with this program; if not, write to the Free Software
> ;; Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
>
> ;;; Commentary:
>
> ;; Installation -- Put the file in your load path and use the
> ;; following in your init file.
> ;;
> ;; (autoload 'gcalc "gcalc" "A Google calculator interface." t)
> ;;
> ;; To use the Google calculator, enter `M-x gcalc RET expression RET'.
> ;; See <http://www.google.com/help/calculator.html> for instructions
> ;; on how to formulate expressions for the calculator. See also
> ;; <http://www.google.com/help/features.html#currency> for help with
> ;; currency conversion.
> ;;
> ;; Note that this interface does not use a Google API. Therefore you
> ;; don't need a license from Google to use it, but it's vulnerable to
> ;; changes in Google's HTML code. If you find that something is
> ;; broken, please report it to the author.
> ;;
> ;; This program uses the url package distributed with Emacs 22.
>
> ;;; Code:
>
> (require 'url)
>
> (defgroup gcalc nil
> "A Google calculator interface."
> :group 'external)
>
> (defcustom gcalc-thousands-separator ","
> "Thousands separator for Google calculator results."
> :type 'string
> :group 'gcalc)
>
> (defcustom gcalc-strip-expressions nil
> "Non-nil means expressions will be stripped from results.
> The default is to show Google's interpretation of the original
> expression together with the result."
> :type 'boolean
> :group 'gcalc)
>
> (defcustom gcalc-copy-results-to-kill-ring nil
> "Non-nil means results will be copied to the kill ring."
> :type 'boolean
> :group 'gcalc)
>
> (defun gcalc-calculate-expression (expression)
> "Parse and return the Google calculator result for EXPRESSION."
> (with-current-buffer (let ((url-show-status nil))
> (url-retrieve-synchronously
> (concat "http://www.google.com/search?q="
> (url-hexify-string expression))))
> (goto-char (point-min))
> (when (re-search-forward "<font size=\\+1><b>\\(.*?\\)</b>" nil t)
> (let ((result (match-string 1)))
> (setq result (replace-regexp-in-string "×" "*" result))
> (setq result (replace-regexp-in-string "<sup>\\(.+?\\)</sup>"
> "^(\\1)" result))
> (setq result
> (replace-regexp-in-string "<font size=-2>\\s +?</font>"
> gcalc-thousands-separator result))
> (when gcalc-strip-expressions
> (setq result (cadr (split-string result "\\s +=\\s +"))))
> (kill-buffer (current-buffer))
> result))))
>
> (defvar gcalc-history nil
> "History list of Google calculator expressions.")
>
> ;;;###autoload
> (defun gcalc (expression &optional insert-result-p)
> "Ask the Google calculator for the answer to an expression.
> With prefix argument, insert the result at point.
> With `gcalc-copy-results-to-kill-ring' set to true, copy the
> result to the kill ring."
> (interactive
> (list (read-string "Google calculator: " nil 'gcalc-history)
> current-prefix-arg))
> (let ((result (gcalc-calculate-expression expression)))
> (if (null result)
> (message "No result for `%s'." expression)
> (when gcalc-copy-results-to-kill-ring
> (kill-new result))
> (if (not insert-result-p)
> (message "%s" result)
> (push-mark)
> (insert result)))))
>
> (provide 'gcalc)
>
> ;;; gcalc.el ends here
>