From a63e8e03b08ff21e872bafe07c40c71ee9e1c9a2 Mon Sep 17 00:00:00 2001 From: misyobun Date: Thu, 16 Jan 2020 20:29:58 +0900 Subject: [PATCH] first commit --- .gitignore | 3 + Cartfile | 2 + Cartfile.resolved | 2 + LICENSE.md | 9 + MetaRod.podspec | 25 + MetaRod.xcodeproj/project.pbxproj | 641 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../UserInterfaceState.xcuserstate | Bin 0 -> 49760 bytes .../xcshareddata/xcschemes/MetaRod.xcscheme | 67 ++ .../xcdebugger/Breakpoints_v2.xcbkptlist | 24 + .../xcschemes/Sample.xcscheme | 78 +++ .../xcschemes/xcschememanagement.plist | 44 ++ MetaRod/Info.plist | 22 + MetaRod/MetaRod.h | 19 + MetaRod/Sources/MetaRod.swift | 125 ++++ README.md | 27 + Sample/AppDelegate.swift | 37 + .../AppIcon.appiconset/Contents.json | 98 +++ Sample/Assets.xcassets/Contents.json | 6 + Sample/Base.lproj/LaunchScreen.storyboard | 25 + Sample/ContentView.swift | 39 ++ Sample/Info.plist | 60 ++ Sample/Models/MetaData.swift | 43 ++ .../Preview Assets.xcassets/Contents.json | 6 + Sample/SceneDelegate.swift | 59 ++ 26 files changed, 1476 insertions(+) create mode 100644 .gitignore create mode 100644 Cartfile create mode 100644 Cartfile.resolved create mode 100644 LICENSE.md create mode 100644 MetaRod.podspec create mode 100644 MetaRod.xcodeproj/project.pbxproj create mode 100644 MetaRod.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 MetaRod.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 MetaRod.xcodeproj/project.xcworkspace/xcuserdata/takahashinaoto.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 MetaRod.xcodeproj/xcshareddata/xcschemes/MetaRod.xcscheme create mode 100644 MetaRod.xcodeproj/xcuserdata/takahashinaoto.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 MetaRod.xcodeproj/xcuserdata/takahashinaoto.xcuserdatad/xcschemes/Sample.xcscheme create mode 100644 MetaRod.xcodeproj/xcuserdata/takahashinaoto.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 MetaRod/Info.plist create mode 100644 MetaRod/MetaRod.h create mode 100644 MetaRod/Sources/MetaRod.swift create mode 100644 README.md create mode 100644 Sample/AppDelegate.swift create mode 100644 Sample/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Sample/Assets.xcassets/Contents.json create mode 100644 Sample/Base.lproj/LaunchScreen.storyboard create mode 100644 Sample/ContentView.swift create mode 100644 Sample/Info.plist create mode 100644 Sample/Models/MetaData.swift create mode 100644 Sample/Preview Content/Preview Assets.xcassets/Contents.json create mode 100644 Sample/SceneDelegate.swift diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..18d4754 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.DS_Store +# Carthage +Carthage/ diff --git a/Cartfile b/Cartfile new file mode 100644 index 0000000..b3d6110 --- /dev/null +++ b/Cartfile @@ -0,0 +1,2 @@ +github "onevcat/Kingfisher" ~> 5.0 +github "scinfu/SwiftSoup" diff --git a/Cartfile.resolved b/Cartfile.resolved new file mode 100644 index 0000000..ff2a94c --- /dev/null +++ b/Cartfile.resolved @@ -0,0 +1,2 @@ +github "onevcat/Kingfisher" "5.12.0" +github "scinfu/SwiftSoup" "2.3.0" diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..94ae234 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,9 @@ +The MIT License +Copyright © 2020 Naoto Takahashi naoto0101@gmail.com +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/MetaRod.podspec b/MetaRod.podspec new file mode 100644 index 0000000..d476097 --- /dev/null +++ b/MetaRod.podspec @@ -0,0 +1,25 @@ +# +# Be sure to run `pod spec lint MetaRod.podspec' to ensure this is a +# valid spec and to remove all comments including this before submitting the spec. +# +# To learn more about Podspec attributes see https://guides.cocoapods.org/syntax/podspec.html +# To see working Podspecs in the CocoaPods repo see https://github.com/CocoaPods/Specs/ +# + +Pod::Spec.new do |spec| + spec.name = "MetaRod" + spec.version = "1.0.0" + spec.summary = "lightweight url meta data parser library" + spec.homepage = "https://github.com/misyobun/MetaRod" + spec.screenshots = "https://user-images.githubusercontent.com/509448/72453120-f123cf00-3801-11ea-8947-a1540f91b27e.gif" + spec.license = "MIT" + spec.author = "misyobun" + spec.social_media_url = "https://twitter.com/misyobun" + spec.platform = :ios + spec.requires_arc = true + spec.swift_versions = ['5.0'] + spec.source = { :git => "https://github.com/misyobun/MetaRod.git", :tag => spec.version.to_s } + spec.source_files = "MetaRod/Sources/**/*" + spec.ios.deployment_target = '8.0' + spec.dependency "SwiftSoup" +end diff --git a/MetaRod.xcodeproj/project.pbxproj b/MetaRod.xcodeproj/project.pbxproj new file mode 100644 index 0000000..a8cd0a3 --- /dev/null +++ b/MetaRod.xcodeproj/project.pbxproj @@ -0,0 +1,641 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 74BEC7A223C5D15800B76B59 /* MetaRod.h in Headers */ = {isa = PBXBuildFile; fileRef = 74BEC7A023C5D15800B76B59 /* MetaRod.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 74BEC7AF23C5D70A00B76B59 /* MetaRod.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74BEC7AE23C5D70A00B76B59 /* MetaRod.swift */; }; + 74BEC84023C6D21200B76B59 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74BEC83F23C6D21200B76B59 /* AppDelegate.swift */; }; + 74BEC84223C6D21200B76B59 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74BEC84123C6D21200B76B59 /* SceneDelegate.swift */; }; + 74BEC84423C6D21200B76B59 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74BEC84323C6D21200B76B59 /* ContentView.swift */; }; + 74BEC84623C6D21300B76B59 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 74BEC84523C6D21300B76B59 /* Assets.xcassets */; }; + 74BEC84923C6D21300B76B59 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 74BEC84823C6D21300B76B59 /* Preview Assets.xcassets */; }; + 74BEC84C23C6D21300B76B59 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 74BEC84A23C6D21300B76B59 /* LaunchScreen.storyboard */; }; + 74BEC85123C6D23400B76B59 /* MetaRod.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 74BEC79D23C5D15800B76B59 /* MetaRod.framework */; }; + 74BEC85223C6D23400B76B59 /* MetaRod.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 74BEC79D23C5D15800B76B59 /* MetaRod.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 74BEC88323CADF8D00B76B59 /* SwiftSoup.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 74BEC7A923C5D42400B76B59 /* SwiftSoup.framework */; }; + 74BEC88423CADF8D00B76B59 /* SwiftSoup.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 74BEC7A923C5D42400B76B59 /* SwiftSoup.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 74BEC8D223CDA3AF00B76B59 /* MetaData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74BEC8D123CDA3AF00B76B59 /* MetaData.swift */; }; + 74BEC8D423CEBAEE00B76B59 /* Kingfisher.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 74BEC8D323CEBAEE00B76B59 /* Kingfisher.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 74BEC8D623CEBAF700B76B59 /* KingfisherSwiftUI.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 74BEC8D523CEBAF700B76B59 /* KingfisherSwiftUI.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 74BEC8D823CED2AF00B76B59 /* Kingfisher.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 74BEC8D323CEBAEE00B76B59 /* Kingfisher.framework */; }; + 74BEC8D923CED2B300B76B59 /* KingfisherSwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 74BEC8D523CEBAF700B76B59 /* KingfisherSwiftUI.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 74BEC85323C6D23400B76B59 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 74BEC79423C5D15800B76B59 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 74BEC79C23C5D15800B76B59; + remoteInfo = MetaRod; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 74BEC85523C6D23400B76B59 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 74BEC85223C6D23400B76B59 /* MetaRod.framework in Embed Frameworks */, + 74BEC8D423CEBAEE00B76B59 /* Kingfisher.framework in Embed Frameworks */, + 74BEC8D623CEBAF700B76B59 /* KingfisherSwiftUI.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; + 74BEC88523CADF8D00B76B59 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 74BEC88423CADF8D00B76B59 /* SwiftSoup.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 74BEC79D23C5D15800B76B59 /* MetaRod.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MetaRod.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 74BEC7A023C5D15800B76B59 /* MetaRod.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MetaRod.h; sourceTree = ""; }; + 74BEC7A123C5D15800B76B59 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 74BEC7A923C5D42400B76B59 /* SwiftSoup.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftSoup.framework; path = Carthage/Build/iOS/SwiftSoup.framework; sourceTree = ""; }; + 74BEC7AE23C5D70A00B76B59 /* MetaRod.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MetaRod.swift; sourceTree = ""; }; + 74BEC83D23C6D21200B76B59 /* Sample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Sample.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 74BEC83F23C6D21200B76B59 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 74BEC84123C6D21200B76B59 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; + 74BEC84323C6D21200B76B59 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + 74BEC84523C6D21300B76B59 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 74BEC84823C6D21300B76B59 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + 74BEC84B23C6D21300B76B59 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 74BEC84D23C6D21300B76B59 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 74BEC8D123CDA3AF00B76B59 /* MetaData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MetaData.swift; sourceTree = ""; }; + 74BEC8D323CEBAEE00B76B59 /* Kingfisher.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Kingfisher.framework; path = Carthage/Build/iOS/Kingfisher.framework; sourceTree = ""; }; + 74BEC8D523CEBAF700B76B59 /* KingfisherSwiftUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = KingfisherSwiftUI.framework; path = Carthage/Build/iOS/KingfisherSwiftUI.framework; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 74BEC79A23C5D15800B76B59 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 74BEC88323CADF8D00B76B59 /* SwiftSoup.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 74BEC83A23C6D21200B76B59 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 74BEC85123C6D23400B76B59 /* MetaRod.framework in Frameworks */, + 74BEC8D823CED2AF00B76B59 /* Kingfisher.framework in Frameworks */, + 74BEC8D923CED2B300B76B59 /* KingfisherSwiftUI.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 74BEC79323C5D15800B76B59 = { + isa = PBXGroup; + children = ( + 74BEC8D523CEBAF700B76B59 /* KingfisherSwiftUI.framework */, + 74BEC8D323CEBAEE00B76B59 /* Kingfisher.framework */, + 74BEC79F23C5D15800B76B59 /* MetaRod */, + 74BEC83E23C6D21200B76B59 /* Sample */, + 74BEC79E23C5D15800B76B59 /* Products */, + 74BEC7A823C5D42400B76B59 /* Frameworks */, + ); + sourceTree = ""; + }; + 74BEC79E23C5D15800B76B59 /* Products */ = { + isa = PBXGroup; + children = ( + 74BEC79D23C5D15800B76B59 /* MetaRod.framework */, + 74BEC83D23C6D21200B76B59 /* Sample.app */, + ); + name = Products; + sourceTree = ""; + }; + 74BEC79F23C5D15800B76B59 /* MetaRod */ = { + isa = PBXGroup; + children = ( + 74BEC7AC23C5D6D200B76B59 /* Sources */, + 74BEC7A023C5D15800B76B59 /* MetaRod.h */, + 74BEC7A123C5D15800B76B59 /* Info.plist */, + ); + path = MetaRod; + sourceTree = ""; + }; + 74BEC7A823C5D42400B76B59 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 74BEC7A923C5D42400B76B59 /* SwiftSoup.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 74BEC7AC23C5D6D200B76B59 /* Sources */ = { + isa = PBXGroup; + children = ( + 74BEC7AE23C5D70A00B76B59 /* MetaRod.swift */, + ); + path = Sources; + sourceTree = ""; + }; + 74BEC83E23C6D21200B76B59 /* Sample */ = { + isa = PBXGroup; + children = ( + 74BEC85623C850EB00B76B59 /* Models */, + 74BEC83F23C6D21200B76B59 /* AppDelegate.swift */, + 74BEC84123C6D21200B76B59 /* SceneDelegate.swift */, + 74BEC84323C6D21200B76B59 /* ContentView.swift */, + 74BEC84523C6D21300B76B59 /* Assets.xcassets */, + 74BEC84A23C6D21300B76B59 /* LaunchScreen.storyboard */, + 74BEC84D23C6D21300B76B59 /* Info.plist */, + 74BEC84723C6D21300B76B59 /* Preview Content */, + ); + path = Sample; + sourceTree = ""; + }; + 74BEC84723C6D21300B76B59 /* Preview Content */ = { + isa = PBXGroup; + children = ( + 74BEC84823C6D21300B76B59 /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; + 74BEC85623C850EB00B76B59 /* Models */ = { + isa = PBXGroup; + children = ( + 74BEC8D123CDA3AF00B76B59 /* MetaData.swift */, + ); + path = Models; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 74BEC79823C5D15800B76B59 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 74BEC7A223C5D15800B76B59 /* MetaRod.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 74BEC79C23C5D15800B76B59 /* MetaRod-iOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 74BEC7A523C5D15800B76B59 /* Build configuration list for PBXNativeTarget "MetaRod-iOS" */; + buildPhases = ( + 74BEC79823C5D15800B76B59 /* Headers */, + 74BEC79923C5D15800B76B59 /* Sources */, + 74BEC79A23C5D15800B76B59 /* Frameworks */, + 74BEC79B23C5D15800B76B59 /* Resources */, + 74BEC7AB23C5D43500B76B59 /* ShellScript */, + 74BEC88523CADF8D00B76B59 /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "MetaRod-iOS"; + productName = MetaRod; + productReference = 74BEC79D23C5D15800B76B59 /* MetaRod.framework */; + productType = "com.apple.product-type.framework"; + }; + 74BEC83C23C6D21200B76B59 /* Sample */ = { + isa = PBXNativeTarget; + buildConfigurationList = 74BEC84E23C6D21300B76B59 /* Build configuration list for PBXNativeTarget "Sample" */; + buildPhases = ( + 74BEC83923C6D21200B76B59 /* Sources */, + 74BEC83A23C6D21200B76B59 /* Frameworks */, + 74BEC83B23C6D21200B76B59 /* Resources */, + 74BEC85523C6D23400B76B59 /* Embed Frameworks */, + 74BEC8D723CEBC1F00B76B59 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + 74BEC85423C6D23400B76B59 /* PBXTargetDependency */, + ); + name = Sample; + productName = Sample; + productReference = 74BEC83D23C6D21200B76B59 /* Sample.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 74BEC79423C5D15800B76B59 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1130; + LastUpgradeCheck = 1130; + ORGANIZATIONNAME = msb; + TargetAttributes = { + 74BEC79C23C5D15800B76B59 = { + CreatedOnToolsVersion = 11.3; + LastSwiftMigration = 1130; + }; + 74BEC83C23C6D21200B76B59 = { + CreatedOnToolsVersion = 11.3; + }; + }; + }; + buildConfigurationList = 74BEC79723C5D15800B76B59 /* Build configuration list for PBXProject "MetaRod" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 74BEC79323C5D15800B76B59; + productRefGroup = 74BEC79E23C5D15800B76B59 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 74BEC79C23C5D15800B76B59 /* MetaRod-iOS */, + 74BEC83C23C6D21200B76B59 /* Sample */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 74BEC79B23C5D15800B76B59 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 74BEC83B23C6D21200B76B59 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74BEC84C23C6D21300B76B59 /* LaunchScreen.storyboard in Resources */, + 74BEC84923C6D21300B76B59 /* Preview Assets.xcassets in Resources */, + 74BEC84623C6D21300B76B59 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 74BEC7AB23C5D43500B76B59 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "$(SRCROOT)/Carthage/Build/iOS/SwiftSoup.framework", + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/usr/local/bin/carthage copy-frameworks\n"; + }; + 74BEC8D723CEBC1F00B76B59 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "$(SRCROOT)/Carthage/Build/iOS/Kingfisher.framework", + "$(SRCROOT)/Carthage/Build/iOS/KingfisherSwiftUI.framework", + ); + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Carthage/Build/iOS/Kingfisher.framework", + "$(DERIVED_FILE_DIR)/Carthage/Build/iOS/KingfisherSwiftUI.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/usr/local/bin/carthage copy-frameworks\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 74BEC79923C5D15800B76B59 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74BEC7AF23C5D70A00B76B59 /* MetaRod.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 74BEC83923C6D21200B76B59 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74BEC84023C6D21200B76B59 /* AppDelegate.swift in Sources */, + 74BEC84223C6D21200B76B59 /* SceneDelegate.swift in Sources */, + 74BEC8D223CDA3AF00B76B59 /* MetaData.swift in Sources */, + 74BEC84423C6D21200B76B59 /* ContentView.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 74BEC85423C6D23400B76B59 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 74BEC79C23C5D15800B76B59 /* MetaRod-iOS */; + targetProxy = 74BEC85323C6D23400B76B59 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 74BEC84A23C6D21300B76B59 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 74BEC84B23C6D21300B76B59 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 74BEC7A323C5D15800B76B59 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.2; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 74BEC7A423C5D15800B76B59 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.2; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 74BEC7A623C5D15800B76B59 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_STYLE = Automatic; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = M8G9M4S72X; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + INFOPLIST_FILE = MetaRod/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = msb.MetaRod; + PRODUCT_NAME = MetaRod; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 74BEC7A723C5D15800B76B59 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_STYLE = Automatic; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = M8G9M4S72X; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + INFOPLIST_FILE = MetaRod/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = msb.MetaRod; + PRODUCT_NAME = MetaRod; + SKIP_INSTALL = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 74BEC84F23C6D21300B76B59 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_ASSET_PATHS = "\"Sample/Preview Content\""; + DEVELOPMENT_TEAM = M8G9M4S72X; + ENABLE_PREVIEWS = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + INFOPLIST_FILE = Sample/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = msb.Sample; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 74BEC85023C6D21300B76B59 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_ASSET_PATHS = "\"Sample/Preview Content\""; + DEVELOPMENT_TEAM = M8G9M4S72X; + ENABLE_PREVIEWS = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + INFOPLIST_FILE = Sample/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = msb.Sample; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 74BEC79723C5D15800B76B59 /* Build configuration list for PBXProject "MetaRod" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 74BEC7A323C5D15800B76B59 /* Debug */, + 74BEC7A423C5D15800B76B59 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 74BEC7A523C5D15800B76B59 /* Build configuration list for PBXNativeTarget "MetaRod-iOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 74BEC7A623C5D15800B76B59 /* Debug */, + 74BEC7A723C5D15800B76B59 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 74BEC84E23C6D21300B76B59 /* Build configuration list for PBXNativeTarget "Sample" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 74BEC84F23C6D21300B76B59 /* Debug */, + 74BEC85023C6D21300B76B59 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 74BEC79423C5D15800B76B59 /* Project object */; +} diff --git a/MetaRod.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/MetaRod.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1ff3e68 --- /dev/null +++ b/MetaRod.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/MetaRod.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/MetaRod.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/MetaRod.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/MetaRod.xcodeproj/project.xcworkspace/xcuserdata/takahashinaoto.xcuserdatad/UserInterfaceState.xcuserstate b/MetaRod.xcodeproj/project.xcworkspace/xcuserdata/takahashinaoto.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..6e17e7ffccf870fa9d0d76a3f01fbf92e672dc1b GIT binary patch literal 49760 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 literal 0 HcmV?d00001 diff --git a/MetaRod.xcodeproj/xcshareddata/xcschemes/MetaRod.xcscheme b/MetaRod.xcodeproj/xcshareddata/xcschemes/MetaRod.xcscheme new file mode 100644 index 0000000..9058936 --- /dev/null +++ b/MetaRod.xcodeproj/xcshareddata/xcschemes/MetaRod.xcscheme @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MetaRod.xcodeproj/xcuserdata/takahashinaoto.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/MetaRod.xcodeproj/xcuserdata/takahashinaoto.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..cef26c5 --- /dev/null +++ b/MetaRod.xcodeproj/xcuserdata/takahashinaoto.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,24 @@ + + + + + + + + + diff --git a/MetaRod.xcodeproj/xcuserdata/takahashinaoto.xcuserdatad/xcschemes/Sample.xcscheme b/MetaRod.xcodeproj/xcuserdata/takahashinaoto.xcuserdatad/xcschemes/Sample.xcscheme new file mode 100644 index 0000000..cfe981e --- /dev/null +++ b/MetaRod.xcodeproj/xcuserdata/takahashinaoto.xcuserdatad/xcschemes/Sample.xcscheme @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MetaRod.xcodeproj/xcuserdata/takahashinaoto.xcuserdatad/xcschemes/xcschememanagement.plist b/MetaRod.xcodeproj/xcuserdata/takahashinaoto.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..f6cd3be --- /dev/null +++ b/MetaRod.xcodeproj/xcuserdata/takahashinaoto.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,44 @@ + + + + + SchemeUserState + + MetaRod.xcscheme_^#shared#^_ + + orderHint + 0 + + MetaRodSamples.xcscheme_^#shared#^_ + + orderHint + 0 + + Sample.xcscheme + + isShown + + orderHint + 1 + + sample.xcscheme_^#shared#^_ + + orderHint + 0 + + + SuppressBuildableAutocreation + + 74BEC79C23C5D15800B76B59 + + primary + + + 74BEC83C23C6D21200B76B59 + + primary + + + + + diff --git a/MetaRod/Info.plist b/MetaRod/Info.plist new file mode 100644 index 0000000..9bcb244 --- /dev/null +++ b/MetaRod/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + + diff --git a/MetaRod/MetaRod.h b/MetaRod/MetaRod.h new file mode 100644 index 0000000..42da040 --- /dev/null +++ b/MetaRod/MetaRod.h @@ -0,0 +1,19 @@ +// +// MetaRod.h +// MetaRod +// +// Created by NaotoTakahashi +// Copyright © 2020 msb. All rights reserved. +// + +#import + +//! Project version number for MetaRod. +FOUNDATION_EXPORT double MetaRodVersionNumber; + +//! Project version string for MetaRod. +FOUNDATION_EXPORT const unsigned char MetaRodVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/MetaRod/Sources/MetaRod.swift b/MetaRod/Sources/MetaRod.swift new file mode 100644 index 0000000..3b0c6bd --- /dev/null +++ b/MetaRod/Sources/MetaRod.swift @@ -0,0 +1,125 @@ +// +// MetaRod.swift +// MetaRod +// +// Created by NaotoTakahashi +// Copyright © 2020 msb. All rights reserved. +// + +import Foundation +import SwiftSoup + +public enum MetaRodError: Error { + case parseError(String) + case unknown(String) +} +public class MetaRod:NSObject { + + fileprivate var document:Document? = nil + + public func build(_ urlstr:String) -> Self{ + do { + guard let url = URL(string: urlstr), let html = try? String(contentsOf: url, encoding: .utf8) else { return self } + self.document = try SwiftSoup.parse(html) + } catch Exception.Error(let type, let message) { + print("error type \(type) message \(message)") + } catch { + print("unknown error") + } + return self + } + + public func meta() throws -> [String : String] { + var meta:[String:String] = [:] + do { + let header = self.document?.head() + let metaList = try header?.getElementsByTag("meta") + try metaList?.forEach{ elm in + let prop = try elm.attr("property") + if (!prop.isEmpty) { + meta[prop] = try elm.attr("content") + } + } + } catch Exception.Error(_, let message) { + throw MetaRodError.parseError(message) + } catch { + throw MetaRodError.unknown("failed") + } + return meta + } + + public func meta(completion: @escaping([String: String]) -> Void, errorCompletion: @escaping(MetaRodError) -> Void) { + DispatchQueue.global().async { + do { + var meta:[String:String] = [:] + let header = self.document?.head() + let metaList = try header?.getElementsByTag("meta") + try metaList?.forEach{ elm in + let prop = try elm.attr("property") + if (!prop.isEmpty) { + meta[prop] = try elm.attr("content") + } + } + DispatchQueue.main.async { + completion(meta) + } + + } catch Exception.Error(_, let message) { + DispatchQueue.main.async { + errorCompletion(MetaRodError.parseError(message)) + } + } catch { + DispatchQueue.main.async { + errorCompletion(MetaRodError.unknown("failed")) + } + } + } + } + + public func og() throws -> [String : String] { + var og:[String:String] = [:] + do { + let header = self.document?.head() + let metaList = try header?.getElementsByTag("meta") + try metaList?.forEach{ elm in + let prop = try elm.attr("property") + if (!prop.isEmpty && prop.contains("og:")) { + og[prop] = try elm.attr("content") + } + } + } catch Exception.Error(_, let message) { + throw MetaRodError.parseError(message) + } catch { + throw MetaRodError.unknown("failed") + } + return og + } + + public func og(completion: @escaping([String: String]) -> Void, errorCompletion: @escaping(MetaRodError) -> Void) { + DispatchQueue.global().async { + do { + var og:[String:String] = [:] + let header = self.document?.head() + let metaList = try header?.getElementsByTag("meta") + try metaList?.forEach{ elm in + let prop = try elm.attr("property") + if (!prop.isEmpty && prop.contains("og:")) { + og[prop] = try elm.attr("content") + } + } + DispatchQueue.main.async { + completion(og) + } + + } catch Exception.Error(_, let message) { + DispatchQueue.main.async { + errorCompletion(MetaRodError.parseError(message)) + } + } catch { + DispatchQueue.main.async { + errorCompletion(MetaRodError.unknown("failed")) + } + } + } + } +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..36dac9b --- /dev/null +++ b/README.md @@ -0,0 +1,27 @@ +# MetaRod +MetaRod is a lightweight url meta data parser library. + + +![e5b4c37582a718534d2e83ea48cea18c](https://user-images.githubusercontent.com/509448/72453120-f123cf00-3801-11ea-8947-a1540f91b27e.gif) + +## Installation +### Carthage + +[Carthage](https://github.com/Carthage/Carthage) is a decentralized dependency manager for Cocoa application. + +``` bash +$ brew update +$ brew install carthage +``` + +To integrate MetaRod into your Xcode project using Carthage, specify it in your `Cartfile`: + +``` ogdl +github "misyobun/MetaRod" +``` + +Then, run the following command to build the MetaRod framework: + +``` bash +$ carthage update +``` diff --git a/Sample/AppDelegate.swift b/Sample/AppDelegate.swift new file mode 100644 index 0000000..db5e805 --- /dev/null +++ b/Sample/AppDelegate.swift @@ -0,0 +1,37 @@ +// +// AppDelegate.swift +// Sample +// +// Created by NaotoTakahashi +// Copyright © 2020 msb. All rights reserved. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + return true + } + + // MARK: UISceneSession Lifecycle + + func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { + // Called when a new scene session is being created. + // Use this method to select a configuration to create the new scene with. + return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) + } + + func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) { + // Called when the user discards a scene session. + // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. + // Use this method to release any resources that were specific to the discarded scenes, as they will not return. + } + + +} + diff --git a/Sample/Assets.xcassets/AppIcon.appiconset/Contents.json b/Sample/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d8db8d6 --- /dev/null +++ b/Sample/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Sample/Assets.xcassets/Contents.json b/Sample/Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/Sample/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Sample/Base.lproj/LaunchScreen.storyboard b/Sample/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..865e932 --- /dev/null +++ b/Sample/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Sample/ContentView.swift b/Sample/ContentView.swift new file mode 100644 index 0000000..2349118 --- /dev/null +++ b/Sample/ContentView.swift @@ -0,0 +1,39 @@ +// +// ContentView.swift +// Sample +// +// Created by NaotoTakahashi +// Copyright © 2020 msb. All rights reserved. +// + +import SwiftUI +import KingfisherSwiftUI + +struct ContentView: View { + @EnvironmentObject private var metaData: MetaData + + var body: some View { + VStack { + VStack { + Text(verbatim: self.metaData.og["og:title"] ?? "").font(.headline).frame(width: 320, height: 50, alignment: .center) + Spacer().frame(width:0, height: 20, alignment: .center) + KFImage(URL(string: self.metaData.og["og:image"] ?? "")).resizable().frame(width:300, height:400) + Spacer().frame(width:0, height: 20, alignment: .center) + Text(verbatim: self.metaData.og["og:description"] ?? "") + .font(.subheadline).frame(width: 320, height: 40, alignment: .center) + Spacer().frame(width:0, height: 20, alignment: .center) + }.padding() + Button(action: { + self.metaData.fetchOg() + }) { + Text("Fetch OG") + } + }.padding() + } +} + +struct ContentView_Previews: PreviewProvider { + static var previews: some View { + ContentView() + } +} diff --git a/Sample/Info.plist b/Sample/Info.plist new file mode 100644 index 0000000..9742bf0 --- /dev/null +++ b/Sample/Info.plist @@ -0,0 +1,60 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + + + + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/Sample/Models/MetaData.swift b/Sample/Models/MetaData.swift new file mode 100644 index 0000000..4424e85 --- /dev/null +++ b/Sample/Models/MetaData.swift @@ -0,0 +1,43 @@ +// +// MetaData.swift +// Sample +// +// Created by NaotoTakahashi +// Copyright © 2020 msb. All rights reserved. +// + +import Combine +import SwiftUI +import MetaRod + +final class MetaData: ObservableObject { + + @Published var meta:[String:String] = [:] + @Published var og:[String:String] = [:] + + func fetchOg() { + DispatchQueue.global().async { + do { + let result = try MetaRod().build("https://www.vagrantup.jp/entry/2020/01/08/012539").og() + DispatchQueue.main.async { + self.og = result + } + } catch { + print("error") + } + } + } + + func fetchMeta() { + DispatchQueue.global().async { + do { + let result = try MetaRod().build("https://www.vagrantup.jp/entry/2020/01/08/012539").meta() + DispatchQueue.main.async { + self.meta = result + } + }catch{ + print("error") + } + } + } +} diff --git a/Sample/Preview Content/Preview Assets.xcassets/Contents.json b/Sample/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/Sample/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Sample/SceneDelegate.swift b/Sample/SceneDelegate.swift new file mode 100644 index 0000000..05612f2 --- /dev/null +++ b/Sample/SceneDelegate.swift @@ -0,0 +1,59 @@ +// +// SceneDelegate.swift +// Sample +// +// Created by NaotoTakahashi +// Copyright © 2020 msb. All rights reserved. +// + +import UIKit +import SwiftUI +import MetaRod + +class SceneDelegate: UIResponder, UIWindowSceneDelegate { + + var window: UIWindow? + + + func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { + let contentView = ContentView() + // Use a UIHostingController as window root view controller. + if let windowScene = scene as? UIWindowScene { + let window = UIWindow(windowScene: windowScene) + window.rootViewController = UIHostingController(rootView: contentView.environmentObject(MetaData())) + self.window = window + window.makeKeyAndVisible() + } + } + + func sceneDidDisconnect(_ scene: UIScene) { + // Called as the scene is being released by the system. + // This occurs shortly after the scene enters the background, or when its session is discarded. + // Release any resources associated with this scene that can be re-created the next time the scene connects. + // The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead). + } + + func sceneDidBecomeActive(_ scene: UIScene) { + // Called when the scene has moved from an inactive state to an active state. + // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. + } + + func sceneWillResignActive(_ scene: UIScene) { + // Called when the scene will move from an active state to an inactive state. + // This may occur due to temporary interruptions (ex. an incoming phone call). + } + + func sceneWillEnterForeground(_ scene: UIScene) { + // Called as the scene transitions from the background to the foreground. + // Use this method to undo the changes made on entering the background. + } + + func sceneDidEnterBackground(_ scene: UIScene) { + // Called as the scene transitions from the foreground to the background. + // Use this method to save data, release shared resources, and store enough scene-specific state information + // to restore the scene back to its current state. + } + + +} +