এইচটিএমএল সত্তাগুলি ডিকোড করার অন্তর্নির্মিত উপায় (যেমন & quot; বা & # 39;)


11

আমি সম্প্রতি এইচটিএমএল সত্তা ডিকোডিংয়ের সমস্যায় পড়েছি। আমার নিম্নলিখিত দুটি স্ট্রিং রয়েছে ( এনকোডিংয়ের দুটি পদ্ধতি কীভাবে নামকরণ ও নাম্বার ব্যবহৃত হয় তা দ্রষ্টব্য )।

The old "how to fold xml" question
Babel doesn't wrap results in verbatim

এবং আমি তাদের রূপান্তর করা প্রয়োজন

The old "how to fold xml" question
Babel doesn't wrap results in verbatim

চারপাশে অনুসন্ধান করে, আমি এই পুরানো প্রশ্নটি এসও-তে খুঁজে পেয়েছি (যা আমি এই মুহুর্তের জন্য করছি), তবে আমি বিশ্বাস করতে অস্বীকার করি যে এমাকস এর কোনও অভ্যন্তরীণ উপায় নেই। আমাদের বেশ কয়েকটি ওয়েব ব্রাউজার রয়েছে, যার মধ্যে কমপক্ষে দুটি আমি জানি অন্তর্নির্মিত, মেল ক্লায়েন্ট এবং ফিড পাঠকদের উল্লেখ না করে।

এইচটিএমএল সত্তাগুলি ডিকোড করার কোনও অন্তর্নির্মিত উপায় নেই?
আমি একটি ফাংশন সন্ধান করছি যা প্রথম উদাহরণ থেকে একটি স্ট্রিং নেয় এবং দ্বিতীয় উদাহরণ থেকে একটি স্ট্রিং প্রদান করে।


যদি কিছু থাকে তবে আমি বাজি ধরছি এটি অবশ্যই এনএক্সএমএল কোডের মধ্যে থাকতে হবে কারণ এটি ডিটিডি পার্স করতে সক্ষম এবং নথিতে সত্তাগুলি যাচাই করতে পারে।
wasamasa

libxml-parse-html-regionএটি অবশ্যই করে, তবে এটি আপনার চেয়ে বেশি কিছু করতে পারে, এটি এটি এইচটিএমএল ট্যাগগুলিকেও পার্স করে তোলে ... (এবং সমস্ত ইমাসগুলি হয় লিবিএক্সএমএল সমর্থন দিয়ে নির্মিত নয়, আমার ধারণা)।
জন ও।

উত্তর:


7

ইমাসে একটি খাঁটি-এলিস্প এক্সএমএল পার্সার অন্তর্ভুক্ত করেছে xml.el, যার xml-parse-stringফাংশনটি কাজটি করে, যদিও এটি কিছুটা অনিবন্ধিত অভ্যন্তরীণ ফাংশনের মতো মনে হয়। আমি নিশ্চিত না যে এখানে কোনও এইচটিএমএল-সত্তা রয়েছে যা XML খণ্ড হিসাবে স্ট্রিংটিকে চিকিত্সা করে সঠিকভাবে পরিচালনা করা হবে না।

এই মোড়ক ফাংশনটি কেবল ইনপুট স্ট্রিং থেকে কোনও পিছনে ট্যাগ বাদ দিতে পারে, যদিও আপনি এটি আরও কঠোর করতে পারেন:

(defun decode-entities (html)
  (with-temp-buffer
    (save-excursion (insert html))
    (xml-parse-string)))

(decode-entities "The old "how to fold xml" question")
;; => "The old \"how to fold xml\" question"

(decode-entities "doesn't")
;; => "doesn't"

(decode-entities "string with trailing tag: <tag/>")
;; => "string with trailing tag: "

LibXML সমর্থনে এ গিয়ে Emacs সালে আরেকটি সামান্য hackish উপায় মোড়কের প্রায় লিখতে হবে libxml-html-parse-region। যেহেতু LibXML পার্সার ধরে নিচ্ছে যে এটির যুক্তিটি সম্পূর্ণ এইচটিএমএল ডকুমেন্ট, তাই মোড়ক ফাংশনটি ব্যবহার করে ফেরত নথি কাঠামো থেকে পার্স করা অক্ষর ডেটা বের করতে হবে pcase। যে কোনও HTML ট্যাগ রয়েছে এমন একটি স্ট্রিং ডিকোড করার চেষ্টা করা একটি ত্রুটি তৈরি করবে:

(defun decode-entities/libxml (html)
  (with-temp-buffer
    (insert html)
    (let ((document
           (libxml-parse-html-region (point-min) (point-max))))
      (pcase document
        (`(html nil
                (body nil
                      (p nil
                         ,(and (pred stringp)
                               content))))
          content)
        (_ (error "Unexpected parse result: %S" document))))))

ফলাফল:

(decode-entities/libxml "The old &quot;how to fold xml&quot; question")
     ; => "The old \"how to fold xml\" question"
(decode-entities/libxml "doesn&#39;t") ; => "doesn't"

(decode-entities/libxml "<html>")              ; produces an error

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


দুঃখিত, আমি আপনার এক্সএমএল সম্পাদনাটি দেখিনি। দারুণ দেখাচ্ছে.
মালবারবা

ধন্যবাদ - আমি সহজ xml.elসমাধানটি প্রথমে রেখে উত্তর সম্পাদনা করেছি ।
জন ও।

@ মালবারবা নোট যাতে lisp/xml.elসর্বদা ফাংশন অন্তর্ভুক্ত থাকে xml-substitute-special, যা জন ও এরdecode-entities মতো একই সত্তা ডিকোডিং করে । এটি তবে অনুসরণযোগ্য ট্যাগ বাদ দেয় না।
বেসিল

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.