Hello org's developpers,
Sorry, I forgot the patch.
so here is the whole mail + patch:

I want to propose the attached patch which allow you to specify an
optionnal `:coding' keyword to the `#+INCLUDE:' directive.

This allow you to specify something like
#+begin_example
,#+INCLUDE: "myfile.cmd" src cmd :coding "cp850-dos"
#+end_example
Which allow you to have different encoding for your various sources
files.

This allow me to include localised Microsoft Windows batch sources
inside my utf-8-unix org-files.

Thanks in advance for your remarks.

Pierre

>From 5200ea1fed3f13f429615baa0f196f512ca47fe7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pierre=20T=C3=A9choueyres?= <pierre.techouey...@free.fr>
Date: Mon, 16 Apr 2018 21:20:17 +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 :
when your org-file is encoded in utf-8.
---
 etc/ORG-NEWS |  10 ++++-
 lisp/ox.el   | 117 +++++++++++++++++++++++++++++++----------------------------
 2 files changed, 71 insertions(+), 56 deletions(-)

diff --git a/etc/ORG-NEWS b/etc/ORG-NEWS
index 013c7b139..7a526d737 100644
--- a/etc/ORG-NEWS
+++ b/etc/ORG-NEWS
@@ -108,6 +108,14 @@ You can use =ob-scala.el= as packaged in scala-mode, available from the
 MELPA repository.
 
 ** 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
+
 *** iCalendar export uses inheritance for TIMEZONE and LOCATION properties
 Both these properties can be inherited during iCalendar export,
 depending on the value of ~org-use-property-inheritance~.
@@ -514,7 +522,7 @@ want to take over maintenance of this compatibility, please contact
 our mailing list.
 
 *** New syntax for export blocks
-
+    
 Export blocks are explicitly marked as such at the syntax level to
 disambiguate their parsing from special blocks.  The new syntax is
 
diff --git a/lisp/ox.el b/lisp/ox.el
index ea7d1dc81..9423ae090 100644
--- a/lisp/ox.el
+++ b/lisp/ox.el
@@ -3326,6 +3326,12 @@ storing and resolving footnotes.  It is created automatically."
 			  value)
 			 (prog1 (match-string 1 value)
 			   (setq value (replace-match "" nil nil value)))))
+		   (coding
+		    (intern (or (and (string-match
+				      ":coding +\"\\([^\"]+\\)\"" value)
+				     (prog1 (match-string 1 value)
+				       (setq value (replace-match "" nil nil value))))
+				(symbol-name buffer-file-coding-system))))
 		   (env (cond
 			 ((string-match "\\<example\\>" value) 'literal)
 			 ((string-match "\\<export\\(?: +\\(.*\\)\\)?" value)
@@ -3348,63 +3354,64 @@ 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)))
-		     (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)))
+		       (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

Reply via email to