selma 0.1.6 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1c8f57d5ae3f09a9457ea5a2ed3bd8db347bbb2b4d696cd660e53fe7dd77b3e1
4
- data.tar.gz: 7722be4f78d25760464a28679cd92cede4ae0013ef1f5a170a68945e500270f3
3
+ metadata.gz: ee5c02252f9d3c815aea09d7a79070ae69a4b6c167227f01195faad8c99f52da
4
+ data.tar.gz: 5e06f14ecd535c95cdda8c1869a1a255833ab3cc3c41dd4e2ca311b07ca8b4ff
5
5
  SHA512:
6
- metadata.gz: afd41b0e75bec3fa4f6ffffa20a3b8642fcbf3338fe2e9fa1439dfa54cb70a007d86fe15f9c6c78f1815d45305309f2ccef19987165e2e8c30018286d6d94576
7
- data.tar.gz: e07f434d483f5ef6b7181c4f4197b258a83b35958eda0c5c1cb216a2bf407a9cd3b6adbc59dc6e280990397bb40f21712520d4190b4076e881a79645af01833f
6
+ metadata.gz: 9e550b2bf33e7c57ee1f3cc07be5d5a0ab042959ffad69736ab13cd3e5ca3dca773855ac04f786b286c8917896ef5c7a50d9737f5ec4a85caf804a1d142d59be
7
+ data.tar.gz: 8e98daa7579c0f25ce65426813de1989235c18b86e0ee2519b72430fad7f5274c08c38971aff40305df8664c97ef6f369912abcf36509d9b1130b3025655a8ab
data/Cargo.lock CHANGED
@@ -15,20 +15,20 @@ dependencies = [
15
15
 
16
16
  [[package]]
17
17
  name = "aho-corasick"
18
- version = "1.0.2"
18
+ version = "1.1.2"
19
19
  source = "registry+https://github.com/rust-lang/crates.io-index"
20
- checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41"
20
+ checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0"
21
21
  dependencies = [
22
22
  "memchr",
23
23
  ]
24
24
 
25
25
  [[package]]
26
26
  name = "bindgen"
27
- version = "0.62.0"
27
+ version = "0.66.1"
28
28
  source = "registry+https://github.com/rust-lang/crates.io-index"
29
- checksum = "c6720a8b7b2d39dd533285ed438d458f65b31b5c257e6ac7bb3d7e82844dd722"
29
+ checksum = "f2b84e06fc203107bfbad243f4aba2af864eb7db3b1cf46ea0a023b0b433d2a7"
30
30
  dependencies = [
31
- "bitflags 1.3.2",
31
+ "bitflags 2.4.0",
32
32
  "cexpr",
33
33
  "clang-sys",
34
34
  "lazy_static",
@@ -39,7 +39,7 @@ dependencies = [
39
39
  "regex",
40
40
  "rustc-hash",
41
41
  "shlex",
42
- "syn 1.0.109",
42
+ "syn 2.0.38",
43
43
  ]
44
44
 
45
45
  [[package]]
@@ -50,15 +50,15 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
50
50
 
51
51
  [[package]]
52
52
  name = "bitflags"
53
- version = "2.3.1"
53
+ version = "2.4.0"
54
54
  source = "registry+https://github.com/rust-lang/crates.io-index"
55
- checksum = "6776fc96284a0bb647b615056fc496d1fe1644a7ab01829818a6d91cae888b84"
55
+ checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635"
56
56
 
57
57
  [[package]]
58
58
  name = "byteorder"
59
- version = "1.4.3"
59
+ version = "1.5.0"
60
60
  source = "registry+https://github.com/rust-lang/crates.io-index"
61
- checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
61
+ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
62
62
 
63
63
  [[package]]
64
64
  name = "cexpr"
@@ -116,7 +116,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
116
116
  checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331"
117
117
  dependencies = [
118
118
  "quote",
119
- "syn 2.0.18",
119
+ "syn 2.0.38",
120
120
  ]
121
121
 
122
122
  [[package]]
@@ -134,24 +134,24 @@ dependencies = [
134
134
 
135
135
  [[package]]
136
136
  name = "dtoa"
137
- version = "0.4.8"
137
+ version = "1.0.9"
138
138
  source = "registry+https://github.com/rust-lang/crates.io-index"
139
- checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0"
139
+ checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653"
140
140
 
141
141
  [[package]]
142
142
  name = "dtoa-short"
143
- version = "0.3.3"
143
+ version = "0.3.4"
144
144
  source = "registry+https://github.com/rust-lang/crates.io-index"
145
- checksum = "bde03329ae10e79ede66c9ce4dc930aa8599043b0743008548680f25b91502d6"
145
+ checksum = "dbaceec3c6e4211c79e7b1800fb9680527106beb2f9c51904a3210c03a448c74"
146
146
  dependencies = [
147
147
  "dtoa",
148
148
  ]
149
149
 
150
150
  [[package]]
151
151
  name = "encoding_rs"
152
- version = "0.8.32"
152
+ version = "0.8.33"
153
153
  source = "registry+https://github.com/rust-lang/crates.io-index"
154
- checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394"
154
+ checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1"
155
155
  dependencies = [
156
156
  "cfg-if",
157
157
  ]
@@ -179,7 +179,7 @@ checksum = "eecf8589574ce9b895052fa12d69af7a233f99e6107f5cb8dd1044f2a17bfdcb"
179
179
  dependencies = [
180
180
  "proc-macro2",
181
181
  "quote",
182
- "syn 2.0.18",
182
+ "syn 2.0.38",
183
183
  ]
184
184
 
185
185
  [[package]]
@@ -246,9 +246,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
246
246
 
247
247
  [[package]]
248
248
  name = "libc"
249
- version = "0.2.145"
249
+ version = "0.2.149"
250
250
  source = "registry+https://github.com/rust-lang/crates.io-index"
251
- checksum = "fc86cde3ff845662b8f4ef6cb50ea0e20c524eb3d29ae048287e06a1b3fa6a81"
251
+ checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b"
252
252
 
253
253
  [[package]]
254
254
  name = "libloading"
@@ -262,17 +262,17 @@ dependencies = [
262
262
 
263
263
  [[package]]
264
264
  name = "log"
265
- version = "0.4.18"
265
+ version = "0.4.20"
266
266
  source = "registry+https://github.com/rust-lang/crates.io-index"
267
- checksum = "518ef76f2f87365916b142844c16d8fefd85039bc5699050210a7778ee1cd1de"
267
+ checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f"
268
268
 
269
269
  [[package]]
270
270
  name = "lol_html"
271
- version = "1.0.0"
271
+ version = "1.2.0"
272
272
  source = "registry+https://github.com/rust-lang/crates.io-index"
273
- checksum = "ce59b33732efed2480f7d15722ed56905e81004b402196a738f7532ff44d9798"
273
+ checksum = "10662f7aad081ec900fd735be33076da75e0389400277dc3734e2b0aa02bb115"
274
274
  dependencies = [
275
- "bitflags 2.3.1",
275
+ "bitflags 2.4.0",
276
276
  "cfg-if",
277
277
  "cssparser",
278
278
  "encoding_rs",
@@ -288,24 +288,25 @@ dependencies = [
288
288
 
289
289
  [[package]]
290
290
  name = "magnus"
291
- version = "0.5.3"
291
+ version = "0.6.2"
292
292
  source = "registry+https://github.com/rust-lang/crates.io-index"
293
- checksum = "c8dc14463c2552e753ef562961f486ca76f17a857c121db40e9f3ade3f35ab81"
293
+ checksum = "4778544796676e8428e9c622460ebf284bea52d8b10db3aeb449d8b5e61b3a13"
294
294
  dependencies = [
295
295
  "magnus-macros",
296
296
  "rb-sys",
297
297
  "rb-sys-env",
298
+ "seq-macro",
298
299
  ]
299
300
 
300
301
  [[package]]
301
302
  name = "magnus-macros"
302
- version = "0.4.1"
303
+ version = "0.6.0"
303
304
  source = "registry+https://github.com/rust-lang/crates.io-index"
304
- checksum = "6cc17af1d45442c011aa579d727ec6cff8a69aea8a6bbad26736e7112d749bfb"
305
+ checksum = "5968c820e2960565f647819f5928a42d6e874551cab9d88d75e3e0660d7f71e3"
305
306
  dependencies = [
306
307
  "proc-macro2",
307
308
  "quote",
308
- "syn 1.0.109",
309
+ "syn 2.0.38",
309
310
  ]
310
311
 
311
312
  [[package]]
@@ -316,9 +317,9 @@ checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5"
316
317
 
317
318
  [[package]]
318
319
  name = "memchr"
319
- version = "2.5.0"
320
+ version = "2.6.4"
320
321
  source = "registry+https://github.com/rust-lang/crates.io-index"
321
- checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
322
+ checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167"
322
323
 
323
324
  [[package]]
324
325
  name = "mime"
@@ -434,18 +435,18 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068"
434
435
 
435
436
  [[package]]
436
437
  name = "proc-macro2"
437
- version = "1.0.59"
438
+ version = "1.0.69"
438
439
  source = "registry+https://github.com/rust-lang/crates.io-index"
439
- checksum = "6aeca18b86b413c660b781aa319e4e2648a3e6f9eadc9b47e9038e6fe9f3451b"
440
+ checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da"
440
441
  dependencies = [
441
442
  "unicode-ident",
442
443
  ]
443
444
 
444
445
  [[package]]
445
446
  name = "quote"
446
- version = "1.0.28"
447
+ version = "1.0.33"
447
448
  source = "registry+https://github.com/rust-lang/crates.io-index"
448
- checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488"
449
+ checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
449
450
  dependencies = [
450
451
  "proc-macro2",
451
452
  ]
@@ -503,18 +504,18 @@ dependencies = [
503
504
 
504
505
  [[package]]
505
506
  name = "rb-sys"
506
- version = "0.9.78"
507
+ version = "0.9.82"
507
508
  source = "registry+https://github.com/rust-lang/crates.io-index"
508
- checksum = "91447d8cbb45afb5c915bad4dd44bd4b4e9be37648122409ceca75302cb81683"
509
+ checksum = "a3e6bf79bf4c711917cacfaf46dfab4314dbfdd89a8ee3ec4b98336cd23f1ebf"
509
510
  dependencies = [
510
511
  "rb-sys-build",
511
512
  ]
512
513
 
513
514
  [[package]]
514
515
  name = "rb-sys-build"
515
- version = "0.9.78"
516
+ version = "0.9.82"
516
517
  source = "registry+https://github.com/rust-lang/crates.io-index"
517
- checksum = "20673c1cfbd57b2db6c066b796352f07d241c45b210fd15b269dec54fa240380"
518
+ checksum = "5482a1ed4cde58dddaf162b6aebcb5c25645822547832b8be101f2acd40bcdd6"
518
519
  dependencies = [
519
520
  "bindgen",
520
521
  "lazy_static",
@@ -522,7 +523,7 @@ dependencies = [
522
523
  "quote",
523
524
  "regex",
524
525
  "shell-words",
525
- "syn 1.0.109",
526
+ "syn 2.0.38",
526
527
  ]
527
528
 
528
529
  [[package]]
@@ -533,9 +534,21 @@ checksum = "a35802679f07360454b418a5d1735c89716bde01d35b1560fc953c1415a0b3bb"
533
534
 
534
535
  [[package]]
535
536
  name = "regex"
536
- version = "1.8.3"
537
+ version = "1.10.0"
538
+ source = "registry+https://github.com/rust-lang/crates.io-index"
539
+ checksum = "d119d7c7ca818f8a53c300863d4f87566aac09943aef5b355bb83969dae75d87"
540
+ dependencies = [
541
+ "aho-corasick",
542
+ "memchr",
543
+ "regex-automata",
544
+ "regex-syntax",
545
+ ]
546
+
547
+ [[package]]
548
+ name = "regex-automata"
549
+ version = "0.4.1"
537
550
  source = "registry+https://github.com/rust-lang/crates.io-index"
538
- checksum = "81ca098a9821bd52d6b24fd8b10bd081f47d39c22778cafaa75a2857a62c6390"
551
+ checksum = "465c6fc0621e4abc4187a2bda0937bfd4f722c2730b29562e19689ea796c9a4b"
539
552
  dependencies = [
540
553
  "aho-corasick",
541
554
  "memchr",
@@ -544,9 +557,9 @@ dependencies = [
544
557
 
545
558
  [[package]]
546
559
  name = "regex-syntax"
547
- version = "0.7.2"
560
+ version = "0.8.1"
548
561
  source = "registry+https://github.com/rust-lang/crates.io-index"
549
- checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78"
562
+ checksum = "56d84fdd47036b038fc80dd333d10b6aab10d5d31f4a366e20014def75328d33"
550
563
 
551
564
  [[package]]
552
565
  name = "rustc-hash"
@@ -601,9 +614,15 @@ dependencies = [
601
614
 
602
615
  [[package]]
603
616
  name = "semver"
604
- version = "1.0.17"
617
+ version = "1.0.20"
605
618
  source = "registry+https://github.com/rust-lang/crates.io-index"
606
- checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed"
619
+ checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090"
620
+
621
+ [[package]]
622
+ name = "seq-macro"
623
+ version = "0.3.5"
624
+ source = "registry+https://github.com/rust-lang/crates.io-index"
625
+ checksum = "a3f0bf26fd526d2a95683cd0f87bf103b8539e2ca1ef48ce002d67aad59aa0b4"
607
626
 
608
627
  [[package]]
609
628
  name = "servo_arc"
@@ -623,21 +642,21 @@ checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde"
623
642
 
624
643
  [[package]]
625
644
  name = "shlex"
626
- version = "1.1.0"
645
+ version = "1.2.0"
627
646
  source = "registry+https://github.com/rust-lang/crates.io-index"
628
- checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3"
647
+ checksum = "a7cee0529a6d40f580e7a5e6c495c8fbfe21b7b52795ed4bb5e62cdf92bc6380"
629
648
 
630
649
  [[package]]
631
650
  name = "siphasher"
632
- version = "0.3.10"
651
+ version = "0.3.11"
633
652
  source = "registry+https://github.com/rust-lang/crates.io-index"
634
- checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de"
653
+ checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d"
635
654
 
636
655
  [[package]]
637
656
  name = "smallvec"
638
- version = "1.10.0"
657
+ version = "1.11.1"
639
658
  source = "registry+https://github.com/rust-lang/crates.io-index"
640
- checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0"
659
+ checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a"
641
660
 
642
661
  [[package]]
643
662
  name = "stable_deref_trait"
@@ -658,9 +677,9 @@ dependencies = [
658
677
 
659
678
  [[package]]
660
679
  name = "syn"
661
- version = "2.0.18"
680
+ version = "2.0.38"
662
681
  source = "registry+https://github.com/rust-lang/crates.io-index"
663
- checksum = "32d41677bcbe24c20c52e7c70b0d8db04134c5d1066bf98662e2871ad200ea3e"
682
+ checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b"
664
683
  dependencies = [
665
684
  "proc-macro2",
666
685
  "quote",
@@ -675,29 +694,29 @@ checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c"
675
694
 
676
695
  [[package]]
677
696
  name = "thiserror"
678
- version = "1.0.40"
697
+ version = "1.0.49"
679
698
  source = "registry+https://github.com/rust-lang/crates.io-index"
680
- checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac"
699
+ checksum = "1177e8c6d7ede7afde3585fd2513e611227efd6481bd78d2e82ba1ce16557ed4"
681
700
  dependencies = [
682
701
  "thiserror-impl",
683
702
  ]
684
703
 
685
704
  [[package]]
686
705
  name = "thiserror-impl"
687
- version = "1.0.40"
706
+ version = "1.0.49"
688
707
  source = "registry+https://github.com/rust-lang/crates.io-index"
689
- checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f"
708
+ checksum = "10712f02019e9288794769fba95cd6847df9874d49d871d062172f9dd41bc4cc"
690
709
  dependencies = [
691
710
  "proc-macro2",
692
711
  "quote",
693
- "syn 2.0.18",
712
+ "syn 2.0.38",
694
713
  ]
695
714
 
696
715
  [[package]]
697
716
  name = "unicode-ident"
698
- version = "1.0.9"
717
+ version = "1.0.12"
699
718
  source = "registry+https://github.com/rust-lang/crates.io-index"
700
- checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0"
719
+ checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
701
720
 
702
721
  [[package]]
703
722
  name = "version_check"
data/README.md CHANGED
@@ -164,6 +164,9 @@ The `element` argument in `handle_element` has the following methods:
164
164
  - `prepend(content, as: content_type)`: prepends `content` to the element's inner content, i.e. inserts content right after the element's start tag. `content_type` is either `:text` or `:html` and determines how the content will be applied.
165
165
  - `append(content, as: content_type)`: appends `content` to the element's inner content, i.e. inserts content right before the element's end tag. `content_type` is either `:text` or `:html` and determines how the content will be applied.
166
166
  - `set_inner_content`: Replaces inner content of the element with `content`. `content_type` is either `:text` or `:html` and determines how the content will be applied.
167
+ - `remove`: Removes the element and its inner content.
168
+ - `remove_and_keep_content`: Removes the element, but keeps its content. I.e. remove start and end tags of the element.
169
+ - `removed?`: A bool which identifies if the element has been removed or replaced with some content.
167
170
 
168
171
  #### `text_chunk` methods
169
172
 
data/ext/selma/Cargo.toml CHANGED
@@ -6,8 +6,8 @@ edition = "2021"
6
6
  [dependencies]
7
7
  enum-iterator = "1.4"
8
8
  escapist = "0.0.2"
9
- magnus = "0.5"
10
- lol_html = "1.0"
9
+ magnus = "0.6"
10
+ lol_html = "1.2"
11
11
 
12
12
  [lib]
13
13
  name = "selma"
@@ -215,12 +215,41 @@ impl SelmaHTMLElement {
215
215
 
216
216
  Ok(())
217
217
  }
218
+
219
+ fn remove(&self) {
220
+ let mut binding = self.0.borrow_mut();
221
+
222
+ if let Ok(e) = binding.element.get_mut() {
223
+ e.remove()
224
+ }
225
+ }
226
+
227
+ fn remove_and_keep_content(&self) {
228
+ let mut binding = self.0.borrow_mut();
229
+
230
+ if let Ok(e) = binding.element.get_mut() {
231
+ e.remove_and_keep_content()
232
+ }
233
+ }
234
+
235
+ fn is_removed(&self) -> Result<bool, Error> {
236
+ let binding = self.0.borrow();
237
+
238
+ if let Ok(e) = binding.element.get() {
239
+ Ok(e.removed())
240
+ } else {
241
+ Err(Error::new(
242
+ exception::runtime_error(),
243
+ "`is_removed` is not available",
244
+ ))
245
+ }
246
+ }
218
247
  }
219
248
 
220
249
  pub fn init(c_html: RClass) -> Result<(), Error> {
221
250
  let c_element = c_html
222
- .define_class("Element", Default::default())
223
- .expect("cannot find class Selma::HTML::Element");
251
+ .define_class("Element", magnus::class::object())
252
+ .expect("cannot define class Selma::HTML::Element");
224
253
 
225
254
  c_element.define_method("tag_name", method!(SelmaHTMLElement::tag_name, 0))?;
226
255
  c_element.define_method("tag_name=", method!(SelmaHTMLElement::set_tag_name, 1))?;
@@ -250,5 +279,12 @@ pub fn init(c_html: RClass) -> Result<(), Error> {
250
279
  method!(SelmaHTMLElement::set_inner_content, -1),
251
280
  )?;
252
281
 
282
+ c_element.define_method("remove", method!(SelmaHTMLElement::remove, 0))?;
283
+ c_element.define_method(
284
+ "remove_and_keep_content",
285
+ method!(SelmaHTMLElement::remove_and_keep_content, 0),
286
+ )?;
287
+ c_element.define_method("removed?", method!(SelmaHTMLElement::is_removed, 0))?;
288
+
253
289
  Ok(())
254
290
  }
@@ -26,8 +26,8 @@ impl SelmaHTMLEndTag {
26
26
 
27
27
  pub fn init(c_html: RClass) -> Result<(), Error> {
28
28
  let c_end_tag = c_html
29
- .define_class("EndTag", Default::default())
30
- .expect("cannot find class Selma::HTML::EndTag");
29
+ .define_class("EndTag", magnus::class::object())
30
+ .expect("cannot define class Selma::HTML::EndTag");
31
31
 
32
32
  c_end_tag.define_method("tag_name", method!(SelmaHTMLEndTag::tag_name, 0))?;
33
33
 
@@ -99,8 +99,8 @@ impl SelmaHTMLTextChunk {
99
99
 
100
100
  pub fn init(c_html: RClass) -> Result<(), Error> {
101
101
  let c_text_chunk = c_html
102
- .define_class("TextChunk", Default::default())
103
- .expect("cannot find class Selma::HTML::TextChunk");
102
+ .define_class("TextChunk", magnus::class::object())
103
+ .expect("cannot define class Selma::HTML::TextChunk");
104
104
 
105
105
  c_text_chunk.define_method("to_s", method!(SelmaHTMLTextChunk::to_s, 0))?;
106
106
  c_text_chunk.define_method("content", method!(SelmaHTMLTextChunk::to_s, 0))?;
@@ -5,7 +5,9 @@ use magnus::{Error, Module, RModule};
5
5
  pub(crate) struct SelmaHTML {}
6
6
 
7
7
  pub fn init(m_selma: RModule) -> Result<(), Error> {
8
- let c_html = m_selma.define_class("HTML", Default::default()).unwrap();
8
+ let c_html = m_selma
9
+ .define_class("HTML", magnus::class::object())
10
+ .expect("cannot define class Selma::HTML");
9
11
 
10
12
  element::init(c_html).expect("cannot define Selma::HTML::Element class");
11
13
  end_tag::init(c_html).expect("cannot define Selma::HTML::EndTag class");
data/ext/selma/src/lib.rs CHANGED
@@ -9,7 +9,6 @@ pub mod rewriter;
9
9
  pub mod sanitizer;
10
10
  pub mod selector;
11
11
  pub mod tags;
12
- pub mod wrapped_struct;
13
12
 
14
13
  #[allow(clippy::let_unit_value)]
15
14
  fn scan_text_args(args: &[Value]) -> Result<(String, ContentType), magnus::Error> {
@@ -3,7 +3,12 @@ use lol_html::{
3
3
  html_content::{Element, TextChunk},
4
4
  text, DocumentContentHandlers, ElementContentHandlers, HtmlRewriter, Selector, Settings,
5
5
  };
6
- use magnus::{exception, function, method, scan_args, Module, Object, RArray, RModule, Value};
6
+ use magnus::{
7
+ exception, function, method, scan_args,
8
+ typed_data::Obj,
9
+ value::{Opaque, ReprValue},
10
+ Module, Object, RArray, RModule, Ruby, Value,
11
+ };
7
12
 
8
13
  use std::{borrow::Cow, cell::RefCell, primitive::str, rc::Rc};
9
14
 
@@ -12,31 +17,30 @@ use crate::{
12
17
  sanitizer::SelmaSanitizer,
13
18
  selector::SelmaSelector,
14
19
  tags::Tag,
15
- wrapped_struct::WrappedStruct,
16
20
  };
17
21
 
18
- #[derive(Clone, Debug)]
22
+ #[derive(Clone)]
19
23
  pub struct Handler {
20
- rb_handler: Value,
21
- rb_selector: WrappedStruct<SelmaSelector>,
22
-
23
- total_element_handler_calls: usize,
24
- total_elapsed_element_handlers: f64,
24
+ rb_handler: Opaque<Value>,
25
+ rb_selector: Opaque<Obj<SelmaSelector>>,
26
+ // total_element_handler_calls: usize,
27
+ // total_elapsed_element_handlers: f64,
25
28
 
26
- total_text_handler_calls: usize,
27
- total_elapsed_text_handlers: f64,
29
+ // total_text_handler_calls: usize,
30
+ // total_elapsed_text_handlers: f64,
28
31
  }
29
32
 
30
33
  pub struct Rewriter {
31
34
  sanitizer: Option<SelmaSanitizer>,
32
35
  handlers: Vec<Handler>,
33
-
34
- total_elapsed: f64,
36
+ // total_elapsed: f64,
35
37
  }
36
38
 
37
39
  #[magnus::wrap(class = "Selma::Rewriter")]
38
40
  pub struct SelmaRewriter(std::cell::RefCell<Rewriter>);
39
41
 
42
+ type RewriterValues = (Option<Option<Obj<SelmaSanitizer>>>, Option<RArray>);
43
+
40
44
  impl SelmaRewriter {
41
45
  const SELMA_ON_END_TAG: &str = "on_end_tag";
42
46
  const SELMA_HANDLE_ELEMENT: &str = "handle_element";
@@ -53,15 +57,15 @@ impl SelmaRewriter {
53
57
  let sanitizer = match rb_sanitizer {
54
58
  None => {
55
59
  let default_sanitizer = SelmaSanitizer::new(&[])?;
56
- let wrapped_sanitizer = WrappedStruct::from(default_sanitizer);
60
+ let wrapped_sanitizer = Obj::wrap(default_sanitizer);
57
61
  wrapped_sanitizer.funcall::<&str, (), Value>("setup", ())?;
58
- Some(wrapped_sanitizer.get().unwrap().to_owned())
62
+ Some(wrapped_sanitizer.get().to_owned())
59
63
  }
60
64
  Some(sanitizer_value) => match sanitizer_value {
61
65
  None => None,
62
66
  Some(sanitizer) => {
63
67
  sanitizer.funcall::<&str, (), Value>("setup", ())?;
64
- Some(sanitizer.get().unwrap().to_owned())
68
+ Some(sanitizer.get().to_owned())
65
69
  }
66
70
  },
67
71
  };
@@ -86,24 +90,23 @@ impl SelmaRewriter {
86
90
  ));
87
91
  }
88
92
 
89
- let rb_selector: WrappedStruct<SelmaSelector> =
90
- match rb_handler.funcall("selector", ()) {
91
- Err(err) => {
92
- return Err(magnus::Error::new(
93
- exception::type_error(),
94
- format!("Error instantiating selector: {err:?}"),
95
- ));
96
- }
97
- Ok(rb_selector) => rb_selector,
98
- };
93
+ let rb_selector: Obj<SelmaSelector> = match rb_handler.funcall("selector", ()) {
94
+ Err(err) => {
95
+ return Err(magnus::Error::new(
96
+ exception::type_error(),
97
+ format!("Error instantiating selector: {err:?}"),
98
+ ));
99
+ }
100
+ Ok(rb_selector) => rb_selector,
101
+ };
99
102
  let handler = Handler {
100
- rb_handler,
101
- rb_selector,
102
- total_element_handler_calls: 0,
103
- total_elapsed_element_handlers: 0.0,
103
+ rb_handler: Opaque::from(rb_handler),
104
+ rb_selector: Opaque::from(rb_selector),
105
+ // total_element_handler_calls: 0,
106
+ // total_elapsed_element_handlers: 0.0,
104
107
 
105
- total_text_handler_calls: 0,
106
- total_elapsed_text_handlers: 0.0,
108
+ // total_text_handler_calls: 0,
109
+ // total_elapsed_text_handlers: 0.0,
107
110
  };
108
111
  handlers.push(handler);
109
112
  }
@@ -121,20 +124,12 @@ impl SelmaRewriter {
121
124
  Ok(Self(std::cell::RefCell::new(Rewriter {
122
125
  sanitizer,
123
126
  handlers,
124
- total_elapsed: 0.0,
127
+ // total_elapsed: 0.0,
125
128
  })))
126
129
  }
127
130
 
128
131
  #[allow(clippy::let_unit_value)]
129
- fn scan_parse_args(
130
- args: &[Value],
131
- ) -> Result<
132
- (
133
- Option<Option<WrappedStruct<SelmaSanitizer>>>,
134
- Option<RArray>,
135
- ),
136
- magnus::Error,
137
- > {
132
+ fn scan_parse_args(args: &[Value]) -> Result<RewriterValues, magnus::Error> {
138
133
  let args = scan_args::scan_args(args)?;
139
134
  let _: () = args.required;
140
135
  let _: () = args.optional;
@@ -145,10 +140,7 @@ impl SelmaRewriter {
145
140
  let kwargs = scan_args::get_kwargs::<
146
141
  _,
147
142
  (),
148
- (
149
- Option<Option<WrappedStruct<SelmaSanitizer>>>,
150
- Option<RArray>,
151
- ),
143
+ (Option<Option<Obj<SelmaSanitizer>>>, Option<RArray>),
152
144
  (),
153
145
  >(args.keywords, &[], &["sanitizer", "handlers"])?;
154
146
  let (rb_sanitizer, rb_handlers) = kwargs.optional;
@@ -270,7 +262,9 @@ impl SelmaRewriter {
270
262
  handlers.iter().for_each(|handler| {
271
263
  let element_stack: Rc<RefCell<Vec<String>>> = Rc::new(RefCell::new(vec![]));
272
264
 
273
- let selector = handler.rb_selector.get_static().unwrap();
265
+ let ruby = Ruby::get().unwrap();
266
+
267
+ let selector = ruby.get_inner(handler.rb_selector);
274
268
 
275
269
  // TODO: test final raise by simulating errors
276
270
  if selector.match_element().is_some() {
@@ -280,7 +274,7 @@ impl SelmaRewriter {
280
274
  selector.match_element().unwrap(),
281
275
  move |el| {
282
276
  match Self::process_element_handlers(
283
- handler.rb_handler,
277
+ ruby.get_inner(handler.rb_handler),
284
278
  el,
285
279
  &closure_element_stack.borrow(),
286
280
  ) {
@@ -311,7 +305,9 @@ impl SelmaRewriter {
311
305
  }
312
306
  }
313
307
 
314
- match Self::process_text_handlers(handler.rb_handler, text) {
308
+ let ruby = Ruby::get().unwrap();
309
+ match Self::process_text_handlers(ruby.get_inner(handler.rb_handler), text)
310
+ {
315
311
  Ok(_) => Ok(()),
316
312
  Err(err) => Err(err.to_string().into()),
317
313
  }
@@ -421,8 +417,8 @@ impl SelmaRewriter {
421
417
 
422
418
  pub fn init(m_selma: RModule) -> Result<(), magnus::Error> {
423
419
  let c_rewriter = m_selma
424
- .define_class("Rewriter", Default::default())
425
- .expect("cannot find class Selma::Rewriter");
420
+ .define_class("Rewriter", magnus::class::object())
421
+ .expect("cannot define class Selma::Rewriter");
426
422
 
427
423
  c_rewriter.define_singleton_method("new", function!(SelmaRewriter::new, -1))?;
428
424
  c_rewriter
@@ -4,9 +4,13 @@ use lol_html::{
4
4
  errors::AttributeNameError,
5
5
  html_content::{Comment, ContentType, Doctype, Element, EndTag},
6
6
  };
7
- use magnus::{class, function, method, scan_args, Module, Object, RArray, RHash, RModule, Value};
7
+ use magnus::{
8
+ class, function, method, scan_args,
9
+ value::{Opaque, ReprValue},
10
+ Module, Object, RArray, RHash, RModule, Ruby, Value,
11
+ };
8
12
 
9
- #[derive(Clone, Debug)]
13
+ #[derive(Clone, Debug, Default)]
10
14
  struct ElementSanitizer {
11
15
  allowed_attrs: Vec<String>,
12
16
  required_attrs: Vec<String>,
@@ -14,19 +18,7 @@ struct ElementSanitizer {
14
18
  protocol_sanitizers: HashMap<String, Vec<String>>,
15
19
  }
16
20
 
17
- impl Default for ElementSanitizer {
18
- fn default() -> Self {
19
- ElementSanitizer {
20
- allowed_attrs: vec![],
21
- allowed_classes: vec![],
22
- required_attrs: vec![],
23
-
24
- protocol_sanitizers: HashMap::new(),
25
- }
26
- }
27
- }
28
-
29
- #[derive(Clone, Debug)]
21
+ #[derive(Clone)]
30
22
  pub struct Sanitizer {
31
23
  flags: [u8; crate::tags::Tag::TAG_COUNT],
32
24
  allowed_attrs: Vec<String>,
@@ -36,10 +28,10 @@ pub struct Sanitizer {
36
28
  pub escape_tagfilter: bool,
37
29
  pub allow_comments: bool,
38
30
  pub allow_doctype: bool,
39
- config: RHash,
31
+ config: Opaque<RHash>,
40
32
  }
41
33
 
42
- #[derive(Clone, Debug)]
34
+ #[derive(Clone)]
43
35
  #[magnus::wrap(class = "Selma::Sanitizer")]
44
36
  pub struct SelmaSanitizer(std::cell::RefCell<Sanitizer>);
45
37
 
@@ -77,14 +69,15 @@ impl SelmaSanitizer {
77
69
  escape_tagfilter: true,
78
70
  allow_comments: false,
79
71
  allow_doctype: true,
80
- config,
72
+ config: config.into(),
81
73
  })))
82
74
  }
83
75
 
84
76
  fn get_config(&self) -> Result<RHash, magnus::Error> {
85
77
  let binding = self.0.borrow();
78
+ let ruby = Ruby::get().unwrap();
86
79
 
87
- Ok(binding.config)
80
+ Ok(ruby.get_inner(binding.config))
88
81
  }
89
82
 
90
83
  /// Toggle a sanitizer option on or off.
@@ -308,9 +301,9 @@ impl SelmaSanitizer {
308
301
  let mut buf = String::new();
309
302
  // ...then, escape any special characters, for security
310
303
  if attr_name == "href" {
311
- escapist::escape_href(&mut buf, unescaped_attr_val.as_str());
304
+ escapist::escape_href(&mut buf, unescaped_attr_val.as_str()).unwrap();
312
305
  } else {
313
- escapist::escape_html(&mut buf, unescaped_attr_val.as_str());
306
+ escapist::escape_html(&mut buf, unescaped_attr_val.as_str()).unwrap();
314
307
  };
315
308
 
316
309
  match element.set_attribute(attr_name, &buf) {
@@ -554,7 +547,9 @@ impl SelmaSanitizer {
554
547
  }
555
548
 
556
549
  pub fn init(m_selma: RModule) -> Result<(), magnus::Error> {
557
- let c_sanitizer = m_selma.define_class("Sanitizer", Default::default())?;
550
+ let c_sanitizer = m_selma
551
+ .define_class("Sanitizer", magnus::class::object())
552
+ .expect("cannot define class Selma::Sanitizer");
558
553
 
559
554
  c_sanitizer.define_singleton_method("new", function!(SelmaSanitizer::new, -1))?;
560
555
  c_sanitizer.define_method("config", method!(SelmaSanitizer::get_config, 0))?;
@@ -8,6 +8,8 @@ pub struct SelmaSelector {
8
8
  ignore_text_within: Option<Vec<String>>,
9
9
  }
10
10
 
11
+ type SelectorMatches = (Option<String>, Option<String>, Option<Vec<String>>);
12
+
11
13
  impl SelmaSelector {
12
14
  fn new(args: &[Value]) -> Result<Self, Error> {
13
15
  let (match_element, match_text_within, rb_ignore_text_within) =
@@ -63,9 +65,7 @@ impl SelmaSelector {
63
65
  }
64
66
 
65
67
  #[allow(clippy::let_unit_value)]
66
- fn scan_parse_args(
67
- args: &[Value],
68
- ) -> Result<(Option<String>, Option<String>, Option<Vec<String>>), Error> {
68
+ fn scan_parse_args(args: &[Value]) -> Result<SelectorMatches, Error> {
69
69
  let args = scan_args::scan_args(args)?;
70
70
  let _: () = args.required;
71
71
  let _: () = args.optional;
@@ -103,7 +103,7 @@ impl SelmaSelector {
103
103
 
104
104
  pub fn init(m_selma: RModule) -> Result<(), Error> {
105
105
  let c_selector = m_selma
106
- .define_class("Selector", Default::default())
106
+ .define_class("Selector", magnus::class::object())
107
107
  .expect("cannot define class Selma::Selector");
108
108
 
109
109
  c_selector.define_singleton_method("new", function!(SelmaSelector::new, -1))?;
data/lib/selma/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Selma
4
- VERSION = "0.1.6"
4
+ VERSION = "0.2.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: selma
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Garen J. Torikian
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-06-05 00:00:00.000000000 Z
11
+ date: 2023-10-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rb_sys
@@ -76,7 +76,6 @@ files:
76
76
  - ext/selma/src/sanitizer.rs
77
77
  - ext/selma/src/selector.rs
78
78
  - ext/selma/src/tags.rs
79
- - ext/selma/src/wrapped_struct.rs
80
79
  - lib/selma.rb
81
80
  - lib/selma/extension.rb
82
81
  - lib/selma/html.rb
@@ -112,7 +111,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
112
111
  - !ruby/object:Gem::Version
113
112
  version: 3.3.22
114
113
  requirements: []
115
- rubygems_version: 3.4.13
114
+ rubygems_version: 3.4.20
116
115
  signing_key:
117
116
  specification_version: 4
118
117
  summary: Selma selects and matches HTML nodes using CSS rules. Backed by Rust's lol_html
@@ -1,92 +0,0 @@
1
- use magnus::{error::Error, exception, gc, value::Value, RTypedData, TryConvert, TypedData};
2
- use std::{marker::PhantomData, ops::Deref};
3
-
4
- // NOTE: My Rust isn't good enough to know what any of this does,
5
- // but it was taken from https://cs.github.com/bytecodealliance/wasmtime-rb/blob/a843e4b4582a945f2c881b8bd3e2b87688ab5509/ext/src/helpers/wrapped_struct.rs#L4
6
-
7
- /// A small wrapper for `RTypedData` that keeps track of the concrete struct
8
- /// type, and the underlying [`Value`] for GC purposes.
9
- #[derive(Debug)]
10
- #[repr(transparent)]
11
- pub struct WrappedStruct<T: TypedData> {
12
- inner: RTypedData,
13
- phantom: PhantomData<T>,
14
- }
15
-
16
- impl<T: TypedData> Clone for WrappedStruct<T> {
17
- fn clone(&self) -> Self {
18
- Self {
19
- inner: self.inner,
20
- phantom: PhantomData,
21
- }
22
- }
23
- }
24
- impl<T: TypedData> Copy for WrappedStruct<T> {}
25
-
26
- impl<T: TypedData> WrappedStruct<T> {
27
- /// Gets the underlying struct.
28
- pub fn get(&self) -> Result<&T, Error> {
29
- self.inner.try_convert()
30
- }
31
-
32
- /// Gets the underlying struct with a `'static` lifetime.
33
- pub fn get_static(&self) -> Result<&'static T, Error> {
34
- self.inner.try_convert()
35
- }
36
-
37
- /// Get the Ruby [`Value`] for this struct.
38
- pub fn to_value(self) -> Value {
39
- self.inner.into()
40
- }
41
-
42
- /// Marks the Ruby [`Value`] for GC.
43
- pub fn mark(&self) {
44
- gc::mark(&self.inner.into());
45
- }
46
- }
47
-
48
- impl<T: TypedData> From<WrappedStruct<T>> for Value {
49
- fn from(wrapped_struct: WrappedStruct<T>) -> Self {
50
- wrapped_struct.to_value()
51
- }
52
- }
53
-
54
- impl<T: TypedData> Deref for WrappedStruct<T> {
55
- type Target = RTypedData;
56
-
57
- fn deref(&self) -> &Self::Target {
58
- &self.inner
59
- }
60
- }
61
-
62
- impl<T: TypedData> From<T> for WrappedStruct<T> {
63
- fn from(t: T) -> Self {
64
- Self {
65
- inner: RTypedData::wrap(t),
66
- phantom: PhantomData,
67
- }
68
- }
69
- }
70
-
71
- impl<T> TryConvert for WrappedStruct<T>
72
- where
73
- T: TypedData,
74
- {
75
- fn try_convert(val: Value) -> Result<Self, Error> {
76
- let inner = RTypedData::from_value(val).ok_or_else(|| {
77
- Error::new(
78
- exception::type_error(),
79
- format!(
80
- "no implicit conversion of {} into {}",
81
- unsafe { val.classname() },
82
- T::class()
83
- ),
84
- )
85
- })?;
86
-
87
- Ok(Self {
88
- inner,
89
- phantom: PhantomData,
90
- })
91
- }
92
- }