22
33class Sanitize
44 module Config
5- HTTP_PROTOCOLS ||= [ 'http' , 'https' , 'dat' , 'dweb' , 'ipfs' , 'ipns' , 'ssb' , 'gopher' , 'xmpp' , 'magnet' , :relative ] . freeze
5+ HTTP_PROTOCOLS = %w(
6+ http
7+ https
8+ ) . freeze
9+
10+ LINK_PROTOCOLS = %w(
11+ http
12+ https
13+ dat
14+ dweb
15+ ipfs
16+ ipns
17+ ssb
18+ gopher
19+ xmpp
20+ magnet
21+ ) . freeze
622
723 CLASS_WHITELIST_TRANSFORMER = lambda do |env |
824 node = env [ :node ]
@@ -19,19 +35,37 @@ module Config
1935 node [ 'class' ] = class_list . join ( ' ' )
2036 end
2137
38+ UNSUPPORTED_HREF_TRANSFORMER = lambda do |env |
39+ return unless env [ :node_name ] == 'a'
40+
41+ current_node = env [ :node ]
42+
43+ scheme = begin
44+ if current_node [ 'href' ] =~ Sanitize ::REGEX_PROTOCOL
45+ Regexp . last_match ( 1 ) . downcase
46+ else
47+ :relative
48+ end
49+ end
50+
51+ current_node . replace ( current_node . text ) unless LINK_PROTOCOLS . include? ( scheme )
52+ end
53+
2254 UNSUPPORTED_ELEMENTS_TRANSFORMER = lambda do |env |
2355 return unless %w( h1 h2 h3 h4 h5 h6 blockquote pre ul ol li ) . include? ( env [ :node_name ] )
2456
57+ current_node = env [ :node ]
58+
2559 case env [ :node_name ]
2660 when 'li'
27- env [ :node ] . traverse do |node |
61+ current_node . traverse do |node |
2862 next unless %w( p ul ol li ) . include? ( node . name )
2963
3064 node . add_next_sibling ( '<br>' ) if node . next_sibling
3165 node . replace ( node . children ) unless node . text?
3266 end
3367 else
34- env [ :node ] . name = 'p'
68+ current_node . name = 'p'
3569 end
3670 end
3771
@@ -50,13 +84,12 @@ module Config
5084 } ,
5185 } ,
5286
53- protocols : {
54- 'a' => { 'href' => HTTP_PROTOCOLS } ,
55- } ,
87+ protocols : { } ,
5688
5789 transformers : [
5890 CLASS_WHITELIST_TRANSFORMER ,
5991 UNSUPPORTED_ELEMENTS_TRANSFORMER ,
92+ UNSUPPORTED_HREF_TRANSFORMER ,
6093 ]
6194 )
6295
0 commit comments