span rel="diff-5a1207f2b5057b047ab1bf92f8ab6ce7a0d29762R166">166
+				504EC30F1FED79650016851F /* Assets.xcassets in Resources */,
167
+				50379B232058CBB4000EE86E /* capacitor.config.json in Resources */,
168
+				504EC30D1FED79650016851F /* Main.storyboard in Resources */,
169
+				2FAD9763203C412B000D30F8 /* config.xml in Resources */,
170
+			);
171
+			runOnlyForDeploymentPostprocessing = 0;
172
+		};
173
+/* End PBXResourcesBuildPhase section */
174
+
175
+/* Begin PBXShellScriptBuildPhase section */
176
+		6634F4EFEBD30273BCE97C65 /* [CP] Check Pods Manifest.lock */ = {
177
+			isa = PBXShellScriptBuildPhase;
178
+			buildActionMask = 2147483647;
179
+			files = (
180
+			);
181
+			inputPaths = (
182
+				"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
183
+				"${PODS_ROOT}/Manifest.lock",
184
+			);
185
+			name = "[CP] Check Pods Manifest.lock";
186
+			outputPaths = (
187
+				"$(DERIVED_FILE_DIR)/Pods-App-checkManifestLockResult.txt",
188
+			);
189
+			runOnlyForDeploymentPostprocessing = 0;
190
+			shellPath = /bin/sh;
191
+			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
192
+			showEnvVarsInLog = 0;
193
+		};
194
+		9592DBEFFC6D2A0C8D5DEB22 /* [CP] Embed Pods Frameworks */ = {
195
+			isa = PBXShellScriptBuildPhase;
196
+			buildActionMask = 2147483647;
197
+			files = (
198
+			);
199
+			inputPaths = (
200
+			);
201
+			name = "[CP] Embed Pods Frameworks";
202
+			outputPaths = (
203
+			);
204
+			runOnlyForDeploymentPostprocessing = 0;
205
+			shellPath = /bin/sh;
206
+			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-App/Pods-App-frameworks.sh\"\n";
207
+			showEnvVarsInLog = 0;
208
+		};
209
+/* End PBXShellScriptBuildPhase section */
210
+
211
+/* Begin PBXSourcesBuildPhase section */
212
+		504EC3001FED79650016851F /* Sources */ = {
213
+			isa = PBXSourcesBuildPhase;
214
+			buildActionMask = 2147483647;
215
+			files = (
216
+				504EC3081FED79650016851F /* AppDelegate.swift in Sources */,
217
+			);
218
+			runOnlyForDeploymentPostprocessing = 0;
219
+		};
220
+/* End PBXSourcesBuildPhase section */
221
+
222
+/* Begin PBXVariantGroup section */
223
+		504EC30B1FED79650016851F /* Main.storyboard */ = {
224
+			isa = PBXVariantGroup;
225
+			children = (
226
+				504EC30C1FED79650016851F /* Base */,
227
+			);
228
+			name = Main.storyboard;
229
+			sourceTree = "<group>";
230
+		};
231
+		504EC3101FED79650016851F /* LaunchScreen.storyboard */ = {
232
+			isa = PBXVariantGroup;
233
+			children = (
234
+				504EC3111FED79650016851F /* Base */,
235
+			);
236
+			name = LaunchScreen.storyboard;
237
+			sourceTree = "<group>";
238
+		};
239
+/* End PBXVariantGroup section */
240
+
241
+/* Begin XCBuildConfiguration section */
242
+		504EC3141FED79650016851F /* Debug */ = {
243
+			isa = XCBuildConfiguration;
244
+			buildSettings = {
245
+				ALWAYS_SEARCH_USER_PATHS = NO;
246
+				CLANG_ANALYZER_NONNULL = YES;
247
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
248
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
249
+				CLANG_CXX_LIBRARY = "libc++";
250
+				CLANG_ENABLE_MODULES = YES;
251
+				CLANG_ENABLE_OBJC_ARC = YES;
252
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
253
+				CLANG_WARN_BOOL_CONVERSION = YES;
254
+				CLANG_WARN_COMMA = YES;
255
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
256
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
257
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
258
+				CLANG_WARN_EMPTY_BODY = YES;
259
+				CLANG_WARN_ENUM_CONVERSION = YES;
260
+				CLANG_WARN_INFINITE_RECURSION = YES;
261
+				CLANG_WARN_INT_CONVERSION = YES;
262
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
263
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
264
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
265
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
266
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
267
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
268
+				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
269
+				CLANG_WARN_UNREACHABLE_CODE = YES;
270
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
271
+				CODE_SIGN_IDENTITY = "iPhone Developer";
272
+				COPY_PHASE_STRIP = NO;
273
+				DEBUG_INFORMATION_FORMAT = dwarf;
274
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
275
+				ENABLE_TESTABILITY = YES;
276
+				GCC_C_LANGUAGE_STANDARD = gnu11;
277
+				GCC_DYNAMIC_NO_PIC = NO;
278
+				GCC_NO_COMMON_BLOCKS = YES;
279
+				GCC_OPTIMIZATION_LEVEL = 0;
280
+				GCC_PREPROCESSOR_DEFINITIONS = (
281
+					"DEBUG=1",
282
+					"$(inherited)",
283
+				);
284
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
285
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
286
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
287
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
288
+				GCC_WARN_UNUSED_FUNCTION = YES;
289
+				GCC_WARN_UNUSED_VARIABLE = YES;
290
+				IPHONEOS_DEPLOYMENT_TARGET = 12.0;
291
+				MTL_ENABLE_DEBUG_INFO = YES;
292
+				ONLY_ACTIVE_ARCH = YES;
293
+				SDKROOT = iphoneos;
294
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
295
+				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
296
+			};
297
+			name = Debug;
298
+		};
299
+		504EC3151FED79650016851F /* Release */ = {
300
+			isa = XCBuildConfiguration;
301
+			buildSettings = {
302
+				ALWAYS_SEARCH_USER_PATHS = NO;
303
+				CLANG_ANALYZER_NONNULL = YES;
304
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
305
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
306
+				CLANG_CXX_LIBRARY = "libc++";
307
+				CLANG_ENABLE_MODULES = YES;
308
+				CLANG_ENABLE_OBJC_ARC = YES;
309
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
310
+				CLANG_WARN_BOOL_CONVERSION = YES;
311
+				CLANG_WARN_COMMA = YES;
312
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
313
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
314
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
315
+				CLANG_WARN_EMPTY_BODY = YES;
316
+				CLANG_WARN_ENUM_CONVERSION = YES;
317
+				CLANG_WARN_INFINITE_RECURSION = YES;
318
+				CLANG_WARN_INT_CONVERSION = YES;
319
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
320
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
321
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
322
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
323
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
324
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
325
+				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
326
+				CLANG_WARN_UNREACHABLE_CODE = YES;
327
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
328
+				CODE_SIGN_IDENTITY = "iPhone Developer";
329
+				COPY_PHASE_STRIP = NO;
330
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
331
+				ENABLE_NS_ASSERTIONS = NO;
332
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
333
+				GCC_C_LANGUAGE_STANDARD = gnu11;
334
+				GCC_NO_COMMON_BLOCKS = YES;
335
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
336
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
337
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
338
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
339
+				GCC_WARN_UNUSED_FUNCTION = YES;
340
+				GCC_WARN_UNUSED_VARIABLE = YES;
341
+				IPHONEOS_DEPLOYMENT_TARGET = 12.0;
342
+				MTL_ENABLE_DEBUG_INFO = NO;
343
+				SDKROOT = iphoneos;
344
+				SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
345
+				VALIDATE_PRODUCT = YES;
346
+			};
347
+			name = Release;
348
+		};
349
+		504EC3171FED79650016851F /* Debug */ = {
350
+			isa = XCBuildConfiguration;
351
+			baseConfigurationReference = FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */;
352
+			buildSettings = {
353
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
354
+				CODE_SIGN_ENTITLEMENTS = App/App.entitlements;
355
+				CODE_SIGN_IDENTITY = "Apple Development";
356
+				CODE_SIGN_STYLE = Automatic;
357
+				DEVELOPMENT_TEAM = 5QTJEGL2H2;
358
+				INFOPLIST_FILE = App/Info.plist;
359
+				IPHONEOS_DEPLOYMENT_TARGET = 12.0;
360
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
361
+				OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\"";
362
+				PRODUCT_BUNDLE_IDENTIFIER = net.simplico.tune2win;
363
+				PRODUCT_NAME = "$(TARGET_NAME)";
364
+				PROVISIONING_PROFILE_SPECIFIER = "";
365
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
366
+				SWIFT_VERSION = 5.0;
367
+				TARGETED_DEVICE_FAMILY = "1,2";
368
+			};
369
+			name = Debug;
370
+		};
371
+		504EC3181FED79650016851F /* Release */ = {
372
+			isa = XCBuildConfiguration;
373
+			baseConfigurationReference = AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */;
374
+			buildSettings = {
375
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
376
+				CODE_SIGN_ENTITLEMENTS = App/App.entitlements;
377
+				CODE_SIGN_IDENTITY = "Apple Development";
378
+				CODE_SIGN_STYLE = Automatic;
379
+				DEVELOPMENT_TEAM = 5QTJEGL2H2;
380
+				INFOPLIST_FILE = App/Info.plist;
381
+				IPHONEOS_DEPLOYMENT_TARGET = 12.0;
382
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
383
+				PRODUCT_BUNDLE_IDENTIFIER = net.simplico.tune2win;
384
+				PRODUCT_NAME = "$(TARGET_NAME)";
385
+				PROVISIONING_PROFILE_SPECIFIER = "";
386
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = "";
387
+				SWIFT_VERSION = 5.0;
388
+				TARGETED_DEVICE_FAMILY = "1,2";
389
+			};
390
+			name = Release;
391
+		};
392
+/* End XCBuildConfiguration section */
393
+
394
+/* Begin XCConfigurationList section */
395
+		504EC2FF1FED79650016851F /* Build configuration list for PBXProject "App" */ = {
396
+			isa = XCConfigurationList;
397
+			buildConfigurations = (
398
+				504EC3141FED79650016851F /* Debug */,
399
+				504EC3151FED79650016851F /* Release */,
400
+			);
401
+			defaultConfigurationIsVisible = 0;
402
+			defaultConfigurationName = Release;
403
+		};
404
+		504EC3161FED79650016851F /* Build configuration list for PBXNativeTarget "App" */ = {
405
+			isa = XCConfigurationList;
406
+			buildConfigurations = (
407
+				504EC3171FED79650016851F /* Debug */,
408
+				504EC3181FED79650016851F /* Release */,
409
+			);
410
+			defaultConfigurationIsVisible = 0;
411
+			defaultConfigurationName = Release;
412
+		};
413
+/* End XCConfigurationList section */
414
+	};
415
+	rootObject = 504EC2FC1FED79650016851F /* Project object */;
416
+}

+ 7 - 0
ios/App/App.xcodeproj/project.xcworkspace/contents.xcworkspacedata

@@ -0,0 +1,7 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<Workspace
3
+   version = "1.0">
4
+   <FileRef
5
+      location = "self:App.xcodeproj">
6
+   </FileRef>
7
+</Workspace>

+ 10 - 0
ios/App/App.xcworkspace/contents.xcworkspacedata

@@ -0,0 +1,10 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<Workspace
3
+   version = "1.0">
4
+   <FileRef
5
+      location = "group:App.xcodeproj">
6
+   </FileRef>
7
+   <FileRef
8
+      location = "group:Pods/Pods.xcodeproj">
9
+   </FileRef>
10
+</Workspace>

+ 8 - 0
ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist

@@ -0,0 +1,8 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+<plist version="1.0">
4
+<dict>
5
+	<key>IDEDidComputeMac32BitWarning</key>
6
+	<true/>
7
+</dict>
8
+</plist>

+ 10 - 0
ios/App/App/App.entitlements

@@ -0,0 +1,10 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+<plist version="1.0">
4
+<dict>
5
+	<key>com.apple.developer.healthkit</key>
6
+	<true/>
7
+	<key>com.apple.developer.healthkit.access</key>
8
+	<array/>
9
+</dict>
10
+</plist>

+ 60 - 0
ios/App/App/AppDelegate.swift

@@ -0,0 +1,60 @@
1
+import UIKit
2
+import Capacitor
3
+
4
+@UIApplicationMain
5
+class AppDelegate: UIResponder, UIApplicationDelegate {
6
+
7
+    var window: UIWindow?
8
+
9
+    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
10
+        // Override point for customization after application launch.
11
+        return true
12
+    }
13
+
14
+    func applicationWillResignActive(_ application: UIApplication) {
15
+        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
16
+        // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
17
+    }
18
+
19
+    func applicationDidEnterBackground(_ application: UIApplication) {
20
+        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
21
+        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
22
+    }
23
+
24
+    func applicationWillEnterForeground(_ application: UIApplication) {
25
+        // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
26
+    }
27
+
28
+    func applicationDidBecomeActive(_ application: UIApplication) {
29
+        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
30
+    }
31
+
32
+    func applicationWillTerminate(_ application: UIApplication) {
33
+        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
34
+    }
35
+
36
+    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
37
+        // Called when the app was launched with a url. Feel free to add additional processing here,
38
+        // but if you want the App API to support tracking app url opens, make sure to keep this call
39
+        return ApplicationDelegateProxy.shared.application(app, open: url, options: options)
40
+    }
41
+
42
+    func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
43
+        // Called when the app was launched with an activity, including Universal Links.
44
+        // Feel free to add additional processing here, but if you want the App API to support
45
+        // tracking app url opens, make sure to keep this call
46
+        return ApplicationDelegateProxy.shared.application(application, continue: userActivity, restorationHandler: restorationHandler)
47
+    }
48
+
49
+    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
50
+        super.touchesBegan(touches, with: event)
51
+
52
+        let statusBarRect = UIApplication.shared.statusBarFrame
53
+        guard let touchPoint = event?.allTouches?.first?.location(in: self.window) else { return }
54
+
55
+        if statusBarRect.contains(touchPoint) {
56
+            NotificationCenter.default.post(name: .capacitorStatusBarTapped, object: nil)
57
+        }
58
+    }
59
+
60
+}

BIN
ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@1x.png


BIN
ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@2x-1.png


BIN
ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@2x.png


BIN
ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-20x20@3x.png


BIN
ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@1x.png


BIN
ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@2x-1.png


BIN
ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@2x.png


BIN
ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-29x29@3x.png


BIN
ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@1x.png


BIN
ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@2x-1.png


BIN
ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@2x.png


BIN
ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-40x40@3x.png


BIN
ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png


BIN
ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-60x60@2x.png


BIN
ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-60x60@3x.png


BIN
ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-76x76@1x.png


BIN
ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-76x76@2x.png


BIN
ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5x83.5@2x.png


+ 116 - 0
ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json

@@ -0,0 +1,116 @@
1
+{
2
+  "images" : [
3
+    {
4
+      "size" : "20x20",
5
+      "idiom" : "iphone",
6
+      "filename" : "AppIcon-20x20@2x.png",
7
+      "scale" : "2x"
8
+    },
9
+    {
10
+      "size" : "20x20",
11
+      "idiom" : "iphone",
12
+      "filename" : "AppIcon-20x20@3x.png",
13
+      "scale" : "3x"
14
+    },
15
+    {
16
+      "size" : "29x29",
17
+      "idiom" : "iphone",
18
+      "filename" : "AppIcon-29x29@2x-1.png",
19
+      "scale" : "2x"
20
+    },
21
+    {
22
+      "size" : "29x29",
23
+      "idiom" : "iphone",
24
+      "filename" : "AppIcon-29x29@3x.png",
25
+      "scale" : "3x"
26
+    },
27
+    {
28
+      "size" : "40x40",
29
+      "idiom" : "iphone",
30
+      "filename" : "AppIcon-40x40@2x.png",
31
+      "scale" : "2x"
32
+    },
33
+    {
34
+      "size" : "40x40",
35
+      "idiom" : "iphone",
36
+      "filename" : "AppIcon-40x40@3x.png",
37
+      "scale" : "3x"
38
+    },
39
+    {
40
+      "size" : "60x60",
41
+      "idiom" : "iphone",
42
+      "filename" : "AppIcon-60x60@2x.png",
43
+      "scale" : "2x"
44
+    },
45
+    {
46
+      "size" : "60x60",
47
+      "idiom" : "iphone",
48
+      "filename" : "AppIcon-60x60@3x.png",
49
+      "scale" : "3x"
50
+    },
51
+    {
52
+      "size" : "20x20",
53
+      "idiom" : "ipad",
54
+      "filename" : "AppIcon-20x20@1x.png",
55
+      "scale" : "1x"
56
+    },
57
+    {
58
+      "size" : "20x20",
59
+      "idiom" : "ipad",
60
+      "filename" : "AppIcon-20x20@2x-1.png",
61
+      "scale" : "2x"
62
+    },
63
+    {
64
+      "size" : "29x29",
65
+      "idiom" : "ipad",
66
+      "filename" : "AppIcon-29x29@1x.png",
67
+      "scale" : "1x"
68
+    },
69
+    {
70
+      "size" : "29x29",
71
+      "idiom" : "ipad",
72
+      "filename" : "AppIcon-29x29@2x.png",
73
+      "scale" : "2x"
74
+    },
75
+    {
76
+      "size" : "40x40",
77
+      "idiom" : "ipad",
78
+      "filename" : "AppIcon-40x40@1x.png",
79
+      "scale" : "1x"
80
+    },
81
+    {
82
+      "size" : "40x40",
83
+      "idiom" : "ipad",
84
+      "filename" : "AppIcon-40x40@2x-1.png",
85
+      "scale" : "2x"
86
+    },
87
+    {
88
+      "size" : "76x76",
89
+      "idiom" : "ipad",
90
+      "filename" : "AppIcon-76x76@1x.png",
91
+      "scale" : "1x"
92
+    },
93
+    {
94
+      "size" : "76x76",
95
+      "idiom" : "ipad",
96
+      "filename" : "AppIcon-76x76@2x.png",
97
+      "scale" : "2x"
98
+    },
99
+    {
100
+      "size" : "83.5x83.5",
101
+      "idiom" : "ipad",
102
+      "filename" : "AppIcon-83.5x83.5@2x.png",
103
+      "scale" : "2x"
104
+    },
105
+    {
106
+      "size" : "1024x1024",
107
+      "idiom" : "ios-marketing",
108
+      "filename" : "AppIcon-512@2x.png",
109
+      "scale" : "1x"
110
+    }
111
+  ],
112
+  "info" : {
113
+    "version" : 1,
114
+    "author" : "xcode"
115
+  }
116
+}

+ 6 - 0
ios/App/App/Assets.xcassets/Contents.json

@@ -0,0 +1,6 @@
1
+{
2
+  "info" : {
3
+    "version" : 1,
4
+    "author" : "xcode"
5
+  }
6
+}

+ 23 - 0
ios/App/App/Assets.xcassets/Splash.imageset/Contents.json

@@ -0,0 +1,23 @@
1
+{
2
+  "images" : [
3
+    {
4
+      "idiom" : "universal",
5
+      "filename" : "splash-2732x2732-2.png",
6
+      "scale" : "1x"
7
+    },
8
+    {
9
+      "idiom" : "universal",
10
+      "filename" : "splash-2732x2732-1.png",
11
+      "scale" : "2x"
12
+    },
13
+    {
14
+      "idiom" : "universal",
15
+      "filename" : "splash-2732x2732.png",
16
+      "scale" : "3x"
17
+    }
18
+  ],
19
+  "info" : {
20
+    "version" : 1,
21
+    "author" : "xcode"
22
+  }
23
+}

BIN
ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png


BIN
ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png


BIN
ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png


+ 32 - 0
ios/App/App/Base.lproj/LaunchScreen.storyboard

@@ -0,0 +1,32 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="17132" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
3
+    <device id="retina4_7" orientation="portrait" appearance="light"/>
4
+    <dependencies>
5
+        <deployment identifier="iOS"/>
6
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17105"/>
7
+        <capability name="System colors in document resources" minToolsVersion="11.0"/>
8
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
9
+    </dependencies>
10
+    <scenes>
11
+        <!--View Controller-->
12
+        <scene sceneID="EHf-IW-A2E">
13
+            <objects>
14
+                <viewController id="01J-lp-oVM" sceneMemberID="viewController">
15
+                    <imageView key="view" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="Splash" id="snD-IY-ifK">
16
+                        <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
17
+                        <autoresizingMask key="autoresizingMask"/>
18
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
19
+                    </imageView>
20
+                </viewController>
21
+                <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
22
+            </objects>
23
+            <point key="canvasLocation" x="53" y="375"/>
24
+        </scene>
25
+    </scenes>
26
+    <resources>
27
+        <image name="Splash" width="1366" height="1366"/>
28
+        <systemColor name="systemBackgroundColor">
29
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
30
+        </systemColor>
31
+    </resources>
32
+</document>

+ 19 - 0
ios/App/App/Base.lproj/Main.storyboard

@@ -0,0 +1,19 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14111" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="BYZ-38-t0r">
3
+    <device id="retina4_7" orientation="portrait">
4
+        <adaptation id="fullscreen"/>
5
+    </device>
6
+    <dependencies>
7
+        <deployment identifier="iOS"/>
8
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/>
9
+    </dependencies>
10
+    <scenes>
11
+        <!--Bridge View Controller-->
12
+        <scene sceneID="tne-QT-ifu">
13
+            <objects>
14
+                <viewController id="BYZ-38-t0r" customClass="CAPBridgeViewController" customModule="Capacitor" sceneMemberID="viewController"/>
15
+                <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
16
+            </objects>
17
+        </scene>
18
+    </scenes>
19
+</document>

+ 64 - 0
ios/App/App/Info.plist

@@ -0,0 +1,64 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+<plist version="1.0">
4
+<dict>
5
+	<key>CFBundleDevelopmentRegion</key>
6
+	<string>en</string>
7
+	<key>CFBundleDisplayName</key>
8
+	<string>Tune2Win</string>
9
+	<key>CFBundleExecutable</key>
10
+	<string>$(EXECUTABLE_NAME)</string>
11
+	<key>CFBundleIdentifier</key>
12
+	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
13
+	<key>CFBundleInfoDictionaryVersion</key>
14
+	<string>6.0</string>
15
+	<key>CFBundleName</key>
16
+	<string>$(PRODUCT_NAME)</string>
17
+	<key>CFBundlePackageType</key>
18
+	<string>APPL</string>
19
+	<key>CFBundleShortVersionString</key>
20
+	<string>1.0</string>
21
+	<key>CFBundleVersion</key>
22
+	<string>1</string>
23
+	<key>LSRequiresIPhoneOS</key>
24
+	<true/>
25
+	<key>NSAppTransportSecurity</key>
26
+	<dict>
27
+		<key>NSAllowsArbitraryLoads</key>
28
+		<true/>
29
+	</dict>
30
+    <key>NSContactsUsageDescription</key>
31
+    <string>Get Contact for your trainings</string>
32
+    <key>NSCalendarsUsageDescription</key>
33
+    <string>Access Calendar for trainings</string>
34
+	<key>NSHealthClinicalHealthRecordsShareUsageDescription</key>
35
+	<string>Get data for improve athlete</string>
36
+	<key>NSHealthShareUsageDescription</key>
37
+	<string>Get data for improve athlete</string>
38
+	<key>NSHealthUpdateUsageDescription</key>
39
+	<string>Get data for improve athlete</string>
40
+	<key>UILaunchStoryboardName</key>
41
+	<string>LaunchScreen</string>
42
+	<key>UIMainStoryboardFile</key>
43
+	<string>Main</string>
44
+	<key>UIRequiredDeviceCapabilities</key>
45
+	<array>
46
+		<string>armv7</string>
47
+	</array>
48
+	<key>UISupportedInterfaceOrientations</key>
49
+	<array>
50
+		<string>UIInterfaceOrientationPortrait</string>
51
+		<string>UIInterfaceOrientationLandscapeLeft</string>
52
+		<string>UIInterfaceOrientationLandscapeRight</string>
53
+	</array>
54
+	<key>UISupportedInterfaceOrientations~ipad</key>
55
+	<array>
56
+		<string>UIInterfaceOrientationPortrait</string>
57
+		<string>UIInterfaceOrientationPortraitUpsideDown</string>
58
+		<string>UIInterfaceOrientationLandscapeLeft</string>
59
+		<string>UIInterfaceOrientationLandscapeRight</string>
60
+	</array>
61
+	<key>UIViewControllerBasedStatusBarAppearance</key>
62
+	<true/>
63
+</dict>
64
+</plist>

+ 9 - 0
ios/App/App/capacitor.config.json

@@ -0,0 +1,9 @@
1
+{
2
+	"appId": "io.ionic.starter",
3
+	"appName": "Tune2Win",
4
+	"webDir": "www",
5
+	"bundledWebRuntime": false,
6
+	"server": {
7
+		"url": "http://192.168.1.38:8100"
8
+	}
9
+}

+ 14 - 0
ios/App/App/config.xml

@@ -0,0 +1,14 @@
1
+<?xml version='1.0' encoding='utf-8'?>
2
+<widget version="1.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
3
+  <access origin="*" />
4
+  
5
+  <feature name="Calendar">
6
+    <param name="ios-package" value="Calendar"/>
7
+  </feature>
8
+
9
+  <feature name="HealthKit">
10
+    <param name="ios-package" value="HealthKit"/>
11
+  </feature>
12
+
13
+  
14
+</widget>

+ 22 - 0
ios/App/Podfile

@@ -0,0 +1,22 @@
1
+platform :ios, '12.0'
2
+use_frameworks!
3
+
4
+# workaround to avoid Xcode caching of Pods that requires
5
+# Product -> Clean Build Folder after new Cordova plugins installed
6
+# Requires CocoaPods 1.6 or newer
7
+install! 'cocoapods', :disable_input_output_paths => true
8
+
9
+def capacitor_pods
10
+  pod 'Capacitor', :path => '../../node_modules/@capacitor/ios'
11
+  pod 'CapacitorCordova', :path => '../../node_modules/@capacitor/ios'
12
+  pod 'CapacitorApp', :path => '../../node_modules/@capacitor/app'
13
+  pod 'CapacitorHaptics', :path => '../../node_modules/@capacitor/haptics'
14
+  pod 'CapacitorKeyboard', :path => '../../node_modules/@capacitor/keyboard'
15
+  pod 'CapacitorStatusBar', :path => '../../node_modules/@capacitor/status-bar'
16
+  pod 'CordovaPlugins', :path => '../capacitor-cordova-ios-plugins'
17
+end
18
+
19
+target 'App' do
20
+  capacitor_pods
21
+  # Add your Pods here
22
+end

+ 44 - 0
karma.conf.js

@@ -0,0 +1,44 @@
1
+// Karma configuration file, see link for more information
2
+// https://karma-runner.github.io/1.0/config/configuration-file.html
3
+
4
+module.exports = function (config) {
5
+  config.set({
6
+    basePath: '',
7
+    frameworks: ['jasmine', '@angular-devkit/build-angular'],
8
+    plugins: [
9
+      require('karma-jasmine'),
10
+      require('karma-chrome-launcher'),
11
+      require('karma-jasmine-html-reporter'),
12
+      require('karma-coverage'),
13
+      require('@angular-devkit/build-angular/plugins/karma')
14
+    ],
15
+    client: {
16
+      jasmine: {
17
+        // you can add configuration options for Jasmine here
18
+        // the possible options are listed at https://jasmine.github.io/api/edge/Configuration.html
19
+        // for example, you can disable the random execution with `random: false`
20
+        // or set a specific seed with `seed: 4321`
21
+      },
22
+      clearContext: false // leave Jasmine Spec Runner output visible in browser
23
+    },
24
+    jasmineHtmlReporter: {
25
+      suppressAll: true // removes the duplicated traces
26
+    },
27
+    coverageReporter: {
28
+      dir: require('path').join(__dirname, './coverage/ngv'),
29
+      subdir: '.',
30
+      reporters: [
31
+        { type: 'html' },
32
+        { type: 'text-summary' }
33
+      ]
34
+    },
35
+    reporters: ['progress', 'kjhtml'],
36
+    port: 9876,
37
+    colors: true,
38
+    logLevel: config.LOG_INFO,
39
+    autoWatch: true,
40
+    browsers: ['Chrome'],
41
+    singleRun: false,
42
+    restartOnFileChange: true
43
+  });
44
+};

Файловите разлики са ограничени, защото са твърде много
+ 39378 - 0
package-lock.json


+ 75 - 0
package.json

@@ -0,0 +1,75 @@
1
+{
2
+  "name": "Tune2Win",
3
+  "version": "0.0.1",
4
+  "author": "Ionic Framework",
5
+  "homepage": "https://ionicframework.com/",
6
+  "scripts": {
7
+    "ng": "ng",
8
+    "start": "ng serve",
9
+    "build": "ng build",
10
+    "test": "ng test",
11
+    "lint": "ng lint",
12
+    "e2e": "ng e2e"
13
+  },
14
+  "private": true,
15
+  "dependencies": {
16
+    "@angular/common": "~13.0.0",
17
+    "@angular/core": "~13.0.0",
18
+    "@angular/forms": "~13.0.0",
19
+    "@angular/platform-browser": "~13.0.0",
20
+    "@angular/platform-browser-dynamic": "~13.0.0",
21
+    "@angular/router": "~13.0.0",
22
+    "@awesome-cordova-plugins/calendar": "^5.39.1",
23
+    "@awesome-cordova-plugins/health": "^5.39.1",
24
+    "@capacitor/app": "1.1.0",
25
+    "@capacitor/core": "3.4.1",
26
+    "@capacitor/haptics": "1.1.4",
27
+    "@capacitor/ios": "3.4.1",
28
+    "@capacitor/keyboard": "1.2.2",
29
+    "@capacitor/status-bar": "1.0.8",
30
+    "@ionic/angular": "^6.0.0",
31
+    "@ionic/storage-angular": "^3.0.6",
32
+    "chart.js": "^3.7.1",
33
+    "cordova-plugin-calendar": "^5.1.6",
34
+    "cordova-plugin-health": "^2.0.3",
35
+    "date-fns": "^2.28.0",
36
+    "ng2-charts": "^3.0.0-rc.7",
37
+    "rxjs": "~6.6.0",
38
+    "tslib": "^2.2.0",
39
+    "zone.js": "~0.11.4"
40
+  },
41
+  "devDependencies": {
42
+    "@angular-devkit/build-angular": "~13.0.1",
43
+    "@angular-eslint/builder": "~13.0.1",
44
+    "@angular-eslint/eslint-plugin": "~13.0.1",
45
+    "@angular-eslint/eslint-plugin-template": "~13.0.1",
46
+    "@angular-eslint/template-parser": "~13.0.1",
47
+    "@angular/cli": "~13.0.1",
48
+    "@angular/compiler": "~13.0.0",
49
+    "@angular/compiler-cli": "~13.0.0",
50
+    "@angular/language-service": "~13.0.0",
51
+    "@capacitor/cli": "3.4.1",
52
+    "@ionic/angular-toolkit": "^5.0.0",
53
+    "@types/jasmine": "~3.6.0",
54
+    "@types/jasminewd2": "~2.0.3",
55
+    "@types/node": "^12.11.1",
56
+    "@typescript-eslint/eslint-plugin": "5.3.0",
57
+    "@typescript-eslint/parser": "5.3.0",
58
+    "eslint": "^7.6.0",
59
+    "eslint-plugin-import": "2.22.1",
60
+    "eslint-plugin-jsdoc": "30.7.6",
61
+    "eslint-plugin-prefer-arrow": "1.2.2",
62
+    "jasmine-core": "~3.8.0",
63
+    "jasmine-spec-reporter": "~5.0.0",
64
+    "karma": "~6.3.2",
65
+    "karma-chrome-launcher": "~3.1.0",
66
+    "karma-coverage": "~2.0.3",
67
+    "karma-coverage-istanbul-reporter": "~3.0.2",
68
+    "karma-jasmine": "~4.0.0",
69
+    "karma-jasmine-html-reporter": "^1.5.0",
70
+    "protractor": "~7.0.0",
71
+    "ts-node": "~8.3.0",
72
+    "typescript": "~4.4.4"
73
+  },
74
+  "description": "An Ionic project"
75
+}

BIN
resources/icon.png


BIN
resources/ios/icon/icon-1024.png


BIN
resources/ios/icon/icon-108@2x.png


BIN
resources/ios/icon/icon-20.png


BIN
resources/ios/icon/icon-20@2x.png


BIN
resources/ios/icon/icon-20@3x.png


BIN
resources/ios/icon/icon-24@2x.png


BIN
resources/ios/icon/icon-27.5@2x.png


BIN
resources/ios/icon/icon-29.png


BIN
resources/ios/icon/icon-29@2x.png


BIN
resources/ios/icon/icon-29@3x.png


BIN
resources/ios/icon/icon-40.png


BIN
resources/ios/icon/icon-40@2x.png


BIN
resources/ios/icon/icon-40@3x.png


BIN
resources/ios/icon/icon-44@2x.png


BIN
resources/ios/icon/icon-50.png


BIN
resources/ios/icon/icon-50@2x.png


BIN
resources/ios/icon/icon-60.png


BIN
resources/ios/icon/icon-60@2x.png


BIN
resources/ios/icon/icon-60@3x.png


BIN
resources/ios/icon/icon-72.png


BIN
resources/ios/icon/icon-72@2x.png


BIN
resources/ios/icon/icon-76.png


BIN
resources/ios/icon/icon-76@2x.png


BIN
resources/ios/icon/icon-83.5@2x.png


BIN
resources/ios/icon/icon-86@2x.png


BIN
resources/ios/icon/icon-98@2x.png


BIN
resources/ios/icon/icon.png


BIN
resources/ios/icon/icon@2x.png


BIN
resources/ios/splash/Default-1792h~iphone.png


BIN
resources/ios/splash/Default-2436h.png


BIN
resources/ios/splash/Default-2688h~iphone.png


BIN
resources/ios/splash/Default-568h@2x~iphone.png


BIN
resources/ios/splash/Default-667h.png


BIN
resources/ios/splash/Default-736h.png


BIN
resources/ios/splash/Default-Landscape-1792h~iphone.png


BIN
resources/ios/splash/Default-Landscape-2436h.png


BIN
resources/ios/splash/Default-Landscape-2688h~iphone.png


BIN
resources/ios/splash/Default-Landscape-736h.png


BIN
resources/ios/splash/Default-Landscape@2x~ipad.png


BIN
resources/ios/splash/Default-Landscape@~ipadpro.png


BIN
resources/ios/splash/Default-Landscape~ipad.png


BIN
resources/ios/splash/Default-Portrait@2x~ipad.png


BIN
resources/ios/splash/Default-Portrait@~ipadpro.png


BIN
resources/ios/splash/Default-Portrait~ipad.png


BIN
resources/ios/splash/Default@2x~iphone.png


BIN
resources/ios/splash/Default@2x~universal~anyany.png


BIN
resources/ios/splash/Default~iphone.png


+ 0 - 0
resources/splash.png


Някои файлове не бяха показани, защото твърде много файлове са промени

tum/whitesports - Gogs: Simplico Git Service

Brak opisu

atomlib.php 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  1. <?php
  2. /**
  3. * Atom Syndication Format PHP Library
  4. *
  5. * @package AtomLib
  6. * @link http://code.google.com/p/phpatomlib/
  7. *
  8. * @author Elias Torres <elias@torrez.us>
  9. * @version 0.4
  10. * @since 2.3.0
  11. */
  12. /**
  13. * Structure that store common Atom Feed Properties
  14. *
  15. * @package AtomLib
  16. */
  17. class AtomFeed {
  18. /**
  19. * Stores Links
  20. * @var array
  21. * @access public
  22. */
  23. var $links = array();
  24. /**
  25. * Stores Categories
  26. * @var array
  27. * @access public
  28. */
  29. var $categories = array();
  30. /**
  31. * Stores Entries
  32. *
  33. * @var array
  34. * @access public
  35. */
  36. var $entries = array();
  37. }
  38. /**
  39. * Structure that store Atom Entry Properties
  40. *
  41. * @package AtomLib
  42. */
  43. class AtomEntry {
  44. /**
  45. * Stores Links
  46. * @var array
  47. * @access public
  48. */
  49. var $links = array();
  50. /**
  51. * Stores Categories
  52. * @var array
  53. * @access public
  54. */
  55. var $categories = array();
  56. }
  57. /**
  58. * AtomLib Atom Parser API
  59. *
  60. * @package AtomLib
  61. */
  62. class AtomParser {
  63. var $NS = 'http://www.w3.org/2005/Atom';
  64. var $ATOM_CONTENT_ELEMENTS = array('content','summary','title','subtitle','rights');
  65. var $ATOM_SIMPLE_ELEMENTS = array('id','updated','published','draft');
  66. var $debug = false;
  67. var $depth = 0;
  68. var $indent = 2;
  69. var $in_content;
  70. var $ns_contexts = array();
  71. var $ns_decls = array();
  72. var $content_ns_decls = array();
  73. var $content_ns_contexts = array();
  74. var $is_xhtml = false;
  75. var $is_html = false;
  76. var $is_text = true;
  77. var $skipped_div = false;
  78. var $FILE = "php://input";
  79. var $feed;
  80. var $current;
  81. /**
  82. * PHP5 constructor.
  83. */
  84. function __construct() {
  85. $this->feed = new AtomFeed();
  86. $this->current = null;
  87. $this->map_attrs_func = array( __CLASS__, 'map_attrs' );
  88. $this->map_xmlns_func = array( __CLASS__, 'map_xmlns' );
  89. }
  90. /**
  91. * PHP4 constructor.
  92. */
  93. public function AtomParser() {
  94. self::__construct();
  95. }
  96. /**
  97. * Map attributes to key="val"
  98. *
  99. * @param string $k Key
  100. * @param string $v Value
  101. * @return string
  102. */
  103. public static function map_attrs($k, $v) {
  104. return "$k=\"$v\"";
  105. }
  106. /**
  107. * Map XML namespace to string.
  108. *
  109. * @param indexish $p XML Namespace element index
  110. * @param array $n Two-element array pair. [ 0 => {namespace}, 1 => {url} ]
  111. * @return string 'xmlns="{url}"' or 'xmlns:{namespace}="{url}"'
  112. */
  113. public static function map_xmlns($p, $n) {
  114. $xd = "xmlns";
  115. if( 0 < strlen($n[0]) ) {
  116. $xd .= ":{$n[0]}";
  117. }
  118. return "{$xd}=\"{$n[1]}\"";
  119. }
  120. function _p($msg) {
  121. if($this->debug) {
  122. print str_repeat(" ", $this->depth * $this->indent) . $msg ."\n";
  123. }
  124. }
  125. function error_handler($log_level, $log_text, $error_file, $error_line) {
  126. $this->error = $log_text;
  127. }
  128. function parse() {
  129. set_error_handler(array(&$this, 'error_handler'));
  130. array_unshift($this->ns_contexts, array());
  131. if ( ! function_exists( 'xml_parser_create_ns' ) ) {
  132. trigger_error( __( "PHP's XML extension is not available. Please contact your hosting provider to enable PHP's XML extension." ) );
  133. return false;
  134. }
  135. $parser = xml_parser_create_ns();
  136. xml_set_object($parser, $this);
  137. xml_set_element_handler($parser, "start_element", "end_element");
  138. xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);
  139. xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,0);
  140. xml_set_character_data_handler($parser, "cdata");
  141. xml_set_default_handler($parser, "_default");
  142. xml_set_start_namespace_decl_handler($parser, "start_ns");
  143. xml_set_end_namespace_decl_handler($parser, "end_ns");
  144. $this->content = '';
  145. $ret = true;
  146. $fp = fopen($this->FILE, "r");
  147. while ($data = fread($fp, 4096)) {
  148. if($this->debug) $this->content .= $data;
  149. if(!xml_parse($parser, $data, feof($fp))) {
  150. /* translators: 1: Error message, 2: Line number. */
  151. trigger_error(sprintf(__('XML Error: %1$s at line %2$s')."\n",
  152. xml_error_string(xml_get_error_code($parser)),
  153. xml_get_current_line_number($parser)));
  154. $ret = false;
  155. break;
  156. }
  157. }
  158. fclose($fp);
  159. xml_parser_free($parser);
  160. unset($parser);
  161. restore_error_handler();
  162. return $ret;
  163. }
  164. function start_element($parser, $name, $attrs) {
  165. $name_parts = explode(":", $name);
  166. $tag = array_pop($name_parts);
  167. switch($name) {
  168. case $this->NS . ':feed':
  169. $this->current = $this->feed;
  170. break;
  171. case $this->NS . ':entry':
  172. $this->current = new AtomEntry();
  173. break;
  174. };
  175. $this->_p("start_element('$name')");
  176. #$this->_p(print_r($this->ns_contexts,true));
  177. #$this->_p('current(' . $this->current . ')');
  178. array_unshift($this->ns_contexts, $this->ns_decls);
  179. $this->depth++;
  180. if(!empty($this->in_content)) {
  181. $this->content_ns_decls = array();
  182. if($this->is_html || $this->is_text)
  183. trigger_error("Invalid content in element found. Content must not be of type text or html if it contains markup.");
  184. $attrs_prefix = array();
  185. // resolve prefixes for attributes
  186. foreach($attrs as $key => $value) {
  187. $with_prefix = $this->ns_to_prefix($key, true);
  188. $attrs_prefix[$with_prefix[1]] = $this->xml_escape($value);
  189. }
  190. $attrs_str = join(' ', array_map($this->map_attrs_func, array_keys($attrs_prefix), array_values($attrs_prefix)));
  191. if(strlen($attrs_str) > 0) {
  192. $attrs_str = " " . $attrs_str;
  193. }
  194. $with_prefix = $this->ns_to_prefix($name);
  195. if(!$this->is_declared_content_ns($with_prefix[0])) {
  196. array_push($this->content_ns_decls, $with_prefix[0]);
  197. }
  198. $xmlns_str = '';
  199. if(count($this->content_ns_decls) > 0) {
  200. array_unshift($this->content_ns_contexts, $this->content_ns_decls);
  201. $xmlns_str .= join(' ', array_map($this->map_xmlns_func, array_keys($this->content_ns_contexts[0]), array_values($this->content_ns_contexts[0])));
  202. if(strlen($xmlns_str) > 0) {
  203. $xmlns_str = " " . $xmlns_str;
  204. }
  205. }
  206. array_push($this->in_content, array($tag, $this->depth, "<". $with_prefix[1] ."{$xmlns_str}{$attrs_str}" . ">"));
  207. } else if(in_array($tag, $this->ATOM_CONTENT_ELEMENTS) || in_array($tag, $this->ATOM_SIMPLE_ELEMENTS)) {
  208. $this->in_content = array();
  209. $this->is_xhtml = $attrs['type'] == 'xhtml';
  210. $this->is_html = $attrs['type'] == 'html' || $attrs['type'] == 'text/html';
  211. $this->is_text = !in_array('type',array_keys($attrs)) || $attrs['type'] == 'text';
  212. $type = $this->is_xhtml ? 'XHTML' : ($this->is_html ? 'HTML' : ($this->is_text ? 'TEXT' : $attrs['type']));
  213. if(in_array('src',array_keys($attrs))) {
  214. $this->current->$tag = $attrs;
  215. } else {
  216. array_push($this->in_content, array($tag,$this->depth, $type));
  217. }
  218. } else if($tag == 'link') {
  219. array_push($this->current->links, $attrs);
  220. } else if($tag == 'category') {
  221. array_push($this->current->categories, $attrs);
  222. }
  223. $this->ns_decls = array();
  224. }
  225. function end_element($parser, $name) {
  226. $name_parts = explode(":", $name);
  227. $tag = array_pop($name_parts);
  228. $ccount = count($this->in_content);
  229. # if we are *in* content, then let's proceed to serialize it
  230. if(!empty($this->in_content)) {
  231. # if we are ending the original content element
  232. # then let's finalize the content
  233. if($this->in_content[0][0] == $tag &&
  234. $this->in_content[0][1] == $this->depth) {
  235. $origtype = $this->in_content[0][2];
  236. array_shift($this->in_content);
  237. $newcontent = array();
  238. foreach($this->in_content as $c) {
  239. if(count($c) == 3) {
  240. array_push($newcontent, $c[2]);
  241. } else {
  242. if($this->is_xhtml || $this->is_text) {
  243. array_push($newcontent, $this->xml_escape($c));
  244. } else {
  245. array_push($newcontent, $c);
  246. }
  247. }
  248. }
  249. if(in_array($tag, $this->ATOM_CONTENT_ELEMENTS)) {
  250. $this->current->$tag = array($origtype, join('',$newcontent));
  251. } else {
  252. $this->current->$tag = join('',$newcontent);
  253. }
  254. $this->in_content = array();
  255. } else if($this->in_content[$ccount-1][0] == $tag &&
  256. $this->in_content[$ccount-1][1] == $this->depth) {
  257. $this->in_content[$ccount-1][2] = substr($this->in_content[$ccount-1][2],0,-1) . "/>";
  258. } else {
  259. # else, just finalize the current element's content
  260. $endtag = $this->ns_to_prefix($name);
  261. array_push($this->in_content, array($tag, $this->depth, "</$endtag[1]>"));
  262. }
  263. }
  264. array_shift($this->ns_contexts);
  265. $this->depth--;
  266. if($name == ($this->NS . ':entry')) {
  267. array_push($this->feed->entries, $this->current);
  268. $this->current = null;
  269. }
  270. $this->_p("end_element('$name')");
  271. }
  272. function start_ns($parser, $prefix, $uri) {
  273. $this->_p("starting: " . $prefix . ":" . $uri);
  274. array_push($this->ns_decls, array($prefix,$uri));
  275. }
  276. function end_ns($parser, $prefix) {
  277. $this->_p("ending: #" . $prefix . "#");
  278. }
  279. function cdata($parser, $data) {
  280. $this->_p("data: #" . str_replace(array("\n"), array("\\n"), trim($data)) . "#");
  281. if(!empty($this->in_content)) {
  282. array_push($this->in_content, $data);
  283. }
  284. }
  285. function _default($parser, $data) {
  286. # when does this gets called?
  287. }
  288. function ns_to_prefix($qname, $attr=false) {
  289. # split 'http://www.w3.org/1999/xhtml:div' into ('http','//www.w3.org/1999/xhtml','div')
  290. $components = explode(":", $qname);
  291. # grab the last one (e.g 'div')
  292. $name = array_pop($components);
  293. if(!empty($components)) {
  294. # re-join back the namespace component
  295. $ns = join(":",$components);
  296. foreach($this->ns_contexts as $context) {
  297. foreach($context as $mapping) {
  298. if($mapping[1] == $ns && strlen($mapping[0]) > 0) {
  299. return array($mapping, "$mapping[0]:$name");
  300. }
  301. }
  302. }
  303. }
  304. if($attr) {
  305. return array(null, $name);
  306. } else {
  307. foreach($this->ns_contexts as $context) {
  308. foreach($context as $mapping) {
  309. if(strlen($mapping[0]) == 0) {
  310. return array($mapping, $name);
  311. }
  312. }
  313. }
  314. }
  315. }
  316. function is_declared_content_ns($new_mapping) {
  317. foreach($this->content_ns_contexts as $context) {
  318. foreach($context as $mapping) {
  319. if($new_mapping == $mapping) {
  320. return true;
  321. }
  322. }
  323. }
  324. return false;
  325. }
  326. function xml_escape($content)
  327. {
  328. return str_replace(array('&','"',"'",'<','>'),
  329. array('&amp;','&quot;','&apos;','&lt;','&gt;'),
  330. $content );
  331. }
  332. }