From f883b0d906bde8d3b4a577c2daec68d56a67e159 Mon Sep 17 00:00:00 2001 From: iska Date: Wed, 23 Dec 2015 21:32:18 +0100 Subject: [PATCH] Update README.md --- HTMLKit.png | Bin 0 -> 59739 bytes README.md | 209 +++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 207 insertions(+), 2 deletions(-) create mode 100644 HTMLKit.png diff --git a/HTMLKit.png b/HTMLKit.png new file mode 100644 index 0000000000000000000000000000000000000000..044260c24e5759287849f0cba5c5d18d0bd9c31a GIT binary patch literal 59739 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 Ns3>U4S3I{2{TC$CxO@Nr literal 0 HcmV?d00001 diff --git a/README.md b/README.md index fae2993..f69522e 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,215 @@ # HTMLKit -An Objective-C kit for your everyday HTML needs. +![HTMLKit Logo](HTMLKit.png) +An Objective-C framework for your everyday HTML needs. # Quick Overview -HTMLKit is a [WHATWG](https://html.spec.whatwg.org/multipage/) specification-compliant library for parsing and serializing HTML documents and document fragments for OSX and iOS. HTMLKit parses real-world HTML the same way modern web browsers would. +HTMLKit is a [WHATWG specification](https://html.spec.whatwg.org/multipage/)-compliant framework for parsing and serializing HTML documents and document fragments for iOS and OSX. HTMLKit parses real-world HTML the same way modern web browsers would. + +HTMLKit provides a rich DOM implementation for manipulating and navigating the document tree. It also understands [CSS3 selectors](http://www.w3.org/TR/css3-selectors/) making node-selection and querying the DOM a piece of cake. + +## DOM Validation + +DOM mutations are validated as described in the [WHATWG DOM Standard](https://dom.spec.whatwg.org). Invalid DOM manipulations throw hierarchy-related exceptions. You can disable these validations, which will also increase the performance by about 20-30%, by defining the `HTMLKIT_NO_DOM_CHECKS` compiler constant. + +## Tests + +HTMLKit passes all of the [HTML5Lib](https://github.com/html5lib/html5lib-tests) Tokenizer and Tree Construction tests except the Blink changes introduced on 16.09.2015. The `html5lib-tests` is configured as a git-submodule. If you plan to run the tests, do not forget to pull it too. + +The CSS3 Selector implementation is tested with the an adapted version of the [CSS3 Selectors Test Suite](http://www.w3.org/Style/CSS/Test/CSS3/Selectors/current/html/full/flat/index.html), ignoring the tests that require user interaction, session history, and scripting. + +## Does it Swift? + +Check out the playground! + +# Parsing Documents + +Given some HTML content, you can parse it either via the `HTMLParser` or instatiate a `HTMLDocument` directly: + +```objective-c +NSString *htmlString = @"

HTMLKit

Hello there!

"; + +// Via parser +HTMLParser *parser = [[HTMLParser alloc] initWithString:htmlString]; +HTMLDocument *document = [parser parseDocument]; + +// Via static initializer +HTMLDocument *document = [HTMLDocument documentWithString:htmlString]; +``` + +# Parsing Fragments + +You can also prase HTML content as a document fragment with a specified context element: + +```objective-c +NSString *htmlString = @"

HTMLKit

Hello there!

"; + +HTMLParser *parser = [[HTMLParser alloc] initWithString: htmlString]; + +HTMLElement *tableContext = [[HTMLElement alloc] initWithTagName:@"table"]; +NSArray *nodes = [parser parseFragmentWithContextElement:tableContext]; + +for (HTMLNode *node in nodes) { + NSLog(@"%@", node.outerHTML); +} + +// The same parser instance can be reusued: +HTMLElement *bodyContext = [[HTMLElement alloc] initWithTagName:@"body"]; +nodes = [parser parseFragmentWithContextElement:bodyContext]; +``` + +# The DOM + +Here are some of the things you can do: + +* Create new elements and assign attributes + +```objective-c +HTMLElement *description = [[HTMLElement alloc] initWithTagName:@"body" attributes: @{@"name": @"description"}]; +description[@"content"] = @"HTMLKit for iOS & OSX"; +``` + +* Append nodes to the document + +```objective-c +HTMLElement *head = document.head; +[head appendNode:description]; + +HTMLElement *body = document.body; +NSArray *nodes = @[ + [[HTMLElement alloc] initWithTagName:@"div" attributes: @{@"class": @"red"}], + [[HTMLElement alloc] initWithTagName:@"div" attributes: @{@"class": @"green"}], + [[HTMLElement alloc] initWithTagName:@"div" attributes: @{@"class": @"blue"}] +]; +[body appendNodes:nodes]; +``` + +* Enumerate child elements and perform DOM manipulation + +```objective-c +[body enumerateChildElementsUsingBlock:^(HTMLElement *element, NSUInteger idx, BOOL *stop) { + if ([element.tagName isEqualToString:@"div"]) { + HTMLElement *lorem = [[HTMLElement alloc] initWithTagName:@"p"]; + lorem.textContent = [NSString stringWithFormat:@"Lorem ipsum: %lu", (unsigned long)idx]; + [element appendNode:lorem]; + } +}]; +``` + +* Remove nodes from the document + +```objective-c +[body removeChildNodeAtIndex:1]; +[head removeAllChildNodes]; +[body.lastChild removeFromParentNode]; +``` + +* Navigate to child and sibling nodes + +```objective-c +HTMLNode *firstChild = body.firstChild; +HTMLNode *greenDiv = firstChild.nextSibling; +``` + +* Manipulate the HTML directly + +```objective-c +greenDiv.innerHTML = @"
  • item 1
  • item 2"; +``` + +* Iterate the DOM tree with custom filters + +```objective-c +HTMLNodeFilterBlock *filter =[HTMLNodeFilterBlock filterWithBlock:^ HTMLNodeFilterValue (HTMLNode *node) { + if (node.childNodesCount != 1) { + return HTMLNodeFilterReject; + } + return HTMLNodeFilterAccept; +}]; + +for (HTMLElement *element in [body nodeIteratorWithShowOptions:HTMLNodeFilterShowElement filter:filter]) { + NSLog(@"%@", element.outerHTML); +} +``` + +# CSS3 Selectors + +All CSS3 Selectors are supported except for the pseudo-elements (`::first-line`, `::first-letter`, ...etc.). You can use them the way you always have: + +```objective-c +// Given the document: +NSString *htmlString = @"

    HTMLKit

    Hello there!

    This is a demo of HTMLKit

    "; +HTMLDocument *document = [HTMLDocument documentWithString: htmlString]; + +// Here are some of the supported selectors +NSArray *paragraphs = [document querySelectorAll:@"p"]; +NSArray *paragraphsOrHeaders = [document querySelectorAll:@"p, h1"]; +NSArray *hasClassAttribute = [document querySelectorAll:@"[class]"]; +NSArray *greetings = [document querySelectorAll:@".greeting"]; +NSArray *classNameStartsWith_de = [document querySelectorAll:@"[class^='de']"]; + +NSArray *hasAdjacentHeader = [document querySelectorAll:@"h1 + *"]; +NSArray *hasSiblingHeader = [document querySelectorAll:@"h1 ~ *"]; +NSArray *hasSiblingParagraph = [document querySelectorAll:@"p ~ *"]; + +NSArray *nonParagraphChildOfDiv = [document querySelectorAll:@"div :not(p)"]; +``` + +HTMLKit also provides API to create selector instances in a type-safe manner without the need to parse them first. The previous examples would like this: + +```objective-c +NSArray *paragraphs = [document elementsMatchingSelector:typeSelector(@"p")]; +NSArray *paragraphsOrHeaders = [document elementsMatchingSelector: + anyOf(@[ + typeSelector(@"p"), typeSelector(@"h1") + ]) +]; + +NSArray *hasClassAttribute = [document elementsMatchingSelector:hasAttributeSelector(@"class")]; +NSArray *greetings = [document elementsMatchingSelector:classSelector(@"greeting")]; +NSArray *classNameStartsWith_de = [document elementsMatchingSelector:attributeSelector(CSSAttributeSelectorBegins, @"class", @"de")]; + +NSArray *hasAdjacentHeader = [document elementsMatchingSelector:adjacentSiblingSelector(typeSelector(@"h1"))]; +NSArray *hasSiblingHeader = [document elementsMatchingSelector:generalSiblingSelector(typeSelector(@"h1"))]; +NSArray *hasSiblingParagraph = [document elementsMatchingSelector:generalSiblingSelector(typeSelector(@"p"))]; + +NSArray *nonParagraphChildOfDiv = [document elementsMatchingSelector: + allOf(@[ + childOfElementSelector(typeSelector(@"div")), + nay(typeSelector(@"p")) + ]) +]; +``` + +Here are more examples: + +```objective-c +HTMLNode *firstDivElement = [document firstElementMatchingSelector:typeSelector(@"div")]; + +var secondChildOfDiv = [firstDivElement querySelectorAll:@":nth-child(2)"]; +var secondOfType = [firstDivElement querySelectorAll:@":nth-of-type(2n)"]; + +secondChildOfDiv = [firstDivElement elementsMatchingSelector:nthChildSelector(CSSNthExpressionMake(0, 2))]; +secondOfType = [firstDivElement elementsMatchingSelector:nthOfTypeSelector(CSSNthExpressionMake(2, 0))]; + +var notParagraphAndNotDiv = [firstDivElement querySelectorAll:@":not(p):not(div)"]; +notParagraphAndNotDiv = [firstDivElement elementsMatchingSelector: + allOf([ + nay(typeSelector(@"p")), + nay(typeSelector(@"div")) + ]) +]; +``` + +One more thing! You can also create your own selectors. You either subclass the CSSSelector or just use the block-based wrapper. For example the previous selector can be implemented like this: + +```objective-c +CSSSelector *myAwesomeSelector = namedBlockSelector(@"myAwesomeSelector", ^BOOL (HTMLElement *element) { + return ![element.tagName isEqualToString:@"p"] && ![element.tagName isEqualToString:@"div"]; +}); +notParagraphAndNotDiv = [firstDivElement elementsMatchingSelector:myAwesomeSelector]; +``` # License