511 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			EmacsLisp
		
	
	
	
	
	
			
		
		
	
	
			511 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			EmacsLisp
		
	
	
	
	
	
| ;;; ascii-art-to-unicode.el --- a small artist adjunct -*- lexical-binding: t -*-
 | ||
| 
 | ||
| ;; Copyright (C) 2014  Free Software Foundation, Inc.
 | ||
| 
 | ||
| ;; Author: Thien-Thi Nguyen <ttn@gnu.org>
 | ||
| ;; Maintainer: Thien-Thi Nguyen <ttn@gnu.org>
 | ||
| ;; Version: 1.9
 | ||
| ;; Keywords: ascii, unicode, box-drawing
 | ||
| ;; URL: http://www.gnuvola.org/software/aa2u/
 | ||
| 
 | ||
| ;; 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 3 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, see <http://www.gnu.org/licenses/>.
 | ||
| 
 | ||
| ;;; Commentary:
 | ||
| 
 | ||
| ;; The command `aa2u' converts simple ASCII art line drawings in
 | ||
| ;; the {active,accessible} region of the current buffer to Unicode.
 | ||
| ;; Command `aa2u-rectangle' is like `aa2u', but works on rectangles.
 | ||
| ;;
 | ||
| ;; Example use case:
 | ||
| ;; - M-x artist-mode RET
 | ||
| ;; - C-c C-a r               ; artist-select-op-rectangle
 | ||
| ;; - (draw two rectangles)
 | ||
| ;;
 | ||
| ;;   +---------------+
 | ||
| ;;   |               |
 | ||
| ;;   |       +-------+--+
 | ||
| ;;   |       |       |  |
 | ||
| ;;   |       |       |  |
 | ||
| ;;   |       |       |  |
 | ||
| ;;   +-------+-------+  |
 | ||
| ;;           |          |
 | ||
| ;;           |          |
 | ||
| ;;           |          |
 | ||
| ;;           +----------+
 | ||
| ;;
 | ||
| ;; - C-c C-c                 ; artist-mode-off (optional)
 | ||
| ;; - C-x n n                 ; narrow-to-region
 | ||
| ;; - M-x aa2u RET
 | ||
| ;;
 | ||
| ;;   ┌───────────────┐
 | ||
| ;;   │               │
 | ||
| ;;   │       ┌───────┼──┐
 | ||
| ;;   │       │       │  │
 | ||
| ;;   │       │       │  │
 | ||
| ;;   │       │       │  │
 | ||
| ;;   └───────┼───────┘  │
 | ||
| ;;           │          │
 | ||
| ;;           │          │
 | ||
| ;;           │          │
 | ||
| ;;           └──────────┘
 | ||
| ;;
 | ||
| ;; Much easier on the eyes now!
 | ||
| ;;
 | ||
| ;; Normally, lines are drawn with the `LIGHT' weight.  If you set var
 | ||
| ;; `aa2u-uniform-weight' to symbol `HEAVY', you will see, instead:
 | ||
| ;;
 | ||
| ;;   ┏━━━━━━━━━━━━━━━┓
 | ||
| ;;   ┃               ┃
 | ||
| ;;   ┃       ┏━━━━━━━╋━━┓
 | ||
| ;;   ┃       ┃       ┃  ┃
 | ||
| ;;   ┃       ┃       ┃  ┃
 | ||
| ;;   ┃       ┃       ┃  ┃
 | ||
| ;;   ┗━━━━━━━╋━━━━━━━┛  ┃
 | ||
| ;;           ┃          ┃
 | ||
| ;;           ┃          ┃
 | ||
| ;;           ┃          ┃
 | ||
| ;;           ┗━━━━━━━━━━┛
 | ||
| ;;
 | ||
| ;; To protect particular ‘|’, ‘-’ or ‘+’ characters from conversion,
 | ||
| ;; you can set the property `aa2u-text' on that text with command
 | ||
| ;; `aa2u-mark-as-text'.  A prefix arg clears the property, instead.
 | ||
| ;; (You can use `describe-text-properties' to check.)  For example:
 | ||
| ;;
 | ||
| ;;      ┌───────────────────┐
 | ||
| ;;      │                   │
 | ||
| ;;      │ |\/|              │
 | ||
| ;;      │ `Oo'   --Oop Ack! │
 | ||
| ;;      │  ^&-MM.           │
 | ||
| ;;      │                   │
 | ||
| ;;      └─────────┬─────────┘
 | ||
| ;;                │
 | ||
| ;;            """""""""
 | ||
| ;;
 | ||
| ;; Command `aa2u-mark-rectangle-as-text' is similar, for rectangles.
 | ||
| ;;
 | ||
| ;; Tip: For best results, you should make sure all the tab characaters
 | ||
| ;; are converted to spaces.  See: `untabify', `indent-tabs-mode'.
 | ||
| 
 | ||
| ;;; Code:
 | ||
| 
 | ||
| (require 'cl-lib)
 | ||
| (require 'pcase)
 | ||
| 
 | ||
| (autoload 'apply-on-rectangle "rect")
 | ||
| 
 | ||
| (defvar aa2u-uniform-weight 'LIGHT
 | ||
|   "A symbol, either `LIGHT' or `HEAVY'.
 | ||
| This specifies the weight of all the lines.")
 | ||
| 
 | ||
| ;;;---------------------------------------------------------------------------
 | ||
| ;;; support
 | ||
| 
 | ||
| (defsubst aa2u--text-p (pos)
 | ||
|   (get-text-property pos 'aa2u-text))
 | ||
| 
 | ||
| (defun aa2u-ucs-bd-uniform-name (&rest components)
 | ||
|   "Return a string naming UCS char w/ WEIGHT and COMPONENTS.
 | ||
| The string begins with \"BOX DRAWINGS\"; followed by the weight
 | ||
| as per variable `aa2u-uniform-weight', followed by COMPONENTS,
 | ||
| a list of one or two symbols from the set:
 | ||
| 
 | ||
|   VERTICAL
 | ||
|   HORIZONTAL
 | ||
|   DOWN
 | ||
|   UP
 | ||
|   RIGHT
 | ||
|   LEFT
 | ||
| 
 | ||
| If of length two, the first element in COMPONENTS should be
 | ||
| the \"Y-axis\" (VERTICAL, DOWN, UP).  In that case, the returned
 | ||
| string includes \"AND\" between the elements of COMPONENTS.
 | ||
| 
 | ||
| Lastly, all words are separated by space (U+20)."
 | ||
|   (format "BOX DRAWINGS %s %s"
 | ||
|           aa2u-uniform-weight
 | ||
|           (mapconcat 'symbol-name components
 | ||
|                      " AND ")))
 | ||
| 
 | ||
| (defun aa2u-1c (stringifier &rest components)
 | ||
|   "Apply STRINGIFIER to COMPONENTS; return the UCS char w/ this name.
 | ||
| The char is a string (of length one), with two properties:
 | ||
| 
 | ||
|   aa2u-stringifier
 | ||
|   aa2u-components
 | ||
| 
 | ||
| Their values are STRINGIFIER and COMPONENTS, respectively."
 | ||
|   (let ((s (string (cdr (assoc-string (apply stringifier components)
 | ||
|                                       (ucs-names))))))
 | ||
|     (propertize s
 | ||
|                 'aa2u-stringifier stringifier
 | ||
|                 'aa2u-components components)))
 | ||
| 
 | ||
| (defun aa2u-phase-1 ()
 | ||
|   (cl-flet
 | ||
|       ((gsr (was name)
 | ||
|             (goto-char (point-min))
 | ||
|             (let ((now (aa2u-1c 'aa2u-ucs-bd-uniform-name name)))
 | ||
|               (while (search-forward was nil t)
 | ||
|                 (unless (aa2u--text-p (match-beginning 0))
 | ||
|                   (replace-match now t t))))))
 | ||
|     (gsr "|" 'VERTICAL)
 | ||
|     (gsr "-" 'HORIZONTAL)))
 | ||
| 
 | ||
| (defun aa2u-replacement (pos)
 | ||
|   (let ((cc (- pos (line-beginning-position))))
 | ||
|     (cl-flet*
 | ||
|         ((ok (name pos)
 | ||
|              (when (or
 | ||
|                     ;; Infer LIGHTness between "snug" ‘?+’es.
 | ||
|                     ;;              |
 | ||
|                     ;;  +-----------++--+   +
 | ||
|                     ;;  | somewhere ++--+---+-+----+
 | ||
|                     ;;  +-+---------+ nowhere |+--+
 | ||
|                     ;;    +         +---------++
 | ||
|                     ;;              |      +---|
 | ||
|                     (eq ?+ (char-after pos))
 | ||
|                     ;; Require properly directional neighborliness.
 | ||
|                     (memq (cl-case name
 | ||
|                             ((UP DOWN)    'VERTICAL)
 | ||
|                             ((LEFT RIGHT) 'HORIZONTAL))
 | ||
|                           (get-text-property pos 'aa2u-components)))
 | ||
|                name))
 | ||
|          (v (name dir) (let ((bol (line-beginning-position dir))
 | ||
|                              (eol (line-end-position dir)))
 | ||
|                          (when (< cc (- eol bol))
 | ||
|                            (ok name (+ bol cc)))))
 | ||
|          (h (name dir) (let ((bol (line-beginning-position))
 | ||
|                              (eol (line-end-position))
 | ||
|                              (pos (+ pos dir)))
 | ||
|                          (unless (or (> bol pos)
 | ||
|                                      (<= eol pos))
 | ||
|                            (ok name pos))))
 | ||
|          (two-p (ls) (= 2 (length ls)))
 | ||
|          (just (&rest args) (delq nil args)))
 | ||
|       (apply 'aa2u-1c
 | ||
|              'aa2u-ucs-bd-uniform-name
 | ||
|              (just (pcase (just (v 'UP   0)
 | ||
|                                 (v 'DOWN 2))
 | ||
|                      ((pred two-p) 'VERTICAL)
 | ||
|                      (`(,vc)        vc)
 | ||
|                      (_             nil))
 | ||
|                    (pcase (just (h 'LEFT  -1)
 | ||
|                                 (h 'RIGHT  1))
 | ||
|                      ((pred two-p) 'HORIZONTAL)
 | ||
|                      (`(,hc)        hc)
 | ||
|                      (_             nil)))))))
 | ||
| 
 | ||
| (defun aa2u-phase-2 ()
 | ||
|   (goto-char (point-min))
 | ||
|   (let (changes)
 | ||
|     ;; (phase 2.1 -- what WOULD change)
 | ||
|     ;; This is for the benefit of ‘aa2u-replacement ok’, which
 | ||
|     ;; otherwise (monolithic phase 2) would need to convert the
 | ||
|     ;; "properly directional neighborliness" impl from a simple
 | ||
|     ;; ‘memq’ to an ‘intersction’.
 | ||
|     (while (search-forward "+" nil t)
 | ||
|       (let ((p (point)))
 | ||
|         (unless (aa2u--text-p (1- p))
 | ||
|           (push (cons p (or (aa2u-replacement (1- p))
 | ||
|                             "?"))
 | ||
|                 changes))))
 | ||
|     ;; (phase 2.2 -- apply changes)
 | ||
|     (dolist (ch changes)
 | ||
|       (goto-char (car ch))
 | ||
|       (delete-char -1)
 | ||
|       (insert (cdr ch)))))
 | ||
| 
 | ||
| (defun aa2u-phase-3 ()
 | ||
|   (remove-text-properties (point-min) (point-max)
 | ||
|                           (list 'aa2u-stringifier nil
 | ||
|                                 'aa2u-components nil)))
 | ||
| 
 | ||
| ;;;---------------------------------------------------------------------------
 | ||
| ;;; commands
 | ||
| 
 | ||
| ;;;###autoload
 | ||
| (defun aa2u (beg end &optional interactive)
 | ||
|   "Convert simple ASCII art line drawings to Unicode.
 | ||
| Specifically, perform the following replacements:
 | ||
| 
 | ||
|   - (hyphen)          BOX DRAWINGS LIGHT HORIZONTAL
 | ||
|   | (vertical bar)    BOX DRAWINGS LIGHT VERTICAL
 | ||
|   + (plus)            (one of)
 | ||
|                       BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
 | ||
|                       BOX DRAWINGS LIGHT DOWN AND RIGHT
 | ||
|                       BOX DRAWINGS LIGHT DOWN AND LEFT
 | ||
|                       BOX DRAWINGS LIGHT UP AND RIGHT
 | ||
|                       BOX DRAWINGS LIGHT UP AND LEFT
 | ||
|                       BOX DRAWINGS LIGHT VERTICAL AND RIGHT
 | ||
|                       BOX DRAWINGS LIGHT VERTICAL AND LEFT
 | ||
|                       BOX DRAWINGS LIGHT UP AND HORIZONTAL
 | ||
|                       BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
 | ||
|                       BOX DRAWINGS LIGHT UP
 | ||
|                       BOX DRAWINGS LIGHT DOWN
 | ||
|                       BOX DRAWINGS LIGHT LEFT
 | ||
|                       BOX DRAWINGS LIGHT RIGHT
 | ||
|                       QUESTION MARK
 | ||
| 
 | ||
| More precisely, hyphen and vertical bar are substituted unconditionally,
 | ||
| first, and plus is substituted with a character depending on its north,
 | ||
| south, east and west neighbors.
 | ||
| 
 | ||
| NB: Actually, `aa2u' can also use \"HEAVY\" instead of \"LIGHT\",
 | ||
| depending on the value of variable `aa2u-uniform-weight'.
 | ||
| 
 | ||
| This command operates on either the active region,
 | ||
| or the accessible portion otherwise."
 | ||
|   (interactive "r\np")
 | ||
|   ;; This weirdness, along w/ the undocumented "p" in the ‘interactive’
 | ||
|   ;; form, is to allow ‘M-x aa2u’ (interactive invocation) w/ no region
 | ||
|   ;; selected to default to the accessible portion (as documented), which
 | ||
|   ;; was the norm in ascii-art-to-unicode.el prior to 1.5.  A bugfix,
 | ||
|   ;; essentially.  This is ugly, unfortunately -- is there a better way?!
 | ||
|   (when (and interactive (not (region-active-p)))
 | ||
|     (setq beg (point-min)
 | ||
|           end (point-max)))
 | ||
|   (save-excursion
 | ||
|     (save-restriction
 | ||
|       (widen)
 | ||
|       (narrow-to-region beg end)
 | ||
|       (aa2u-phase-1)
 | ||
|       (aa2u-phase-2)
 | ||
|       (aa2u-phase-3))))
 | ||
| 
 | ||
| ;;;###autoload
 | ||
| (defun aa2u-rectangle (start end)
 | ||
|   "Like `aa2u' on the region-rectangle.
 | ||
| When called from a program the rectangle's corners
 | ||
| are START (top left) and END (bottom right)."
 | ||
|   (interactive "r")
 | ||
|   (let* ((was (delete-extract-rectangle start end))
 | ||
|          (now (with-temp-buffer
 | ||
|                 (insert-rectangle was)
 | ||
|                 (aa2u (point) (mark))
 | ||
|                 (extract-rectangle (point-min) (point-max)))))
 | ||
|     (goto-char (min start end))
 | ||
|     (insert-rectangle now)))
 | ||
| 
 | ||
| ;;;###autoload
 | ||
| (defun aa2u-mark-as-text (start end &optional unmark)
 | ||
|   "Set property `aa2u-text' of the text from START to END.
 | ||
| This prevents `aa2u' from misinterpreting \"|\", \"-\" and \"+\"
 | ||
| in that region as lines and intersections to be replaced.
 | ||
| Prefix arg means to remove property `aa2u-text', instead."
 | ||
|   (interactive "r\nP")
 | ||
|   (funcall (if unmark
 | ||
|                'remove-text-properties
 | ||
|              'add-text-properties)
 | ||
|            start end
 | ||
|            '(aa2u-text t)))
 | ||
| 
 | ||
| ;;;###autoload
 | ||
| (defun aa2u-mark-rectangle-as-text (start end &optional unmark)
 | ||
|   "Like `aa2u-mark-as-text' on the region-rectangle.
 | ||
| When called from a program the rectangle's corners
 | ||
| are START (top left) and END (bottom right)."
 | ||
|   (interactive "r\nP")
 | ||
|   (apply-on-rectangle
 | ||
|    (lambda (scol ecol unmark)
 | ||
|      (let ((p (point)))
 | ||
|        (aa2u-mark-as-text (+ p scol) (+ p ecol) unmark)))
 | ||
|    start end
 | ||
|    unmark))
 | ||
| 
 | ||
| ;;;---------------------------------------------------------------------------
 | ||
| ;;; that's it
 | ||
| 
 | ||
| ;;;; ChangeLog:
 | ||
| 
 | ||
| ;; 2014-05-29  Thien-Thi Nguyen  <ttn@gnu.org>
 | ||
| ;; 
 | ||
| ;; 	[aa2u] Release: 1.9
 | ||
| ;; 
 | ||
| ;; 	* packages/ascii-art-to-unicode/ascii-art-to-unicode.el [Version]: Bump
 | ||
| ;; 	to "1.9".
 | ||
| ;; 
 | ||
| ;; 2014-05-29  Thien-Thi Nguyen  <ttn@gnu.org>
 | ||
| ;; 
 | ||
| ;; 	[aa2u] Mention TAB infelicity.
 | ||
| ;; 
 | ||
| ;; 	* packages/ascii-art-to-unicode/ascii-art-to-unicode.el [Commentary]:
 | ||
| ;; 	...here.
 | ||
| ;; 
 | ||
| ;; 2014-05-29  Thien-Thi Nguyen  <ttn@gnu.org>
 | ||
| ;; 
 | ||
| ;; 	[aa2u] Update homepage; drop other links.
 | ||
| ;; 
 | ||
| ;; 	* packages/ascii-art-to-unicode/ascii-art-to-unicode.el [URL]: New
 | ||
| ;; 	header.
 | ||
| ;; 	[Commentary]: Remove the HACKING and Tip Jar links.
 | ||
| ;; 
 | ||
| ;; 2014-05-29  Thien-Thi Nguyen  <ttn@gnu.org>
 | ||
| ;; 
 | ||
| ;; 	[aa2u] New command: aa2u-mark-rectangle-as-text
 | ||
| ;; 
 | ||
| ;; 	* packages/ascii-art-to-unicode/ascii-art-to-unicode.el: Arrange to
 | ||
| ;; 	autoload "rect" for ‘apply-on-rectangle’.
 | ||
| ;; 	(aa2u-mark-rectangle-as-text): New command, w/ autoload cookie.
 | ||
| ;; 
 | ||
| ;; 2014-05-24  Thien-Thi Nguyen  <ttn@gnu.org>
 | ||
| ;; 
 | ||
| ;; 	[aa2u maint] Mention TAB infelicity in HACKING; nfc.
 | ||
| ;; 
 | ||
| ;; 2014-05-21  Thien-Thi Nguyen  <ttn@gnu.org>
 | ||
| ;; 
 | ||
| ;; 	[aa2u] Release: 1.8
 | ||
| ;; 
 | ||
| ;; 	* packages/ascii-art-to-unicode/ascii-art-to-unicode.el [Version]: Bump
 | ||
| ;; 	to "1.8".
 | ||
| ;; 
 | ||
| ;; 2014-05-21  Thien-Thi Nguyen  <ttn@gnu.org>
 | ||
| ;; 
 | ||
| ;; 	[aa2u] New command: aa2u-mark-as-text
 | ||
| ;; 
 | ||
| ;; 	* packages/ascii-art-to-unicode/ascii-art-to-unicode.el
 | ||
| ;; 	(aa2u--text-p): New defsubst.
 | ||
| ;; 	(aa2u-phase-1, aa2u-phase-2): If the character in question is
 | ||
| ;; 	‘aa2u--text-p’, just ignore it.
 | ||
| ;; 	(aa2u-mark-as-text): New command, w/ autoload cookie.
 | ||
| ;; 
 | ||
| ;; 2014-05-21  Thien-Thi Nguyen  <ttn@gnu.org>
 | ||
| ;; 
 | ||
| ;; 	[aa2u int] Add abstraction: gsr
 | ||
| ;; 
 | ||
| ;; 	* packages/ascii-art-to-unicode/ascii-art-to-unicode.el
 | ||
| ;; 	(aa2u-phase-1 gsr): New internal func.
 | ||
| ;; 
 | ||
| ;; 2014-05-21  Thien-Thi Nguyen  <ttn@gnu.org>
 | ||
| ;; 
 | ||
| ;; 	[aa2u] Declare package keywords.
 | ||
| ;; 
 | ||
| ;; 	* packages/ascii-art-to-unicode/ascii-art-to-unicode.el [Keywords]: New
 | ||
| ;; 	header.
 | ||
| ;; 
 | ||
| ;; 2014-05-21  Thien-Thi Nguyen  <ttn@gnu.org>
 | ||
| ;; 
 | ||
| ;; 	[aa2u maint] Add ‘Maintainer’ header per top-level README; nfc.
 | ||
| ;; 
 | ||
| ;; 2014-05-11  Thien-Thi Nguyen  <ttn@gnu.org>
 | ||
| ;; 
 | ||
| ;; 	[aa2u] Release: 1.7
 | ||
| ;; 
 | ||
| ;; 	* packages/ascii-art-to-unicode/ascii-art-to-unicode.el [Version]: Bump
 | ||
| ;; 	to "1.7".
 | ||
| ;; 
 | ||
| ;; 2014-05-11  Thien-Thi Nguyen  <ttn@gnu.org>
 | ||
| ;; 
 | ||
| ;; 	[aa2u] New command: aa2u-rectangle
 | ||
| ;; 
 | ||
| ;; 	* packages/ascii-art-to-unicode/ascii-art-to-unicode.el
 | ||
| ;; 	(aa2u-rectangle): New command.
 | ||
| ;; 
 | ||
| ;; 2014-05-11  Andreas Schwab  <schwab@linux-m68k.org>
 | ||
| ;; 
 | ||
| ;; 	ascii-art-to-unicode.el (aa2u-replacement): Use cl-case instead of
 | ||
| ;; 	case.
 | ||
| ;; 
 | ||
| ;; 2014-05-09  Thien-Thi Nguyen  <ttn@gnu.org>
 | ||
| ;; 
 | ||
| ;; 	fixup! [aa2u] Make weight dynamically customizable.
 | ||
| ;; 
 | ||
| ;; 2014-05-09  Thien-Thi Nguyen  <ttn@gnu.org>
 | ||
| ;; 
 | ||
| ;; 	[aa2u maint] Update HACKING; nfc.
 | ||
| ;; 
 | ||
| ;; 2014-05-09  Thien-Thi Nguyen  <ttn@gnu.org>
 | ||
| ;; 
 | ||
| ;; 	[aa2u] Make weight dynamically customizable.
 | ||
| ;; 
 | ||
| ;; 	* packages/ascii-art-to-unicode/ascii-art-to-unicode.el
 | ||
| ;; 	(aa2u-uniform-weight): New defvar.
 | ||
| ;; 	(aa2u-ucs-bd-uniform-name): Don't take arg WEIGHT; instead, consult
 | ||
| ;; 	‘aa2u-uniform-weight’.
 | ||
| ;; 	(aa2u-phase-1, aa2u-replacement): Update calls to
 | ||
| ;; 	‘aa2u-ucs-bd-uniform-name’.
 | ||
| ;; 	(aa2u): Mention new var in docstring.
 | ||
| ;; 
 | ||
| ;; 2014-05-09  Thien-Thi Nguyen  <ttn@gnu.org>
 | ||
| ;; 
 | ||
| ;; 	[aa2u int] Compute vertical/horizontal components separately.
 | ||
| ;; 
 | ||
| ;; 	* packages/ascii-art-to-unicode/ascii-art-to-unicode.el
 | ||
| ;; 	(aa2u-replacement ok): Recognize ‘UP’, ‘DOWN’, ‘LEFT’, ‘RIGHT’ instead
 | ||
| ;; 	of ‘n’, ‘s’, ‘w’, ‘e’.
 | ||
| ;; 	(aa2u-replacement two-p): New internal func.
 | ||
| ;; 	(aa2u-replacement just): Likewise.
 | ||
| ;; 	(aa2u-replacement): Don't glom everything for one ‘pcase’; instead,
 | ||
| ;; 	construct args to ‘aa2u-ucs-bd-uniform-name’ by computing vertical and
 | ||
| ;; 	horizontal components separately.
 | ||
| ;; 
 | ||
| ;; 2014-05-09  Thien-Thi Nguyen  <ttn@gnu.org>
 | ||
| ;; 
 | ||
| ;; 	[aa2u int] Don't use ‘cl-labels’ when ‘cl-flet*’ will do.
 | ||
| ;; 
 | ||
| ;; 	* packages/ascii-art-to-unicode/ascii-art-to-unicode.el
 | ||
| ;; 	(aa2u-replacement): ...here.
 | ||
| ;; 
 | ||
| ;; 2014-05-09  Thien-Thi Nguyen  <ttn@gnu.org>
 | ||
| ;; 
 | ||
| ;; 	[aa2u int] Add "Tip Jar" URL in Commentary; nfc.
 | ||
| ;; 
 | ||
| ;; 2014-05-09  Thien-Thi Nguyen  <ttn@gnu.org>
 | ||
| ;; 
 | ||
| ;; 	[aa2u maint] Extract NEWS and HACKING to separate files; nfc.
 | ||
| ;; 
 | ||
| ;; 2014-05-08  Thien-Thi Nguyen  <ttn@gnu.org>
 | ||
| ;; 
 | ||
| ;; 	[aa2u] Release: 1.6
 | ||
| ;; 
 | ||
| ;; 	* packages/ascii-art-to-unicode/ascii-art-to-unicode.el [Version]: Bump
 | ||
| ;; 	to "1.6".
 | ||
| ;; 
 | ||
| ;; 2014-05-08  Thien-Thi Nguyen  <ttn@gnu.org>
 | ||
| ;; 
 | ||
| ;; 	[aa2u] Fix bug: Make ‘M-x aa2u’ operate on accessible portion.
 | ||
| ;; 
 | ||
| ;; 	Regression introduced 2014-04-03, "Make ‘aa2u’ region-aware".
 | ||
| ;; 
 | ||
| ;; 	* packages/ascii-art-to-unicode/ascii-art-to-unicode.el (aa2u): Take
 | ||
| ;; 	optional arg INTERACTIVE; add "p" to ‘interactive’ form; when
 | ||
| ;; 	INTERACTIVE and region is not active, set BEG, END.
 | ||
| ;; 
 | ||
| ;; 2014-04-03  Thien-Thi Nguyen  <ttn@gnu.org>
 | ||
| ;; 
 | ||
| ;; 	[aa2u] Release: 1.5
 | ||
| ;; 
 | ||
| ;; 	* packages/ascii-art-to-unicode/ascii-art-to-unicode.el [Version]: Bump
 | ||
| ;; 	to "1.5".
 | ||
| ;; 
 | ||
| ;; 2014-04-03  Thien-Thi Nguyen  <ttn@gnu.org>
 | ||
| ;; 
 | ||
| ;; 	[aa2u] Make ‘aa2u’ region-aware.
 | ||
| ;; 
 | ||
| ;; 	* packages/ascii-art-to-unicode/ascii-art-to-unicode.el (aa2u): Take
 | ||
| ;; 	args BEG and END; use "r" in ‘interactive’ spec; don't bother w/
 | ||
| ;; 	internal func ‘do-it!’.
 | ||
| ;; 
 | ||
| ;; 2014-01-14  Thien-Thi Nguyen  <ttn@gnu.org>
 | ||
| ;; 
 | ||
| ;; 	New package: ascii-art-to-unicode
 | ||
| ;; 
 | ||
| ;; 	* packages/ascii-art-to-unicode/: New dir.
 | ||
| ;; 	* packages/ascii-art-to-unicode/ascii-art-to-unicode.el: New file.
 | ||
| ;; 
 | ||
| 
 | ||
| 
 | ||
| (provide 'ascii-art-to-unicode)
 | ||
| 
 | ||
| ;;; ascii-art-to-unicode.el ends here
 |