filesbox/app/filesbox_ios/FilesBox/Pods/SVGKit/Source/Parsers/SVGKParser.h
2023-09-21 10:53:23 +08:00

123 lines
4.1 KiB
Objective-C

/**
SVGKParser.h
The main parser for SVGKit. All the magic starts here. Either use:
A: +parseSourceUsingDefaultSVGKParser
...or use:
B: 1. -initWithSource:
B: 2. -addDefaultSVGParserExtensions
B: ...
B: 3. (as many times as you need) -addParserExtension:
B: ...
B: 4. -parseSynchronously
Note that "A" above does ALL the steps in B for you. If you need a custom set of Parser Extensions, you'll need to
do all the steps in B yourself
PARSING
---
Actual parsing of an SVG is split into three places:
1. High level, XML parsing: this file (SVGKParser)
2. Mid level, parsing the structure of a document, and special XML tags: any class that extends "SVGKParserExtension"
3. Mid level, parsing SVG tags only: SVGKParserSVG (it's an extension that just does base SVG)
4. Low level, parsing individual tags within a file, and precise co-ordinates: all the "SVG...Element" classes parse themselves
IDEALLY, we'd like to change that to:
1. High level, XML parsing: this file (SVGKParser)
2. Mid level, parsing the structure of a document, and special XML tags: any class that extends "SVGKParserExtension"
3. Mid level, parsing SVG tags only, but also handling all the different tags: SVGKParserSVG
4. Lowest level, parsing co-ordinate lists, numbers, strings: yacc/lex parser (in an unnamed class that hasn't been written yet)
*/
#import <Foundation/Foundation.h>
#import "SVGKSource.h"
#import "SVGKParserExtension.h"
#import "SVGKParseResult.h"
#import "SVGElement.h"
/*! RECOMMENDED: leave this set to 1 to get warnings about "legal, but poorly written" SVG */
#define PARSER_WARN_FOR_ANONYMOUS_SVG_G_TAGS 1
/*! Verbose parser logging - ONLY needed if you have an SVG file that's failing to load / crashing */
#define DEBUG_VERBOSE_LOG_EVERY_TAG 0
#define DEBUG_XML_PARSER 0
@interface SVGKParser : NSObject {
@private
NSMutableString *_storedChars;
//NSMutableArray *_elementStack;
NSMutableArray * _stackOfParserExtensions;
Node * _parentOfCurrentNode;
}
@property(nonatomic,strong,readonly) SVGKSource* source;
@property(nonatomic,strong,readonly) NSMutableArray* externalStylesheets;
@property(nonatomic,strong,readonly) SVGKParseResult* currentParseRun;
@property(nonatomic,strong) NSMutableArray* parserExtensions;
@property(nonatomic,strong) NSMutableDictionary* parserKnownNamespaces; /**< maps "uri" to "array of parser-extensions" */
#pragma mark - NEW
/**
If you kept the SVGKParser instance when you started a parse, you can
hand that instance to another thread and the OTHER thread can trigger
a cancel.
It is not instantaneous, but kicks in as soon as more data is read from
the raw bytes-stream, so it's pretty quick
*/
+(void) cancelParser:(SVGKParser*) parserToCancel;
/**
Creates an SVGKParser, and adds the "standard" extensions for parsing
a standard SVG file; you can then add any of your own custom extensions
before triggering the parse with e.g. "parseSynchronously"
*/
+(SVGKParser *) newParserWithDefaultSVGKParserExtensions:(SVGKSource *)source;
/**
Delegates to [self newParserWithDefaultSVGKParserExtensions:], and then auto-starts
the parse SYNCHRONOUSLY (may take anything from 0.001 seconds up to 30+ seconds
for a huge SVG file).
Returns the fully-parsed result, including any errors
*/
+ (SVGKParseResult*) parseSourceUsingDefaultSVGKParser:(SVGKSource*) source;
/**
This MIGHT now be safe to call multiple times on different threads
(NB: the only reason it wasn't safe before was major bugs in libxml
that break libxml in horrible ways, see the source code to this class
for more info)
*/
- (SVGKParseResult*) parseSynchronously;
+(NSDictionary *) NSDictionaryFromCSSAttributes: (Attr*) styleAttribute;
#pragma mark - OLD - POTENTIALLY DELETE THESE ONCE THEY'VE ALL BEEN CHECKED AND CONVERTED
- (id)initWithSource:(SVGKSource *)doc;
/*! Adds the default SVG-tag parsers (everything in the SVG namespace); you should always use these, unless you
are massively customizing SVGKit's parser! */
-(void) addDefaultSVGParserExtensions;
/*! NB: you ALMOST ALWAYS want to first call "addDefaultSVGParserExtensions" */
- (void) addParserExtension:(NSObject<SVGKParserExtension>*) extension;
@end