Hello, Thierry Banel <tbanelweb...@free.fr> writes:
> Sorry for the late answer, I was on the road. > The patch is attached hereafter. Thank you for the patch. Some comments follow. > From 5fddaba2208c2cb4ce3b6bc24d0d10571124fb39 Mon Sep 17 00:00:00 2001 > From: Thierry Banel <tbanelweb...@free.fr> > Date: Mon, 11 Aug 2014 00:00:21 +0200 > Subject: [PATCH] * org-table.el: add ascii plotting in tables, > (orgtbl-ascii-plot): top-level function > (orgtbl-ascii-draw), (orgtbl-uc-draw-grid), > (orgtbl-uc-draw-cont): helper functions which go in table If they are helper functions, I suggest to use "--" in their name, e.g., `orgbtl--ascii-draw'. > +(defun orgtbl-ascii-draw (value min max &optional width characters) > + "Draws an ascii bar in a table. > +VALUE is a the value to plot, the width of the bar to draw. > +A value equal to MIN will be displayed as empty (zero width bar). > +A value equal to MAX will draw a bar filling all the WIDTH. > +WIDTH is the expected width in characters of the column. > +CHARACTERS is a string of characters that will compose the bar, This is a minor issue, but a "string of characters" sounds strange: aren't all strings constituted of characters? Maybe you really want a list of characters. > +with shades of grey from pure white to pure black. > +It defaults to a 10 characters string of regular ascii characters. > +" Spurious newline at the end of the docstring. > + (unless characters (setq characters " .:;c!lhVHW")) > + (unless width (setq width 12)) I suggest let-binding variables instead: (let ((characters (or characters " .:;c!lhvHW")) (width (or width 12)))) > + (if (stringp value) > + (setq value (string-to-number value))) Prefer `and' or `when' over one-armed `if'. Also, this may be dangerous since `string-to-number' can return funny values. Why wouldn't you simply forbid strings and limit VALUE to integers. > + (setq value (* (/ (- (+ value 0.0) min) (- max min)) width)) (let ((value ...))) > + (cond > + ((< value 0) "too small") > + ((> value width) "too large") > + (t > + (let ((len (1- (length characters)))) > + (concat > + (make-string (floor value) (elt characters len)) > + (string (elt characters > + (floor (* (- value (floor value)) len))))))))) > + > +(defun orgtbl-uc-draw-grid (value min max &optional width) > + "Draws an ascii bar in a table. > +It is a variant of orgtbl-ascii-draw with Unicode block characters, > +for a smooth display. > +Bars appear as grids (to the extend the font allows). > +" Spurious newline. I wouldn't put the last sentence on its own line, too. Also, isn't it "extent"? > +(defun orgtbl-uc-draw-cont (value min max &optional width) > + "Draws an ascii bar in a table. > +It is a variant of orgtbl-ascii-draw with Unicode block characters, > +for a smooth display. > +Bars are solid (to the extend the font allows). > +" Ditto. > + (orgtbl-ascii-draw value min max width " > \u258F\u258E\u258D\u258C\u258B\u258A\u2589\u2588")) > + > +;;;###autoload > +(defun orgtbl-ascii-plot (&optional ask) > + "Draws an ascii bars plot in a column, out of values found in another > column. > +A numeric prefix may be given to override the default 12 characters wide > plot. > +" You must refer explicitly to ASK in your docstring. In particular, you may want to detail the distinction between '(4) and 4. Spurious newline too. > + (interactive "P") > + (let ((col (org-table-current-column)) > + (min 1e999) `most-positive-fixnum' > + (max -1e999) `most-negative-fixnum' > + (length 12) > + (table (org-table-to-lisp))) > + (cond ((consp ask) > + (setq length > + (or > + (read-string "Length of column [12] " nil nil 12) > + 12))) > + ((numberp ask) > + (setq length ask))) (let ((length (cond ((consp ask) (read-number "Length of column [12] " nil nil 12)) ((numberp ask) ask) (t 12))))) > + (mapc Small nitpick: I suggest to use `dolist' instead of `mapc' (no funcall overhead). > + (lambda (x) > + (when (consp x) > + (setq x (nth (1- col) x)) > + (when (string-match > + "^[-+]?\\([0-9]*[.]\\)?[0-9]*\\([eE][+-]?[0-9]+\\)?$" > + x) Would `org-table-number-regexp' make sense here instead of the hard-coded regexp? > + (setq x (string-to-number x)) > + (if (> min x) (setq min x)) > + (if (< max x) (setq max x))))) (when (> min x) ...) (when (< max x)) > + (or (memq 'hline table) table)) ;; skip table header if any This check is not sufficient in the following cases: |-----------| | no header | |-----------| and |----------| | header | |----------| | contents | IOW, you need to eliminate the leading 'hline, if any, and skip until the next 'hline if there is one and if there is something after it. Regards, -- Nicolas Goaziou