unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
* good enough for MELPA work?
@ 2020-02-26  7:27 Emanuel Berg via Users list for the GNU Emacs text editor
  2020-02-26  9:16 ` Emanuel Berg via Users list for the GNU Emacs text editor
  0 siblings, 1 reply; 2+ messages in thread
From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2020-02-26  7:27 UTC (permalink / raw)
  To: help-gnu-emacs

OK, I got it to work, the code looks OK.

I used (checkdoc-current-buffer t) to help with
the conventions.

It (checkdoc) still complains about the first
line, but that is OK, right? So that is a bug,
if indeed alright.

It also complains about every function not
being documented but I think not everything has
to be, only interactive functions for sure.
Maybe I'll still do it later, just to shut it
up and prove who has the better fighter and the
better gym.

The one thing I wonder tho is, does Emacs have
one global namespace? If so, should you adhere
to some convention with respect to names?
How do you avoid collisions?

Personally I only have a couple of packages
from M/ELPA but I know some people are big
consumers, so I wonder how that works
out, for them?

;;; isbn-verify - Verify ISBN-10 and ISBN-13 -*- lexical-binding: t -*-
;;
;;; Commentary:
;;
;; This Elisp package provides functions to
;; verify ISBNs by computing their check
;; digits. The package can be found here:
;;   <https://dataswamp.org/~incal/emacs-init/isbn-verify.el>
;;
;; For more info on ISBNs and how the check
;; digits are computed, see:
;;   <https://dataswamp.org/~incal/books/isbn.txt>
;;
;; To see how it works, try
;; `check-isbn-at-point' on these two Biblatex
;; entries, the first one with ISBN-10, the
;; second with ISBN-13. Place point at the
;; beginning of the ISBN, then do M-x ciap RET
;;
;; @book{russia-and-the-arms-trade,
;;   author    = {Ian Anthony},
;;   isbn      = {0-19-829278-3},
;;   publisher = {Oxford},
;;   title     = {Russia and the Arms Trade},
;;   year      = 1998
;; }
;;
;; @book{baa-lo-4,
;;   author     = {Yukito Kishiro},
;;   isbn       = {978-1-61262-294-1},
;;   publisher  = {Kodansha},
;;   title      = {Battle Angel Alita: The Last Order 4},
;;   year       = {2014 (2011)}
;; }
;;
;; Or, with Lisp:
;;
;;   (checksum-isbn-10 "0-19-829576-6")     ; 6
;;   (checksum-isbn-13 "978-1-61262-294-1") ; 1
;;
;;; Code:

(require 'cl-lib)

(defun digits-only-string (str)
  (replace-regexp-in-string "[^0-9]" "" str) )

(defun check-isbn-at-point ()
  "Compute and echo the check digit from the ISBN at point."
  (interactive)
  (let*((isbn-string (thing-at-point 'symbol t))
        (digits-only (digits-only-string isbn-string))
        (num-digits  (length digits-only))
        (check-digit (if (> num-digits 10)
                         (checksum-isbn-13 digits-only)
                       (checksum-isbn-10 digits-only) )))
    (message "check digit: %s" check-digit)
    ))
(defalias 'ciap #'check-isbn-at-point)

(defun char-to-int (c)
  (- c ?0))

(defun isbn-integer-list (isbn)
  (let*((digits-only       (digits-only-string isbn))
        (isbn-list         (string-to-list digits-only))
        (isbn-ints         (cl-map 'list
                                   (lambda (c) (char-to-int c))
                                   isbn-list) ))
    isbn-ints) )

(defun checksum-isbn-13 (isbn)
  (let*((isbn-ints (isbn-integer-list isbn))
        (sum       0))
    (cl-loop for e in isbn-ints
             for i from 0 to 11
             do (progn (message "%d" i)
                       (cl-incf sum (* e (or (and (zerop (mod i 2)) 1) 3)))
                       )
             )
    (let ((checksum (- 10 (mod sum 10))))
      (if (= 10 checksum) 0 checksum) )))

;; 13 ISBN-13 tests:
;;
;; (checksum-isbn-13 "91-518-4657-8")     ; 8
;; (checksum-isbn-13 "978-1-63236-616-0") ; 0
;; (checksum-isbn-13 "978-91-0-012814-2") ; 2
;; (checksum-isbn-13 "978-91-29-59023-4") ; 4
;; (checksum-isbn-13 "978-91-7037-681-8") ; 8
;; (checksum-isbn-13 "978-91-7515-205-9") ; 9
;; (checksum-isbn-13 "978-91-7515-317-9") ; 9
;; (checksum-isbn-13 "978-91-86936-31-0") ; 0
;; (checksum-isbn-13 "978-91-87861-54-3") ; 3
;; (checksum-isbn-13 "978-91-87861-67-3") ; 3
;; (checksum-isbn-13 "978-91-87861-99-4") ; 4
;; (checksum-isbn-13 "9780062802187")     ; 7
;; (checksum-isbn-13 "9789188805034")     ; 4

(defun checksum-isbn-10 (isbn)
  (let*((isbn-ints (isbn-integer-list isbn))
        (sum       0) )
    (cl-loop for e in isbn-ints
             for i downfrom 10 to 2
             do (cl-incf sum (* e i)) )
    (let ((checksum (mod (- 11 (mod sum 11)) 11)))
      (if (= 10 checksum) "X" checksum) )))

;; 10 ISBN-10 tests:
;;
;; (checksum-isbn-10 "0-201-53992-6") ; 6
;; (checksum-isbn-10 "0312168144")    ; 4
;; (checksum-isbn-10 "1-4012-0622-0") ; 0
;; (checksum-isbn-10 "1616558717")    ; 7
;; (checksum-isbn-10 "91-510-6483-9") ; 9
;; (checksum-isbn-10 "91-7054-940-0") ; 0
;; (checksum-isbn-10 "91-7089-710-7") ; 7
;; (checksum-isbn-10 "91-85668-01-X") ; X
;; (checksum-isbn-10 "91-88930-23-8") ; 8
;; (checksum-isbn-10 "9177988515")    ; 5

(provide 'isbn-verify)
;;; isbn-verify.el ends here

-- 
underground experts united
http://user.it.uu.se/~embe8573
https://dataswamp.org/~incal




^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: good enough for MELPA work?
  2020-02-26  7:27 good enough for MELPA work? Emanuel Berg via Users list for the GNU Emacs text editor
@ 2020-02-26  9:16 ` Emanuel Berg via Users list for the GNU Emacs text editor
  0 siblings, 0 replies; 2+ messages in thread
From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2020-02-26  9:16 UTC (permalink / raw)
  To: help-gnu-emacs

> It (checkdoc) still complains about the first
> line, but that is OK, right? So that is
> a bug, if indeed alright.

Here what it says:

*** isbn-verify.el: checkdoc-current-buffer V 0.6.1
isbn-verify.el:0: The first line should be of the form: ";;; package --- Summary"

All other warnings are now gone, I added some
dorky documentation because I can't handle
programs warning me about stuff. It comes with
the territory.

;;; isbn-verify - Verify ISBN-10 and ISBN-13 -*- lexical-binding: t -*-
;;
;;; Commentary:
;;
;; This Elisp package provides functions to
;; verify ISBNs by computing their check
;; digits. The package can be found here:
;;   <https://dataswamp.org/~incal/emacs-init/isbn-verify.el>
;;
;; The package was last modified by Emanuel Berg
;; 2020-02-26. Mail feedback to <moasenwood@zoho.eu>
;; or talk to me at IRC, I'm incal on freenode.
;;
;; For more info on ISBNs and how the check
;; digits are computed, see:
;;   <https://dataswamp.org/~incal/books/isbn.txt>
;;
;; To see how it works, try
;; `check-isbn-at-point' on these two Biblatex
;; entries, the first one with ISBN-10, the
;; second with ISBN-13. Place point at the
;; beginning of the ISBN, then do M-x ciap RET
;;
;; @book{russia-and-the-arms-trade,
;;   author    = {Ian Anthony},
;;   isbn      = {0-19-829278-3},
;;   publisher = {Oxford},
;;   title     = {Russia and the Arms Trade},
;;   year      = 1998
;; }
;;
;; @book{baa-lo-4,
;;   author     = {Yukito Kishiro},
;;   isbn       = {978-1-61262-294-1},
;;   publisher  = {Kodansha},
;;   title      = {Battle Angel Alita: The Last Order 4},
;;   year       = {2014 (2011)}
;; }
;;
;; Or, with Lisp:
;;
;;   (checksum-isbn-10 "0-19-829576-6")     ; 6
;;   (checksum-isbn-13 "978-1-61262-294-1") ; 1
;;
;;; Code:

(require 'cl-lib)

(defun digits-only-string (str)
  "Evaluate into a version of STR, with all non-digits removed."
  (replace-regexp-in-string "[^0-9]" "" str) )

(defun char-to-int (c)
  "Convert a char C into the digit it displays,
e.g., (char-to-int ?9) ; 9"
  (- c ?0))

(defun string-to-integer-list (str)
  "Make an integer list from a string STR.
All non-digits are dropped."
  (let*((digits-only (digits-only-string str))
        (chars       (string-to-list digits-only))
        (ints        (cl-map 'list
                             (lambda (c) (char-to-int c))
                             chars) ))
    ints) )

(defun check-isbn-at-point ()
  "Compute and display the check digit from the ISBN at point.

See \\[checksum-isbn-10] and \\[checksum-isbn-13] for Lisp work."
  (interactive)
  (let*((isbn-string (thing-at-point 'symbol t))
        (digits-only (digits-only-string isbn-string))
        (num-digits  (length digits-only))
        (check-digit (if (> num-digits 10)
                         (checksum-isbn-13 digits-only)
                       (checksum-isbn-10 digits-only) )))
    (message "check digit: %s" check-digit)
    ))
(defalias 'ciap #'check-isbn-at-point)

(defun checksum-isbn-13 (isbn)
  "Compute the checksum for ISBN which should be ISBN-13,
i.e. consist of 13 digits. Because the last digit, number 13,
is the checksum, actually only 12 digits, in the form of a string,
is needed. Hyphens/dashes can be included or omitted.

Also see \\[checksum-isbn-10].

For interactive work, see \\[check-isbn-at-point]."
  (let*((isbn-ints (string-to-integer-list isbn))
        (sum       0))
    (cl-loop for e in isbn-ints
             for i from 0 to 11
             do (progn (message "%d" i)
                       (cl-incf sum (* e (or (and (zerop (mod i 2)) 1) 3)))
                       )
             )
    (let ((checksum (- 10 (mod sum 10))))
      (if (= 10 checksum) 0 checksum) )))

(defun checksum-isbn-10 (isbn)
  "Compute the checksum for ISBN which should be ISBN-10,
i.e. consist of 10 digits. Because the last digit, number 10,
is the checksum, actually only 9 digits, in the form of a string,
is needed. Hyphens/dashes can be included or omitted.

Also see \\[checksum-isbn-13].

For interactive work, see \\[check-isbn-at-point]."
  (let*((isbn-ints (string-to-integer-list isbn))
        (sum       0) )
    (cl-loop for e in isbn-ints
             for i downfrom 10 to 2
             do (cl-incf sum (* e i)) )
    (let ((checksum (mod (- 11 (mod sum 11)) 11)))
      (if (= 10 checksum) "X" checksum) )))

;; 10 ISBN-10 tests:
;;
;; (checksum-isbn-10 "0-201-53992-6") ; 6
;; (checksum-isbn-10 "0312168144")    ; 4
;; (checksum-isbn-10 "1-4012-0622-0") ; 0
;; (checksum-isbn-10 "1616558717")    ; 7
;; (checksum-isbn-10 "91-510-6483-9") ; 9
;; (checksum-isbn-10 "91-7054-940-0") ; 0
;; (checksum-isbn-10 "91-7089-710-7") ; 7
;; (checksum-isbn-10 "91-85668-01-X") ; X
;; (checksum-isbn-10 "91-88930-23-8") ; 8
;; (checksum-isbn-10 "9177988515")    ; 5

;; 13 ISBN-13 tests:
;;
;; (checksum-isbn-13 "91-518-4657-8")     ; 8
;; (checksum-isbn-13 "978-1-63236-616-0") ; 0
;; (checksum-isbn-13 "978-91-0-012814-2") ; 2
;; (checksum-isbn-13 "978-91-29-59023-4") ; 4
;; (checksum-isbn-13 "978-91-7037-681-8") ; 8
;; (checksum-isbn-13 "978-91-7515-205-9") ; 9
;; (checksum-isbn-13 "978-91-7515-317-9") ; 9
;; (checksum-isbn-13 "978-91-86936-31-0") ; 0
;; (checksum-isbn-13 "978-91-87861-54-3") ; 3
;; (checksum-isbn-13 "978-91-87861-67-3") ; 3
;; (checksum-isbn-13 "978-91-87861-99-4") ; 4
;; (checksum-isbn-13 "9780062802187")     ; 7
;; (checksum-isbn-13 "9789188805034")     ; 4

(provide 'isbn-verify)
;;; isbn-verify.el ends here

-- 
underground experts united
http://user.it.uu.se/~embe8573
https://dataswamp.org/~incal




^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2020-02-26  9:16 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-02-26  7:27 good enough for MELPA work? Emanuel Berg via Users list for the GNU Emacs text editor
2020-02-26  9:16 ` Emanuel Berg via Users list for the GNU Emacs text editor

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).