From: pierre.techoueyres@free.fr (Pierre Téchoueyres)
To: Nicolas Goaziou <mail@nicolasgoaziou.fr>
Cc: org-mode <emacs-orgmode@gnu.org>
Subject: Re: [PATCH] Add new keyword :coding for #+include directive
Date: Sat, 21 Apr 2018 01:08:07 +0200 [thread overview]
Message-ID: <87in8lh3xk.fsf@killashandra.ballybran.fr> (raw)
In-Reply-To: <87muy0b4kw.fsf@killashandra.ballybran.fr> ("Pierre \=\?utf-8\?Q\?T\=C3\=A9choueyres\=22's\?\= message of "Wed, 18 Apr 2018 20:40:32 +0200")
[-- Attachment #1: Type: text/plain, Size: 701 bytes --]
pierre.techoueyres@free.fr (Pierre Téchoueyres) writes:
Hello,
> ...
>> ...
>> Is it really an Org problem? E.g., couldn't you put a coding: cookie in
>> your ".cmd" file? IMO, the coding system depends on the includee, not
>> the includer.
>
> I tend to aggree with you that TRTDT is to put cookies or something
> inside the included file. But :
> a) This seem to not work as expected (see exemples joinned).
> b) Sometimes you can't modify the included file (ex: remote file access).
> ...
> For a I can try to jump into the rabbit hole and find a solution (but
> for now I'm lost)
I did my homework : found a fix for a) and rebased previous patch on master.
Regards,
[-- Attachment #2: Add-new-keyword-coding-for-include-directive --]
[-- Type: text/x-patch, Size: 6420 bytes --]
From 679fa184dff97f1a5ff617144dc7d87e95b8ccd9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pierre=20T=C3=A9choueyres?= <pierre.techoueyres@free.fr>
Date: Sat, 21 Apr 2018 00:31:10 +0200
Subject: [PATCH] Add new keyword :coding for #+include directive
* lisp/ox.el (org-export-expand-include-keyword): Add new keyword
`:coding' for specify the file encoding whith the `#+include:'
directive.
This allow to use somting like :
#+include: "./myfile" :coding cp850-dos
when your org-file is encoded in utf-8 for example.
---
etc/ORG-NEWS | 7 ++++
lisp/ox.el | 121 +++++++++++++++++++++++++++++++----------------------------
2 files changed, 71 insertions(+), 57 deletions(-)
diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS
index abebe08fe..8b717d8f3 100644
--- a/etc/ORG-NEWS
+++ b/etc/ORG-NEWS
@@ -121,6 +121,13 @@ now sort according to the locale’s collation rules instead of by
code-point.
** New features
+*** New keyword for ~#+include:~ directive
+Add ~:coding "codign-system"~ keyword to allow include of files from
+different codign system than the main org-file.
+For example:
+#+begin_example
+,#+INCLUDE: "myfile.cmd" src cmd :coding cp850-dos
+#+end_example
*** Add ~:results link~ support for Babel
With this output format, create a link to the file specified in
diff --git a/lisp/ox.el b/lisp/ox.el
index 5a83ae01d..e75030ffb 100644
--- a/lisp/ox.el
+++ b/lisp/ox.el
@@ -3298,6 +3298,12 @@ storing and resolving footnotes. It is created automatically."
(org-unbracket-string "\"" "\"" matched)
dir)))
(setq value (replace-match "" nil nil value)))))
+ (coding
+ (intern (or (and (string-match
+ ":coding +\\<\\([a-z0-9\\-]+\\)\\>" value)
+ (prog1 (match-string 1 value)
+ (setq value (replace-match "" nil nil value))))
+ (symbol-name coding-system-for-read))))
(only-contents
(and (string-match ":only-contents *\\([^: \r\t\n]\\S-*\\)?"
value)
@@ -3331,65 +3337,66 @@ storing and resolving footnotes. It is created automatically."
(match-string 1 value))))
;; Remove keyword.
(delete-region (point) (line-beginning-position 2))
- (cond
- ((not file) nil)
- ((not (file-readable-p file))
- (error "Cannot include file %s" file))
- ;; Check if files has already been parsed. Look after
- ;; inclusion lines too, as different parts of the same
- ;; file can be included too.
- ((member (list file lines) included)
- (error "Recursive file inclusion: %s" file))
- (t
+ (let ((coding-system-for-read coding))
(cond
- ((eq env 'literal)
- (insert
- (let ((ind-str (make-string ind ?\s))
- (arg-str (if (stringp args) (format " %s" args) ""))
- (contents
- (org-escape-code-in-string
- (org-export--prepare-file-contents file lines))))
- (format "%s#+BEGIN_%s%s\n%s%s#+END_%s\n"
- ind-str block arg-str contents ind-str block))))
- ((stringp block)
- (insert
- (let ((ind-str (make-string ind ?\s))
- (contents
- (org-export--prepare-file-contents file lines)))
- (format "%s#+BEGIN_%s\n%s%s#+END_%s\n"
- ind-str block contents ind-str block))))
+ ((not file) nil)
+ ((not (file-readable-p file))
+ (error "Cannot include file %s" file))
+ ;; Check if files has already been parsed. Look after
+ ;; inclusion lines too, as different parts of the same
+ ;; file can be included too.
+ ((member (list file lines) included)
+ (error "Recursive file inclusion: %s" file))
(t
- (insert
- (with-temp-buffer
- (let ((org-inhibit-startup t)
- (lines
- (if location
- (org-export--inclusion-absolute-lines
- file location only-contents lines)
- lines)))
- (org-mode)
- (insert
- (org-export--prepare-file-contents
- file lines ind minlevel
- (or (gethash file file-prefix)
- (puthash file
- (cl-incf current-prefix)
- file-prefix))
- footnotes
- includer-file)))
- (org-export-expand-include-keyword
- (cons (list file lines) included)
- (file-name-directory file)
- footnotes)
- (buffer-string)))))
- ;; Expand footnotes after all files have been
- ;; included. Footnotes are stored at end of buffer.
- (unless included
- (org-with-wide-buffer
- (goto-char (point-max))
- (maphash (lambda (k v)
- (insert (format "\n[fn:%s] %s\n" k v)))
- footnotes))))))))))))
+ (cond
+ ((eq env 'literal)
+ (insert
+ (let ((ind-str (make-string ind ?\s))
+ (arg-str (if (stringp args) (format " %s" args) ""))
+ (contents
+ (org-escape-code-in-string
+ (org-export--prepare-file-contents file lines))))
+ (format "%s#+BEGIN_%s%s\n%s%s#+END_%s\n"
+ ind-str block arg-str contents ind-str block))))
+ ((stringp block)
+ (insert
+ (let ((ind-str (make-string ind ?\s))
+ (contents
+ (org-export--prepare-file-contents file lines)))
+ (format "%s#+BEGIN_%s\n%s%s#+END_%s\n"
+ ind-str block contents ind-str block))))
+ (t
+ (insert
+ (with-temp-buffer
+ (let ((org-inhibit-startup t)
+ (lines
+ (if location
+ (org-export--inclusion-absolute-lines
+ file location only-contents lines)
+ lines)))
+ (org-mode)
+ (insert
+ (org-export--prepare-file-contents
+ file lines ind minlevel
+ (or (gethash file file-prefix)
+ (puthash file
+ (cl-incf current-prefix)
+ file-prefix))
+ footnotes
+ includer-file)))
+ (org-export-expand-include-keyword
+ (cons (list file lines) included)
+ (file-name-directory file)
+ footnotes)
+ (buffer-string)))))
+ ;; Expand footnotes after all files have been
+ ;; included. Footnotes are stored at end of buffer.
+ (unless included
+ (org-with-wide-buffer
+ (goto-char (point-max))
+ (maphash (lambda (k v)
+ (insert (format "\n[fn:%s] %s\n" k v)))
+ footnotes)))))))))))))
(defun org-export--inclusion-absolute-lines (file location only-contents lines)
"Resolve absolute lines for an included file with file-link.
--
2.14.3
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: Correctly-convert-encoding-of-included-files --]
[-- Type: text/x-patch, Size: 1071 bytes --]
From fbd854f566d47729f7dcc0f304b537890a6eec0c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pierre=20T=C3=A9choueyres?= <pierre.techoueyres@free.fr>
Date: Sat, 21 Apr 2018 00:19:10 +0200
Subject: [PATCH] Correctly convert encoding of included files
* lisp/ox.el (org-export--prepare-file-contents): convert temporary
buffer encoding to org buffer's encoding.
---
lisp/ox.el | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/lisp/ox.el b/lisp/ox.el
index 5a83ae01d..a41d4d8d0 100644
--- a/lisp/ox.el
+++ b/lisp/ox.el
@@ -3481,7 +3481,10 @@ the included document.
Optional argument INCLUDER is the file name where the inclusion
is to happen."
(with-temp-buffer
- (insert-file-contents file)
+ (let ((org-buffer-coding-system buffer-file-coding-system))
+ (insert-file-contents file)
+ (unless (eq org-buffer-coding-system buffer-file-coding-system)
+ (set-buffer-file-coding-system org-buffer-coding-system)))
(when lines
(let* ((lines (split-string lines "-"))
(lbeg (string-to-number (car lines)))
--
2.14.3
next prev parent reply other threads:[~2018-04-20 23:08 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-04-16 19:52 [PATCH] Add new keyword :coding for #+include directive Pierre Téchoueyres
2018-04-16 21:30 ` Pierre Téchoueyres
2018-04-17 8:36 ` Nicolas Goaziou
2018-04-18 18:40 ` Pierre Téchoueyres
2018-04-20 23:08 ` Pierre Téchoueyres [this message]
2018-04-23 10:27 ` Nicolas Goaziou
2018-04-23 19:44 ` Pierre Téchoueyres
2018-04-24 21:59 ` Nicolas Goaziou
2018-04-24 22:57 ` Pierre Téchoueyres
2018-05-04 22:41 ` Pierre Téchoueyres
2018-05-08 17:31 ` Nicolas Goaziou
2018-05-14 23:44 ` Pierre Téchoueyres
2018-05-19 13:13 ` Nicolas Goaziou
2018-05-19 16:09 ` Pierre Téchoueyres
2018-05-20 7:33 ` Nicolas Goaziou
2018-05-24 21:29 ` Pierre Téchoueyres
2018-06-02 10:13 ` Nicolas Goaziou
2018-06-08 19:21 ` Pierre Téchoueyres
2018-06-13 13:39 ` Nicolas Goaziou
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.orgmode.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87in8lh3xk.fsf@killashandra.ballybran.fr \
--to=pierre.techoueyres@free.fr \
--cc=emacs-orgmode@gnu.org \
--cc=mail@nicolasgoaziou.fr \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
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).