2014-11-17 3 views
0

У меня есть хэш-таблица и вы хотите экспортировать хэш-таблицы в org-buffer. Что хэш-таблица должна распечатываться в org-buffer: взять ключи, если значение ключа не является хешем, тогда оно «::», иначе значение ключа будет хэш-таблицей, тогда ключ является заголовком и так далее. Q. 1. Я не мог найти, есть ли уже «импорт» в уже реализованный организационный буфер. Если есть, может кто-нибудь указать мне на это? 2. Кто-нибудь написал что-нибудь похожее на это? Я могу это сделать (это кажется достаточно простым), но не хотел бы изобретать велосипед. Если есть уже библиотека, которая может взять структуру (хэш-таблицу) и импортировать ее в org-buffer, это было бы потрясающе.Как импортировать хэш-таблицу в org-mode в emacs?

Спасибо.

Я представил пример вывода того, что эта хэш-таблица должна быть представлена ​​в org-buffer и исходной хэш-таблице.

* key "project-example" :id: "12345" ** affected-versions :id: "12332" :name: "SlimShady" :archived: nil :release-date: "2014-10-01T04:00:00.000Z" :released: nil :sequence: 81 :assigned-to: "m&m" :attach-name: nil ** components :id: "3214" :name: "Dr.Dre" :created: "2014-11-13T15:49:15.000Z" ** customer-fld-vals: :custom-fld-id: "cust-id-112233" :key: nil :values: "Fill me" :description: nil :duedate: nil :environment: nil :fixVersions: nil :key: "project-example" :priority: "high" :project: "EX" :reporter: "YourName" :resolution: "xx" :status: "xx" :summary: "Write something here" :type: "xx" :updated: "2014-11-15T22:52:13.000Z" :votes: 0

Raw-хэш (у меня есть список, который имеет только один хэш в нем):

((hash-table size 65 test equal rehash-size 1.5 rehash-threshold 0.8 data (id "12345" affected-versions #s(hash-table size 65 test equal rehash-size 1.5 rehash-threshold 0.8 data (id "12332" name "SlimShady" archived nil release-date "2014-10-01T04:00:00.000Z" released nil sequence 81)) assigned-to "m&m" attach-name nil components #s(hash-table size 65 test equal rehash-size 1.5 rehash-threshold 0.8 data (id "3214" name "Dr.Dre")) created "2014-11-13T15:49:15.000Z" customer-fld-vals #s(hash-table size 65 test equal rehash-size 1.5 rehash-threshold 0.8 data (customfieldId "cust-id-112233" key nil values ("Fill me"))) description nil duedate nil environment nil fixVersions nil key "project-example" priority "high" project "EX" reporter "YourName" resolution "xx" status "xx" summary "Write something here" type "xx" updated "2014-11-15T22:52:13.000Z" votes 0)))

ответ

0

Я украл вам все удовольствие ;-). Результат немного отличается от того, что вы предложили. Я не отступаю от заголовков листьев, чтобы организация узнавала структуру.

(defun org-import-hash (title hash &optional level noindent) 
    "Import HASH table into an org buffer. 
Put TITLE into the first heading. 
The hash table starts with LEVEL where LEVEL defaults to 1. 
Indent inserted region by org-mode unless NOINDENT is non-nil." 
    (interactive "sTitle:\nXHash-table:") 
    (unless level (setq level 1)) 
    (let ((b (point))) 
    (insert (if (or (looking-back "\n") (= (point) 1)) "" "\n") (make-string level ?*) (format " %s\n" title)) 
    (maphash (lambda (key val) 
      (cond 
     ((hash-table-p val) 
     (org-import-hash key val (1+ level) t)) 
     ;; other special cases here 
     (t 
     (insert (format " :%s: %s\n" key val))) 
     )) 
     hash) 
    (unless noindent 
     (indent-region b (point))) 
    )) 
+0

К сожалению, я пока не могу «UpVote» ваш ответ, мне нужно больше репутации. – user2762156

0

Раздел комментариев не позволит мне лишних символов, поэтому я не мог размещать здесь этот код.

Благодарим вас за решение, оно аккуратно !!

Я новичок в elisp и не знаю всех функций должным образом. На самом деле, как «make-string», моя альтернатива заключается в том, что я держу список звезд за внимание, а затем контактирую их везде, где это необходимо. Я придумал решение вскоре после того, как задал вопрос. Мне нравится ваш подход.

Несколько замечаний о моей хэша, что все ключи являются символами, следовательно, это: «(имя-символ к)»

(defun ->string (whatever) 
    (cond 
    ((equal 'integer (type-of whatever)) (number-to-string whatever)) 
    ((equal 'cons (type-of whatever)) (mapconcat 'identity (mapcar '->string whatever) " ")) 
    ((equal 'string (type-of whatever)) whatever))) 

(defun out->print (dstring) 
    (print dstring)) 

(defun out->buffer (dstring) 
    (insert dstring)) 

(defun print-issues (dhash stars) 
    (maphash (lambda (k v) 
      (progn (if (equal 'hash-table (type-of v)) 
         (progn 
          (let ((nstars (cons "*" stars))) 
          (out->buffer (concat (apply 'concat nstars) " " (symbol-name k) "\n")) 
          (print-issues v nstars))) 
         (out->buffer (concat (replace-regexp-in-string "\*" "\s" 
                    (apply 'concat stars)) 
              ":" 
              (symbol-name k) 
              ":" 
              " -- " 
              (->string v) "\n"))))) 
      dhash)) 
+0

Вы можете заменить '-> string' на встроенную' prin1-to-string', которая также обрабатывает символы. Другой возможностью будет 'format' с токеном'% S' или '% s'. Кроме того, похоже, что вы действительно не используете 'out-> print'. – Tobias

+0

'' 'out-> print''' Я просто добавил его, чтобы увидеть его на экране. Я стараюсь как можно больше отделить внимание. – user2762156

+0

заменит функцию '' '-> string'''. Спасибо – user2762156