* mime-def.el (mime-library-product): Fix typo.
[elisp/flim.git] / ew-data.el
index 795601b..962c455 100644 (file)
@@ -1,13 +1,13 @@
 (require 'ew-var)
+(require 'ew-util)
 (provide 'ew-data)
 
 (defun ew-make-anchor (column str)
   (let ((anchor (make-symbol str)))
     (put anchor 'anchor anchor)
+    (put anchor 'type 'ew:*anchor*)
     (put anchor 'prev-frag anchor)
     (put anchor 'next-frag anchor)
-    (put anchor 'prev-token anchor)
-    (put anchor 'next-token anchor)
     (put anchor 'column column)
     (put anchor 'line-length 0)
     anchor))
       (put frag 'line-length line-length)
       (setq frag (get frag 'prev-frag)))))
 
-(defun ew-tokenize-frag (anchor frag)
-  (put frag 'prev-token (get anchor 'prev-token))
-  (put frag 'next-token anchor)
-  (put (get anchor 'prev-token) 'next-token frag)
-  (put anchor 'prev-token frag)
-  frag)
-
-(defun ew-add-frag (anchor start end type)
+(defsubst ew-add-frag (anchor start end type)
   (let ((frag (make-symbol (substring (symbol-name anchor) start end))))
     (put frag 'anchor anchor)
-    (put frag 'start start)
-    (put frag 'end end)
     (put frag 'type type)
     (put frag 'prev-frag (get anchor 'prev-frag))
     (put frag 'next-frag anchor)
       (put anchor 'column (+ (get anchor 'column) (length (symbol-name frag)))))
     frag))
 
-(defun ew-add-open (anchor start end type)
-  (let ((frag (ew-add-frag anchor start end type)))
-    (put frag 'prev-open (get anchor 'prev-open))
-    (put anchor 'prev-open frag)
-    frag))
-
-(defun ew-add-close (anchor start end type)
-  (let ((frag (ew-add-frag anchor start end type)))
-    (put frag 'pair (get anchor 'prev-open))
-    (put (get anchor 'prev-open) 'pair frag)
-    (put anchor 'prev-open (get (get frag 'pair) 'prev-open))
-    frag))
-    
-(defun ew-add-token (anchor start end type)
-  (ew-tokenize-frag anchor (ew-add-frag anchor start end type)))
-
-(defun ew-add-close-token (anchor start end type)
-  (ew-tokenize-frag anchor (ew-add-close anchor start end type)))
-
 ;;; listup
 
 (defun ew-frag-list (anchor)
            tmp (get tmp 'prev-frag)))
     res))
 
-(defun ew-token-list (anchor)
-  (let ((res ())
-       (tmp (get anchor 'prev-token)))
-    (while (not (eq anchor tmp))
-      (setq res (cons tmp res)
-           tmp (get tmp 'prev-token)))
-    res))
-
 (defun ew-pair-list (anchor)
   (mapcar
    (lambda (frag)
            frag))
    (ew-frag-list anchor)))
 
+(defun ew-search-sticked-eword (frag start)
+  (let* ((texts (symbol-name frag)) (len (length texts)))
+    (catch 'return
+      (while (string-match ew-encoded-word-regexp texts start)
+       (when (and (or ew-permit-null-encoded-text
+                      (< (match-beginning 3) (match-end 3)))
+                  (or ew-ignore-75bytes-limit
+                      (<= (- (match-end 0) (match-beginning 0)) 75))
+                  (or ew-permit-sticked-comment
+                      (not (= (match-beginning 0) 0))
+                      (not (ew-comment-frag-p (get frag 'prev-frag))))
+                  (or ew-permit-sticked-comment
+                      (not (= (match-end 0) (length texts)))
+                      (not (ew-comment-frag-p (get frag 'next-frag))))
+                  (or ew-permit-sticked-special
+                      (not (= (match-beginning 0) 0))
+                      (ew-comment-frag-p (get frag 'prev-frag))
+                      (not (ew-special-frag-p (get frag 'prev-frag))))
+                  (or ew-permit-sticked-special
+                      (not (= (match-end 0) (length texts)))
+                      (ew-comment-frag-p (get frag 'next-frag))
+                      (not (ew-special-frag-p (get frag 'next-frag))))
+                  )
+         (throw 'return t))
+       (setq start (1- (match-end 0))))
+      nil)))
+
 (defun ew-separate-eword (frag1 frag2 targets)
   (while (not (eq frag1 frag2))
     (when (and (memq (get frag1 'type) targets)
-              (string-match ew-encoded-word-regexp
-                            (symbol-name frag1))
+              (ew-search-sticked-eword frag1 0)
               (or (< 0 (match-beginning 0))
                   (< (match-end 0) (length (symbol-name frag1)))))
-      (let ((atom (symbol-name frag1))
-           (base (get frag1 'start))
+      (let ((texts (symbol-name frag1))
            (start (match-end 0))
            result
            frag)
        (when (< 0 (match-beginning 0))
-         (setq frag (make-symbol (substring atom 0 (match-beginning 0)))
-               result(ew-rcons* result frag))
-         (put frag 'start base)
-         (put frag 'end (+ base (match-beginning 0))))
-       (setq frag (make-symbol (substring atom (match-beginning 0) (match-end 0)))
+         (setq frag (make-symbol (substring texts 0 (match-beginning 0)))
+               result (ew-rcons* result frag)))
+       (setq frag (make-symbol (substring texts (match-beginning 0) (match-end 0)))
              result (ew-rcons* result frag))
-       (put frag 'start (+ base (match-beginning 0)))
-       (put frag 'end (+ base (match-end 0)))
        (when (cdr result)
          (put frag 'prev-frag (cadr result))
          (put (cadr result) 'next-frag frag)
          (setq frag (cadr result)))
        (put frag 'prev-frag (get frag1 'prev-frag))
        (put (get frag1 'prev-frag) 'next-frag frag)
-       (while (string-match ew-encoded-word-regexp atom start)
+       (while (ew-search-sticked-eword frag1 start)
          (when (< start (match-beginning 0))
-           (setq frag (make-symbol (substring atom start (match-beginning 0)))
+           (setq frag (make-symbol (substring texts start (match-beginning 0)))
                  result (ew-rcons* result frag))
-           (put frag 'start (+ base start))
-           (put frag 'end (+ base (match-beginning 0)))
            (put frag 'prev-frag (cadr result))
            (put (cadr result) 'next-frag frag))
-         (setq frag (make-symbol (substring atom (match-beginning 0) (match-end 0)))
+         (setq frag (make-symbol (substring texts (match-beginning 0) (match-end 0)))
                result (ew-rcons* result frag)
                start (match-end 0))
-         (put frag 'start (+ base (match-beginning 0)))
-         (put frag 'end (+ base (match-end 0)))
          (put frag 'prev-frag (cadr result))
          (put (cadr result) 'next-frag frag))
        (when (< start (length (symbol-name frag1)))
-         (setq frag (make-symbol (substring atom start))
+         (setq frag (make-symbol (substring texts start))
                result (ew-rcons* result frag))
-         (put frag 'start (+ base start))
-         (put frag 'end (get frag1 'end))
          (put frag 'prev-frag (cadr result))
          (put (cadr result) 'next-frag frag))
        (setq frag (car result))
     (ew-separate-eword
      frag1 frag2
      (if ew-decode-quoted-encoded-word
-        '(ew:raw-atom-tok
-          ew:raw-qs-texts-tok)
-       '(ew:raw-atom-tok))))
+        '(ew:atom
+          ew:qs-texts)
+       '(ew:atom)))
+    (setq frag1 (get (get frag1 'prev-frag) 'next-frag)))
   (while (not (eq frag1 frag2))
+    (setq frag2 (get frag2 'prev-frag))
     (unless (ew-comment-frag-p frag2)
-      (put frag2 'decode 'ew-decode-phrase))
-    (setq frag2 (get frag2 'prev-frag)))
-  (unless (ew-comment-frag-p frag2)
-    (put frag2 'decode 'ew-decode-phrase))
-  (setq frag2 (get frag2 'prev-frag))
-  (while (not (get frag2 'prev-token))
+      (put frag2 'decode 'ew-decode-phrase)))
+  (while (not (ew-token-last-frag-p
+              (setq frag2 (get frag2 'prev-frag))))
     (unless (ew-comment-frag-p frag2)
-      (put frag2 'decode 'ew-decode-phrase))
-    (setq frag2 (get frag2 'prev-frag))))
+      (put frag2 'decode 'ew-decode-phrase))))
 
 ;;; frag predicate
 
+(defun ew-token-last-frag-p (frag)
+  (member (get frag 'type)
+         '(ew:*anchor*
+           ew:lt
+           ew:gt
+           ew:at
+           ew:comma
+           ew:semicolon
+           ew:colon
+           ew:dot
+           ew:atom
+           ew:qs-end
+           ew:dl-end)))
+
 (defun ew-comment-frag-p (frag)
   (member (get frag 'type)
-         '(ew:raw-cm-begin-tok
-           ew:raw-cm-end-tok
-           ew:raw-cm-nested-begin-tok
-           ew:raw-cm-nested-end-tok
-           ew:raw-cm-texts-tok
-           ew:raw-cm-wsp-tok
-           ew:raw-cm-fold-tok
-           ew:raw-cm-qfold-tok
-           ew:raw-cm-qpair-tok)))
+         '(ew:cm-begin
+           ew:cm-end
+           ew:cm-nested-begin
+           ew:cm-nested-end
+           ew:cm-texts
+           ew:cm-wsp
+           ew:cm-fold
+           ew:cm-qfold
+           ew:cm-qpair)))
 
 (defun ew-special-frag-p (frag)
   (member (get frag 'type)
-         '(ew:raw-lt-tok
-           ew:raw-gt-tok
-           ew:raw-at-tok
-           ew:raw-comma-tok
-           ew:raw-semicolon-tok
-           ew:raw-colon-tok
-           ew:raw-dot-tok
-           ew:raw-qs-begin-tok
-           ew:raw-qs-end-tok
-           ew:raw-dl-begin-tok
-           ew:raw-dl-end-tok
-           ew:raw-cm-begin-tok
-           ew:raw-cm-end-tok)))
+         '(ew:lt
+           ew:gt
+           ew:at
+           ew:comma
+           ew:semicolon
+           ew:colon
+           ew:dot
+           ew:qs-begin
+           ew:qs-end
+           ew:dl-begin
+           ew:dl-end
+           ew:cm-begin
+           ew:cm-end)))