mirror of
https://github.com/Tencent/Hippy.git
synced 2026-10-22 16:58:30 +08:00
d9576d4819
* refactor(ios): Revert rename Hippy prefix part3 * refactor(ios): Revert rename from Hippy prefix to NativeRender part1 the original rename pr is #2165 * refactor(ios): Revert rename from Hippy prefix to NativeRender part2 * refactor(ios): Revert rename Hippy prefix part4 * refactor(ios): Revert rename Hippy prefix part5 * refactor(ios): Revert rename Hippy prefix part 6 * refactor(ios): Revert rename Hippy prefix part 7 * refactor(ios): make hippy3 native component compatible with hippy2 * refactor(ios): Revert rename Hippy prefix part 8 * refactor(ios): Revert rename Hippy prefix part 9 * refactor(ios): Revert rename Hippy prefix part 10 * refactor(ios): Revert rename Hippy prefix to NativeRender part 11 * refactor(ios): Revert rename and sdk frame refactor part 12 * refactor(ios): Revert rename and sdk frame refactor part 13 HippyRootView and sdk start related change * feat(ios): Improve method of getting UI state and Add NightMode sync from hippy2 * fix(ios): bridge and rootView's memory issue when dealloc * refactor(ios): Revert rename and sdk frame refactor part 14 * fix(ios): listview and waterfall reload animation bug * fix(ios): fix hippy3 podspec's bug remove all deprecated Header Search Path settings in user_target_xcconfig
115 lines
3.5 KiB
Objective-C
115 lines
3.5 KiB
Objective-C
/*!
|
|
* iOS SDK
|
|
*
|
|
* Tencent is pleased to support the open source community by making
|
|
* Hippy available.
|
|
*
|
|
* Copyright (C) 2019 THL A29 Limited, a Tencent company.
|
|
* All rights reserved.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#import "HippyParserUtils.h"
|
|
#import "HippyLog.h"
|
|
|
|
BOOL HippyReadChar(const char **input, char c) {
|
|
if (**input == c) {
|
|
(*input)++;
|
|
return YES;
|
|
}
|
|
return NO;
|
|
}
|
|
|
|
BOOL HippyReadString(const char **input, const char *string) {
|
|
int i;
|
|
for (i = 0; string[i] != 0; i++) {
|
|
if (string[i] != (*input)[i]) {
|
|
return NO;
|
|
}
|
|
}
|
|
*input += i;
|
|
return YES;
|
|
}
|
|
|
|
void HippySkipWhitespace(const char **input) {
|
|
while (isspace(**input)) {
|
|
(*input)++;
|
|
}
|
|
}
|
|
|
|
static BOOL HippyParseIsIdentifierHead(const char c) {
|
|
return isalpha(c) || c == '_';
|
|
}
|
|
|
|
static BOOL HippyParseIsIdentifierTail(const char c) {
|
|
return isalnum(c) || c == '_';
|
|
}
|
|
|
|
BOOL HippyParseIdentifier(const char **input, NSString **string) {
|
|
const char *start = *input;
|
|
if (!HippyParseIsIdentifierHead(**input)) {
|
|
return NO;
|
|
}
|
|
(*input)++;
|
|
while (HippyParseIsIdentifierTail(**input)) {
|
|
(*input)++;
|
|
}
|
|
if (string) {
|
|
*string = [[NSString alloc] initWithBytes:start length:(NSInteger)(*input - start) encoding:NSASCIIStringEncoding];
|
|
}
|
|
return YES;
|
|
}
|
|
|
|
static BOOL HippyParseIsCollectionType(NSString *type) {
|
|
static NSSet *collectionTypes;
|
|
static dispatch_once_t onceToken;
|
|
dispatch_once(&onceToken, ^{
|
|
collectionTypes = [[NSSet alloc] initWithObjects:@"NSArray", @"NSSet", @"NSDictionary", nil];
|
|
});
|
|
return [collectionTypes containsObject:type];
|
|
}
|
|
|
|
NSString *HippyParseType(const char **input) {
|
|
NSString *type;
|
|
HippyParseIdentifier(input, &type);
|
|
HippySkipWhitespace(input);
|
|
if (HippyReadChar(input, '<')) {
|
|
HippySkipWhitespace(input);
|
|
NSString *subtype = HippyParseType(input);
|
|
if (HippyParseIsCollectionType(type)) {
|
|
if ([type isEqualToString:@"NSDictionary"]) {
|
|
// Dictionaries have both a key *and* value type, but the key type has
|
|
// to be a string for JSON, so we only care about the value type
|
|
if (HIPPY_DEBUG && ![subtype isEqualToString:@"NSString"]) {
|
|
HippyLogError(@"%@ is not a valid key type for a JSON dictionary", subtype);
|
|
}
|
|
HippySkipWhitespace(input);
|
|
HippyReadChar(input, ',');
|
|
HippySkipWhitespace(input);
|
|
subtype = HippyParseType(input);
|
|
}
|
|
if (![subtype isEqualToString:@"id"]) {
|
|
type = [type stringByReplacingCharactersInRange:(NSRange) { 0, 2 /* "NS" */ } withString:subtype];
|
|
}
|
|
} else {
|
|
// It's a protocol rather than a generic collection - ignore it
|
|
}
|
|
HippySkipWhitespace(input);
|
|
HippyReadChar(input, '>');
|
|
}
|
|
HippySkipWhitespace(input);
|
|
HippyReadChar(input, '*');
|
|
return type;
|
|
}
|