This commit is contained in:
iska
2018-07-16 21:44:56 +02:00
parent c13abcb833
commit 8038ec9654
18 changed files with 211 additions and 34 deletions
@@ -0,0 +1,29 @@
import HTMLKit
HTMLSanitizingPolicy { (builder) in
builder
.allowCommonBlockElements()
.allowCommonInlineFormattingElements()
.allowElements(["p", "div"])
.allow(HTMLElementPolicy.identity(), onElements: ["b", "p"])
.allow(HTMLAttributePolicy.init(), onElements: [])
.disallowText(inElements: ["a"])
}
HTMLElementPolicy { (str) -> String in
return str
}
HTMLSanitizer { (builder) in
builder
.allowCommonBlockElements()
.allowCommonInlineFormattingElements()
.allowElements(["p", "div"])
.allow(HTMLElementPolicy.identity() , onElements: ["b", "p"])
.allow(HTMLAttributePolicy.init(), onElements: [])
.disallowText(inElements: ["a"])
}
+2 -1
View File
@@ -1,10 +1,11 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<playground version='6.0' target-platform='macos' display-mode='rendered' last-migration='0800'>
<playground version='6.0' target-platform='macos' display-mode='raw' last-migration='0800'>
<pages>
<page name='Intro'/>
<page name='Parsing Documents'/>
<page name='Parsing Fragments'/>
<page name='The DOM'/>
<page name='CSS Selectors'/>
<page name='Sanitizing HTML'/>
</pages>
</playground>
+8
View File
@@ -7,7 +7,15 @@
//
#import <Foundation/Foundation.h>
#import "HTMLSanitizingPolicyBuilder.h"
#import "HTMLSanitizingPolicy.h"
NS_ASSUME_NONNULL_BEGIN
@interface HTMLSanitizer : NSObject
+ (instancetype)sanitizerWithPolicy:(void (^)(HTMLSanitizingPolicyBuilder *))block;
@end
NS_ASSUME_NONNULL_END
+32
View File
@@ -7,7 +7,39 @@
//
#import "HTMLSanitizer.h"
#import "HTMLTokenizer.h"
#import "HTMLTokens.h"
@interface HTMLSanitizer()
{
HTMLTokenizer *_tokenizer;
}
@end
@implementation HTMLSanitizer
+ (instancetype)sanitizerWithPolicy:(void (^)(HTMLSanitizingPolicyBuilder *))block
{
HTMLSanitizingPolicyBuilder *builder = [HTMLSanitizingPolicyBuilder new];
block(builder);
return nil; //[[HTMLSanitizingPolicy alloc] initWithBuilder:builder];
}
- (instancetype)initWithString:(NSString *)string
{
self = [super init];
if (self) {
_tokenizer = [[HTMLTokenizer alloc] initWithString:string ?: @""];
}
return self;
}
- (void)sanitize
{
// for (HTMLToken *token in _tokenizer) {
//
// }
}
@end
+7
View File
@@ -8,6 +8,13 @@
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface HTMLSanitizingPolicy : NSObject
- (HTMLSanitizingPolicy *)combineWith:(nullable HTMLSanitizingPolicy *)other;
@end
NS_ASSUME_NONNULL_END
+23
View File
@@ -8,6 +8,29 @@
#import "HTMLSanitizingPolicy.h"
@interface HTMLSanitizingPolicy()
{
NSMutableArray *_policies;
}
@end
@implementation HTMLSanitizingPolicy
- (instancetype)init
{
self = [super init];
if (self) {
_policies = [NSMutableArray new];
}
return self;
}
- (HTMLSanitizingPolicy *)combineWith:(HTMLSanitizingPolicy *)other
{
if (other) {
[_policies addObject:other];
}
return self;
}
@end
+26
View File
@@ -8,6 +8,32 @@
#import <Foundation/Foundation.h>
#import "HTMLElementPolicy.h"
#import "HTMLTokenPolicy.h"
#import "HTMLAttributePolicy.h"
NS_ASSUME_NONNULL_BEGIN
@interface HTMLSanitizingPolicyBuilder : NSObject
- (HTMLSanitizingPolicyBuilder *)allowElements:(NSArray<NSString *> *)elementNames;
- (HTMLSanitizingPolicyBuilder *)disallowElements:(NSArray<NSString *> *)elementNames;
- (HTMLSanitizingPolicyBuilder *)allowPolicy:(HTMLElementPolicy *)policy onElements:(NSArray<NSString *> *)elementNames;
- (HTMLSanitizingPolicyBuilder *)allowCommonInlineFormattingElements;
- (HTMLSanitizingPolicyBuilder *)allowCommonBlockElements;
- (HTMLSanitizingPolicyBuilder *)allowTextInElements:(NSArray<NSString *> *)elementNames;
- (HTMLSanitizingPolicyBuilder *)disallowTextInElements:(NSArray<NSString *> *)elementNames;
//- (HTMLSanitizingPolicyBuilder *)allowAttributes:(NSArray<NSString *> *)attributeName
// onElements:(NSArray<NSString *> *)elementNames;
//- (HTMLSanitizingPolicyBuilder *)disallowAttributes:(NSArray<NSString *> *)attributeName
// onElements:(NSArray<NSString *> *)elementNames;
//
//- (HTMLSanitizingPolicyBuilder *)allowAttributePolicy:(HTMLAttributePolicy *)policy
// onElements:(NSArray<NSString *> *)elementNames;
//- (HTMLSanitizingPolicyBuilder *)disallowAttributePolicy:(HTMLAttributePolicy *)policy
// onElements:(NSArray<NSString *> *)elementNames;
@end
NS_ASSUME_NONNULL_END
+81
View File
@@ -8,6 +8,87 @@
#import "HTMLSanitizingPolicyBuilder.h"
@interface HTMLSanitizingPolicyBuilder()
{
NSMutableDictionary<NSString *, NSMutableArray<HTMLElementPolicy *> *> * elementPolicies;
NSMutableDictionary<NSString *, HTMLAttributePolicy *> * attributePolicies;
NSMutableDictionary<NSString *, NSNumber *> * textContainers;
}
@end
@implementation HTMLSanitizingPolicyBuilder
- (HTMLSanitizingPolicyBuilder *)allowElements:(NSArray<NSString *> *)elementNames
{
return [self allowPolicy:HTMLElementPolicy.identity onElements:elementNames];
}
- (HTMLSanitizingPolicyBuilder *)disallowElements:(NSArray<NSString *> *)elementNames
{
return [self allowPolicy:HTMLElementPolicy.rejectAll onElements:elementNames];
}
- (HTMLSanitizingPolicyBuilder *)allowPolicy:(HTMLElementPolicy *)policy onElements:(NSArray<NSString *> *)elementNames
{
for (NSString *name in elementNames) {
NSMutableArray<HTMLElementPolicy *> *list = elementPolicies[name];
if (list == nil) {
list = [NSMutableArray new];
}
[list addObject:policy];
elementPolicies[name] = list;
}
return self;
}
- (HTMLSanitizingPolicyBuilder *)allowCommonInlineFormattingElements
{
return [self allowElements:@[@"b", @"i", @"font", @"s", @"u", @"o", @"sup", @"sub", @"ins", @"del",
@"strong", @"strike", @"tt", @"code", @"big", @"small", @"br", @"span", @"em"]];
}
- (HTMLSanitizingPolicyBuilder *)allowCommonBlockElements
{
return [self allowElements:@[@"p", @"div", @"h1", @"h2", @"h3", @"h4", @"h5", @"h6", @"ul", @"ol", @"li",
@"blockquote"]];
}
- (HTMLSanitizingPolicyBuilder *)allowTextInElements:(NSArray<NSString *> *)elementNames;
{
for (NSString *name in elementNames) {
textContainers[name] = @YES;
}
return self;
}
- (HTMLSanitizingPolicyBuilder *)disallowTextInElements:(NSArray<NSString *> *)elementNames
{
for (NSString *name in elementNames) {
textContainers[name] = @NO;
}
return self;
}
//- (HTMLSanitizingPolicyBuilder *)allowAttributes:(NSArray<NSString *> *)attributeNames
// onElements:(NSArray<NSString *> *)elementNames
//{
// for (NSString *attribute in attributeNames) {
// [self allowAttributePolicy:HTMLAttributePolicy.identity onElements:elementNames];
// }
// return self;
//}
//
//- (HTMLSanitizingPolicyBuilder *)disallowAttributes:(NSArray<NSString *> *)attributeName
// onElements:(NSArray<NSString *> *)elementNames;
//
//- (HTMLSanitizingPolicyBuilder *)allowAttributePolicy:(HTMLAttributePolicy *)policy onElements:(NSArray<NSString *> *)elementNames
//{
// return self;
//}
//
//- (HTMLSanitizingPolicyBuilder *)disallowAttributePolicy:(HTMLAttributePolicy *)policy onElements:(NSArray<NSString *> *)elementNames
//{
// return self;
//}
@end
+1 -1
View File
@@ -13,7 +13,7 @@ NS_ASSUME_NONNULL_BEGIN
@interface HTMLTokenPolicy : NSObject
+ (instancetype)policy:(nullable HTMLToken * (^)(HTMLToken *))block;
+ (instancetype)policy:(HTMLToken * _Nullable (^)(HTMLToken *))block;
- (nullable HTMLToken *)apply:(HTMLToken *)token;
-4
View File
@@ -6,10 +6,6 @@
// Copyright (c) 2014 BrainCookie. All rights reserved.
//
///------------------------------------------------------
/// HTMLKit private header
///------------------------------------------------------
#import <Foundation/Foundation.h>
#import "HTMLToken.h"
-4
View File
@@ -6,10 +6,6 @@
// Copyright (c) 2014 BrainCookie. All rights reserved.
//
///------------------------------------------------------
/// HTMLKit private header
///------------------------------------------------------
#import <Foundation/Foundation.h>
#import "HTMLToken.h"
-4
View File
@@ -6,10 +6,6 @@
// Copyright (c) 2014 BrainCookie. All rights reserved.
//
///------------------------------------------------------
/// HTMLKit private header
///------------------------------------------------------
#import <Foundation/Foundation.h>
#import "HTMLToken.h"
-4
View File
@@ -6,10 +6,6 @@
// Copyright (c) 2015 BrainCookie. All rights reserved.
//
///------------------------------------------------------
/// HTMLKit private header
///------------------------------------------------------
#import "HTMLToken.h"
/**
+2
View File
@@ -16,6 +16,8 @@ extern const unsigned char HTMLKitVersionString[];
#import "HTMLDOM.h"
#import "HTMLParser.h"
#import "HTMLSanitizer.h"
#import "HTMLKitErrorDomain.h"
#import "HTMLOrderedDictionary.h"
-4
View File
@@ -6,10 +6,6 @@
// Copyright (c) 2014 BrainCookie. All rights reserved.
//
///------------------------------------------------------
/// HTMLKit private header
///------------------------------------------------------
#import <Foundation/Foundation.h>
#import "HTMLToken.h"
-4
View File
@@ -6,10 +6,6 @@
// Copyright (c) 2014 BrainCookie. All rights reserved.
//
///------------------------------------------------------
/// HTMLKit private header
///------------------------------------------------------
#import <Foundation/Foundation.h>
#import "HTMLToken.h"
#import "HTMLOrderedDictionary.h"
-4
View File
@@ -6,10 +6,6 @@
// Copyright (c) 2014 BrainCookie. All rights reserved.
//
///------------------------------------------------------
/// HTMLKit private header
///------------------------------------------------------
#import <Foundation/Foundation.h>
@class HTMLDOCTYPEToken;
-4
View File
@@ -6,10 +6,6 @@
// Copyright (c) 2014 BrainCookie. All rights reserved.
//
///------------------------------------------------------
/// HTMLKit private header
///------------------------------------------------------
#import "HTMLToken.h"
#import "HTMLCharacterToken.h"
#import "HTMLCommentToken.h"