আমি কীভাবে একটি org- মোড গাছ হাঁটতে পারি?


10

পটভূমি

আমি ইম্যাক্সের জন্য একটি উপস্থাপনা মোড লিখছি। Org ফাইলগুলি ডেটার জন্য দুর্দান্ত বলে আমি ইনপুটটি org ফাইল হতে চাই।

সমস্যা

আমাকে org মোড ফাইলটিকে "স্লাইড" ডেটা স্ট্রাকচারের তালিকায় রূপান্তর করতে হবে যা দিয়ে আমি পুনরাবৃত্তি করতে পারি। এটি করতে, আমি নিম্নলিখিত org- মোড ফাইলের মতো কিছু নিতে চাই:

* this is the first headline, with a title property and no contents
* this is the second headline, with contents
- dash list nested under the second headline
  - further nested
** nested headline

এবং এটি চলতে সক্ষম হতে। আমি চেষ্টা করেছি (org-element-parse-buffer), এবং এটি আমাকে উপাদানগুলির একটি তালিকা দেয় তবে এগুলিতে আরও কীভাবে চলতে হবে তা নির্ধারণ করা শক্ত। উদাহরণস্বরূপ, কলিং তিনটি উপাদানের (org-element-map (org-element-parse-buffer) 'headline #'identity)একটি তালিকা দেয় ; শেষটি "নেস্টেড শিরোনাম" উপস্থাপন করে। আমি "নেস্টেড শিরোনাম "টিকে" লিখিত সামগ্রী সহ এটিই দ্বিতীয় শিরোনাম "হতে চাই a

এক্সওয়াই সমস্যা এড়ানো

আমি অবশ্যই একটি org- মোড ফাইলকে একটি এলিস্প ডেটা স্ট্রাকচারে রূপান্তর করার অন্যান্য উপায়ে উন্মুক্ত। আমি চাই না মনে সংস্থা-রপ্তানি, আমার জন্য সঠিক টুল কারণ আমি একটি নতুন ফলাফল ফাইল দিয়ে শেষ করতে চাই না, কিন্তু একটি ডাটা স্ট্রাকচার আমি মাধ্যমে পুনরুক্তি করতে পারেন। আমার নিষ্পাপ উপায়টি "আমাকে শীর্ষ-স্তরের সমস্ত শিরোনাম দিন, এবং তারপরে আমি তাদের বৈশিষ্ট্য এবং উপাদানগুলি (উদাহরণস্বরূপ, সরল পাঠ্য বা নেস্টেড তালিকাগুলি - পরবর্তী শিরোনামগুলি বা ড্যাশ তালিকাগুলি কিনা") পেতে পারি "


2
আমি বিশ্বাস করি তৃতীয় ঐচ্ছিক যুক্তি no-recursionএর org-element-mapকি আপনি চান করতে হবে।
wvxvw

2
কীভাবে ফাইলের নীচে যাবেন এবং তারপরে পিছনের দিকে শিরোনামটি অনুসন্ধান করুন, সমস্ত কিছু ধরে ফেলুন এবং তারপরে প্রক্রিয়াটি পুনরাবৃত্তি করবেন - যতক্ষণ না আপনি ফাইলের শীর্ষে পৌঁছান, তারপরে নিক্ষেপ করা হবে? আমরা পিছনে যাচ্ছি কারণ পয়েন্টটি প্রতিটি সন্ধানের পরে শিরোনামের শুরুতে রয়েছে, সুতরাং এটি এগিয়ে যাওয়ার চেয়ে আরও কার্যকরী এবং তারপরে শিরোনামের শুরুর দিকে কিছুটা পিছন ফিরে যাওয়া। এটি org-अजেন্ডা কীভাবে কাজ করে - যেমন, org-अजেন্ডা-তালিকা, org- অনুসন্ধান-ভিউ, org-ট্যাগ-ভিউ।
আইনজীবি

উত্তর:


7

আমার অনুরূপ সমস্যা ছিল, তাই এটি সাহায্য করবে - আমি org রফতানি বা org ইন্টার্নালগুলির সাথে খুব বেশি পরিচিত নই, তবে কোনও গাছের কাঠামোর সাথে একটি org ফাইলকে বিশ্লেষণ করতে পারে এমন কোনও কিছুই আমি পাইনি। কিন্তু মত একটি বাফার দেওয়া

* england
** london
** bristol
* france

এটা আপনাকে দেবে

(org-get-header-tree) => ("england" ("london" "bristol") "france")

এবং গাছ থেকে অন্যান্য তথ্যও অন্তর্ভুক্ত করতে পারে।


সুতরাং আমাদের একটি গাছ উত্পাদন করার প্রয়োজনীয় স্তরের একটি সমতল তালিকা দেওয়া হয়েছে, যেমন (1 1 2 3 1) => (1 1 (2 (3)) 1)। আমি এমন কোনও ফাংশন খুঁজে পাইনি যা এটি করত কনস কোষগুলির অনেক অঙ্কনের পরে এমনটি লিখেছিল - আমি নিশ্চিত যে এটি করার আরও ভাল উপায় আছে তবে এটি কার্যকর হয়। unflattenতালিকা থেকে আপনার পছন্দের তথ্য এবং আইটেমের স্তরগুলি বের করতে ফাংশনটি একটি সমতল তালিকা এবং কয়েকটি ফাংশন নেয় এবং একটি গাছের কাঠামো তৈরি করে।

ইন org-get-header-listআপনি আরও তথ্য যোগ করতে পারিনি আপনাকে কল দিয়ে প্রতিটি আইটেমের থেকে বের করে আনতে চান org-element-property, এবং তারপর মধ্যে org-get-header-treeআপনি ফাংশন তালিকা থেকে তথ্য নিষ্কাশন অন্তর্ভুক্ত হতে পারে।

যেহেতু এটি দাঁড়ায় এটি ড্যাশ তালিকার জন্য পরিচালনা করা অন্তর্ভুক্ত করে না, তবে সম্ভবত খুব বেশি সমস্যা ছাড়াই এগুলি পরিচালনা করতেও এটি রূপান্তর করা যেতে পারে ...


(defun unflatten (xs &optional fn-value fn-level)
  "Unflatten a list XS into a tree, e.g. (1 2 3 1) => (1 (2 (3)) 1).
FN-VALUE specifies how to extract the values from each element, which
are included in the output tree, FN-LEVEL tells how to extract the
level of each element. By default these are the `identity' function so
it will work on a list of numbers."
  (let* ((level 1)
         (tree (cons nil nil))
         (start tree)
         (stack nil)
         (fn-value (or fn-value #'identity))
         (fn-level (or fn-level #'identity)))
    (dolist (x xs)
      (let ((x-value (funcall fn-value x))
            (x-level (funcall fn-level x)))
        (cond ((> x-level level)
               (setcdr tree (cons (cons x-value nil) nil))
               (setq tree (cdr tree))
               (push tree stack)
               (setq tree (car tree))
               (setq level x-level))
              ((= x-level level)
               (setcdr tree (cons x-value nil))
               (setq tree (cdr tree)))
              ((< x-level level)
               (while (< x-level level)
                 (setq tree (pop stack))
                 (setq level (- level 1)))
               (setcdr tree (cons x-value nil))
               (setq tree (cdr tree))
               (setq level x-level)))))
      (cdr start)))

; eg (unflatten '(1 2 3 2 3 4)) => '(1 (2 (3) 2 (3 (4))))


(defun org-get-header-list (&optional buffer) 
  "Get the headers of an org buffer as a flat list of headers and levels.
Buffer will default to the current buffer."
  (interactive)
  (with-current-buffer (or buffer (current-buffer))
    (let ((tree (org-element-parse-buffer 'headline)))
      (org-element-map 
          tree 
          'headline
        (lambda (el) (list 
                 (org-element-property :raw-value el) ; get header title without tags etc
                 (org-element-property :level el) ; get depth
                 ;; >> could add other properties here
                 ))))))

; eg (org-get-header-list) => (("pok" 1) ("lkm" 1) (("cedar" 2) ("yr" 2)) ("kjn" 1))


(defun org-get-header-tree (&optional buffer)
  "Get the headers of the given org buffer as a tree."
  (interactive)
  (let* ((headers (org-get-header-list buffer))
         (header-tree (unflatten headers  
                 (lambda (hl) (car hl))  ; extract information to include in tree
                 (lambda (hl) (cadr hl)))))  ; extract item level
    header-tree))

; eg (org-get-header-tree) => ("pok" "lkm" ("cedar" "yr") "kjn")
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.