0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Cocoaの機能を使ってXMLエンコード/デコードするAppleScriptハンドラ

Posted at
encodeXML.scpt
use framework "Foundation"

set encodedXML to my encodeXML("<p>あいうえお</p>
<strong>かきくけこ</strong>")
(*"&lt;p&gt;あいうえお&lt;/p&gt;
&lt;strong&gt;かきくけこ&lt;/strong&gt;"*)

on encodeXML(XML as text)
	--require framework: Foundation
	set attributedString to current application's NSAttributedString's alloc()'s initWithString:XML
	set attributes to current application's NSDictionary's dictionaryWithObject:(current application's NSHTMLTextDocumentType) forKey:(current application's NSDocumentTypeDocumentAttribute)
	set HTMLData to attributedString's dataFromRange:{location:0, |length|:attributedString's |length|} documentAttributes:attributes |error|:(missing value)
	set HTMLString to current application's NSString's alloc()'s initWithData:HTMLData encoding:(current application's NSUTF8StringEncoding)
	set HTMLContent to item 2 of item 1 of my regexMatches(HTMLString, "<body>\\s([\\w\\W]*)\\s</body>")
	return my regexReplace(HTMLContent, "<[^>]*>", "")
end encodeXML

on regexMatches(aText as text, pattern as text)
	--require framework: Foundation
	set regularExpression to current application's NSRegularExpression's regularExpressionWithPattern:pattern options:0 |error|:(missing value)
	set aString to current application's NSString's stringWithString:aText
	set matches to regularExpression's matchesInString:aString options:0 range:{location:0, |length|:aString's |length|()}
	
	set matchResultList to {}
	repeat with match in matches
		set matchResult to {}
		repeat with i from 0 to (match's numberOfRanges as integer) - 1
			set end of matchResult to (aString's substringWithRange:(match's rangeAtIndex:i)) as text
		end repeat
		set end of matchResultList to matchResult
	end repeat
	return matchResultList
end regexMatches

on regexReplace(aText as text, pattern as text, replacement as text)
	--require framework: Foundation
	set regularExpression to current application's NSRegularExpression's regularExpressionWithPattern:pattern options:0 |error|:(missing value)
	return (regularExpression's stringByReplacingMatchesInString:aText options:0 range:{location:0, |length|:count aText} withTemplate:replacement) as text
end regexReplace
decodeXML.scpt
use framework "Foundation"

my decodeXML("&lt;p&gt;あいうえお&lt;/p&gt;
&lt;strong&gt;かきくけこ&lt;/strong&gt;")
(*<p>あいうえお</p>
<strong>かきくけこ</strong>*)

on decodeXML(XML as text)
	set HTMLContent to my regexReplace(XML, "[\\n\\r]", "<br/>" & linefeed)
	return my convertHTMLToPlainText(HTMLContent)
end decodeXML

on regexReplace(aText as text, pattern as text, replacement as text)
	--require framework: Foundation
	set regularExpression to current application's NSRegularExpression's regularExpressionWithPattern:pattern options:0 |error|:(missing value)
	return (regularExpression's stringByReplacingMatchesInString:aText options:0 range:{location:0, |length|:count aText} withTemplate:replacement) as text
end regexReplace

on convertHTMLToPlainText(HTML)
	--require framework: Foundation
	set attributedString to my attributedStringOfHTMLText(HTML)
	return attributedString's |string| as text
end convertHTMLToPlainText

on attributedStringOfHTMLText(HTML as text)
	--require framework: Foundation
	set HTMLString to current application's NSString's stringWithString:HTML
	set HTMLData to HTMLString's dataUsingEncoding:(current application's NSUnicodeStringEncoding)
	return current application's NSAttributedString's alloc()'s initWithHTML:HTMLData documentAttributes:(missing value)
end attributedStringOfHTMLText

更新履歴

  • 2016-09-05: NSAttributedStringクラスを使って作成
  • 2017-07-21: encodeXMLハンドラにおいてregexMatchesハンドラとregexReplaceハンドラを使用
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?