From ba9d5d39a558c4a1ded16674da3b4a185689ecef Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Tue, 8 Jan 2013 10:09:35 -0800 Subject: [PATCH 001/140] Initial commit --- .gitignore | 18 ++++++++++++++++++ README.md | 2 ++ 2 files changed, 20 insertions(+) create mode 100644 .gitignore create mode 100644 README.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..89c499e --- /dev/null +++ b/.gitignore @@ -0,0 +1,18 @@ +# Xcode +.DS_Store +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +*.xcworkspace +!default.xcworkspace +xcuserdata +profile +*.moved-aside +DerivedData +.idea/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..e2fa9d8 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +Chromatism +========== \ No newline at end of file From 50244803219aaaa8e6c4e2624649f5124f83f752 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Tue, 8 Jan 2013 19:13:42 +0100 Subject: [PATCH 002/140] Initial Commit --- Chromatism.xcodeproj/project.pbxproj | 482 ++++++++++++++++++ Chromatism/AppDelegate.h | 15 + Chromatism/AppDelegate.m | 46 ++ Chromatism/Chromatism-Info.plist | 49 ++ Chromatism/Chromatism-Prefix.pch | 14 + .../Chromatism.xcodeproj/project.pbxproj | 482 ++++++++++++++++++ Chromatism/Chromatism/AppDelegate.h | 15 + Chromatism/Chromatism/AppDelegate.m | 46 ++ Chromatism/Chromatism/Chromatism-Info.plist | 49 ++ Chromatism/Chromatism/Chromatism-Prefix.pch | 14 + Chromatism/Chromatism/Default-568h@2x.png | Bin 0 -> 18594 bytes Chromatism/Chromatism/Default.png | Bin 0 -> 6540 bytes Chromatism/Chromatism/Default@2x.png | Bin 0 -> 16107 bytes Chromatism/Chromatism/ViewController.h | 13 + Chromatism/Chromatism/ViewController.m | 29 ++ .../Chromatism/en.lproj/InfoPlist.strings | 2 + .../en.lproj/MainStoryboard_iPad.storyboard | 26 + .../en.lproj/MainStoryboard_iPhone.storyboard | 26 + Chromatism/Chromatism/main.m | 18 + .../ChromatismTests-Info.plist | 22 + Chromatism/ChromatismTests/ChromatismTests.h | 13 + Chromatism/ChromatismTests/ChromatismTests.m | 32 ++ .../en.lproj/InfoPlist.strings | 2 + Chromatism/Default-568h@2x.png | Bin 0 -> 18594 bytes Chromatism/Default.png | Bin 0 -> 6540 bytes Chromatism/Default@2x.png | Bin 0 -> 16107 bytes Chromatism/ViewController.h | 13 + Chromatism/ViewController.m | 29 ++ Chromatism/en.lproj/InfoPlist.strings | 2 + .../en.lproj/MainStoryboard_iPad.storyboard | 26 + .../en.lproj/MainStoryboard_iPhone.storyboard | 26 + Chromatism/main.m | 18 + ChromatismTests/ChromatismTests-Info.plist | 22 + ChromatismTests/ChromatismTests.h | 13 + ChromatismTests/ChromatismTests.m | 32 ++ ChromatismTests/en.lproj/InfoPlist.strings | 2 + 36 files changed, 1578 insertions(+) create mode 100644 Chromatism.xcodeproj/project.pbxproj create mode 100644 Chromatism/AppDelegate.h create mode 100644 Chromatism/AppDelegate.m create mode 100644 Chromatism/Chromatism-Info.plist create mode 100644 Chromatism/Chromatism-Prefix.pch create mode 100644 Chromatism/Chromatism.xcodeproj/project.pbxproj create mode 100644 Chromatism/Chromatism/AppDelegate.h create mode 100644 Chromatism/Chromatism/AppDelegate.m create mode 100644 Chromatism/Chromatism/Chromatism-Info.plist create mode 100644 Chromatism/Chromatism/Chromatism-Prefix.pch create mode 100644 Chromatism/Chromatism/Default-568h@2x.png create mode 100644 Chromatism/Chromatism/Default.png create mode 100644 Chromatism/Chromatism/Default@2x.png create mode 100644 Chromatism/Chromatism/ViewController.h create mode 100644 Chromatism/Chromatism/ViewController.m create mode 100644 Chromatism/Chromatism/en.lproj/InfoPlist.strings create mode 100644 Chromatism/Chromatism/en.lproj/MainStoryboard_iPad.storyboard create mode 100644 Chromatism/Chromatism/en.lproj/MainStoryboard_iPhone.storyboard create mode 100644 Chromatism/Chromatism/main.m create mode 100644 Chromatism/ChromatismTests/ChromatismTests-Info.plist create mode 100644 Chromatism/ChromatismTests/ChromatismTests.h create mode 100644 Chromatism/ChromatismTests/ChromatismTests.m create mode 100644 Chromatism/ChromatismTests/en.lproj/InfoPlist.strings create mode 100644 Chromatism/Default-568h@2x.png create mode 100644 Chromatism/Default.png create mode 100644 Chromatism/Default@2x.png create mode 100644 Chromatism/ViewController.h create mode 100644 Chromatism/ViewController.m create mode 100644 Chromatism/en.lproj/InfoPlist.strings create mode 100644 Chromatism/en.lproj/MainStoryboard_iPad.storyboard create mode 100644 Chromatism/en.lproj/MainStoryboard_iPhone.storyboard create mode 100644 Chromatism/main.m create mode 100644 ChromatismTests/ChromatismTests-Info.plist create mode 100644 ChromatismTests/ChromatismTests.h create mode 100644 ChromatismTests/ChromatismTests.m create mode 100644 ChromatismTests/en.lproj/InfoPlist.strings diff --git a/Chromatism.xcodeproj/project.pbxproj b/Chromatism.xcodeproj/project.pbxproj new file mode 100644 index 0000000..bca5a12 --- /dev/null +++ b/Chromatism.xcodeproj/project.pbxproj @@ -0,0 +1,482 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 8F0F057A169C98770060CB48 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F0F0579169C98770060CB48 /* UIKit.framework */; }; + 8F0F057C169C98770060CB48 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F0F057B169C98770060CB48 /* Foundation.framework */; }; + 8F0F057E169C98770060CB48 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F0F057D169C98770060CB48 /* CoreGraphics.framework */; }; + 8F0F0584169C98770060CB48 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 8F0F0582169C98770060CB48 /* InfoPlist.strings */; }; + 8F0F0586169C98770060CB48 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F0F0585169C98770060CB48 /* main.m */; }; + 8F0F058A169C98770060CB48 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F0F0589169C98770060CB48 /* AppDelegate.m */; }; + 8F0F058C169C98770060CB48 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 8F0F058B169C98770060CB48 /* Default.png */; }; + 8F0F058E169C98770060CB48 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8F0F058D169C98770060CB48 /* Default@2x.png */; }; + 8F0F0590169C98770060CB48 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8F0F058F169C98770060CB48 /* Default-568h@2x.png */; }; + 8F0F0593169C98770060CB48 /* MainStoryboard_iPhone.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8F0F0591169C98770060CB48 /* MainStoryboard_iPhone.storyboard */; }; + 8F0F0596169C98770060CB48 /* MainStoryboard_iPad.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8F0F0594169C98770060CB48 /* MainStoryboard_iPad.storyboard */; }; + 8F0F0599169C98770060CB48 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F0F0598169C98770060CB48 /* ViewController.m */; }; + 8F0F05A1169C98770060CB48 /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F0F05A0169C98770060CB48 /* SenTestingKit.framework */; }; + 8F0F05A2169C98770060CB48 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F0F0579169C98770060CB48 /* UIKit.framework */; }; + 8F0F05A3169C98770060CB48 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F0F057B169C98770060CB48 /* Foundation.framework */; }; + 8F0F05AB169C98770060CB48 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 8F0F05A9169C98770060CB48 /* InfoPlist.strings */; }; + 8F0F05AE169C98770060CB48 /* ChromatismTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F0F05AD169C98770060CB48 /* ChromatismTests.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 8F0F05A4169C98770060CB48 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 8F0F056E169C98770060CB48 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8F0F0575169C98770060CB48; + remoteInfo = Chromatism; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 8F0F0576169C98770060CB48 /* Chromatism.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Chromatism.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 8F0F0579169C98770060CB48 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + 8F0F057B169C98770060CB48 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 8F0F057D169C98770060CB48 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; + 8F0F0581169C98770060CB48 /* Chromatism-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Chromatism-Info.plist"; sourceTree = ""; }; + 8F0F0583169C98770060CB48 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 8F0F0585169C98770060CB48 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 8F0F0587169C98770060CB48 /* Chromatism-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Chromatism-Prefix.pch"; sourceTree = ""; }; + 8F0F0588169C98770060CB48 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 8F0F0589169C98770060CB48 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 8F0F058B169C98770060CB48 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = ""; }; + 8F0F058D169C98770060CB48 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x.png"; sourceTree = ""; }; + 8F0F058F169C98770060CB48 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; + 8F0F0592169C98770060CB48 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainStoryboard_iPhone.storyboard; sourceTree = ""; }; + 8F0F0595169C98770060CB48 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainStoryboard_iPad.storyboard; sourceTree = ""; }; + 8F0F0597169C98770060CB48 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; + 8F0F0598169C98770060CB48 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; + 8F0F059F169C98770060CB48 /* ChromatismTests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ChromatismTests.octest; sourceTree = BUILT_PRODUCTS_DIR; }; + 8F0F05A0169C98770060CB48 /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; }; + 8F0F05A8169C98770060CB48 /* ChromatismTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ChromatismTests-Info.plist"; sourceTree = ""; }; + 8F0F05AA169C98770060CB48 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 8F0F05AC169C98770060CB48 /* ChromatismTests.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ChromatismTests.h; sourceTree = ""; }; + 8F0F05AD169C98770060CB48 /* ChromatismTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ChromatismTests.m; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8F0F0573169C98770060CB48 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 8F0F057A169C98770060CB48 /* UIKit.framework in Frameworks */, + 8F0F057C169C98770060CB48 /* Foundation.framework in Frameworks */, + 8F0F057E169C98770060CB48 /* CoreGraphics.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8F0F059B169C98770060CB48 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 8F0F05A1169C98770060CB48 /* SenTestingKit.framework in Frameworks */, + 8F0F05A2169C98770060CB48 /* UIKit.framework in Frameworks */, + 8F0F05A3169C98770060CB48 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 8F0F056D169C98770060CB48 = { + isa = PBXGroup; + children = ( + 8F0F057F169C98770060CB48 /* Chromatism */, + 8F0F05A6169C98770060CB48 /* ChromatismTests */, + 8F0F0578169C98770060CB48 /* Frameworks */, + 8F0F0577169C98770060CB48 /* Products */, + ); + sourceTree = ""; + }; + 8F0F0577169C98770060CB48 /* Products */ = { + isa = PBXGroup; + children = ( + 8F0F0576169C98770060CB48 /* Chromatism.app */, + 8F0F059F169C98770060CB48 /* ChromatismTests.octest */, + ); + name = Products; + sourceTree = ""; + }; + 8F0F0578169C98770060CB48 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 8F0F0579169C98770060CB48 /* UIKit.framework */, + 8F0F057B169C98770060CB48 /* Foundation.framework */, + 8F0F057D169C98770060CB48 /* CoreGraphics.framework */, + 8F0F05A0169C98770060CB48 /* SenTestingKit.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 8F0F057F169C98770060CB48 /* Chromatism */ = { + isa = PBXGroup; + children = ( + 8F0F0588169C98770060CB48 /* AppDelegate.h */, + 8F0F0589169C98770060CB48 /* AppDelegate.m */, + 8F0F0591169C98770060CB48 /* MainStoryboard_iPhone.storyboard */, + 8F0F0594169C98770060CB48 /* MainStoryboard_iPad.storyboard */, + 8F0F0597169C98770060CB48 /* ViewController.h */, + 8F0F0598169C98770060CB48 /* ViewController.m */, + 8F0F0580169C98770060CB48 /* Supporting Files */, + ); + path = Chromatism; + sourceTree = ""; + }; + 8F0F0580169C98770060CB48 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 8F0F0581169C98770060CB48 /* Chromatism-Info.plist */, + 8F0F0582169C98770060CB48 /* InfoPlist.strings */, + 8F0F0585169C98770060CB48 /* main.m */, + 8F0F0587169C98770060CB48 /* Chromatism-Prefix.pch */, + 8F0F058B169C98770060CB48 /* Default.png */, + 8F0F058D169C98770060CB48 /* Default@2x.png */, + 8F0F058F169C98770060CB48 /* Default-568h@2x.png */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 8F0F05A6169C98770060CB48 /* ChromatismTests */ = { + isa = PBXGroup; + children = ( + 8F0F05AC169C98770060CB48 /* ChromatismTests.h */, + 8F0F05AD169C98770060CB48 /* ChromatismTests.m */, + 8F0F05A7169C98770060CB48 /* Supporting Files */, + ); + path = ChromatismTests; + sourceTree = ""; + }; + 8F0F05A7169C98770060CB48 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 8F0F05A8169C98770060CB48 /* ChromatismTests-Info.plist */, + 8F0F05A9169C98770060CB48 /* InfoPlist.strings */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 8F0F0575169C98770060CB48 /* Chromatism */ = { + isa = PBXNativeTarget; + buildConfigurationList = 8F0F05B1169C98770060CB48 /* Build configuration list for PBXNativeTarget "Chromatism" */; + buildPhases = ( + 8F0F0572169C98770060CB48 /* Sources */, + 8F0F0573169C98770060CB48 /* Frameworks */, + 8F0F0574169C98770060CB48 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Chromatism; + productName = Chromatism; + productReference = 8F0F0576169C98770060CB48 /* Chromatism.app */; + productType = "com.apple.product-type.application"; + }; + 8F0F059E169C98770060CB48 /* ChromatismTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 8F0F05B4169C98770060CB48 /* Build configuration list for PBXNativeTarget "ChromatismTests" */; + buildPhases = ( + 8F0F059A169C98770060CB48 /* Sources */, + 8F0F059B169C98770060CB48 /* Frameworks */, + 8F0F059C169C98770060CB48 /* Resources */, + 8F0F059D169C98770060CB48 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + 8F0F05A5169C98770060CB48 /* PBXTargetDependency */, + ); + name = ChromatismTests; + productName = ChromatismTests; + productReference = 8F0F059F169C98770060CB48 /* ChromatismTests.octest */; + productType = "com.apple.product-type.bundle"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 8F0F056E169C98770060CB48 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0460; + ORGANIZATIONNAME = Anviking; + }; + buildConfigurationList = 8F0F0571169C98770060CB48 /* Build configuration list for PBXProject "Chromatism" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 8F0F056D169C98770060CB48; + productRefGroup = 8F0F0577169C98770060CB48 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 8F0F0575169C98770060CB48 /* Chromatism */, + 8F0F059E169C98770060CB48 /* ChromatismTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 8F0F0574169C98770060CB48 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8F0F0584169C98770060CB48 /* InfoPlist.strings in Resources */, + 8F0F058C169C98770060CB48 /* Default.png in Resources */, + 8F0F058E169C98770060CB48 /* Default@2x.png in Resources */, + 8F0F0590169C98770060CB48 /* Default-568h@2x.png in Resources */, + 8F0F0593169C98770060CB48 /* MainStoryboard_iPhone.storyboard in Resources */, + 8F0F0596169C98770060CB48 /* MainStoryboard_iPad.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8F0F059C169C98770060CB48 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8F0F05AB169C98770060CB48 /* InfoPlist.strings in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 8F0F059D169C98770060CB48 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 8F0F0572169C98770060CB48 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8F0F0586169C98770060CB48 /* main.m in Sources */, + 8F0F058A169C98770060CB48 /* AppDelegate.m in Sources */, + 8F0F0599169C98770060CB48 /* ViewController.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8F0F059A169C98770060CB48 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8F0F05AE169C98770060CB48 /* ChromatismTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 8F0F05A5169C98770060CB48 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 8F0F0575169C98770060CB48 /* Chromatism */; + targetProxy = 8F0F05A4169C98770060CB48 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 8F0F0582169C98770060CB48 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 8F0F0583169C98770060CB48 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 8F0F0591169C98770060CB48 /* MainStoryboard_iPhone.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 8F0F0592169C98770060CB48 /* en */, + ); + name = MainStoryboard_iPhone.storyboard; + sourceTree = ""; + }; + 8F0F0594169C98770060CB48 /* MainStoryboard_iPad.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 8F0F0595169C98770060CB48 /* en */, + ); + name = MainStoryboard_iPad.storyboard; + sourceTree = ""; + }; + 8F0F05A9169C98770060CB48 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 8F0F05AA169C98770060CB48 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 8F0F05AF169C98770060CB48 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 6.1; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 8F0F05B0169C98770060CB48 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 6.1; + OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 8F0F05B2169C98770060CB48 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Chromatism/Chromatism-Prefix.pch"; + INFOPLIST_FILE = "Chromatism/Chromatism-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + 8F0F05B3169C98770060CB48 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Chromatism/Chromatism-Prefix.pch"; + INFOPLIST_FILE = "Chromatism/Chromatism-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; + 8F0F05B5169C98770060CB48 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/Chromatism.app/Chromatism"; + FRAMEWORK_SEARCH_PATHS = ( + "\"$(SDKROOT)/Developer/Library/Frameworks\"", + "\"$(DEVELOPER_LIBRARY_DIR)/Frameworks\"", + ); + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Chromatism/Chromatism-Prefix.pch"; + INFOPLIST_FILE = "ChromatismTests/ChromatismTests-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUNDLE_LOADER)"; + WRAPPER_EXTENSION = octest; + }; + name = Debug; + }; + 8F0F05B6169C98770060CB48 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/Chromatism.app/Chromatism"; + FRAMEWORK_SEARCH_PATHS = ( + "\"$(SDKROOT)/Developer/Library/Frameworks\"", + "\"$(DEVELOPER_LIBRARY_DIR)/Frameworks\"", + ); + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Chromatism/Chromatism-Prefix.pch"; + INFOPLIST_FILE = "ChromatismTests/ChromatismTests-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUNDLE_LOADER)"; + WRAPPER_EXTENSION = octest; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 8F0F0571169C98770060CB48 /* Build configuration list for PBXProject "Chromatism" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 8F0F05AF169C98770060CB48 /* Debug */, + 8F0F05B0169C98770060CB48 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 8F0F05B1169C98770060CB48 /* Build configuration list for PBXNativeTarget "Chromatism" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 8F0F05B2169C98770060CB48 /* Debug */, + 8F0F05B3169C98770060CB48 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; + 8F0F05B4169C98770060CB48 /* Build configuration list for PBXNativeTarget "ChromatismTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 8F0F05B5169C98770060CB48 /* Debug */, + 8F0F05B6169C98770060CB48 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; +/* End XCConfigurationList section */ + }; + rootObject = 8F0F056E169C98770060CB48 /* Project object */; +} diff --git a/Chromatism/AppDelegate.h b/Chromatism/AppDelegate.h new file mode 100644 index 0000000..c22f5bf --- /dev/null +++ b/Chromatism/AppDelegate.h @@ -0,0 +1,15 @@ +// +// AppDelegate.h +// Chromatism +// +// Created by Johannes Lund on 2013-01-08. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import + +@interface AppDelegate : UIResponder + +@property (strong, nonatomic) UIWindow *window; + +@end diff --git a/Chromatism/AppDelegate.m b/Chromatism/AppDelegate.m new file mode 100644 index 0000000..9d271c5 --- /dev/null +++ b/Chromatism/AppDelegate.m @@ -0,0 +1,46 @@ +// +// AppDelegate.m +// Chromatism +// +// Created by Johannes Lund on 2013-01-08. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import "AppDelegate.h" + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ + // Override point for customization after application launch. + return YES; +} + +- (void)applicationWillResignActive:(UIApplication *)application +{ + // 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. + // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. +} + +- (void)applicationDidEnterBackground:(UIApplication *)application +{ + // 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. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. +} + +- (void)applicationWillEnterForeground:(UIApplication *)application +{ + // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. +} + +- (void)applicationDidBecomeActive:(UIApplication *)application +{ + // 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. +} + +- (void)applicationWillTerminate:(UIApplication *)application +{ + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. +} + +@end diff --git a/Chromatism/Chromatism-Info.plist b/Chromatism/Chromatism-Info.plist new file mode 100644 index 0000000..a8200f6 --- /dev/null +++ b/Chromatism/Chromatism-Info.plist @@ -0,0 +1,49 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + ${PRODUCT_NAME} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + anviking.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + LSRequiresIPhoneOS + + UIMainStoryboardFile + MainStoryboard_iPhone + UIMainStoryboardFile~ipad + MainStoryboard_iPad + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/Chromatism/Chromatism-Prefix.pch b/Chromatism/Chromatism-Prefix.pch new file mode 100644 index 0000000..3a6a08c --- /dev/null +++ b/Chromatism/Chromatism-Prefix.pch @@ -0,0 +1,14 @@ +// +// Prefix header for all source files of the 'Chromatism' target in the 'Chromatism' project +// + +#import + +#ifndef __IPHONE_5_0 +#warning "This project uses features only available in iOS SDK 5.0 and later." +#endif + +#ifdef __OBJC__ + #import + #import +#endif diff --git a/Chromatism/Chromatism.xcodeproj/project.pbxproj b/Chromatism/Chromatism.xcodeproj/project.pbxproj new file mode 100644 index 0000000..bca5a12 --- /dev/null +++ b/Chromatism/Chromatism.xcodeproj/project.pbxproj @@ -0,0 +1,482 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 8F0F057A169C98770060CB48 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F0F0579169C98770060CB48 /* UIKit.framework */; }; + 8F0F057C169C98770060CB48 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F0F057B169C98770060CB48 /* Foundation.framework */; }; + 8F0F057E169C98770060CB48 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F0F057D169C98770060CB48 /* CoreGraphics.framework */; }; + 8F0F0584169C98770060CB48 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 8F0F0582169C98770060CB48 /* InfoPlist.strings */; }; + 8F0F0586169C98770060CB48 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F0F0585169C98770060CB48 /* main.m */; }; + 8F0F058A169C98770060CB48 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F0F0589169C98770060CB48 /* AppDelegate.m */; }; + 8F0F058C169C98770060CB48 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 8F0F058B169C98770060CB48 /* Default.png */; }; + 8F0F058E169C98770060CB48 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8F0F058D169C98770060CB48 /* Default@2x.png */; }; + 8F0F0590169C98770060CB48 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8F0F058F169C98770060CB48 /* Default-568h@2x.png */; }; + 8F0F0593169C98770060CB48 /* MainStoryboard_iPhone.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8F0F0591169C98770060CB48 /* MainStoryboard_iPhone.storyboard */; }; + 8F0F0596169C98770060CB48 /* MainStoryboard_iPad.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8F0F0594169C98770060CB48 /* MainStoryboard_iPad.storyboard */; }; + 8F0F0599169C98770060CB48 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F0F0598169C98770060CB48 /* ViewController.m */; }; + 8F0F05A1169C98770060CB48 /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F0F05A0169C98770060CB48 /* SenTestingKit.framework */; }; + 8F0F05A2169C98770060CB48 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F0F0579169C98770060CB48 /* UIKit.framework */; }; + 8F0F05A3169C98770060CB48 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F0F057B169C98770060CB48 /* Foundation.framework */; }; + 8F0F05AB169C98770060CB48 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 8F0F05A9169C98770060CB48 /* InfoPlist.strings */; }; + 8F0F05AE169C98770060CB48 /* ChromatismTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F0F05AD169C98770060CB48 /* ChromatismTests.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 8F0F05A4169C98770060CB48 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 8F0F056E169C98770060CB48 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8F0F0575169C98770060CB48; + remoteInfo = Chromatism; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 8F0F0576169C98770060CB48 /* Chromatism.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Chromatism.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 8F0F0579169C98770060CB48 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + 8F0F057B169C98770060CB48 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 8F0F057D169C98770060CB48 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; + 8F0F0581169C98770060CB48 /* Chromatism-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Chromatism-Info.plist"; sourceTree = ""; }; + 8F0F0583169C98770060CB48 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 8F0F0585169C98770060CB48 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 8F0F0587169C98770060CB48 /* Chromatism-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Chromatism-Prefix.pch"; sourceTree = ""; }; + 8F0F0588169C98770060CB48 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 8F0F0589169C98770060CB48 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 8F0F058B169C98770060CB48 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = ""; }; + 8F0F058D169C98770060CB48 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x.png"; sourceTree = ""; }; + 8F0F058F169C98770060CB48 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; + 8F0F0592169C98770060CB48 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainStoryboard_iPhone.storyboard; sourceTree = ""; }; + 8F0F0595169C98770060CB48 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainStoryboard_iPad.storyboard; sourceTree = ""; }; + 8F0F0597169C98770060CB48 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; + 8F0F0598169C98770060CB48 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; + 8F0F059F169C98770060CB48 /* ChromatismTests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ChromatismTests.octest; sourceTree = BUILT_PRODUCTS_DIR; }; + 8F0F05A0169C98770060CB48 /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; }; + 8F0F05A8169C98770060CB48 /* ChromatismTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ChromatismTests-Info.plist"; sourceTree = ""; }; + 8F0F05AA169C98770060CB48 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 8F0F05AC169C98770060CB48 /* ChromatismTests.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ChromatismTests.h; sourceTree = ""; }; + 8F0F05AD169C98770060CB48 /* ChromatismTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ChromatismTests.m; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8F0F0573169C98770060CB48 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 8F0F057A169C98770060CB48 /* UIKit.framework in Frameworks */, + 8F0F057C169C98770060CB48 /* Foundation.framework in Frameworks */, + 8F0F057E169C98770060CB48 /* CoreGraphics.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8F0F059B169C98770060CB48 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 8F0F05A1169C98770060CB48 /* SenTestingKit.framework in Frameworks */, + 8F0F05A2169C98770060CB48 /* UIKit.framework in Frameworks */, + 8F0F05A3169C98770060CB48 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 8F0F056D169C98770060CB48 = { + isa = PBXGroup; + children = ( + 8F0F057F169C98770060CB48 /* Chromatism */, + 8F0F05A6169C98770060CB48 /* ChromatismTests */, + 8F0F0578169C98770060CB48 /* Frameworks */, + 8F0F0577169C98770060CB48 /* Products */, + ); + sourceTree = ""; + }; + 8F0F0577169C98770060CB48 /* Products */ = { + isa = PBXGroup; + children = ( + 8F0F0576169C98770060CB48 /* Chromatism.app */, + 8F0F059F169C98770060CB48 /* ChromatismTests.octest */, + ); + name = Products; + sourceTree = ""; + }; + 8F0F0578169C98770060CB48 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 8F0F0579169C98770060CB48 /* UIKit.framework */, + 8F0F057B169C98770060CB48 /* Foundation.framework */, + 8F0F057D169C98770060CB48 /* CoreGraphics.framework */, + 8F0F05A0169C98770060CB48 /* SenTestingKit.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 8F0F057F169C98770060CB48 /* Chromatism */ = { + isa = PBXGroup; + children = ( + 8F0F0588169C98770060CB48 /* AppDelegate.h */, + 8F0F0589169C98770060CB48 /* AppDelegate.m */, + 8F0F0591169C98770060CB48 /* MainStoryboard_iPhone.storyboard */, + 8F0F0594169C98770060CB48 /* MainStoryboard_iPad.storyboard */, + 8F0F0597169C98770060CB48 /* ViewController.h */, + 8F0F0598169C98770060CB48 /* ViewController.m */, + 8F0F0580169C98770060CB48 /* Supporting Files */, + ); + path = Chromatism; + sourceTree = ""; + }; + 8F0F0580169C98770060CB48 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 8F0F0581169C98770060CB48 /* Chromatism-Info.plist */, + 8F0F0582169C98770060CB48 /* InfoPlist.strings */, + 8F0F0585169C98770060CB48 /* main.m */, + 8F0F0587169C98770060CB48 /* Chromatism-Prefix.pch */, + 8F0F058B169C98770060CB48 /* Default.png */, + 8F0F058D169C98770060CB48 /* Default@2x.png */, + 8F0F058F169C98770060CB48 /* Default-568h@2x.png */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 8F0F05A6169C98770060CB48 /* ChromatismTests */ = { + isa = PBXGroup; + children = ( + 8F0F05AC169C98770060CB48 /* ChromatismTests.h */, + 8F0F05AD169C98770060CB48 /* ChromatismTests.m */, + 8F0F05A7169C98770060CB48 /* Supporting Files */, + ); + path = ChromatismTests; + sourceTree = ""; + }; + 8F0F05A7169C98770060CB48 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 8F0F05A8169C98770060CB48 /* ChromatismTests-Info.plist */, + 8F0F05A9169C98770060CB48 /* InfoPlist.strings */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 8F0F0575169C98770060CB48 /* Chromatism */ = { + isa = PBXNativeTarget; + buildConfigurationList = 8F0F05B1169C98770060CB48 /* Build configuration list for PBXNativeTarget "Chromatism" */; + buildPhases = ( + 8F0F0572169C98770060CB48 /* Sources */, + 8F0F0573169C98770060CB48 /* Frameworks */, + 8F0F0574169C98770060CB48 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Chromatism; + productName = Chromatism; + productReference = 8F0F0576169C98770060CB48 /* Chromatism.app */; + productType = "com.apple.product-type.application"; + }; + 8F0F059E169C98770060CB48 /* ChromatismTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 8F0F05B4169C98770060CB48 /* Build configuration list for PBXNativeTarget "ChromatismTests" */; + buildPhases = ( + 8F0F059A169C98770060CB48 /* Sources */, + 8F0F059B169C98770060CB48 /* Frameworks */, + 8F0F059C169C98770060CB48 /* Resources */, + 8F0F059D169C98770060CB48 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + 8F0F05A5169C98770060CB48 /* PBXTargetDependency */, + ); + name = ChromatismTests; + productName = ChromatismTests; + productReference = 8F0F059F169C98770060CB48 /* ChromatismTests.octest */; + productType = "com.apple.product-type.bundle"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 8F0F056E169C98770060CB48 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0460; + ORGANIZATIONNAME = Anviking; + }; + buildConfigurationList = 8F0F0571169C98770060CB48 /* Build configuration list for PBXProject "Chromatism" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 8F0F056D169C98770060CB48; + productRefGroup = 8F0F0577169C98770060CB48 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 8F0F0575169C98770060CB48 /* Chromatism */, + 8F0F059E169C98770060CB48 /* ChromatismTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 8F0F0574169C98770060CB48 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8F0F0584169C98770060CB48 /* InfoPlist.strings in Resources */, + 8F0F058C169C98770060CB48 /* Default.png in Resources */, + 8F0F058E169C98770060CB48 /* Default@2x.png in Resources */, + 8F0F0590169C98770060CB48 /* Default-568h@2x.png in Resources */, + 8F0F0593169C98770060CB48 /* MainStoryboard_iPhone.storyboard in Resources */, + 8F0F0596169C98770060CB48 /* MainStoryboard_iPad.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8F0F059C169C98770060CB48 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8F0F05AB169C98770060CB48 /* InfoPlist.strings in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 8F0F059D169C98770060CB48 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 8F0F0572169C98770060CB48 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8F0F0586169C98770060CB48 /* main.m in Sources */, + 8F0F058A169C98770060CB48 /* AppDelegate.m in Sources */, + 8F0F0599169C98770060CB48 /* ViewController.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8F0F059A169C98770060CB48 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8F0F05AE169C98770060CB48 /* ChromatismTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 8F0F05A5169C98770060CB48 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 8F0F0575169C98770060CB48 /* Chromatism */; + targetProxy = 8F0F05A4169C98770060CB48 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 8F0F0582169C98770060CB48 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 8F0F0583169C98770060CB48 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 8F0F0591169C98770060CB48 /* MainStoryboard_iPhone.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 8F0F0592169C98770060CB48 /* en */, + ); + name = MainStoryboard_iPhone.storyboard; + sourceTree = ""; + }; + 8F0F0594169C98770060CB48 /* MainStoryboard_iPad.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 8F0F0595169C98770060CB48 /* en */, + ); + name = MainStoryboard_iPad.storyboard; + sourceTree = ""; + }; + 8F0F05A9169C98770060CB48 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 8F0F05AA169C98770060CB48 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 8F0F05AF169C98770060CB48 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 6.1; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 8F0F05B0169C98770060CB48 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 6.1; + OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 8F0F05B2169C98770060CB48 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Chromatism/Chromatism-Prefix.pch"; + INFOPLIST_FILE = "Chromatism/Chromatism-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + 8F0F05B3169C98770060CB48 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Chromatism/Chromatism-Prefix.pch"; + INFOPLIST_FILE = "Chromatism/Chromatism-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; + 8F0F05B5169C98770060CB48 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/Chromatism.app/Chromatism"; + FRAMEWORK_SEARCH_PATHS = ( + "\"$(SDKROOT)/Developer/Library/Frameworks\"", + "\"$(DEVELOPER_LIBRARY_DIR)/Frameworks\"", + ); + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Chromatism/Chromatism-Prefix.pch"; + INFOPLIST_FILE = "ChromatismTests/ChromatismTests-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUNDLE_LOADER)"; + WRAPPER_EXTENSION = octest; + }; + name = Debug; + }; + 8F0F05B6169C98770060CB48 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/Chromatism.app/Chromatism"; + FRAMEWORK_SEARCH_PATHS = ( + "\"$(SDKROOT)/Developer/Library/Frameworks\"", + "\"$(DEVELOPER_LIBRARY_DIR)/Frameworks\"", + ); + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Chromatism/Chromatism-Prefix.pch"; + INFOPLIST_FILE = "ChromatismTests/ChromatismTests-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUNDLE_LOADER)"; + WRAPPER_EXTENSION = octest; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 8F0F0571169C98770060CB48 /* Build configuration list for PBXProject "Chromatism" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 8F0F05AF169C98770060CB48 /* Debug */, + 8F0F05B0169C98770060CB48 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 8F0F05B1169C98770060CB48 /* Build configuration list for PBXNativeTarget "Chromatism" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 8F0F05B2169C98770060CB48 /* Debug */, + 8F0F05B3169C98770060CB48 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; + 8F0F05B4169C98770060CB48 /* Build configuration list for PBXNativeTarget "ChromatismTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 8F0F05B5169C98770060CB48 /* Debug */, + 8F0F05B6169C98770060CB48 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; +/* End XCConfigurationList section */ + }; + rootObject = 8F0F056E169C98770060CB48 /* Project object */; +} diff --git a/Chromatism/Chromatism/AppDelegate.h b/Chromatism/Chromatism/AppDelegate.h new file mode 100644 index 0000000..c22f5bf --- /dev/null +++ b/Chromatism/Chromatism/AppDelegate.h @@ -0,0 +1,15 @@ +// +// AppDelegate.h +// Chromatism +// +// Created by Johannes Lund on 2013-01-08. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import + +@interface AppDelegate : UIResponder + +@property (strong, nonatomic) UIWindow *window; + +@end diff --git a/Chromatism/Chromatism/AppDelegate.m b/Chromatism/Chromatism/AppDelegate.m new file mode 100644 index 0000000..9d271c5 --- /dev/null +++ b/Chromatism/Chromatism/AppDelegate.m @@ -0,0 +1,46 @@ +// +// AppDelegate.m +// Chromatism +// +// Created by Johannes Lund on 2013-01-08. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import "AppDelegate.h" + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ + // Override point for customization after application launch. + return YES; +} + +- (void)applicationWillResignActive:(UIApplication *)application +{ + // 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. + // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. +} + +- (void)applicationDidEnterBackground:(UIApplication *)application +{ + // 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. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. +} + +- (void)applicationWillEnterForeground:(UIApplication *)application +{ + // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. +} + +- (void)applicationDidBecomeActive:(UIApplication *)application +{ + // 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. +} + +- (void)applicationWillTerminate:(UIApplication *)application +{ + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. +} + +@end diff --git a/Chromatism/Chromatism/Chromatism-Info.plist b/Chromatism/Chromatism/Chromatism-Info.plist new file mode 100644 index 0000000..a8200f6 --- /dev/null +++ b/Chromatism/Chromatism/Chromatism-Info.plist @@ -0,0 +1,49 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + ${PRODUCT_NAME} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + anviking.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + LSRequiresIPhoneOS + + UIMainStoryboardFile + MainStoryboard_iPhone + UIMainStoryboardFile~ipad + MainStoryboard_iPad + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/Chromatism/Chromatism/Chromatism-Prefix.pch b/Chromatism/Chromatism/Chromatism-Prefix.pch new file mode 100644 index 0000000..3a6a08c --- /dev/null +++ b/Chromatism/Chromatism/Chromatism-Prefix.pch @@ -0,0 +1,14 @@ +// +// Prefix header for all source files of the 'Chromatism' target in the 'Chromatism' project +// + +#import + +#ifndef __IPHONE_5_0 +#warning "This project uses features only available in iOS SDK 5.0 and later." +#endif + +#ifdef __OBJC__ + #import + #import +#endif diff --git a/Chromatism/Chromatism/Default-568h@2x.png b/Chromatism/Chromatism/Default-568h@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0891b7aabfcf3422423b109c8beed2bab838c607 GIT binary patch literal 18594 zcmeI4X;f257Jx&9fS`ixvS;&$x8J@slQFSel)6zJN=?13FB7H(lQjRkSy8x_-S~tvu2gzn1oS+dLcF#eqtq$ z%tf9TTvX?`)R@}3uBI;jzS-=ZR-Td&MHaS&;!0?Ni*#$#`n*~CcQK)Q9vAQ~TUpnI!j)a2biYK^R)M~A5wUDZhx?ULMX z3x1P&qt=trOY6P2U67L=m=U?F|5#Uj(eCueNTZaHs_ceWiHeET+j+tp3Jt9g(ekqP z2WOvfR{qV+9r+o4J5?qK>7;;^+I7tGv-i)es$X_D=EoKF+S?zsyj^oRFElP}c}JT< zd8SUs-?O?}2YD#ngKbnHgzHBcboxK_2r9l(?eNCl-pEzkJm}fY?WC*jnS?VBE4EpY zO$fEejz6fU;W2Kl>JeQBZBl-%Irg`obSlg*@4QB;Dd1H7^Oi5wvt4d{RZ!8Og?^aE z)k0$1g+V3fd(gdQ3d&q2q-FL*uy#}|bc^=VhFsl0jBgUGJ+-s3U8MK9A!YJJMxpci z5hJ%|{DwV48fZn0{n5l$N_KcSb#NKE4plB`9I6Zt=Z!~-zw0{9tg$L&Ju1F0X)Cy8 zKF;(&lJ>x)Jw(=;p~sF(Sd9VWGwFE2rnyS9!f^DZ8+aCLq zQ};>lcJ1GDLqjm6Hd>|Eabno@P`~Bn(~6^aD_#yoEH(a?Nm1S<;S+hSxI5d16^<1lEM3NPFi zkqPrpL)+ zgnseFikg`gJVBha1&7C4;O6>h=dt~`ND+;Zd?W(4v2JIb7Pt>Td42%M-Ju-XAH#Pns762L}K3 zDhvsRqN0Ni(1UrishD2YvV?4*h2iFj$+&N||Fn$4n|^NSU+o?~jq`0jVQt8T9l{7b zXiwwODFh2V!Q6sqP9S>WH$oOf$N~=d0-bqTlD61!=`&0eAP-F>XN?*|gtOXX{ zQVTWyYo4ZK0GAw!GHf|pz9`D;-bbb*5LBX*{bnz|+)$@&P9|ORM2o?95{;ejvo&r- zq8cBhTN6nn)7~W>54U)%-F_-b?YKdfk5I8MHcuzBD5)!;yv#Z&R&^y=@=>VTIMy#r zX&U<=BsPkdqcMe<_}2+>H%XKyrr5ZR8_KVe>ZqYN z^=^~TFD};;rHJ$U;{~w^hYojl4hRI@SH$^K{YEo=sg)WY87r!*7blQK&qnpDo0`Vn zkl)9u9g=mCh&ZCJS(L4yN3k0kQ zuvg$h2KEEk51T+O0JQ+r0`R>g{jvqM0Mr6d3qUOZwE!?PI7HY@CE|dr sfw?Q;rAv?G4&^^8-z_>&sWXMxvD*gPOU4CBe-*@OtE+wfmVJNyHv)PfH~;_u literal 0 HcmV?d00001 diff --git a/Chromatism/Chromatism/Default.png b/Chromatism/Chromatism/Default.png new file mode 100644 index 0000000000000000000000000000000000000000..4c8ca6f693f96d511e9113c0eb59eec552354e42 GIT binary patch literal 6540 zcmeAS@N?(olHy`uVBq!ia0y~yU~~ZD2OMlbkt;o0To@QwR5G2N13aCb6#|O#(=u~X z85k@CTSM>X-wqM6>&y>YB4)1;;ojbLbbV-W^iFB1wa3^zCog^LCAReC4K0-?R_2{6 zrP*)4+_uWUy3w5N52M3PW_}MFMP9a~>YLvVZ1D_k*IMQ2QT^fwzoOb(*3gH$%aYWC zkHmcab=va2<#X%jakpJ;<1@F;k__#bwtC&%^D0v(FBh9K&$sK+<}2RJS609D)17$w ztdQP8(eLM8Ka}m_IQ@3wyMKP)l=oM4-?`YS_*P?4V_ORLPxsj&7Ju#kH;>6^Kp?T7~ zl+q?{UOOqV==?+d{=)5s|M~T1mwtH@+Z^$G&eEO9JNP^AX@3jZ*J*!!>lc|1-W%fA z@AOQpXZ_Lt>rxFXrGp*zLPiW@uo_c7C{As>j zWeX)wi+LTp_)@KYZCX{j;H?|1yXT4DnlS(Fr8gyP5|uaX_gLvaW0ScZdnG7o+u{T6 zFI-%d{ls*WuCDa5UJ@|RXv&ejZe}*BMkiWY51&pnRPw(hlykSzvj6e%mYz-GdvzBD zF10?szF_~!jS=?2HyQuPCvARXAe}C}WP|yQ*>5~~=*Nxq8+HHW1~FMDRCP^TcacKuk$ z(U#REVv)D!PhJ*ecH-ELFUrfyV&*)Z)>UCOuS?yd^L@Afk>ihynYPc{^CRwu+JHX+#$@YsC4c|l0tGigsn@jy) zXD($Ouk>H+V(Mr6NQT0S9BFM~V6nkj;1OBOz`zY;a|<&v%$g$sEJPk;hD4M^`1)8S z=jZArrsOB3>Q&?x097+E*i={nnYpPYi3%0DIeEoa6}C!X6;?ntNLXJ<0j#7X+g2&U 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 literal 0 HcmV?d00001 diff --git a/Chromatism/Chromatism/ViewController.h b/Chromatism/Chromatism/ViewController.h new file mode 100644 index 0000000..f6630ca --- /dev/null +++ b/Chromatism/Chromatism/ViewController.h @@ -0,0 +1,13 @@ +// +// ViewController.h +// Chromatism +// +// Created by Johannes Lund on 2013-01-08. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import + +@interface ViewController : UIViewController + +@end diff --git a/Chromatism/Chromatism/ViewController.m b/Chromatism/Chromatism/ViewController.m new file mode 100644 index 0000000..8062964 --- /dev/null +++ b/Chromatism/Chromatism/ViewController.m @@ -0,0 +1,29 @@ +// +// ViewController.m +// Chromatism +// +// Created by Johannes Lund on 2013-01-08. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import "ViewController.h" + +@interface ViewController () + +@end + +@implementation ViewController + +- (void)viewDidLoad +{ + [super viewDidLoad]; + // Do any additional setup after loading the view, typically from a nib. +} + +- (void)didReceiveMemoryWarning +{ + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +@end diff --git a/Chromatism/Chromatism/en.lproj/InfoPlist.strings b/Chromatism/Chromatism/en.lproj/InfoPlist.strings new file mode 100644 index 0000000..477b28f --- /dev/null +++ b/Chromatism/Chromatism/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Chromatism/Chromatism/en.lproj/MainStoryboard_iPad.storyboard b/Chromatism/Chromatism/en.lproj/MainStoryboard_iPad.storyboard new file mode 100644 index 0000000..9fbe23e --- /dev/null +++ b/Chromatism/Chromatism/en.lproj/MainStoryboard_iPad.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Chromatism/Chromatism/en.lproj/MainStoryboard_iPhone.storyboard b/Chromatism/Chromatism/en.lproj/MainStoryboard_iPhone.storyboard new file mode 100644 index 0000000..c9acc6d --- /dev/null +++ b/Chromatism/Chromatism/en.lproj/MainStoryboard_iPhone.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Chromatism/Chromatism/main.m b/Chromatism/Chromatism/main.m new file mode 100644 index 0000000..b089aaf --- /dev/null +++ b/Chromatism/Chromatism/main.m @@ -0,0 +1,18 @@ +// +// main.m +// Chromatism +// +// Created by Johannes Lund on 2013-01-08. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import + +#import "AppDelegate.h" + +int main(int argc, char *argv[]) +{ + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/Chromatism/ChromatismTests/ChromatismTests-Info.plist b/Chromatism/ChromatismTests/ChromatismTests-Info.plist new file mode 100644 index 0000000..4b3d885 --- /dev/null +++ b/Chromatism/ChromatismTests/ChromatismTests-Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + anviking.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/Chromatism/ChromatismTests/ChromatismTests.h b/Chromatism/ChromatismTests/ChromatismTests.h new file mode 100644 index 0000000..98e9b87 --- /dev/null +++ b/Chromatism/ChromatismTests/ChromatismTests.h @@ -0,0 +1,13 @@ +// +// ChromatismTests.h +// ChromatismTests +// +// Created by Johannes Lund on 2013-01-08. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import + +@interface ChromatismTests : SenTestCase + +@end diff --git a/Chromatism/ChromatismTests/ChromatismTests.m b/Chromatism/ChromatismTests/ChromatismTests.m new file mode 100644 index 0000000..2c33df7 --- /dev/null +++ b/Chromatism/ChromatismTests/ChromatismTests.m @@ -0,0 +1,32 @@ +// +// ChromatismTests.m +// ChromatismTests +// +// Created by Johannes Lund on 2013-01-08. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import "ChromatismTests.h" + +@implementation ChromatismTests + +- (void)setUp +{ + [super setUp]; + + // Set-up code here. +} + +- (void)tearDown +{ + // Tear-down code here. + + [super tearDown]; +} + +- (void)testExample +{ + STFail(@"Unit tests are not implemented yet in ChromatismTests"); +} + +@end diff --git a/Chromatism/ChromatismTests/en.lproj/InfoPlist.strings b/Chromatism/ChromatismTests/en.lproj/InfoPlist.strings new file mode 100644 index 0000000..477b28f --- /dev/null +++ b/Chromatism/ChromatismTests/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Chromatism/Default-568h@2x.png b/Chromatism/Default-568h@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0891b7aabfcf3422423b109c8beed2bab838c607 GIT binary patch literal 18594 zcmeI4X;f257Jx&9fS`ixvS;&$x8J@slQFSel)6zJN=?13FB7H(lQjRkSy8x_-S~tvu2gzn1oS+dLcF#eqtq$ z%tf9TTvX?`)R@}3uBI;jzS-=ZR-Td&MHaS&;!0?Ni*#$#`n*~CcQK)Q9vAQ~TUpnI!j)a2biYK^R)M~A5wUDZhx?ULMX z3x1P&qt=trOY6P2U67L=m=U?F|5#Uj(eCueNTZaHs_ceWiHeET+j+tp3Jt9g(ekqP z2WOvfR{qV+9r+o4J5?qK>7;;^+I7tGv-i)es$X_D=EoKF+S?zsyj^oRFElP}c}JT< zd8SUs-?O?}2YD#ngKbnHgzHBcboxK_2r9l(?eNCl-pEzkJm}fY?WC*jnS?VBE4EpY zO$fEejz6fU;W2Kl>JeQBZBl-%Irg`obSlg*@4QB;Dd1H7^Oi5wvt4d{RZ!8Og?^aE z)k0$1g+V3fd(gdQ3d&q2q-FL*uy#}|bc^=VhFsl0jBgUGJ+-s3U8MK9A!YJJMxpci z5hJ%|{DwV48fZn0{n5l$N_KcSb#NKE4plB`9I6Zt=Z!~-zw0{9tg$L&Ju1F0X)Cy8 zKF;(&lJ>x)Jw(=;p~sF(Sd9VWGwFE2rnyS9!f^DZ8+aCLq zQ};>lcJ1GDLqjm6Hd>|Eabno@P`~Bn(~6^aD_#yoEH(a?Nm1S<;S+hSxI5d16^<1lEM3NPFi zkqPrpL)+ zgnseFikg`gJVBha1&7C4;O6>h=dt~`ND+;Zd?W(4v2JIb7Pt>Td42%M-Ju-XAH#Pns762L}K3 zDhvsRqN0Ni(1UrishD2YvV?4*h2iFj$+&N||Fn$4n|^NSU+o?~jq`0jVQt8T9l{7b zXiwwODFh2V!Q6sqP9S>WH$oOf$N~=d0-bqTlD61!=`&0eAP-F>XN?*|gtOXX{ zQVTWyYo4ZK0GAw!GHf|pz9`D;-bbb*5LBX*{bnz|+)$@&P9|ORM2o?95{;ejvo&r- zq8cBhTN6nn)7~W>54U)%-F_-b?YKdfk5I8MHcuzBD5)!;yv#Z&R&^y=@=>VTIMy#r zX&U<=BsPkdqcMe<_}2+>H%XKyrr5ZR8_KVe>ZqYN z^=^~TFD};;rHJ$U;{~w^hYojl4hRI@SH$^K{YEo=sg)WY87r!*7blQK&qnpDo0`Vn zkl)9u9g=mCh&ZCJS(L4yN3k0kQ zuvg$h2KEEk51T+O0JQ+r0`R>g{jvqM0Mr6d3qUOZwE!?PI7HY@CE|dr sfw?Q;rAv?G4&^^8-z_>&sWXMxvD*gPOU4CBe-*@OtE+wfmVJNyHv)PfH~;_u literal 0 HcmV?d00001 diff --git a/Chromatism/Default.png b/Chromatism/Default.png new file mode 100644 index 0000000000000000000000000000000000000000..4c8ca6f693f96d511e9113c0eb59eec552354e42 GIT binary patch literal 6540 zcmeAS@N?(olHy`uVBq!ia0y~yU~~ZD2OMlbkt;o0To@QwR5G2N13aCb6#|O#(=u~X z85k@CTSM>X-wqM6>&y>YB4)1;;ojbLbbV-W^iFB1wa3^zCog^LCAReC4K0-?R_2{6 zrP*)4+_uWUy3w5N52M3PW_}MFMP9a~>YLvVZ1D_k*IMQ2QT^fwzoOb(*3gH$%aYWC zkHmcab=va2<#X%jakpJ;<1@F;k__#bwtC&%^D0v(FBh9K&$sK+<}2RJS609D)17$w ztdQP8(eLM8Ka}m_IQ@3wyMKP)l=oM4-?`YS_*P?4V_ORLPxsj&7Ju#kH;>6^Kp?T7~ zl+q?{UOOqV==?+d{=)5s|M~T1mwtH@+Z^$G&eEO9JNP^AX@3jZ*J*!!>lc|1-W%fA z@AOQpXZ_Lt>rxFXrGp*zLPiW@uo_c7C{As>j zWeX)wi+LTp_)@KYZCX{j;H?|1yXT4DnlS(Fr8gyP5|uaX_gLvaW0ScZdnG7o+u{T6 zFI-%d{ls*WuCDa5UJ@|RXv&ejZe}*BMkiWY51&pnRPw(hlykSzvj6e%mYz-GdvzBD zF10?szF_~!jS=?2HyQuPCvARXAe}C}WP|yQ*>5~~=*Nxq8+HHW1~FMDRCP^TcacKuk$ z(U#REVv)D!PhJ*ecH-ELFUrfyV&*)Z)>UCOuS?yd^L@Afk>ihynYPc{^CRwu+JHX+#$@YsC4c|l0tGigsn@jy) zXD($Ouk>H+V(Mr6NQT0S9BFM~V6nkj;1OBOz`zY;a|<&v%$g$sEJPk;hD4M^`1)8S z=jZArrsOB3>Q&?x097+E*i={nnYpPYi3%0DIeEoa6}C!X6;?ntNLXJ<0j#7X+g2&U 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 literal 0 HcmV?d00001 diff --git a/Chromatism/ViewController.h b/Chromatism/ViewController.h new file mode 100644 index 0000000..f6630ca --- /dev/null +++ b/Chromatism/ViewController.h @@ -0,0 +1,13 @@ +// +// ViewController.h +// Chromatism +// +// Created by Johannes Lund on 2013-01-08. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import + +@interface ViewController : UIViewController + +@end diff --git a/Chromatism/ViewController.m b/Chromatism/ViewController.m new file mode 100644 index 0000000..8062964 --- /dev/null +++ b/Chromatism/ViewController.m @@ -0,0 +1,29 @@ +// +// ViewController.m +// Chromatism +// +// Created by Johannes Lund on 2013-01-08. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import "ViewController.h" + +@interface ViewController () + +@end + +@implementation ViewController + +- (void)viewDidLoad +{ + [super viewDidLoad]; + // Do any additional setup after loading the view, typically from a nib. +} + +- (void)didReceiveMemoryWarning +{ + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +@end diff --git a/Chromatism/en.lproj/InfoPlist.strings b/Chromatism/en.lproj/InfoPlist.strings new file mode 100644 index 0000000..477b28f --- /dev/null +++ b/Chromatism/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Chromatism/en.lproj/MainStoryboard_iPad.storyboard b/Chromatism/en.lproj/MainStoryboard_iPad.storyboard new file mode 100644 index 0000000..9fbe23e --- /dev/null +++ b/Chromatism/en.lproj/MainStoryboard_iPad.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Chromatism/en.lproj/MainStoryboard_iPhone.storyboard b/Chromatism/en.lproj/MainStoryboard_iPhone.storyboard new file mode 100644 index 0000000..c9acc6d --- /dev/null +++ b/Chromatism/en.lproj/MainStoryboard_iPhone.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Chromatism/main.m b/Chromatism/main.m new file mode 100644 index 0000000..b089aaf --- /dev/null +++ b/Chromatism/main.m @@ -0,0 +1,18 @@ +// +// main.m +// Chromatism +// +// Created by Johannes Lund on 2013-01-08. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import + +#import "AppDelegate.h" + +int main(int argc, char *argv[]) +{ + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/ChromatismTests/ChromatismTests-Info.plist b/ChromatismTests/ChromatismTests-Info.plist new file mode 100644 index 0000000..4b3d885 --- /dev/null +++ b/ChromatismTests/ChromatismTests-Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + anviking.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/ChromatismTests/ChromatismTests.h b/ChromatismTests/ChromatismTests.h new file mode 100644 index 0000000..98e9b87 --- /dev/null +++ b/ChromatismTests/ChromatismTests.h @@ -0,0 +1,13 @@ +// +// ChromatismTests.h +// ChromatismTests +// +// Created by Johannes Lund on 2013-01-08. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import + +@interface ChromatismTests : SenTestCase + +@end diff --git a/ChromatismTests/ChromatismTests.m b/ChromatismTests/ChromatismTests.m new file mode 100644 index 0000000..2c33df7 --- /dev/null +++ b/ChromatismTests/ChromatismTests.m @@ -0,0 +1,32 @@ +// +// ChromatismTests.m +// ChromatismTests +// +// Created by Johannes Lund on 2013-01-08. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import "ChromatismTests.h" + +@implementation ChromatismTests + +- (void)setUp +{ + [super setUp]; + + // Set-up code here. +} + +- (void)tearDown +{ + // Tear-down code here. + + [super tearDown]; +} + +- (void)testExample +{ + STFail(@"Unit tests are not implemented yet in ChromatismTests"); +} + +@end diff --git a/ChromatismTests/en.lproj/InfoPlist.strings b/ChromatismTests/en.lproj/InfoPlist.strings new file mode 100644 index 0000000..477b28f --- /dev/null +++ b/ChromatismTests/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + From cbd4a0b5006947d9c03875c16206f8e052a2b70c Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Wed, 9 Jan 2013 20:54:11 +0100 Subject: [PATCH 003/140] Initial Commit #2 --- Chromatism.xcodeproj/project.pbxproj | 58 ++ Chromatism/Chromatism-Info.plist | 6 + .../Chromatism.xcodeproj/project.pbxproj | 482 ---------- Chromatism/Chromatism/AppDelegate.h | 15 - Chromatism/Chromatism/AppDelegate.m | 46 - Chromatism/Chromatism/Chromatism-Info.plist | 49 - Chromatism/Chromatism/Chromatism-Prefix.pch | 14 - Chromatism/Chromatism/Default-568h@2x.png | Bin 18594 -> 0 bytes Chromatism/Chromatism/Default.png | Bin 6540 -> 0 bytes Chromatism/Chromatism/Default@2x.png | Bin 16107 -> 0 bytes Chromatism/Chromatism/ViewController.h | 13 - Chromatism/Chromatism/ViewController.m | 29 - .../Chromatism/en.lproj/InfoPlist.strings | 2 - .../en.lproj/MainStoryboard_iPad.storyboard | 26 - .../en.lproj/MainStoryboard_iPhone.storyboard | 26 - Chromatism/Chromatism/main.m | 18 - .../ChromatismTests-Info.plist | 22 - Chromatism/ChromatismTests/ChromatismTests.h | 13 - Chromatism/ChromatismTests/ChromatismTests.m | 32 - .../en.lproj/InfoPlist.strings | 2 - Chromatism/Helpers.h | 42 + Chromatism/Helpers.m | 137 +++ Chromatism/JLTextView.h | 51 ++ Chromatism/JLTextView.m | 368 ++++++++ Chromatism/JLTokenizer.h | 48 + Chromatism/JLTokenizer.m | 339 +++++++ Chromatism/Menlo.ttf | Bin 0 -> 2172912 bytes Chromatism/TextLineCell.h | 17 + Chromatism/TextLineCell.m | 59 ++ Chromatism/ViewController.h | 2 + Chromatism/ViewController.m | 22 +- .../en.lproj/MainStoryboard_iPhone.storyboard | 8 +- Chromatism/text.txt | 845 ++++++++++++++++++ 33 files changed, 1996 insertions(+), 795 deletions(-) delete mode 100644 Chromatism/Chromatism.xcodeproj/project.pbxproj delete mode 100644 Chromatism/Chromatism/AppDelegate.h delete mode 100644 Chromatism/Chromatism/AppDelegate.m delete mode 100644 Chromatism/Chromatism/Chromatism-Info.plist delete mode 100644 Chromatism/Chromatism/Chromatism-Prefix.pch delete mode 100644 Chromatism/Chromatism/Default-568h@2x.png delete mode 100644 Chromatism/Chromatism/Default.png delete mode 100644 Chromatism/Chromatism/Default@2x.png delete mode 100644 Chromatism/Chromatism/ViewController.h delete mode 100644 Chromatism/Chromatism/ViewController.m delete mode 100644 Chromatism/Chromatism/en.lproj/InfoPlist.strings delete mode 100644 Chromatism/Chromatism/en.lproj/MainStoryboard_iPad.storyboard delete mode 100644 Chromatism/Chromatism/en.lproj/MainStoryboard_iPhone.storyboard delete mode 100644 Chromatism/Chromatism/main.m delete mode 100644 Chromatism/ChromatismTests/ChromatismTests-Info.plist delete mode 100644 Chromatism/ChromatismTests/ChromatismTests.h delete mode 100644 Chromatism/ChromatismTests/ChromatismTests.m delete mode 100644 Chromatism/ChromatismTests/en.lproj/InfoPlist.strings create mode 100644 Chromatism/Helpers.h create mode 100644 Chromatism/Helpers.m create mode 100644 Chromatism/JLTextView.h create mode 100644 Chromatism/JLTextView.m create mode 100644 Chromatism/JLTokenizer.h create mode 100644 Chromatism/JLTokenizer.m create mode 100644 Chromatism/Menlo.ttf create mode 100644 Chromatism/TextLineCell.h create mode 100644 Chromatism/TextLineCell.m create mode 100644 Chromatism/text.txt diff --git a/Chromatism.xcodeproj/project.pbxproj b/Chromatism.xcodeproj/project.pbxproj index bca5a12..16917f2 100644 --- a/Chromatism.xcodeproj/project.pbxproj +++ b/Chromatism.xcodeproj/project.pbxproj @@ -24,6 +24,19 @@ 8F0F05A3169C98770060CB48 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F0F057B169C98770060CB48 /* Foundation.framework */; }; 8F0F05AB169C98770060CB48 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 8F0F05A9169C98770060CB48 /* InfoPlist.strings */; }; 8F0F05AE169C98770060CB48 /* ChromatismTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F0F05AD169C98770060CB48 /* ChromatismTests.m */; }; + 8F103C89169C9EDC000E8716 /* Menlo.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 8F103C88169C9EDC000E8716 /* Menlo.ttf */; }; + 8F103C8A169C9EDC000E8716 /* Menlo.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 8F103C88169C9EDC000E8716 /* Menlo.ttf */; }; + 8F15D048169D894A0040A698 /* JLTokenizer.m in Resources */ = {isa = PBXBuildFile; fileRef = 8F503F60169C99AE0064717A /* JLTokenizer.m */; }; + 8F15D04A169D8A180040A698 /* text.txt in Resources */ = {isa = PBXBuildFile; fileRef = 8F15D049169D8A180040A698 /* text.txt */; }; + 8F5040A1169C99AE0064717A /* JLTokenizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F503F60169C99AE0064717A /* JLTokenizer.m */; }; + 8F5040A2169C99AE0064717A /* JLTokenizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F503F60169C99AE0064717A /* JLTokenizer.m */; }; + 8F5040A5169C99C60064717A /* JLTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F5040A4169C99C60064717A /* JLTextView.m */; }; + 8F5040A6169C99C60064717A /* JLTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F5040A4169C99C60064717A /* JLTextView.m */; }; + 8F5040AC169C9A5A0064717A /* TextLineCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F5040AB169C9A5A0064717A /* TextLineCell.m */; }; + 8F5040AD169C9A5A0064717A /* TextLineCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F5040AB169C9A5A0064717A /* TextLineCell.m */; }; + 8F5040B1169C9AFF0064717A /* Helpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F5040B0169C9AFF0064717A /* Helpers.m */; }; + 8F5040B2169C9AFF0064717A /* Helpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F5040B0169C9AFF0064717A /* Helpers.m */; }; + 8F5040B4169C9B240064717A /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F5040B3169C9B240064717A /* CoreText.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -60,6 +73,17 @@ 8F0F05AA169C98770060CB48 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 8F0F05AC169C98770060CB48 /* ChromatismTests.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ChromatismTests.h; sourceTree = ""; }; 8F0F05AD169C98770060CB48 /* ChromatismTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ChromatismTests.m; sourceTree = ""; }; + 8F103C88169C9EDC000E8716 /* Menlo.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = Menlo.ttf; sourceTree = ""; }; + 8F15D049169D8A180040A698 /* text.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = text.txt; sourceTree = ""; }; + 8F503F5F169C99AE0064717A /* JLTokenizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JLTokenizer.h; sourceTree = ""; }; + 8F503F60169C99AE0064717A /* JLTokenizer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JLTokenizer.m; sourceTree = ""; }; + 8F5040A3169C99C60064717A /* JLTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JLTextView.h; sourceTree = ""; }; + 8F5040A4169C99C60064717A /* JLTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JLTextView.m; sourceTree = ""; }; + 8F5040AA169C9A5A0064717A /* TextLineCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextLineCell.h; sourceTree = ""; }; + 8F5040AB169C9A5A0064717A /* TextLineCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TextLineCell.m; sourceTree = ""; }; + 8F5040AF169C9AFF0064717A /* Helpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Helpers.h; sourceTree = ""; }; + 8F5040B0169C9AFF0064717A /* Helpers.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Helpers.m; sourceTree = ""; }; + 8F5040B3169C9B240064717A /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -67,6 +91,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 8F5040B4169C9B240064717A /* CoreText.framework in Frameworks */, 8F0F057A169C98770060CB48 /* UIKit.framework in Frameworks */, 8F0F057C169C98770060CB48 /* Foundation.framework in Frameworks */, 8F0F057E169C98770060CB48 /* CoreGraphics.framework in Frameworks */, @@ -108,6 +133,7 @@ 8F0F0578169C98770060CB48 /* Frameworks */ = { isa = PBXGroup; children = ( + 8F5040B3169C9B240064717A /* CoreText.framework */, 8F0F0579169C98770060CB48 /* UIKit.framework */, 8F0F057B169C98770060CB48 /* Foundation.framework */, 8F0F057D169C98770060CB48 /* CoreGraphics.framework */, @@ -119,6 +145,7 @@ 8F0F057F169C98770060CB48 /* Chromatism */ = { isa = PBXGroup; children = ( + 8F5040AE169C9A660064717A /* Syntax Highlighting */, 8F0F0588169C98770060CB48 /* AppDelegate.h */, 8F0F0589169C98770060CB48 /* AppDelegate.m */, 8F0F0591169C98770060CB48 /* MainStoryboard_iPhone.storyboard */, @@ -133,6 +160,8 @@ 8F0F0580169C98770060CB48 /* Supporting Files */ = { isa = PBXGroup; children = ( + 8F103C88169C9EDC000E8716 /* Menlo.ttf */, + 8F15D049169D8A180040A698 /* text.txt */, 8F0F0581169C98770060CB48 /* Chromatism-Info.plist */, 8F0F0582169C98770060CB48 /* InfoPlist.strings */, 8F0F0585169C98770060CB48 /* main.m */, @@ -163,6 +192,21 @@ name = "Supporting Files"; sourceTree = ""; }; + 8F5040AE169C9A660064717A /* Syntax Highlighting */ = { + isa = PBXGroup; + children = ( + 8F503F5F169C99AE0064717A /* JLTokenizer.h */, + 8F503F60169C99AE0064717A /* JLTokenizer.m */, + 8F5040A3169C99C60064717A /* JLTextView.h */, + 8F5040A4169C99C60064717A /* JLTextView.m */, + 8F5040AA169C9A5A0064717A /* TextLineCell.h */, + 8F5040AB169C9A5A0064717A /* TextLineCell.m */, + 8F5040AF169C9AFF0064717A /* Helpers.h */, + 8F5040B0169C9AFF0064717A /* Helpers.m */, + ); + name = "Syntax Highlighting"; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -234,12 +278,15 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 8F15D048169D894A0040A698 /* JLTokenizer.m in Resources */, 8F0F0584169C98770060CB48 /* InfoPlist.strings in Resources */, 8F0F058C169C98770060CB48 /* Default.png in Resources */, 8F0F058E169C98770060CB48 /* Default@2x.png in Resources */, 8F0F0590169C98770060CB48 /* Default-568h@2x.png in Resources */, 8F0F0593169C98770060CB48 /* MainStoryboard_iPhone.storyboard in Resources */, 8F0F0596169C98770060CB48 /* MainStoryboard_iPad.storyboard in Resources */, + 8F103C89169C9EDC000E8716 /* Menlo.ttf in Resources */, + 8F15D04A169D8A180040A698 /* text.txt in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -248,6 +295,7 @@ buildActionMask = 2147483647; files = ( 8F0F05AB169C98770060CB48 /* InfoPlist.strings in Resources */, + 8F103C8A169C9EDC000E8716 /* Menlo.ttf in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -277,6 +325,10 @@ 8F0F0586169C98770060CB48 /* main.m in Sources */, 8F0F058A169C98770060CB48 /* AppDelegate.m in Sources */, 8F0F0599169C98770060CB48 /* ViewController.m in Sources */, + 8F5040A1169C99AE0064717A /* JLTokenizer.m in Sources */, + 8F5040A5169C99C60064717A /* JLTextView.m in Sources */, + 8F5040AC169C9A5A0064717A /* TextLineCell.m in Sources */, + 8F5040B1169C9AFF0064717A /* Helpers.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -285,6 +337,10 @@ buildActionMask = 2147483647; files = ( 8F0F05AE169C98770060CB48 /* ChromatismTests.m in Sources */, + 8F5040A2169C99AE0064717A /* JLTokenizer.m in Sources */, + 8F5040A6169C99C60064717A /* JLTextView.m in Sources */, + 8F5040AD169C9A5A0064717A /* TextLineCell.m in Sources */, + 8F5040B2169C9AFF0064717A /* Helpers.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -467,6 +523,7 @@ 8F0F05B3169C98770060CB48 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; 8F0F05B4169C98770060CB48 /* Build configuration list for PBXNativeTarget "ChromatismTests" */ = { isa = XCConfigurationList; @@ -475,6 +532,7 @@ 8F0F05B6169C98770060CB48 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; diff --git a/Chromatism/Chromatism-Info.plist b/Chromatism/Chromatism-Info.plist index a8200f6..c77cef6 100644 --- a/Chromatism/Chromatism-Info.plist +++ b/Chromatism/Chromatism-Info.plist @@ -2,6 +2,8 @@ + ATSApplicationFontsPath + CFBundleDevelopmentRegion en CFBundleDisplayName @@ -45,5 +47,9 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight + UIAppFonts + + Menlo.ttf + diff --git a/Chromatism/Chromatism.xcodeproj/project.pbxproj b/Chromatism/Chromatism.xcodeproj/project.pbxproj deleted file mode 100644 index bca5a12..0000000 --- a/Chromatism/Chromatism.xcodeproj/project.pbxproj +++ /dev/null @@ -1,482 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 8F0F057A169C98770060CB48 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F0F0579169C98770060CB48 /* UIKit.framework */; }; - 8F0F057C169C98770060CB48 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F0F057B169C98770060CB48 /* Foundation.framework */; }; - 8F0F057E169C98770060CB48 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F0F057D169C98770060CB48 /* CoreGraphics.framework */; }; - 8F0F0584169C98770060CB48 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 8F0F0582169C98770060CB48 /* InfoPlist.strings */; }; - 8F0F0586169C98770060CB48 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F0F0585169C98770060CB48 /* main.m */; }; - 8F0F058A169C98770060CB48 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F0F0589169C98770060CB48 /* AppDelegate.m */; }; - 8F0F058C169C98770060CB48 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 8F0F058B169C98770060CB48 /* Default.png */; }; - 8F0F058E169C98770060CB48 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8F0F058D169C98770060CB48 /* Default@2x.png */; }; - 8F0F0590169C98770060CB48 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8F0F058F169C98770060CB48 /* Default-568h@2x.png */; }; - 8F0F0593169C98770060CB48 /* MainStoryboard_iPhone.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8F0F0591169C98770060CB48 /* MainStoryboard_iPhone.storyboard */; }; - 8F0F0596169C98770060CB48 /* MainStoryboard_iPad.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8F0F0594169C98770060CB48 /* MainStoryboard_iPad.storyboard */; }; - 8F0F0599169C98770060CB48 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F0F0598169C98770060CB48 /* ViewController.m */; }; - 8F0F05A1169C98770060CB48 /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F0F05A0169C98770060CB48 /* SenTestingKit.framework */; }; - 8F0F05A2169C98770060CB48 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F0F0579169C98770060CB48 /* UIKit.framework */; }; - 8F0F05A3169C98770060CB48 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F0F057B169C98770060CB48 /* Foundation.framework */; }; - 8F0F05AB169C98770060CB48 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 8F0F05A9169C98770060CB48 /* InfoPlist.strings */; }; - 8F0F05AE169C98770060CB48 /* ChromatismTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F0F05AD169C98770060CB48 /* ChromatismTests.m */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 8F0F05A4169C98770060CB48 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 8F0F056E169C98770060CB48 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 8F0F0575169C98770060CB48; - remoteInfo = Chromatism; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 8F0F0576169C98770060CB48 /* Chromatism.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Chromatism.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 8F0F0579169C98770060CB48 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 8F0F057B169C98770060CB48 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 8F0F057D169C98770060CB48 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - 8F0F0581169C98770060CB48 /* Chromatism-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Chromatism-Info.plist"; sourceTree = ""; }; - 8F0F0583169C98770060CB48 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - 8F0F0585169C98770060CB48 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 8F0F0587169C98770060CB48 /* Chromatism-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Chromatism-Prefix.pch"; sourceTree = ""; }; - 8F0F0588169C98770060CB48 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; - 8F0F0589169C98770060CB48 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; - 8F0F058B169C98770060CB48 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = ""; }; - 8F0F058D169C98770060CB48 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x.png"; sourceTree = ""; }; - 8F0F058F169C98770060CB48 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; - 8F0F0592169C98770060CB48 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainStoryboard_iPhone.storyboard; sourceTree = ""; }; - 8F0F0595169C98770060CB48 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainStoryboard_iPad.storyboard; sourceTree = ""; }; - 8F0F0597169C98770060CB48 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; - 8F0F0598169C98770060CB48 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; - 8F0F059F169C98770060CB48 /* ChromatismTests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ChromatismTests.octest; sourceTree = BUILT_PRODUCTS_DIR; }; - 8F0F05A0169C98770060CB48 /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; }; - 8F0F05A8169C98770060CB48 /* ChromatismTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ChromatismTests-Info.plist"; sourceTree = ""; }; - 8F0F05AA169C98770060CB48 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - 8F0F05AC169C98770060CB48 /* ChromatismTests.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ChromatismTests.h; sourceTree = ""; }; - 8F0F05AD169C98770060CB48 /* ChromatismTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ChromatismTests.m; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 8F0F0573169C98770060CB48 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 8F0F057A169C98770060CB48 /* UIKit.framework in Frameworks */, - 8F0F057C169C98770060CB48 /* Foundation.framework in Frameworks */, - 8F0F057E169C98770060CB48 /* CoreGraphics.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8F0F059B169C98770060CB48 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 8F0F05A1169C98770060CB48 /* SenTestingKit.framework in Frameworks */, - 8F0F05A2169C98770060CB48 /* UIKit.framework in Frameworks */, - 8F0F05A3169C98770060CB48 /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 8F0F056D169C98770060CB48 = { - isa = PBXGroup; - children = ( - 8F0F057F169C98770060CB48 /* Chromatism */, - 8F0F05A6169C98770060CB48 /* ChromatismTests */, - 8F0F0578169C98770060CB48 /* Frameworks */, - 8F0F0577169C98770060CB48 /* Products */, - ); - sourceTree = ""; - }; - 8F0F0577169C98770060CB48 /* Products */ = { - isa = PBXGroup; - children = ( - 8F0F0576169C98770060CB48 /* Chromatism.app */, - 8F0F059F169C98770060CB48 /* ChromatismTests.octest */, - ); - name = Products; - sourceTree = ""; - }; - 8F0F0578169C98770060CB48 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 8F0F0579169C98770060CB48 /* UIKit.framework */, - 8F0F057B169C98770060CB48 /* Foundation.framework */, - 8F0F057D169C98770060CB48 /* CoreGraphics.framework */, - 8F0F05A0169C98770060CB48 /* SenTestingKit.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 8F0F057F169C98770060CB48 /* Chromatism */ = { - isa = PBXGroup; - children = ( - 8F0F0588169C98770060CB48 /* AppDelegate.h */, - 8F0F0589169C98770060CB48 /* AppDelegate.m */, - 8F0F0591169C98770060CB48 /* MainStoryboard_iPhone.storyboard */, - 8F0F0594169C98770060CB48 /* MainStoryboard_iPad.storyboard */, - 8F0F0597169C98770060CB48 /* ViewController.h */, - 8F0F0598169C98770060CB48 /* ViewController.m */, - 8F0F0580169C98770060CB48 /* Supporting Files */, - ); - path = Chromatism; - sourceTree = ""; - }; - 8F0F0580169C98770060CB48 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 8F0F0581169C98770060CB48 /* Chromatism-Info.plist */, - 8F0F0582169C98770060CB48 /* InfoPlist.strings */, - 8F0F0585169C98770060CB48 /* main.m */, - 8F0F0587169C98770060CB48 /* Chromatism-Prefix.pch */, - 8F0F058B169C98770060CB48 /* Default.png */, - 8F0F058D169C98770060CB48 /* Default@2x.png */, - 8F0F058F169C98770060CB48 /* Default-568h@2x.png */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 8F0F05A6169C98770060CB48 /* ChromatismTests */ = { - isa = PBXGroup; - children = ( - 8F0F05AC169C98770060CB48 /* ChromatismTests.h */, - 8F0F05AD169C98770060CB48 /* ChromatismTests.m */, - 8F0F05A7169C98770060CB48 /* Supporting Files */, - ); - path = ChromatismTests; - sourceTree = ""; - }; - 8F0F05A7169C98770060CB48 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 8F0F05A8169C98770060CB48 /* ChromatismTests-Info.plist */, - 8F0F05A9169C98770060CB48 /* InfoPlist.strings */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 8F0F0575169C98770060CB48 /* Chromatism */ = { - isa = PBXNativeTarget; - buildConfigurationList = 8F0F05B1169C98770060CB48 /* Build configuration list for PBXNativeTarget "Chromatism" */; - buildPhases = ( - 8F0F0572169C98770060CB48 /* Sources */, - 8F0F0573169C98770060CB48 /* Frameworks */, - 8F0F0574169C98770060CB48 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Chromatism; - productName = Chromatism; - productReference = 8F0F0576169C98770060CB48 /* Chromatism.app */; - productType = "com.apple.product-type.application"; - }; - 8F0F059E169C98770060CB48 /* ChromatismTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 8F0F05B4169C98770060CB48 /* Build configuration list for PBXNativeTarget "ChromatismTests" */; - buildPhases = ( - 8F0F059A169C98770060CB48 /* Sources */, - 8F0F059B169C98770060CB48 /* Frameworks */, - 8F0F059C169C98770060CB48 /* Resources */, - 8F0F059D169C98770060CB48 /* ShellScript */, - ); - buildRules = ( - ); - dependencies = ( - 8F0F05A5169C98770060CB48 /* PBXTargetDependency */, - ); - name = ChromatismTests; - productName = ChromatismTests; - productReference = 8F0F059F169C98770060CB48 /* ChromatismTests.octest */; - productType = "com.apple.product-type.bundle"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 8F0F056E169C98770060CB48 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0460; - ORGANIZATIONNAME = Anviking; - }; - buildConfigurationList = 8F0F0571169C98770060CB48 /* Build configuration list for PBXProject "Chromatism" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = 8F0F056D169C98770060CB48; - productRefGroup = 8F0F0577169C98770060CB48 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 8F0F0575169C98770060CB48 /* Chromatism */, - 8F0F059E169C98770060CB48 /* ChromatismTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 8F0F0574169C98770060CB48 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 8F0F0584169C98770060CB48 /* InfoPlist.strings in Resources */, - 8F0F058C169C98770060CB48 /* Default.png in Resources */, - 8F0F058E169C98770060CB48 /* Default@2x.png in Resources */, - 8F0F0590169C98770060CB48 /* Default-568h@2x.png in Resources */, - 8F0F0593169C98770060CB48 /* MainStoryboard_iPhone.storyboard in Resources */, - 8F0F0596169C98770060CB48 /* MainStoryboard_iPad.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8F0F059C169C98770060CB48 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 8F0F05AB169C98770060CB48 /* InfoPlist.strings in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 8F0F059D169C98770060CB48 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 8F0F0572169C98770060CB48 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 8F0F0586169C98770060CB48 /* main.m in Sources */, - 8F0F058A169C98770060CB48 /* AppDelegate.m in Sources */, - 8F0F0599169C98770060CB48 /* ViewController.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8F0F059A169C98770060CB48 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 8F0F05AE169C98770060CB48 /* ChromatismTests.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 8F0F05A5169C98770060CB48 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 8F0F0575169C98770060CB48 /* Chromatism */; - targetProxy = 8F0F05A4169C98770060CB48 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 8F0F0582169C98770060CB48 /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - 8F0F0583169C98770060CB48 /* en */, - ); - name = InfoPlist.strings; - sourceTree = ""; - }; - 8F0F0591169C98770060CB48 /* MainStoryboard_iPhone.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 8F0F0592169C98770060CB48 /* en */, - ); - name = MainStoryboard_iPhone.storyboard; - sourceTree = ""; - }; - 8F0F0594169C98770060CB48 /* MainStoryboard_iPad.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 8F0F0595169C98770060CB48 /* en */, - ); - name = MainStoryboard_iPad.storyboard; - sourceTree = ""; - }; - 8F0F05A9169C98770060CB48 /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - 8F0F05AA169C98770060CB48 /* en */, - ); - name = InfoPlist.strings; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 8F0F05AF169C98770060CB48 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 6.1; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 8F0F05B0169C98770060CB48 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 6.1; - OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 8F0F05B2169C98770060CB48 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Chromatism/Chromatism-Prefix.pch"; - INFOPLIST_FILE = "Chromatism/Chromatism-Info.plist"; - PRODUCT_NAME = "$(TARGET_NAME)"; - WRAPPER_EXTENSION = app; - }; - name = Debug; - }; - 8F0F05B3169C98770060CB48 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Chromatism/Chromatism-Prefix.pch"; - INFOPLIST_FILE = "Chromatism/Chromatism-Info.plist"; - PRODUCT_NAME = "$(TARGET_NAME)"; - WRAPPER_EXTENSION = app; - }; - name = Release; - }; - 8F0F05B5169C98770060CB48 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/Chromatism.app/Chromatism"; - FRAMEWORK_SEARCH_PATHS = ( - "\"$(SDKROOT)/Developer/Library/Frameworks\"", - "\"$(DEVELOPER_LIBRARY_DIR)/Frameworks\"", - ); - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Chromatism/Chromatism-Prefix.pch"; - INFOPLIST_FILE = "ChromatismTests/ChromatismTests-Info.plist"; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUNDLE_LOADER)"; - WRAPPER_EXTENSION = octest; - }; - name = Debug; - }; - 8F0F05B6169C98770060CB48 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/Chromatism.app/Chromatism"; - FRAMEWORK_SEARCH_PATHS = ( - "\"$(SDKROOT)/Developer/Library/Frameworks\"", - "\"$(DEVELOPER_LIBRARY_DIR)/Frameworks\"", - ); - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Chromatism/Chromatism-Prefix.pch"; - INFOPLIST_FILE = "ChromatismTests/ChromatismTests-Info.plist"; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUNDLE_LOADER)"; - WRAPPER_EXTENSION = octest; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 8F0F0571169C98770060CB48 /* Build configuration list for PBXProject "Chromatism" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 8F0F05AF169C98770060CB48 /* Debug */, - 8F0F05B0169C98770060CB48 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 8F0F05B1169C98770060CB48 /* Build configuration list for PBXNativeTarget "Chromatism" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 8F0F05B2169C98770060CB48 /* Debug */, - 8F0F05B3169C98770060CB48 /* Release */, - ); - defaultConfigurationIsVisible = 0; - }; - 8F0F05B4169C98770060CB48 /* Build configuration list for PBXNativeTarget "ChromatismTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 8F0F05B5169C98770060CB48 /* Debug */, - 8F0F05B6169C98770060CB48 /* Release */, - ); - defaultConfigurationIsVisible = 0; - }; -/* End XCConfigurationList section */ - }; - rootObject = 8F0F056E169C98770060CB48 /* Project object */; -} diff --git a/Chromatism/Chromatism/AppDelegate.h b/Chromatism/Chromatism/AppDelegate.h deleted file mode 100644 index c22f5bf..0000000 --- a/Chromatism/Chromatism/AppDelegate.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// AppDelegate.h -// Chromatism -// -// Created by Johannes Lund on 2013-01-08. -// Copyright (c) 2013 Anviking. All rights reserved. -// - -#import - -@interface AppDelegate : UIResponder - -@property (strong, nonatomic) UIWindow *window; - -@end diff --git a/Chromatism/Chromatism/AppDelegate.m b/Chromatism/Chromatism/AppDelegate.m deleted file mode 100644 index 9d271c5..0000000 --- a/Chromatism/Chromatism/AppDelegate.m +++ /dev/null @@ -1,46 +0,0 @@ -// -// AppDelegate.m -// Chromatism -// -// Created by Johannes Lund on 2013-01-08. -// Copyright (c) 2013 Anviking. All rights reserved. -// - -#import "AppDelegate.h" - -@implementation AppDelegate - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions -{ - // Override point for customization after application launch. - return YES; -} - -- (void)applicationWillResignActive:(UIApplication *)application -{ - // 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. - // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. -} - -- (void)applicationDidEnterBackground:(UIApplication *)application -{ - // 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. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. -} - -- (void)applicationWillEnterForeground:(UIApplication *)application -{ - // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. -} - -- (void)applicationDidBecomeActive:(UIApplication *)application -{ - // 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. -} - -- (void)applicationWillTerminate:(UIApplication *)application -{ - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. -} - -@end diff --git a/Chromatism/Chromatism/Chromatism-Info.plist b/Chromatism/Chromatism/Chromatism-Info.plist deleted file mode 100644 index a8200f6..0000000 --- a/Chromatism/Chromatism/Chromatism-Info.plist +++ /dev/null @@ -1,49 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleDisplayName - ${PRODUCT_NAME} - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - anviking.${PRODUCT_NAME:rfc1034identifier} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - LSRequiresIPhoneOS - - UIMainStoryboardFile - MainStoryboard_iPhone - UIMainStoryboardFile~ipad - MainStoryboard_iPad - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - diff --git a/Chromatism/Chromatism/Chromatism-Prefix.pch b/Chromatism/Chromatism/Chromatism-Prefix.pch deleted file mode 100644 index 3a6a08c..0000000 --- a/Chromatism/Chromatism/Chromatism-Prefix.pch +++ /dev/null @@ -1,14 +0,0 @@ -// -// Prefix header for all source files of the 'Chromatism' target in the 'Chromatism' project -// - -#import - -#ifndef __IPHONE_5_0 -#warning "This project uses features only available in iOS SDK 5.0 and later." -#endif - -#ifdef __OBJC__ - #import - #import -#endif diff --git a/Chromatism/Chromatism/Default-568h@2x.png b/Chromatism/Chromatism/Default-568h@2x.png deleted file mode 100644 index 0891b7aabfcf3422423b109c8beed2bab838c607..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18594 zcmeI4X;f257Jx&9fS`ixvS;&$x8J@slQFSel)6zJN=?13FB7H(lQjRkSy8x_-S~tvu2gzn1oS+dLcF#eqtq$ z%tf9TTvX?`)R@}3uBI;jzS-=ZR-Td&MHaS&;!0?Ni*#$#`n*~CcQK)Q9vAQ~TUpnI!j)a2biYK^R)M~A5wUDZhx?ULMX z3x1P&qt=trOY6P2U67L=m=U?F|5#Uj(eCueNTZaHs_ceWiHeET+j+tp3Jt9g(ekqP z2WOvfR{qV+9r+o4J5?qK>7;;^+I7tGv-i)es$X_D=EoKF+S?zsyj^oRFElP}c}JT< zd8SUs-?O?}2YD#ngKbnHgzHBcboxK_2r9l(?eNCl-pEzkJm}fY?WC*jnS?VBE4EpY zO$fEejz6fU;W2Kl>JeQBZBl-%Irg`obSlg*@4QB;Dd1H7^Oi5wvt4d{RZ!8Og?^aE z)k0$1g+V3fd(gdQ3d&q2q-FL*uy#}|bc^=VhFsl0jBgUGJ+-s3U8MK9A!YJJMxpci z5hJ%|{DwV48fZn0{n5l$N_KcSb#NKE4plB`9I6Zt=Z!~-zw0{9tg$L&Ju1F0X)Cy8 zKF;(&lJ>x)Jw(=;p~sF(Sd9VWGwFE2rnyS9!f^DZ8+aCLq zQ};>lcJ1GDLqjm6Hd>|Eabno@P`~Bn(~6^aD_#yoEH(a?Nm1S<;S+hSxI5d16^<1lEM3NPFi zkqPrpL)+ zgnseFikg`gJVBha1&7C4;O6>h=dt~`ND+;Zd?W(4v2JIb7Pt>Td42%M-Ju-XAH#Pns762L}K3 zDhvsRqN0Ni(1UrishD2YvV?4*h2iFj$+&N||Fn$4n|^NSU+o?~jq`0jVQt8T9l{7b zXiwwODFh2V!Q6sqP9S>WH$oOf$N~=d0-bqTlD61!=`&0eAP-F>XN?*|gtOXX{ zQVTWyYo4ZK0GAw!GHf|pz9`D;-bbb*5LBX*{bnz|+)$@&P9|ORM2o?95{;ejvo&r- zq8cBhTN6nn)7~W>54U)%-F_-b?YKdfk5I8MHcuzBD5)!;yv#Z&R&^y=@=>VTIMy#r zX&U<=BsPkdqcMe<_}2+>H%XKyrr5ZR8_KVe>ZqYN z^=^~TFD};;rHJ$U;{~w^hYojl4hRI@SH$^K{YEo=sg)WY87r!*7blQK&qnpDo0`Vn zkl)9u9g=mCh&ZCJS(L4yN3k0kQ zuvg$h2KEEk51T+O0JQ+r0`R>g{jvqM0Mr6d3qUOZwE!?PI7HY@CE|dr sfw?Q;rAv?G4&^^8-z_>&sWXMxvD*gPOU4CBe-*@OtE+wfmVJNyHv)PfH~;_u diff --git a/Chromatism/Chromatism/Default.png b/Chromatism/Chromatism/Default.png deleted file mode 100644 index 4c8ca6f693f96d511e9113c0eb59eec552354e42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6540 zcmeAS@N?(olHy`uVBq!ia0y~yU~~ZD2OMlbkt;o0To@QwR5G2N13aCb6#|O#(=u~X z85k@CTSM>X-wqM6>&y>YB4)1;;ojbLbbV-W^iFB1wa3^zCog^LCAReC4K0-?R_2{6 zrP*)4+_uWUy3w5N52M3PW_}MFMP9a~>YLvVZ1D_k*IMQ2QT^fwzoOb(*3gH$%aYWC zkHmcab=va2<#X%jakpJ;<1@F;k__#bwtC&%^D0v(FBh9K&$sK+<}2RJS609D)17$w ztdQP8(eLM8Ka}m_IQ@3wyMKP)l=oM4-?`YS_*P?4V_ORLPxsj&7Ju#kH;>6^Kp?T7~ zl+q?{UOOqV==?+d{=)5s|M~T1mwtH@+Z^$G&eEO9JNP^AX@3jZ*J*!!>lc|1-W%fA z@AOQpXZ_Lt>rxFXrGp*zLPiW@uo_c7C{As>j zWeX)wi+LTp_)@KYZCX{j;H?|1yXT4DnlS(Fr8gyP5|uaX_gLvaW0ScZdnG7o+u{T6 zFI-%d{ls*WuCDa5UJ@|RXv&ejZe}*BMkiWY51&pnRPw(hlykSzvj6e%mYz-GdvzBD zF10?szF_~!jS=?2HyQuPCvARXAe}C}WP|yQ*>5~~=*Nxq8+HHW1~FMDRCP^TcacKuk$ z(U#REVv)D!PhJ*ecH-ELFUrfyV&*)Z)>UCOuS?yd^L@Afk>ihynYPc{^CRwu+JHX+#$@YsC4c|l0tGigsn@jy) zXD($Ouk>H+V(Mr6NQT0S9BFM~V6nkj;1OBOz`zY;a|<&v%$g$sEJPk;hD4M^`1)8S z=jZArrsOB3>Q&?x097+E*i={nnYpPYi3%0DIeEoa6}C!X6;?ntNLXJ<0j#7X+g2&U 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 diff --git a/Chromatism/Chromatism/ViewController.h b/Chromatism/Chromatism/ViewController.h deleted file mode 100644 index f6630ca..0000000 --- a/Chromatism/Chromatism/ViewController.h +++ /dev/null @@ -1,13 +0,0 @@ -// -// ViewController.h -// Chromatism -// -// Created by Johannes Lund on 2013-01-08. -// Copyright (c) 2013 Anviking. All rights reserved. -// - -#import - -@interface ViewController : UIViewController - -@end diff --git a/Chromatism/Chromatism/ViewController.m b/Chromatism/Chromatism/ViewController.m deleted file mode 100644 index 8062964..0000000 --- a/Chromatism/Chromatism/ViewController.m +++ /dev/null @@ -1,29 +0,0 @@ -// -// ViewController.m -// Chromatism -// -// Created by Johannes Lund on 2013-01-08. -// Copyright (c) 2013 Anviking. All rights reserved. -// - -#import "ViewController.h" - -@interface ViewController () - -@end - -@implementation ViewController - -- (void)viewDidLoad -{ - [super viewDidLoad]; - // Do any additional setup after loading the view, typically from a nib. -} - -- (void)didReceiveMemoryWarning -{ - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} - -@end diff --git a/Chromatism/Chromatism/en.lproj/InfoPlist.strings b/Chromatism/Chromatism/en.lproj/InfoPlist.strings deleted file mode 100644 index 477b28f..0000000 --- a/Chromatism/Chromatism/en.lproj/InfoPlist.strings +++ /dev/null @@ -1,2 +0,0 @@ -/* Localized versions of Info.plist keys */ - diff --git a/Chromatism/Chromatism/en.lproj/MainStoryboard_iPad.storyboard b/Chromatism/Chromatism/en.lproj/MainStoryboard_iPad.storyboard deleted file mode 100644 index 9fbe23e..0000000 --- a/Chromatism/Chromatism/en.lproj/MainStoryboard_iPad.storyboard +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Chromatism/Chromatism/en.lproj/MainStoryboard_iPhone.storyboard b/Chromatism/Chromatism/en.lproj/MainStoryboard_iPhone.storyboard deleted file mode 100644 index c9acc6d..0000000 --- a/Chromatism/Chromatism/en.lproj/MainStoryboard_iPhone.storyboard +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Chromatism/Chromatism/main.m b/Chromatism/Chromatism/main.m deleted file mode 100644 index b089aaf..0000000 --- a/Chromatism/Chromatism/main.m +++ /dev/null @@ -1,18 +0,0 @@ -// -// main.m -// Chromatism -// -// Created by Johannes Lund on 2013-01-08. -// Copyright (c) 2013 Anviking. All rights reserved. -// - -#import - -#import "AppDelegate.h" - -int main(int argc, char *argv[]) -{ - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} diff --git a/Chromatism/ChromatismTests/ChromatismTests-Info.plist b/Chromatism/ChromatismTests/ChromatismTests-Info.plist deleted file mode 100644 index 4b3d885..0000000 --- a/Chromatism/ChromatismTests/ChromatismTests-Info.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - anviking.${PRODUCT_NAME:rfc1034identifier} - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/Chromatism/ChromatismTests/ChromatismTests.h b/Chromatism/ChromatismTests/ChromatismTests.h deleted file mode 100644 index 98e9b87..0000000 --- a/Chromatism/ChromatismTests/ChromatismTests.h +++ /dev/null @@ -1,13 +0,0 @@ -// -// ChromatismTests.h -// ChromatismTests -// -// Created by Johannes Lund on 2013-01-08. -// Copyright (c) 2013 Anviking. All rights reserved. -// - -#import - -@interface ChromatismTests : SenTestCase - -@end diff --git a/Chromatism/ChromatismTests/ChromatismTests.m b/Chromatism/ChromatismTests/ChromatismTests.m deleted file mode 100644 index 2c33df7..0000000 --- a/Chromatism/ChromatismTests/ChromatismTests.m +++ /dev/null @@ -1,32 +0,0 @@ -// -// ChromatismTests.m -// ChromatismTests -// -// Created by Johannes Lund on 2013-01-08. -// Copyright (c) 2013 Anviking. All rights reserved. -// - -#import "ChromatismTests.h" - -@implementation ChromatismTests - -- (void)setUp -{ - [super setUp]; - - // Set-up code here. -} - -- (void)tearDown -{ - // Tear-down code here. - - [super tearDown]; -} - -- (void)testExample -{ - STFail(@"Unit tests are not implemented yet in ChromatismTests"); -} - -@end diff --git a/Chromatism/ChromatismTests/en.lproj/InfoPlist.strings b/Chromatism/ChromatismTests/en.lproj/InfoPlist.strings deleted file mode 100644 index 477b28f..0000000 --- a/Chromatism/ChromatismTests/en.lproj/InfoPlist.strings +++ /dev/null @@ -1,2 +0,0 @@ -/* Localized versions of Info.plist keys */ - diff --git a/Chromatism/Helpers.h b/Chromatism/Helpers.h new file mode 100644 index 0000000..732788f --- /dev/null +++ b/Chromatism/Helpers.h @@ -0,0 +1,42 @@ +// +// NSString+Helper.h +// TextTest +// +// Created by Johannes Lund on 2012-07-13. +// Copyright (c) 2012 Anviking. All rights reserved. +// + +#import + +@interface NSString (Helper) +- (BOOL)string:(NSString *)longString containsString:(NSString *)shortString; +- (NSMutableArray *)allOccurrencesOfString:(NSString *)searchString; +@end + +@interface NSArray (Helper) +- (NSArray *)uniqueArray; +@end + +@interface NSMutableArray (Helper) +- (NSMutableArray *)uniqueArray; +@end + +@interface UIColor (CreateMethods) + +// wrapper for [UIColor colorWithRed:green:blue:alpha:] +// values must be in range 0 - 255 ++ (UIColor*)colorWith8BitRed:(NSInteger)red green:(NSInteger)green blue:(NSInteger)blue alpha:(CGFloat)alpha; + +// Creates color using hex representation +// hex - must be in format: #FF00CC +// alpha - must be in range 0.0 - 1.0 ++ (UIColor*)colorWithHex:(NSString*)hex alpha:(CGFloat)alpha; + +@end + +@interface NSValue (Helper) +- (NSComparisonResult)compareTo:(NSValue *)range; +@end + + + diff --git a/Chromatism/Helpers.m b/Chromatism/Helpers.m new file mode 100644 index 0000000..8be7ef2 --- /dev/null +++ b/Chromatism/Helpers.m @@ -0,0 +1,137 @@ +// +// NSString+Helper.m +// TextTest +// +// Created by Johannes Lund on 2012-07-13. +// Copyright (c) 2012 Anviking. All rights reserved. +// + +#import "Helpers.h" +#import + +@implementation NSString (Helper) + +- (BOOL)string:(NSString *)longString containsString:(NSString *)shortString +{ + return ([longString rangeOfString:shortString].length != NSNotFound); +} + +- (NSMutableArray *)allOccurrencesOfString:(NSString *)searchString { + + NSMutableArray *array = [NSMutableArray array]; + + BOOL keepGoing = TRUE; + NSRange searchRange = NSMakeRange(0, self.length); + while (keepGoing) { + NSRange range = [self rangeOfString:searchString options:NSCaseInsensitiveSearch range:searchRange]; + if (range.location != NSNotFound) { + int pos = range.location + searchString.length; + [array addObject:[NSValue valueWithRange:range]]; + + searchRange = NSMakeRange(pos, [self length] - pos); + + } else { + keepGoing = NO; + } + } + + return array; +} + +@end + +@implementation NSArray (Helper) + +- (NSArray *)uniqueArray; +{ + NSMutableSet* existingNames = [NSMutableSet set]; + NSMutableArray* filteredArray = [NSMutableArray array]; + for (id object in self) { + if (![existingNames containsObject:[object name]]) { + [existingNames addObject:[object name]]; + [filteredArray addObject:object]; + } + } + return [NSArray arrayWithArray:filteredArray]; +} +@end + +@implementation NSMutableArray (Helper) + +- (NSMutableArray *)uniqueArray; +{ + NSMutableSet* existingNames = [NSMutableSet set]; + NSMutableArray* filteredArray = [NSMutableArray array]; + for (id object in self) { + if (![existingNames containsObject:object]) { + [existingNames addObject:object]; + [filteredArray addObject:object]; + } + } + return filteredArray; +} + +@end + +@implementation NSValue (Helper) + +- (NSComparisonResult)compareTo:(NSValue *)range { + if (self.rangeValue.location < range.rangeValue.location) { + return NSOrderedAscending; + } else if (self.rangeValue.location == range.rangeValue.location) { + return NSOrderedSame; + } else { + return NSOrderedDescending; + } +} + +@end + +@implementation UIColor (CreateMethods) + ++ (UIColor*)colorWith8BitRed:(NSInteger)red green:(NSInteger)green blue:(NSInteger)blue alpha:(CGFloat)alpha { + return [UIColor colorWithRed:(red/255.0) green:(green/255.0) blue:(blue/255.0) alpha:alpha]; +} + ++ (UIColor*)colorWithHex:(NSString*)hex alpha:(CGFloat)alpha { + + assert(6 == [hex length]); + + NSString *redHex = [NSString stringWithFormat:@"0x%@", [hex substringWithRange:NSMakeRange(0, 2)]]; + NSString *greenHex = [NSString stringWithFormat:@"0x%@", [hex substringWithRange:NSMakeRange(2, 2)]]; + NSString *blueHex = [NSString stringWithFormat:@"0x%@", [hex substringWithRange:NSMakeRange(4, 2)]]; + + unsigned redInt = 0; + NSScanner *rScanner = [NSScanner scannerWithString:redHex]; + [rScanner scanHexInt:&redInt]; + + unsigned greenInt = 0; + NSScanner *gScanner = [NSScanner scannerWithString:greenHex]; + [gScanner scanHexInt:&greenInt]; + + unsigned blueInt = 0; + NSScanner *bScanner = [NSScanner scannerWithString:blueHex]; + [bScanner scanHexInt:&blueInt]; + + return [UIColor colorWith8BitRed:redInt green:greenInt blue:blueInt alpha:alpha]; +} + +@end + +@implementation NSAttributedString (help) + +- (NSString *)description +{ + return self.string; +} + +@end + +@implementation NSMutableAttributedString (help) + +- (NSString *)description +{ + return self.string; +} + +@end diff --git a/Chromatism/JLTextView.h b/Chromatism/JLTextView.h new file mode 100644 index 0000000..a558508 --- /dev/null +++ b/Chromatism/JLTextView.h @@ -0,0 +1,51 @@ +// +// RegexHighlightView.h +// iOS Syntax Highlighter +// +// Created by Kristian Kraljic on 30/8/12. +// Copyright (c) 2012 Kristian Kraljic (dikrypt.com, ksquared.de). 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. +// + +#import +#import +#import "JLTokenizer.h" + +@interface TextViewChange : NSObject + +@property (nonatomic, copy) NSString *replacementText; +@property (nonatomic) NSRange range; +@end + +@class JLTokenizer; +@interface JLTextView : UITextView + +@property (nonatomic, strong) UITableView *tableView; +@property (nonatomic, strong) NSMutableAttributedString *attributedString; +@property (nonatomic, strong) NSDictionary *attributes; +@property (nonatomic, strong) JLTokenizer *syntaxTokenizer; + +//Refreshes syntax coloring. +- (void)refreshTokenization; + +@end \ No newline at end of file diff --git a/Chromatism/JLTextView.m b/Chromatism/JLTextView.m new file mode 100644 index 0000000..5b8da02 --- /dev/null +++ b/Chromatism/JLTextView.m @@ -0,0 +1,368 @@ + + +#import "JLTextView.h" +#import "Helpers.h" +#import "TextLineCell.h" +#import "JLTokenizer.h" + +#define EMPTY @"" + +@interface JLTextView () { + id internalDelegate; +} + +@property (nonatomic, strong) NSMutableArray *lines; +@property (nonatomic, strong) NSMutableArray *lineLayers; +@property (nonatomic, strong) NSMutableArray *lineLayerIndex; +@property (nonatomic, strong) NSMutableArray *lineStartIndexes; +@end + +@implementation TextViewChange + + +@end + +@implementation JLTextView { + + CGFloat lastUpdateOffset; + CGFloat currentOffset; + + CGFloat _lineHeight; + CGFloat _charWidth; + + CTFramesetterRef _framesetter; // Cached Core Text framesetter + + UIView *_debugView; + +} +@synthesize attributes = _attributes, syntaxTokenizer = _syntaxTokenizer; + +#pragma mark – + +//Update the syntax highlighting if the text gets changed or the scrollview gets updated + +- (void)scrollViewDidScroll:(UIScrollView *)scrollView +{ + [self.tableView setContentOffset:self.contentOffset]; +} + +//Helper method +- (void)setRange:(NSRange)range forLinenumber:(int)i +{ + CTLineRef line = CTLineCreateWithAttributedString((__bridge CFAttributedStringRef)([self.attributedString attributedSubstringFromRange:range])); + self.lines[i] = (__bridge id)(line); + [self.tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:i inSection:0]] withRowAnimation:UITableViewRowAnimationNone]; +} + +- (void)insertLineWithRange:(NSRange)range atIndex:(int)i +{ + NSAttributedString *string; + + if (range.location != NSNotFound && range.length < self.attributedString.length) string = [self.attributedString attributedSubstringFromRange:range]; + else [[NSException exceptionWithName:@"JLTextViewException" reason:@"A new line was created, but its assigned range is invalid" userInfo:nil] raise]; + + + CTLineRef line = CTLineCreateWithAttributedString((__bridge CFAttributedStringRef)(string)); + + [self.lines insertObject:(__bridge id)(line) atIndex:i]; + [self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:i inSection:0]] withRowAnimation:UITableViewRowAnimationNone]; + [self.lineStartIndexes insertObject:@(range.location) atIndex:i]; +} + +- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text +{ + //TODO: deactivate core-text overlay upon failure + //TODO: Nicer designflow + //TODO: Handle out of bound errors + + //Basic stuff, tokenize the string + TextViewChange *options = [[TextViewChange alloc] init]; + options.replacementText = text; + options.range = range; + + [self.attributedString replaceCharactersInRange:range withAttributedString:[[NSAttributedString alloc] initWithString:text attributes:_attributes]]; + + _attributedString = [self.syntaxTokenizer tokenizeAttributedString:self.attributedString withRecentTextViewChange:options]; + + + + NSInteger i = [self lineNumberAtIndex:NSMaxRange(range)]; + + //Fix the ranges + for (int j = i+1; j < self.lineStartIndexes.count; j++) { + _lineStartIndexes[j] = @([(NSNumber *)[self.lineStartIndexes objectAtIndex:j] intValue]+text.length); + } + + //Get range of line + NSString *string = self.attributedString.string; + CTLineRef currentLine = (__bridge CTLineRef)(self.lines[i]); + NSRange currentLineRange = NSMakeRange([(NSNumber *)self.lineStartIndexes[i] intValue], CTLineGetStringRange(currentLine).length+text.length - range.length); + NSRange newWord = NSMakeRange(options.range.location, options.replacementText.length); + + + //BACKSPACE + if ([text isEqualToString:@""] && range.length == 1) + { + if (range.location >= currentLineRange.location) + { + // No text changes line + [self setRange:currentLineRange forLinenumber:i]; + return TRUE; + } + } + + //NEWLINE + if ([text isEqualToString:@"\n"]) { + + NSRange range1 = NSMakeRange(currentLineRange.location, NSMaxRange(newWord) - currentLineRange.location); + NSRange range2 = NSMakeRange(NSMaxRange(newWord), NSMaxRange(currentLineRange)-NSMaxRange(newWord)); + + [self setRange:range1 forLinenumber:i]; + [self insertLineWithRange:range2 atIndex:i+1]; + + return YES; + + } + //CHARACTER TYPED, and the line is not overflowing + NSString *lineString = [string substringWithRange:currentLineRange]; + CGSize size = [lineString sizeWithFont:self.font constrainedToSize:CGSizeMake(self.frame.size.width-2*MARGIN, 2000) lineBreakMode:NSLineBreakByWordWrapping]; + BOOL overflowing = size.height > _lineHeight*1.5; + + if (text.length == 1 && range.length == 0 && !overflowing) { + [self setRange:currentLineRange forLinenumber:i]; + return TRUE; + } + NSLog(@"Generating new lines, this should be concidered as failuere. Not good. Need to improve the stuff above."); + + [self generateLines]; + [self.tableView reloadData]; + + return YES; +} + +#pragma mark - TableView + + + +- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath +{ + return _lineHeight; +} +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView +{ + return 1; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section +{ + return self.lines.count; +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath +{ + static NSString *CellIdentifier = @"LineLayer"; + TextLineCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier + forIndexPath:indexPath]; + + NSUInteger lineNumber = indexPath.row; + CTLineRef ref = (__bridge CTLineRef)([self.lines objectAtIndex:lineNumber]); + cell.line = ref; + [cell setNeedsDisplay]; + + return cell; +} + +#pragma mark - + +// Helper method to release our cached Core Text framesetter and frame +- (void)clearPreviousLayoutInformation +{ + if (_framesetter != NULL) { + CFRelease(_framesetter); + _framesetter = NULL; + } +} + +- (NSUInteger)lineNumberAtIndex:(NSUInteger)index +{ + for (int i = 0; i < self.lineStartIndexes.count; i++) { + if ([(NSNumber *)self.lineStartIndexes[i] intValue] > index) return i-1; + } + return 0; +} + +NS_INLINE NSRange NSRangeFromCFRange(CFRange range) { + return NSMakeRange(range.location, range.length); +} + +- (void)generateLines +{ + if (!self.attributedString) return; + + [self clearPreviousLayoutInformation]; + self.lines = @[].mutableCopy; + self.lineStartIndexes = @[].mutableCopy; + + CFAttributedStringRef ref = (CFAttributedStringRef)CFBridgingRetain(self.attributedString); + _framesetter = CTFramesetterCreateWithAttributedString(ref); + + // Work out the geometry + CGRect insetBounds = CGRectInset([self bounds], MARGIN, MARGIN); + CGFloat boundsWidth = CGRectGetWidth(insetBounds); + + // Calculate the lines + CFIndex start = 0; + NSUInteger length = CFAttributedStringGetLength((__bridge CFAttributedStringRef)(self.attributedString)); + while (start < length) + { + CTTypesetterRef typesetter = CTFramesetterGetTypesetter(_framesetter); + CFIndex count = CTTypesetterSuggestLineBreak(typesetter, start, boundsWidth); + CTLineRef line = CTLineCreateWithAttributedString((__bridge CFAttributedStringRef)([self.attributedString attributedSubstringFromRange:NSMakeRange(start, count)])); + [self.lines addObject:(__bridge id)(line)]; + [self.lineStartIndexes addObject:@(start)]; + + start += count; + } +} + +#pragma mark - + +- (void)layoutSubviews +{ + // This feels a bit strange. The tableview should maybe not be a subview of the tableView so that it doesn't move? + self.tableView.frame = self.bounds; +} + +- (UITableView *)tableView +{ + if (!_tableView) { + + _tableView = [[UITableView alloc] initWithFrame:self.bounds style:UITableViewStylePlain]; + [_tableView registerClass:[TextLineCell class] forCellReuseIdentifier:@"LineLayer"]; + _tableView.delegate = self; + _tableView.dataSource = self; + + _tableView.userInteractionEnabled = NO; + _tableView.separatorStyle = UITableViewCellSeparatorStyleNone; + _tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 8)]; + + [self addSubview:_tableView]; + } + return _tableView; +} + + +#pragma mark – + +- (void)setAttributedString:(NSMutableAttributedString *)attributedString +{ + _attributedString = attributedString; + [self generateLines]; + [self.tableView reloadData]; +} + +- (void)setAttributes:(NSDictionary *)attributes +{ + _attributes = attributes; +} + +- (NSDictionary *)attributes +{ + if (!_attributes) { + //Set line height, font, color and break mode + CTFontRef font = CTFontCreateWithName((__bridge CFStringRef)self.font.fontName,self.font.pointSize,NULL); + CGFloat minimumLineHeight = [@"a" sizeWithFont:self.font].height,maximumLineHeight = minimumLineHeight; + CTLineBreakMode lineBreakMode = kCTLineBreakByWordWrapping; + + _lineHeight = minimumLineHeight; + _charWidth = [@"a" sizeWithFont:self.font].width; + + //Apply paragraph settings + CTParagraphStyleRef style = CTParagraphStyleCreate((CTParagraphStyleSetting[3]){ + {kCTParagraphStyleSpecifierMinimumLineHeight,sizeof(minimumLineHeight),&minimumLineHeight}, + {kCTParagraphStyleSpecifierMaximumLineHeight,sizeof(maximumLineHeight),&maximumLineHeight}, + {kCTParagraphStyleSpecifierLineBreakMode,sizeof(CTLineBreakMode),&lineBreakMode} + },3); + + self.attributes = @{(NSString*)kCTFontAttributeName: (__bridge id)font,(NSString*)kCTForegroundColorAttributeName: (__bridge id)[UIColor blackColor].CGColor,(NSString*)kCTParagraphStyleAttributeName: (__bridge id)style}; + + } + return _attributes; +} + +- (JLTokenizer *)syntaxTokenizer +{ + if (!_syntaxTokenizer) self.syntaxTokenizer = [JLTokenizer new]; + return _syntaxTokenizer; +} + +- (void)setSyntaxTokenizer:(JLTokenizer *)syntaxTokenizer +{ + _syntaxTokenizer = syntaxTokenizer; + _syntaxTokenizer.textView = self; +} + +- (void)setFont:(UIFont *)font +{ + [super setFont:font]; + + //Refresh attributes + _attributes = nil; + [self attributes]; +} + +- (void)refreshTokenization +{ + self.attributedString = [self.syntaxTokenizer tokenizeAttributedString:self.attributedString withRecentTextViewChange:nil]; + self.backgroundColor = self.syntaxTokenizer.backgroundColor; + [self.tableView setBackgroundColor:self.syntaxTokenizer.backgroundColor]; +} + +-(id)init { + self = [super init]; + if(self) { + [self setup]; + } + return self; +} +- (id)initWithCoder:(NSCoder*)decoder { + self = [super initWithCoder:decoder]; + if (self) { + [self setup]; + } + return self; +} +- (id)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self) { + [self setup]; + } + return self; +} + +- (void)awakeFromNib +{ + [self setup]; +} + +- (void)setup +{ + self.textColor = [UIColor clearColor]; + self.delegate = self; + self.autocapitalizationType = UITextAutocapitalizationTypeNone; + self.autocorrectionType = UITextAutocorrectionTypeNo; + + _debugView = [[UIView alloc] init]; + [self addSubview:_debugView]; +} + +- (void)setText:(NSString *)text +{ + [super setText:text]; + + _attributedString = [[NSMutableAttributedString alloc] initWithString:text attributes:self.attributes]; + self.attributedString = [self.syntaxTokenizer tokenizeAttributedString:_attributedString withRecentTextViewChange:nil]; + [self generateLines]; +} +@end + diff --git a/Chromatism/JLTokenizer.h b/Chromatism/JLTokenizer.h new file mode 100644 index 0000000..83731d6 --- /dev/null +++ b/Chromatism/JLTokenizer.h @@ -0,0 +1,48 @@ +// +// Tokenizer.h +// iGitpad +// +// Created by Johannes Lund on 2012-11-24. +// +// + +#import +#import "JLTextView.h" +#import "Helpers.h" + +FOUNDATION_EXPORT NSString *const kTokenizerTypeText; +FOUNDATION_EXPORT NSString *const kTokenizerTypeBackground; +FOUNDATION_EXPORT NSString *const kTokenizerTypeComment; +FOUNDATION_EXPORT NSString *const kTokenizerTypeDocumentationComment; +FOUNDATION_EXPORT NSString *const kTokenizerTypeString; +FOUNDATION_EXPORT NSString *const kTokenizerTypeCharacter; +FOUNDATION_EXPORT NSString *const kTokenizerTypeNumber; +FOUNDATION_EXPORT NSString *const kTokenizerTypeKeyword; +FOUNDATION_EXPORT NSString *const kTokenizerTypePreprocessor; +FOUNDATION_EXPORT NSString *const kTokenizerTypeURL; +FOUNDATION_EXPORT NSString *const kTokenizerTypeAttribute; +FOUNDATION_EXPORT NSString *const kTokenizerTypeProject; +FOUNDATION_EXPORT NSString *const kTokenizerTypeOther; +FOUNDATION_EXPORT NSString *const kTokenizerTypeOtherClassNames; +FOUNDATION_EXPORT NSString *const kTokenizerTypeOtherMethodNames; + +typedef enum { + kTokenizerThemeDefault, + kTokenizerThemeDusk +} RegexHighlightViewTheme; + +//TODO: Clean this header +@class TextViewChange, JLTextView; +@interface JLTokenizer : NSObject + +- (NSMutableAttributedString *)tokenizeAttributedString:(NSMutableAttributedString *)attributedString withRecentTextViewChange:(TextViewChange *)change; + +@property (nonatomic, strong) UIColor *backgroundColor; +@property (nonatomic, strong) UIColor *highlightColor; + +@property(nonatomic) NSDictionary *colorDictionary; +@property (nonatomic, assign) RegexHighlightViewTheme theme; +@property (nonatomic, strong) NSArray *themes; +@property (nonatomic, weak) JLTextView *textView; + +@end diff --git a/Chromatism/JLTokenizer.m b/Chromatism/JLTokenizer.m new file mode 100644 index 0000000..04dcd88 --- /dev/null +++ b/Chromatism/JLTokenizer.m @@ -0,0 +1,339 @@ +// +// Tokenizer.m +// iGitpad +// +// Created by Johannes Lund on 2012-11-24. +// +// + +// This file builds upon the work of Kristian Kraljic +// +// RegexHighlightView.m +// Simple Objective-C Syntax Highlighter +// +// Created by Kristian Kraljic on 30/08/12. +// Copyright (c) 2012 Kristian Kraljic (dikrypt.com, ksquared.de). 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. +// + +#import "JLTokenizer.h" +#import "JLTextView.h" +#import + +NSString *const kTokenizerTypeText = @"text"; +NSString *const kTokenizerTypeBackground = @"background"; +NSString *const kTokenizerTypeComment = @"comment"; +NSString *const kTokenizerTypeDocumentationComment = @"documentation_comment"; +NSString *const kTokenizerTypeDocumentationCommentKeyword = @"documentation_comment_keyword"; +NSString *const kTokenizerTypeString = @"string"; +NSString *const kTokenizerTypeCharacter = @"character"; +NSString *const kTokenizerTypeNumber = @"number"; +NSString *const kTokenizerTypeKeyword = @"keyword"; +NSString *const kTokenizerTypePreprocessor = @"preprocessor"; +NSString *const kTokenizerTypeURL = @"url"; +NSString *const kTokenizerTypeAttribute = @"attribute"; +NSString *const kTokenizerTypeProject = @"project"; +NSString *const kTokenizerTypeOther = @"other"; +NSString *const kTokenizerTypeOtherMethodNames = @"other_method_names"; +NSString *const kTokenizerTypeOtherClassNames = @"other_class_names"; + +@interface NSMutableAttributedString (Regex) +- (void)addRanges:(NSArray *)array withColor:(UIColor *)color; +- (void)addRanges:(NSArray *)array withAttributes:(NSDictionary *)dic; +- (NSArray *)allMatchesOfPattern:(NSString *)pattern inString:(NSString *)string; + +- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color andDescription:(NSString *)description; +- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color range:(NSRange)range andDescription:(NSString *)description; +- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color group:(int)index range:(NSRange)range andDescription:(NSString *)description; +- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color options:(NSRegularExpressionOptions)options andDescription:(NSString *)description; +- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color options:(NSRegularExpressionOptions)options range:(NSRange)range andDescription:(NSString *)description; +- (void)removeAttribute:(NSString *)name withValue:(id)compareValue range:(NSRange)range; +@end + +@interface JLTokenizer () + ++ (NSDictionary*)highlightTheme:(RegexHighlightViewTheme)theme; + +@end + +@implementation JLTokenizer +@synthesize theme = _theme; + +- (NSMutableAttributedString *)tokenizeAttributedString:(NSMutableAttributedString *)string withRecentTextViewChange:(TextViewChange *)options { + UIColor *color; + color = [UIColor blueColor]; + + if (string.length == 0) return string; + + NSRange newWord = NSMakeRange(options.range.location, options.replacementText.length); + NSRange currentLine = NSMakeRange(0, string.length); + NSRange stringRange = currentLine; + if (options) { + NSRange start = [string.string rangeOfString:@"\n" options:NSBackwardsSearch range:NSMakeRange(0, newWord.location)]; + NSRange stop = [string.string rangeOfString:@"\n" options:0 range:NSMakeRange(newWord.length+newWord.location, string.length-(newWord.location+newWord.length))]; + + int location = MIN(MAX(start.location, 0), string.length); + int length = MIN(MAX(0,(stop.location+stop.length-location)), string.length-location); + + currentLine = NSMakeRange(location, length); + } + + NSDictionary *dic = self.colorDictionary; + + //Clear the comments to later be rebuilt + UIColor *compareColor = dic[kTokenizerTypeComment]; + [string removeAttribute:(NSString *)kCTForegroundColorAttributeName withValue:compareColor range:stringRange]; + + [string removeAttribute:(NSString *)kCTForegroundColorAttributeName range:currentLine]; + [string addAttribute:(NSString *)kCTForegroundColorAttributeName value:dic[kTokenizerTypeText] range:currentLine]; + + //TODO: Make this... better + + color = dic[kTokenizerTypeNumber]; + + [string addRegularExpressionWithPattern:@"(?<=\\s)\\d+" withColor:color range:currentLine andDescription:@"Numbers"]; + + [string addRegularExpressionWithPattern:@"@\\s*[\(|\{|\[]" withColor:color andDescription:@"New literals"]; + + //C – functions and similiar + color = dic[kTokenizerTypeOtherMethodNames]; + [string addRegularExpressionWithPattern:@"\\w+\\s*(?>\\(.*\\)" withColor:color group:1 range:currentLine andDescription:@"C function names"]; + + //Dot notation + [string addRegularExpressionWithPattern:@"\\.(\\w+)" withColor:color group:1 range:currentLine andDescription:@"Dot notation"]; + + //Method calls + [string addRegularExpressionWithPattern:@"\\[\\w+\\s+(\\w+)\\]" withColor:color group:1 range:currentLine andDescription:@"Method calls"]; + [string addRegularExpressionWithPattern:@"(?<=\\w+):\\s*[^\\s;\\]]+" withColor:color group:1 range:currentLine andDescription:@"Method calls parts"]; + + color = dic[kTokenizerTypeOtherClassNames]; + [string addRegularExpressionWithPattern:@"(\\b(?>NS|UI))\\w+\\b" withColor:color range:currentLine andDescription:@"UIKit and NS"]; + + color = dic[kTokenizerTypeKeyword]; + [string addRegularExpressionWithPattern:@"(?<=\\b)(?>true|false|yes|no|TRUE|FALSE|bool|BOOL|nil|id|void|self|NULL|if|else|strong|weak|nonatomic|atomic|assign|copy|typedef|enum|auto|break|case|const|char|continue|do|default|double|extern|float|for|goto|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|volatile|while|nonatomic|atomic|readonly)(\\b)" withColor:color range:currentLine andDescription:@"Keywords"]; + + + [string addRegularExpressionWithPattern:@"@[a-zA-Z0-9_]+" withColor:color range:currentLine andDescription:@"@things"]; + + color = dic[kTokenizerTypePreprocessor]; + [string addRegularExpressionWithPattern:@"#.*+\n" withColor:color range:currentLine andDescription:@"Prefixes"]; + + color = dic[kTokenizerTypeString]; + [string addRegularExpressionWithPattern:@"(\"|@\")[^\"]*(@\"|\")" withColor:color andDescription:@"Strings"]; + + color = dic[kTokenizerTypeComment]; + [string addRegularExpressionWithPattern:@"//.*+\n" withColor:color andDescription:@"Comments"]; + + [string addRegularExpressionWithPattern:@"/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*+/" withColor:color andDescription:@"Comments"]; + + return string; +} + +#pragma mark - Pattern help + +- (NSString *)patternBetweenString:(NSString *)start andString:(NSString *)stop +{ + return nil; +} + +#pragma mark - Color shemes + + + +-(void)setTheme:(RegexHighlightViewTheme)theme +{ + self.colorDictionary = [JLTokenizer highlightTheme:theme]; + _theme = theme; + + //Set font, text color and background color back to default + UIColor* backgroundColor = self.colorDictionary[kTokenizerTypeBackground]; + if(backgroundColor) + self.backgroundColor = backgroundColor; + else self.backgroundColor = [UIColor whiteColor]; +} + +- (NSDictionary *)colorDictionary +{ + if (!_colorDictionary) { + _colorDictionary = [JLTokenizer highlightTheme:self.theme]; + } + return _colorDictionary; +} + +- (NSArray *)themes +{ + if (!_themes) _themes = @[@(kTokenizerThemeDefault),@(kTokenizerThemeDusk)]; + return _themes; +} + +- (RegexHighlightViewTheme)theme +{ + if (!_theme) _theme = kTokenizerThemeDefault; + return _theme; +} + +- (void)setTextView:(JLTextView *)textView +{ + _textView = textView; +} + +- (void)setBackgroundColor:(UIColor *)backgroundColor +{ + [self.textView.tableView setBackgroundColor:backgroundColor]; + + _backgroundColor = backgroundColor; +} + +// Just a bunch of colors ++ (NSDictionary*)highlightTheme:(RegexHighlightViewTheme)theme { + //Check if the highlight theme has already been defined + NSDictionary* themeColor = nil; + //If not define the theme and return it + switch(theme) { + case kTokenizerThemeDefault: + themeColor = @{kTokenizerTypeText: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], + kTokenizerTypeBackground: [UIColor colorWithRed:255.0/255 green:255.0/255 blue:255.0/255 alpha:1], + kTokenizerTypeComment: [UIColor colorWithRed:0.0/255 green:131.0/255 blue:39.0/255 alpha:1], + kTokenizerTypeDocumentationComment: [UIColor colorWithRed:0.0/255 green:131.0/255 blue:39.0/255 alpha:1], + kTokenizerTypeDocumentationCommentKeyword: [UIColor colorWithRed:0.0/255 green:76.0/255 blue:29.0/255 alpha:1], + kTokenizerTypeString: [UIColor colorWithRed:211.0/255 green:45.0/255 blue:38.0/255 alpha:1], + kTokenizerTypeCharacter: [UIColor colorWithRed:40.0/255 green:52.0/255 blue:206.0/255 alpha:1], + kTokenizerTypeNumber: [UIColor colorWithRed:40.0/255 green:52.0/255 blue:206.0/255 alpha:1], + kTokenizerTypeKeyword: [UIColor colorWithRed:188.0/255 green:49.0/255 blue:156.0/255 alpha:1], + kTokenizerTypePreprocessor: [UIColor colorWithRed:120.0/255 green:72.0/255 blue:48.0/255 alpha:1], + kTokenizerTypeURL: [UIColor colorWithRed:21.0/255 green:67.0/255 blue:244.0/255 alpha:1], + kTokenizerTypeAttribute: [UIColor colorWithRed:150.0/255 green:125.0/255 blue:65.0/255 alpha:1], + kTokenizerTypeProject: [UIColor colorWithRed:77.0/255 green:129.0/255 blue:134.0/255 alpha:1], + kTokenizerTypeOther: [UIColor colorWithRed:113.0/255 green:65.0/255 blue:163.0/255 alpha:1], + kTokenizerTypeOtherMethodNames : [UIColor colorWithHex:@"7040a6" alpha:1], + kTokenizerTypeOtherClassNames : [UIColor colorWithHex:@"7040a6" alpha:1] + + + + }; + break; + case kTokenizerThemeDusk: + themeColor = @{kTokenizerTypeText: [UIColor whiteColor], + kTokenizerTypeBackground: [UIColor colorWithRed:30.0/255.0 green:32.0/255.0 blue:40.0/255.0 alpha:1], + kTokenizerTypeComment: [UIColor colorWithRed:72.0/255 green:190.0/255 blue:102.0/255 alpha:1], + kTokenizerTypeDocumentationComment: [UIColor colorWithRed:72.0/255 green:190.0/255 blue:102.0/255 alpha:1], + kTokenizerTypeDocumentationCommentKeyword: [UIColor colorWithRed:72.0/255 green:190.0/255 blue:102.0/255 alpha:1], + kTokenizerTypeString: [UIColor colorWithRed:230.0/255 green:66.0/255 blue:75.0/255 alpha:1], + kTokenizerTypeCharacter: [UIColor colorWithRed:139.0/255 green:134.0/255 blue:201.0/255 alpha:1], + kTokenizerTypeNumber: [UIColor colorWithRed:139.0/255 green:134.0/255 blue:201.0/255 alpha:1], + kTokenizerTypeKeyword: [UIColor colorWithRed:195.0/255 green:55.0/255 blue:149.0/255 alpha:1], + kTokenizerTypePreprocessor: [UIColor colorWithRed:198.0/255.0 green:124.0/255.0 blue:72.0/255.0 alpha:1], + kTokenizerTypeURL: [UIColor colorWithRed:35.0/255 green:63.0/255 blue:208.0/255 alpha:1], + kTokenizerTypeAttribute: [UIColor colorWithRed:103.0/255 green:135.0/255 blue:142.0/255 alpha:1], + kTokenizerTypeProject: [UIColor colorWithRed:146.0/255 green:199.0/255 blue:119.0/255 alpha:1], + kTokenizerTypeOther: [UIColor colorWithRed:0.0/255 green:175.0/255 blue:199.0/255 alpha:1], + kTokenizerTypeOtherClassNames : [UIColor colorWithHex:@"04afc8" alpha:1], + kTokenizerTypeOtherMethodNames : [UIColor colorWithHex:@"04afc8" alpha:1] + }; + break; + } + return themeColor; +} + + +@end + +#pragma mark - Regex Helpers + + +@implementation NSMutableAttributedString (Regex) + +- (void)removeAttribute:(NSString *)name withValue:(id)compareValue range:(NSRange)range +{ + [self enumerateAttribute:(NSString *)kCTForegroundColorAttributeName inRange:range options:0 usingBlock:^(id value, NSRange range, BOOL *stop) { + if ([value isEqual:compareValue]) { + [self removeAttribute:(NSString *)kCTForegroundColorAttributeName range:range]; + } + + }]; +} + + +- (void)addRanges:(NSArray *)array withColor:(UIColor *)color +{ + for (NSValue *value in array) { + [self removeAttribute:(NSString *)kCTForegroundColorAttributeName range:value.rangeValue]; + [self addAttribute:(NSString *)kCTForegroundColorAttributeName value:color range:value.rangeValue]; + } +} + +- (void)addRanges:(NSArray *)array withAttributes:(NSDictionary *)dic +{ + for (NSValue *value in array) { + if (value.rangeValue.location + value.rangeValue.length <= self.length){ + [self removeAttribute:(NSString *)kCTForegroundColorAttributeName range:value.rangeValue]; + [self addAttributes:dic range:value.rangeValue]; + } + } +} + +- (NSArray *)allMatchesOfPattern:(NSString *)pattern inString:(NSString *)string +{ + NSArray *mathces = [[NSRegularExpression regularExpressionWithPattern:pattern options:0 error:nil] matchesInString:string options:0 range:NSMakeRange(0, string.length)]; + + return mathces; +} + +- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color andDescription:(NSString *)description +{ + [self addRegularExpressionWithPattern:pattern withColor:color options:0 andDescription:description]; +} + +- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color group:(int)index range:(NSRange)range andDescription:(NSString *)description +{ + NSString *string = self.string; + + + NSRegularExpression* expression = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionAnchorsMatchLines error:nil]; + + [expression enumerateMatchesInString:string options:0 range:range usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { + [self addAttribute:(NSString *)kCTForegroundColorAttributeName value:color range:[result rangeAtIndex:index]]; + }]; +} + +- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color options:(NSRegularExpressionOptions)options andDescription:(NSString *)description +{ + [self addRegularExpressionWithPattern:pattern withColor:color options:options range:NSMakeRange(0, self.length) andDescription:description]; +} + +- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color options:(NSRegularExpressionOptions)options range:(NSRange)range andDescription:(NSString *)description +{ + NSString *string = self.string; + NSRegularExpression* expression = [NSRegularExpression regularExpressionWithPattern:pattern options:options error:nil]; + + [expression enumerateMatchesInString:string options:options range:range usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { + [self addAttribute:(NSString *)kCTForegroundColorAttributeName value:color range:result.range]; + }]; +} + +- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color range:(NSRange)range andDescription:(NSString *)description +{ + [self addRegularExpressionWithPattern:pattern withColor:color options:0 range:range andDescription:description]; +} + +@end diff --git a/Chromatism/Menlo.ttf b/Chromatism/Menlo.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c20a0001739181a04a66b1006c543a2f44c21a55 GIT binary patch literal 2172912 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 WZXT#&?Eki=Y WZXT#&?E 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�%7hfbaTrCc0%tDCbv^#*My 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

w=z)8+A@DO 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 -#import - -#define MARGIN 8 - -@interface TextLineCell : UITableViewCell - -@property (nonatomic, assign) CTLineRef line; -@end diff --git a/Chromatism/TextLineCell.m b/Chromatism/TextLineCell.m deleted file mode 100644 index 6d2fc3f..0000000 --- a/Chromatism/TextLineCell.m +++ /dev/null @@ -1,59 +0,0 @@ -// -// LineLayer.m -// iGitpad -// -// Created by Johannes Lund on 2012-12-17. -// -// - -#import "TextLineCell.h" - -@implementation TextLineCell { - CTLineRef _line; -} - -- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier -{ - self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; - if (self) { - self.layer.geometryFlipped = YES; - } - return self; -} - -- (id)initWithFrame:(CGRect)frame -{ - self = [super initWithFrame:frame]; - if (self) { - self.layer.geometryFlipped = YES; - } - return self; -} - -- (id)initWithCoder:(NSCoder *)aDecoder -{ - self = [super initWithCoder:aDecoder]; - if (self) { - self.layer.geometryFlipped = YES; - } - return self; -} - -#define MARGIN 8 -- (void)drawRect:(CGRect)rect -{ - CGContextRef context = UIGraphicsGetCurrentContext(); - CGContextSetTextPosition(context, MARGIN, MARGIN/2); - CTLineDraw(self.line, context); -} - -- (UIView *)backgroundView -{ - return nil; -} - -- (UIView *)contentView -{ - return nil; -} -@end diff --git a/Chromatism/ViewController.h b/Chromatism/ViewController.h deleted file mode 100644 index 50d3ffb..0000000 --- a/Chromatism/ViewController.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// ViewController.h -// Chromatism -// -// Created by Johannes Lund on 2013-01-08. -// Copyright (c) 2013 Anviking. All rights reserved. -// - -#import - -@class JLTextView; -@interface ViewController : UIViewController - -@property (nonatomic, weak) JLTextView *textView; -@end diff --git a/Chromatism/ViewController.m b/Chromatism/ViewController.m deleted file mode 100644 index 799f25c..0000000 --- a/Chromatism/ViewController.m +++ /dev/null @@ -1,47 +0,0 @@ -// -// ViewController.m -// Chromatism -// -// Created by Johannes Lund on 2013-01-08. -// Copyright (c) 2013 Anviking. All rights reserved. -// - -#import "ViewController.h" -#import "JLTextView.h" - -@interface ViewController () -@end - -@implementation ViewController - -- (void)viewDidLoad -{ - [super viewDidLoad]; -} - -- (void)viewDidAppear:(BOOL)animated -{ - [super viewDidAppear:animated]; - - //There are some problems with the textView when setting text while its frame isn't yet set. - self.textView.text = [[NSString alloc] initWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"text" withExtension:@"txt"] encoding:NSUTF8StringEncoding error:nil]; -} - -- (void)loadView -{ - JLTextView *textView = [[JLTextView alloc] initWithFrame:CGRectZero]; - textView.autoresizingMask = UIViewAutoresizingFlexibleHeight; - textView.font = [UIFont fontWithName:@"Menlo-Regular" size:13]; - textView.syntaxTokenizer = [[JLTokenizer alloc] init]; - textView.syntaxTokenizer.theme = kTokenizerThemeDusk; - self.view = textView; - self.textView = textView; -} - -- (void)didReceiveMemoryWarning -{ - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. -} - -@end diff --git a/Chromatism/en.lproj/MainStoryboard_iPad.storyboard b/Chromatism/en.lproj/MainStoryboard_iPad.storyboard deleted file mode 100644 index 9fbe23e..0000000 --- a/Chromatism/en.lproj/MainStoryboard_iPad.storyboard +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Chromatism/en.lproj/MainStoryboard_iPhone.storyboard b/Chromatism/en.lproj/MainStoryboard_iPhone.storyboard deleted file mode 100644 index d29ca54..0000000 --- a/Chromatism/en.lproj/MainStoryboard_iPhone.storyboard +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Chromatism/main.m b/Chromatism/main.m deleted file mode 100644 index b089aaf..0000000 --- a/Chromatism/main.m +++ /dev/null @@ -1,18 +0,0 @@ -// -// main.m -// Chromatism -// -// Created by Johannes Lund on 2013-01-08. -// Copyright (c) 2013 Anviking. All rights reserved. -// - -#import - -#import "AppDelegate.h" - -int main(int argc, char *argv[]) -{ - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} diff --git a/Chromatism/text.txt b/Chromatism/text.txt deleted file mode 100644 index b45ecdc..0000000 --- a/Chromatism/text.txt +++ /dev/null @@ -1,856 +0,0 @@ -00 -0000 1111 2222 3333 4444 5555 6666 -7777 8888 9999 - -00 -01 -02 -03 -04 -05 -06 -// -// Tokenizer.m -// iGitpad -// -// Created by Johannes Lund on 2012-11-24. -// -// - -// This file builds upon the work of Kristian Kraljic -// -// RegexHighlightView.m -// Simple Objective-C Syntax Highlighter -// -// Created by Kristian Kraljic on 30/08/12. -// Copyright (c) 2012 Kristian Kraljic (dikrypt.com, ksquared.de). 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. -// - -#import "JLTokenizer.h" -#import - -NSString *const kTokenizerTypeText = @"text"; -NSString *const kTokenizerTypeBackground = @"background"; -NSString *const kTokenizerTypeComment = @"comment"; -NSString *const kTokenizerTypeDocumentationComment = @"documentation_comment"; -NSString *const kTokenizerTypeDocumentationCommentKeyword = @"documentation_comment_keyword"; -NSString *const kTokenizerTypeString = @"string"; -NSString *const kTokenizerTypeCharacter = @"character"; -NSString *const kTokenizerTypeNumber = @"number"; -NSString *const kTokenizerTypeKeyword = @"keyword"; -NSString *const kTokenizerTypePreprocessor = @"preprocessor"; -NSString *const kTokenizerTypeURL = @"url"; -NSString *const kTokenizerTypeAttribute = @"attribute"; -NSString *const kTokenizerTypeProject = @"project"; -NSString *const kTokenizerTypeOther = @"other"; -NSString *const kTokenizerTypeOtherMethodNames = @"other_method_names"; -NSString *const kTokenizerTypeOtherClassNames = @"other_class_names"; - -@interface NSMutableAttributedString (Regex) -- (void)addRanges:(NSArray *)array withColor:(UIColor *)color; -- (void)addRanges:(NSArray *)array withAttributes:(NSDictionary *)dic; -- (NSArray *)allMatchesOfPattern:(NSString *)pattern inString:(NSString *)string; - -- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color andDescription:(NSString *)description; -- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color range:(NSRange)range andDescription:(NSString *)description; -- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color group:(int)index range:(NSRange)range andDescription:(NSString *)description; -- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color options:(NSRegularExpressionOptions)options andDescription:(NSString *)description; -- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color options:(NSRegularExpressionOptions)options range:(NSRange)range andDescription:(NSString *)description; -- (void)removeAttribute:(NSString *)name withValue:(id)compareValue range:(NSRange)range; -@end - -@interface JLTokenizer () - -+ (NSDictionary*)highlightTheme:(RegexHighlightViewTheme)theme; - -@end - -@implementation JLTokenizer -@synthesize theme = _theme; - -- (NSMutableAttributedString *)tokenizeAttributedString:(NSMutableAttributedString *)string withRecentTextViewChange:(TextViewChange *)options { - UIColor *color; - color = [UIColor blueColor]; - - if (string.length == 0) return string; - - NSRange newWord = NSMakeRange(options.range.location, options.replacementText.length); - NSRange currentLine = NSMakeRange(0, string.length); - NSRange stringRange = currentLine; - if (options) { - NSRange start = [string.string rangeOfString:@"\n" options:NSBackwardsSearch range:NSMakeRange(0, newWord.location)]; - NSRange stop = [string.string rangeOfString:@"\n" options:0 range:NSMakeRange(newWord.length+newWord.location, string.length-(newWord.location+newWord.length))]; - - int location = MIN(MAX(start.location, 0), string.length); - int length = MIN(MAX(0,(stop.location+stop.length-location)), string.length-location); - - currentLine = NSMakeRange(location, length); - } - - NSDictionary *dic = self.colorDictionary; - - //Clear the comments to later be rebuilt - UIColor *compareColor = dic[kTokenizerTypeComment]; - [string removeAttribute:(NSString *)kCTForegroundColorAttributeName withValue:compareColor range:stringRange]; - - [string removeAttribute:(NSString *)kCTForegroundColorAttributeName range:currentLine]; - [string addAttribute:(NSString *)kCTForegroundColorAttributeName value:dic[kTokenizerTypeText] range:currentLine]; - - //TODO: Much more cleanup is needed - - - color = dic[kTokenizerTypeNumber]; - - [string addRegularExpressionWithPattern:@"(?<=\\s)\\d+" withColor:color range:currentLine andDescription:@"Numbers"]; - - [string addRegularExpressionWithPattern:@"@\\s*[\(|\{|\[]" withColor:color andDescription:@"New literals"]; - - //C – functions and similiar – foo(whatever msö409å5jt) - color = dic[kTokenizerTypeOtherMethodNames]; - [string addRegularExpressionWithPattern:@"\\w+\\s*(?>\\(.*\\)" withColor:color group:1 range:currentLine andDescription:@"C function names"]; - - //Dot notation - [string addRegularExpressionWithPattern:@"\\.(\\w+)" withColor:color group:1 range:currentLine andDescription:@"Dot notation"]; - - //Method calls - [string addRegularExpressionWithPattern:@"\\[\\w+\\s+(\\w+)\\]" withColor:color group:1 range:currentLine andDescription:@"Method calls"]; - [string addRegularExpressionWithPattern:@"(?<=\\w+):\\s*[^\\s;\\]]+" withColor:color group:1 range:currentLine andDescription:@"Method calls parts"]; - - color = dic[kTokenizerTypeOtherClassNames]; - [string addRegularExpressionWithPattern:@"(\\b(?>NS|UI))\\w+\\b" withColor:color range:currentLine andDescription:@"UIKit and NS"]; - - color = dic[kTokenizerTypeKeyword]; - [string addRegularExpressionWithPattern:@"(?<=\\b)(?>true|false|yes|no|TRUE|FALSE|bool|BOOL|nil|id|void|self|NULL|if|else|strong|weak|nonatomic|atomic|assign|copy|typedef|enum|auto|break|case|const|char|continue|do|default|double|extern|float|for|goto|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|volatile|while|nonatomic|atomic|readonly)(\\b)" withColor:color range:currentLine andDescription:@"Keywords"]; - - - [string addRegularExpressionWithPattern:@"@[a-zA-Z0-9_]+" withColor:color range:currentLine andDescription:@"@things"]; - - color = dic[kTokenizerTypePreprocessor]; - [string addRegularExpressionWithPattern:@"#.*+\n" withColor:color range:currentLine andDescription:@"Prefixes"]; - - color = dic[kTokenizerTypeString]; - [string addRegularExpressionWithPattern:@"(\"|@\")[^\"]*(@\"|\")" withColor:color andDescription:@"Strings"]; - - color = dic[kTokenizerTypeComment]; - [string addRegularExpressionWithPattern:@"//.*+\n" withColor:color andDescription:@"Comments"]; - - [string addRegularExpressionWithPattern:@"/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*+/" withColor:color andDescription:@"Comments"]; - - return string; -} - -#pragma mark - Pattern help - -- (NSString *)patternBetweenString:(NSString *)start andString:(NSString *)stop -{ - return nil; -} - -#pragma mark - Color shemes - - - --(void)setTheme:(RegexHighlightViewTheme)theme -{ - self.colorDictionary = [JLTokenizer highlightTheme:theme]; - _theme = theme; - - //Set font, text color and background color back to default - UIColor* backgroundColor = self.colorDictionary[kTokenizerTypeBackground]; - if(backgroundColor) - self.backgroundColor = backgroundColor; - else self.backgroundColor = [UIColor whiteColor]; -} - -- (NSDictionary *)colorDictionary -{ - if (!_colorDictionary) { - _colorDictionary = [JLTokenizer highlightTheme:self.theme]; - } - return _colorDictionary; -} - -- (NSArray *)themes -{ - if (!_themes) _themes = @[@(kTokenizerThemeDefault),@(kTokenizerThemeDusk)]; - return _themes; -} - -- (RegexHighlightViewTheme)theme -{ - if (!_theme) _theme = kTokenizerThemeDefault; - return _theme; -} - -+ (NSDictionary*)highlightTheme:(RegexHighlightViewTheme)theme { - //Check if the highlight theme has already been defined - NSDictionary* themeColor = nil; - //If not define the theme and return it - switch(theme) { - case kTokenizerThemeBasic: - themeColor = @{kTokenizerTypeText: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], - kTokenizerTypeBackground: [UIColor colorWithRed:255.0/255 green:255.0/255 blue:255.0/255 alpha:1], - kTokenizerTypeComment: [UIColor colorWithRed:0.0/255 green:142.0/255 blue:43.0/255 alpha:1], - kTokenizerTypeDocumentationComment: [UIColor colorWithRed:0.0/255 green:142.0/255 blue:43.0/255 alpha:1], - kTokenizerTypeDocumentationCommentKeyword: [UIColor colorWithRed:0.0/255 green:142.0/255 blue:43.0/255 alpha:1], - kTokenizerTypeString: [UIColor colorWithRed:181.0/255 green:37.0/255 blue:34.0/255 alpha:1], - kTokenizerTypeCharacter: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], - kTokenizerTypeNumber: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], - kTokenizerTypeKeyword: [UIColor colorWithRed:6.0/255 green:63.0/255 blue:244.0/255 alpha:1], - kTokenizerTypePreprocessor: [UIColor colorWithRed:6.0/255 green:63.0/255 blue:244.0/255 alpha:1], - kTokenizerTypeURL: [UIColor colorWithRed:6.0/255 green:63.0/255 blue:244.0/255 alpha:1], - kTokenizerTypeAttribute: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], - kTokenizerTypeProject: [UIColor colorWithRed:49.0/255 green:149.0/255 blue:172.0/255 alpha:1], - kTokenizerTypeOther: [UIColor colorWithRed:49.0/255 green:149.0/255 blue:172.0/255 alpha:1]}; - break; - case kTokenizerThemeDefault: - themeColor = @{kTokenizerTypeText: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], - kTokenizerTypeBackground: [UIColor colorWithRed:255.0/255 green:255.0/255 blue:255.0/255 alpha:1], - kTokenizerTypeComment: [UIColor colorWithRed:0.0/255 green:131.0/255 blue:39.0/255 alpha:1], - kTokenizerTypeDocumentationComment: [UIColor colorWithRed:0.0/255 green:131.0/255 blue:39.0/255 alpha:1], - kTokenizerTypeDocumentationCommentKeyword: [UIColor colorWithRed:0.0/255 green:76.0/255 blue:29.0/255 alpha:1], - kTokenizerTypeString: [UIColor colorWithRed:211.0/255 green:45.0/255 blue:38.0/255 alpha:1], - kTokenizerTypeCharacter: [UIColor colorWithRed:40.0/255 green:52.0/255 blue:206.0/255 alpha:1], - kTokenizerTypeNumber: [UIColor colorWithRed:40.0/255 green:52.0/255 blue:206.0/255 alpha:1], - kTokenizerTypeKeyword: [UIColor colorWithRed:188.0/255 green:49.0/255 blue:156.0/255 alpha:1], - kTokenizerTypePreprocessor: [UIColor colorWithRed:120.0/255 green:72.0/255 blue:48.0/255 alpha:1], - kTokenizerTypeURL: [UIColor colorWithRed:21.0/255 green:67.0/255 blue:244.0/255 alpha:1], - kTokenizerTypeAttribute: [UIColor colorWithRed:150.0/255 green:125.0/255 blue:65.0/255 alpha:1], - kTokenizerTypeProject: [UIColor colorWithRed:77.0/255 green:129.0/255 blue:134.0/255 alpha:1], - kTokenizerTypeOther: [UIColor colorWithRed:113.0/255 green:65.0/255 blue:163.0/255 alpha:1], - kTokenizerTypeOtherMethodNames : [UIColor colorWithHex:@"7040a6" alpha:1], - kTokenizerTypeOtherClassNames : [UIColor colorWithHex:@"7040a6" alpha:1] - - - - }; - break; - case kTokenizerThemeDusk: - themeColor = @{kTokenizerTypeText: [UIColor whiteColor], - kTokenizerTypeBackground: [UIColor colorWithRed:30.0/255.0 green:32.0/255.0 blue:40.0/255.0 alpha:1], - kTokenizerTypeComment: [UIColor colorWithRed:72.0/255 green:190.0/255 blue:102.0/255 alpha:1], - kTokenizerTypeDocumentationComment: [UIColor colorWithRed:72.0/255 green:190.0/255 blue:102.0/255 alpha:1], - kTokenizerTypeDocumentationCommentKeyword: [UIColor colorWithRed:72.0/255 green:190.0/255 blue:102.0/255 alpha:1], - kTokenizerTypeString: [UIColor colorWithRed:230.0/255 green:66.0/255 blue:75.0/255 alpha:1], - kTokenizerTypeCharacter: [UIColor colorWithRed:139.0/255 green:134.0/255 blue:201.0/255 alpha:1], - kTokenizerTypeNumber: [UIColor colorWithRed:139.0/255 green:134.0/255 blue:201.0/255 alpha:1], - kTokenizerTypeKeyword: [UIColor colorWithRed:195.0/255 green:55.0/255 blue:149.0/255 alpha:1], - kTokenizerTypePreprocessor: [UIColor colorWithRed:198.0/255.0 green:124.0/255.0 blue:72.0/255.0 alpha:1], - kTokenizerTypeURL: [UIColor colorWithRed:35.0/255 green:63.0/255 blue:208.0/255 alpha:1], - kTokenizerTypeAttribute: [UIColor colorWithRed:103.0/255 green:135.0/255 blue:142.0/255 alpha:1], - kTokenizerTypeProject: [UIColor colorWithRed:146.0/255 green:199.0/255 blue:119.0/255 alpha:1], - kTokenizerTypeOther: [UIColor colorWithRed:0.0/255 green:175.0/255 blue:199.0/255 alpha:1], - kTokenizerTypeOtherClassNames : [UIColor colorWithHex:@"04afc8" alpha:1], - kTokenizerTypeOtherMethodNames : [UIColor colorWithHex:@"04afc8" alpha:1] - }; - break; - case kTokenizerThemeLowKey: - themeColor = @{kTokenizerTypeText: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], - kTokenizerTypeBackground: [UIColor colorWithRed:255.0/255 green:255.0/255 blue:255.0/255 alpha:1], - kTokenizerTypeComment: [UIColor colorWithRed:84.0/255 green:99.0/255 blue:75.0/255 alpha:1], - kTokenizerTypeDocumentationComment: [UIColor colorWithRed:84.0/255 green:99.0/255 blue:75.0/255 alpha:1], - kTokenizerTypeDocumentationCommentKeyword: [UIColor colorWithRed:84.0/255 green:99.0/255 blue:75.0/255 alpha:1], - kTokenizerTypeString: [UIColor colorWithRed:133.0/255 green:63.0/255 blue:98.0/255 alpha:1], - kTokenizerTypeCharacter: [UIColor colorWithRed:50.0/255 green:64.0/255 blue:121.0/255 alpha:1], - kTokenizerTypeNumber: [UIColor colorWithRed:50.0/255 green:64.0/255 blue:121.0/255 alpha:1], - kTokenizerTypeKeyword: [UIColor colorWithRed:50.0/255 green:64.0/255 blue:121.0/255 alpha:1], - kTokenizerTypePreprocessor: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], - kTokenizerTypeURL: [UIColor colorWithRed:24.0/255 green:49.0/255 blue:168.0/255 alpha:1], - kTokenizerTypeAttribute: [UIColor colorWithRed:35.0/255 green:93.0/255 blue:43.0/255 alpha:1], - kTokenizerTypeProject: [UIColor colorWithRed:87.0/255 green:127.0/255 blue:164.0/255 alpha:1], - kTokenizerTypeOther: [UIColor colorWithRed:87.0/255 green:127.0/255 blue:164.0/255 alpha:1]}; - break; - case kTokenizerThemeMidnight: - themeColor = @{kTokenizerTypeText: [UIColor colorWithRed:255.0/255 green:255.0/255 blue:255.0/255 alpha:1], - kTokenizerTypeBackground: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], - kTokenizerTypeComment: [UIColor colorWithRed:69.0/255 green:208.0/255 blue:106.0/255 alpha:1], - kTokenizerTypeDocumentationComment: [UIColor colorWithRed:69.0/255 green:208.0/255 blue:106.0/255 alpha:1], - kTokenizerTypeDocumentationCommentKeyword: [UIColor colorWithRed:69.0/255 green:208.0/255 blue:106.0/255 alpha:1], - kTokenizerTypeString: [UIColor colorWithRed:255.0/255 green:68.0/255 blue:77.0/255 alpha:1], - kTokenizerTypeCharacter: [UIColor colorWithRed:139.0/255 green:138.0/255 blue:247.0/255 alpha:1], - kTokenizerTypeNumber: [UIColor colorWithRed:139.0/255 green:138.0/255 blue:247.0/255 alpha:1], - kTokenizerTypeKeyword: [UIColor colorWithRed:224.0/255 green:59.0/255 blue:160.0/255 alpha:1], - kTokenizerTypePreprocessor: [UIColor colorWithRed:237.0/255 green:143.0/255 blue:100.0/255 alpha:1], - kTokenizerTypeURL: [UIColor colorWithRed:36.0/255 green:72.0/255 blue:244.0/255 alpha:1], - kTokenizerTypeAttribute: [UIColor colorWithRed:79.0/255 green:108.0/255 blue:132.0/255 alpha:1], - kTokenizerTypeProject: [UIColor colorWithRed:0.0/255 green:249.0/255 blue:161.0/255 alpha:1], - kTokenizerTypeOther: [UIColor colorWithRed:0.0/255 green:179.0/255 blue:248.0/255 alpha:1]}; - break; - case kTokenizerThemePresentation: - themeColor = @{kTokenizerTypeText: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], - kTokenizerTypeBackground: [UIColor colorWithRed:255.0/255 green:255.0/255 blue:255.0/255 alpha:1], - kTokenizerTypeComment: [UIColor colorWithRed:38.0/255 green:126.0/255 blue:61.0/255 alpha:1], - kTokenizerTypeDocumentationComment: [UIColor colorWithRed:38.0/255 green:126.0/255 blue:61.0/255 alpha:1], - kTokenizerTypeDocumentationCommentKeyword: [UIColor colorWithRed:38.0/255 green:126.0/255 blue:61.0/255 alpha:1], - kTokenizerTypeString: [UIColor colorWithRed:158.0/255 green:32.0/255 blue:32.0/255 alpha:1], - kTokenizerTypeCharacter: [UIColor colorWithRed:6.0/255 green:63.0/255 blue:244.0/255 alpha:1], - kTokenizerTypeNumber: [UIColor colorWithRed:6.0/255 green:63.0/255 blue:244.0/255 alpha:1], - kTokenizerTypeKeyword: [UIColor colorWithRed:140.0/255 green:34.0/255 blue:96.0/255 alpha:1], - kTokenizerTypePreprocessor: [UIColor colorWithRed:125.0/255 green:72.0/255 blue:49.0/255 alpha:1], - kTokenizerTypeURL: [UIColor colorWithRed:21.0/255 green:67.0/255 blue:244.0/255 alpha:1], - kTokenizerTypeAttribute: [UIColor colorWithRed:150.0/255 green:125.0/255 blue:65.0/255 alpha:1], - kTokenizerTypeProject: [UIColor colorWithRed:77.0/255 green:129.0/255 blue:134.0/255 alpha:1], - kTokenizerTypeOther: [UIColor colorWithRed:113.0/255 green:65.0/255 blue:163.0/255 alpha:1]}; - break; - case kTokenizerThemePrinting: - themeColor = @{kTokenizerTypeText: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], - kTokenizerTypeBackground: [UIColor colorWithRed:255.0/255 green:255.0/255 blue:255.0/255 alpha:1], - kTokenizerTypeComment: [UIColor colorWithRed:113.0/255 green:113.0/255 blue:113.0/255 alpha:1], - kTokenizerTypeDocumentationComment: [UIColor colorWithRed:113.0/255 green:113.0/255 blue:113.0/255 alpha:1], - kTokenizerTypeDocumentationCommentKeyword: [UIColor colorWithRed:64.0/255 green:64.0/255 blue:64.0/255 alpha:1], - kTokenizerTypeString: [UIColor colorWithRed:112.0/255 green:112.0/255 blue:112.0/255 alpha:1], - kTokenizerTypeCharacter: [UIColor colorWithRed:71.0/255 green:71.0/255 blue:71.0/255 alpha:1], - kTokenizerTypeNumber: [UIColor colorWithRed:71.0/255 green:71.0/255 blue:71.0/255 alpha:1], - kTokenizerTypeKeyword: [UIColor colorWithRed:108.0/255 green:108.0/255 blue:108.0/255 alpha:1], - kTokenizerTypePreprocessor: [UIColor colorWithRed:85.0/255 green:85.0/255 blue:85.0/255 alpha:1], - kTokenizerTypeURL: [UIColor colorWithRed:84.0/255 green:84.0/255 blue:84.0/255 alpha:1], - kTokenizerTypeAttribute: [UIColor colorWithRed:129.0/255 green:129.0/255 blue:129.0/255 alpha:1], - kTokenizerTypeProject: [UIColor colorWithRed:120.0/255 green:120.0/255 blue:120.0/255 alpha:1], - kTokenizerTypeOther: [UIColor colorWithRed:86.0/255 green:86.0/255 blue:86.0/255 alpha:1]}; - break; - case kTokenizerThemeSunset: - themeColor = @{kTokenizerTypeText: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], - kTokenizerTypeBackground: [UIColor colorWithRed:255.0/255 green:252.0/255 blue:236.0/255 alpha:1], - kTokenizerTypeComment: [UIColor colorWithRed:208.0/255 green:134.0/255 blue:59.0/255 alpha:1], - kTokenizerTypeDocumentationComment: [UIColor colorWithRed:208.0/255 green:134.0/255 blue:59.0/255 alpha:1], - kTokenizerTypeDocumentationCommentKeyword: [UIColor colorWithRed:190.0/255 green:116.0/255 blue:55.0/255 alpha:1], - kTokenizerTypeString: [UIColor colorWithRed:234.0/255 green:32.0/255 blue:24.0/255 alpha:1], - kTokenizerTypeCharacter: [UIColor colorWithRed:53.0/255 green:87.0/255 blue:134.0/255 alpha:1], - kTokenizerTypeNumber: [UIColor colorWithRed:53.0/255 green:87.0/255 blue:134.0/255 alpha:1], - kTokenizerTypeKeyword: [UIColor colorWithRed:53.0/255 green:87.0/255 blue:134.0/255 alpha:1], - kTokenizerTypePreprocessor: [UIColor colorWithRed:119.0/255 green:121.0/255 blue:148.0/255 alpha:1], - kTokenizerTypeURL: [UIColor colorWithRed:85.0/255 green:99.0/255 blue:179.0/255 alpha:1], - kTokenizerTypeAttribute: [UIColor colorWithRed:58.0/255 green:76.0/255 blue:166.0/255 alpha:1], - kTokenizerTypeProject: [UIColor colorWithRed:196.0/255 green:88.0/255 blue:31.0/255 alpha:1], - kTokenizerTypeOther: [UIColor colorWithRed:196.0/255 green:88.0/255 blue:31.0/255 alpha:1]}; - break; - } - return themeColor; -} - - -@end - -#pragma mark - Regex Helpers - - -@implementation NSMutableAttributedString (Regex) - -- (void)removeAttribute:(NSString *)name withValue:(id)compareValue range:(NSRange)range -{ - [self enumerateAttribute:(NSString *)kCTForegroundColorAttributeName inRange:range options:0 usingBlock:^(id value, NSRange range, BOOL *stop) { - if ([value isEqual:compareValue]) { - [self removeAttribute:(NSString *)kCTForegroundColorAttributeName range:range]; - } - - }]; -} - - -- (void)addRanges:(NSArray *)array withColor:(UIColor *)color -{ - for (NSValue *value in array) { - [self removeAttribute:(NSString *)kCTForegroundColorAttributeName range:value.rangeValue]; - [self addAttribute:(NSString *)kCTForegroundColorAttributeName value:color range:value.rangeValue]; - } -} - -- (void)addRanges:(NSArray *)array withAttributes:(NSDictionary *)dic -{ - for (NSValue *value in array) { - if (value.rangeValue.location + value.rangeValue.length <= self.length){ - [self removeAttribute:(NSString *)kCTForegroundColorAttributeName range:value.rangeValue]; - [self addAttributes:dic range:value.rangeValue]; - } - } -} - -- (NSArray *)allMatchesOfPattern:(NSString *)pattern inString:(NSString *)string -{ - NSArray *mathces = [[NSRegularExpression regularExpressionWithPattern:pattern options:0 error:nil] matchesInString:string options:0 range:NSMakeRange(0, string.length)]; - - return mathces; -} - -- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color andDescription:(NSString *)description -{ - [self addRegularExpressionWithPattern:pattern withColor:color options:0 andDescription:description]; -} - -- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color group:(int)index range:(NSRange)range andDescription:(NSString *)description -{ - NSString *string = self.string; - - - NSRegularExpression* expression = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionAnchorsMatchLines error:nil]; - - [expression enumerateMatchesInString:string options:0 range:range usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { - [self addAttribute:(NSString *)kCTForegroundColorAttributeName value:color range:[result rangeAtIndex:index]]; - }]; -} - -- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color options:(NSRegularExpressionOptions)options andDescription:(NSString *)description -{ - [self addRegularExpressionWithPattern:pattern withColor:color options:options range:NSMakeRange(0, self.length) andDescription:description]; -} - -- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color options:(NSRegularExpressionOptions)options range:(NSRange)range andDescription:(NSString *)description -{ - NSString *string = self.string; - NSRegularExpression* expression = [NSRegularExpression regularExpressionWithPattern:pattern options:options error:nil]; - - [expression enumerateMatchesInString:string options:options range:range usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { - [self addAttribute:(NSString *)kCTForegroundColorAttributeName value:color range:result.range]; - }]; -} - -- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color range:(NSRange)range andDescription:(NSString *)description -{ - [self addRegularExpressionWithPattern:pattern withColor:color options:0 range:range andDescription:description]; -} - -@end - -// -// Tokenizer.m -// iGitpad -// -// Created by Johannes Lund on 2012-11-24. -// -// - -// This file builds upon the work of Kristian Kraljic -// -// RegexHighlightView.m -// Simple Objective-C Syntax Highlighter -// -// Created by Kristian Kraljic on 30/08/12. -// Copyright (c) 2012 Kristian Kraljic (dikrypt.com, ksquared.de). 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. -// - -#import "JLTokenizer.h" -#import - -NSString *const kTokenizerTypeText = @"text"; -NSString *const kTokenizerTypeBackground = @"background"; -NSString *const kTokenizerTypeComment = @"comment"; -NSString *const kTokenizerTypeDocumentationComment = @"documentation_comment"; -NSString *const kTokenizerTypeDocumentationCommentKeyword = @"documentation_comment_keyword"; -NSString *const kTokenizerTypeString = @"string"; -NSString *const kTokenizerTypeCharacter = @"character"; -NSString *const kTokenizerTypeNumber = @"number"; -NSString *const kTokenizerTypeKeyword = @"keyword"; -NSString *const kTokenizerTypePreprocessor = @"preprocessor"; -NSString *const kTokenizerTypeURL = @"url"; -NSString *const kTokenizerTypeAttribute = @"attribute"; -NSString *const kTokenizerTypeProject = @"project"; -NSString *const kTokenizerTypeOther = @"other"; -NSString *const kTokenizerTypeOtherMethodNames = @"other_method_names"; -NSString *const kTokenizerTypeOtherClassNames = @"other_class_names"; - -@interface NSMutableAttributedString (Regex) -- (void)addRanges:(NSArray *)array withColor:(UIColor *)color; -- (void)addRanges:(NSArray *)array withAttributes:(NSDictionary *)dic; -- (NSArray *)allMatchesOfPattern:(NSString *)pattern inString:(NSString *)string; - -- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color andDescription:(NSString *)description; -- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color range:(NSRange)range andDescription:(NSString *)description; -- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color group:(int)index range:(NSRange)range andDescription:(NSString *)description; -- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color options:(NSRegularExpressionOptions)options andDescription:(NSString *)description; -- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color options:(NSRegularExpressionOptions)options range:(NSRange)range andDescription:(NSString *)description; -- (void)removeAttribute:(NSString *)name withValue:(id)compareValue range:(NSRange)range; -@end - -@interface JLTokenizer () - -+ (NSDictionary*)highlightTheme:(RegexHighlightViewTheme)theme; - -@end - -@implementation JLTokenizer -@synthesize theme = _theme; - -- (NSMutableAttributedString *)tokenizeAttributedString:(NSMutableAttributedString *)string withRecentTextViewChange:(TextViewChange *)options { - UIColor *color; - color = [UIColor blueColor]; - - if (string.length == 0) return string; - - NSRange newWord = NSMakeRange(options.range.location, options.replacementText.length); - NSRange currentLine = NSMakeRange(0, string.length); - NSRange stringRange = currentLine; - if (options) { - NSRange start = [string.string rangeOfString:@"\n" options:NSBackwardsSearch range:NSMakeRange(0, newWord.location)]; - NSRange stop = [string.string rangeOfString:@"\n" options:0 range:NSMakeRange(newWord.length+newWord.location, string.length-(newWord.location+newWord.length))]; - - int location = MIN(MAX(start.location, 0), string.length); - int length = MIN(MAX(0,(stop.location+stop.length-location)), string.length-location); - - currentLine = NSMakeRange(location, length); - } - - NSDictionary *dic = self.colorDictionary; - - //Clear the comments to later be rebuilt - UIColor *compareColor = dic[kTokenizerTypeComment]; - [string removeAttribute:(NSString *)kCTForegroundColorAttributeName withValue:compareColor range:stringRange]; - - [string removeAttribute:(NSString *)kCTForegroundColorAttributeName range:currentLine]; - [string addAttribute:(NSString *)kCTForegroundColorAttributeName value:dic[kTokenizerTypeText] range:currentLine]; - - //TODO: Much more cleanup is needed - - - color = dic[kTokenizerTypeNumber]; - - [string addRegularExpressionWithPattern:@"(?<=\\s)\\d+" withColor:color range:currentLine andDescription:@"Numbers"]; - - [string addRegularExpressionWithPattern:@"@\\s*[\(|\{|\[]" withColor:color andDescription:@"New literals"]; - - //C – functions and similiar – foo(whatever msö409å5jt) - color = dic[kTokenizerTypeOtherMethodNames]; - [string addRegularExpressionWithPattern:@"\\w+\\s*(?>\\(.*\\)" withColor:color group:1 range:currentLine andDescription:@"C function names"]; - - //Dot notation - [string addRegularExpressionWithPattern:@"\\.(\\w+)" withColor:color group:1 range:currentLine andDescription:@"Dot notation"]; - - //Method calls - [string addRegularExpressionWithPattern:@"\\[\\w+\\s+(\\w+)\\]" withColor:color group:1 range:currentLine andDescription:@"Method calls"]; - [string addRegularExpressionWithPattern:@"(?<=\\w+):\\s*[^\\s;\\]]+" withColor:color group:1 range:currentLine andDescription:@"Method calls parts"]; - - color = dic[kTokenizerTypeOtherClassNames]; - [string addRegularExpressionWithPattern:@"(\\b(?>NS|UI))\\w+\\b" withColor:color range:currentLine andDescription:@"UIKit and NS"]; - - color = dic[kTokenizerTypeKeyword]; - [string addRegularExpressionWithPattern:@"(?<=\\b)(?>true|false|yes|no|TRUE|FALSE|bool|BOOL|nil|id|void|self|NULL|if|else|strong|weak|nonatomic|atomic|assign|copy|typedef|enum|auto|break|case|const|char|continue|do|default|double|extern|float|for|goto|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|volatile|while|nonatomic|atomic|readonly)(\\b)" withColor:color range:currentLine andDescription:@"Keywords"]; - - - [string addRegularExpressionWithPattern:@"@[a-zA-Z0-9_]+" withColor:color range:currentLine andDescription:@"@things"]; - - color = dic[kTokenizerTypePreprocessor]; - [string addRegularExpressionWithPattern:@"#.*+\n" withColor:color range:currentLine andDescription:@"Prefixes"]; - - color = dic[kTokenizerTypeString]; - [string addRegularExpressionWithPattern:@"(\"|@\")[^\"]*(@\"|\")" withColor:color andDescription:@"Strings"]; - - color = dic[kTokenizerTypeComment]; - [string addRegularExpressionWithPattern:@"//.*+\n" withColor:color andDescription:@"Comments"]; - - [string addRegularExpressionWithPattern:@"/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*+/" withColor:color andDescription:@"Comments"]; - - return string; -} - -#pragma mark - Pattern help - -- (NSString *)patternBetweenString:(NSString *)start andString:(NSString *)stop -{ - return nil; -} - -#pragma mark - Color shemes - - - --(void)setTheme:(RegexHighlightViewTheme)theme -{ - self.colorDictionary = [JLTokenizer highlightTheme:theme]; - _theme = theme; - - //Set font, text color and background color back to default - UIColor* backgroundColor = self.colorDictionary[kTokenizerTypeBackground]; - if(backgroundColor) - self.backgroundColor = backgroundColor; - else self.backgroundColor = [UIColor whiteColor]; -} - -- (NSDictionary *)colorDictionary -{ - if (!_colorDictionary) { - _colorDictionary = [JLTokenizer highlightTheme:self.theme]; - } - return _colorDictionary; -} - -- (NSArray *)themes -{ - if (!_themes) _themes = @[@(kTokenizerThemeDefault),@(kTokenizerThemeDusk)]; - return _themes; -} - -- (RegexHighlightViewTheme)theme -{ - if (!_theme) _theme = kTokenizerThemeDefault; - return _theme; -} - -+ (NSDictionary*)highlightTheme:(RegexHighlightViewTheme)theme { - //Check if the highlight theme has already been defined - NSDictionary* themeColor = nil; - //If not define the theme and return it - switch(theme) { - case kTokenizerThemeBasic: - themeColor = @{kTokenizerTypeText: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], - kTokenizerTypeBackground: [UIColor colorWithRed:255.0/255 green:255.0/255 blue:255.0/255 alpha:1], - kTokenizerTypeComment: [UIColor colorWithRed:0.0/255 green:142.0/255 blue:43.0/255 alpha:1], - kTokenizerTypeDocumentationComment: [UIColor colorWithRed:0.0/255 green:142.0/255 blue:43.0/255 alpha:1], - kTokenizerTypeDocumentationCommentKeyword: [UIColor colorWithRed:0.0/255 green:142.0/255 blue:43.0/255 alpha:1], - kTokenizerTypeString: [UIColor colorWithRed:181.0/255 green:37.0/255 blue:34.0/255 alpha:1], - kTokenizerTypeCharacter: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], - kTokenizerTypeNumber: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], - kTokenizerTypeKeyword: [UIColor colorWithRed:6.0/255 green:63.0/255 blue:244.0/255 alpha:1], - kTokenizerTypePreprocessor: [UIColor colorWithRed:6.0/255 green:63.0/255 blue:244.0/255 alpha:1], - kTokenizerTypeURL: [UIColor colorWithRed:6.0/255 green:63.0/255 blue:244.0/255 alpha:1], - kTokenizerTypeAttribute: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], - kTokenizerTypeProject: [UIColor colorWithRed:49.0/255 green:149.0/255 blue:172.0/255 alpha:1], - kTokenizerTypeOther: [UIColor colorWithRed:49.0/255 green:149.0/255 blue:172.0/255 alpha:1]}; - break; - case kTokenizerThemeDefault: - themeColor = @{kTokenizerTypeText: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], - kTokenizerTypeBackground: [UIColor colorWithRed:255.0/255 green:255.0/255 blue:255.0/255 alpha:1], - kTokenizerTypeComment: [UIColor colorWithRed:0.0/255 green:131.0/255 blue:39.0/255 alpha:1], - kTokenizerTypeDocumentationComment: [UIColor colorWithRed:0.0/255 green:131.0/255 blue:39.0/255 alpha:1], - kTokenizerTypeDocumentationCommentKeyword: [UIColor colorWithRed:0.0/255 green:76.0/255 blue:29.0/255 alpha:1], - kTokenizerTypeString: [UIColor colorWithRed:211.0/255 green:45.0/255 blue:38.0/255 alpha:1], - kTokenizerTypeCharacter: [UIColor colorWithRed:40.0/255 green:52.0/255 blue:206.0/255 alpha:1], - kTokenizerTypeNumber: [UIColor colorWithRed:40.0/255 green:52.0/255 blue:206.0/255 alpha:1], - kTokenizerTypeKeyword: [UIColor colorWithRed:188.0/255 green:49.0/255 blue:156.0/255 alpha:1], - kTokenizerTypePreprocessor: [UIColor colorWithRed:120.0/255 green:72.0/255 blue:48.0/255 alpha:1], - kTokenizerTypeURL: [UIColor colorWithRed:21.0/255 green:67.0/255 blue:244.0/255 alpha:1], - kTokenizerTypeAttribute: [UIColor colorWithRed:150.0/255 green:125.0/255 blue:65.0/255 alpha:1], - kTokenizerTypeProject: [UIColor colorWithRed:77.0/255 green:129.0/255 blue:134.0/255 alpha:1], - kTokenizerTypeOther: [UIColor colorWithRed:113.0/255 green:65.0/255 blue:163.0/255 alpha:1], - kTokenizerTypeOtherMethodNames : [UIColor colorWithHex:@"7040a6" alpha:1], - kTokenizerTypeOtherClassNames : [UIColor colorWithHex:@"7040a6" alpha:1] - - - - }; - break; - case kTokenizerThemeDusk: - themeColor = @{kTokenizerTypeText: [UIColor whiteColor], - kTokenizerTypeBackground: [UIColor colorWithRed:30.0/255.0 green:32.0/255.0 blue:40.0/255.0 alpha:1], - kTokenizerTypeComment: [UIColor colorWithRed:72.0/255 green:190.0/255 blue:102.0/255 alpha:1], - kTokenizerTypeDocumentationComment: [UIColor colorWithRed:72.0/255 green:190.0/255 blue:102.0/255 alpha:1], - kTokenizerTypeDocumentationCommentKeyword: [UIColor colorWithRed:72.0/255 green:190.0/255 blue:102.0/255 alpha:1], - kTokenizerTypeString: [UIColor colorWithRed:230.0/255 green:66.0/255 blue:75.0/255 alpha:1], - kTokenizerTypeCharacter: [UIColor colorWithRed:139.0/255 green:134.0/255 blue:201.0/255 alpha:1], - kTokenizerTypeNumber: [UIColor colorWithRed:139.0/255 green:134.0/255 blue:201.0/255 alpha:1], - kTokenizerTypeKeyword: [UIColor colorWithRed:195.0/255 green:55.0/255 blue:149.0/255 alpha:1], - kTokenizerTypePreprocessor: [UIColor colorWithRed:198.0/255.0 green:124.0/255.0 blue:72.0/255.0 alpha:1], - kTokenizerTypeURL: [UIColor colorWithRed:35.0/255 green:63.0/255 blue:208.0/255 alpha:1], - kTokenizerTypeAttribute: [UIColor colorWithRed:103.0/255 green:135.0/255 blue:142.0/255 alpha:1], - kTokenizerTypeProject: [UIColor colorWithRed:146.0/255 green:199.0/255 blue:119.0/255 alpha:1], - kTokenizerTypeOther: [UIColor colorWithRed:0.0/255 green:175.0/255 blue:199.0/255 alpha:1], - kTokenizerTypeOtherClassNames : [UIColor colorWithHex:@"04afc8" alpha:1], - kTokenizerTypeOtherMethodNames : [UIColor colorWithHex:@"04afc8" alpha:1] - }; - break; - case kTokenizerThemeLowKey: - themeColor = @{kTokenizerTypeText: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], - kTokenizerTypeBackground: [UIColor colorWithRed:255.0/255 green:255.0/255 blue:255.0/255 alpha:1], - kTokenizerTypeComment: [UIColor colorWithRed:84.0/255 green:99.0/255 blue:75.0/255 alpha:1], - kTokenizerTypeDocumentationComment: [UIColor colorWithRed:84.0/255 green:99.0/255 blue:75.0/255 alpha:1], - kTokenizerTypeDocumentationCommentKeyword: [UIColor colorWithRed:84.0/255 green:99.0/255 blue:75.0/255 alpha:1], - kTokenizerTypeString: [UIColor colorWithRed:133.0/255 green:63.0/255 blue:98.0/255 alpha:1], - kTokenizerTypeCharacter: [UIColor colorWithRed:50.0/255 green:64.0/255 blue:121.0/255 alpha:1], - kTokenizerTypeNumber: [UIColor colorWithRed:50.0/255 green:64.0/255 blue:121.0/255 alpha:1], - kTokenizerTypeKeyword: [UIColor colorWithRed:50.0/255 green:64.0/255 blue:121.0/255 alpha:1], - kTokenizerTypePreprocessor: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], - kTokenizerTypeURL: [UIColor colorWithRed:24.0/255 green:49.0/255 blue:168.0/255 alpha:1], - kTokenizerTypeAttribute: [UIColor colorWithRed:35.0/255 green:93.0/255 blue:43.0/255 alpha:1], - kTokenizerTypeProject: [UIColor colorWithRed:87.0/255 green:127.0/255 blue:164.0/255 alpha:1], - kTokenizerTypeOther: [UIColor colorWithRed:87.0/255 green:127.0/255 blue:164.0/255 alpha:1]}; - break; - case kTokenizerThemeMidnight: - themeColor = @{kTokenizerTypeText: [UIColor colorWithRed:255.0/255 green:255.0/255 blue:255.0/255 alpha:1], - kTokenizerTypeBackground: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], - kTokenizerTypeComment: [UIColor colorWithRed:69.0/255 green:208.0/255 blue:106.0/255 alpha:1], - kTokenizerTypeDocumentationComment: [UIColor colorWithRed:69.0/255 green:208.0/255 blue:106.0/255 alpha:1], - kTokenizerTypeDocumentationCommentKeyword: [UIColor colorWithRed:69.0/255 green:208.0/255 blue:106.0/255 alpha:1], - kTokenizerTypeString: [UIColor colorWithRed:255.0/255 green:68.0/255 blue:77.0/255 alpha:1], - kTokenizerTypeCharacter: [UIColor colorWithRed:139.0/255 green:138.0/255 blue:247.0/255 alpha:1], - kTokenizerTypeNumber: [UIColor colorWithRed:139.0/255 green:138.0/255 blue:247.0/255 alpha:1], - kTokenizerTypeKeyword: [UIColor colorWithRed:224.0/255 green:59.0/255 blue:160.0/255 alpha:1], - kTokenizerTypePreprocessor: [UIColor colorWithRed:237.0/255 green:143.0/255 blue:100.0/255 alpha:1], - kTokenizerTypeURL: [UIColor colorWithRed:36.0/255 green:72.0/255 blue:244.0/255 alpha:1], - kTokenizerTypeAttribute: [UIColor colorWithRed:79.0/255 green:108.0/255 blue:132.0/255 alpha:1], - kTokenizerTypeProject: [UIColor colorWithRed:0.0/255 green:249.0/255 blue:161.0/255 alpha:1], - kTokenizerTypeOther: [UIColor colorWithRed:0.0/255 green:179.0/255 blue:248.0/255 alpha:1]}; - break; - case kTokenizerThemePresentation: - themeColor = @{kTokenizerTypeText: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], - kTokenizerTypeBackground: [UIColor colorWithRed:255.0/255 green:255.0/255 blue:255.0/255 alpha:1], - kTokenizerTypeComment: [UIColor colorWithRed:38.0/255 green:126.0/255 blue:61.0/255 alpha:1], - kTokenizerTypeDocumentationComment: [UIColor colorWithRed:38.0/255 green:126.0/255 blue:61.0/255 alpha:1], - kTokenizerTypeDocumentationCommentKeyword: [UIColor colorWithRed:38.0/255 green:126.0/255 blue:61.0/255 alpha:1], - kTokenizerTypeString: [UIColor colorWithRed:158.0/255 green:32.0/255 blue:32.0/255 alpha:1], - kTokenizerTypeCharacter: [UIColor colorWithRed:6.0/255 green:63.0/255 blue:244.0/255 alpha:1], - kTokenizerTypeNumber: [UIColor colorWithRed:6.0/255 green:63.0/255 blue:244.0/255 alpha:1], - kTokenizerTypeKeyword: [UIColor colorWithRed:140.0/255 green:34.0/255 blue:96.0/255 alpha:1], - kTokenizerTypePreprocessor: [UIColor colorWithRed:125.0/255 green:72.0/255 blue:49.0/255 alpha:1], - kTokenizerTypeURL: [UIColor colorWithRed:21.0/255 green:67.0/255 blue:244.0/255 alpha:1], - kTokenizerTypeAttribute: [UIColor colorWithRed:150.0/255 green:125.0/255 blue:65.0/255 alpha:1], - kTokenizerTypeProject: [UIColor colorWithRed:77.0/255 green:129.0/255 blue:134.0/255 alpha:1], - kTokenizerTypeOther: [UIColor colorWithRed:113.0/255 green:65.0/255 blue:163.0/255 alpha:1]}; - break; - case kTokenizerThemePrinting: - themeColor = @{kTokenizerTypeText: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], - kTokenizerTypeBackground: [UIColor colorWithRed:255.0/255 green:255.0/255 blue:255.0/255 alpha:1], - kTokenizerTypeComment: [UIColor colorWithRed:113.0/255 green:113.0/255 blue:113.0/255 alpha:1], - kTokenizerTypeDocumentationComment: [UIColor colorWithRed:113.0/255 green:113.0/255 blue:113.0/255 alpha:1], - kTokenizerTypeDocumentationCommentKeyword: [UIColor colorWithRed:64.0/255 green:64.0/255 blue:64.0/255 alpha:1], - kTokenizerTypeString: [UIColor colorWithRed:112.0/255 green:112.0/255 blue:112.0/255 alpha:1], - kTokenizerTypeCharacter: [UIColor colorWithRed:71.0/255 green:71.0/255 blue:71.0/255 alpha:1], - kTokenizerTypeNumber: [UIColor colorWithRed:71.0/255 green:71.0/255 blue:71.0/255 alpha:1], - kTokenizerTypeKeyword: [UIColor colorWithRed:108.0/255 green:108.0/255 blue:108.0/255 alpha:1], - kTokenizerTypePreprocessor: [UIColor colorWithRed:85.0/255 green:85.0/255 blue:85.0/255 alpha:1], - kTokenizerTypeURL: [UIColor colorWithRed:84.0/255 green:84.0/255 blue:84.0/255 alpha:1], - kTokenizerTypeAttribute: [UIColor colorWithRed:129.0/255 green:129.0/255 blue:129.0/255 alpha:1], - kTokenizerTypeProject: [UIColor colorWithRed:120.0/255 green:120.0/255 blue:120.0/255 alpha:1], - kTokenizerTypeOther: [UIColor colorWithRed:86.0/255 green:86.0/255 blue:86.0/255 alpha:1]}; - break; - case kTokenizerThemeSunset: - themeColor = @{kTokenizerTypeText: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], - kTokenizerTypeBackground: [UIColor colorWithRed:255.0/255 green:252.0/255 blue:236.0/255 alpha:1], - kTokenizerTypeComment: [UIColor colorWithRed:208.0/255 green:134.0/255 blue:59.0/255 alpha:1], - kTokenizerTypeDocumentationComment: [UIColor colorWithRed:208.0/255 green:134.0/255 blue:59.0/255 alpha:1], - kTokenizerTypeDocumentationCommentKeyword: [UIColor colorWithRed:190.0/255 green:116.0/255 blue:55.0/255 alpha:1], - kTokenizerTypeString: [UIColor colorWithRed:234.0/255 green:32.0/255 blue:24.0/255 alpha:1], - kTokenizerTypeCharacter: [UIColor colorWithRed:53.0/255 green:87.0/255 blue:134.0/255 alpha:1], - kTokenizerTypeNumber: [UIColor colorWithRed:53.0/255 green:87.0/255 blue:134.0/255 alpha:1], - kTokenizerTypeKeyword: [UIColor colorWithRed:53.0/255 green:87.0/255 blue:134.0/255 alpha:1], - kTokenizerTypePreprocessor: [UIColor colorWithRed:119.0/255 green:121.0/255 blue:148.0/255 alpha:1], - kTokenizerTypeURL: [UIColor colorWithRed:85.0/255 green:99.0/255 blue:179.0/255 alpha:1], - kTokenizerTypeAttribute: [UIColor colorWithRed:58.0/255 green:76.0/255 blue:166.0/255 alpha:1], - kTokenizerTypeProject: [UIColor colorWithRed:196.0/255 green:88.0/255 blue:31.0/255 alpha:1], - kTokenizerTypeOther: [UIColor colorWithRed:196.0/255 green:88.0/255 blue:31.0/255 alpha:1]}; - break; - } - return themeColor; -} - - -@end - -#pragma mark - Regex Helpers - - -@implementation NSMutableAttributedString (Regex) - -- (void)removeAttribute:(NSString *)name withValue:(id)compareValue range:(NSRange)range -{ - [self enumerateAttribute:(NSString *)kCTForegroundColorAttributeName inRange:range options:0 usingBlock:^(id value, NSRange range, BOOL *stop) { - if ([value isEqual:compareValue]) { - [self removeAttribute:(NSString *)kCTForegroundColorAttributeName range:range]; - } - - }]; -} - - -- (void)addRanges:(NSArray *)array withColor:(UIColor *)color -{ - for (NSValue *value in array) { - [self removeAttribute:(NSString *)kCTForegroundColorAttributeName range:value.rangeValue]; - [self addAttribute:(NSString *)kCTForegroundColorAttributeName value:color range:value.rangeValue]; - } -} - -- (void)addRanges:(NSArray *)array withAttributes:(NSDictionary *)dic -{ - for (NSValue *value in array) { - if (value.rangeValue.location + value.rangeValue.length <= self.length){ - [self removeAttribute:(NSString *)kCTForegroundColorAttributeName range:value.rangeValue]; - [self addAttributes:dic range:value.rangeValue]; - } - } -} - -- (NSArray *)allMatchesOfPattern:(NSString *)pattern inString:(NSString *)string -{ - NSArray *mathces = [[NSRegularExpression regularExpressionWithPattern:pattern options:0 error:nil] matchesInString:string options:0 range:NSMakeRange(0, string.length)]; - - return mathces; -} - -- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color andDescription:(NSString *)description -{ - [self addRegularExpressionWithPattern:pattern withColor:color options:0 andDescription:description]; -} - -- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color group:(int)index range:(NSRange)range andDescription:(NSString *)description -{ - NSString *string = self.string; - - - NSRegularExpression* expression = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionAnchorsMatchLines error:nil]; - - [expression enumerateMatchesInString:string options:0 range:range usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { - [self addAttribute:(NSString *)kCTForegroundColorAttributeName value:color range:[result rangeAtIndex:index]]; - }]; -} - -- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color options:(NSRegularExpressionOptions)options andDescription:(NSString *)description -{ - [self addRegularExpressionWithPattern:pattern withColor:color options:options range:NSMakeRange(0, self.length) andDescription:description]; -} - -- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color options:(NSRegularExpressionOptions)options range:(NSRange)range andDescription:(NSString *)description -{ - NSString *string = self.string; - NSRegularExpression* expression = [NSRegularExpression regularExpressionWithPattern:pattern options:options error:nil]; - - [expression enumerateMatchesInString:string options:options range:range usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { - [self addAttribute:(NSString *)kCTForegroundColorAttributeName value:color range:result.range]; - }]; -} - -- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color range:(NSRange)range andDescription:(NSString *)description -{ - [self addRegularExpressionWithPattern:pattern withColor:color options:0 range:range andDescription:description]; -} - -@end diff --git a/ChromatismTests/ChromatismTests.h b/ChromatismTests/ChromatismTests.h deleted file mode 100644 index 98e9b87..0000000 --- a/ChromatismTests/ChromatismTests.h +++ /dev/null @@ -1,13 +0,0 @@ -// -// ChromatismTests.h -// ChromatismTests -// -// Created by Johannes Lund on 2013-01-08. -// Copyright (c) 2013 Anviking. All rights reserved. -// - -#import - -@interface ChromatismTests : SenTestCase - -@end diff --git a/ChromatismTests/ChromatismTests.m b/ChromatismTests/ChromatismTests.m deleted file mode 100644 index 2c33df7..0000000 --- a/ChromatismTests/ChromatismTests.m +++ /dev/null @@ -1,32 +0,0 @@ -// -// ChromatismTests.m -// ChromatismTests -// -// Created by Johannes Lund on 2013-01-08. -// Copyright (c) 2013 Anviking. All rights reserved. -// - -#import "ChromatismTests.h" - -@implementation ChromatismTests - -- (void)setUp -{ - [super setUp]; - - // Set-up code here. -} - -- (void)tearDown -{ - // Tear-down code here. - - [super tearDown]; -} - -- (void)testExample -{ - STFail(@"Unit tests are not implemented yet in ChromatismTests"); -} - -@end diff --git a/ChromatismTests/en.lproj/InfoPlist.strings b/ChromatismTests/en.lproj/InfoPlist.strings deleted file mode 100644 index 477b28f..0000000 --- a/ChromatismTests/en.lproj/InfoPlist.strings +++ /dev/null @@ -1,2 +0,0 @@ -/* Localized versions of Info.plist keys */ - From 36f7e3511d8a8149d4edbb7818f5744013c0af6e Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Mon, 1 Jul 2013 17:27:15 +0200 Subject: [PATCH 018/140] Fixing warnings --- Chromatism/Chromatism.xcodeproj/project.pbxproj | 6 ++++++ Chromatism/Chromatism/JLTokenPattern.m | 7 +++++++ Chromatism/ChromatismTests/ChromatismTests.m | 2 +- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/Chromatism/Chromatism.xcodeproj/project.pbxproj b/Chromatism/Chromatism.xcodeproj/project.pbxproj index 1dae815..4302b5d 100644 --- a/Chromatism/Chromatism.xcodeproj/project.pbxproj +++ b/Chromatism/Chromatism.xcodeproj/project.pbxproj @@ -392,6 +392,7 @@ isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; DSTROOT = /tmp/Chromatism.dst; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Chromatism/Chromatism-Prefix.pch"; @@ -406,6 +407,7 @@ isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; DSTROOT = /tmp/Chromatism.dst; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Chromatism/Chromatism-Prefix.pch"; @@ -419,6 +421,7 @@ 8F3AB93F1781C0BB0023348A /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + CODE_SIGN_IDENTITY = "iPhone Developer"; FRAMEWORK_SEARCH_PATHS = ( "$(SDKROOT)/Developer/Library/Frameworks", "$(inherited)", @@ -432,6 +435,7 @@ ); INFOPLIST_FILE = "ChromatismTests/ChromatismTests-Info.plist"; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; WRAPPER_EXTENSION = xctest; }; name = Debug; @@ -439,6 +443,7 @@ 8F3AB9401781C0BB0023348A /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + CODE_SIGN_IDENTITY = "iPhone Developer"; FRAMEWORK_SEARCH_PATHS = ( "$(SDKROOT)/Developer/Library/Frameworks", "$(inherited)", @@ -448,6 +453,7 @@ GCC_PREFIX_HEADER = "Chromatism/Chromatism-Prefix.pch"; INFOPLIST_FILE = "ChromatismTests/ChromatismTests-Info.plist"; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; WRAPPER_EXTENSION = xctest; }; name = Release; diff --git a/Chromatism/Chromatism/JLTokenPattern.m b/Chromatism/Chromatism/JLTokenPattern.m index d6d2137..22451f0 100644 --- a/Chromatism/Chromatism/JLTokenPattern.m +++ b/Chromatism/Chromatism/JLTokenPattern.m @@ -10,6 +10,13 @@ @implementation JLTokenPattern ++ (instancetype)tokenPatternWithPatternAndColor:(UIColor *)color +{ + JLTokenPattern *tokenPattern = [JLTokenPattern new]; + tokenPattern.color = color; + return tokenPattern; +} + - (void)setExpression:(NSRegularExpression *)expression { _expression = expression; diff --git a/Chromatism/ChromatismTests/ChromatismTests.m b/Chromatism/ChromatismTests/ChromatismTests.m index f6f7973..ebea82b 100644 --- a/Chromatism/ChromatismTests/ChromatismTests.m +++ b/Chromatism/ChromatismTests/ChromatismTests.m @@ -47,7 +47,7 @@ - (void)testSubscopes XCTAssertEqualObjects(subscope3.scope, scope, @""); XCTAssertEqualObjects(subscope4.scope, scope, @""); - XCTAssertEquals(scope.subscopes.class, [NSMutableArray class], @"subscopes should be of type NSMutableArray"); + XCTAssertTrue([scope.subscopes isKindOfClass:[NSMutableArray class]], @"subscopes should be of type NSMutableArray"); } @end From 52a0284c160f53b720fcf88fde4f8d214eccee4c Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Mon, 1 Jul 2013 22:35:36 +0200 Subject: [PATCH 019/140] Recursive search using Scopes is now implemented --- .../Chromatism.xcodeproj/project.pbxproj | 4 +- Chromatism/Chromatism/JLScope.h | 9 +-- Chromatism/Chromatism/JLScope.m | 25 +++++++ Chromatism/Chromatism/JLTokenPattern.h | 6 +- Chromatism/Chromatism/JLTokenPattern.m | 24 ++++++- Chromatism/Chromatism/JLTokenizer.m | 66 ++++++++----------- 6 files changed, 87 insertions(+), 47 deletions(-) diff --git a/Chromatism/Chromatism.xcodeproj/project.pbxproj b/Chromatism/Chromatism.xcodeproj/project.pbxproj index 4302b5d..db7fe6b 100644 --- a/Chromatism/Chromatism.xcodeproj/project.pbxproj +++ b/Chromatism/Chromatism.xcodeproj/project.pbxproj @@ -134,6 +134,8 @@ 8F3AB9221781C0BA0023348A /* Chromatism.m */, 8F3AB94D1781C1250023348A /* Helpers.h */, 8F3AB94E1781C1250023348A /* Helpers.m */, + 8F3AB9571781C1250023348A /* JLTokenPattern.h */, + 8F3AB9581781C1250023348A /* JLTokenPattern.m */, 8F3AB94F1781C1250023348A /* JLScope.h */, 8F3AB9501781C1250023348A /* JLScope.m */, 8F3AB9511781C1250023348A /* JLTextStorage.h */, @@ -142,8 +144,6 @@ 8F3AB9541781C1250023348A /* JLTextViewController.m */, 8F3AB9551781C1250023348A /* JLTokenizer.h */, 8F3AB9561781C1250023348A /* JLTokenizer.m */, - 8F3AB9571781C1250023348A /* JLTokenPattern.h */, - 8F3AB9581781C1250023348A /* JLTokenPattern.m */, 8F3AB91E1781C0BA0023348A /* Supporting Files */, ); path = Chromatism; diff --git a/Chromatism/Chromatism/JLScope.h b/Chromatism/Chromatism/JLScope.h index ae2c071..dcc2d22 100644 --- a/Chromatism/Chromatism/JLScope.h +++ b/Chromatism/Chromatism/JLScope.h @@ -40,12 +40,13 @@ @property (nonatomic, weak) NSTextStorage *textStorage; /** - * Describes wether the pattern matches will remove indexes from the clearIndexes property. Default is FALSE for JLScope and TRUE for JLTokenPattern. + * A shared instance of the textStorage's string. */ -@property (nonatomic, assign, getter = isOpaque) BOOL opaque; +@property (nonatomic, readonly, strong) NSString *string; /** - * Indexes where there are no opaque subscopes. + * Describes wether the instance removes it's indexes from the containg scope. Default is FALSE for JLScope and TRUE for JLTokenPattern. */ -@property (nonatomic, strong) NSMutableIndexSet *clearIndexes; +@property (nonatomic, assign, getter = isOpaque) BOOL opaque; + @end diff --git a/Chromatism/Chromatism/JLScope.m b/Chromatism/Chromatism/JLScope.m index c7f7bf7..596955a 100644 --- a/Chromatism/Chromatism/JLScope.m +++ b/Chromatism/Chromatism/JLScope.m @@ -14,6 +14,8 @@ @implementation JLScope } @synthesize subscopes = _subscopes; +#pragma mark - Initialization + + (instancetype)scopeWithRange:(NSRange)range inTextStorage:(NSTextStorage *)textStorage { JLScope *scope = [[JLScope alloc] initWithIndexesInRange:range]; @@ -21,6 +23,15 @@ + (instancetype)scopeWithRange:(NSRange)range inTextStorage:(NSTextStorage *)tex return scope; } +- (instancetype)init +{ + self = [super init]; + if (self) { + self.opaque = NO; + } + return self; +} + + (instancetype)scopeWithTextStorage:(NSTextStorage *)textStorage { return [self scopeWithRange:NSMakeRange(0, textStorage.length) inTextStorage:textStorage]; @@ -28,7 +39,15 @@ + (instancetype)scopeWithTextStorage:(NSTextStorage *)textStorage - (void)perform { + if (self.scope && self.opaque == YES) + { + [self.scope removeIndexes:self]; + } for (JLScope *scope in self.subscopes) { + + scope->_textStorage = self.textStorage; + scope->_string = self.string; + [scope perform]; } } @@ -67,5 +86,11 @@ - (void)removeSubscope:(JLScope *)subscope [(NSMutableArray *)self.subscopes removeObject:subscope]; } +- (void)setTextStorage:(NSTextStorage *)textStorage +{ + _textStorage = textStorage; + _string = textStorage.string; +} + @end diff --git a/Chromatism/Chromatism/JLTokenPattern.h b/Chromatism/Chromatism/JLTokenPattern.h index adaecf5..0f10018 100644 --- a/Chromatism/Chromatism/JLTokenPattern.h +++ b/Chromatism/Chromatism/JLTokenPattern.h @@ -10,7 +10,7 @@ @interface JLTokenPattern : JLScope -+ (instancetype)tokenPatternWithPatternAndColor:(UIColor *)color; ++ (instancetype)tokenPatternWithPattern:(NSString *)pattern andColor:(UIColor *)color; // The color @property (nonatomic, strong) UIColor *color; @@ -19,7 +19,9 @@ @property (nonatomic, strong) NSRegularExpression *expression; @property (nonatomic, copy) NSString *pattern; + /// Describes if the pattern search for matches in indexes marked as unclear. If false, the search will happen in the scopes clearIndexes. If true, the serach will happen in the scope itself. Default: FALSE. -@property (nonatomic, assign) BOOL dirtySearch; +//@property (nonatomic, assign) BOOL dirtySearch; +// NOT IMPLEMENTED @end diff --git a/Chromatism/Chromatism/JLTokenPattern.m b/Chromatism/Chromatism/JLTokenPattern.m index 22451f0..adfd3a7 100644 --- a/Chromatism/Chromatism/JLTokenPattern.m +++ b/Chromatism/Chromatism/JLTokenPattern.m @@ -10,13 +10,28 @@ @implementation JLTokenPattern -+ (instancetype)tokenPatternWithPatternAndColor:(UIColor *)color +#pragma mark - Initialization + ++ (instancetype)tokenPatternWithPattern:(NSString *)pattern andColor:(UIColor *)color { JLTokenPattern *tokenPattern = [JLTokenPattern new]; tokenPattern.color = color; + tokenPattern.pattern = pattern; return tokenPattern; } +- (id)init +{ + self = [super init]; + if (self) { +// self.dirtySearch = NO; + self.opaque = YES; + } + return self; +} + +#pragma mark - Properties + - (void)setExpression:(NSRegularExpression *)expression { _expression = expression; @@ -33,7 +48,14 @@ - (void)setPattern:(NSString *)pattern - (void)perform { + [self.scope enumerateRangesUsingBlock:^(NSRange range, BOOL *stop) { + [self.expression enumerateMatchesInString:self.string options:0 range:range usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { + [self.textStorage addAttribute:NSForegroundColorAttributeName value:self.color range:[result range]]; + [self addIndexesInRange:[result range]]; + }]; + }]; + [super perform]; } @end diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index 7d305f1..8113a14 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -38,6 +38,8 @@ #import "JLTokenizer.h" #import "JLTextViewController.h" +#import "JLScope.h" +#import "JLTokenPattern.h" @interface NSMutableAttributedString (Regex) @@ -65,57 +67,45 @@ - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range // First, remove old attributes [self clearColorAttributesInRange:range textStorage:storage]; - NSIndexSet *stringIndexes = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, storage.length)]; - NSMutableIndexSet *set = [[NSIndexSet alloc] initWithIndexesInRange:range].mutableCopy; - + JLScope *scope = [JLScope scopeWithTextStorage:storage]; NSDictionary *colors = self.colors; - UIColor *color = color = colors[JLTokenTypeComment]; - NSMutableIndexSet *comments1 = [storage addRegularExpressionWithPattern:@"/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*+/" withColor:color indexSet:stringIndexes andDescription:@"Comments"]; - [set removeIndexes:comments1]; - - NSMutableIndexSet *comments2 = [storage addRegularExpressionWithPattern:@"//.*+\n" withColor:color indexSet:set andDescription:@"Comments"]; - [set removeIndexes:comments2]; - - color = colors[JLTokenTypePreprocessor]; - NSMutableIndexSet *preprocessor = [storage addRegularExpressionWithPattern:@"#.*+\n" withColor:color indexSet:set andDescription:@"Preprocessor"]; - [set removeIndexes:preprocessor]; - - color = colors[JLTokenTypeString]; - NSMutableIndexSet *strings1 = [storage addRegularExpressionWithPattern:@"(\"|@\")[^\"\\n]*(@\"|\")" withColor:color indexSet:set andDescription:@"Strings"]; - [set removeIndexes:strings1]; - NSMutableIndexSet *strings2 = [storage addRegularExpressionWithPattern:@"(\"|@\")[^\"\\n]*(@\"|\")" withColor:color indexSet:preprocessor andDescription:@"Strings"]; - [set removeIndexes:strings2]; + // Two types of comments + JLTokenPattern *comments1 = [JLTokenPattern tokenPatternWithPattern:@"/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*+/" andColor:colors[JLTokenTypeComment]]; + JLTokenPattern *comments2 = [JLTokenPattern tokenPatternWithPattern:@"//.*+\n" andColor:colors[JLTokenTypeComment]]; - color = colors[JLTokenTypeNumber]; - [storage addRegularExpressionWithPattern:@"(?<=\\s)\\d+" withColor:color indexSet:set andDescription:@"Numbers"]; + // Preprocessor macros + JLTokenPattern *preprocessor = [JLTokenPattern tokenPatternWithPattern:@"#.*+\n" andColor:colors[JLTokenTypePreprocessor]]; - [storage addRegularExpressionWithPattern:@"@\\s*[\(|\{|\[]" withColor:color indexSet:set andDescription:@"New literals"]; + // Stringss + JLTokenPattern *strings = [JLTokenPattern tokenPatternWithPattern:@"(\"|@\")[^\"\\n]*(@\"|\")" andColor:colors[JLTokenTypeString]]; - //C – functions and similiar - color = colors[JLTokenTypeOtherMethodNames]; - [storage addRegularExpressionWithPattern:@"\\w+\\s*(?>\\(.*\\)" withColor:color group:1 indexSet:set andDescription:@"C function names"]; + // Numbers + JLTokenPattern *numbers = [JLTokenPattern tokenPatternWithPattern:@"(?<=\\s)\\d+" andColor:colors[JLTokenTypeNumber]]; - //Dot notation - [storage addRegularExpressionWithPattern:@"\\.(\\w+)" withColor:color group:1 indexSet:set andDescription:@"Dot notation"]; + // New literals, for example @[] + JLTokenPattern *literals = [JLTokenPattern tokenPatternWithPattern:@"@\\s*[\(|\{|\[]" andColor:colors[JLTokenTypeNumber]]; // New literals - //Method calls - [storage addRegularExpressionWithPattern:@"\\[\\w+\\s+(\\w+)\\]" withColor:color group:1 indexSet:set andDescription:@"Method calls"]; - [storage addRegularExpressionWithPattern:@"(?<=\\w+):\\s*[^\\s;\\]]+" withColor:color group:1 indexSet:set andDescription:@"Method calls parts"]; + // C function names + JLTokenPattern *functions = [JLTokenPattern tokenPatternWithPattern:@"\\w+\\s*(?>\\(.*\\)" andColor:colors[JLTokenTypeOtherMethodNames]]; - color = colors[JLTokenTypeOtherClassNames]; - [storage addRegularExpressionWithPattern:@"(\\b(?>NS|UI))\\w+\\b" withColor:color indexSet:set andDescription:@"UIKit and NS"]; + // Dot notation + JLTokenPattern *dots = [JLTokenPattern tokenPatternWithPattern:@"\\.(\\w+)" andColor:colors[JLTokenTypeOtherMethodNames]]; - color = colors[JLTokenTypeKeyword]; - [storage addRegularExpressionWithPattern:@"(?<=\\b)(?>true|false|yes|no|TRUE|FALSE|bool|BOOL|nil|id|void|self|NULL|if|else|strong|weak|nonatomic|atomic|assign|copy|typedef|enum|auto|break|case|const|char|continue|do|default|double|extern|float|for|goto|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|volatile|while|nonatomic|atomic|readonly)(\\b)" withColor:color indexSet:set andDescription:@"Keywords"]; + // Method Calls + JLTokenPattern *methods1 = [JLTokenPattern tokenPatternWithPattern:@"\\[\\w+\\s+(\\w+)\\]" andColor:colors[JLTokenTypeOtherMethodNames]]; + // Method call parts + JLTokenPattern *methods2 = [JLTokenPattern tokenPatternWithPattern:@"(?<=\\w+):\\s*[^\\s;\\]]+" andColor:colors[JLTokenTypeOtherMethodNames]]; - [storage addRegularExpressionWithPattern:@"@[a-zA-Z0-9_]+" withColor:color indexSet:set andDescription:@"@things"]; + // NS and UI prefixes words + JLTokenPattern *appleClassNames = [JLTokenPattern tokenPatternWithPattern:@"(\\b(?>NS|UI))\\w+\\b" andColor:colors[JLTokenTypeOtherClassNames]]; + JLTokenPattern *keywords1 = [JLTokenPattern tokenPatternWithPattern:@"(?<=\\b)(?>true|false|yes|no|TRUE|FALSE|bool|BOOL|nil|id|void|self|NULL|if|else|strong|weak|nonatomic|atomic|assign|copy|typedef|enum|auto|break|case|const|char|continue|do|default|double|extern|float|for|goto|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|volatile|while|nonatomic|atomic|readonly)(\\b)" andColor:colors[JLTokenTypeKeyword]]; + JLTokenPattern *keywords2 = [JLTokenPattern tokenPatternWithPattern:@"@[a-zA-Z0-9_]+" andColor:colors[JLTokenTypeKeyword]]; - - - + scope.subscopes = @[comments1, comments2, preprocessor, strings, numbers, literals, functions, dots, methods1, methods2, appleClassNames, keywords1, keywords2]; + [scope perform]; } - (void)clearColorAttributesInRange:(NSRange)range textStorage:(NSTextStorage *)storage; From 8b9ca2747a19843e561e0e25e650c77631b77788 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Tue, 2 Jul 2013 01:54:02 +0200 Subject: [PATCH 020/140] Nested scopes should now work as expected. Had to change inheritance of scopes from NSMutableIndexSet to NSObject, and adding a indexSet property. --- Chromatism/Chromatism/Helpers.h | 6 +++ Chromatism/Chromatism/Helpers.m | 12 ++++++ Chromatism/Chromatism/JLScope.h | 11 +++++- Chromatism/Chromatism/JLScope.m | 52 ++++++++++++++++++++++---- Chromatism/Chromatism/JLTokenPattern.m | 37 ++++++++++++++++-- Chromatism/Chromatism/JLTokenizer.m | 13 ++++--- 6 files changed, 114 insertions(+), 17 deletions(-) diff --git a/Chromatism/Chromatism/Helpers.h b/Chromatism/Chromatism/Helpers.h index 260a470..2f183bf 100644 --- a/Chromatism/Chromatism/Helpers.h +++ b/Chromatism/Chromatism/Helpers.h @@ -44,5 +44,11 @@ @end +@interface NSIndexSet (GSIndexSetAdditions) + +- (NSMutableIndexSet *)intersectionWithSet:(NSIndexSet *)otherSet; + +@end + diff --git a/Chromatism/Chromatism/Helpers.m b/Chromatism/Chromatism/Helpers.m index 74874a5..b0152c3 100644 --- a/Chromatism/Chromatism/Helpers.m +++ b/Chromatism/Chromatism/Helpers.m @@ -147,5 +147,17 @@ - (NSString *)iso8601String } return [dateFormatter stringFromDate:self]; } +@end +@implementation NSIndexSet (GSIndexSetAdditions) + +- (NSMutableIndexSet *)intersectionWithSet:(NSIndexSet *)otherSet +{ + NSMutableIndexSet *finalSet = [NSMutableIndexSet indexSet]; + [self enumerateIndexesUsingBlock:^(NSUInteger index, BOOL *stop) { + if ([otherSet containsIndex:index]) [finalSet addIndex:index]; + }]; + + return finalSet; +} @end diff --git a/Chromatism/Chromatism/JLScope.h b/Chromatism/Chromatism/JLScope.h index dcc2d22..b95c9c5 100644 --- a/Chromatism/Chromatism/JLScope.h +++ b/Chromatism/Chromatism/JLScope.h @@ -8,12 +8,13 @@ #import -@interface JLScope : NSMutableIndexSet +@interface JLScope : NSObject // Designated initializors + (instancetype)scopeWithRange:(NSRange)range inTextStorage:(NSTextStorage *)textStorage; + (instancetype)scopeWithTextStorage:(NSTextStorage *)textStorage; +@property (nonatomic, strong) NSMutableIndexSet *set; /** * Causes the every scope to perform cascadingly */ @@ -33,6 +34,12 @@ - (void)addSubscope:(JLScope *)subscope; - (void)removeSubscope:(JLScope *)subscope; +/** + * Creates a copy of the instance, and adds + */ + +- (void)addScope:(JLScope *)scope; + /** * A weak reference to a textStorage in which the scope is operating. Will be passed down to subscopes. @@ -45,7 +52,7 @@ @property (nonatomic, readonly, strong) NSString *string; /** - * Describes wether the instance removes it's indexes from the containg scope. Default is FALSE for JLScope and TRUE for JLTokenPattern. + * Describes wether the instance removes it's indexes from the containg scope. Default is YES. */ @property (nonatomic, assign, getter = isOpaque) BOOL opaque; diff --git a/Chromatism/Chromatism/JLScope.m b/Chromatism/Chromatism/JLScope.m index 596955a..f0c713a 100644 --- a/Chromatism/Chromatism/JLScope.m +++ b/Chromatism/Chromatism/JLScope.m @@ -7,6 +7,11 @@ // #import "JLScope.h" +#import "Helpers.h" + +@interface JLScope () +@property (nonatomic, readwrite, strong) NSString *string; +@end @implementation JLScope { @@ -18,7 +23,8 @@ @implementation JLScope + (instancetype)scopeWithRange:(NSRange)range inTextStorage:(NSTextStorage *)textStorage { - JLScope *scope = [[JLScope alloc] initWithIndexesInRange:range]; + JLScope *scope = [JLScope new]; + scope.set = [NSMutableIndexSet indexSetWithIndexesInRange:range]; scope.textStorage = textStorage; return scope; } @@ -27,7 +33,7 @@ - (instancetype)init { self = [super init]; if (self) { - self.opaque = NO; + self.opaque = YES; } return self; } @@ -39,17 +45,26 @@ + (instancetype)scopeWithTextStorage:(NSTextStorage *)textStorage - (void)perform { - if (self.scope && self.opaque == YES) - { - [self.scope removeIndexes:self]; + if (self.scope) { + + // Intersect with scope + self.set = [self.set intersectionWithSet:self.scope.set]; } + + NSMutableIndexSet *archivedSet = self.set.mutableCopy; for (JLScope *scope in self.subscopes) { - scope->_textStorage = self.textStorage; - scope->_string = self.string; + scope.textStorage = self.textStorage; + scope.string = self.string; [scope perform]; } + self.set = archivedSet; + + if (self.scope && self.opaque == YES) + { + [self.scope.set removeIndexes:self.set]; + } } #pragma mark - Scope Hierarchy Management @@ -92,5 +107,28 @@ - (void)setTextStorage:(NSTextStorage *)textStorage _string = textStorage.string; } +- (NSMutableIndexSet *)set +{ + if (!_set) _set = [NSMutableIndexSet indexSet]; + return _set; +} + +#pragma mark - NSCopying Protocol + +- (id)copyWithZone:(NSZone *)zone +{ + JLScope *scope = [[self.class allocWithZone:zone] init]; + for (JLScope *subscope in self.subscopes) { + [scope addSubscope:subscope.copy]; + } + scope.textStorage = self.textStorage; + return scope; +} + +- (void)addScope:(JLScope *)scope +{ + [scope addSubscope:self.copy]; +} + @end diff --git a/Chromatism/Chromatism/JLTokenPattern.m b/Chromatism/Chromatism/JLTokenPattern.m index adfd3a7..cc8efc4 100644 --- a/Chromatism/Chromatism/JLTokenPattern.m +++ b/Chromatism/Chromatism/JLTokenPattern.m @@ -8,6 +8,10 @@ #import "JLTokenPattern.h" +@interface JLScope () +@property (nonatomic, readwrite, strong) NSString *string; +@end + @implementation JLTokenPattern #pragma mark - Initialization @@ -48,14 +52,41 @@ - (void)setPattern:(NSString *)pattern - (void)perform { - [self.scope enumerateRangesUsingBlock:^(NSRange range, BOOL *stop) { + [self.scope.set enumerateRangesUsingBlock:^(NSRange range, BOOL *stop) { [self.expression enumerateMatchesInString:self.string options:0 range:range usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { [self.textStorage addAttribute:NSForegroundColorAttributeName value:self.color range:[result range]]; - [self addIndexesInRange:[result range]]; + [self.set addIndexesInRange:[result range]]; }]; }]; - [super perform]; + NSMutableIndexSet *archivedSet = self.set.mutableCopy; + for (JLScope *scope in self.subscopes) { + + scope.textStorage = self.textStorage; + scope.string = self.string; + + [scope perform]; + } + self.set = archivedSet; + + if (self.scope && self.opaque == YES) + { + [self.scope.set removeIndexes:self.set]; + }} + +#pragma mark - NSCopying Protocol + +- (id)copyWithZone:(NSZone *)zone +{ + JLTokenPattern *pattern = [[self.class allocWithZone:zone] init]; + for (JLScope *subscope in self.subscopes) { + [pattern addSubscope:subscope.copy]; + } + pattern.textStorage = self.textStorage; + pattern.expression = self.expression; + pattern.set = self.set.mutableCopy; + + return pattern; } @end diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index 8113a14..f6eab75 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -66,8 +66,10 @@ - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range { // First, remove old attributes [self clearColorAttributesInRange:range textStorage:storage]; - - JLScope *scope = [JLScope scopeWithTextStorage:storage]; + + JLScope *documentScope = [JLScope scopeWithTextStorage:storage]; + JLScope *rangeScope = [JLScope scopeWithRange:range inTextStorage:storage]; + NSDictionary *colors = self.colors; // Two types of comments @@ -77,7 +79,7 @@ - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range // Preprocessor macros JLTokenPattern *preprocessor = [JLTokenPattern tokenPatternWithPattern:@"#.*+\n" andColor:colors[JLTokenTypePreprocessor]]; - // Stringss + // Strings JLTokenPattern *strings = [JLTokenPattern tokenPatternWithPattern:@"(\"|@\")[^\"\\n]*(@\"|\")" andColor:colors[JLTokenTypeString]]; // Numbers @@ -103,9 +105,10 @@ - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range JLTokenPattern *keywords1 = [JLTokenPattern tokenPatternWithPattern:@"(?<=\\b)(?>true|false|yes|no|TRUE|FALSE|bool|BOOL|nil|id|void|self|NULL|if|else|strong|weak|nonatomic|atomic|assign|copy|typedef|enum|auto|break|case|const|char|continue|do|default|double|extern|float|for|goto|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|volatile|while|nonatomic|atomic|readonly)(\\b)" andColor:colors[JLTokenTypeKeyword]]; JLTokenPattern *keywords2 = [JLTokenPattern tokenPatternWithPattern:@"@[a-zA-Z0-9_]+" andColor:colors[JLTokenTypeKeyword]]; - scope.subscopes = @[comments1, comments2, preprocessor, strings, numbers, literals, functions, dots, methods1, methods2, appleClassNames, keywords1, keywords2]; + documentScope.subscopes = @[comments1, rangeScope]; + rangeScope.subscopes = @[comments2, preprocessor, strings, numbers, literals, functions, dots, methods1, methods2, appleClassNames, keywords1, keywords2]; - [scope perform]; + [documentScope perform]; } - (void)clearColorAttributesInRange:(NSRange)range textStorage:(NSTextStorage *)storage; From c8ecdcb952bf4b11de5ecf9b8e4b0f3c36ed8466 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Tue, 2 Jul 2013 12:24:33 +0200 Subject: [PATCH 021/140] -addScope is now working correcty --- Chromatism/Chromatism/JLScope.m | 3 ++- Chromatism/Chromatism/JLTokenPattern.m | 1 + Chromatism/Chromatism/JLTokenizer.m | 3 +++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Chromatism/Chromatism/JLScope.m b/Chromatism/Chromatism/JLScope.m index f0c713a..cf6ab22 100644 --- a/Chromatism/Chromatism/JLScope.m +++ b/Chromatism/Chromatism/JLScope.m @@ -93,7 +93,8 @@ - (void)setScope:(JLScope *)scope - (void)addSubscope:(JLScope *)subscope { - subscope.scope = self; + [(NSMutableArray *)self.subscopes addObject:subscope]; + subscope->_scope = self; } - (void)removeSubscope:(JLScope *)subscope diff --git a/Chromatism/Chromatism/JLTokenPattern.m b/Chromatism/Chromatism/JLTokenPattern.m index cc8efc4..eca9431 100644 --- a/Chromatism/Chromatism/JLTokenPattern.m +++ b/Chromatism/Chromatism/JLTokenPattern.m @@ -85,6 +85,7 @@ - (id)copyWithZone:(NSZone *)zone pattern.textStorage = self.textStorage; pattern.expression = self.expression; pattern.set = self.set.mutableCopy; + pattern.color = self.color; return pattern; } diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index f6eab75..1ba4eb8 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -81,6 +81,7 @@ - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range // Strings JLTokenPattern *strings = [JLTokenPattern tokenPatternWithPattern:@"(\"|@\")[^\"\\n]*(@\"|\")" andColor:colors[JLTokenTypeString]]; + [strings addScope:preprocessor]; // Numbers JLTokenPattern *numbers = [JLTokenPattern tokenPatternWithPattern:@"(?<=\\s)\\d+" andColor:colors[JLTokenTypeNumber]]; @@ -108,7 +109,9 @@ - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range documentScope.subscopes = @[comments1, rangeScope]; rangeScope.subscopes = @[comments2, preprocessor, strings, numbers, literals, functions, dots, methods1, methods2, appleClassNames, keywords1, keywords2]; + NSDate *date = [NSDate date]; [documentScope perform]; + NSLog(@"Chromatism done tokenizing with time of %fms",ABS([date timeIntervalSinceNow]*1000)); } - (void)clearColorAttributesInRange:(NSRange)range textStorage:(NSTextStorage *)storage; From 2540a299dc8b427aef8a7a4dd071d5724e4e2249 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Tue, 2 Jul 2013 23:26:58 +0200 Subject: [PATCH 022/140] Added support for capture groups and made som cleanup --- Chromatism/Chromatism/JLTextViewController.h | 2 +- Chromatism/Chromatism/JLTextViewController.m | 41 ++++++ Chromatism/Chromatism/JLTokenPattern.h | 7 +- Chromatism/Chromatism/JLTokenPattern.m | 5 +- Chromatism/Chromatism/JLTokenizer.m | 138 +------------------ 5 files changed, 58 insertions(+), 135 deletions(-) diff --git a/Chromatism/Chromatism/JLTextViewController.h b/Chromatism/Chromatism/JLTextViewController.h index 02579d1..10de0f2 100644 --- a/Chromatism/Chromatism/JLTextViewController.h +++ b/Chromatism/Chromatism/JLTextViewController.h @@ -32,7 +32,7 @@ FOUNDATION_EXPORT NSString *const JLTokenTypeOtherMethodNames; @interface JLTextViewController : UIViewController @property (nonatomic, strong) NSDictionary *defaultAttributes; -@property (nonatomic, strong) UITextView *textView; +@property (nonatomic, strong) IBOutlet UITextView *textView; @property (nonatomic, strong) JLTokenizer *tokenizer; @property (nonatomic, strong) UIColor *highlightColor; diff --git a/Chromatism/Chromatism/JLTextViewController.m b/Chromatism/Chromatism/JLTextViewController.m index 1db193b..e97dd7e 100644 --- a/Chromatism/Chromatism/JLTextViewController.m +++ b/Chromatism/Chromatism/JLTextViewController.m @@ -89,6 +89,9 @@ - (void)viewDidLoad - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShown:) name:UIKeyboardWillShowNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; } - (void)didReceiveMemoryWarning @@ -97,6 +100,44 @@ - (void)didReceiveMemoryWarning // Dispose of any resources that can be recreated. } +- (void)viewWillDisappear:(BOOL)animated +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +- (void)moveTextViewForKeyboard:(NSNotification*)aNotification up:(BOOL)up { + NSDictionary* userInfo = [aNotification userInfo]; + NSTimeInterval animationDuration; + UIViewAnimationCurve animationCurve; + CGRect keyboardEndFrame; + + [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] getValue:&animationCurve]; + [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration]; + [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardEndFrame]; + + [UIView beginAnimations:nil context:nil]; + [UIView setAnimationDuration:animationDuration]; + [UIView setAnimationCurve:animationCurve]; + + CGRect newFrame = self.textView.frame; + CGRect keyboardFrame = [self.view convertRect:keyboardEndFrame toView:nil]; + keyboardFrame.size.height -= self.tabBarController.tabBar.frame.size.height; + newFrame.size.height -= keyboardFrame.size.height * (up?1:-1); + self.textView.frame = newFrame; + + [UIView commitAnimations]; +} + +- (void)keyboardWillShown:(NSNotification*)aNotification +{ + [self moveTextViewForKeyboard:aNotification up:YES]; +} + +- (void)keyboardWillHide:(NSNotification*)aNotification +{ + [self moveTextViewForKeyboard:aNotification up:NO]; +} + #pragma mark - UITextViewDelegate - (void)textViewDidBeginEditing:(UITextView *)textView diff --git a/Chromatism/Chromatism/JLTokenPattern.h b/Chromatism/Chromatism/JLTokenPattern.h index 0f10018..062fc18 100644 --- a/Chromatism/Chromatism/JLTokenPattern.h +++ b/Chromatism/Chromatism/JLTokenPattern.h @@ -12,13 +12,18 @@ + (instancetype)tokenPatternWithPattern:(NSString *)pattern andColor:(UIColor *)color; -// The color +/// The color @property (nonatomic, strong) UIColor *color; // Setting either expression or pattern causes the other one to update. @property (nonatomic, strong) NSRegularExpression *expression; @property (nonatomic, copy) NSString *pattern; +/** + * The index of the capture group which will be used as result from the regex search. Default is 0. + */ +@property (nonatomic, assign) NSUInteger captureGroup; + /// Describes if the pattern search for matches in indexes marked as unclear. If false, the search will happen in the scopes clearIndexes. If true, the serach will happen in the scope itself. Default: FALSE. //@property (nonatomic, assign) BOOL dirtySearch; diff --git a/Chromatism/Chromatism/JLTokenPattern.m b/Chromatism/Chromatism/JLTokenPattern.m index eca9431..12e0e4a 100644 --- a/Chromatism/Chromatism/JLTokenPattern.m +++ b/Chromatism/Chromatism/JLTokenPattern.m @@ -30,6 +30,7 @@ - (id)init if (self) { // self.dirtySearch = NO; self.opaque = YES; + self.captureGroup = 0; } return self; } @@ -54,8 +55,8 @@ - (void)perform { [self.scope.set enumerateRangesUsingBlock:^(NSRange range, BOOL *stop) { [self.expression enumerateMatchesInString:self.string options:0 range:range usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { - [self.textStorage addAttribute:NSForegroundColorAttributeName value:self.color range:[result range]]; - [self.set addIndexesInRange:[result range]]; + [self.textStorage addAttribute:NSForegroundColorAttributeName value:self.color range:[result rangeAtIndex:self.captureGroup]]; + [self.set addIndexesInRange:[result rangeAtIndex:self.captureGroup]]; }]; }]; diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index 1ba4eb8..777a123 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -41,21 +41,6 @@ #import "JLScope.h" #import "JLTokenPattern.h" - -@interface NSMutableAttributedString (Regex) -- (void)addRanges:(NSArray *)array withColor:(UIColor *)color; -- (void)addRanges:(NSArray *)array withAttributes:(NSDictionary *)colors; -- (NSArray *)allMatchesOfPattern:(NSString *)pattern inString:(NSString *)string; - -- (NSMutableIndexSet *)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color group:(int)index indexSet:(NSIndexSet *)indexSet andDescription:(NSString *)description; -- (NSMutableIndexSet *)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color indexSet:(NSIndexSet *)indexSet andDescription:(NSString *)description; - -- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color andDescription:(NSString *)description; -- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color range:(NSRange)range andDescription:(NSString *)description; -- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color group:(int)index range:(NSRange)range andDescription:(NSString *)description; -- (void)removeAttribute:(NSString *)name withValue:(id)compareValue range:(NSRange)range; -@end - @interface JLTokenizer () @end @@ -64,6 +49,9 @@ @implementation JLTokenizer - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range { + // Measure performance + NSDate *date = [NSDate date]; + // First, remove old attributes [self clearColorAttributesInRange:range textStorage:storage]; @@ -91,15 +79,19 @@ - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range // C function names JLTokenPattern *functions = [JLTokenPattern tokenPatternWithPattern:@"\\w+\\s*(?>\\(.*\\)" andColor:colors[JLTokenTypeOtherMethodNames]]; + functions.captureGroup = 1; // Dot notation JLTokenPattern *dots = [JLTokenPattern tokenPatternWithPattern:@"\\.(\\w+)" andColor:colors[JLTokenTypeOtherMethodNames]]; + dots.captureGroup = 1; // Method Calls JLTokenPattern *methods1 = [JLTokenPattern tokenPatternWithPattern:@"\\[\\w+\\s+(\\w+)\\]" andColor:colors[JLTokenTypeOtherMethodNames]]; + methods1.captureGroup = 1; // Method call parts JLTokenPattern *methods2 = [JLTokenPattern tokenPatternWithPattern:@"(?<=\\w+):\\s*[^\\s;\\]]+" andColor:colors[JLTokenTypeOtherMethodNames]]; + methods2.captureGroup = 1; // NS and UI prefixes words JLTokenPattern *appleClassNames = [JLTokenPattern tokenPatternWithPattern:@"(\\b(?>NS|UI))\\w+\\b" andColor:colors[JLTokenTypeOtherClassNames]]; @@ -109,130 +101,14 @@ - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range documentScope.subscopes = @[comments1, rangeScope]; rangeScope.subscopes = @[comments2, preprocessor, strings, numbers, literals, functions, dots, methods1, methods2, appleClassNames, keywords1, keywords2]; - NSDate *date = [NSDate date]; [documentScope perform]; NSLog(@"Chromatism done tokenizing with time of %fms",ABS([date timeIntervalSinceNow]*1000)); } - (void)clearColorAttributesInRange:(NSRange)range textStorage:(NSTextStorage *)storage; { - //Clear the comments to later be rebuilt - UIColor *compareColor = self.colors[JLTokenTypeComment]; - [storage removeAttribute:NSForegroundColorAttributeName withValue:compareColor range:range]; - [storage removeAttribute:NSForegroundColorAttributeName range:range]; [storage addAttribute:NSForegroundColorAttributeName value:self.colors[JLTokenTypeText] range:range]; } -#pragma mark - Pattern Helpers - -// TODO: Extend this - -- (NSString *)patternBetweenString:(NSString *)start andString:(NSString *)stop -{ - return nil; -} - - -@end - -#pragma mark - Regex Helpers - - -@implementation NSTextStorage (Regex) - -- (void)removeAttribute:(NSString *)name withValue:(id)compareValue range:(NSRange)range -{ - [self enumerateAttribute:NSForegroundColorAttributeName inRange:range options:0 usingBlock:^(id value, NSRange range, BOOL *stop) { - if ([value isEqual:compareValue]) { - [self removeAttribute:NSForegroundColorAttributeName range:range]; - } - - }]; -} - - -- (void)addRanges:(NSArray *)array withColor:(UIColor *)color -{ - for (NSValue *value in array) { - NSAssert(value.rangeValue.location < self.string.length, @"Range should be within the string"); - [self removeAttribute:NSForegroundColorAttributeName range:value.rangeValue]; - [self addAttribute:NSForegroundColorAttributeName value:color range:value.rangeValue]; - } -} - -- (void)addRanges:(NSArray *)array withAttributes:(NSDictionary *)dic -{ - for (NSValue *value in array) { - if (value.rangeValue.location + value.rangeValue.length <= self.length){ - NSAssert(value.rangeValue.location < self.string.length, @"Range should be within the string"); - [self removeAttribute:NSForegroundColorAttributeName range:value.rangeValue]; - [self addAttributes:dic range:value.rangeValue]; - } - } -} - -- (NSArray *)allMatchesOfPattern:(NSString *)pattern inString:(NSString *)string -{ - NSArray *mathces = [[NSRegularExpression regularExpressionWithPattern:pattern options:0 error:nil] matchesInString:string options:0 range:NSMakeRange(0, string.length)]; - - return mathces; -} - -- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color group:(int)index range:(NSRange)range andDescription:(NSString *)description -{ - NSString *string = self.string; - - - NSRegularExpression* expression = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionAnchorsMatchLines error:nil]; - - [expression enumerateMatchesInString:string options:0 range:range usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { - NSAssert(range.location < string.length, @"Range should be within the string"); - [self addAttribute:NSForegroundColorAttributeName value:color range:[result rangeAtIndex:index]]; - }]; -} - -// indexSet is a indexset containing the available indexes for tokenizing -- (NSMutableIndexSet *)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color indexSet:(NSMutableIndexSet **)indexSet andDescription:(NSString *)description -{ - __block NSMutableIndexSet *restultSet = [NSIndexSet indexSet].mutableCopy; - NSRegularExpression* expression = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionAnchorsMatchLines error:nil]; - __weak typeof(self) _self = self; - - [*indexSet enumerateRangesUsingBlock:^(NSRange range, BOOL *stop) { - [expression enumerateMatchesInString:self.string options:0 range:range usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { - NSAssert(range.location < self.length, @"Range should be within the string"); - [_self addAttribute:NSForegroundColorAttributeName value:color range:[result range]]; - [restultSet addIndexesInRange:[result range]]; - }]; - }]; - - [*indexSet removeIndexes:restultSet]; - return restultSet; -} - -- (NSMutableIndexSet *)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color group:(int)index indexSet:(NSMutableIndexSet **)indexSet andDescription:(NSString *)description -{ - NSString *string = self.string; - __block NSMutableIndexSet *restultSet = [NSIndexSet indexSet].mutableCopy; - __weak typeof(self) _self = self; - - NSRegularExpression* expression = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionAnchorsMatchLines error:nil]; - [*indexSet enumerateRangesUsingBlock:^(NSRange range, BOOL *stop) { - [expression enumerateMatchesInString:string options:0 range:range usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { - NSAssert(range.location < string.length, @"Range should be within the string"); - [_self addAttribute:NSForegroundColorAttributeName value:color range:[result rangeAtIndex:index]]; - [restultSet addIndexesInRange:[result rangeAtIndex:index]]; - }]; - }]; - [*indexSet removeIndexes:restultSet]; - return restultSet; -} - -- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color andDescription:(NSString *)description -{ - [self addRegularExpressionWithPattern:pattern withColor:color range:NSMakeRange(0, self.length) andDescription:description]; -} - - @end From c45fc413f33247539b02505a93516d830b57fb37 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Sat, 6 Jul 2013 18:20:47 +0200 Subject: [PATCH 023/140] Minor changes --- Chromatism/Chromatism/Chromatism.h | 1 + Chromatism/Chromatism/JLTokenizer.h | 1 + 2 files changed, 2 insertions(+) diff --git a/Chromatism/Chromatism/Chromatism.h b/Chromatism/Chromatism/Chromatism.h index eb21a7c..bf04a1b 100644 --- a/Chromatism/Chromatism/Chromatism.h +++ b/Chromatism/Chromatism/Chromatism.h @@ -11,6 +11,7 @@ #import "JLTokenizer.h" #import "JLTextViewController.h" #import "JLTokenPattern.h" +#import "JLTextStorage.h" @interface Chromatism : NSObject diff --git a/Chromatism/Chromatism/JLTokenizer.h b/Chromatism/Chromatism/JLTokenizer.h index 3a34679..37ba775 100644 --- a/Chromatism/Chromatism/JLTokenizer.h +++ b/Chromatism/Chromatism/JLTokenizer.h @@ -13,5 +13,6 @@ @class TextViewChange, JLTextView; @interface JLTokenizer : NSObject +- (void)clearColorAttributesInRange:(NSRange)range textStorage:(NSTextStorage *)storage; @property (nonatomic, strong) NSDictionary *colors; @end From 3ca238856aa477103e458e6d52ec82f24620c138 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Sat, 6 Jul 2013 18:21:26 +0200 Subject: [PATCH 024/140] More options to the people NSRegularExpressionAnchorsMatchLines is now default --- Chromatism/Chromatism/JLTokenPattern.h | 2 ++ Chromatism/Chromatism/JLTokenPattern.m | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Chromatism/Chromatism/JLTokenPattern.h b/Chromatism/Chromatism/JLTokenPattern.h index 062fc18..ea86846 100644 --- a/Chromatism/Chromatism/JLTokenPattern.h +++ b/Chromatism/Chromatism/JLTokenPattern.h @@ -19,6 +19,8 @@ @property (nonatomic, strong) NSRegularExpression *expression; @property (nonatomic, copy) NSString *pattern; +@property (nonatomic, assign) NSMatchingOptions matchingOptions; + /** * The index of the capture group which will be used as result from the regex search. Default is 0. */ diff --git a/Chromatism/Chromatism/JLTokenPattern.m b/Chromatism/Chromatism/JLTokenPattern.m index 12e0e4a..92e910a 100644 --- a/Chromatism/Chromatism/JLTokenPattern.m +++ b/Chromatism/Chromatism/JLTokenPattern.m @@ -48,13 +48,13 @@ - (void)setPattern:(NSString *)pattern { _pattern = pattern; - _expression = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:nil]; + _expression = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionAnchorsMatchLines error:nil]; } - (void)perform { [self.scope.set enumerateRangesUsingBlock:^(NSRange range, BOOL *stop) { - [self.expression enumerateMatchesInString:self.string options:0 range:range usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { + [self.expression enumerateMatchesInString:self.string options:self.matchingOptions range:range usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { [self.textStorage addAttribute:NSForegroundColorAttributeName value:self.color range:[result rangeAtIndex:self.captureGroup]]; [self.set addIndexesInRange:[result rangeAtIndex:self.captureGroup]]; }]; From 71b1be1d8c471bce858653006398e1a657b65251 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Fri, 12 Jul 2013 21:48:36 +0200 Subject: [PATCH 025/140] Added issues for iPad --- Chromatism/Chromatism/JLScope.h | 3 +++ Chromatism/Chromatism/JLTokenPattern.h | 3 --- Chromatism/Chromatism/JLTokenizer.m | 4 ++-- Chromatism/Chromatism/test.json | 27 +++++++++++++++++++++++++- 4 files changed, 31 insertions(+), 6 deletions(-) diff --git a/Chromatism/Chromatism/JLScope.h b/Chromatism/Chromatism/JLScope.h index b95c9c5..dfd9d7f 100644 --- a/Chromatism/Chromatism/JLScope.h +++ b/Chromatism/Chromatism/JLScope.h @@ -20,6 +20,9 @@ */ - (void)perform; +/// The color +@property (nonatomic, strong) UIColor *color; + /** * Array of nested JLScopes and JLTokenPatterns. Reverse realationship to scope, setting one causes the other to update. No not mutate. */ diff --git a/Chromatism/Chromatism/JLTokenPattern.h b/Chromatism/Chromatism/JLTokenPattern.h index ea86846..e2e3135 100644 --- a/Chromatism/Chromatism/JLTokenPattern.h +++ b/Chromatism/Chromatism/JLTokenPattern.h @@ -12,9 +12,6 @@ + (instancetype)tokenPatternWithPattern:(NSString *)pattern andColor:(UIColor *)color; -/// The color -@property (nonatomic, strong) UIColor *color; - // Setting either expression or pattern causes the other one to update. @property (nonatomic, strong) NSRegularExpression *expression; @property (nonatomic, copy) NSString *pattern; diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index 777a123..4f3fcf8 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -62,10 +62,10 @@ - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range // Two types of comments JLTokenPattern *comments1 = [JLTokenPattern tokenPatternWithPattern:@"/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*+/" andColor:colors[JLTokenTypeComment]]; - JLTokenPattern *comments2 = [JLTokenPattern tokenPatternWithPattern:@"//.*+\n" andColor:colors[JLTokenTypeComment]]; + JLTokenPattern *comments2 = [JLTokenPattern tokenPatternWithPattern:@"//.*+$" andColor:colors[JLTokenTypeComment]]; // Preprocessor macros - JLTokenPattern *preprocessor = [JLTokenPattern tokenPatternWithPattern:@"#.*+\n" andColor:colors[JLTokenTypePreprocessor]]; + JLTokenPattern *preprocessor = [JLTokenPattern tokenPatternWithPattern:@"#.*+$" andColor:colors[JLTokenTypePreprocessor]]; // Strings JLTokenPattern *strings = [JLTokenPattern tokenPatternWithPattern:@"(\"|@\")[^\"\\n]*(@\"|\")" andColor:colors[JLTokenTypeString]]; diff --git a/Chromatism/Chromatism/test.json b/Chromatism/Chromatism/test.json index fc37ebf..5e8fcb5 100644 --- a/Chromatism/Chromatism/test.json +++ b/Chromatism/Chromatism/test.json @@ -1,3 +1,28 @@ { - "language" : "objective-c" + "import" : "c", // imports c.json + "language" : "objective-c", // + "filetypes" : ["m" "h"], + "patterns" : [ + { + "name" : "blockComments", + "color" : "JLTokenTypeComment", + "regex" : "/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*+/", + }, + { + "name" : "lineComments", + "color" : "JLTokenTypeComment", + "regex" : "//.*+\n", + }, + { + "name" : "block comments", + "color" : "JLTokenTypeComment", + "regex" : "/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*+/", + }, + { + "name" : "block comments", + "color" : "JLTokenTypeComment", + "regex" : "/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*+/", + }, + ], + } From b0f0e2f1a67885c057ece96895c55c21a868fe82 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Sat, 13 Jul 2013 21:36:52 +0200 Subject: [PATCH 026/140] Added MGMushParser from MGBox2 --- .../Chromatism.xcodeproj/project.pbxproj | 16 ++ Chromatism/Chromatism/MGMushParser.h | 21 ++ Chromatism/Chromatism/MGMushParser.m | 198 ++++++++++++++++++ 3 files changed, 235 insertions(+) create mode 100755 Chromatism/Chromatism/MGMushParser.h create mode 100755 Chromatism/Chromatism/MGMushParser.m diff --git a/Chromatism/Chromatism.xcodeproj/project.pbxproj b/Chromatism/Chromatism.xcodeproj/project.pbxproj index db7fe6b..3f777fe 100644 --- a/Chromatism/Chromatism.xcodeproj/project.pbxproj +++ b/Chromatism/Chromatism.xcodeproj/project.pbxproj @@ -30,6 +30,8 @@ 8F54EF221781CD87008C1609 /* JLTextViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F3AB9541781C1250023348A /* JLTextViewController.m */; }; 8F54EF231781CD87008C1609 /* JLTokenizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F3AB9561781C1250023348A /* JLTokenizer.m */; }; 8F54EF241781CD87008C1609 /* JLTokenPattern.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F3AB9581781C1250023348A /* JLTokenPattern.m */; }; + 8FA0919F1791E2CF00179325 /* MGMushParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FA0919D1791E2CF00179325 /* MGMushParser.h */; }; + 8FA091A01791E2CF00179325 /* MGMushParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FA0919E1791E2CF00179325 /* MGMushParser.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -70,6 +72,8 @@ 8F3AB9581781C1250023348A /* JLTokenPattern.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JLTokenPattern.m; sourceTree = ""; }; 8F3AB95F1781C12F0023348A /* test.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = test.json; sourceTree = ""; }; 8F3AB9611781C26A0023348A /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + 8FA0919D1791E2CF00179325 /* MGMushParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MGMushParser.h; path = Chromatism/MGMushParser.h; sourceTree = ""; }; + 8FA0919E1791E2CF00179325 /* MGMushParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MGMushParser.m; path = Chromatism/MGMushParser.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -98,6 +102,7 @@ 8F3AB90F1781C0BA0023348A = { isa = PBXGroup; children = ( + 8FA091A11791E2D900179325 /* External */, 8F3AB91D1781C0BA0023348A /* Chromatism */, 8F3AB9311781C0BB0023348A /* ChromatismTests */, 8F3AB91A1781C0BA0023348A /* Frameworks */, @@ -176,6 +181,15 @@ name = "Supporting Files"; sourceTree = ""; }; + 8FA091A11791E2D900179325 /* External */ = { + isa = PBXGroup; + children = ( + 8FA0919D1791E2CF00179325 /* MGMushParser.h */, + 8FA0919E1791E2CF00179325 /* MGMushParser.m */, + ); + name = External; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -190,6 +204,7 @@ 8F54EF121781C788008C1609 /* JLTextStorage.h in Headers */, 8F54EF131781C788008C1609 /* JLTextViewController.h in Headers */, 8F54EF141781C788008C1609 /* JLTokenizer.h in Headers */, + 8FA0919F1791E2CF00179325 /* MGMushParser.h in Headers */, 8F54EF151781C788008C1609 /* JLTokenPattern.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; @@ -280,6 +295,7 @@ 8F54EF1F1781CD87008C1609 /* Helpers.m in Sources */, 8F54EF211781CD87008C1609 /* JLTextStorage.m in Sources */, 8F54EF221781CD87008C1609 /* JLTextViewController.m in Sources */, + 8FA091A01791E2CF00179325 /* MGMushParser.m in Sources */, 8F54EF231781CD87008C1609 /* JLTokenizer.m in Sources */, 8F54EF1E1781CD87008C1609 /* Chromatism.m in Sources */, 8F54EF1D1781CD87008C1609 /* CHLayoutManager.m in Sources */, diff --git a/Chromatism/Chromatism/MGMushParser.h b/Chromatism/Chromatism/MGMushParser.h new file mode 100755 index 0000000..c5d3c46 --- /dev/null +++ b/Chromatism/Chromatism/MGMushParser.h @@ -0,0 +1,21 @@ +// +// Created by matt on 7/11/12. +// + +#import +#import + +@interface MGMushParser : NSObject + +@property (nonatomic, copy) NSString *mush; +@property (nonatomic, retain) UIFont *baseFont; +@property (nonatomic, retain) UIColor *baseColor; + ++ (NSAttributedString *)attributedStringFromMush:(NSString *)markdown + font:(UIFont *)font + color:(UIColor *)color; +- (void)parse; +- (void)strip; +- (NSAttributedString *)attributedString; + +@end diff --git a/Chromatism/Chromatism/MGMushParser.m b/Chromatism/Chromatism/MGMushParser.m new file mode 100755 index 0000000..06df491 --- /dev/null +++ b/Chromatism/Chromatism/MGMushParser.m @@ -0,0 +1,198 @@ +// +// Created by matt on 7/11/12. +// + +#import "MGMushParser.h" + +@implementation MGMushParser { + NSMutableAttributedString *working; + UIFont *bold, *italic, *monospace; +} + +- (id)initWithTextile:(NSString *)markdown { + self = [self init]; + working = [[NSMutableAttributedString alloc] initWithString:markdown]; + return self; +} + ++ (NSAttributedString *)attributedStringFromMush:(NSString *)markdown + font:(UIFont *)font + color:(UIColor *)color { + MGMushParser *parser = [[MGMushParser alloc] init]; + parser.mush = markdown; + parser.baseColor = color; + parser.baseFont = font; + if ([UILabel instancesRespondToSelector:@selector(attributedText)]) { + [parser parse]; + } else { + [parser strip]; + } + return parser.attributedString; +} + +- (void)parse { + + // apply base colour and font + id base = @{ + NSForegroundColorAttributeName:self.baseColor, + NSFontAttributeName:self.baseFont + }; + [working addAttributes:base range:(NSRange){0, working.length}]; + + // patterns + id boldParser = @{ + @"regex":@"(\\*{2})(.+?)(\\*{2})", + @"replace":@[@"", @1, @""], + @"attributes":@[@{ }, @{ NSFontAttributeName:bold }, @{ }] + }; + + id italicParser = @{ + @"regex":@"(/{2})(.+?)(/{2})", + @"replace":@[@"", @1, @""], + @"attributes":@[@{ }, @{ NSFontAttributeName:italic }, @{ }] + }; + + id underlineParser = @{ + @"regex":@"(_{2})(.+?)(_{2})", + @"replace":@[@"", @1, @""], + @"attributes":@[@{ }, @{ NSUnderlineStyleAttributeName:@(NSUnderlineStyleSingle) }, @{ }] + }; + + id monospaceParser = @{ + @"regex":@"(`)(.+?)(`)", + @"replace":@[@"", @1, @""], + @"attributes":@[@{ }, @{ NSFontAttributeName:monospace }, @{ }] + }; + + [self applyParser:boldParser]; + [self applyParser:italicParser]; + [self applyParser:underlineParser]; + [self applyParser:monospaceParser]; +} + +- (void)strip { + + // patterns + id boldParser = @{ + @"regex":@"(\\*{2})(.+?)(\\*{2})", + @"replace":@[@"", @1, @""] + }; + + id italicParser = @{ + @"regex":@"(/{2})(.+?)(/{2})", + @"replace":@[@"", @1, @""] + }; + + id underlineParser = @{ + @"regex":@"(_{2})(.+?)(_{2})", + @"replace":@[@"", @1, @""] + }; + + id monospaceParser = @{ + @"regex":@"(`)(.+?)(`)", + @"replace":@[@"", @1, @""] + }; + + [self applyParser:boldParser]; + [self applyParser:italicParser]; + [self applyParser:underlineParser]; + [self applyParser:monospaceParser]; +} + +- (void)applyParser:(NSDictionary *)parser { + id regex = [NSRegularExpression regularExpressionWithPattern:parser[@"regex"] + options:0 error:nil]; + NSString *markdown = working.string.copy; + + __block int nudge = 0; + [regex enumerateMatchesInString:markdown options:0 + range:(NSRange){0, markdown.length} + usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, + BOOL *stop) { + + NSMutableArray *substrs = @[].mutableCopy; + NSMutableArray *replacements = @[].mutableCopy; + + // fetch match substrings + for (int i = 0; i < match.numberOfRanges - 1; i++) { + NSRange nudged = [match rangeAtIndex:i + 1]; + nudged.location -= nudge; + substrs[i] = [working attributedSubstringFromRange:nudged].mutableCopy; + } + + // make replacement substrings + for (int i = 0; i < match.numberOfRanges - 1; i++) { + NSString *repstr = parser[@"replace"][i]; + replacements[i] = [repstr isKindOfClass:NSNumber.class] + ? substrs[repstr.intValue] + : [[NSMutableAttributedString alloc] initWithString:repstr]; + } + + // apply attributes + for (int i = 0; i < match.numberOfRanges - 1; i++) { + id attributes = parser[@"attributes"][i]; + if (attributes) { + NSMutableAttributedString *repl = replacements[i]; + [repl addAttributes:attributes range:(NSRange){0, repl.length}]; + } + } + + // replace + for (int i = 0; i < match.numberOfRanges - 1; i++) { + NSRange nudged = [match rangeAtIndex:i + 1]; + nudged.location -= nudge; + nudge += [substrs[i] length] - [replacements[i] length]; + [working replaceCharactersInRange:nudged + withAttributedString:replacements[i]]; + } + }]; +} + +#pragma mark - Setters + +- (void)setMush:(NSString *)mush { + _mush = mush; + working = [[NSMutableAttributedString alloc] initWithString:mush]; +} + +- (void)setBaseFont:(UIFont *)font { + _baseFont = font; + + if (!font) { + return; + } + + // base ctfont + CGFloat size = font.pointSize; + CFStringRef name = (__bridge CFStringRef)font.fontName; + CTFontRef ctBase = CTFontCreateWithName(name, size, NULL); + + // bold font + CTFontRef ctBold = CTFontCreateCopyWithSymbolicTraits(ctBase, 0, NULL, + kCTFontBoldTrait, kCTFontBoldTrait); + CFStringRef boldName = CTFontCopyName(ctBold, kCTFontPostScriptNameKey); + bold = [UIFont fontWithName:(__bridge NSString *)boldName size:size] ?: font; + + // italic font + CTFontRef ctItalic = CTFontCreateCopyWithSymbolicTraits(ctBase, 0, NULL, + kCTFontItalicTrait, kCTFontItalicTrait); + CFStringRef italicName = CTFontCopyName(ctItalic, kCTFontPostScriptNameKey); + italic = [UIFont fontWithName:(__bridge NSString *)italicName size:size] ?: font; + + monospace = [UIFont fontWithName:@"CourierNewPSMT" size:size]; + + // Release CF objects no longer needed + CFRelease(ctBase); + CFRelease(ctBold); + CFRelease(boldName); + CFRelease(ctItalic); + CFRelease(italicName); +} + +#pragma mark - Getters + +- (NSAttributedString *)attributedString { + return working; +} + +@end From c1832a71fc27253b83734f8cd7616e006af4f8b8 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Sat, 13 Jul 2013 21:46:12 +0200 Subject: [PATCH 027/140] =?UTF-8?q?Added=20method=20for=20=E2=80=9Cnon-liv?= =?UTF-8?q?e=E2=80=9D=20syntax=20highlighting?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Chromatism/Chromatism/JLTokenizer.h | 2 ++ Chromatism/Chromatism/JLTokenizer.m | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/Chromatism/Chromatism/JLTokenizer.h b/Chromatism/Chromatism/JLTokenizer.h index 37ba775..bea54f8 100644 --- a/Chromatism/Chromatism/JLTokenizer.h +++ b/Chromatism/Chromatism/JLTokenizer.h @@ -14,5 +14,7 @@ @interface JLTokenizer : NSObject - (void)clearColorAttributesInRange:(NSRange)range textStorage:(NSTextStorage *)storage; +- (NSMutableAttributedString *)tokenizeString:(NSString *)string withDefaultAttributes:(NSDictionary *)attributes; + @property (nonatomic, strong) NSDictionary *colors; @end diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index 4f3fcf8..39c82b3 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -105,6 +105,13 @@ - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range NSLog(@"Chromatism done tokenizing with time of %fms",ABS([date timeIntervalSinceNow]*1000)); } +- (NSMutableAttributedString *)tokenizeString:(NSString *)string withDefaultAttributes:(NSDictionary *)attributes; +{ + NSMutableAttributedString *attributedString = [[NSAttributedString alloc] initWithString:string attributes:attributes].mutableCopy; + [self tokenizeTextStorage:(NSTextStorage *)attributedString withRange:NSMakeRange(0, string.length)]; + return attributedString; +} + - (void)clearColorAttributesInRange:(NSRange)range textStorage:(NSTextStorage *)storage; { [storage removeAttribute:NSForegroundColorAttributeName range:range]; From b32f7ebae9aa2cd3814b09551043f02391bbf29c Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Sat, 13 Jul 2013 22:00:05 +0200 Subject: [PATCH 028/140] Removed MGMushParser and just implemented the snippets we need --- .../Chromatism.xcodeproj/project.pbxproj | 20 +- Chromatism/Chromatism/JLMarkdownTokenizer.h | 13 ++ Chromatism/Chromatism/JLMarkdownTokenizer.m | 118 +++++++++++ Chromatism/Chromatism/MGMushParser.h | 21 -- Chromatism/Chromatism/MGMushParser.m | 198 ------------------ 5 files changed, 141 insertions(+), 229 deletions(-) create mode 100644 Chromatism/Chromatism/JLMarkdownTokenizer.h create mode 100644 Chromatism/Chromatism/JLMarkdownTokenizer.m delete mode 100755 Chromatism/Chromatism/MGMushParser.h delete mode 100755 Chromatism/Chromatism/MGMushParser.m diff --git a/Chromatism/Chromatism.xcodeproj/project.pbxproj b/Chromatism/Chromatism.xcodeproj/project.pbxproj index 3f777fe..c07161f 100644 --- a/Chromatism/Chromatism.xcodeproj/project.pbxproj +++ b/Chromatism/Chromatism.xcodeproj/project.pbxproj @@ -30,8 +30,8 @@ 8F54EF221781CD87008C1609 /* JLTextViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F3AB9541781C1250023348A /* JLTextViewController.m */; }; 8F54EF231781CD87008C1609 /* JLTokenizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F3AB9561781C1250023348A /* JLTokenizer.m */; }; 8F54EF241781CD87008C1609 /* JLTokenPattern.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F3AB9581781C1250023348A /* JLTokenPattern.m */; }; - 8FA0919F1791E2CF00179325 /* MGMushParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FA0919D1791E2CF00179325 /* MGMushParser.h */; }; - 8FA091A01791E2CF00179325 /* MGMushParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FA0919E1791E2CF00179325 /* MGMushParser.m */; }; + 8FA091A41791E62600179325 /* JLMarkdownTokenizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FA091A21791E62600179325 /* JLMarkdownTokenizer.h */; }; + 8FA091A51791E62600179325 /* JLMarkdownTokenizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FA091A31791E62600179325 /* JLMarkdownTokenizer.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -72,8 +72,8 @@ 8F3AB9581781C1250023348A /* JLTokenPattern.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JLTokenPattern.m; sourceTree = ""; }; 8F3AB95F1781C12F0023348A /* test.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = test.json; sourceTree = ""; }; 8F3AB9611781C26A0023348A /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 8FA0919D1791E2CF00179325 /* MGMushParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MGMushParser.h; path = Chromatism/MGMushParser.h; sourceTree = ""; }; - 8FA0919E1791E2CF00179325 /* MGMushParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MGMushParser.m; path = Chromatism/MGMushParser.m; sourceTree = ""; }; + 8FA091A21791E62600179325 /* JLMarkdownTokenizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JLMarkdownTokenizer.h; sourceTree = ""; }; + 8FA091A31791E62600179325 /* JLMarkdownTokenizer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JLMarkdownTokenizer.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -133,6 +133,10 @@ 8F3AB91D1781C0BA0023348A /* Chromatism */ = { isa = PBXGroup; children = ( + 8F3AB9551781C1250023348A /* JLTokenizer.h */, + 8F3AB9561781C1250023348A /* JLTokenizer.m */, + 8FA091A21791E62600179325 /* JLMarkdownTokenizer.h */, + 8FA091A31791E62600179325 /* JLMarkdownTokenizer.m */, 8F3AB94A1781C1180023348A /* CHLayoutManager.h */, 8F3AB94B1781C1180023348A /* CHLayoutManager.m */, 8F3AB9201781C0BA0023348A /* Chromatism.h */, @@ -147,8 +151,6 @@ 8F3AB9521781C1250023348A /* JLTextStorage.m */, 8F3AB9531781C1250023348A /* JLTextViewController.h */, 8F3AB9541781C1250023348A /* JLTextViewController.m */, - 8F3AB9551781C1250023348A /* JLTokenizer.h */, - 8F3AB9561781C1250023348A /* JLTokenizer.m */, 8F3AB91E1781C0BA0023348A /* Supporting Files */, ); path = Chromatism; @@ -184,8 +186,6 @@ 8FA091A11791E2D900179325 /* External */ = { isa = PBXGroup; children = ( - 8FA0919D1791E2CF00179325 /* MGMushParser.h */, - 8FA0919E1791E2CF00179325 /* MGMushParser.m */, ); name = External; sourceTree = ""; @@ -204,7 +204,7 @@ 8F54EF121781C788008C1609 /* JLTextStorage.h in Headers */, 8F54EF131781C788008C1609 /* JLTextViewController.h in Headers */, 8F54EF141781C788008C1609 /* JLTokenizer.h in Headers */, - 8FA0919F1791E2CF00179325 /* MGMushParser.h in Headers */, + 8FA091A41791E62600179325 /* JLMarkdownTokenizer.h in Headers */, 8F54EF151781C788008C1609 /* JLTokenPattern.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; @@ -292,10 +292,10 @@ files = ( 8F54EF241781CD87008C1609 /* JLTokenPattern.m in Sources */, 8F54EF201781CD87008C1609 /* JLScope.m in Sources */, + 8FA091A51791E62600179325 /* JLMarkdownTokenizer.m in Sources */, 8F54EF1F1781CD87008C1609 /* Helpers.m in Sources */, 8F54EF211781CD87008C1609 /* JLTextStorage.m in Sources */, 8F54EF221781CD87008C1609 /* JLTextViewController.m in Sources */, - 8FA091A01791E2CF00179325 /* MGMushParser.m in Sources */, 8F54EF231781CD87008C1609 /* JLTokenizer.m in Sources */, 8F54EF1E1781CD87008C1609 /* Chromatism.m in Sources */, 8F54EF1D1781CD87008C1609 /* CHLayoutManager.m in Sources */, diff --git a/Chromatism/Chromatism/JLMarkdownTokenizer.h b/Chromatism/Chromatism/JLMarkdownTokenizer.h new file mode 100644 index 0000000..ae35d59 --- /dev/null +++ b/Chromatism/Chromatism/JLMarkdownTokenizer.h @@ -0,0 +1,13 @@ +// +// JLMarkdownTokenizer.h +// Chromatism +// +// Created by Johannes Lund on 2013-07-13. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import + +@interface JLMarkdownTokenizer : JLTokenizer + +@end diff --git a/Chromatism/Chromatism/JLMarkdownTokenizer.m b/Chromatism/Chromatism/JLMarkdownTokenizer.m new file mode 100644 index 0000000..a1326b7 --- /dev/null +++ b/Chromatism/Chromatism/JLMarkdownTokenizer.m @@ -0,0 +1,118 @@ +// +// JLMarkdownTokenizer.m +// Chromatism +// +// Created by Johannes Lund on 2013-07-13. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import "JLMarkdownTokenizer.h" + +@implementation JLMarkdownTokenizer + +- (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range +{ + [NSException raise:@"Chromatism bad task" format:@"%@ cannot handle live syntax highlighting", self.class]; +} + +- (NSMutableAttributedString *)tokenizeString:(NSString *)string withDefaultAttributes:(NSDictionary *)attributes +{ + NSString *markup = @"**bold**, //italics//, __underlining__, `monospacing`, and {#0000FF|text colour}"; + + UIFont *baseFont = [UIFont fontWithName:@"HelveticaNeue" size:18]; + UIColor *textColor = UIColor.whiteColor; + +} + +// +// Created by matt on 7/11/12. +// +// https://github.com/sobri909/MGBox2/blob/master/MGBox/MGMushParser.m +// +// Slightly modified + +- (void)parse { + + + // patterns + NSDictionary *boldParser = @{ + @"regex":@"(\\*{2})(.+?)(\\*{2})", + @"replace":@[@"", @1, @""], + @"attributes":@[@{ }, @{ NSFontAttributeName:bold }, @{ }] + }; + + NSDictionary *italicParser = @{ + @"regex":@"(/{2})(.+?)(/{2})", + @"replace":@[@"", @1, @""], + @"attributes":@[@{ }, @{ NSFontAttributeName:italic }, @{ }] + }; + + NSDictionary *underlineParser = @{ + @"regex":@"(_{2})(.+?)(_{2})", + @"replace":@[@"", @1, @""], + @"attributes":@[@{ }, @{ NSUnderlineStyleAttributeName:@(NSUnderlineStyleSingle) }, @{ }] + }; + + NSDictionary *monospaceParser = @{ + @"regex":@"(`)(.+?)(`)", + @"replace":@[@"", @1, @""], + @"attributes":@[@{ }, @{ NSFontAttributeName:monospace }, @{ }] + }; + + [self applyParser:boldParser]; + [self applyParser:italicParser]; + [self applyParser:underlineParser]; + [self applyParser:monospaceParser]; +} + +- (void)applyParser:(NSDictionary *)parser { + id regex = [NSRegularExpression regularExpressionWithPattern:parser[@"regex"] + options:0 error:nil]; + NSString *markdown = working.string.copy; + + __block int nudge = 0; + [regex enumerateMatchesInString:markdown options:0 + range:(NSRange){0, markdown.length} + usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, + BOOL *stop) { + + NSMutableArray *substrs = @[].mutableCopy; + NSMutableArray *replacements = @[].mutableCopy; + + // fetch match substrings + for (int i = 0; i < match.numberOfRanges - 1; i++) { + NSRange nudged = [match rangeAtIndex:i + 1]; + nudged.location -= nudge; + substrs[i] = [working attributedSubstringFromRange:nudged].mutableCopy; + } + + // make replacement substrings + for (int i = 0; i < match.numberOfRanges - 1; i++) { + NSString *repstr = parser[@"replace"][i]; + replacements[i] = [repstr isKindOfClass:NSNumber.class] + ? substrs[repstr.intValue] + : [[NSMutableAttributedString alloc] initWithString:repstr]; + } + + // apply attributes + for (int i = 0; i < match.numberOfRanges - 1; i++) { + id attributes = parser[@"attributes"][i]; + if (attributes) { + NSMutableAttributedString *repl = replacements[i]; + [repl addAttributes:attributes range:(NSRange){0, repl.length}]; + } + } + + // replace + for (int i = 0; i < match.numberOfRanges - 1; i++) { + NSRange nudged = [match rangeAtIndex:i + 1]; + nudged.location -= nudge; + nudge += [substrs[i] length] - [replacements[i] length]; + [working replaceCharactersInRange:nudged + withAttributedString:replacements[i]]; + } + }]; +} + + +@end diff --git a/Chromatism/Chromatism/MGMushParser.h b/Chromatism/Chromatism/MGMushParser.h deleted file mode 100755 index c5d3c46..0000000 --- a/Chromatism/Chromatism/MGMushParser.h +++ /dev/null @@ -1,21 +0,0 @@ -// -// Created by matt on 7/11/12. -// - -#import -#import - -@interface MGMushParser : NSObject - -@property (nonatomic, copy) NSString *mush; -@property (nonatomic, retain) UIFont *baseFont; -@property (nonatomic, retain) UIColor *baseColor; - -+ (NSAttributedString *)attributedStringFromMush:(NSString *)markdown - font:(UIFont *)font - color:(UIColor *)color; -- (void)parse; -- (void)strip; -- (NSAttributedString *)attributedString; - -@end diff --git a/Chromatism/Chromatism/MGMushParser.m b/Chromatism/Chromatism/MGMushParser.m deleted file mode 100755 index 06df491..0000000 --- a/Chromatism/Chromatism/MGMushParser.m +++ /dev/null @@ -1,198 +0,0 @@ -// -// Created by matt on 7/11/12. -// - -#import "MGMushParser.h" - -@implementation MGMushParser { - NSMutableAttributedString *working; - UIFont *bold, *italic, *monospace; -} - -- (id)initWithTextile:(NSString *)markdown { - self = [self init]; - working = [[NSMutableAttributedString alloc] initWithString:markdown]; - return self; -} - -+ (NSAttributedString *)attributedStringFromMush:(NSString *)markdown - font:(UIFont *)font - color:(UIColor *)color { - MGMushParser *parser = [[MGMushParser alloc] init]; - parser.mush = markdown; - parser.baseColor = color; - parser.baseFont = font; - if ([UILabel instancesRespondToSelector:@selector(attributedText)]) { - [parser parse]; - } else { - [parser strip]; - } - return parser.attributedString; -} - -- (void)parse { - - // apply base colour and font - id base = @{ - NSForegroundColorAttributeName:self.baseColor, - NSFontAttributeName:self.baseFont - }; - [working addAttributes:base range:(NSRange){0, working.length}]; - - // patterns - id boldParser = @{ - @"regex":@"(\\*{2})(.+?)(\\*{2})", - @"replace":@[@"", @1, @""], - @"attributes":@[@{ }, @{ NSFontAttributeName:bold }, @{ }] - }; - - id italicParser = @{ - @"regex":@"(/{2})(.+?)(/{2})", - @"replace":@[@"", @1, @""], - @"attributes":@[@{ }, @{ NSFontAttributeName:italic }, @{ }] - }; - - id underlineParser = @{ - @"regex":@"(_{2})(.+?)(_{2})", - @"replace":@[@"", @1, @""], - @"attributes":@[@{ }, @{ NSUnderlineStyleAttributeName:@(NSUnderlineStyleSingle) }, @{ }] - }; - - id monospaceParser = @{ - @"regex":@"(`)(.+?)(`)", - @"replace":@[@"", @1, @""], - @"attributes":@[@{ }, @{ NSFontAttributeName:monospace }, @{ }] - }; - - [self applyParser:boldParser]; - [self applyParser:italicParser]; - [self applyParser:underlineParser]; - [self applyParser:monospaceParser]; -} - -- (void)strip { - - // patterns - id boldParser = @{ - @"regex":@"(\\*{2})(.+?)(\\*{2})", - @"replace":@[@"", @1, @""] - }; - - id italicParser = @{ - @"regex":@"(/{2})(.+?)(/{2})", - @"replace":@[@"", @1, @""] - }; - - id underlineParser = @{ - @"regex":@"(_{2})(.+?)(_{2})", - @"replace":@[@"", @1, @""] - }; - - id monospaceParser = @{ - @"regex":@"(`)(.+?)(`)", - @"replace":@[@"", @1, @""] - }; - - [self applyParser:boldParser]; - [self applyParser:italicParser]; - [self applyParser:underlineParser]; - [self applyParser:monospaceParser]; -} - -- (void)applyParser:(NSDictionary *)parser { - id regex = [NSRegularExpression regularExpressionWithPattern:parser[@"regex"] - options:0 error:nil]; - NSString *markdown = working.string.copy; - - __block int nudge = 0; - [regex enumerateMatchesInString:markdown options:0 - range:(NSRange){0, markdown.length} - usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, - BOOL *stop) { - - NSMutableArray *substrs = @[].mutableCopy; - NSMutableArray *replacements = @[].mutableCopy; - - // fetch match substrings - for (int i = 0; i < match.numberOfRanges - 1; i++) { - NSRange nudged = [match rangeAtIndex:i + 1]; - nudged.location -= nudge; - substrs[i] = [working attributedSubstringFromRange:nudged].mutableCopy; - } - - // make replacement substrings - for (int i = 0; i < match.numberOfRanges - 1; i++) { - NSString *repstr = parser[@"replace"][i]; - replacements[i] = [repstr isKindOfClass:NSNumber.class] - ? substrs[repstr.intValue] - : [[NSMutableAttributedString alloc] initWithString:repstr]; - } - - // apply attributes - for (int i = 0; i < match.numberOfRanges - 1; i++) { - id attributes = parser[@"attributes"][i]; - if (attributes) { - NSMutableAttributedString *repl = replacements[i]; - [repl addAttributes:attributes range:(NSRange){0, repl.length}]; - } - } - - // replace - for (int i = 0; i < match.numberOfRanges - 1; i++) { - NSRange nudged = [match rangeAtIndex:i + 1]; - nudged.location -= nudge; - nudge += [substrs[i] length] - [replacements[i] length]; - [working replaceCharactersInRange:nudged - withAttributedString:replacements[i]]; - } - }]; -} - -#pragma mark - Setters - -- (void)setMush:(NSString *)mush { - _mush = mush; - working = [[NSMutableAttributedString alloc] initWithString:mush]; -} - -- (void)setBaseFont:(UIFont *)font { - _baseFont = font; - - if (!font) { - return; - } - - // base ctfont - CGFloat size = font.pointSize; - CFStringRef name = (__bridge CFStringRef)font.fontName; - CTFontRef ctBase = CTFontCreateWithName(name, size, NULL); - - // bold font - CTFontRef ctBold = CTFontCreateCopyWithSymbolicTraits(ctBase, 0, NULL, - kCTFontBoldTrait, kCTFontBoldTrait); - CFStringRef boldName = CTFontCopyName(ctBold, kCTFontPostScriptNameKey); - bold = [UIFont fontWithName:(__bridge NSString *)boldName size:size] ?: font; - - // italic font - CTFontRef ctItalic = CTFontCreateCopyWithSymbolicTraits(ctBase, 0, NULL, - kCTFontItalicTrait, kCTFontItalicTrait); - CFStringRef italicName = CTFontCopyName(ctItalic, kCTFontPostScriptNameKey); - italic = [UIFont fontWithName:(__bridge NSString *)italicName size:size] ?: font; - - monospace = [UIFont fontWithName:@"CourierNewPSMT" size:size]; - - // Release CF objects no longer needed - CFRelease(ctBase); - CFRelease(ctBold); - CFRelease(boldName); - CFRelease(ctItalic); - CFRelease(italicName); -} - -#pragma mark - Getters - -- (NSAttributedString *)attributedString { - return working; -} - -@end From f80fc5a4310dd12fef80c16dd540cfb98797c5e1 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Sun, 14 Jul 2013 01:30:37 +0200 Subject: [PATCH 029/140] Added basic markdown support --- .../Chromatism.xcodeproj/project.pbxproj | 20 ++- Chromatism/Chromatism/Chromatism.h | 1 + Chromatism/Chromatism/JLCodeAttatchment.h | 13 ++ Chromatism/Chromatism/JLCodeAttatchment.m | 18 ++ Chromatism/Chromatism/JLMarkdownTokenizer.h | 4 + Chromatism/Chromatism/JLMarkdownTokenizer.m | 164 +++++++++--------- .../NSMutableAttributedString+Mush.h | 15 ++ .../NSMutableAttributedString+Mush.m | 68 ++++++++ Chromatism/Chromatism/code.png | Bin 0 -> 4633 bytes 9 files changed, 219 insertions(+), 84 deletions(-) create mode 100644 Chromatism/Chromatism/JLCodeAttatchment.h create mode 100644 Chromatism/Chromatism/JLCodeAttatchment.m create mode 100644 Chromatism/Chromatism/NSMutableAttributedString+Mush.h create mode 100644 Chromatism/Chromatism/NSMutableAttributedString+Mush.m create mode 100644 Chromatism/Chromatism/code.png diff --git a/Chromatism/Chromatism.xcodeproj/project.pbxproj b/Chromatism/Chromatism.xcodeproj/project.pbxproj index c07161f..0a87382 100644 --- a/Chromatism/Chromatism.xcodeproj/project.pbxproj +++ b/Chromatism/Chromatism.xcodeproj/project.pbxproj @@ -30,8 +30,12 @@ 8F54EF221781CD87008C1609 /* JLTextViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F3AB9541781C1250023348A /* JLTextViewController.m */; }; 8F54EF231781CD87008C1609 /* JLTokenizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F3AB9561781C1250023348A /* JLTokenizer.m */; }; 8F54EF241781CD87008C1609 /* JLTokenPattern.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F3AB9581781C1250023348A /* JLTokenPattern.m */; }; - 8FA091A41791E62600179325 /* JLMarkdownTokenizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FA091A21791E62600179325 /* JLMarkdownTokenizer.h */; }; + 8FA091A41791E62600179325 /* JLMarkdownTokenizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FA091A21791E62600179325 /* JLMarkdownTokenizer.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8FA091A51791E62600179325 /* JLMarkdownTokenizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FA091A31791E62600179325 /* JLMarkdownTokenizer.m */; }; + 8FA091A81791E99900179325 /* NSMutableAttributedString+Mush.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FA091A61791E99900179325 /* NSMutableAttributedString+Mush.h */; }; + 8FA091A91791E99900179325 /* NSMutableAttributedString+Mush.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FA091A71791E99900179325 /* NSMutableAttributedString+Mush.m */; }; + 8FA091AD17921A4300179325 /* JLCodeAttatchment.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FA091AB17921A4300179325 /* JLCodeAttatchment.h */; }; + 8FA091AE17921A4300179325 /* JLCodeAttatchment.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FA091AC17921A4300179325 /* JLCodeAttatchment.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -74,6 +78,11 @@ 8F3AB9611781C26A0023348A /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 8FA091A21791E62600179325 /* JLMarkdownTokenizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JLMarkdownTokenizer.h; sourceTree = ""; }; 8FA091A31791E62600179325 /* JLMarkdownTokenizer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JLMarkdownTokenizer.m; sourceTree = ""; }; + 8FA091A61791E99900179325 /* NSMutableAttributedString+Mush.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSMutableAttributedString+Mush.h"; sourceTree = ""; }; + 8FA091A71791E99900179325 /* NSMutableAttributedString+Mush.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSMutableAttributedString+Mush.m"; sourceTree = ""; }; + 8FA091AA17921A1600179325 /* code.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = code.png; sourceTree = ""; }; + 8FA091AB17921A4300179325 /* JLCodeAttatchment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JLCodeAttatchment.h; sourceTree = ""; }; + 8FA091AC17921A4300179325 /* JLCodeAttatchment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JLCodeAttatchment.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -137,6 +146,8 @@ 8F3AB9561781C1250023348A /* JLTokenizer.m */, 8FA091A21791E62600179325 /* JLMarkdownTokenizer.h */, 8FA091A31791E62600179325 /* JLMarkdownTokenizer.m */, + 8FA091A61791E99900179325 /* NSMutableAttributedString+Mush.h */, + 8FA091A71791E99900179325 /* NSMutableAttributedString+Mush.m */, 8F3AB94A1781C1180023348A /* CHLayoutManager.h */, 8F3AB94B1781C1180023348A /* CHLayoutManager.m */, 8F3AB9201781C0BA0023348A /* Chromatism.h */, @@ -151,6 +162,8 @@ 8F3AB9521781C1250023348A /* JLTextStorage.m */, 8F3AB9531781C1250023348A /* JLTextViewController.h */, 8F3AB9541781C1250023348A /* JLTextViewController.m */, + 8FA091AB17921A4300179325 /* JLCodeAttatchment.h */, + 8FA091AC17921A4300179325 /* JLCodeAttatchment.m */, 8F3AB91E1781C0BA0023348A /* Supporting Files */, ); path = Chromatism; @@ -159,6 +172,7 @@ 8F3AB91E1781C0BA0023348A /* Supporting Files */ = { isa = PBXGroup; children = ( + 8FA091AA17921A1600179325 /* code.png */, 8F3AB95F1781C12F0023348A /* test.json */, 8F3AB91F1781C0BA0023348A /* Chromatism-Prefix.pch */, ); @@ -197,6 +211,7 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( + 8FA091A81791E99900179325 /* NSMutableAttributedString+Mush.h in Headers */, 8F54EF0E1781C776008C1609 /* Chromatism.h in Headers */, 8F54EF0F1781C788008C1609 /* CHLayoutManager.h in Headers */, 8F54EF101781C788008C1609 /* Helpers.h in Headers */, @@ -206,6 +221,7 @@ 8F54EF141781C788008C1609 /* JLTokenizer.h in Headers */, 8FA091A41791E62600179325 /* JLMarkdownTokenizer.h in Headers */, 8F54EF151781C788008C1609 /* JLTokenPattern.h in Headers */, + 8FA091AD17921A4300179325 /* JLCodeAttatchment.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -290,6 +306,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 8FA091A91791E99900179325 /* NSMutableAttributedString+Mush.m in Sources */, + 8FA091AE17921A4300179325 /* JLCodeAttatchment.m in Sources */, 8F54EF241781CD87008C1609 /* JLTokenPattern.m in Sources */, 8F54EF201781CD87008C1609 /* JLScope.m in Sources */, 8FA091A51791E62600179325 /* JLMarkdownTokenizer.m in Sources */, diff --git a/Chromatism/Chromatism/Chromatism.h b/Chromatism/Chromatism/Chromatism.h index bf04a1b..c85f0cd 100644 --- a/Chromatism/Chromatism/Chromatism.h +++ b/Chromatism/Chromatism/Chromatism.h @@ -12,6 +12,7 @@ #import "JLTextViewController.h" #import "JLTokenPattern.h" #import "JLTextStorage.h" +#import "JLMarkdownTokenizer.h" @interface Chromatism : NSObject diff --git a/Chromatism/Chromatism/JLCodeAttatchment.h b/Chromatism/Chromatism/JLCodeAttatchment.h new file mode 100644 index 0000000..9518114 --- /dev/null +++ b/Chromatism/Chromatism/JLCodeAttatchment.h @@ -0,0 +1,13 @@ +// +// JLCodeAttatchment.h +// Chromatism +// +// Created by Johannes Lund on 2013-07-14. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import + +@interface JLCodeAttatchment : NSTextAttachment + +@end diff --git a/Chromatism/Chromatism/JLCodeAttatchment.m b/Chromatism/Chromatism/JLCodeAttatchment.m new file mode 100644 index 0000000..f4a1a0e --- /dev/null +++ b/Chromatism/Chromatism/JLCodeAttatchment.m @@ -0,0 +1,18 @@ +// +// JLCodeAttatchment.m +// Chromatism +// +// Created by Johannes Lund on 2013-07-14. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import "JLCodeAttatchment.h" + +@implementation JLCodeAttatchment + +- (UIImage *)imageForBounds:(CGRect)imageBounds textContainer:(NSTextContainer *)textContainer characterIndex:(NSUInteger)charIndex +{ + [[UIImage imageNamed:@"code"] resizableImageWithCapInsets:UIed] +} + +@end diff --git a/Chromatism/Chromatism/JLMarkdownTokenizer.h b/Chromatism/Chromatism/JLMarkdownTokenizer.h index ae35d59..02f28c6 100644 --- a/Chromatism/Chromatism/JLMarkdownTokenizer.h +++ b/Chromatism/Chromatism/JLMarkdownTokenizer.h @@ -10,4 +10,8 @@ @interface JLMarkdownTokenizer : JLTokenizer +@property (nonatomic, strong) UIFont *font; +@property (nonatomic, strong) UIFont *boldFont; +@property (nonatomic, strong) UIFont *italicFont; +@property (nonatomic, strong) UIFont *monospaceFont; @end diff --git a/Chromatism/Chromatism/JLMarkdownTokenizer.m b/Chromatism/Chromatism/JLMarkdownTokenizer.m index a1326b7..f14f4f2 100644 --- a/Chromatism/Chromatism/JLMarkdownTokenizer.m +++ b/Chromatism/Chromatism/JLMarkdownTokenizer.m @@ -7,6 +7,7 @@ // #import "JLMarkdownTokenizer.h" +#import "NSMutableAttributedString+Mush.h" @implementation JLMarkdownTokenizer @@ -17,101 +18,98 @@ - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range - (NSMutableAttributedString *)tokenizeString:(NSString *)string withDefaultAttributes:(NSDictionary *)attributes { - NSString *markup = @"**bold**, //italics//, __underlining__, `monospacing`, and {#0000FF|text colour}"; + + NSMutableAttributedString *attributedString = [[NSAttributedString alloc] initWithString:string attributes:attributes].mutableCopy; - UIFont *baseFont = [UIFont fontWithName:@"HelveticaNeue" size:18]; - UIColor *textColor = UIColor.whiteColor; + // Get fonts + UIFont *defaultFont = (UIFont *)attributes[NSFontAttributeName]; + UIFontDescriptor *defaultFontDescriptor = [defaultFont fontDescriptor]; + + if (!self.boldFont) + { + UIFontDescriptor *descriptor = [defaultFontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold]; + self.boldFont = [UIFont fontWithDescriptor:descriptor size:descriptor.pointSize]; + } + if (!self.italicFont) + { + UIFontDescriptor *descriptor = [defaultFontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitItalic]; + self.italicFont = [UIFont fontWithDescriptor:descriptor size:descriptor.pointSize]; + } + if (!self.monospaceFont) + { + self.monospaceFont = [UIFont fontWithName:@"Courier" size:defaultFontDescriptor.pointSize]; + } -} - -// -// Created by matt on 7/11/12. -// -// https://github.com/sobri909/MGBox2/blob/master/MGBox/MGMushParser.m -// -// Slightly modified - -- (void)parse { - // patterns NSDictionary *boldParser = @{ - @"regex":@"(\\*{2})(.+?)(\\*{2})", - @"replace":@[@"", @1, @""], - @"attributes":@[@{ }, @{ NSFontAttributeName:bold }, @{ }] - }; + @"regex":@"(\\*{2})(.+?)(\\*{2})", + @"replace":@[@"", @1, @""], + @"attributes":@[@{ }, @{ NSFontAttributeName:self.boldFont }, @{ }] + }; NSDictionary *italicParser = @{ - @"regex":@"(/{2})(.+?)(/{2})", - @"replace":@[@"", @1, @""], - @"attributes":@[@{ }, @{ NSFontAttributeName:italic }, @{ }] - }; - - NSDictionary *underlineParser = @{ - @"regex":@"(_{2})(.+?)(_{2})", - @"replace":@[@"", @1, @""], - @"attributes":@[@{ }, @{ NSUnderlineStyleAttributeName:@(NSUnderlineStyleSingle) }, @{ }] - }; + @"regex":@"(\\*)(.+?)(\\*)", + @"replace":@[@"", @1, @""], + @"attributes":@[@{ }, @{ NSFontAttributeName:self.italicFont }, @{ }] + }; NSDictionary *monospaceParser = @{ - @"regex":@"(`)(.+?)(`)", - @"replace":@[@"", @1, @""], - @"attributes":@[@{ }, @{ NSFontAttributeName:monospace }, @{ }] - }; + @"regex":@"(`)(.+?)(`)", + @"replace":@[@"", @1, @""], + @"attributes":@[@{ }, @{ NSFontAttributeName:self.monospaceFont, NSBackgroundColorAttributeName : [UIColor colorWithWhite:0 alpha:0.01] }, @{ }] + }; + NSDictionary *linkParser = @{ + @"regex":@"(\\[)([^\\]]+)(\\])(\\()([^\\)]+)(\\))", + @"replace":@[@"", @1, @"", @"", @"" , @""], + }; - [self applyParser:boldParser]; - [self applyParser:italicParser]; - [self applyParser:underlineParser]; - [self applyParser:monospaceParser]; -} - -- (void)applyParser:(NSDictionary *)parser { - id regex = [NSRegularExpression regularExpressionWithPattern:parser[@"regex"] - options:0 error:nil]; - NSString *markdown = working.string.copy; + // Links + NSString *markdown = attributedString.string.copy; + NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:linkParser[@"regex"] options:0 error:nil]; __block int nudge = 0; - [regex enumerateMatchesInString:markdown options:0 - range:(NSRange){0, markdown.length} - usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, - BOOL *stop) { - - NSMutableArray *substrs = @[].mutableCopy; - NSMutableArray *replacements = @[].mutableCopy; - - // fetch match substrings - for (int i = 0; i < match.numberOfRanges - 1; i++) { - NSRange nudged = [match rangeAtIndex:i + 1]; - nudged.location -= nudge; - substrs[i] = [working attributedSubstringFromRange:nudged].mutableCopy; - } - - // make replacement substrings - for (int i = 0; i < match.numberOfRanges - 1; i++) { - NSString *repstr = parser[@"replace"][i]; - replacements[i] = [repstr isKindOfClass:NSNumber.class] - ? substrs[repstr.intValue] - : [[NSMutableAttributedString alloc] initWithString:repstr]; - } - - // apply attributes - for (int i = 0; i < match.numberOfRanges - 1; i++) { - id attributes = parser[@"attributes"][i]; - if (attributes) { - NSMutableAttributedString *repl = replacements[i]; - [repl addAttributes:attributes range:(NSRange){0, repl.length}]; - } - } - - // replace - for (int i = 0; i < match.numberOfRanges - 1; i++) { - NSRange nudged = [match rangeAtIndex:i + 1]; - nudged.location -= nudge; - nudge += [substrs[i] length] - [replacements[i] length]; - [working replaceCharactersInRange:nudged - withAttributedString:replacements[i]]; - } - }]; + [regex enumerateMatchesInString:markdown options:0 range:(NSRange){0, markdown.length} usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop) { + + NSMutableArray *substrs = @[].mutableCopy; + NSMutableArray *replacements = @[].mutableCopy; + + // fetch match substrings + for (int i = 0; i < match.numberOfRanges - 1; i++) { + NSRange nudged = [match rangeAtIndex:i + 1]; + nudged.location -= nudge; + substrs[i] = [attributedString attributedSubstringFromRange:nudged].mutableCopy; + } + + // make replacement substrings + for (int i = 0; i < match.numberOfRanges - 1; i++) { + NSString *repstr = linkParser[@"replace"][i]; + replacements[i] = [repstr isKindOfClass:NSNumber.class] + ? substrs[repstr.intValue] + : [[NSMutableAttributedString alloc] initWithString:repstr]; + } + + // apply attributes + + NSMutableAttributedString *repl = replacements[1]; + NSLog(@"Link is :%@",substrs[4]); + [repl addAttribute:NSLinkAttributeName value:substrs[2] range:(NSRange){0, repl.length}]; + + // replace + for (int i = 0; i < match.numberOfRanges - 1; i++) { + NSRange nudged = [match rangeAtIndex:i + 1]; + nudged.location -= nudge; + nudge += [substrs[i] length] - [replacements[i] length]; + [attributedString replaceCharactersInRange:nudged + withAttributedString:replacements[i]]; + } + }]; + + [attributedString applyMushDictionary:boldParser]; + [attributedString applyMushDictionary:italicParser]; + [attributedString applyMushDictionary:monospaceParser]; + + return attributedString; } diff --git a/Chromatism/Chromatism/NSMutableAttributedString+Mush.h b/Chromatism/Chromatism/NSMutableAttributedString+Mush.h new file mode 100644 index 0000000..d9673e5 --- /dev/null +++ b/Chromatism/Chromatism/NSMutableAttributedString+Mush.h @@ -0,0 +1,15 @@ +// +// NSMutableAttributedString+Mush.h +// Chromatism +// +// Created by Johannes Lund on 2013-07-13. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import + +@interface NSMutableAttributedString (Mush) + +- (void)applyMushDictionary:(NSDictionary *)parser; + +@end diff --git a/Chromatism/Chromatism/NSMutableAttributedString+Mush.m b/Chromatism/Chromatism/NSMutableAttributedString+Mush.m new file mode 100644 index 0000000..83b313f --- /dev/null +++ b/Chromatism/Chromatism/NSMutableAttributedString+Mush.m @@ -0,0 +1,68 @@ +// +// NSMutableAttributedString+Mush.m +// Chromatism +// +// Created by Johannes Lund on 2013-07-13. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +// Original from sobri909/MGBox2 +// +// Created by matt on 7/11/12. +// +// https://github.com/sobri909/MGBox2/blob/master/MGBox/MGMushParser.m +// +// + +#import "NSMutableAttributedString+Mush.h" + +@implementation NSMutableAttributedString (Mush) + +- (void)applyMushDictionary:(NSDictionary *)parser +{ + id regex = [NSRegularExpression regularExpressionWithPattern:parser[@"regex"] + options:0 error:nil]; + NSString *markdown = self.string.copy; + + __block int nudge = 0; + [regex enumerateMatchesInString:markdown options:0 range:(NSRange){0, markdown.length} usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop) { + + NSMutableArray *substrs = @[].mutableCopy; + NSMutableArray *replacements = @[].mutableCopy; + + // fetch match substrings + for (int i = 0; i < match.numberOfRanges - 1; i++) { + NSRange nudged = [match rangeAtIndex:i + 1]; + nudged.location -= nudge; + substrs[i] = [self attributedSubstringFromRange:nudged].mutableCopy; + } + + // make replacement substrings + for (int i = 0; i < match.numberOfRanges - 1; i++) { + NSString *repstr = parser[@"replace"][i]; + replacements[i] = [repstr isKindOfClass:NSNumber.class] + ? substrs[repstr.intValue] + : [[NSMutableAttributedString alloc] initWithString:repstr]; + } + + // apply attributes + for (int i = 0; i < match.numberOfRanges - 1; i++) { + id attributes = parser[@"attributes"][i]; + if (attributes) { + NSMutableAttributedString *repl = replacements[i]; + [repl addAttributes:attributes range:(NSRange){0, repl.length}]; + } + } + + // replace + for (int i = 0; i < match.numberOfRanges - 1; i++) { + NSRange nudged = [match rangeAtIndex:i + 1]; + nudged.location -= nudge; + nudge += [substrs[i] length] - [replacements[i] length]; + [self replaceCharactersInRange:nudged + withAttributedString:replacements[i]]; + } + }]; +} + +@end diff --git a/Chromatism/Chromatism/code.png b/Chromatism/Chromatism/code.png new file mode 100644 index 0000000000000000000000000000000000000000..35e59ec03ed2c57a8a67223e80281cd57fdb17cc GIT binary patch literal 4633 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 literal 0 HcmV?d00001 From 3fce789b5139aa55952470556d14702b05181c29 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Sun, 14 Jul 2013 02:25:11 +0200 Subject: [PATCH 030/140] Cleanup --- .../Chromatism.xcodeproj/project.pbxproj | 10 ---------- Chromatism/Chromatism/JLCodeAttatchment.h | 13 ------------- Chromatism/Chromatism/JLCodeAttatchment.m | 18 ------------------ Chromatism/Chromatism/code.png | Bin 4633 -> 0 bytes 4 files changed, 41 deletions(-) delete mode 100644 Chromatism/Chromatism/JLCodeAttatchment.h delete mode 100644 Chromatism/Chromatism/JLCodeAttatchment.m delete mode 100644 Chromatism/Chromatism/code.png diff --git a/Chromatism/Chromatism.xcodeproj/project.pbxproj b/Chromatism/Chromatism.xcodeproj/project.pbxproj index 0a87382..e6c8536 100644 --- a/Chromatism/Chromatism.xcodeproj/project.pbxproj +++ b/Chromatism/Chromatism.xcodeproj/project.pbxproj @@ -34,8 +34,6 @@ 8FA091A51791E62600179325 /* JLMarkdownTokenizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FA091A31791E62600179325 /* JLMarkdownTokenizer.m */; }; 8FA091A81791E99900179325 /* NSMutableAttributedString+Mush.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FA091A61791E99900179325 /* NSMutableAttributedString+Mush.h */; }; 8FA091A91791E99900179325 /* NSMutableAttributedString+Mush.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FA091A71791E99900179325 /* NSMutableAttributedString+Mush.m */; }; - 8FA091AD17921A4300179325 /* JLCodeAttatchment.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FA091AB17921A4300179325 /* JLCodeAttatchment.h */; }; - 8FA091AE17921A4300179325 /* JLCodeAttatchment.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FA091AC17921A4300179325 /* JLCodeAttatchment.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -80,9 +78,6 @@ 8FA091A31791E62600179325 /* JLMarkdownTokenizer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JLMarkdownTokenizer.m; sourceTree = ""; }; 8FA091A61791E99900179325 /* NSMutableAttributedString+Mush.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSMutableAttributedString+Mush.h"; sourceTree = ""; }; 8FA091A71791E99900179325 /* NSMutableAttributedString+Mush.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSMutableAttributedString+Mush.m"; sourceTree = ""; }; - 8FA091AA17921A1600179325 /* code.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = code.png; sourceTree = ""; }; - 8FA091AB17921A4300179325 /* JLCodeAttatchment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JLCodeAttatchment.h; sourceTree = ""; }; - 8FA091AC17921A4300179325 /* JLCodeAttatchment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JLCodeAttatchment.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -162,8 +157,6 @@ 8F3AB9521781C1250023348A /* JLTextStorage.m */, 8F3AB9531781C1250023348A /* JLTextViewController.h */, 8F3AB9541781C1250023348A /* JLTextViewController.m */, - 8FA091AB17921A4300179325 /* JLCodeAttatchment.h */, - 8FA091AC17921A4300179325 /* JLCodeAttatchment.m */, 8F3AB91E1781C0BA0023348A /* Supporting Files */, ); path = Chromatism; @@ -172,7 +165,6 @@ 8F3AB91E1781C0BA0023348A /* Supporting Files */ = { isa = PBXGroup; children = ( - 8FA091AA17921A1600179325 /* code.png */, 8F3AB95F1781C12F0023348A /* test.json */, 8F3AB91F1781C0BA0023348A /* Chromatism-Prefix.pch */, ); @@ -221,7 +213,6 @@ 8F54EF141781C788008C1609 /* JLTokenizer.h in Headers */, 8FA091A41791E62600179325 /* JLMarkdownTokenizer.h in Headers */, 8F54EF151781C788008C1609 /* JLTokenPattern.h in Headers */, - 8FA091AD17921A4300179325 /* JLCodeAttatchment.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -307,7 +298,6 @@ buildActionMask = 2147483647; files = ( 8FA091A91791E99900179325 /* NSMutableAttributedString+Mush.m in Sources */, - 8FA091AE17921A4300179325 /* JLCodeAttatchment.m in Sources */, 8F54EF241781CD87008C1609 /* JLTokenPattern.m in Sources */, 8F54EF201781CD87008C1609 /* JLScope.m in Sources */, 8FA091A51791E62600179325 /* JLMarkdownTokenizer.m in Sources */, diff --git a/Chromatism/Chromatism/JLCodeAttatchment.h b/Chromatism/Chromatism/JLCodeAttatchment.h deleted file mode 100644 index 9518114..0000000 --- a/Chromatism/Chromatism/JLCodeAttatchment.h +++ /dev/null @@ -1,13 +0,0 @@ -// -// JLCodeAttatchment.h -// Chromatism -// -// Created by Johannes Lund on 2013-07-14. -// Copyright (c) 2013 Anviking. All rights reserved. -// - -#import - -@interface JLCodeAttatchment : NSTextAttachment - -@end diff --git a/Chromatism/Chromatism/JLCodeAttatchment.m b/Chromatism/Chromatism/JLCodeAttatchment.m deleted file mode 100644 index f4a1a0e..0000000 --- a/Chromatism/Chromatism/JLCodeAttatchment.m +++ /dev/null @@ -1,18 +0,0 @@ -// -// JLCodeAttatchment.m -// Chromatism -// -// Created by Johannes Lund on 2013-07-14. -// Copyright (c) 2013 Anviking. All rights reserved. -// - -#import "JLCodeAttatchment.h" - -@implementation JLCodeAttatchment - -- (UIImage *)imageForBounds:(CGRect)imageBounds textContainer:(NSTextContainer *)textContainer characterIndex:(NSUInteger)charIndex -{ - [[UIImage imageNamed:@"code"] resizableImageWithCapInsets:UIed] -} - -@end diff --git a/Chromatism/Chromatism/code.png b/Chromatism/Chromatism/code.png deleted file mode 100644 index 35e59ec03ed2c57a8a67223e80281cd57fdb17cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4633 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 From ed60af76584d0dd36c948a9a3a8ffda95e97a055 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Tue, 16 Jul 2013 23:04:24 +0200 Subject: [PATCH 031/140] Kind of fixed literals and added todo --- Chromatism/Chromatism/JLTokenizer.m | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index 39c82b3..00ecd42 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -75,7 +75,10 @@ - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range JLTokenPattern *numbers = [JLTokenPattern tokenPatternWithPattern:@"(?<=\\s)\\d+" andColor:colors[JLTokenTypeNumber]]; // New literals, for example @[] - JLTokenPattern *literals = [JLTokenPattern tokenPatternWithPattern:@"@\\s*[\(|\{|\[]" andColor:colors[JLTokenTypeNumber]]; // New literals + JLTokenPattern *literals = [JLTokenPattern tokenPatternWithPattern:@"@[\\(|\\{|\\[][^\\(\\{\\[]+[\\)|\\}|\\]]" andColor:colors[JLTokenTypeNumber]]; // New literals + + // TODO: Literals don't search through multiple lines. Nor does it keep track of nested things. + literals.opaque = NO; // C function names JLTokenPattern *functions = [JLTokenPattern tokenPatternWithPattern:@"\\w+\\s*(?>\\(.*\\)" andColor:colors[JLTokenTypeOtherMethodNames]]; @@ -95,7 +98,7 @@ - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range // NS and UI prefixes words JLTokenPattern *appleClassNames = [JLTokenPattern tokenPatternWithPattern:@"(\\b(?>NS|UI))\\w+\\b" andColor:colors[JLTokenTypeOtherClassNames]]; - JLTokenPattern *keywords1 = [JLTokenPattern tokenPatternWithPattern:@"(?<=\\b)(?>true|false|yes|no|TRUE|FALSE|bool|BOOL|nil|id|void|self|NULL|if|else|strong|weak|nonatomic|atomic|assign|copy|typedef|enum|auto|break|case|const|char|continue|do|default|double|extern|float|for|goto|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|volatile|while|nonatomic|atomic|readonly)(\\b)" andColor:colors[JLTokenTypeKeyword]]; + JLTokenPattern *keywords1 = [JLTokenPattern tokenPatternWithPattern:@"(?<=\\b)(?>true|false|yes|no|TRUE|FALSE|bool|BOOL|nil|id|void|self|NULL|if|else|strong|weak|nonatomic|atomic|assign|copy|typedef|enum|auto|break|case|const|char|continue|do|default|double|extern|float|for|goto|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|volatile|while|nonatomic|atomic|nonatomic|readonly|super )(\\b)" andColor:colors[JLTokenTypeKeyword]]; JLTokenPattern *keywords2 = [JLTokenPattern tokenPatternWithPattern:@"@[a-zA-Z0-9_]+" andColor:colors[JLTokenTypeKeyword]]; documentScope.subscopes = @[comments1, rangeScope]; From 84cadff4be27bd093f343ad9ccce62e9da856dca Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Tue, 16 Jul 2013 23:34:59 +0200 Subject: [PATCH 032/140] Removing the need of JLTokenizer --- Chromatism/Chromatism/JLTextStorage.h | 6 ++--- Chromatism/Chromatism/JLTextStorage.m | 25 -------------------- Chromatism/Chromatism/JLTextViewController.m | 11 ++++----- Chromatism/Chromatism/JLTokenizer.h | 2 +- Chromatism/Chromatism/JLTokenizer.m | 14 +++++++++++ 5 files changed, 23 insertions(+), 35 deletions(-) diff --git a/Chromatism/Chromatism/JLTextStorage.h b/Chromatism/Chromatism/JLTextStorage.h index fc4f979..791981e 100644 --- a/Chromatism/Chromatism/JLTextStorage.h +++ b/Chromatism/Chromatism/JLTextStorage.h @@ -8,14 +8,14 @@ #import -@protocol JLTextStorageTokenizer; +@protocol JLTextStorageDelegate; @interface JLTextStorage : NSTextStorage -@property (nonatomic, weak) id tokenizer; +@property (nonatomic, weak) id delegate; @end -@protocol JLTextStorageTokenizer +@protocol JLTextStorageDelegate - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range; diff --git a/Chromatism/Chromatism/JLTextStorage.m b/Chromatism/Chromatism/JLTextStorage.m index ae3a360..969af5e 100644 --- a/Chromatism/Chromatism/JLTextStorage.m +++ b/Chromatism/Chromatism/JLTextStorage.m @@ -49,29 +49,4 @@ - (void)setAttributes:(NSDictionary *)attrs range:(NSRange)range [self edited:NSTextStorageEditedAttributes range:range changeInLength:0]; } -- (void)processEditing -{ - if (_dynamicTextNeedsUpdate) { - _dynamicTextNeedsUpdate = NO; - [self preformReplacementsForCharacterChangeInRange:[self editedRange]]; - } - - [super processEditing]; -} - -- (void)preformReplacementsForCharacterChangeInRange:(NSRange)range -{ - NSRange extendedRange = NSUnionRange(range, [[_backingStore string] lineRangeForRange:NSMakeRange(NSMaxRange(range), 0)]); - - [self tokenizeRange:extendedRange]; -} - -- (void)tokenizeRange:(NSRange)range -{ - if (self.tokenizer && [self.tokenizer conformsToProtocol:@protocol(JLTextStorageTokenizer)]) - { - [self.tokenizer tokenizeTextStorage:self withRange:range]; - } -} - @end \ No newline at end of file diff --git a/Chromatism/Chromatism/JLTextViewController.m b/Chromatism/Chromatism/JLTextViewController.m index e97dd7e..642bd93 100644 --- a/Chromatism/Chromatism/JLTextViewController.m +++ b/Chromatism/Chromatism/JLTextViewController.m @@ -32,8 +32,6 @@ @interface JLTextViewController () + (NSDictionary *)colorsFromTheme:(JLTokenizerTheme)theme; - -@property (nonatomic, strong) JLTextStorage *textStorage; @end @implementation JLTextViewController @@ -54,16 +52,12 @@ - (void)loadView self.tokenizer = [JLTokenizer new]; self.tokenizer.colors = self.colors; - self.textStorage = [JLTextStorage new]; - _textStorage.tokenizer = _tokenizer; - CHLayoutManager *layoutManager = [[CHLayoutManager alloc] init]; layoutManager.allowsNonContiguousLayout = YES; NSTextContainer *container = [[NSTextContainer alloc] initWithSize:CGSizeMake(self.textView.frame.size.width, CGFLOAT_MAX)]; container.widthTracksTextView = YES; [layoutManager addTextContainer:container]; - [_textStorage addLayoutManager:layoutManager]; _textView = [[UITextView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame] textContainer:container]; _textView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; @@ -74,6 +68,11 @@ - (void)loadView _textView.delegate = self; _textView.autocapitalizationType = UITextAutocapitalizationTypeNone; + [_textView.textStorage addLayoutManager:layoutManager]; + layoutManager.textStorage = [NSTextStorage new]; + layoutManager.textStorage.delegate = self.tokenizer; + + self.theme = JLTokenizerThemeDusk; [self setView:_textView]; diff --git a/Chromatism/Chromatism/JLTokenizer.h b/Chromatism/Chromatism/JLTokenizer.h index bea54f8..bc12eba 100644 --- a/Chromatism/Chromatism/JLTokenizer.h +++ b/Chromatism/Chromatism/JLTokenizer.h @@ -11,7 +11,7 @@ #import "Helpers.h" @class TextViewChange, JLTextView; -@interface JLTokenizer : NSObject +@interface JLTokenizer : NSObject - (void)clearColorAttributesInRange:(NSRange)range textStorage:(NSTextStorage *)storage; - (NSMutableAttributedString *)tokenizeString:(NSString *)string withDefaultAttributes:(NSDictionary *)attributes; diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index 00ecd42..37a73ee 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -47,6 +47,20 @@ @interface JLTokenizer () @implementation JLTokenizer +#pragma mark NSTextStorageDelegate + +- (void)textStorage:(NSTextStorage *)textStorage willProcessEditing:(NSTextStorageEditActions)editedMask range:(NSRange)editedRange changeInLength:(NSInteger)delta +{ + +} + +- (void)textStorage:(NSTextStorage *)textStorage didProcessEditing:(NSTextStorageEditActions)editedMask range:(NSRange)editedRange changeInLength:(NSInteger)delta +{ + if (editedMask == NSTextStorageEditedCharacters) { + [self tokenizeTextStorage:textStorage withRange:[textStorage.string lineRangeForRange:editedRange]]; + } +} + - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range { // Measure performance From d83bcb11c8b23a747e00829e24d2647d23065d3c Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Wed, 17 Jul 2013 00:33:13 +0200 Subject: [PATCH 033/140] Major cleanup. Created JLTextView and moved color code back to the tokenizer. --- .../Chromatism.xcodeproj/project.pbxproj | 24 ++-- Chromatism/Chromatism/CHLayoutManager.h | 13 -- Chromatism/Chromatism/CHLayoutManager.m | 14 -- Chromatism/Chromatism/Chromatism.h | 2 +- Chromatism/Chromatism/JLTextStorage.h | 22 --- Chromatism/Chromatism/JLTextStorage.m | 52 ------- Chromatism/Chromatism/JLTextView.h | 16 +++ Chromatism/Chromatism/JLTextView.m | 61 +++++++++ Chromatism/Chromatism/JLTextViewController.h | 32 +---- Chromatism/Chromatism/JLTextViewController.m | 127 ++---------------- Chromatism/Chromatism/JLTokenizer.h | 27 +++- Chromatism/Chromatism/JLTokenizer.m | 100 +++++++++++++- 12 files changed, 224 insertions(+), 266 deletions(-) delete mode 100644 Chromatism/Chromatism/CHLayoutManager.h delete mode 100644 Chromatism/Chromatism/CHLayoutManager.m delete mode 100644 Chromatism/Chromatism/JLTextStorage.h delete mode 100644 Chromatism/Chromatism/JLTextStorage.m create mode 100644 Chromatism/Chromatism/JLTextView.h create mode 100644 Chromatism/Chromatism/JLTextView.m diff --git a/Chromatism/Chromatism.xcodeproj/project.pbxproj b/Chromatism/Chromatism.xcodeproj/project.pbxproj index e6c8536..aecc399 100644 --- a/Chromatism/Chromatism.xcodeproj/project.pbxproj +++ b/Chromatism/Chromatism.xcodeproj/project.pbxproj @@ -15,18 +15,14 @@ 8F3AB9381781C0BB0023348A /* ChromatismTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F3AB9371781C0BB0023348A /* ChromatismTests.m */; }; 8F3AB9621781C26A0023348A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F3AB9611781C26A0023348A /* UIKit.framework */; }; 8F54EF0E1781C776008C1609 /* Chromatism.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F3AB9201781C0BA0023348A /* Chromatism.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8F54EF0F1781C788008C1609 /* CHLayoutManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F3AB94A1781C1180023348A /* CHLayoutManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8F54EF101781C788008C1609 /* Helpers.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F3AB94D1781C1250023348A /* Helpers.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8F54EF111781C788008C1609 /* JLScope.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F3AB94F1781C1250023348A /* JLScope.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8F54EF121781C788008C1609 /* JLTextStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F3AB9511781C1250023348A /* JLTextStorage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8F54EF131781C788008C1609 /* JLTextViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F3AB9531781C1250023348A /* JLTextViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8F54EF141781C788008C1609 /* JLTokenizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F3AB9551781C1250023348A /* JLTokenizer.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8F54EF151781C788008C1609 /* JLTokenPattern.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F3AB9571781C1250023348A /* JLTokenPattern.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8F54EF1D1781CD87008C1609 /* CHLayoutManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F3AB94B1781C1180023348A /* CHLayoutManager.m */; }; 8F54EF1E1781CD87008C1609 /* Chromatism.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F3AB9221781C0BA0023348A /* Chromatism.m */; }; 8F54EF1F1781CD87008C1609 /* Helpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F3AB94E1781C1250023348A /* Helpers.m */; }; 8F54EF201781CD87008C1609 /* JLScope.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F3AB9501781C1250023348A /* JLScope.m */; }; - 8F54EF211781CD87008C1609 /* JLTextStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F3AB9521781C1250023348A /* JLTextStorage.m */; }; 8F54EF221781CD87008C1609 /* JLTextViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F3AB9541781C1250023348A /* JLTextViewController.m */; }; 8F54EF231781CD87008C1609 /* JLTokenizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F3AB9561781C1250023348A /* JLTokenizer.m */; }; 8F54EF241781CD87008C1609 /* JLTokenPattern.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F3AB9581781C1250023348A /* JLTokenPattern.m */; }; @@ -34,6 +30,8 @@ 8FA091A51791E62600179325 /* JLMarkdownTokenizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FA091A31791E62600179325 /* JLMarkdownTokenizer.m */; }; 8FA091A81791E99900179325 /* NSMutableAttributedString+Mush.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FA091A61791E99900179325 /* NSMutableAttributedString+Mush.h */; }; 8FA091A91791E99900179325 /* NSMutableAttributedString+Mush.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FA091A71791E99900179325 /* NSMutableAttributedString+Mush.m */; }; + 8FA0CB0F1795F41B00FF8EB1 /* JLTextView.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FA0CB0D1795F41B00FF8EB1 /* JLTextView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8FA0CB101795F41B00FF8EB1 /* JLTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FA0CB0E1795F41B00FF8EB1 /* JLTextView.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -58,14 +56,10 @@ 8F3AB9331781C0BB0023348A /* ChromatismTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ChromatismTests-Info.plist"; sourceTree = ""; }; 8F3AB9351781C0BB0023348A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 8F3AB9371781C0BB0023348A /* ChromatismTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ChromatismTests.m; sourceTree = ""; }; - 8F3AB94A1781C1180023348A /* CHLayoutManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CHLayoutManager.h; sourceTree = ""; }; - 8F3AB94B1781C1180023348A /* CHLayoutManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CHLayoutManager.m; sourceTree = ""; }; 8F3AB94D1781C1250023348A /* Helpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Helpers.h; sourceTree = ""; }; 8F3AB94E1781C1250023348A /* Helpers.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Helpers.m; sourceTree = ""; }; 8F3AB94F1781C1250023348A /* JLScope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JLScope.h; sourceTree = ""; }; 8F3AB9501781C1250023348A /* JLScope.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JLScope.m; sourceTree = ""; }; - 8F3AB9511781C1250023348A /* JLTextStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JLTextStorage.h; sourceTree = ""; }; - 8F3AB9521781C1250023348A /* JLTextStorage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JLTextStorage.m; sourceTree = ""; }; 8F3AB9531781C1250023348A /* JLTextViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JLTextViewController.h; sourceTree = ""; }; 8F3AB9541781C1250023348A /* JLTextViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JLTextViewController.m; sourceTree = ""; }; 8F3AB9551781C1250023348A /* JLTokenizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JLTokenizer.h; sourceTree = ""; }; @@ -78,6 +72,8 @@ 8FA091A31791E62600179325 /* JLMarkdownTokenizer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JLMarkdownTokenizer.m; sourceTree = ""; }; 8FA091A61791E99900179325 /* NSMutableAttributedString+Mush.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSMutableAttributedString+Mush.h"; sourceTree = ""; }; 8FA091A71791E99900179325 /* NSMutableAttributedString+Mush.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSMutableAttributedString+Mush.m"; sourceTree = ""; }; + 8FA0CB0D1795F41B00FF8EB1 /* JLTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JLTextView.h; sourceTree = ""; }; + 8FA0CB0E1795F41B00FF8EB1 /* JLTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JLTextView.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -143,8 +139,6 @@ 8FA091A31791E62600179325 /* JLMarkdownTokenizer.m */, 8FA091A61791E99900179325 /* NSMutableAttributedString+Mush.h */, 8FA091A71791E99900179325 /* NSMutableAttributedString+Mush.m */, - 8F3AB94A1781C1180023348A /* CHLayoutManager.h */, - 8F3AB94B1781C1180023348A /* CHLayoutManager.m */, 8F3AB9201781C0BA0023348A /* Chromatism.h */, 8F3AB9221781C0BA0023348A /* Chromatism.m */, 8F3AB94D1781C1250023348A /* Helpers.h */, @@ -153,10 +147,10 @@ 8F3AB9581781C1250023348A /* JLTokenPattern.m */, 8F3AB94F1781C1250023348A /* JLScope.h */, 8F3AB9501781C1250023348A /* JLScope.m */, - 8F3AB9511781C1250023348A /* JLTextStorage.h */, - 8F3AB9521781C1250023348A /* JLTextStorage.m */, 8F3AB9531781C1250023348A /* JLTextViewController.h */, 8F3AB9541781C1250023348A /* JLTextViewController.m */, + 8FA0CB0D1795F41B00FF8EB1 /* JLTextView.h */, + 8FA0CB0E1795F41B00FF8EB1 /* JLTextView.m */, 8F3AB91E1781C0BA0023348A /* Supporting Files */, ); path = Chromatism; @@ -204,11 +198,10 @@ buildActionMask = 2147483647; files = ( 8FA091A81791E99900179325 /* NSMutableAttributedString+Mush.h in Headers */, + 8FA0CB0F1795F41B00FF8EB1 /* JLTextView.h in Headers */, 8F54EF0E1781C776008C1609 /* Chromatism.h in Headers */, - 8F54EF0F1781C788008C1609 /* CHLayoutManager.h in Headers */, 8F54EF101781C788008C1609 /* Helpers.h in Headers */, 8F54EF111781C788008C1609 /* JLScope.h in Headers */, - 8F54EF121781C788008C1609 /* JLTextStorage.h in Headers */, 8F54EF131781C788008C1609 /* JLTextViewController.h in Headers */, 8F54EF141781C788008C1609 /* JLTokenizer.h in Headers */, 8FA091A41791E62600179325 /* JLMarkdownTokenizer.h in Headers */, @@ -301,12 +294,11 @@ 8F54EF241781CD87008C1609 /* JLTokenPattern.m in Sources */, 8F54EF201781CD87008C1609 /* JLScope.m in Sources */, 8FA091A51791E62600179325 /* JLMarkdownTokenizer.m in Sources */, + 8FA0CB101795F41B00FF8EB1 /* JLTextView.m in Sources */, 8F54EF1F1781CD87008C1609 /* Helpers.m in Sources */, - 8F54EF211781CD87008C1609 /* JLTextStorage.m in Sources */, 8F54EF221781CD87008C1609 /* JLTextViewController.m in Sources */, 8F54EF231781CD87008C1609 /* JLTokenizer.m in Sources */, 8F54EF1E1781CD87008C1609 /* Chromatism.m in Sources */, - 8F54EF1D1781CD87008C1609 /* CHLayoutManager.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Chromatism/Chromatism/CHLayoutManager.h b/Chromatism/Chromatism/CHLayoutManager.h deleted file mode 100644 index 0521485..0000000 --- a/Chromatism/Chromatism/CHLayoutManager.h +++ /dev/null @@ -1,13 +0,0 @@ -// -// CHLayoutManager.h -// iGitpad -// -// Created by Johannes Lund on 2013-06-25. -// Copyright (c) 2013 Anviking. All rights reserved. -// - -#import - -@interface CHLayoutManager : NSLayoutManager - -@end diff --git a/Chromatism/Chromatism/CHLayoutManager.m b/Chromatism/Chromatism/CHLayoutManager.m deleted file mode 100644 index 1807f9c..0000000 --- a/Chromatism/Chromatism/CHLayoutManager.m +++ /dev/null @@ -1,14 +0,0 @@ -// -// CHLayoutManager.m -// iGitpad -// -// Created by Johannes Lund on 2013-06-25. -// Copyright (c) 2013 Anviking. All rights reserved. -// - -#import "CHLayoutManager.h" - -@implementation CHLayoutManager - - -@end diff --git a/Chromatism/Chromatism/Chromatism.h b/Chromatism/Chromatism/Chromatism.h index c85f0cd..d6afae4 100644 --- a/Chromatism/Chromatism/Chromatism.h +++ b/Chromatism/Chromatism/Chromatism.h @@ -11,8 +11,8 @@ #import "JLTokenizer.h" #import "JLTextViewController.h" #import "JLTokenPattern.h" -#import "JLTextStorage.h" #import "JLMarkdownTokenizer.h" +#import "JLTextView.h" @interface Chromatism : NSObject diff --git a/Chromatism/Chromatism/JLTextStorage.h b/Chromatism/Chromatism/JLTextStorage.h deleted file mode 100644 index 791981e..0000000 --- a/Chromatism/Chromatism/JLTextStorage.h +++ /dev/null @@ -1,22 +0,0 @@ -// -// JLTextStorage.h -// iGitpad -// -// Created by Johannes Lund on 2013-06-13. -// Copyright (c) 2013 Anviking. All rights reserved. -// - -#import - -@protocol JLTextStorageDelegate; -@interface JLTextStorage : NSTextStorage - -@property (nonatomic, weak) id delegate; - -@end - -@protocol JLTextStorageDelegate - -- (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range; - -@end diff --git a/Chromatism/Chromatism/JLTextStorage.m b/Chromatism/Chromatism/JLTextStorage.m deleted file mode 100644 index 969af5e..0000000 --- a/Chromatism/Chromatism/JLTextStorage.m +++ /dev/null @@ -1,52 +0,0 @@ -// -// JLTextStorage.m -// iGitpad -// -// Created by Johannes Lund on 2013-06-13. -// Copyright (c) 2013 Anviking. All rights reserved. -// - -#import "JLTextStorage.h" - -@interface JLTextStorage () -{ - NSMutableAttributedString *_backingStore; - BOOL _dynamicTextNeedsUpdate; -} -@end - -@implementation JLTextStorage - -- (id)init -{ - self = [super init]; - if (self) { - _backingStore = [[NSMutableAttributedString alloc] init]; - } - return self; -} - -- (NSString *)string -{ - return [_backingStore string]; -} - -- (NSDictionary *)attributesAtIndex:(NSUInteger)index effectiveRange:(NSRangePointer)aRange -{ - return [_backingStore attributesAtIndex:index effectiveRange:aRange]; -} - -- (void)replaceCharactersInRange:(NSRange)range withString:(NSString *)str -{ - [_backingStore replaceCharactersInRange:range withString:str]; - [self edited:NSTextStorageEditedCharacters range:range changeInLength:str.length - range.length]; - _dynamicTextNeedsUpdate = YES; -} - -- (void)setAttributes:(NSDictionary *)attrs range:(NSRange)range -{ - [_backingStore setAttributes:attrs range:range]; - [self edited:NSTextStorageEditedAttributes range:range changeInLength:0]; -} - -@end \ No newline at end of file diff --git a/Chromatism/Chromatism/JLTextView.h b/Chromatism/Chromatism/JLTextView.h new file mode 100644 index 0000000..8de27cd --- /dev/null +++ b/Chromatism/Chromatism/JLTextView.h @@ -0,0 +1,16 @@ +// +// JLTextView.h +// Chromatism +// +// Created by Johannes Lund on 2013-07-16. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import + +@class JLTokenizer; + +@interface JLTextView : UITextView + +@property (nonatomic, strong) JLTokenizer *syntaxTokenizer; +@end diff --git a/Chromatism/Chromatism/JLTextView.m b/Chromatism/Chromatism/JLTextView.m new file mode 100644 index 0000000..6b4756f --- /dev/null +++ b/Chromatism/Chromatism/JLTextView.m @@ -0,0 +1,61 @@ +// +// JLTextView.m +// Chromatism +// +// Created by Johannes Lund on 2013-07-16. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import "JLTextView.h" +#import "JLTokenizer.h" + +@implementation JLTextView + +#pragma mark - Initialization & Setup + +- (id)init +{ + self = [super init]; + if (self) { + [self setup]; + } + return self; +} + +- (id)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self) { + [self setup]; + } + return self; +} + +- (id)initWithCoder:(NSCoder *)aDecoder +{ + self = [super initWithCoder:aDecoder]; + if (self) { + [self setup]; + } + return self; +} + +- (void)setup +{ + // Setup tokenizer + self.syntaxTokenizer = [[JLTokenizer alloc] init]; + self.syntaxTokenizer.textView = self; + self.textStorage.delegate = self.syntaxTokenizer; + self.syntaxTokenizer.theme = JLTokenizerThemeDusk; + + // Set default properties + self.scrollEnabled = YES; + self.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive; + self.font = [UIFont fontWithName:@"Menlo" size:12]; + self.autocorrectionType = UITextAutocorrectionTypeNo; + self.autocapitalizationType = UITextAutocapitalizationTypeNone; + +} + + +@end diff --git a/Chromatism/Chromatism/JLTextViewController.h b/Chromatism/Chromatism/JLTextViewController.h index 10de0f2..7957a20 100644 --- a/Chromatism/Chromatism/JLTextViewController.h +++ b/Chromatism/Chromatism/JLTextViewController.h @@ -8,36 +8,12 @@ #import -typedef NS_ENUM(NSInteger, JLTokenizerTheme) { - JLTokenizerThemeDefault, - JLTokenizerThemeDusk -}; +@class JLTokenizer, JLTextView; -FOUNDATION_EXPORT NSString *const JLTokenTypeText; -FOUNDATION_EXPORT NSString *const JLTokenTypeBackground; -FOUNDATION_EXPORT NSString *const JLTokenTypeComment; -FOUNDATION_EXPORT NSString *const JLTokenTypeDocumentationComment; -FOUNDATION_EXPORT NSString *const JLTokenTypeDocumentationCommentKeyword; -FOUNDATION_EXPORT NSString *const JLTokenTypeString; -FOUNDATION_EXPORT NSString *const JLTokenTypeCharacter; -FOUNDATION_EXPORT NSString *const JLTokenTypeNumber; -FOUNDATION_EXPORT NSString *const JLTokenTypeKeyword; -FOUNDATION_EXPORT NSString *const JLTokenTypePreprocessor; -FOUNDATION_EXPORT NSString *const JLTokenTypeURL; -FOUNDATION_EXPORT NSString *const JLTokenTypeOther; -FOUNDATION_EXPORT NSString *const JLTokenTypeOtherClassNames; -FOUNDATION_EXPORT NSString *const JLTokenTypeOtherMethodNames; - -@class JLTokenizer; @interface JLTextViewController : UIViewController -@property (nonatomic, strong) NSDictionary *defaultAttributes; -@property (nonatomic, strong) IBOutlet UITextView *textView; -@property (nonatomic, strong) JLTokenizer *tokenizer; - -@property (nonatomic, strong) UIColor *highlightColor; -@property(nonatomic, strong) NSDictionary *colors; -@property (nonatomic, assign) JLTokenizerTheme theme; -@property (nonatomic, strong, readonly) NSArray *themes; +@property (nonatomic, strong) IBOutlet JLTextView *textView; +// Convenience property for self.textView.syntaxTokenizer +@property (nonatomic, weak, readonly) JLTokenizer *tokenizer; @end diff --git a/Chromatism/Chromatism/JLTextViewController.m b/Chromatism/Chromatism/JLTextViewController.m index 642bd93..2db708f 100644 --- a/Chromatism/Chromatism/JLTextViewController.m +++ b/Chromatism/Chromatism/JLTextViewController.m @@ -7,10 +7,9 @@ // #import "JLTextViewController.h" -#import "JLTextStorage.h" #import "JLTokenizer.h" #import "JLTokenizer.h" -#import "CHLayoutManager.h" +#import "JLTextView.h" NSString *const JLTokenTypeText = @"text"; NSString *const JLTokenTypeBackground = @"background"; @@ -31,11 +30,9 @@ @interface JLTextViewController () -+ (NSDictionary *)colorsFromTheme:(JLTokenizerTheme)theme; @end @implementation JLTextViewController -@synthesize theme = _theme, themes = _themes, colors = _colors; - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { @@ -48,34 +45,17 @@ - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil - (void)loadView { - // Create a tokenizer - self.tokenizer = [JLTokenizer new]; - self.tokenizer.colors = self.colors; + JLTextView *textView = [[JLTextView alloc] init]; - CHLayoutManager *layoutManager = [[CHLayoutManager alloc] init]; - layoutManager.allowsNonContiguousLayout = YES; - - NSTextContainer *container = [[NSTextContainer alloc] initWithSize:CGSizeMake(self.textView.frame.size.width, CGFLOAT_MAX)]; - container.widthTracksTextView = YES; - [layoutManager addTextContainer:container]; + textView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; - _textView = [[UITextView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame] textContainer:container]; - _textView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; - _textView.scrollEnabled = YES; - _textView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive; - _textView.font = [UIFont fontWithName:@"Menlo" size:12]; - _textView.autocorrectionType = UITextAutocorrectionTypeNo; - _textView.delegate = self; - _textView.autocapitalizationType = UITextAutocapitalizationTypeNone; - - [_textView.textStorage addLayoutManager:layoutManager]; - layoutManager.textStorage = [NSTextStorage new]; - layoutManager.textStorage.delegate = self.tokenizer; + [self setView:textView]; + [self setTextView:textView]; +} - - self.theme = JLTokenizerThemeDusk; - - [self setView:_textView]; +- (JLTokenizer *)tokenizer +{ + return self.textView.syntaxTokenizer; } - (void)viewDidLoad @@ -149,95 +129,6 @@ - (void)textViewDidEndEditing:(UITextView *)textView } -#pragma mark - Color Themes - -- (NSDictionary *)defaultAttributes -{ - if (!_defaultAttributes) _defaultAttributes = @{NSForegroundColorAttributeName: self.colors[JLTokenTypeText], NSFontAttributeName : [UIFont fontWithName:@"Menlo" size:12]}; - return _defaultAttributes; -} - --(void)setTheme:(JLTokenizerTheme)theme -{ - self.colors = [self.class colorsFromTheme:theme]; - self.textView.typingAttributes = @{ NSForegroundColorAttributeName : self.colors[JLTokenTypeText]}; - _theme = theme; - - //Set font, text color and background color back to default - UIColor *backgroundColor = self.colors[JLTokenTypeBackground]; - [self.textView setBackgroundColor:backgroundColor ? backgroundColor : [UIColor whiteColor] ]; -} - -- (NSDictionary *)colors -{ - if (!_colors) { - self.colors = [self.class colorsFromTheme:self.theme]; - } - return _colors; -} - -- (void)setColors:(NSDictionary *)colors -{ - _colors = colors; - [self.tokenizer setColors:colors]; -} - -- (NSArray *)themes -{ - if (!_themes) _themes = @[@(JLTokenizerThemeDefault),@(JLTokenizerThemeDusk)]; - return _themes; -} - -- (JLTokenizerTheme)theme -{ - if (!_theme) _theme = JLTokenizerThemeDefault; - return _theme; -} -// Just a bunch of colors -+ (NSDictionary *)colorsFromTheme:(JLTokenizerTheme)theme -{ - NSDictionary* colors; - switch(theme) { - case JLTokenizerThemeDefault: - colors = @{JLTokenTypeText: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], - JLTokenTypeBackground: [UIColor colorWithRed:255.0/255 green:255.0/255 blue:255.0/255 alpha:1], - JLTokenTypeComment: [UIColor colorWithRed:0.0/255 green:131.0/255 blue:39.0/255 alpha:1], - JLTokenTypeDocumentationComment: [UIColor colorWithRed:0.0/255 green:131.0/255 blue:39.0/255 alpha:1], - JLTokenTypeDocumentationCommentKeyword: [UIColor colorWithRed:0.0/255 green:76.0/255 blue:29.0/255 alpha:1], - JLTokenTypeString: [UIColor colorWithRed:211.0/255 green:45.0/255 blue:38.0/255 alpha:1], - JLTokenTypeCharacter: [UIColor colorWithRed:40.0/255 green:52.0/255 blue:206.0/255 alpha:1], - JLTokenTypeNumber: [UIColor colorWithRed:40.0/255 green:52.0/255 blue:206.0/255 alpha:1], - JLTokenTypeKeyword: [UIColor colorWithRed:188.0/255 green:49.0/255 blue:156.0/255 alpha:1], - JLTokenTypePreprocessor: [UIColor colorWithRed:120.0/255 green:72.0/255 blue:48.0/255 alpha:1], - JLTokenTypeURL: [UIColor colorWithRed:21.0/255 green:67.0/255 blue:244.0/255 alpha:1], - JLTokenTypeOther: [UIColor colorWithRed:113.0/255 green:65.0/255 blue:163.0/255 alpha:1], - JLTokenTypeOtherMethodNames : [UIColor colorWithHex:@"7040a6" alpha:1], - JLTokenTypeOtherClassNames : [UIColor colorWithHex:@"7040a6" alpha:1] - - - - }; - break; - case JLTokenizerThemeDusk: - colors = @{JLTokenTypeText: [UIColor whiteColor], - JLTokenTypeBackground: [UIColor colorWithRed:30.0/255.0 green:32.0/255.0 blue:40.0/255.0 alpha:1], - JLTokenTypeComment: [UIColor colorWithRed:72.0/255 green:190.0/255 blue:102.0/255 alpha:1], - JLTokenTypeDocumentationComment: [UIColor colorWithRed:72.0/255 green:190.0/255 blue:102.0/255 alpha:1], - JLTokenTypeDocumentationCommentKeyword: [UIColor colorWithRed:72.0/255 green:190.0/255 blue:102.0/255 alpha:1], - JLTokenTypeString: [UIColor colorWithRed:230.0/255 green:66.0/255 blue:75.0/255 alpha:1], - JLTokenTypeCharacter: [UIColor colorWithRed:139.0/255 green:134.0/255 blue:201.0/255 alpha:1], - JLTokenTypeNumber: [UIColor colorWithRed:139.0/255 green:134.0/255 blue:201.0/255 alpha:1], - JLTokenTypeKeyword: [UIColor colorWithRed:195.0/255 green:55.0/255 blue:149.0/255 alpha:1], - JLTokenTypePreprocessor: [UIColor colorWithRed:198.0/255.0 green:124.0/255.0 blue:72.0/255.0 alpha:1], - JLTokenTypeURL: [UIColor colorWithRed:35.0/255 green:63.0/255 blue:208.0/255 alpha:1], - JLTokenTypeOther: [UIColor colorWithRed:0.0/255 green:175.0/255 blue:199.0/255 alpha:1], - JLTokenTypeOtherClassNames : [UIColor colorWithHex:@"04afc8" alpha:1], - JLTokenTypeOtherMethodNames : [UIColor colorWithHex:@"04afc8" alpha:1] - }; - break; - } - return colors; -} @end diff --git a/Chromatism/Chromatism/JLTokenizer.h b/Chromatism/Chromatism/JLTokenizer.h index bc12eba..c129bea 100644 --- a/Chromatism/Chromatism/JLTokenizer.h +++ b/Chromatism/Chromatism/JLTokenizer.h @@ -7,9 +7,28 @@ // #import -#import "JLTextStorage.h" #import "Helpers.h" +typedef NS_ENUM(NSInteger, JLTokenizerTheme) { + JLTokenizerThemeDefault, + JLTokenizerThemeDusk +}; + +FOUNDATION_EXPORT NSString *const JLTokenTypeText; +FOUNDATION_EXPORT NSString *const JLTokenTypeBackground; +FOUNDATION_EXPORT NSString *const JLTokenTypeComment; +FOUNDATION_EXPORT NSString *const JLTokenTypeDocumentationComment; +FOUNDATION_EXPORT NSString *const JLTokenTypeDocumentationCommentKeyword; +FOUNDATION_EXPORT NSString *const JLTokenTypeString; +FOUNDATION_EXPORT NSString *const JLTokenTypeCharacter; +FOUNDATION_EXPORT NSString *const JLTokenTypeNumber; +FOUNDATION_EXPORT NSString *const JLTokenTypeKeyword; +FOUNDATION_EXPORT NSString *const JLTokenTypePreprocessor; +FOUNDATION_EXPORT NSString *const JLTokenTypeURL; +FOUNDATION_EXPORT NSString *const JLTokenTypeOther; +FOUNDATION_EXPORT NSString *const JLTokenTypeOtherClassNames; +FOUNDATION_EXPORT NSString *const JLTokenTypeOtherMethodNames; + @class TextViewChange, JLTextView; @interface JLTokenizer : NSObject @@ -17,4 +36,10 @@ - (NSMutableAttributedString *)tokenizeString:(NSString *)string withDefaultAttributes:(NSDictionary *)attributes; @property (nonatomic, strong) NSDictionary *colors; +@property (nonatomic, strong) NSDictionary *defaultAttributes; + +@property (nonatomic, strong) UIColor *highlightColor; +@property (nonatomic, assign) JLTokenizerTheme theme; +@property (nonatomic, strong, readonly) NSArray *themes; +@property (nonatomic, weak) UITextView *textView; @end diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index 37a73ee..fbf3c43 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -43,9 +43,12 @@ @interface JLTokenizer () ++ (NSDictionary *)colorsFromTheme:(JLTokenizerTheme)theme; + @end @implementation JLTokenizer +@synthesize theme = _theme, themes = _themes, colors = _colors; #pragma mark NSTextStorageDelegate @@ -56,7 +59,12 @@ - (void)textStorage:(NSTextStorage *)textStorage willProcessEditing:(NSTextStora - (void)textStorage:(NSTextStorage *)textStorage didProcessEditing:(NSTextStorageEditActions)editedMask range:(NSRange)editedRange changeInLength:(NSInteger)delta { - if (editedMask == NSTextStorageEditedCharacters) { + if (editedMask == NSTextStorageEditedCharacters) + { + [self tokenizeTextStorage:textStorage withRange:[textStorage.string lineRangeForRange:editedRange]]; + } + else + { [self tokenizeTextStorage:textStorage withRange:[textStorage.string lineRangeForRange:editedRange]]; } } @@ -135,4 +143,94 @@ - (void)clearColorAttributesInRange:(NSRange)range textStorage:(NSTextStorage *) [storage addAttribute:NSForegroundColorAttributeName value:self.colors[JLTokenTypeText] range:range]; } +#pragma mark - Color Themes + +- (NSDictionary *)defaultAttributes +{ + if (!_defaultAttributes) _defaultAttributes = @{NSForegroundColorAttributeName: self.colors[JLTokenTypeText], NSFontAttributeName : [UIFont fontWithName:@"Menlo" size:12]}; + return _defaultAttributes; +} + +-(void)setTheme:(JLTokenizerTheme)theme +{ + self.colors = [self.class colorsFromTheme:theme]; + self.textView.typingAttributes = @{ NSForegroundColorAttributeName : self.colors[JLTokenTypeText]}; + _theme = theme; + + //Set font, text color and background color back to default + UIColor *backgroundColor = self.colors[JLTokenTypeBackground]; + [self.textView setBackgroundColor:backgroundColor ? backgroundColor : [UIColor whiteColor] ]; +} + +- (NSDictionary *)colors +{ + if (!_colors) { + self.colors = [self.class colorsFromTheme:self.theme]; + } + return _colors; +} + +- (void)setColors:(NSDictionary *)colors +{ + _colors = colors; +} + +- (NSArray *)themes +{ + if (!_themes) _themes = @[@(JLTokenizerThemeDefault),@(JLTokenizerThemeDusk)]; + return _themes; +} + +- (JLTokenizerTheme)theme +{ + if (!_theme) _theme = JLTokenizerThemeDefault; + return _theme; +} + +// Just a bunch of colors ++ (NSDictionary *)colorsFromTheme:(JLTokenizerTheme)theme +{ + NSDictionary* colors; + switch(theme) { + case JLTokenizerThemeDefault: + colors = @{JLTokenTypeText: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], + JLTokenTypeBackground: [UIColor colorWithRed:255.0/255 green:255.0/255 blue:255.0/255 alpha:1], + JLTokenTypeComment: [UIColor colorWithRed:0.0/255 green:131.0/255 blue:39.0/255 alpha:1], + JLTokenTypeDocumentationComment: [UIColor colorWithRed:0.0/255 green:131.0/255 blue:39.0/255 alpha:1], + JLTokenTypeDocumentationCommentKeyword: [UIColor colorWithRed:0.0/255 green:76.0/255 blue:29.0/255 alpha:1], + JLTokenTypeString: [UIColor colorWithRed:211.0/255 green:45.0/255 blue:38.0/255 alpha:1], + JLTokenTypeCharacter: [UIColor colorWithRed:40.0/255 green:52.0/255 blue:206.0/255 alpha:1], + JLTokenTypeNumber: [UIColor colorWithRed:40.0/255 green:52.0/255 blue:206.0/255 alpha:1], + JLTokenTypeKeyword: [UIColor colorWithRed:188.0/255 green:49.0/255 blue:156.0/255 alpha:1], + JLTokenTypePreprocessor: [UIColor colorWithRed:120.0/255 green:72.0/255 blue:48.0/255 alpha:1], + JLTokenTypeURL: [UIColor colorWithRed:21.0/255 green:67.0/255 blue:244.0/255 alpha:1], + JLTokenTypeOther: [UIColor colorWithRed:113.0/255 green:65.0/255 blue:163.0/255 alpha:1], + JLTokenTypeOtherMethodNames : [UIColor colorWithHex:@"7040a6" alpha:1], + JLTokenTypeOtherClassNames : [UIColor colorWithHex:@"7040a6" alpha:1] + + + + }; + break; + case JLTokenizerThemeDusk: + colors = @{JLTokenTypeText: [UIColor whiteColor], + JLTokenTypeBackground: [UIColor colorWithRed:30.0/255.0 green:32.0/255.0 blue:40.0/255.0 alpha:1], + JLTokenTypeComment: [UIColor colorWithRed:72.0/255 green:190.0/255 blue:102.0/255 alpha:1], + JLTokenTypeDocumentationComment: [UIColor colorWithRed:72.0/255 green:190.0/255 blue:102.0/255 alpha:1], + JLTokenTypeDocumentationCommentKeyword: [UIColor colorWithRed:72.0/255 green:190.0/255 blue:102.0/255 alpha:1], + JLTokenTypeString: [UIColor colorWithRed:230.0/255 green:66.0/255 blue:75.0/255 alpha:1], + JLTokenTypeCharacter: [UIColor colorWithRed:139.0/255 green:134.0/255 blue:201.0/255 alpha:1], + JLTokenTypeNumber: [UIColor colorWithRed:139.0/255 green:134.0/255 blue:201.0/255 alpha:1], + JLTokenTypeKeyword: [UIColor colorWithRed:195.0/255 green:55.0/255 blue:149.0/255 alpha:1], + JLTokenTypePreprocessor: [UIColor colorWithRed:198.0/255.0 green:124.0/255.0 blue:72.0/255.0 alpha:1], + JLTokenTypeURL: [UIColor colorWithRed:35.0/255 green:63.0/255 blue:208.0/255 alpha:1], + JLTokenTypeOther: [UIColor colorWithRed:0.0/255 green:175.0/255 blue:199.0/255 alpha:1], + JLTokenTypeOtherClassNames : [UIColor colorWithHex:@"04afc8" alpha:1], + JLTokenTypeOtherMethodNames : [UIColor colorWithHex:@"04afc8" alpha:1] + }; + break; + } + return colors; +} + @end From 1472bbbc6247cdad5969e40b72aa67131d5bce4f Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Wed, 17 Jul 2013 00:41:36 +0200 Subject: [PATCH 034/140] Minor cleanup --- Chromatism/Chromatism/JLTokenizer.m | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index fbf3c43..f4b47e9 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -50,7 +50,7 @@ + (NSDictionary *)colorsFromTheme:(JLTokenizerTheme)theme; @implementation JLTokenizer @synthesize theme = _theme, themes = _themes, colors = _colors; -#pragma mark NSTextStorageDelegate +#pragma mark - NSTextStorageDelegate - (void)textStorage:(NSTextStorage *)textStorage willProcessEditing:(NSTextStorageEditActions)editedMask range:(NSRange)editedRange changeInLength:(NSInteger)delta { @@ -59,16 +59,19 @@ - (void)textStorage:(NSTextStorage *)textStorage willProcessEditing:(NSTextStora - (void)textStorage:(NSTextStorage *)textStorage didProcessEditing:(NSTextStorageEditActions)editedMask range:(NSRange)editedRange changeInLength:(NSInteger)delta { - if (editedMask == NSTextStorageEditedCharacters) - { + if (editedMask == NSTextStorageEditedAttributes) { + // Do nothing + } + else if (editedMask == NSTextStorageEditedCharacters) { [self tokenizeTextStorage:textStorage withRange:[textStorage.string lineRangeForRange:editedRange]]; } - else - { + else { [self tokenizeTextStorage:textStorage withRange:[textStorage.string lineRangeForRange:editedRange]]; } } +#pragma mark - Tokenizing + - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range { // Measure performance From 093aa065a7f169c4820bb6f2ddb220dc8f8d5e0f Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Wed, 17 Jul 2013 03:13:03 +0200 Subject: [PATCH 035/140] =?UTF-8?q?Indentation,=20sort=20of.=20The=20new?= =?UTF-8?q?=20inherits=20the=20previous=20lines=E2=80=99=20tabs/whitespace?= =?UTF-8?q?s.=20JLTokenizer=20is=20now=20a=20UITextViewDelegate.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Chromatism/Chromatism/JLTextView.m | 2 +- Chromatism/Chromatism/JLTokenizer.h | 5 +- Chromatism/Chromatism/JLTokenizer.m | 87 ++++++++++++++++++++++++++--- 3 files changed, 83 insertions(+), 11 deletions(-) diff --git a/Chromatism/Chromatism/JLTextView.m b/Chromatism/Chromatism/JLTextView.m index 6b4756f..750f677 100644 --- a/Chromatism/Chromatism/JLTextView.m +++ b/Chromatism/Chromatism/JLTextView.m @@ -46,6 +46,7 @@ - (void)setup self.syntaxTokenizer = [[JLTokenizer alloc] init]; self.syntaxTokenizer.textView = self; self.textStorage.delegate = self.syntaxTokenizer; + self.delegate = self.syntaxTokenizer; self.syntaxTokenizer.theme = JLTokenizerThemeDusk; // Set default properties @@ -54,7 +55,6 @@ - (void)setup self.font = [UIFont fontWithName:@"Menlo" size:12]; self.autocorrectionType = UITextAutocorrectionTypeNo; self.autocapitalizationType = UITextAutocapitalizationTypeNone; - } diff --git a/Chromatism/Chromatism/JLTokenizer.h b/Chromatism/Chromatism/JLTokenizer.h index c129bea..0ce0781 100644 --- a/Chromatism/Chromatism/JLTokenizer.h +++ b/Chromatism/Chromatism/JLTokenizer.h @@ -30,7 +30,10 @@ FOUNDATION_EXPORT NSString *const JLTokenTypeOtherClassNames; FOUNDATION_EXPORT NSString *const JLTokenTypeOtherMethodNames; @class TextViewChange, JLTextView; -@interface JLTokenizer : NSObject +@interface JLTokenizer : NSObject + +// Override to create your own syntax highlighting +- (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range; - (void)clearColorAttributesInRange:(NSRange)range textStorage:(NSTextStorage *)storage; - (NSMutableAttributedString *)tokenizeString:(NSString *)string withDefaultAttributes:(NSDictionary *)attributes; diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index f4b47e9..2ed2116 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -42,6 +42,9 @@ #import "JLTokenPattern.h" @interface JLTokenizer () +{ + NSString *_oldString; +} + (NSDictionary *)colorsFromTheme:(JLTokenizerTheme)theme; @@ -50,6 +53,80 @@ + (NSDictionary *)colorsFromTheme:(JLTokenizerTheme)theme; @implementation JLTokenizer @synthesize theme = _theme, themes = _themes, colors = _colors; +#pragma mark - UITextViewDelegate + +- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text +{ + _oldString = nil; + + if (range.length == 0 && text.length == 1) { + // A normal character typed + } + else if (range.length == 1 && text.length == 0) { + // Backspace + } + else { + // Multicharacter edit + } + + if ([text isEqualToString:@"\n"]) { + // Return + // Start the new line with as many tabs or white spaces as the previous one. + NSRange lineRange = [textView.text lineRangeForRange:range]; + NSRange prefixRange = [textView.text rangeOfString:@"[\\t| ]*" options:NSRegularExpressionSearch range:lineRange]; + NSString *prefixString = [textView.text substringWithRange:prefixRange]; + + UITextPosition *beginning = textView.beginningOfDocument; + UITextPosition *start = [textView positionFromPosition:beginning offset:range.location]; + UITextPosition *stop = [textView positionFromPosition:start offset:range.length]; + + UITextRange *textRange = [textView textRangeFromPosition:start toPosition:stop]; + + [textView replaceRange:textRange withText:[NSString stringWithFormat:@"\n%@",prefixString]]; + + return NO; + } + + if (range.length > 0) + { + _oldString = [textView.text substringWithRange:range]; + } + + return YES; +} + +#pragma mark - Scopes + +// +// NOT COMPLETED +// +//- (void)refreshScopesInTextStorage:(NSTextStorage *)textStorage; +//{ +// NSString *string = textStorage.string; +// __block NSUInteger scope = 0; +// +// +// NSString *pattern = @"\\{|\\}"; +// NSError *error; +// NSString *attribute = @"ChromatismScopeAttributeName"; +// NSRegularExpression *expression = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:&error]; +// +// NSAssert(!error, @"%@",error); +// +// [expression enumerateMatchesInString:string options:0 range:NSMakeRange(0, textStorage.length) usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { +// NSString *substring = [string substringWithRange:result.range]; +// if ([substring isEqualToString:@"{"]) { +// scope++; +// } +// else scope--; +// NSLog(@"Scope is %i",scope); +// float f = 0.3 + ((float)scope/10); +// NSLog(@"Color is :%f",f); +// UIColor *color = [UIColor colorWithWhite:f alpha:1]; +// [textStorage addAttribute:NSForegroundColorAttributeName value:color range:NSMakeRange(result.range.location, string.length - result.range.location)]; +// }]; +//} + #pragma mark - NSTextStorageDelegate - (void)textStorage:(NSTextStorage *)textStorage willProcessEditing:(NSTextStorageEditActions)editedMask range:(NSRange)editedRange changeInLength:(NSInteger)delta @@ -59,15 +136,7 @@ - (void)textStorage:(NSTextStorage *)textStorage willProcessEditing:(NSTextStora - (void)textStorage:(NSTextStorage *)textStorage didProcessEditing:(NSTextStorageEditActions)editedMask range:(NSRange)editedRange changeInLength:(NSInteger)delta { - if (editedMask == NSTextStorageEditedAttributes) { - // Do nothing - } - else if (editedMask == NSTextStorageEditedCharacters) { - [self tokenizeTextStorage:textStorage withRange:[textStorage.string lineRangeForRange:editedRange]]; - } - else { - [self tokenizeTextStorage:textStorage withRange:[textStorage.string lineRangeForRange:editedRange]]; - } + [self tokenizeTextStorage:textStorage withRange:[textStorage.string lineRangeForRange:editedRange]]; } #pragma mark - Tokenizing From 2fb5d9a66ca5bb366af20afed773d780a2fb0116 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Wed, 17 Jul 2013 03:45:40 +0200 Subject: [PATCH 036/140] =?UTF-8?q?Textview=20resizing=20code=20taken=20fr?= =?UTF-8?q?om=20Apple=E2=80=99s=20sample=20code.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Chromatism/Chromatism/JLTextViewController.m | 79 +++++++++++++------- 1 file changed, 54 insertions(+), 25 deletions(-) diff --git a/Chromatism/Chromatism/JLTextViewController.m b/Chromatism/Chromatism/JLTextViewController.m index 2db708f..17170e6 100644 --- a/Chromatism/Chromatism/JLTextViewController.m +++ b/Chromatism/Chromatism/JLTextViewController.m @@ -45,11 +45,14 @@ - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil - (void)loadView { + UIView *view = [[UIView alloc] init]; JLTextView *textView = [[JLTextView alloc] init]; textView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; - [self setView:textView]; + [view addSubview:textView]; + + [self setView:view]; [self setTextView:textView]; } @@ -69,7 +72,7 @@ - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShown:) name:UIKeyboardWillShowNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; } @@ -84,37 +87,63 @@ - (void)viewWillDisappear:(BOOL)animated [[NSNotificationCenter defaultCenter] removeObserver:self]; } -- (void)moveTextViewForKeyboard:(NSNotification*)aNotification up:(BOOL)up { - NSDictionary* userInfo = [aNotification userInfo]; - NSTimeInterval animationDuration; - UIViewAnimationCurve animationCurve; - CGRect keyboardEndFrame; +#pragma mark - Responding to keyboard events + +- (void)keyboardWillShow:(NSNotification *)notification { + + /* + Reduce the size of the text view so that it's not obscured by the keyboard. + Animate the resize so that it's in sync with the appearance of the keyboard. + */ + + NSDictionary *userInfo = [notification userInfo]; + + // Get the origin of the keyboard when it's displayed. + NSValue *aValue = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey]; - [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] getValue:&animationCurve]; - [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration]; - [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardEndFrame]; + // Get the top of the keyboard as the y coordinate of its origin in self's view's + // coordinate system. The bottom of the text view's frame should align with the top + // of the keyboard's final position. + // + CGRect keyboardRect = [aValue CGRectValue]; + keyboardRect = [self.view convertRect:keyboardRect fromView:nil]; - [UIView beginAnimations:nil context:nil]; + CGFloat keyboardTop = keyboardRect.origin.y; + CGRect newTextViewFrame = self.view.bounds; + newTextViewFrame.size.height = keyboardTop - self.view.bounds.origin.y; + + // Get the duration of the animation. + NSValue *animationDurationValue = [userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey]; + NSTimeInterval animationDuration; + [animationDurationValue getValue:&animationDuration]; + + // Animate the resize of the text view's frame in sync with the keyboard's appearance. + [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:animationDuration]; - [UIView setAnimationCurve:animationCurve]; - CGRect newFrame = self.textView.frame; - CGRect keyboardFrame = [self.view convertRect:keyboardEndFrame toView:nil]; - keyboardFrame.size.height -= self.tabBarController.tabBar.frame.size.height; - newFrame.size.height -= keyboardFrame.size.height * (up?1:-1); - self.textView.frame = newFrame; + self.textView.frame = newTextViewFrame; [UIView commitAnimations]; } -- (void)keyboardWillShown:(NSNotification*)aNotification -{ - [self moveTextViewForKeyboard:aNotification up:YES]; -} - -- (void)keyboardWillHide:(NSNotification*)aNotification -{ - [self moveTextViewForKeyboard:aNotification up:NO]; +- (void)keyboardWillHide:(NSNotification *)notification { + + NSDictionary *userInfo = [notification userInfo]; + + /* + Restore the size of the text view (fill self's view). + Animate the resize so that it's in sync with the disappearance of the keyboard. + */ + NSValue *animationDurationValue = [userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey]; + NSTimeInterval animationDuration; + [animationDurationValue getValue:&animationDuration]; + + [UIView beginAnimations:nil context:NULL]; + [UIView setAnimationDuration:animationDuration]; + + self.textView.frame = self.view.bounds; + + [UIView commitAnimations]; } #pragma mark - UITextViewDelegate From e5788d0f77d8f7cebefc23828929c3b542ba6ed4 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Wed, 17 Jul 2013 04:02:00 +0200 Subject: [PATCH 037/140] Tidying --- .../Chromatism.xcodeproj/project.pbxproj | 24 +++++++------------ Chromatism/Chromatism/JLMarkdownTokenizer.m | 2 +- Chromatism/Chromatism/JLScope.m | 2 ++ Chromatism/Chromatism/JLTextViewController.m | 17 ------------- Chromatism/Chromatism/JLTokenPattern.m | 5 ++-- Chromatism/Chromatism/JLTokenizer.m | 18 ++++++++++++++ 6 files changed, 32 insertions(+), 36 deletions(-) diff --git a/Chromatism/Chromatism.xcodeproj/project.pbxproj b/Chromatism/Chromatism.xcodeproj/project.pbxproj index aecc399..8e91d11 100644 --- a/Chromatism/Chromatism.xcodeproj/project.pbxproj +++ b/Chromatism/Chromatism.xcodeproj/project.pbxproj @@ -102,7 +102,6 @@ 8F3AB90F1781C0BA0023348A = { isa = PBXGroup; children = ( - 8FA091A11791E2D900179325 /* External */, 8F3AB91D1781C0BA0023348A /* Chromatism */, 8F3AB9311781C0BB0023348A /* ChromatismTests */, 8F3AB91A1781C0BA0023348A /* Frameworks */, @@ -133,24 +132,24 @@ 8F3AB91D1781C0BA0023348A /* Chromatism */ = { isa = PBXGroup; children = ( + 8F3AB9201781C0BA0023348A /* Chromatism.h */, + 8F3AB9221781C0BA0023348A /* Chromatism.m */, 8F3AB9551781C1250023348A /* JLTokenizer.h */, 8F3AB9561781C1250023348A /* JLTokenizer.m */, + 8F3AB9531781C1250023348A /* JLTextViewController.h */, + 8F3AB9541781C1250023348A /* JLTextViewController.m */, + 8FA0CB0D1795F41B00FF8EB1 /* JLTextView.h */, + 8FA0CB0E1795F41B00FF8EB1 /* JLTextView.m */, 8FA091A21791E62600179325 /* JLMarkdownTokenizer.h */, 8FA091A31791E62600179325 /* JLMarkdownTokenizer.m */, 8FA091A61791E99900179325 /* NSMutableAttributedString+Mush.h */, 8FA091A71791E99900179325 /* NSMutableAttributedString+Mush.m */, - 8F3AB9201781C0BA0023348A /* Chromatism.h */, - 8F3AB9221781C0BA0023348A /* Chromatism.m */, 8F3AB94D1781C1250023348A /* Helpers.h */, 8F3AB94E1781C1250023348A /* Helpers.m */, - 8F3AB9571781C1250023348A /* JLTokenPattern.h */, - 8F3AB9581781C1250023348A /* JLTokenPattern.m */, 8F3AB94F1781C1250023348A /* JLScope.h */, 8F3AB9501781C1250023348A /* JLScope.m */, - 8F3AB9531781C1250023348A /* JLTextViewController.h */, - 8F3AB9541781C1250023348A /* JLTextViewController.m */, - 8FA0CB0D1795F41B00FF8EB1 /* JLTextView.h */, - 8FA0CB0E1795F41B00FF8EB1 /* JLTextView.m */, + 8F3AB9571781C1250023348A /* JLTokenPattern.h */, + 8F3AB9581781C1250023348A /* JLTokenPattern.m */, 8F3AB91E1781C0BA0023348A /* Supporting Files */, ); path = Chromatism; @@ -183,13 +182,6 @@ name = "Supporting Files"; sourceTree = ""; }; - 8FA091A11791E2D900179325 /* External */ = { - isa = PBXGroup; - children = ( - ); - name = External; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ diff --git a/Chromatism/Chromatism/JLMarkdownTokenizer.m b/Chromatism/Chromatism/JLMarkdownTokenizer.m index f14f4f2..6e072be 100644 --- a/Chromatism/Chromatism/JLMarkdownTokenizer.m +++ b/Chromatism/Chromatism/JLMarkdownTokenizer.m @@ -13,7 +13,7 @@ @implementation JLMarkdownTokenizer - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range { - [NSException raise:@"Chromatism bad task" format:@"%@ cannot handle live syntax highlighting", self.class]; + [NSException raise:@"Chromatism Exception" format:@"%@ cannot handle live syntax highlighting", self.class]; } - (NSMutableAttributedString *)tokenizeString:(NSString *)string withDefaultAttributes:(NSDictionary *)attributes diff --git a/Chromatism/Chromatism/JLScope.m b/Chromatism/Chromatism/JLScope.m index cf6ab22..d366edb 100644 --- a/Chromatism/Chromatism/JLScope.m +++ b/Chromatism/Chromatism/JLScope.m @@ -43,6 +43,8 @@ + (instancetype)scopeWithTextStorage:(NSTextStorage *)textStorage return [self scopeWithRange:NSMakeRange(0, textStorage.length) inTextStorage:textStorage]; } +#pragma mark - Perform + - (void)perform { if (self.scope) { diff --git a/Chromatism/Chromatism/JLTextViewController.m b/Chromatism/Chromatism/JLTextViewController.m index 17170e6..b22ee59 100644 --- a/Chromatism/Chromatism/JLTextViewController.m +++ b/Chromatism/Chromatism/JLTextViewController.m @@ -11,23 +11,6 @@ #import "JLTokenizer.h" #import "JLTextView.h" -NSString *const JLTokenTypeText = @"text"; -NSString *const JLTokenTypeBackground = @"background"; -NSString *const JLTokenTypeComment = @"comment"; -NSString *const JLTokenTypeDocumentationComment = @"documentation_comment"; -NSString *const JLTokenTypeDocumentationCommentKeyword = @"documentation_comment_keyword"; -NSString *const JLTokenTypeString = @"string"; -NSString *const JLTokenTypeCharacter = @"character"; -NSString *const JLTokenTypeNumber = @"number"; -NSString *const JLTokenTypeKeyword = @"keyword"; -NSString *const JLTokenTypePreprocessor = @"preprocessor"; -NSString *const JLTokenTypeURL = @"url"; -NSString *const JLTokenTypeAttribute = @"attribute"; -NSString *const JLTokenTypeProject = @"project"; -NSString *const JLTokenTypeOther = @"other"; -NSString *const JLTokenTypeOtherMethodNames = @"other_method_names"; -NSString *const JLTokenTypeOtherClassNames = @"other_class_names"; - @interface JLTextViewController () @end diff --git a/Chromatism/Chromatism/JLTokenPattern.m b/Chromatism/Chromatism/JLTokenPattern.m index 92e910a..0c81188 100644 --- a/Chromatism/Chromatism/JLTokenPattern.m +++ b/Chromatism/Chromatism/JLTokenPattern.m @@ -28,14 +28,13 @@ - (id)init { self = [super init]; if (self) { -// self.dirtySearch = NO; self.opaque = YES; self.captureGroup = 0; } return self; } -#pragma mark - Properties +#pragma mark - Regular Expression - (void)setExpression:(NSRegularExpression *)expression { @@ -51,6 +50,8 @@ - (void)setPattern:(NSString *)pattern _expression = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionAnchorsMatchLines error:nil]; } +#pragma mark - Perform + - (void)perform { [self.scope.set enumerateRangesUsingBlock:^(NSRange range, BOOL *stop) { diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index 2ed2116..25b7ddb 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -41,6 +41,24 @@ #import "JLScope.h" #import "JLTokenPattern.h" +NSString *const JLTokenTypeText = @"text"; +NSString *const JLTokenTypeBackground = @"background"; +NSString *const JLTokenTypeComment = @"comment"; +NSString *const JLTokenTypeDocumentationComment = @"documentation_comment"; +NSString *const JLTokenTypeDocumentationCommentKeyword = @"documentation_comment_keyword"; +NSString *const JLTokenTypeString = @"string"; +NSString *const JLTokenTypeCharacter = @"character"; +NSString *const JLTokenTypeNumber = @"number"; +NSString *const JLTokenTypeKeyword = @"keyword"; +NSString *const JLTokenTypePreprocessor = @"preprocessor"; +NSString *const JLTokenTypeURL = @"url"; +NSString *const JLTokenTypeAttribute = @"attribute"; +NSString *const JLTokenTypeProject = @"project"; +NSString *const JLTokenTypeOther = @"other"; +NSString *const JLTokenTypeOtherMethodNames = @"other_method_names"; +NSString *const JLTokenTypeOtherClassNames = @"other_class_names"; + + @interface JLTokenizer () { NSString *_oldString; From 926f7fc762e46027ff177d47d2f21b832d2ee3df Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Wed, 17 Jul 2013 04:04:03 +0200 Subject: [PATCH 038/140] JLTextViewController is no UITextViewDelegate. --- Chromatism/Chromatism/JLTextViewController.h | 2 +- Chromatism/Chromatism/JLTextViewController.m | 14 -------------- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/Chromatism/Chromatism/JLTextViewController.h b/Chromatism/Chromatism/JLTextViewController.h index 7957a20..ea6d836 100644 --- a/Chromatism/Chromatism/JLTextViewController.h +++ b/Chromatism/Chromatism/JLTextViewController.h @@ -10,7 +10,7 @@ @class JLTokenizer, JLTextView; -@interface JLTextViewController : UIViewController +@interface JLTextViewController : UIViewController @property (nonatomic, strong) IBOutlet JLTextView *textView; diff --git a/Chromatism/Chromatism/JLTextViewController.m b/Chromatism/Chromatism/JLTextViewController.m index b22ee59..43b41cc 100644 --- a/Chromatism/Chromatism/JLTextViewController.m +++ b/Chromatism/Chromatism/JLTextViewController.m @@ -129,18 +129,4 @@ Restore the size of the text view (fill self's view). [UIView commitAnimations]; } -#pragma mark - UITextViewDelegate - -- (void)textViewDidBeginEditing:(UITextView *)textView -{ - -} - -- (void)textViewDidEndEditing:(UITextView *)textView -{ - -} - - - @end From b4fa588e348916e35e8f80bd9e656a3f806275fa Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Wed, 17 Jul 2013 04:30:41 +0200 Subject: [PATCH 039/140] #import and fixed bug with scope hierarchy management --- .../Chromatism.xcodeproj/project.pbxproj | 4 +-- Chromatism/Chromatism/JLScope.m | 26 ++++++++++++------- Chromatism/Chromatism/JLTokenPattern.m | 11 ++------ Chromatism/Chromatism/JLTokenizer.m | 6 +++++ 4 files changed, 27 insertions(+), 20 deletions(-) diff --git a/Chromatism/Chromatism.xcodeproj/project.pbxproj b/Chromatism/Chromatism.xcodeproj/project.pbxproj index 8e91d11..b3378b3 100644 --- a/Chromatism/Chromatism.xcodeproj/project.pbxproj +++ b/Chromatism/Chromatism.xcodeproj/project.pbxproj @@ -136,12 +136,12 @@ 8F3AB9221781C0BA0023348A /* Chromatism.m */, 8F3AB9551781C1250023348A /* JLTokenizer.h */, 8F3AB9561781C1250023348A /* JLTokenizer.m */, + 8FA091A21791E62600179325 /* JLMarkdownTokenizer.h */, + 8FA091A31791E62600179325 /* JLMarkdownTokenizer.m */, 8F3AB9531781C1250023348A /* JLTextViewController.h */, 8F3AB9541781C1250023348A /* JLTextViewController.m */, 8FA0CB0D1795F41B00FF8EB1 /* JLTextView.h */, 8FA0CB0E1795F41B00FF8EB1 /* JLTextView.m */, - 8FA091A21791E62600179325 /* JLMarkdownTokenizer.h */, - 8FA091A31791E62600179325 /* JLMarkdownTokenizer.m */, 8FA091A61791E99900179325 /* NSMutableAttributedString+Mush.h */, 8FA091A71791E99900179325 /* NSMutableAttributedString+Mush.m */, 8F3AB94D1781C1250023348A /* Helpers.h */, diff --git a/Chromatism/Chromatism/JLScope.m b/Chromatism/Chromatism/JLScope.m index d366edb..1b25c65 100644 --- a/Chromatism/Chromatism/JLScope.m +++ b/Chromatism/Chromatism/JLScope.m @@ -11,6 +11,9 @@ @interface JLScope () @property (nonatomic, readwrite, strong) NSString *string; + +- (void)iterateSubscopes; + @end @implementation JLScope @@ -45,24 +48,29 @@ + (instancetype)scopeWithTextStorage:(NSTextStorage *)textStorage #pragma mark - Perform -- (void)perform +- (void)iterateSubscopes { - if (self.scope) { - - // Intersect with scope - self.set = [self.set intersectionWithSet:self.scope.set]; - } - NSMutableIndexSet *archivedSet = self.set.mutableCopy; for (JLScope *scope in self.subscopes) { + if (scope == self) NSAssert(NO, @"%@ can under no circumstances have itself as a subscope.", self); scope.textStorage = self.textStorage; scope.string = self.string; [scope perform]; } self.set = archivedSet; +} +- (void)perform +{ + if (self.scope) { + // Intersect with scope + self.set = [self.set intersectionWithSet:self.scope.set]; + } + + [self iterateSubscopes]; + if (self.scope && self.opaque == YES) { [self.scope.set removeIndexes:self.set]; @@ -87,10 +95,10 @@ - (void)setSubscopes:(NSArray *)subscopes - (void)setScope:(JLScope *)scope { - [(NSMutableArray *)_scope.subscopes removeObject:scope]; + [(NSMutableArray *)_scope.subscopes removeObject:self]; _scope = scope; - [(NSMutableArray *)_scope.subscopes addObject:scope]; + [(NSMutableArray *)_scope.subscopes addObject:self]; } - (void)addSubscope:(JLScope *)subscope diff --git a/Chromatism/Chromatism/JLTokenPattern.m b/Chromatism/Chromatism/JLTokenPattern.m index 0c81188..80daf1a 100644 --- a/Chromatism/Chromatism/JLTokenPattern.m +++ b/Chromatism/Chromatism/JLTokenPattern.m @@ -10,6 +10,7 @@ @interface JLScope () @property (nonatomic, readwrite, strong) NSString *string; +- (void)iterateSubscopes; @end @implementation JLTokenPattern @@ -61,15 +62,7 @@ - (void)perform }]; }]; - NSMutableIndexSet *archivedSet = self.set.mutableCopy; - for (JLScope *scope in self.subscopes) { - - scope.textStorage = self.textStorage; - scope.string = self.string; - - [scope perform]; - } - self.set = archivedSet; + [self iterateSubscopes]; if (self.scope && self.opaque == YES) { diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index 25b7ddb..74610d6 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -179,6 +179,12 @@ - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range // Preprocessor macros JLTokenPattern *preprocessor = [JLTokenPattern tokenPatternWithPattern:@"#.*+$" andColor:colors[JLTokenTypePreprocessor]]; + // #import - thing. + JLTokenPattern *importAngleBrackets = [JLTokenPattern tokenPatternWithPattern:@"<.*?>" andColor:colors[JLTokenTypeString]]; + + // In xcode it only works for #import and #include, not all preprocessor statements. + importAngleBrackets.scope = preprocessor; + // Strings JLTokenPattern *strings = [JLTokenPattern tokenPatternWithPattern:@"(\"|@\")[^\"\\n]*(@\"|\")" andColor:colors[JLTokenTypeString]]; [strings addScope:preprocessor]; From 23b744bca6206a6a26de715937c8f450019c023c Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Sun, 28 Jul 2013 18:18:02 +0200 Subject: [PATCH 040/140] Update README.md --- README.md | 31 +------------------------------ 1 file changed, 1 insertion(+), 30 deletions(-) diff --git a/README.md b/README.md index 1914312..5edf8b7 100644 --- a/README.md +++ b/README.md @@ -1,36 +1,7 @@ Chromatism ========== -This is an experimation of a Syntax Highlighting textView using a tableView and CoreText. It consists of a UITextView with a UITableVIew overlay. The UITextView has its textColor set to `[UIColor clearColor]` and ints only purpose is to provide a textinput. Ontop of the textView there is a `UITableView`, which render the lines currently visible. -## iOS 7 -Most of this code will be thrown away in favor for new iOS 7 features. - -## Bugs -At this moment there are *a lot* of bugs that need fixing. This is an experiment and a work in progress. - -##This is what happens when the text editor is created: - -1. The text is broken up into lines by a CTTypesetter and stored in an array. -2. The tableview asks for the lines that should be visible. -3. The tableView creates UITableViewCells which draw the lines. - -##What happens upon scrolling: -1. The tableView takes the cells that go offscreen and reuse them by telling them to draw new lines. Cells still onscreen are not redrawn. - -##What happens upon text change: -1. What type of text change is it? -2. If it can be handled by slightly modifying the lines, do so. No typesetter is required to look through the entire text. -3. If not there is no option but to recalculate everything with the typesetter. - - - -The tokenizing itself uses regex to modify an attributed string. The tokenizer tries to tokenizer as little as possible. If the user types a letter most regex patterns are going to be applied to the current line. - -##Performance -Performance is the whole reason Chromatism was created. - -###Screenshot of Time Profiling: -![Alt text](http://anviking.com/Time.png "Performance") +This is the beginning of a syntax highlighting `UITextView` for iOS. Currently it only knows about Obj-C. Previous Chromatism used a combination of `CoreText` and `UITableView` for performance, but luckily that is not needed anymore. From 7790f3f624447e9d9745101844f556b99c621204 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Sun, 28 Jul 2013 19:14:20 +0200 Subject: [PATCH 041/140] Added some class-descriptions --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 5edf8b7..651d5e8 100644 --- a/README.md +++ b/README.md @@ -3,5 +3,12 @@ Chromatism This is the beginning of a syntax highlighting `UITextView` for iOS. Currently it only knows about Obj-C. Previous Chromatism used a combination of `CoreText` and `UITableView` for performance, but luckily that is not needed anymore. +## Classes +- `JLTextView` is a textView with a syntaxTokenixer property to a `JLTokenizer` +- `JLTokenizer` is the class in which everything happens. It uses scopes and tokenPatterns to appropriately tokenize a textStorage or a string. It is a `NSTextStorage` and `UITextView`-delegate. +- `JLScope` has a `NSMutableIndexSet`-property that corresponds to ranges in the textStorage. Scopes can be arranged in a hierarchy. A scope's children is stored in the `subscopes` property, and a scopes parent is simply called its `scope`. A scope can be executed via the `-perform`-method. The method causes subscopes to perform cascadingly. +- `JLTokenPattern` is a subclass of `JLScope`. It has a regex-pattern that in `-perform` searches through the ranges of its (super)scope. + + From 28dd1fa329d5c9e4fafc6a4c4f50631175d482e8 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Sun, 28 Jul 2013 20:13:54 +0200 Subject: [PATCH 042/140] Added example code --- README.md | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/README.md b/README.md index 651d5e8..8968d11 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,42 @@ This is the beginning of a syntax highlighting `UITextView` for iOS. Currently i - `JLScope` has a `NSMutableIndexSet`-property that corresponds to ranges in the textStorage. Scopes can be arranged in a hierarchy. A scope's children is stored in the `subscopes` property, and a scopes parent is simply called its `scope`. A scope can be executed via the `-perform`-method. The method causes subscopes to perform cascadingly. - `JLTokenPattern` is a subclass of `JLScope`. It has a regex-pattern that in `-perform` searches through the ranges of its (super)scope. +## Scopes and Patterns +### Example +This is slightly modified snippet from the `JLTokenizer`-class. + +````objc +// The documentScope will be our root scope +JLScope *documentScope = [JLScope scopeWithTextStorage:storage]; + +// A subscope with a specific range. In this case, it is a scope with the range of the edited line. +JLScope *rangeScope = [JLScope scopeWithRange:range inTextStorage:storage]; + +// We begin with the patterns that will find the most amout of text. + +// "/* ... */" comments should search through the whole document, and no other patterns should search in its results +JLTokenPattern *comments1 = [JLTokenPattern tokenPatternWithPattern:@"/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*+/" andColor:colors[JLTokenTypeComment]]; + +// "//" comments should search in the range of the edited line, but only where there is no /* */ comment. +JLTokenPattern *comments2 = [JLTokenPattern tokenPatternWithPattern:@"//.*+$" andColor:colors[JLTokenTypeComment]]; + +JLTokenPattern *preprocessor = [JLTokenPattern tokenPatternWithPattern:@"#.*+$" andColor:colors[JLTokenTypePreprocessor]]; + +// This pattern should only search in the the results from the preprocessor pattern. If we want a pattern to have multiple scopes we could use addScope which creates a copy of the pattern, and adds it as a subscope in the other scope. +JLTokenPattern *importAngleBrackets = [JLTokenPattern tokenPatternWithPattern:@"<.*?>" andColor:colors[JLTokenTypeString]]; +preprocessor.scope = preprocessor; + + +JLTokenPattern *literals = [JLTokenPattern tokenPatternWithPattern:@"@[\\(|\\{|\\[][^\\(\\{\\[]+[\\)|\\}|\\]]" andColor:colors[JLTokenTypeNumber]]; +literals.opaque = NO; // Scopes and patterns are opaque per default. Setting this to NO makes it that patterns that follow in the same scope can search and overwrite the results from this pattern. + +// Setup the hiearchy +documentScope.subscopes = @[comments1, rangeScope]; +rangeScope.subscopes = @[comments2, preprocessor, literals]; + +// Causes every subscope to perform as well +[documentScope perform]; +```` From cea72a023708d92aaf791c6b7cf30fcf69105488 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Sun, 28 Jul 2013 21:33:38 +0200 Subject: [PATCH 043/140] Update README.md --- README.md | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 8968d11..3d07a50 100644 --- a/README.md +++ b/README.md @@ -1,28 +1,33 @@ Chromatism ========== -This is the beginning of a syntax highlighting `UITextView` for iOS. Currently it only knows about Obj-C. Previous Chromatism used a combination of `CoreText` and `UITableView` for performance, but luckily that is not needed anymore. +This is the beginning of a syntax highlighting `UITextView` for iOS. Currently it only knows about Obj-C. Previously Chromatism used a combination of `CoreText` and `UITableView` for performance, but luckily that is not needed anymore. ## Classes - `JLTextView` is a textView with a syntaxTokenixer property to a `JLTokenizer` - `JLTokenizer` is the class in which everything happens. It uses scopes and tokenPatterns to appropriately tokenize a textStorage or a string. It is a `NSTextStorage` and `UITextView`-delegate. - `JLScope` has a `NSMutableIndexSet`-property that corresponds to ranges in the textStorage. Scopes can be arranged in a hierarchy. A scope's children is stored in the `subscopes` property, and a scopes parent is simply called its `scope`. A scope can be executed via the `-perform`-method. The method causes subscopes to perform cascadingly. -- `JLTokenPattern` is a subclass of `JLScope`. It has a regex-pattern that in `-perform` searches through the ranges of its (super)scope. +- `JLTokenPattern` is a subclass of `JLScope`. It has a regex-pattern that in `-perform` searches through the ranges of its parent scope. ## Scopes and Patterns +Scopes and patters can ensure that every regex pattern searches in the right places. To understand how they work, it is helpful to know what happens in the `-perform` method. + +1. A scope may contain ranges before it's performed. When it's performed, the scope's set is intersected with the parent scope set. A scope can never contain more indexes that its parent scope. +2. The scope calls perform on its subscopes. +3. The scope ensures that its siblings don't search where the scope have found things. + +For more detail, see the `-perform`-implementation on [`JLScope`](https://github.com/Anviking/Chromatism/blob/master/Chromatism/Chromatism/JLScope.m#65) and [`JLTokenPattern`](https://github.com/Anviking/Chromatism/blob/master/Chromatism/Chromatism/JLTokenPattern.m#56). ### Example -This is slightly modified snippet from the `JLTokenizer`-class. +Modified snippet from `JLTokenizer`. ````objc // The documentScope will be our root scope JLScope *documentScope = [JLScope scopeWithTextStorage:storage]; -// A subscope with a specific range. In this case, it is a scope with the range of the edited line. +// A subscope with a specific range. In this case, the range is the range of the edited line. JLScope *rangeScope = [JLScope scopeWithRange:range inTextStorage:storage]; -// We begin with the patterns that will find the most amout of text. - // "/* ... */" comments should search through the whole document, and no other patterns should search in its results JLTokenPattern *comments1 = [JLTokenPattern tokenPatternWithPattern:@"/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*+/" andColor:colors[JLTokenTypeComment]]; @@ -31,10 +36,13 @@ JLTokenPattern *comments2 = [JLTokenPattern tokenPatternWithPattern:@"//.*+$" an JLTokenPattern *preprocessor = [JLTokenPattern tokenPatternWithPattern:@"#.*+$" andColor:colors[JLTokenTypePreprocessor]]; -// This pattern should only search in the the results from the preprocessor pattern. If we want a pattern to have multiple scopes we could use addScope which creates a copy of the pattern, and adds it as a subscope in the other scope. +// This pattern should only search in the the results from the preprocessor pattern. JLTokenPattern *importAngleBrackets = [JLTokenPattern tokenPatternWithPattern:@"<.*?>" andColor:colors[JLTokenTypeString]]; -preprocessor.scope = preprocessor; +importAngleBrackets.scope = preprocessor; +JLTokenPattern *strings = [JLTokenPattern tokenPatternWithPattern:@"(\"|@\")[^\"\\n]*(@\"|\")" andColor:colors[JLTokenTypeString]]; +// This pattern should search where there is nothing else, *and* in the results of the preprocessor pattern. `-addScope` copies `strings` and adds the copy as a subscope of `preprocessor`. +[strings addScope:preprocessor]; JLTokenPattern *literals = [JLTokenPattern tokenPatternWithPattern:@"@[\\(|\\{|\\[][^\\(\\{\\[]+[\\)|\\}|\\]]" andColor:colors[JLTokenTypeNumber]]; literals.opaque = NO; // Scopes and patterns are opaque per default. Setting this to NO makes it that patterns that follow in the same scope can search and overwrite the results from this pattern. From 9bc4fb7b58eff4fb2fbdd44843a585213a36c26c Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Sun, 28 Jul 2013 22:04:07 +0200 Subject: [PATCH 044/140] Cleanup --- Chromatism/Chromatism/JLTokenPattern.h | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Chromatism/Chromatism/JLTokenPattern.h b/Chromatism/Chromatism/JLTokenPattern.h index e2e3135..060a7b0 100644 --- a/Chromatism/Chromatism/JLTokenPattern.h +++ b/Chromatism/Chromatism/JLTokenPattern.h @@ -23,9 +23,4 @@ */ @property (nonatomic, assign) NSUInteger captureGroup; - -/// Describes if the pattern search for matches in indexes marked as unclear. If false, the search will happen in the scopes clearIndexes. If true, the serach will happen in the scope itself. Default: FALSE. -//@property (nonatomic, assign) BOOL dirtySearch; -// NOT IMPLEMENTED - @end From 50e5e841e08f58be9fdd09a6c4689b8ee1e64769 Mon Sep 17 00:00:00 2001 From: Anviking Date: Wed, 31 Jul 2013 01:33:31 +0200 Subject: [PATCH 045/140] Lets test more --- .../Chromatism.xcodeproj/project.pbxproj | 2 + Chromatism/Chromatism/JLScope.m | 2 +- Chromatism/ChromatismTests/ChromatismTests.m | 37 ++++++++++++++++--- 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/Chromatism/Chromatism.xcodeproj/project.pbxproj b/Chromatism/Chromatism.xcodeproj/project.pbxproj index b3378b3..16dfdf9 100644 --- a/Chromatism/Chromatism.xcodeproj/project.pbxproj +++ b/Chromatism/Chromatism.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 3260A15417A8845F008792E6 /* Helpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F3AB94E1781C1250023348A /* Helpers.m */; }; 8F3AB92A1781C0BA0023348A /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F3AB9291781C0BA0023348A /* XCTest.framework */; }; 8F3AB92B1781C0BB0023348A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F3AB91B1781C0BA0023348A /* Foundation.framework */; }; 8F3AB92D1781C0BB0023348A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F3AB92C1781C0BB0023348A /* UIKit.framework */; }; @@ -299,6 +300,7 @@ buildActionMask = 2147483647; files = ( 8F3AB9381781C0BB0023348A /* ChromatismTests.m in Sources */, + 3260A15417A8845F008792E6 /* Helpers.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Chromatism/Chromatism/JLScope.m b/Chromatism/Chromatism/JLScope.m index 1b25c65..6caff27 100644 --- a/Chromatism/Chromatism/JLScope.m +++ b/Chromatism/Chromatism/JLScope.m @@ -65,7 +65,7 @@ - (void)iterateSubscopes - (void)perform { if (self.scope) { - // Intersect with scope + NSAssert(self.set.count != 0, @"A scope that is not the root-scope must have indexes before -perform:"); self.set = [self.set intersectionWithSet:self.scope.set]; } diff --git a/Chromatism/ChromatismTests/ChromatismTests.m b/Chromatism/ChromatismTests/ChromatismTests.m index ebea82b..7eb9253 100644 --- a/Chromatism/ChromatismTests/ChromatismTests.m +++ b/Chromatism/ChromatismTests/ChromatismTests.m @@ -8,6 +8,7 @@ #import #import "Chromatism.h" +#import "Helpers.h" @interface ChromatismTests : XCTestCase @@ -29,24 +30,50 @@ - (void)tearDown [super tearDown]; } +- (void)testIntersection +{ + NSIndexSet *setA = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(5, 20)]; + NSIndexSet *setB = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(3, 7)]; + + NSIndexSet *result = [setA intersectionWithSet:setB]; + + XCTAssertEqualObjects(result, [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(5, 5)], @""); + +} + - (void)testSubscopes { - JLScope *scope = [JLScope new]; - JLScope *subscope1 = [JLScope new]; - JLScope *subscope2 = [JLScope new]; - JLScope *subscope3 = [JLScope new]; - JLScope *subscope4 = [JLScope new]; + NSTextStorage *storage = [[NSTextStorage alloc] initWithString:@"Test test test test"]; + JLScope *scope = [JLScope scopeWithTextStorage:storage]; + + JLScope *subscope1 = [JLScope scopeWithRange:NSMakeRange(0, 1) inTextStorage:nil]; + JLScope *subscope2 = [JLScope scopeWithRange:NSMakeRange(1, 1) inTextStorage:nil]; + JLScope *subscope3 = [JLScope scopeWithRange:NSMakeRange(2, 1) inTextStorage:nil]; + JLScope *subscope4 = [JLScope scopeWithRange:NSMakeRange(3, 1) inTextStorage:nil]; [scope setSubscopes:@[subscope1, subscope2]]; [scope addSubscope:subscope3]; subscope4.scope = scope; + XCTAssertEqualObjects(subscope1.scope, scope, @""); XCTAssertEqualObjects(subscope2.scope, scope, @""); XCTAssertEqualObjects(subscope3.scope, scope, @""); XCTAssertEqualObjects(subscope4.scope, scope, @""); + XCTAssertNotEqualObjects(subscope1.textStorage, scope.textStorage, @""); + XCTAssertNotEqualObjects(subscope2.textStorage, scope.textStorage, @""); + XCTAssertNotEqualObjects(subscope3.textStorage, scope.textStorage, @""); + XCTAssertNotEqualObjects(subscope4.textStorage, scope.textStorage, @""); + + [scope perform]; + + XCTAssertEqualObjects(subscope1.textStorage, scope.textStorage, @""); + XCTAssertEqualObjects(subscope2.textStorage, scope.textStorage, @""); + XCTAssertEqualObjects(subscope3.textStorage, scope.textStorage, @""); + XCTAssertEqualObjects(subscope4.textStorage, scope.textStorage, @""); + XCTAssertTrue([scope.subscopes isKindOfClass:[NSMutableArray class]], @"subscopes should be of type NSMutableArray"); } From cd54e518f714506c1b6247030c24e547bfb1038f Mon Sep 17 00:00:00 2001 From: Anviking Date: Wed, 31 Jul 2013 02:01:28 +0200 Subject: [PATCH 046/140] scope opaque and some tokenizing --- .../Chromatism.xcodeproj/project.pbxproj | 4 ++ Chromatism/ChromatismTests/ChromatismTests.m | 2 + Chromatism/ChromatismTests/JLTokenizerTests.m | 57 +++++++++++++++++++ 3 files changed, 63 insertions(+) create mode 100644 Chromatism/ChromatismTests/JLTokenizerTests.m diff --git a/Chromatism/Chromatism.xcodeproj/project.pbxproj b/Chromatism/Chromatism.xcodeproj/project.pbxproj index 16dfdf9..4cd961e 100644 --- a/Chromatism/Chromatism.xcodeproj/project.pbxproj +++ b/Chromatism/Chromatism.xcodeproj/project.pbxproj @@ -8,6 +8,7 @@ /* Begin PBXBuildFile section */ 3260A15417A8845F008792E6 /* Helpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F3AB94E1781C1250023348A /* Helpers.m */; }; + 3260A15617A884EC008792E6 /* JLTokenizerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3260A15517A884EC008792E6 /* JLTokenizerTests.m */; }; 8F3AB92A1781C0BA0023348A /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F3AB9291781C0BA0023348A /* XCTest.framework */; }; 8F3AB92B1781C0BB0023348A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F3AB91B1781C0BA0023348A /* Foundation.framework */; }; 8F3AB92D1781C0BB0023348A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F3AB92C1781C0BB0023348A /* UIKit.framework */; }; @@ -46,6 +47,7 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 3260A15517A884EC008792E6 /* JLTokenizerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JLTokenizerTests.m; sourceTree = ""; }; 8F3AB9181781C0BA0023348A /* libChromatism.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libChromatism.a; sourceTree = BUILT_PRODUCTS_DIR; }; 8F3AB91B1781C0BA0023348A /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 8F3AB91F1781C0BA0023348A /* Chromatism-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Chromatism-Prefix.pch"; sourceTree = ""; }; @@ -168,6 +170,7 @@ 8F3AB9311781C0BB0023348A /* ChromatismTests */ = { isa = PBXGroup; children = ( + 3260A15517A884EC008792E6 /* JLTokenizerTests.m */, 8F3AB9371781C0BB0023348A /* ChromatismTests.m */, 8F3AB9321781C0BB0023348A /* Supporting Files */, ); @@ -301,6 +304,7 @@ files = ( 8F3AB9381781C0BB0023348A /* ChromatismTests.m in Sources */, 3260A15417A8845F008792E6 /* Helpers.m in Sources */, + 3260A15617A884EC008792E6 /* JLTokenizerTests.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Chromatism/ChromatismTests/ChromatismTests.m b/Chromatism/ChromatismTests/ChromatismTests.m index 7eb9253..367bc71 100644 --- a/Chromatism/ChromatismTests/ChromatismTests.m +++ b/Chromatism/ChromatismTests/ChromatismTests.m @@ -46,6 +46,8 @@ - (void)testSubscopes NSTextStorage *storage = [[NSTextStorage alloc] initWithString:@"Test test test test"]; JLScope *scope = [JLScope scopeWithTextStorage:storage]; + XCTAssert(scope.opaque, @"scopes should be opaque per default"); + JLScope *subscope1 = [JLScope scopeWithRange:NSMakeRange(0, 1) inTextStorage:nil]; JLScope *subscope2 = [JLScope scopeWithRange:NSMakeRange(1, 1) inTextStorage:nil]; JLScope *subscope3 = [JLScope scopeWithRange:NSMakeRange(2, 1) inTextStorage:nil]; diff --git a/Chromatism/ChromatismTests/JLTokenizerTests.m b/Chromatism/ChromatismTests/JLTokenizerTests.m new file mode 100644 index 0000000..a16550e --- /dev/null +++ b/Chromatism/ChromatismTests/JLTokenizerTests.m @@ -0,0 +1,57 @@ +// +// JLTokenizerTests.m +// Chromatism +// +// Created by Anviking on 2013-07-31. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import +#import "JLTokenizer.h" + +@interface JLTokenizerTests : XCTestCase + +@end + +@implementation JLTokenizerTests +{ + JLTokenizer *tokenizer; + NSTextStorage *textStorage; +} + +- (void)setUp +{ + [super setUp]; + // Put setup code here. This method is called before the invocation of each test method in the class. + NSString *string = @"self //test"; + // 01234567891 + textStorage = [[NSTextStorage alloc] initWithString:string attributes:@{ @"attribute" : @42 }]; + tokenizer = [[JLTokenizer alloc] init]; +} + +- (void)tearDown +{ + // Put teardown code here. This method is called after the invocation of each test method in the class. + [super tearDown]; +} + +- (void)testBasicTokenizing +{ + [tokenizer tokenizeTextStorage:textStorage withRange:NSMakeRange(0, textStorage.length)]; + + XCTAssertEqualObjects([textStorage attribute:@"attribute" atIndex:0 effectiveRange:NULL], @42, @"Should keep attribute value"); + + NSRange selfRange; + NSRange commentRange; + + UIColor *keywordColor = tokenizer.colors[JLTokenTypeKeyword]; + UIColor *commentColor = tokenizer.colors[JLTokenTypeComment]; + + XCTAssertEqualObjects([textStorage attribute:NSForegroundColorAttributeName atIndex:0 effectiveRange:&selfRange], keywordColor, @"Self should be keyword-colored"); + XCTAssertEqualObjects([textStorage attribute:NSForegroundColorAttributeName atIndex:5 effectiveRange:&commentRange], commentColor, @"Should be comment-colored"); + + XCTAssertEqual(selfRange, NSMakeRange(0, 4), @"self should be colored"); + XCTAssertEqual(commentRange, NSMakeRange(5, 6), @"//test should be colored"); +} + +@end From eae770820a62feb702e3fe487540913613423f14 Mon Sep 17 00:00:00 2001 From: Anviking Date: Wed, 31 Jul 2013 02:12:15 +0200 Subject: [PATCH 047/140] Added Demo App --- .../ChromatismDemo.xcodeproj/project.pbxproj | 519 ++++++++++++++++++ ChromatismDemo/ChromatismDemo/AppDelegate.h | 15 + ChromatismDemo/ChromatismDemo/AppDelegate.m | 53 ++ .../ChromatismDemo/ChromatismDemo-Info.plist | 45 ++ .../ChromatismDemo/ChromatismDemo-Prefix.pch | 16 + .../AppIcon.appiconset/Contents.json | 53 ++ .../LaunchImage.launchimage/Contents.json | 51 ++ .../ChromatismDemo/en.lproj/InfoPlist.strings | 2 + ChromatismDemo/ChromatismDemo/main.m | 18 + .../ChromatismDemoTests-Info.plist | 22 + .../ChromatismDemoTests/ChromatismDemoTests.m | 34 ++ .../en.lproj/InfoPlist.strings | 2 + 12 files changed, 830 insertions(+) create mode 100644 ChromatismDemo/ChromatismDemo.xcodeproj/project.pbxproj create mode 100644 ChromatismDemo/ChromatismDemo/AppDelegate.h create mode 100644 ChromatismDemo/ChromatismDemo/AppDelegate.m create mode 100644 ChromatismDemo/ChromatismDemo/ChromatismDemo-Info.plist create mode 100644 ChromatismDemo/ChromatismDemo/ChromatismDemo-Prefix.pch create mode 100644 ChromatismDemo/ChromatismDemo/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 ChromatismDemo/ChromatismDemo/Images.xcassets/LaunchImage.launchimage/Contents.json create mode 100644 ChromatismDemo/ChromatismDemo/en.lproj/InfoPlist.strings create mode 100644 ChromatismDemo/ChromatismDemo/main.m create mode 100644 ChromatismDemo/ChromatismDemoTests/ChromatismDemoTests-Info.plist create mode 100644 ChromatismDemo/ChromatismDemoTests/ChromatismDemoTests.m create mode 100644 ChromatismDemo/ChromatismDemoTests/en.lproj/InfoPlist.strings diff --git a/ChromatismDemo/ChromatismDemo.xcodeproj/project.pbxproj b/ChromatismDemo/ChromatismDemo.xcodeproj/project.pbxproj new file mode 100644 index 0000000..6a574ad --- /dev/null +++ b/ChromatismDemo/ChromatismDemo.xcodeproj/project.pbxproj @@ -0,0 +1,519 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 3260A16417A88BA9008792E6 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3260A16317A88BA9008792E6 /* Foundation.framework */; }; + 3260A16617A88BA9008792E6 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3260A16517A88BA9008792E6 /* CoreGraphics.framework */; }; + 3260A16817A88BA9008792E6 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3260A16717A88BA9008792E6 /* UIKit.framework */; }; + 3260A16E17A88BA9008792E6 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 3260A16C17A88BA9008792E6 /* InfoPlist.strings */; }; + 3260A17017A88BA9008792E6 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 3260A16F17A88BA9008792E6 /* main.m */; }; + 3260A17417A88BA9008792E6 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 3260A17317A88BA9008792E6 /* AppDelegate.m */; }; + 3260A17617A88BA9008792E6 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3260A17517A88BA9008792E6 /* Images.xcassets */; }; + 3260A17D17A88BA9008792E6 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3260A17C17A88BA9008792E6 /* XCTest.framework */; }; + 3260A17E17A88BA9008792E6 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3260A16317A88BA9008792E6 /* Foundation.framework */; }; + 3260A17F17A88BA9008792E6 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3260A16717A88BA9008792E6 /* UIKit.framework */; }; + 3260A18717A88BA9008792E6 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 3260A18517A88BA9008792E6 /* InfoPlist.strings */; }; + 3260A18917A88BA9008792E6 /* ChromatismDemoTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3260A18817A88BA9008792E6 /* ChromatismDemoTests.m */; }; + 3260A19D17A88BC8008792E6 /* libChromatism.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3260A19817A88BB8008792E6 /* libChromatism.a */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 3260A18017A88BA9008792E6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 3260A15817A88BA9008792E6 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 3260A15F17A88BA9008792E6; + remoteInfo = ChromatismDemo; + }; + 3260A19717A88BB8008792E6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 3260A19217A88BB7008792E6 /* Chromatism.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 8F3AB9181781C0BA0023348A; + remoteInfo = Chromatism; + }; + 3260A19917A88BB8008792E6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 3260A19217A88BB7008792E6 /* Chromatism.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 8F3AB9281781C0BA0023348A; + remoteInfo = ChromatismTests; + }; + 3260A19B17A88BC4008792E6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 3260A19217A88BB7008792E6 /* Chromatism.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 8F3AB9171781C0BA0023348A; + remoteInfo = Chromatism; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 3260A16017A88BA9008792E6 /* ChromatismDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ChromatismDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 3260A16317A88BA9008792E6 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 3260A16517A88BA9008792E6 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; + 3260A16717A88BA9008792E6 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + 3260A16B17A88BA9008792E6 /* ChromatismDemo-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ChromatismDemo-Info.plist"; sourceTree = ""; }; + 3260A16D17A88BA9008792E6 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 3260A16F17A88BA9008792E6 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 3260A17117A88BA9008792E6 /* ChromatismDemo-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ChromatismDemo-Prefix.pch"; sourceTree = ""; }; + 3260A17217A88BA9008792E6 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 3260A17317A88BA9008792E6 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 3260A17517A88BA9008792E6 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + 3260A17B17A88BA9008792E6 /* ChromatismDemoTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ChromatismDemoTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3260A17C17A88BA9008792E6 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; + 3260A18417A88BA9008792E6 /* ChromatismDemoTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ChromatismDemoTests-Info.plist"; sourceTree = ""; }; + 3260A18617A88BA9008792E6 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 3260A18817A88BA9008792E6 /* ChromatismDemoTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ChromatismDemoTests.m; sourceTree = ""; }; + 3260A19217A88BB7008792E6 /* Chromatism.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Chromatism.xcodeproj; path = ../Chromatism/Chromatism.xcodeproj; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 3260A15D17A88BA9008792E6 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 3260A19D17A88BC8008792E6 /* libChromatism.a in Frameworks */, + 3260A16617A88BA9008792E6 /* CoreGraphics.framework in Frameworks */, + 3260A16817A88BA9008792E6 /* UIKit.framework in Frameworks */, + 3260A16417A88BA9008792E6 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3260A17817A88BA9008792E6 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 3260A17D17A88BA9008792E6 /* XCTest.framework in Frameworks */, + 3260A17F17A88BA9008792E6 /* UIKit.framework in Frameworks */, + 3260A17E17A88BA9008792E6 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 3260A15717A88BA9008792E6 = { + isa = PBXGroup; + children = ( + 3260A16917A88BA9008792E6 /* ChromatismDemo */, + 3260A18217A88BA9008792E6 /* ChromatismDemoTests */, + 3260A16217A88BA9008792E6 /* Frameworks */, + 3260A16117A88BA9008792E6 /* Products */, + ); + sourceTree = ""; + }; + 3260A16117A88BA9008792E6 /* Products */ = { + isa = PBXGroup; + children = ( + 3260A16017A88BA9008792E6 /* ChromatismDemo.app */, + 3260A17B17A88BA9008792E6 /* ChromatismDemoTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 3260A16217A88BA9008792E6 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 3260A19217A88BB7008792E6 /* Chromatism.xcodeproj */, + 3260A16317A88BA9008792E6 /* Foundation.framework */, + 3260A16517A88BA9008792E6 /* CoreGraphics.framework */, + 3260A16717A88BA9008792E6 /* UIKit.framework */, + 3260A17C17A88BA9008792E6 /* XCTest.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 3260A16917A88BA9008792E6 /* ChromatismDemo */ = { + isa = PBXGroup; + children = ( + 3260A17217A88BA9008792E6 /* AppDelegate.h */, + 3260A17317A88BA9008792E6 /* AppDelegate.m */, + 3260A17517A88BA9008792E6 /* Images.xcassets */, + 3260A16A17A88BA9008792E6 /* Supporting Files */, + ); + path = ChromatismDemo; + sourceTree = ""; + }; + 3260A16A17A88BA9008792E6 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 3260A16B17A88BA9008792E6 /* ChromatismDemo-Info.plist */, + 3260A16C17A88BA9008792E6 /* InfoPlist.strings */, + 3260A16F17A88BA9008792E6 /* main.m */, + 3260A17117A88BA9008792E6 /* ChromatismDemo-Prefix.pch */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 3260A18217A88BA9008792E6 /* ChromatismDemoTests */ = { + isa = PBXGroup; + children = ( + 3260A18817A88BA9008792E6 /* ChromatismDemoTests.m */, + 3260A18317A88BA9008792E6 /* Supporting Files */, + ); + path = ChromatismDemoTests; + sourceTree = ""; + }; + 3260A18317A88BA9008792E6 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 3260A18417A88BA9008792E6 /* ChromatismDemoTests-Info.plist */, + 3260A18517A88BA9008792E6 /* InfoPlist.strings */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 3260A19317A88BB7008792E6 /* Products */ = { + isa = PBXGroup; + children = ( + 3260A19817A88BB8008792E6 /* libChromatism.a */, + 3260A19A17A88BB8008792E6 /* ChromatismTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 3260A15F17A88BA9008792E6 /* ChromatismDemo */ = { + isa = PBXNativeTarget; + buildConfigurationList = 3260A18C17A88BA9008792E6 /* Build configuration list for PBXNativeTarget "ChromatismDemo" */; + buildPhases = ( + 3260A15C17A88BA9008792E6 /* Sources */, + 3260A15D17A88BA9008792E6 /* Frameworks */, + 3260A15E17A88BA9008792E6 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 3260A19C17A88BC4008792E6 /* PBXTargetDependency */, + ); + name = ChromatismDemo; + productName = ChromatismDemo; + productReference = 3260A16017A88BA9008792E6 /* ChromatismDemo.app */; + productType = "com.apple.product-type.application"; + }; + 3260A17A17A88BA9008792E6 /* ChromatismDemoTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 3260A18F17A88BA9008792E6 /* Build configuration list for PBXNativeTarget "ChromatismDemoTests" */; + buildPhases = ( + 3260A17717A88BA9008792E6 /* Sources */, + 3260A17817A88BA9008792E6 /* Frameworks */, + 3260A17917A88BA9008792E6 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 3260A18117A88BA9008792E6 /* PBXTargetDependency */, + ); + name = ChromatismDemoTests; + productName = ChromatismDemoTests; + productReference = 3260A17B17A88BA9008792E6 /* ChromatismDemoTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 3260A15817A88BA9008792E6 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0500; + ORGANIZATIONNAME = Anviking; + TargetAttributes = { + 3260A17A17A88BA9008792E6 = { + TestTargetID = 3260A15F17A88BA9008792E6; + }; + }; + }; + buildConfigurationList = 3260A15B17A88BA9008792E6 /* Build configuration list for PBXProject "ChromatismDemo" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 3260A15717A88BA9008792E6; + productRefGroup = 3260A16117A88BA9008792E6 /* Products */; + projectDirPath = ""; + projectReferences = ( + { + ProductGroup = 3260A19317A88BB7008792E6 /* Products */; + ProjectRef = 3260A19217A88BB7008792E6 /* Chromatism.xcodeproj */; + }, + ); + projectRoot = ""; + targets = ( + 3260A15F17A88BA9008792E6 /* ChromatismDemo */, + 3260A17A17A88BA9008792E6 /* ChromatismDemoTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXReferenceProxy section */ + 3260A19817A88BB8008792E6 /* libChromatism.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libChromatism.a; + remoteRef = 3260A19717A88BB8008792E6 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3260A19A17A88BB8008792E6 /* ChromatismTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = ChromatismTests.xctest; + remoteRef = 3260A19917A88BB8008792E6 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + +/* Begin PBXResourcesBuildPhase section */ + 3260A15E17A88BA9008792E6 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 3260A16E17A88BA9008792E6 /* InfoPlist.strings in Resources */, + 3260A17617A88BA9008792E6 /* Images.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3260A17917A88BA9008792E6 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 3260A18717A88BA9008792E6 /* InfoPlist.strings in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 3260A15C17A88BA9008792E6 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 3260A17417A88BA9008792E6 /* AppDelegate.m in Sources */, + 3260A17017A88BA9008792E6 /* main.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3260A17717A88BA9008792E6 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 3260A18917A88BA9008792E6 /* ChromatismDemoTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 3260A18117A88BA9008792E6 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 3260A15F17A88BA9008792E6 /* ChromatismDemo */; + targetProxy = 3260A18017A88BA9008792E6 /* PBXContainerItemProxy */; + }; + 3260A19C17A88BC4008792E6 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Chromatism; + targetProxy = 3260A19B17A88BC4008792E6 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 3260A16C17A88BA9008792E6 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 3260A16D17A88BA9008792E6 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 3260A18517A88BA9008792E6 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 3260A18617A88BA9008792E6 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 3260A18A17A88BA9008792E6 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 3260A18B17A88BA9008792E6 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 3260A18D17A88BA9008792E6 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "ChromatismDemo/ChromatismDemo-Prefix.pch"; + HEADER_SEARCH_PATHS = "\"$(BUILT_PRODUCTS_DIR)/../../Headers\""; + INFOPLIST_FILE = "ChromatismDemo/ChromatismDemo-Info.plist"; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + 3260A18E17A88BA9008792E6 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "ChromatismDemo/ChromatismDemo-Prefix.pch"; + HEADER_SEARCH_PATHS = "\"$(BUILT_PRODUCTS_DIR)/../../Headers\""; + INFOPLIST_FILE = "ChromatismDemo/ChromatismDemo-Info.plist"; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; + 3260A19017A88BA9008792E6 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/ChromatismDemo.app/ChromatismDemo"; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + "$(DEVELOPER_FRAMEWORKS_DIR)", + ); + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "ChromatismDemo/ChromatismDemo-Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = "ChromatismDemoTests/ChromatismDemoTests-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUNDLE_LOADER)"; + WRAPPER_EXTENSION = xctest; + }; + name = Debug; + }; + 3260A19117A88BA9008792E6 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/ChromatismDemo.app/ChromatismDemo"; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + "$(DEVELOPER_FRAMEWORKS_DIR)", + ); + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "ChromatismDemo/ChromatismDemo-Prefix.pch"; + INFOPLIST_FILE = "ChromatismDemoTests/ChromatismDemoTests-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUNDLE_LOADER)"; + WRAPPER_EXTENSION = xctest; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 3260A15B17A88BA9008792E6 /* Build configuration list for PBXProject "ChromatismDemo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3260A18A17A88BA9008792E6 /* Debug */, + 3260A18B17A88BA9008792E6 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 3260A18C17A88BA9008792E6 /* Build configuration list for PBXNativeTarget "ChromatismDemo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3260A18D17A88BA9008792E6 /* Debug */, + 3260A18E17A88BA9008792E6 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; + 3260A18F17A88BA9008792E6 /* Build configuration list for PBXNativeTarget "ChromatismDemoTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3260A19017A88BA9008792E6 /* Debug */, + 3260A19117A88BA9008792E6 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; +/* End XCConfigurationList section */ + }; + rootObject = 3260A15817A88BA9008792E6 /* Project object */; +} diff --git a/ChromatismDemo/ChromatismDemo/AppDelegate.h b/ChromatismDemo/ChromatismDemo/AppDelegate.h new file mode 100644 index 0000000..94b951c --- /dev/null +++ b/ChromatismDemo/ChromatismDemo/AppDelegate.h @@ -0,0 +1,15 @@ +// +// AppDelegate.h +// ChromatismDemo +// +// Created by Anviking on 2013-07-31. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import + +@interface AppDelegate : UIResponder + +@property (strong, nonatomic) UIWindow *window; + +@end diff --git a/ChromatismDemo/ChromatismDemo/AppDelegate.m b/ChromatismDemo/ChromatismDemo/AppDelegate.m new file mode 100644 index 0000000..61d8854 --- /dev/null +++ b/ChromatismDemo/ChromatismDemo/AppDelegate.m @@ -0,0 +1,53 @@ +// +// AppDelegate.m +// ChromatismDemo +// +// Created by Anviking on 2013-07-31. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import "AppDelegate.h" +#import + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ + self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; + + JLTextViewController *viewController = [[JLTextViewController alloc] init]; + self.window.rootViewController = viewController; + + self.window.backgroundColor = [UIColor whiteColor]; + [self.window makeKeyAndVisible]; + return YES; +} + +- (void)applicationWillResignActive:(UIApplication *)application +{ + // 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. + // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. +} + +- (void)applicationDidEnterBackground:(UIApplication *)application +{ + // 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. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. +} + +- (void)applicationWillEnterForeground:(UIApplication *)application +{ + // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. +} + +- (void)applicationDidBecomeActive:(UIApplication *)application +{ + // 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. +} + +- (void)applicationWillTerminate:(UIApplication *)application +{ + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. +} + +@end diff --git a/ChromatismDemo/ChromatismDemo/ChromatismDemo-Info.plist b/ChromatismDemo/ChromatismDemo/ChromatismDemo-Info.plist new file mode 100644 index 0000000..79ce451 --- /dev/null +++ b/ChromatismDemo/ChromatismDemo/ChromatismDemo-Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + ${PRODUCT_NAME} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + com.anviking.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + LSRequiresIPhoneOS + + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/ChromatismDemo/ChromatismDemo/ChromatismDemo-Prefix.pch b/ChromatismDemo/ChromatismDemo/ChromatismDemo-Prefix.pch new file mode 100644 index 0000000..743435c --- /dev/null +++ b/ChromatismDemo/ChromatismDemo/ChromatismDemo-Prefix.pch @@ -0,0 +1,16 @@ +// +// Prefix header +// +// The contents of this file are implicitly included at the beginning of every source file. +// + +#import + +#ifndef __IPHONE_3_0 +#warning "This project uses features only available in iOS SDK 3.0 and later." +#endif + +#ifdef __OBJC__ + #import + #import +#endif diff --git a/ChromatismDemo/ChromatismDemo/Images.xcassets/AppIcon.appiconset/Contents.json b/ChromatismDemo/ChromatismDemo/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..91bf9c1 --- /dev/null +++ b/ChromatismDemo/ChromatismDemo/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,53 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "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" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ChromatismDemo/ChromatismDemo/Images.xcassets/LaunchImage.launchimage/Contents.json b/ChromatismDemo/ChromatismDemo/Images.xcassets/LaunchImage.launchimage/Contents.json new file mode 100644 index 0000000..6f870a4 --- /dev/null +++ b/ChromatismDemo/ChromatismDemo/Images.xcassets/LaunchImage.launchimage/Contents.json @@ -0,0 +1,51 @@ +{ + "images" : [ + { + "orientation" : "portrait", + "idiom" : "iphone", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "iphone", + "subtype" : "retina4", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "1x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "1x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ChromatismDemo/ChromatismDemo/en.lproj/InfoPlist.strings b/ChromatismDemo/ChromatismDemo/en.lproj/InfoPlist.strings new file mode 100644 index 0000000..477b28f --- /dev/null +++ b/ChromatismDemo/ChromatismDemo/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/ChromatismDemo/ChromatismDemo/main.m b/ChromatismDemo/ChromatismDemo/main.m new file mode 100644 index 0000000..cc23e52 --- /dev/null +++ b/ChromatismDemo/ChromatismDemo/main.m @@ -0,0 +1,18 @@ +// +// main.m +// ChromatismDemo +// +// Created by Anviking on 2013-07-31. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import + +#import "AppDelegate.h" + +int main(int argc, char * argv[]) +{ + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/ChromatismDemo/ChromatismDemoTests/ChromatismDemoTests-Info.plist b/ChromatismDemo/ChromatismDemoTests/ChromatismDemoTests-Info.plist new file mode 100644 index 0000000..614d82a --- /dev/null +++ b/ChromatismDemo/ChromatismDemoTests/ChromatismDemoTests-Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + com.anviking.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/ChromatismDemo/ChromatismDemoTests/ChromatismDemoTests.m b/ChromatismDemo/ChromatismDemoTests/ChromatismDemoTests.m new file mode 100644 index 0000000..7f3be30 --- /dev/null +++ b/ChromatismDemo/ChromatismDemoTests/ChromatismDemoTests.m @@ -0,0 +1,34 @@ +// +// ChromatismDemoTests.m +// ChromatismDemoTests +// +// Created by Anviking on 2013-07-31. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import + +@interface ChromatismDemoTests : XCTestCase + +@end + +@implementation ChromatismDemoTests + +- (void)setUp +{ + [super setUp]; + // Put setup code here. This method is called before the invocation of each test method in the class. +} + +- (void)tearDown +{ + // Put teardown code here. This method is called after the invocation of each test method in the class. + [super tearDown]; +} + +- (void)testExample +{ + XCTFail(@"No implementation for \"%s\"", __PRETTY_FUNCTION__); +} + +@end diff --git a/ChromatismDemo/ChromatismDemoTests/en.lproj/InfoPlist.strings b/ChromatismDemo/ChromatismDemoTests/en.lproj/InfoPlist.strings new file mode 100644 index 0000000..477b28f --- /dev/null +++ b/ChromatismDemo/ChromatismDemoTests/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + From a3354e8b4f5f1ded3dde97db49ff663b9a89ee44 Mon Sep 17 00:00:00 2001 From: Anviking Date: Wed, 31 Jul 2013 02:15:54 +0200 Subject: [PATCH 048/140] Added a surrounding navigationController to demo app --- ChromatismDemo/ChromatismDemo/AppDelegate.m | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ChromatismDemo/ChromatismDemo/AppDelegate.m b/ChromatismDemo/ChromatismDemo/AppDelegate.m index 61d8854..e487d67 100644 --- a/ChromatismDemo/ChromatismDemo/AppDelegate.m +++ b/ChromatismDemo/ChromatismDemo/AppDelegate.m @@ -16,8 +16,10 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; JLTextViewController *viewController = [[JLTextViewController alloc] init]; - self.window.rootViewController = viewController; + UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController]; + viewController.title = @"Chromatism"; + self.window.rootViewController = navigationController; self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; return YES; From 5a64758c2dc74005c5b494bb240656e642a091b3 Mon Sep 17 00:00:00 2001 From: Anviking Date: Wed, 31 Jul 2013 02:30:14 +0200 Subject: [PATCH 049/140] Added -initWithText method on JLTextViewController --- Chromatism/Chromatism/JLTextViewController.h | 2 + Chromatism/Chromatism/JLTextViewController.m | 16 ++++-- .../ChromatismDemo.xcodeproj/project.pbxproj | 4 ++ ChromatismDemo/ChromatismDemo/AppDelegate.m | 6 +- ChromatismDemo/ChromatismDemo/demo.txt | 55 +++++++++++++++++++ 5 files changed, 76 insertions(+), 7 deletions(-) create mode 100644 ChromatismDemo/ChromatismDemo/demo.txt diff --git a/Chromatism/Chromatism/JLTextViewController.h b/Chromatism/Chromatism/JLTextViewController.h index ea6d836..3cb9f5b 100644 --- a/Chromatism/Chromatism/JLTextViewController.h +++ b/Chromatism/Chromatism/JLTextViewController.h @@ -12,6 +12,8 @@ @interface JLTextViewController : UIViewController +- (instancetype)initWithText:(NSString *)text; + @property (nonatomic, strong) IBOutlet JLTextView *textView; // Convenience property for self.textView.syntaxTokenizer diff --git a/Chromatism/Chromatism/JLTextViewController.m b/Chromatism/Chromatism/JLTextViewController.m index 43b41cc..4533876 100644 --- a/Chromatism/Chromatism/JLTextViewController.m +++ b/Chromatism/Chromatism/JLTextViewController.m @@ -12,27 +12,31 @@ #import "JLTextView.h" @interface JLTextViewController () - +/// Only set from -initWithText: and directly set to nil in -loadView +@property (nonatomic, strong) NSString *defaultText; @end @implementation JLTextViewController -- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil +- (instancetype)initWithText:(NSString *)text { - self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + self = [super init]; if (self) { - // Custom initialization + _defaultText = text; } return self; } - - (void)loadView { UIView *view = [[UIView alloc] init]; JLTextView *textView = [[JLTextView alloc] init]; - textView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; + if (self.defaultText) { + textView.text = self.defaultText; + self.defaultText = nil; + } + [view addSubview:textView]; [self setView:view]; diff --git a/ChromatismDemo/ChromatismDemo.xcodeproj/project.pbxproj b/ChromatismDemo/ChromatismDemo.xcodeproj/project.pbxproj index 6a574ad..199b92b 100644 --- a/ChromatismDemo/ChromatismDemo.xcodeproj/project.pbxproj +++ b/ChromatismDemo/ChromatismDemo.xcodeproj/project.pbxproj @@ -20,6 +20,7 @@ 3260A18717A88BA9008792E6 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 3260A18517A88BA9008792E6 /* InfoPlist.strings */; }; 3260A18917A88BA9008792E6 /* ChromatismDemoTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3260A18817A88BA9008792E6 /* ChromatismDemoTests.m */; }; 3260A19D17A88BC8008792E6 /* libChromatism.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3260A19817A88BB8008792E6 /* libChromatism.a */; }; + 3260A1A517A88EF4008792E6 /* demo.txt in Resources */ = {isa = PBXBuildFile; fileRef = 3260A1A417A88EF4008792E6 /* demo.txt */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -71,6 +72,7 @@ 3260A18617A88BA9008792E6 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 3260A18817A88BA9008792E6 /* ChromatismDemoTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ChromatismDemoTests.m; sourceTree = ""; }; 3260A19217A88BB7008792E6 /* Chromatism.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Chromatism.xcodeproj; path = ../Chromatism/Chromatism.xcodeproj; sourceTree = ""; }; + 3260A1A417A88EF4008792E6 /* demo.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = demo.txt; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -143,6 +145,7 @@ 3260A16A17A88BA9008792E6 /* Supporting Files */ = { isa = PBXGroup; children = ( + 3260A1A417A88EF4008792E6 /* demo.txt */, 3260A16B17A88BA9008792E6 /* ChromatismDemo-Info.plist */, 3260A16C17A88BA9008792E6 /* InfoPlist.strings */, 3260A16F17A88BA9008792E6 /* main.m */, @@ -278,6 +281,7 @@ buildActionMask = 2147483647; files = ( 3260A16E17A88BA9008792E6 /* InfoPlist.strings in Resources */, + 3260A1A517A88EF4008792E6 /* demo.txt in Resources */, 3260A17617A88BA9008792E6 /* Images.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/ChromatismDemo/ChromatismDemo/AppDelegate.m b/ChromatismDemo/ChromatismDemo/AppDelegate.m index e487d67..476794f 100644 --- a/ChromatismDemo/ChromatismDemo/AppDelegate.m +++ b/ChromatismDemo/ChromatismDemo/AppDelegate.m @@ -15,7 +15,11 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; - JLTextViewController *viewController = [[JLTextViewController alloc] init]; + // Load demo text + NSURL *URL = [[NSBundle mainBundle] URLForResource:@"demo" withExtension:@"txt"]; + NSString *string = [[NSString alloc] initWithData:[NSData dataWithContentsOfURL:URL] encoding:NSUTF8StringEncoding]; + + JLTextViewController *viewController = [[JLTextViewController alloc] initWithText:string]; UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController]; viewController.title = @"Chromatism"; diff --git a/ChromatismDemo/ChromatismDemo/demo.txt b/ChromatismDemo/ChromatismDemo/demo.txt new file mode 100644 index 0000000..e487d67 --- /dev/null +++ b/ChromatismDemo/ChromatismDemo/demo.txt @@ -0,0 +1,55 @@ +// +// AppDelegate.m +// ChromatismDemo +// +// Created by Anviking on 2013-07-31. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import "AppDelegate.h" +#import + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ + self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; + + JLTextViewController *viewController = [[JLTextViewController alloc] init]; + UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController]; + viewController.title = @"Chromatism"; + + self.window.rootViewController = navigationController; + self.window.backgroundColor = [UIColor whiteColor]; + [self.window makeKeyAndVisible]; + return YES; +} + +- (void)applicationWillResignActive:(UIApplication *)application +{ + // 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. + // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. +} + +- (void)applicationDidEnterBackground:(UIApplication *)application +{ + // 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. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. +} + +- (void)applicationWillEnterForeground:(UIApplication *)application +{ + // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. +} + +- (void)applicationDidBecomeActive:(UIApplication *)application +{ + // 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. +} + +- (void)applicationWillTerminate:(UIApplication *)application +{ + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. +} + +@end From e8e59d9ce8bdf572b21d330cf55b0102aaa38c88 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Wed, 31 Jul 2013 02:44:04 +0200 Subject: [PATCH 050/140] Added "How to add" --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 3d07a50..d6f5e12 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,13 @@ Chromatism This is the beginning of a syntax highlighting `UITextView` for iOS. Currently it only knows about Obj-C. Previously Chromatism used a combination of `CoreText` and `UITableView` for performance, but luckily that is not needed anymore. +How to add Chromatism to your application: + +1. Drag and drop `Chromatism.xcodeproj` to your project. +2. Add `Chromatism` as a target dependency and link to `libChromatism.a` +3. Make sure you have the `-ObjC` flag on the `Other Linker Flags` build setting. +4. Add `"$(BUILT_PRODUCTS_DIR)/../../Headers"` to the `Header Search Paths` build setting. + ## Classes - `JLTextView` is a textView with a syntaxTokenixer property to a `JLTokenizer` - `JLTokenizer` is the class in which everything happens. It uses scopes and tokenPatterns to appropriately tokenize a textStorage or a string. It is a `NSTextStorage` and `UITextView`-delegate. From cf2af48756c24330142f9a14162316b2b4b3b857 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Wed, 31 Jul 2013 02:47:28 +0200 Subject: [PATCH 051/140] Grammar and rephrasing --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d6f5e12..99f8d28 100644 --- a/README.md +++ b/README.md @@ -12,12 +12,12 @@ How to add Chromatism to your application: ## Classes - `JLTextView` is a textView with a syntaxTokenixer property to a `JLTokenizer` -- `JLTokenizer` is the class in which everything happens. It uses scopes and tokenPatterns to appropriately tokenize a textStorage or a string. It is a `NSTextStorage` and `UITextView`-delegate. +- `JLTokenizer` is the work horse of Chromatism. It uses scopes and tokenPatterns to appropriately tokenize a textStorage or a string. It is a delegate of `NSTextStorage` and `UITextView`. - `JLScope` has a `NSMutableIndexSet`-property that corresponds to ranges in the textStorage. Scopes can be arranged in a hierarchy. A scope's children is stored in the `subscopes` property, and a scopes parent is simply called its `scope`. A scope can be executed via the `-perform`-method. The method causes subscopes to perform cascadingly. - `JLTokenPattern` is a subclass of `JLScope`. It has a regex-pattern that in `-perform` searches through the ranges of its parent scope. ## Scopes and Patterns -Scopes and patters can ensure that every regex pattern searches in the right places. To understand how they work, it is helpful to know what happens in the `-perform` method. +Scopes and patters can ensure that regex patterns search in the right place. To understand how they work, it is helpful to know what happens in the `-perform` method. 1. A scope may contain ranges before it's performed. When it's performed, the scope's set is intersected with the parent scope set. A scope can never contain more indexes that its parent scope. 2. The scope calls perform on its subscopes. From d22fa65fd707875273455fbc610d9bc0ddc9b7e9 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Wed, 31 Jul 2013 02:50:44 +0200 Subject: [PATCH 052/140] Simplified comment about -addScope --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 99f8d28..e1981f3 100644 --- a/README.md +++ b/README.md @@ -48,8 +48,8 @@ JLTokenPattern *importAngleBrackets = [JLTokenPattern tokenPatternWithPattern:@" importAngleBrackets.scope = preprocessor; JLTokenPattern *strings = [JLTokenPattern tokenPatternWithPattern:@"(\"|@\")[^\"\\n]*(@\"|\")" andColor:colors[JLTokenTypeString]]; -// This pattern should search where there is nothing else, *and* in the results of the preprocessor pattern. `-addScope` copies `strings` and adds the copy as a subscope of `preprocessor`. -[strings addScope:preprocessor]; +// This pattern should search where there is nothing else, *and* in the results of the preprocessor pattern. +[strings addScope:preprocessor]; // Equivalent to [preprocessor addSubscope:strings.copy] JLTokenPattern *literals = [JLTokenPattern tokenPatternWithPattern:@"@[\\(|\\{|\\[][^\\(\\{\\[]+[\\)|\\}|\\]]" andColor:colors[JLTokenTypeNumber]]; literals.opaque = NO; // Scopes and patterns are opaque per default. Setting this to NO makes it that patterns that follow in the same scope can search and overwrite the results from this pattern. From 62b341ebe1f79929780668dedab3e171da3d07cf Mon Sep 17 00:00:00 2001 From: Anviking Date: Wed, 31 Jul 2013 13:50:57 +0200 Subject: [PATCH 053/140] Parent scope is now responsible calling -performInIndexSet: on their subscopes with the correct indexSet --- Chromatism/Chromatism/JLScope.h | 6 +++++ Chromatism/Chromatism/JLScope.m | 32 +++++++++++++++----------- Chromatism/Chromatism/JLTokenPattern.m | 10 +++----- 3 files changed, 27 insertions(+), 21 deletions(-) diff --git a/Chromatism/Chromatism/JLScope.h b/Chromatism/Chromatism/JLScope.h index dfd9d7f..976f825 100644 --- a/Chromatism/Chromatism/JLScope.h +++ b/Chromatism/Chromatism/JLScope.h @@ -19,6 +19,7 @@ * Causes the every scope to perform cascadingly */ - (void)perform; +- (void)performInIndexSet:(NSIndexSet *)set; /// The color @property (nonatomic, strong) UIColor *color; @@ -59,4 +60,9 @@ */ @property (nonatomic, assign, getter = isOpaque) BOOL opaque; +/** + * If TRUE, the instance will act as if its subscopes where connected directly to the instance's parent's scope. + */ +@property (nonatomic, assign, getter = isEmpty) BOOL empty; + @end diff --git a/Chromatism/Chromatism/JLScope.m b/Chromatism/Chromatism/JLScope.m index 6caff27..67d5fbb 100644 --- a/Chromatism/Chromatism/JLScope.m +++ b/Chromatism/Chromatism/JLScope.m @@ -50,31 +50,35 @@ + (instancetype)scopeWithTextStorage:(NSTextStorage *)textStorage - (void)iterateSubscopes { - NSMutableIndexSet *archivedSet = self.set.mutableCopy; + NSMutableIndexSet *set = (self.empty) ? self.scope.set.mutableCopy :self.set.mutableCopy; for (JLScope *scope in self.subscopes) { - if (scope == self) NSAssert(NO, @"%@ can under no circumstances have itself as a subscope.", self); + NSAssert(scope != self, @"%@ can under no circumstances have itself as a subscope.", self); scope.textStorage = self.textStorage; scope.string = self.string; - [scope perform]; + [scope performInIndexSet:set]; + + if (scope.opaque) { + [set removeIndexes:scope.set]; + if (self.empty) { + [self.set addIndexes:scope.set]; + } + } } - self.set = archivedSet; } - (void)perform { - if (self.scope) { - NSAssert(self.set.count != 0, @"A scope that is not the root-scope must have indexes before -perform:"); - self.set = [self.set intersectionWithSet:self.scope.set]; - } - + NSAssert(!self.scope, @"Only call -perform to a rootlevel scope"); + [self iterateSubscopes]; +} + +- (void)performInIndexSet:(NSIndexSet *)set +{ + NSParameterAssert(set); + self.set = [self.set intersectionWithSet:set]; [self iterateSubscopes]; - - if (self.scope && self.opaque == YES) - { - [self.scope.set removeIndexes:self.set]; - } } #pragma mark - Scope Hierarchy Management diff --git a/Chromatism/Chromatism/JLTokenPattern.m b/Chromatism/Chromatism/JLTokenPattern.m index 80daf1a..49177e2 100644 --- a/Chromatism/Chromatism/JLTokenPattern.m +++ b/Chromatism/Chromatism/JLTokenPattern.m @@ -53,9 +53,9 @@ - (void)setPattern:(NSString *)pattern #pragma mark - Perform -- (void)perform +- (void)performInIndexSet:(NSIndexSet *)set { - [self.scope.set enumerateRangesUsingBlock:^(NSRange range, BOOL *stop) { + [set enumerateRangesUsingBlock:^(NSRange range, BOOL *stop) { [self.expression enumerateMatchesInString:self.string options:self.matchingOptions range:range usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { [self.textStorage addAttribute:NSForegroundColorAttributeName value:self.color range:[result rangeAtIndex:self.captureGroup]]; [self.set addIndexesInRange:[result rangeAtIndex:self.captureGroup]]; @@ -63,11 +63,7 @@ - (void)perform }]; [self iterateSubscopes]; - - if (self.scope && self.opaque == YES) - { - [self.scope.set removeIndexes:self.set]; - }} +} #pragma mark - NSCopying Protocol From 720e209f4c34ffeb8e2adf19bba14fe8ed6a1759 Mon Sep 17 00:00:00 2001 From: Anviking Date: Wed, 31 Jul 2013 15:35:40 +0200 Subject: [PATCH 054/140] Moving color and theme handling to the Chromatism-class --- .../Chromatism.xcodeproj/project.pbxproj | 4 ++ Chromatism/Chromatism/Chromatism+Internal.h | 39 ++++++++++ Chromatism/Chromatism/Chromatism.h | 5 +- Chromatism/Chromatism/Chromatism.m | 65 ++++++++++++++++- Chromatism/Chromatism/JLTextView.m | 1 + Chromatism/Chromatism/JLTokenizer.h | 21 +----- Chromatism/Chromatism/JLTokenizer.m | 71 +------------------ .../ChromatismDemo.xcodeproj/project.pbxproj | 2 + 8 files changed, 115 insertions(+), 93 deletions(-) create mode 100644 Chromatism/Chromatism/Chromatism+Internal.h diff --git a/Chromatism/Chromatism.xcodeproj/project.pbxproj b/Chromatism/Chromatism.xcodeproj/project.pbxproj index 4cd961e..d1e24db 100644 --- a/Chromatism/Chromatism.xcodeproj/project.pbxproj +++ b/Chromatism/Chromatism.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 32102EE117A948F900CFA161 /* Chromatism+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 32102EE017A948F900CFA161 /* Chromatism+Internal.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3260A15417A8845F008792E6 /* Helpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F3AB94E1781C1250023348A /* Helpers.m */; }; 3260A15617A884EC008792E6 /* JLTokenizerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3260A15517A884EC008792E6 /* JLTokenizerTests.m */; }; 8F3AB92A1781C0BA0023348A /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F3AB9291781C0BA0023348A /* XCTest.framework */; }; @@ -47,6 +48,7 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 32102EE017A948F900CFA161 /* Chromatism+Internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "Chromatism+Internal.h"; sourceTree = ""; }; 3260A15517A884EC008792E6 /* JLTokenizerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JLTokenizerTests.m; sourceTree = ""; }; 8F3AB9181781C0BA0023348A /* libChromatism.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libChromatism.a; sourceTree = BUILT_PRODUCTS_DIR; }; 8F3AB91B1781C0BA0023348A /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; @@ -136,6 +138,7 @@ isa = PBXGroup; children = ( 8F3AB9201781C0BA0023348A /* Chromatism.h */, + 32102EE017A948F900CFA161 /* Chromatism+Internal.h */, 8F3AB9221781C0BA0023348A /* Chromatism.m */, 8F3AB9551781C1250023348A /* JLTokenizer.h */, 8F3AB9561781C1250023348A /* JLTokenizer.m */, @@ -193,6 +196,7 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( + 32102EE117A948F900CFA161 /* Chromatism+Internal.h in Headers */, 8FA091A81791E99900179325 /* NSMutableAttributedString+Mush.h in Headers */, 8FA0CB0F1795F41B00FF8EB1 /* JLTextView.h in Headers */, 8F54EF0E1781C776008C1609 /* Chromatism.h in Headers */, diff --git a/Chromatism/Chromatism/Chromatism+Internal.h b/Chromatism/Chromatism/Chromatism+Internal.h new file mode 100644 index 0000000..0f049de --- /dev/null +++ b/Chromatism/Chromatism/Chromatism+Internal.h @@ -0,0 +1,39 @@ +// +// ChromatismInternal.h +// Chromatism +// +// Created by Anviking on 2013-07-31. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import + +typedef NS_ENUM(NSInteger, JLTokenizerTheme) { + JLTokenizerThemeDefault, + JLTokenizerThemeDusk +}; + +FOUNDATION_EXPORT NSString *const JLTokenTypeText; +FOUNDATION_EXPORT NSString *const JLTokenTypeBackground; +FOUNDATION_EXPORT NSString *const JLTokenTypeComment; +FOUNDATION_EXPORT NSString *const JLTokenTypeDocumentationComment; +FOUNDATION_EXPORT NSString *const JLTokenTypeDocumentationCommentKeyword; +FOUNDATION_EXPORT NSString *const JLTokenTypeString; +FOUNDATION_EXPORT NSString *const JLTokenTypeCharacter; +FOUNDATION_EXPORT NSString *const JLTokenTypeNumber; +FOUNDATION_EXPORT NSString *const JLTokenTypeKeyword; +FOUNDATION_EXPORT NSString *const JLTokenTypePreprocessor; +FOUNDATION_EXPORT NSString *const JLTokenTypeURL; +FOUNDATION_EXPORT NSString *const JLTokenTypeOther; +FOUNDATION_EXPORT NSString *const JLTokenTypeOtherClassNames; +FOUNDATION_EXPORT NSString *const JLTokenTypeOtherMethodNames; + +/** + * In addition to being the name of the library, the Chromatism class handles colors and TokenTypes + */ + +@interface Chromatism : NSObject + ++ (NSDictionary *)colorsForTheme:(JLTokenizerTheme)theme; + +@end diff --git a/Chromatism/Chromatism/Chromatism.h b/Chromatism/Chromatism/Chromatism.h index d6afae4..920d3d1 100644 --- a/Chromatism/Chromatism/Chromatism.h +++ b/Chromatism/Chromatism/Chromatism.h @@ -13,7 +13,4 @@ #import "JLTokenPattern.h" #import "JLMarkdownTokenizer.h" #import "JLTextView.h" - -@interface Chromatism : NSObject - -@end +#import "Chromatism+Internal.h" diff --git a/Chromatism/Chromatism/Chromatism.m b/Chromatism/Chromatism/Chromatism.m index 47f3cef..8b3f43d 100644 --- a/Chromatism/Chromatism/Chromatism.m +++ b/Chromatism/Chromatism/Chromatism.m @@ -6,8 +6,71 @@ // Copyright (c) 2013 Anviking. All rights reserved. // -#import "Chromatism.h" +#import "Chromatism+Internal.h" +#import "Helpers.h" + +NSString *const JLTokenTypeText = @"text"; +NSString *const JLTokenTypeBackground = @"background"; +NSString *const JLTokenTypeComment = @"comment"; +NSString *const JLTokenTypeDocumentationComment = @"documentation_comment"; +NSString *const JLTokenTypeDocumentationCommentKeyword = @"documentation_comment_keyword"; +NSString *const JLTokenTypeString = @"string"; +NSString *const JLTokenTypeCharacter = @"character"; +NSString *const JLTokenTypeNumber = @"number"; +NSString *const JLTokenTypeKeyword = @"keyword"; +NSString *const JLTokenTypePreprocessor = @"preprocessor"; +NSString *const JLTokenTypeURL = @"url"; +NSString *const JLTokenTypeAttribute = @"attribute"; +NSString *const JLTokenTypeProject = @"project"; +NSString *const JLTokenTypeOther = @"other"; +NSString *const JLTokenTypeOtherMethodNames = @"other_method_names"; +NSString *const JLTokenTypeOtherClassNames = @"other_class_names"; @implementation Chromatism ++ (NSDictionary *)colorsForTheme:(JLTokenizerTheme)theme +{ + NSDictionary* colors; + switch(theme) { + case JLTokenizerThemeDefault: + colors = @{JLTokenTypeText: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], + JLTokenTypeBackground: [UIColor colorWithRed:255.0/255 green:255.0/255 blue:255.0/255 alpha:1], + JLTokenTypeComment: [UIColor colorWithRed:0.0/255 green:131.0/255 blue:39.0/255 alpha:1], + JLTokenTypeDocumentationComment: [UIColor colorWithRed:0.0/255 green:131.0/255 blue:39.0/255 alpha:1], + JLTokenTypeDocumentationCommentKeyword: [UIColor colorWithRed:0.0/255 green:76.0/255 blue:29.0/255 alpha:1], + JLTokenTypeString: [UIColor colorWithRed:211.0/255 green:45.0/255 blue:38.0/255 alpha:1], + JLTokenTypeCharacter: [UIColor colorWithRed:40.0/255 green:52.0/255 blue:206.0/255 alpha:1], + JLTokenTypeNumber: [UIColor colorWithRed:40.0/255 green:52.0/255 blue:206.0/255 alpha:1], + JLTokenTypeKeyword: [UIColor colorWithRed:188.0/255 green:49.0/255 blue:156.0/255 alpha:1], + JLTokenTypePreprocessor: [UIColor colorWithRed:120.0/255 green:72.0/255 blue:48.0/255 alpha:1], + JLTokenTypeURL: [UIColor colorWithRed:21.0/255 green:67.0/255 blue:244.0/255 alpha:1], + JLTokenTypeOther: [UIColor colorWithRed:113.0/255 green:65.0/255 blue:163.0/255 alpha:1], + JLTokenTypeOtherMethodNames : [UIColor colorWithHex:@"7040a6" alpha:1], + JLTokenTypeOtherClassNames : [UIColor colorWithHex:@"7040a6" alpha:1] + + + + }; + break; + case JLTokenizerThemeDusk: + colors = @{JLTokenTypeText: [UIColor whiteColor], + JLTokenTypeBackground: [UIColor colorWithRed:30.0/255.0 green:32.0/255.0 blue:40.0/255.0 alpha:1], + JLTokenTypeComment: [UIColor colorWithRed:72.0/255 green:190.0/255 blue:102.0/255 alpha:1], + JLTokenTypeDocumentationComment: [UIColor colorWithRed:72.0/255 green:190.0/255 blue:102.0/255 alpha:1], + JLTokenTypeDocumentationCommentKeyword: [UIColor colorWithRed:72.0/255 green:190.0/255 blue:102.0/255 alpha:1], + JLTokenTypeString: [UIColor colorWithRed:230.0/255 green:66.0/255 blue:75.0/255 alpha:1], + JLTokenTypeCharacter: [UIColor colorWithRed:139.0/255 green:134.0/255 blue:201.0/255 alpha:1], + JLTokenTypeNumber: [UIColor colorWithRed:139.0/255 green:134.0/255 blue:201.0/255 alpha:1], + JLTokenTypeKeyword: [UIColor colorWithRed:195.0/255 green:55.0/255 blue:149.0/255 alpha:1], + JLTokenTypePreprocessor: [UIColor colorWithRed:198.0/255.0 green:124.0/255.0 blue:72.0/255.0 alpha:1], + JLTokenTypeURL: [UIColor colorWithRed:35.0/255 green:63.0/255 blue:208.0/255 alpha:1], + JLTokenTypeOther: [UIColor colorWithRed:0.0/255 green:175.0/255 blue:199.0/255 alpha:1], + JLTokenTypeOtherClassNames : [UIColor colorWithHex:@"04afc8" alpha:1], + JLTokenTypeOtherMethodNames : [UIColor colorWithHex:@"04afc8" alpha:1] + }; + break; + } + return colors; +} + @end diff --git a/Chromatism/Chromatism/JLTextView.m b/Chromatism/Chromatism/JLTextView.m index 750f677..e4e4101 100644 --- a/Chromatism/Chromatism/JLTextView.m +++ b/Chromatism/Chromatism/JLTextView.m @@ -8,6 +8,7 @@ #import "JLTextView.h" #import "JLTokenizer.h" +#import "Chromatism.h" @implementation JLTextView diff --git a/Chromatism/Chromatism/JLTokenizer.h b/Chromatism/Chromatism/JLTokenizer.h index 0ce0781..a1b2caa 100644 --- a/Chromatism/Chromatism/JLTokenizer.h +++ b/Chromatism/Chromatism/JLTokenizer.h @@ -8,26 +8,7 @@ #import #import "Helpers.h" - -typedef NS_ENUM(NSInteger, JLTokenizerTheme) { - JLTokenizerThemeDefault, - JLTokenizerThemeDusk -}; - -FOUNDATION_EXPORT NSString *const JLTokenTypeText; -FOUNDATION_EXPORT NSString *const JLTokenTypeBackground; -FOUNDATION_EXPORT NSString *const JLTokenTypeComment; -FOUNDATION_EXPORT NSString *const JLTokenTypeDocumentationComment; -FOUNDATION_EXPORT NSString *const JLTokenTypeDocumentationCommentKeyword; -FOUNDATION_EXPORT NSString *const JLTokenTypeString; -FOUNDATION_EXPORT NSString *const JLTokenTypeCharacter; -FOUNDATION_EXPORT NSString *const JLTokenTypeNumber; -FOUNDATION_EXPORT NSString *const JLTokenTypeKeyword; -FOUNDATION_EXPORT NSString *const JLTokenTypePreprocessor; -FOUNDATION_EXPORT NSString *const JLTokenTypeURL; -FOUNDATION_EXPORT NSString *const JLTokenTypeOther; -FOUNDATION_EXPORT NSString *const JLTokenTypeOtherClassNames; -FOUNDATION_EXPORT NSString *const JLTokenTypeOtherMethodNames; +#import "Chromatism+Internal.h" @class TextViewChange, JLTextView; @interface JLTokenizer : NSObject diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index 74610d6..c22a894 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -40,32 +40,13 @@ #import "JLTextViewController.h" #import "JLScope.h" #import "JLTokenPattern.h" - -NSString *const JLTokenTypeText = @"text"; -NSString *const JLTokenTypeBackground = @"background"; -NSString *const JLTokenTypeComment = @"comment"; -NSString *const JLTokenTypeDocumentationComment = @"documentation_comment"; -NSString *const JLTokenTypeDocumentationCommentKeyword = @"documentation_comment_keyword"; -NSString *const JLTokenTypeString = @"string"; -NSString *const JLTokenTypeCharacter = @"character"; -NSString *const JLTokenTypeNumber = @"number"; -NSString *const JLTokenTypeKeyword = @"keyword"; -NSString *const JLTokenTypePreprocessor = @"preprocessor"; -NSString *const JLTokenTypeURL = @"url"; -NSString *const JLTokenTypeAttribute = @"attribute"; -NSString *const JLTokenTypeProject = @"project"; -NSString *const JLTokenTypeOther = @"other"; -NSString *const JLTokenTypeOtherMethodNames = @"other_method_names"; -NSString *const JLTokenTypeOtherClassNames = @"other_class_names"; - +#import "Chromatism.h" @interface JLTokenizer () { NSString *_oldString; } -+ (NSDictionary *)colorsFromTheme:(JLTokenizerTheme)theme; - @end @implementation JLTokenizer @@ -249,7 +230,7 @@ - (NSDictionary *)defaultAttributes -(void)setTheme:(JLTokenizerTheme)theme { - self.colors = [self.class colorsFromTheme:theme]; + self.colors = [Chromatism colorsForTheme:theme]; self.textView.typingAttributes = @{ NSForegroundColorAttributeName : self.colors[JLTokenTypeText]}; _theme = theme; @@ -261,7 +242,7 @@ -(void)setTheme:(JLTokenizerTheme)theme - (NSDictionary *)colors { if (!_colors) { - self.colors = [self.class colorsFromTheme:self.theme]; + self.colors = [Chromatism colorsForTheme:self.theme]; } return _colors; } @@ -283,50 +264,4 @@ - (JLTokenizerTheme)theme return _theme; } -// Just a bunch of colors -+ (NSDictionary *)colorsFromTheme:(JLTokenizerTheme)theme -{ - NSDictionary* colors; - switch(theme) { - case JLTokenizerThemeDefault: - colors = @{JLTokenTypeText: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], - JLTokenTypeBackground: [UIColor colorWithRed:255.0/255 green:255.0/255 blue:255.0/255 alpha:1], - JLTokenTypeComment: [UIColor colorWithRed:0.0/255 green:131.0/255 blue:39.0/255 alpha:1], - JLTokenTypeDocumentationComment: [UIColor colorWithRed:0.0/255 green:131.0/255 blue:39.0/255 alpha:1], - JLTokenTypeDocumentationCommentKeyword: [UIColor colorWithRed:0.0/255 green:76.0/255 blue:29.0/255 alpha:1], - JLTokenTypeString: [UIColor colorWithRed:211.0/255 green:45.0/255 blue:38.0/255 alpha:1], - JLTokenTypeCharacter: [UIColor colorWithRed:40.0/255 green:52.0/255 blue:206.0/255 alpha:1], - JLTokenTypeNumber: [UIColor colorWithRed:40.0/255 green:52.0/255 blue:206.0/255 alpha:1], - JLTokenTypeKeyword: [UIColor colorWithRed:188.0/255 green:49.0/255 blue:156.0/255 alpha:1], - JLTokenTypePreprocessor: [UIColor colorWithRed:120.0/255 green:72.0/255 blue:48.0/255 alpha:1], - JLTokenTypeURL: [UIColor colorWithRed:21.0/255 green:67.0/255 blue:244.0/255 alpha:1], - JLTokenTypeOther: [UIColor colorWithRed:113.0/255 green:65.0/255 blue:163.0/255 alpha:1], - JLTokenTypeOtherMethodNames : [UIColor colorWithHex:@"7040a6" alpha:1], - JLTokenTypeOtherClassNames : [UIColor colorWithHex:@"7040a6" alpha:1] - - - - }; - break; - case JLTokenizerThemeDusk: - colors = @{JLTokenTypeText: [UIColor whiteColor], - JLTokenTypeBackground: [UIColor colorWithRed:30.0/255.0 green:32.0/255.0 blue:40.0/255.0 alpha:1], - JLTokenTypeComment: [UIColor colorWithRed:72.0/255 green:190.0/255 blue:102.0/255 alpha:1], - JLTokenTypeDocumentationComment: [UIColor colorWithRed:72.0/255 green:190.0/255 blue:102.0/255 alpha:1], - JLTokenTypeDocumentationCommentKeyword: [UIColor colorWithRed:72.0/255 green:190.0/255 blue:102.0/255 alpha:1], - JLTokenTypeString: [UIColor colorWithRed:230.0/255 green:66.0/255 blue:75.0/255 alpha:1], - JLTokenTypeCharacter: [UIColor colorWithRed:139.0/255 green:134.0/255 blue:201.0/255 alpha:1], - JLTokenTypeNumber: [UIColor colorWithRed:139.0/255 green:134.0/255 blue:201.0/255 alpha:1], - JLTokenTypeKeyword: [UIColor colorWithRed:195.0/255 green:55.0/255 blue:149.0/255 alpha:1], - JLTokenTypePreprocessor: [UIColor colorWithRed:198.0/255.0 green:124.0/255.0 blue:72.0/255.0 alpha:1], - JLTokenTypeURL: [UIColor colorWithRed:35.0/255 green:63.0/255 blue:208.0/255 alpha:1], - JLTokenTypeOther: [UIColor colorWithRed:0.0/255 green:175.0/255 blue:199.0/255 alpha:1], - JLTokenTypeOtherClassNames : [UIColor colorWithHex:@"04afc8" alpha:1], - JLTokenTypeOtherMethodNames : [UIColor colorWithHex:@"04afc8" alpha:1] - }; - break; - } - return colors; -} - @end diff --git a/ChromatismDemo/ChromatismDemo.xcodeproj/project.pbxproj b/ChromatismDemo/ChromatismDemo.xcodeproj/project.pbxproj index 199b92b..408bb50 100644 --- a/ChromatismDemo/ChromatismDemo.xcodeproj/project.pbxproj +++ b/ChromatismDemo/ChromatismDemo.xcodeproj/project.pbxproj @@ -508,6 +508,7 @@ 3260A18E17A88BA9008792E6 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; 3260A18F17A88BA9008792E6 /* Build configuration list for PBXNativeTarget "ChromatismDemoTests" */ = { isa = XCConfigurationList; @@ -516,6 +517,7 @@ 3260A19117A88BA9008792E6 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; From 1cd40e4737e0e11d502f210832dc8d4aa1552ccd Mon Sep 17 00:00:00 2001 From: Anviking Date: Wed, 31 Jul 2013 15:38:00 +0200 Subject: [PATCH 055/140] Remove failing demoApp tests --- ChromatismDemo/ChromatismDemoTests/ChromatismDemoTests.m | 5 ----- 1 file changed, 5 deletions(-) diff --git a/ChromatismDemo/ChromatismDemoTests/ChromatismDemoTests.m b/ChromatismDemo/ChromatismDemoTests/ChromatismDemoTests.m index 7f3be30..2c83f14 100644 --- a/ChromatismDemo/ChromatismDemoTests/ChromatismDemoTests.m +++ b/ChromatismDemo/ChromatismDemoTests/ChromatismDemoTests.m @@ -26,9 +26,4 @@ - (void)tearDown [super tearDown]; } -- (void)testExample -{ - XCTFail(@"No implementation for \"%s\"", __PRETTY_FUNCTION__); -} - @end From db7d1bad709b007de8abcfe55161871ece410792 Mon Sep 17 00:00:00 2001 From: Anviking Date: Wed, 31 Jul 2013 16:05:57 +0200 Subject: [PATCH 056/140] Rewritten tokenizeTextStorage: withRange: and added helper method --- Chromatism/Chromatism/JLTokenizer.m | 62 +++++++++++++++-------------- 1 file changed, 32 insertions(+), 30 deletions(-) diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index c22a894..6a2cba6 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -140,6 +140,20 @@ - (void)textStorage:(NSTextStorage *)textStorage didProcessEditing:(NSTextStorag #pragma mark - Tokenizing +- (JLTokenPattern *)addToken:(NSString *)type withPattern:(NSString *)pattern andScope:(JLScope *)scope +{ + NSParameterAssert(type); + NSParameterAssert(pattern); + NSParameterAssert(scope); + UIColor *color = self.colors[type]; + + NSAssert(color, @"%@ didn't return a color in color dictionary %@", type, self.colors); + + JLTokenPattern *token = [JLTokenPattern tokenPatternWithPattern:pattern andColor:self.colors[type]]; + [scope addSubscope:token]; + return token; +} + - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range { // Measure performance @@ -150,59 +164,47 @@ - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range JLScope *documentScope = [JLScope scopeWithTextStorage:storage]; JLScope *rangeScope = [JLScope scopeWithRange:range inTextStorage:storage]; - - NSDictionary *colors = self.colors; - // Two types of comments - JLTokenPattern *comments1 = [JLTokenPattern tokenPatternWithPattern:@"/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*+/" andColor:colors[JLTokenTypeComment]]; - JLTokenPattern *comments2 = [JLTokenPattern tokenPatternWithPattern:@"//.*+$" andColor:colors[JLTokenTypeComment]]; + // Block and line comments + [self addToken:JLTokenTypeComment withPattern:@"/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*+/" andScope:documentScope]; + [self addToken:JLTokenTypeComment withPattern:@"//.*+$" andScope:rangeScope]; // Preprocessor macros - JLTokenPattern *preprocessor = [JLTokenPattern tokenPatternWithPattern:@"#.*+$" andColor:colors[JLTokenTypePreprocessor]]; - - // #import - thing. - JLTokenPattern *importAngleBrackets = [JLTokenPattern tokenPatternWithPattern:@"<.*?>" andColor:colors[JLTokenTypeString]]; + JLTokenPattern *preprocessor = [self addToken:JLTokenTypePreprocessor withPattern:@"#.*+$" andScope:rangeScope]; + // #import // In xcode it only works for #import and #include, not all preprocessor statements. - importAngleBrackets.scope = preprocessor; + [self addToken:JLTokenTypeString withPattern:@"<.*?>" andScope:preprocessor]; // Strings - JLTokenPattern *strings = [JLTokenPattern tokenPatternWithPattern:@"(\"|@\")[^\"\\n]*(@\"|\")" andColor:colors[JLTokenTypeString]]; - [strings addScope:preprocessor]; + [[self addToken:JLTokenTypeString withPattern:@"(\"|@\")[^\"\\n]*(@\"|\")" andScope:rangeScope] addScope:preprocessor]; // Numbers - JLTokenPattern *numbers = [JLTokenPattern tokenPatternWithPattern:@"(?<=\\s)\\d+" andColor:colors[JLTokenTypeNumber]]; + [self addToken:JLTokenTypeNumber withPattern:@"(?<=\\s)\\d+" andScope:rangeScope]; // New literals, for example @[] - JLTokenPattern *literals = [JLTokenPattern tokenPatternWithPattern:@"@[\\(|\\{|\\[][^\\(\\{\\[]+[\\)|\\}|\\]]" andColor:colors[JLTokenTypeNumber]]; // New literals - // TODO: Literals don't search through multiple lines. Nor does it keep track of nested things. - literals.opaque = NO; + [[self addToken:JLTokenTypeNumber withPattern:@"@[\\(|\\{|\\[][^\\(\\{\\[]+[\\)|\\}|\\]]" andScope:rangeScope] setOpaque:NO]; // C function names - JLTokenPattern *functions = [JLTokenPattern tokenPatternWithPattern:@"\\w+\\s*(?>\\(.*\\)" andColor:colors[JLTokenTypeOtherMethodNames]]; - functions.captureGroup = 1; + [[self addToken:JLTokenTypeOtherMethodNames withPattern:@"\\w+\\s*(?>\\(.*\\)" andScope:rangeScope] setCaptureGroup:1]; // Dot notation - JLTokenPattern *dots = [JLTokenPattern tokenPatternWithPattern:@"\\.(\\w+)" andColor:colors[JLTokenTypeOtherMethodNames]]; - dots.captureGroup = 1; - + [[self addToken:JLTokenTypeOtherMethodNames withPattern:@"\\.(\\w+)" andScope:rangeScope] setCaptureGroup:1]; + // Method Calls - JLTokenPattern *methods1 = [JLTokenPattern tokenPatternWithPattern:@"\\[\\w+\\s+(\\w+)\\]" andColor:colors[JLTokenTypeOtherMethodNames]]; - methods1.captureGroup = 1; + [[self addToken:JLTokenTypeOtherMethodNames withPattern:@"\\[\\w+\\s+(\\w+)\\]" andScope:rangeScope] setCaptureGroup:1]; // Method call parts - JLTokenPattern *methods2 = [JLTokenPattern tokenPatternWithPattern:@"(?<=\\w+):\\s*[^\\s;\\]]+" andColor:colors[JLTokenTypeOtherMethodNames]]; - methods2.captureGroup = 1; + [[self addToken:JLTokenTypeOtherMethodNames withPattern:@"(?<=\\w+):\\s*[^\\s;\\]]+" andScope:rangeScope] setCaptureGroup:1]; // NS and UI prefixes words - JLTokenPattern *appleClassNames = [JLTokenPattern tokenPatternWithPattern:@"(\\b(?>NS|UI))\\w+\\b" andColor:colors[JLTokenTypeOtherClassNames]]; - JLTokenPattern *keywords1 = [JLTokenPattern tokenPatternWithPattern:@"(?<=\\b)(?>true|false|yes|no|TRUE|FALSE|bool|BOOL|nil|id|void|self|NULL|if|else|strong|weak|nonatomic|atomic|assign|copy|typedef|enum|auto|break|case|const|char|continue|do|default|double|extern|float|for|goto|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|volatile|while|nonatomic|atomic|nonatomic|readonly|super )(\\b)" andColor:colors[JLTokenTypeKeyword]]; - JLTokenPattern *keywords2 = [JLTokenPattern tokenPatternWithPattern:@"@[a-zA-Z0-9_]+" andColor:colors[JLTokenTypeKeyword]]; + [self addToken:JLTokenTypeOtherClassNames withPattern:@"(\\b(?>NS|UI))\\w+\\b" andScope:rangeScope]; - documentScope.subscopes = @[comments1, rangeScope]; - rangeScope.subscopes = @[comments2, preprocessor, strings, numbers, literals, functions, dots, methods1, methods2, appleClassNames, keywords1, keywords2]; + [self addToken:JLTokenTypeKeyword withPattern:@"(?<=\\b)(?>true|false|yes|no|TRUE|FALSE|bool|BOOL|nil|id|void|self|NULL|if|else|strong|weak|nonatomic|atomic|assign|copy|typedef|enum|auto|break|case|const|char|continue|do|default|double|extern|float|for|goto|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|volatile|while|nonatomic|atomic|nonatomic|readonly|super )(\\b)" andScope:rangeScope]; + [self addToken:JLTokenTypeKeyword withPattern:@"@[a-zA-Z0-9_]+" andScope:rangeScope]; + [documentScope addSubscope:rangeScope]; [documentScope perform]; NSLog(@"Chromatism done tokenizing with time of %fms",ABS([date timeIntervalSinceNow]*1000)); } From 47971730a905303d4a85758a58e62164688d215e Mon Sep 17 00:00:00 2001 From: Anviking Date: Wed, 31 Jul 2013 16:34:33 +0200 Subject: [PATCH 057/140] Implemented -description on JLScope and JLTokenPattern --- Chromatism/Chromatism/JLScope.h | 5 +++++ Chromatism/Chromatism/JLScope.m | 8 ++++++++ Chromatism/Chromatism/JLTokenPattern.m | 8 ++++++++ Chromatism/Chromatism/JLTokenizer.m | 1 + 4 files changed, 22 insertions(+) diff --git a/Chromatism/Chromatism/JLScope.h b/Chromatism/Chromatism/JLScope.h index 976f825..ab53e46 100644 --- a/Chromatism/Chromatism/JLScope.h +++ b/Chromatism/Chromatism/JLScope.h @@ -65,4 +65,9 @@ */ @property (nonatomic, assign, getter = isEmpty) BOOL empty; +/** + * A short description of the scope + */ +@property (nonatomic, copy) NSString *descriptionName; + @end diff --git a/Chromatism/Chromatism/JLScope.m b/Chromatism/Chromatism/JLScope.m index 67d5fbb..217e12a 100644 --- a/Chromatism/Chromatism/JLScope.m +++ b/Chromatism/Chromatism/JLScope.m @@ -128,6 +128,14 @@ - (NSMutableIndexSet *)set return _set; } +#pragma mark - Debugging + +- (NSString *)description +{ + NSString *subscopes = [[[[self.subscopes valueForKey:@"description"] componentsJoinedByString:@"\n"] componentsSeparatedByString:@"\n"] componentsJoinedByString:@"\n\t\t"]; + return [NSString stringWithFormat:@"%@, %@, nopaque: %i, nindexesSet:%@, \n subscopes, %@", NSStringFromClass(self.class), _descriptionName, _opaque, _set, subscopes]; +} + #pragma mark - NSCopying Protocol - (id)copyWithZone:(NSZone *)zone diff --git a/Chromatism/Chromatism/JLTokenPattern.m b/Chromatism/Chromatism/JLTokenPattern.m index 49177e2..796889f 100644 --- a/Chromatism/Chromatism/JLTokenPattern.m +++ b/Chromatism/Chromatism/JLTokenPattern.m @@ -65,6 +65,14 @@ - (void)performInIndexSet:(NSIndexSet *)set [self iterateSubscopes]; } +#pragma mark - Debugging + +- (NSString *)description +{ + NSString *subscopes = [[[[self.subscopes valueForKey:@"description"] componentsJoinedByString:@"\n"] componentsSeparatedByString:@"\n"] componentsJoinedByString:@"\n\t\t"]; + return [NSString stringWithFormat:@"%@, %@, Regex Pattern: %@, opaque: %i, indexesSet:%@ \nsubscopes, %@", NSStringFromClass(self.class), self.descriptionName, self.pattern, self.opaque, self.set, subscopes]; +} + #pragma mark - NSCopying Protocol - (id)copyWithZone:(NSZone *)zone diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index 6a2cba6..e6a8b0e 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -150,6 +150,7 @@ - (JLTokenPattern *)addToken:(NSString *)type withPattern:(NSString *)pattern an NSAssert(color, @"%@ didn't return a color in color dictionary %@", type, self.colors); JLTokenPattern *token = [JLTokenPattern tokenPatternWithPattern:pattern andColor:self.colors[type]]; + token.descriptionName = type; [scope addSubscope:token]; return token; } From 4491b58ee409e0a10edff18a0e83e08e5a1ad44f Mon Sep 17 00:00:00 2001 From: Anviking Date: Wed, 31 Jul 2013 17:21:54 +0200 Subject: [PATCH 058/140] Use the description for testing --- .../Chromatism.xcodeproj/project.pbxproj | 8 ++ Chromatism/ChromatismTests/JLTokenizerTests.m | 85 +++++++++++++++++- .../ChromatismTests/bundle.bundle/Root.plist | 61 +++++++++++++ .../ChromatismTests/bundle.bundle/demo.txt | 55 ++++++++++++ .../bundle.bundle/description.txt | 31 +++++++ .../bundle.bundle/en.lproj/Root.strings | Bin 0 -> 546 bytes 6 files changed, 236 insertions(+), 4 deletions(-) create mode 100644 Chromatism/ChromatismTests/bundle.bundle/Root.plist create mode 100644 Chromatism/ChromatismTests/bundle.bundle/demo.txt create mode 100644 Chromatism/ChromatismTests/bundle.bundle/description.txt create mode 100644 Chromatism/ChromatismTests/bundle.bundle/en.lproj/Root.strings diff --git a/Chromatism/Chromatism.xcodeproj/project.pbxproj b/Chromatism/Chromatism.xcodeproj/project.pbxproj index d1e24db..88d9d9a 100644 --- a/Chromatism/Chromatism.xcodeproj/project.pbxproj +++ b/Chromatism/Chromatism.xcodeproj/project.pbxproj @@ -8,6 +8,8 @@ /* Begin PBXBuildFile section */ 32102EE117A948F900CFA161 /* Chromatism+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 32102EE017A948F900CFA161 /* Chromatism+Internal.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 32102EED17A95E2900CFA161 /* demo.txt in Resources */ = {isa = PBXBuildFile; fileRef = 32102EEB17A95E2900CFA161 /* demo.txt */; }; + 32102EEE17A95E2900CFA161 /* description.txt in Resources */ = {isa = PBXBuildFile; fileRef = 32102EEC17A95E2900CFA161 /* description.txt */; }; 3260A15417A8845F008792E6 /* Helpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F3AB94E1781C1250023348A /* Helpers.m */; }; 3260A15617A884EC008792E6 /* JLTokenizerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3260A15517A884EC008792E6 /* JLTokenizerTests.m */; }; 8F3AB92A1781C0BA0023348A /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F3AB9291781C0BA0023348A /* XCTest.framework */; }; @@ -49,6 +51,8 @@ /* Begin PBXFileReference section */ 32102EE017A948F900CFA161 /* Chromatism+Internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "Chromatism+Internal.h"; sourceTree = ""; }; + 32102EEB17A95E2900CFA161 /* demo.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = demo.txt; path = bundle.bundle/demo.txt; sourceTree = ""; }; + 32102EEC17A95E2900CFA161 /* description.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = description.txt; path = bundle.bundle/description.txt; sourceTree = ""; }; 3260A15517A884EC008792E6 /* JLTokenizerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JLTokenizerTests.m; sourceTree = ""; }; 8F3AB9181781C0BA0023348A /* libChromatism.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libChromatism.a; sourceTree = BUILT_PRODUCTS_DIR; }; 8F3AB91B1781C0BA0023348A /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; @@ -183,6 +187,8 @@ 8F3AB9321781C0BB0023348A /* Supporting Files */ = { isa = PBXGroup; children = ( + 32102EEB17A95E2900CFA161 /* demo.txt */, + 32102EEC17A95E2900CFA161 /* description.txt */, 8F3AB9331781C0BB0023348A /* ChromatismTests-Info.plist */, 8F3AB9341781C0BB0023348A /* InfoPlist.strings */, ); @@ -280,6 +286,8 @@ buildActionMask = 2147483647; files = ( 8F3AB9361781C0BB0023348A /* InfoPlist.strings in Resources */, + 32102EEE17A95E2900CFA161 /* description.txt in Resources */, + 32102EED17A95E2900CFA161 /* demo.txt in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Chromatism/ChromatismTests/JLTokenizerTests.m b/Chromatism/ChromatismTests/JLTokenizerTests.m index a16550e..19d0f91 100644 --- a/Chromatism/ChromatismTests/JLTokenizerTests.m +++ b/Chromatism/ChromatismTests/JLTokenizerTests.m @@ -7,8 +7,13 @@ // #import +#import "Chromatism.h" #import "JLTokenizer.h" +@interface JLTokenizer () +- (JLTokenPattern *)addToken:(NSString *)type withPattern:(NSString *)pattern andScope:(JLScope *)scope; +@end + @interface JLTokenizerTests : XCTestCase @end @@ -16,16 +21,13 @@ @interface JLTokenizerTests : XCTestCase @implementation JLTokenizerTests { JLTokenizer *tokenizer; - NSTextStorage *textStorage; } - (void)setUp { [super setUp]; // Put setup code here. This method is called before the invocation of each test method in the class. - NSString *string = @"self //test"; - // 01234567891 - textStorage = [[NSTextStorage alloc] initWithString:string attributes:@{ @"attribute" : @42 }]; + tokenizer = [[JLTokenizer alloc] init]; } @@ -37,6 +39,9 @@ - (void)tearDown - (void)testBasicTokenizing { + NSString *string = @"self //test"; + // 01234567891 + NSTextStorage* textStorage = [[NSTextStorage alloc] initWithString:string attributes:@{ @"attribute" : @42 }]; [tokenizer tokenizeTextStorage:textStorage withRange:NSMakeRange(0, textStorage.length)]; XCTAssertEqualObjects([textStorage attribute:@"attribute" atIndex:0 effectiveRange:NULL], @42, @"Should keep attribute value"); @@ -54,4 +59,76 @@ - (void)testBasicTokenizing XCTAssertEqual(commentRange, NSMakeRange(5, 6), @"//test should be colored"); } +- (void)testDemoTextDescription +{ + // Load demo text + + NSBundle *bundle = [NSBundle bundleForClass:[self class]]; + + NSURL *URL = [bundle URLForResource:@"demo" withExtension:@"txt"]; + NSString *string = [[NSString alloc] initWithData:[NSData dataWithContentsOfURL:URL] encoding:NSUTF8StringEncoding]; + NSTextStorage *textStorage = [[NSTextStorage alloc] initWithString:string]; + + NSRange range = NSMakeRange(0, textStorage.length); + + JLScope *documentScope = [JLScope scopeWithTextStorage:textStorage]; + JLScope *rangeScope = [JLScope scopeWithRange:range inTextStorage:textStorage]; + + // Block and line comments + [tokenizer addToken:JLTokenTypeComment withPattern:@"/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*+/" andScope:documentScope]; + [tokenizer addToken:JLTokenTypeComment withPattern:@"//.*+$" andScope:rangeScope]; + + // Preprocessor macros + JLTokenPattern *preprocessor = [tokenizer addToken:JLTokenTypePreprocessor withPattern:@"#.*+$" andScope:rangeScope]; + + // #import + // In xcode it only works for #import and #include, not all preprocessor statements. + [tokenizer addToken:JLTokenTypeString withPattern:@"<.*?>" andScope:preprocessor]; + + // Strings + [[tokenizer addToken:JLTokenTypeString withPattern:@"(\"|@\")[^\"\\n]*(@\"|\")" andScope:rangeScope] addScope:preprocessor]; + + // Numbers + [tokenizer addToken:JLTokenTypeNumber withPattern:@"(?<=\\s)\\d+" andScope:rangeScope]; + + // New literals, for example @[] + // TODO: Literals don't search through multiple lines. Nor does it keep track of nested things. + [[tokenizer addToken:JLTokenTypeNumber withPattern:@"@[\\(|\\{|\\[][^\\(\\{\\[]+[\\)|\\}|\\]]" andScope:rangeScope] setOpaque:NO]; + + // C function names + [[tokenizer addToken:JLTokenTypeOtherMethodNames withPattern:@"\\w+\\s*(?>\\(.*\\)" andScope:rangeScope] setCaptureGroup:1]; + + // Dot notation + [[tokenizer addToken:JLTokenTypeOtherMethodNames withPattern:@"\\.(\\w+)" andScope:rangeScope] setCaptureGroup:1]; + + // Method Calls + [[tokenizer addToken:JLTokenTypeOtherMethodNames withPattern:@"\\[\\w+\\s+(\\w+)\\]" andScope:rangeScope] setCaptureGroup:1]; + + // Method call parts + [[tokenizer addToken:JLTokenTypeOtherMethodNames withPattern:@"(?<=\\w+):\\s*[^\\s;\\]]+" andScope:rangeScope] setCaptureGroup:1]; + + // NS and UI prefixes words + [tokenizer addToken:JLTokenTypeOtherClassNames withPattern:@"(\\b(?>NS|UI))\\w+\\b" andScope:rangeScope]; + + [tokenizer addToken:JLTokenTypeKeyword withPattern:@"(?<=\\b)(?>true|false|yes|no|TRUE|FALSE|bool|BOOL|nil|id|void|self|NULL|if|else|strong|weak|nonatomic|atomic|assign|copy|typedef|enum|auto|break|case|const|char|continue|do|default|double|extern|float|for|goto|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|volatile|while|nonatomic|atomic|nonatomic|readonly|super )(\\b)" andScope:rangeScope]; + [tokenizer addToken:JLTokenTypeKeyword withPattern:@"@[a-zA-Z0-9_]+" andScope:rangeScope]; + + [documentScope addSubscope:rangeScope]; + [documentScope perform]; + + NSURL *descriptionURL = [bundle URLForResource:@"description" withExtension:@"txt"]; + NSMutableString *description = [[NSString alloc] initWithData:[NSData dataWithContentsOfURL:descriptionURL] encoding:NSUTF8StringEncoding].mutableCopy; + NSMutableString *newDescription = [documentScope description].mutableCopy; + + // Remove hexadecimal garbage + NSError *error = nil; + NSRegularExpression *expression = [[NSRegularExpression alloc] initWithPattern:@"0(x|X)[0-9a-fA-F]{7}>" options:0 error:&error]; + [expression replaceMatchesInString:description options:0 range:NSMakeRange(0, description.length) withTemplate:@""]; + [expression replaceMatchesInString:newDescription options:0 range:NSMakeRange(0, newDescription.length) withTemplate:@""]; + + XCTAssertNil(nil, @""); + XCTAssertEqualObjects(description, newDescription, @""); + +} + @end diff --git a/Chromatism/ChromatismTests/bundle.bundle/Root.plist b/Chromatism/ChromatismTests/bundle.bundle/Root.plist new file mode 100644 index 0000000..fa98306 --- /dev/null +++ b/Chromatism/ChromatismTests/bundle.bundle/Root.plist @@ -0,0 +1,61 @@ + + + + + PreferenceSpecifiers + + + Title + Group + Type + PSGroupSpecifier + + + AutocapitalizationType + None + AutocorrectionType + No + DefaultValue + + IsSecure + + Key + name_preference + KeyboardType + Alphabet + Title + Name + Type + PSTextFieldSpecifier + + + DefaultValue + + Key + enabled_preference + Title + Enabled + Type + PSToggleSwitchSpecifier + + + DefaultValue + 0.5 + Key + slider_preference + MaximumValue + 1 + MaximumValueImage + + MinimumValue + 0 + MinimumValueImage + + Type + PSSliderSpecifier + + + StringsTable + Root + + diff --git a/Chromatism/ChromatismTests/bundle.bundle/demo.txt b/Chromatism/ChromatismTests/bundle.bundle/demo.txt new file mode 100644 index 0000000..e487d67 --- /dev/null +++ b/Chromatism/ChromatismTests/bundle.bundle/demo.txt @@ -0,0 +1,55 @@ +// +// AppDelegate.m +// ChromatismDemo +// +// Created by Anviking on 2013-07-31. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import "AppDelegate.h" +#import + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ + self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; + + JLTextViewController *viewController = [[JLTextViewController alloc] init]; + UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController]; + viewController.title = @"Chromatism"; + + self.window.rootViewController = navigationController; + self.window.backgroundColor = [UIColor whiteColor]; + [self.window makeKeyAndVisible]; + return YES; +} + +- (void)applicationWillResignActive:(UIApplication *)application +{ + // 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. + // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. +} + +- (void)applicationDidEnterBackground:(UIApplication *)application +{ + // 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. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. +} + +- (void)applicationWillEnterForeground:(UIApplication *)application +{ + // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. +} + +- (void)applicationDidBecomeActive:(UIApplication *)application +{ + // 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. +} + +- (void)applicationWillTerminate:(UIApplication *)application +{ + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. +} + +@end diff --git a/Chromatism/ChromatismTests/bundle.bundle/description.txt b/Chromatism/ChromatismTests/bundle.bundle/description.txt new file mode 100644 index 0000000..2f26247 --- /dev/null +++ b/Chromatism/ChromatismTests/bundle.bundle/description.txt @@ -0,0 +1,31 @@ +JLScope, (null), nopaque: 1, nindexesSet:[number of indexes: 2466 (in 1 ranges), indexes: (0-2465)], + subscopes, JLTokenPattern, comment, Regex Pattern: /\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/, opaque: 1, indexesSet:(no indexes) + subscopes, + JLScope, (null), nopaque: 1, nindexesSet:[number of indexes: 2466 (in 1 ranges), indexes: (0-2465)], + subscopes, JLTokenPattern, comment, Regex Pattern: //.*+$, opaque: 1, indexesSet:[number of indexes: 1355 (in 14 ranges), indexes: (0-1 3-19 21-38 40-41 43-80 82-134 136-137 923-1199 1205-1351 1429-1639 1645-1777 1856-2004 2079-2264 2337-2456)] + subscopes, + JLTokenPattern, preprocessor, Regex Pattern: #.*+$, opaque: 1, indexesSet:[number of indexes: 56 (in 2 ranges), indexes: (140-162 164-196)] + subscopes, JLTokenPattern, string, Regex Pattern: <.*?>, opaque: 1, indexesSet:[number of indexes: 25 (in 1 ranges), indexes: (172-196)] + subscopes, + JLTokenPattern, (null), Regex Pattern: ("|@")[^"\n]*(@"|"), opaque: 1, indexesSet:[number of indexes: 15 (in 1 ranges), indexes: (148-162)] + subscopes, + JLTokenPattern, string, Regex Pattern: ("|@")[^"\n]*(@"|"), opaque: 1, indexesSet:[number of indexes: 13 (in 1 ranges), indexes: (661-673)] + subscopes, + JLTokenPattern, number, Regex Pattern: (?<=\s)\d+, opaque: 1, indexesSet:(no indexes) + subscopes, + JLTokenPattern, number, Regex Pattern: @[\(|\{|\[][^\(\{\[]+[\)|\}|\]], opaque: 0, indexesSet:(no indexes) + subscopes, + JLTokenPattern, other_method_names, Regex Pattern: \w+\s*(?>\(.*\), opaque: 1, indexesSet:(no indexes) + subscopes, + JLTokenPattern, other_method_names, Regex Pattern: \.(\w+), opaque: 1, indexesSet:[number of indexes: 62 (in 7 ranges), indexes: (348-353 653-657 690-695 697-714 749-754 756-770 806-811)] + subscopes, + JLTokenPattern, other_method_names, Regex Pattern: \[\w+\s+(\w+)\], opaque: 1, indexesSet:[number of indexes: 35 (in 5 ranges), indexes: (368-372 400-409 493-497 583-587 783-792)] + subscopes, + JLTokenPattern, other_method_names, Regex Pattern: (?<=\w+):\s*[^\s;\]]+, opaque: 1, indexesSet:(no indexes) + subscopes, + JLTokenPattern, other_class_names, Regex Pattern: (\b(?>NS|UI))\w+\b, opaque: 1, indexesSet:[number of indexes: 157 (in 12 ranges), indexes: (249-261 308-319 359-366 391-398 511-532 560-581 775-781 889-901 1395-1407 1822-1834 2045-2057 2303-2315)] + subscopes, + JLTokenPattern, keyword, Regex Pattern: (?<=\b)(?>true|false|yes|no|TRUE|FALSE|bool|BOOL|nil|id|void|self|NULL|if|else|strong|weak|nonatomic|atomic|assign|copy|typedef|enum|auto|break|case|const|char|continue|do|default|double|extern|float|for|goto|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|volatile|while|nonatomic|atomic|nonatomic|readonly|super )(\b), opaque: 1, indexesSet:[number of indexes: 46 (in 11 ranges), indexes: (231-234 343-346 685-688 744-747 801-804 837-842 855-858 1359-1362 1785-1788 2012-2015 2272-2275)] + subscopes, + JLTokenPattern, keyword, Regex Pattern: @[a-zA-Z0-9_]+, opaque: 1, indexesSet:[number of indexes: 19 (in 2 ranges), indexes: (199-213 2461-2464)] + subscopes, \ No newline at end of file diff --git a/Chromatism/ChromatismTests/bundle.bundle/en.lproj/Root.strings b/Chromatism/ChromatismTests/bundle.bundle/en.lproj/Root.strings new file mode 100644 index 0000000000000000000000000000000000000000..8cd87b9d6b20c1fbf87bd4db3db267fca5ad4df9 GIT binary patch literal 546 zcmaixOHRW;5JYRuDMndFh#Ua1V1d}N;sVAV2TO?uC3a9aJn*VxFrY}tnon0(S66#J z-d9>G>6W!ur(SDqlp`9nn~*(m%iWnv?yq`Qfp6XbK1?+om~~#r)ZnhkYQU_VbfjuT zHNn`CX<0sd*m1A}>&5sU$akD=GTXJ1e literal 0 HcmV?d00001 From 86361355c99f720563d0220abf68c0b46207fdaf Mon Sep 17 00:00:00 2001 From: Anviking Date: Wed, 31 Jul 2013 18:21:55 +0200 Subject: [PATCH 059/140] =?UTF-8?q?Added=20=E2=80=9D^=E2=80=9D=20to=20prep?= =?UTF-8?q?rocessor=20pattern?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Chromatism/Chromatism/JLTokenizer.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index e6a8b0e..fed9313 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -171,7 +171,7 @@ - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range [self addToken:JLTokenTypeComment withPattern:@"//.*+$" andScope:rangeScope]; // Preprocessor macros - JLTokenPattern *preprocessor = [self addToken:JLTokenTypePreprocessor withPattern:@"#.*+$" andScope:rangeScope]; + JLTokenPattern *preprocessor = [self addToken:JLTokenTypePreprocessor withPattern:@"^#.*+$" andScope:rangeScope]; // #import // In xcode it only works for #import and #include, not all preprocessor statements. From 430468fffd1500276c854bb0db79c3c6ac315c93 Mon Sep 17 00:00:00 2001 From: Anviking Date: Wed, 31 Jul 2013 19:02:40 +0200 Subject: [PATCH 060/140] Optimized regex patterns --- Chromatism/Chromatism/JLTokenizer.m | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index fed9313..1a38ddf 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -199,12 +199,12 @@ - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range // Method call parts [[self addToken:JLTokenTypeOtherMethodNames withPattern:@"(?<=\\w+):\\s*[^\\s;\\]]+" andScope:rangeScope] setCaptureGroup:1]; - // NS and UI prefixes words - [self addToken:JLTokenTypeOtherClassNames withPattern:@"(\\b(?>NS|UI))\\w+\\b" andScope:rangeScope]; - - [self addToken:JLTokenTypeKeyword withPattern:@"(?<=\\b)(?>true|false|yes|no|TRUE|FALSE|bool|BOOL|nil|id|void|self|NULL|if|else|strong|weak|nonatomic|atomic|assign|copy|typedef|enum|auto|break|case|const|char|continue|do|default|double|extern|float|for|goto|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|volatile|while|nonatomic|atomic|nonatomic|readonly|super )(\\b)" andScope:rangeScope]; + [self addToken:JLTokenTypeKeyword withPattern:@"\\b(true|false|yes|no|TRUE|FALSE|bool|BOOL|nil|id|void|self|NULL|if|else|strong|weak|nonatomic|atomic|assign|copy|typedef|enum|auto|break|case|const|char|continue|do|default|double|extern|float|for|goto|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|volatile|while|nonatomic|atomic|nonatomic|readonly|super)\\b" andScope:rangeScope]; [self addToken:JLTokenTypeKeyword withPattern:@"@[a-zA-Z0-9_]+" andScope:rangeScope]; + // Other Class Names + [self addToken:JLTokenTypeOtherClassNames withPattern:@"\\b[A-Z]{3}[a-zA-Z]*\\b" andScope:rangeScope]; + [documentScope addSubscope:rangeScope]; [documentScope perform]; NSLog(@"Chromatism done tokenizing with time of %fms",ABS([date timeIntervalSinceNow]*1000)); From d9018015537213826b73a3739cda4712ad1ad8fd Mon Sep 17 00:00:00 2001 From: Anviking Date: Wed, 31 Jul 2013 20:49:01 +0200 Subject: [PATCH 061/140] Lets do performance testing and user a longer demo text --- Chromatism/Chromatism/JLTokenizer.m | 7 +- Chromatism/ChromatismTests/JLTokenizerTests.m | 51 + .../ChromatismTests/bundle.bundle/demo.txt | 957 +++++++++++++++++- .../bundle.bundle/description.txt | 34 +- 4 files changed, 1000 insertions(+), 49 deletions(-) diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index 1a38ddf..4fd5465 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -135,7 +135,10 @@ - (void)textStorage:(NSTextStorage *)textStorage willProcessEditing:(NSTextStora - (void)textStorage:(NSTextStorage *)textStorage didProcessEditing:(NSTextStorageEditActions)editedMask range:(NSRange)editedRange changeInLength:(NSInteger)delta { + // Measure performance + NSDate *date = [NSDate date]; [self tokenizeTextStorage:textStorage withRange:[textStorage.string lineRangeForRange:editedRange]]; + NSLog(@"Chromatism done tokenizing with time of %fms",ABS([date timeIntervalSinceNow]*1000)); } #pragma mark - Tokenizing @@ -157,9 +160,6 @@ - (JLTokenPattern *)addToken:(NSString *)type withPattern:(NSString *)pattern an - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range { - // Measure performance - NSDate *date = [NSDate date]; - // First, remove old attributes [self clearColorAttributesInRange:range textStorage:storage]; @@ -207,7 +207,6 @@ - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range [documentScope addSubscope:rangeScope]; [documentScope perform]; - NSLog(@"Chromatism done tokenizing with time of %fms",ABS([date timeIntervalSinceNow]*1000)); } - (NSMutableAttributedString *)tokenizeString:(NSString *)string withDefaultAttributes:(NSDictionary *)attributes; diff --git a/Chromatism/ChromatismTests/JLTokenizerTests.m b/Chromatism/ChromatismTests/JLTokenizerTests.m index 19d0f91..303a37f 100644 --- a/Chromatism/ChromatismTests/JLTokenizerTests.m +++ b/Chromatism/ChromatismTests/JLTokenizerTests.m @@ -131,4 +131,55 @@ - (void)testDemoTextDescription } +- (NSTimeInterval)timeOfTokenizingString:(NSString *)string multiplied:(NSInteger)multiplier +{ + string = [string stringByPaddingToLength:(string.length * multiplier) withString:string startingAtIndex:0]; + NSTextStorage *storage = [[NSTextStorage alloc] initWithString:string]; + NSDate *date = [NSDate date]; + [tokenizer tokenizeTextStorage:storage withRange:NSMakeRange(0, string.length)]; + return ABS([date timeIntervalSinceNow]); +} + +- (NSTimeInterval)timeOfTokenizingString:(NSString *)string range:(NSRange)range multiplied:(NSInteger)multiplier +{ + string = [string stringByPaddingToLength:(string.length * multiplier) withString:string startingAtIndex:0]; + NSTextStorage *storage = [[NSTextStorage alloc] initWithString:string]; + NSDate *date = [NSDate date]; + [tokenizer tokenizeTextStorage:storage withRange:range]; + return ABS([date timeIntervalSinceNow]); +} + +/* +- (void)testAndPlotLater +{ + NSBundle *bundle = [NSBundle bundleForClass:[self class]]; + NSURL *URL = [bundle URLForResource:@"demo" withExtension:@"txt"]; + NSString *string = [[NSString alloc] initWithData:[NSData dataWithContentsOfURL:URL] encoding:NSUTF8StringEncoding]; + NSMutableString *result = [[NSMutableString alloc] init]; + for (int i = 1; i<50; i++) { + NSTimeInterval interval = [self timeOfTokenizingString:string multiplied:i]; + [result appendFormat:@"%f,",interval]; + } + NSLog(@"Result:%@",result); +} + */ + +- (void)testLargeFilePerformance +{ + NSBundle *bundle = [NSBundle bundleForClass:[self class]]; + NSURL *URL = [bundle URLForResource:@"demo" withExtension:@"txt"]; + NSString *string = [[NSString alloc] initWithData:[NSData dataWithContentsOfURL:URL] encoding:NSUTF8StringEncoding]; + NSTimeInterval interval = [self timeOfTokenizingString:string multiplied:10]; + NSLog(@"\n\nLarge file tokenizing: %fms\n\n", interval*1000); +} + +- (void)testSmallEditPerformance +{ + NSBundle *bundle = [NSBundle bundleForClass:[self class]]; + NSURL *URL = [bundle URLForResource:@"demo" withExtension:@"txt"]; + NSString *string = [[NSString alloc] initWithData:[NSData dataWithContentsOfURL:URL] encoding:NSUTF8StringEncoding]; + NSTimeInterval interval = [self timeOfTokenizingString:string range:[string lineRangeForRange:NSMakeRange(500, 5)] multiplied:1]; + NSLog(@"\n\nLine edit Performance: %fms\n\n", interval*1000); +} + @end diff --git a/Chromatism/ChromatismTests/bundle.bundle/demo.txt b/Chromatism/ChromatismTests/bundle.bundle/demo.txt index e487d67..482a0e1 100644 --- a/Chromatism/ChromatismTests/bundle.bundle/demo.txt +++ b/Chromatism/ChromatismTests/bundle.bundle/demo.txt @@ -1,55 +1,956 @@ // -// AppDelegate.m -// ChromatismDemo +// RKObjectManager.m +// RestKit // -// Created by Anviking on 2013-07-31. -// Copyright (c) 2013 Anviking. All rights reserved. +// Created by Jeremy Ellison on 8/14/09. +// Copyright (c) 2009-2012 RestKit. All rights reserved. // +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#import +#import "RKObjectManager.h" +#import "RKObjectParameterization.h" +#import "RKManagedObjectStore.h" +#import "RKRequestDescriptor.h" +#import "RKResponseDescriptor.h" +#import "RKDictionaryUtilities.h" +#import "RKMIMETypes.h" +#import "RKLog.h" +#import "RKMIMETypeSerialization.h" +#import "RKPathMatcher.h" +#import "RKMappingErrors.h" +#import "RKPaginator.h" +#import "RKDynamicMapping.h" +#import "RKRelationshipMapping.h" + +#if !__has_feature(objc_arc) +#error RestKit must be built with ARC. +// You can turn on ARC for only RestKit files by adding "-fobjc-arc" to the build phase for each of its files. +#endif + +////////////////////////////////// +// Shared Instance + +static RKObjectManager *sharedManager = nil; -#import "AppDelegate.h" -#import +////////////////////////////////// +// Utility Functions -@implementation AppDelegate +/** + Returns the subset of the given array of `RKResponseDescriptor` objects that match the given path. + + @param responseDescriptors An array of `RKResponseDescriptor` objects. + @param path The path for which to select matching response descriptors. + @param method The method for which to select matching response descriptors. + @return An `NSArray` object whose elements are `RKResponseDescriptor` objects matching the given path and method. + */ +static NSArray *RKFilteredArrayOfResponseDescriptorsMatchingPathAndMethod(NSArray *responseDescriptors, NSString *path, RKRequestMethod method) +{ + NSIndexSet *indexSet = [responseDescriptors indexesOfObjectsPassingTest:^BOOL(RKResponseDescriptor *responseDescriptor, NSUInteger idx, BOOL *stop) { + return [responseDescriptor matchesPath:path] && (method & responseDescriptor.method); + }]; + return [responseDescriptors objectsAtIndexes:indexSet]; +} -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +/** + Returns the first `RKRequestDescriptor` object from the given array that matches the given object. + + @param requestDescriptors An array of `RKRequestDescriptor` objects. + @param object The object to find a matching request descriptor for. + @return An `RKRequestDescriptor` object matching the given object, or `nil` if none could be found. + */ +RKRequestDescriptor *RKRequestDescriptorFromArrayMatchingObjectAndRequestMethod(NSArray *requestDescriptors, id object, RKRequestMethod requestMethod); +RKRequestDescriptor *RKRequestDescriptorFromArrayMatchingObjectAndRequestMethod(NSArray *requestDescriptors, id object, RKRequestMethod requestMethod) { - self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; + Class searchClass = [object class]; + do { + for (RKRequestDescriptor *requestDescriptor in requestDescriptors) { + if ([requestDescriptor.objectClass isEqual:searchClass] && (requestMethod == requestDescriptor.method)) return requestDescriptor; + } + + for (RKRequestDescriptor *requestDescriptor in requestDescriptors) { + if ([requestDescriptor.objectClass isEqual:searchClass] && (requestMethod & requestDescriptor.method)) return requestDescriptor; + } + searchClass = [searchClass superclass]; + } while (searchClass); - JLTextViewController *viewController = [[JLTextViewController alloc] init]; - UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController]; - viewController.title = @"Chromatism"; + return nil; +} + +extern NSString *RKStringDescribingRequestMethod(RKRequestMethod method); + +@interface RKObjectParameters : NSObject + +@property (nonatomic, strong) NSMutableDictionary *parameters; +- (void)addParameters:(NSDictionary *)serialization atRootKeyPath:(NSString *)rootKeyPath inArray:(BOOL)inArray; + +@end + +@implementation RKObjectParameters + +- (id)init +{ + self = [super init]; + if (self) { + self.parameters = [NSMutableDictionary new]; + } + return self; +} + +- (void)addParameters:(NSDictionary *)parameters atRootKeyPath:(NSString *)rootKeyPath inArray:(BOOL)inArray +{ + id rootKey = rootKeyPath ?: [NSNull null]; + id nonNestedParameters = rootKeyPath ? [parameters objectForKey:rootKeyPath] : parameters; + id value = [self.parameters objectForKey:rootKey]; + if (value) { + if ([value isKindOfClass:[NSMutableArray class]]) { + [value addObject:nonNestedParameters]; + } else if ([value isKindOfClass:[NSDictionary class]]) { + NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:value, nonNestedParameters, nil]; + [self.parameters setObject:mutableArray forKey:rootKey]; + } else { + [NSException raise:NSInvalidArgumentException format:@"Unexpected argument of type '%@': expected an NSDictionary or NSArray.", [value class]]; + } + } else { + [self.parameters setObject:(inArray ? @[ nonNestedParameters ] : nonNestedParameters) forKey:rootKey]; + } +} + +- (id)requestParameters +{ + if ([self.parameters count] == 0) return nil; + id valueAtNullKey = [self.parameters objectForKey:[NSNull null]]; + if (valueAtNullKey) { + if ([self.parameters count] == 1) return valueAtNullKey; + + // If we have values at `[NSNull null]` and other key paths, we have an invalid configuration + [NSException raise:NSInvalidArgumentException format:@"Invalid request descriptor configuration: The request descriptors specify that multiple objects be serialized at incompatible key paths. Cannot serialize objects at the `nil` root key path in the same request as objects with a non-nil root key path. Please check your request descriptors and try again."]; + } + return self.parameters; +} + +@end + +/** + Visits all mappings accessible via relationships or dynamic mapping in an object graph starting from a given mapping. + */ +@interface RKMappingGraphVisitor : NSObject + +@property (nonatomic, readonly) NSSet *mappings; + +- (id)initWithMapping:(RKMapping *)mapping; + +@end + +@interface RKMappingGraphVisitor () +@property (nonatomic, readwrite) NSMutableSet *mutableMappings; +@end + +@implementation RKMappingGraphVisitor + +- (id)initWithMapping:(RKMapping *)mapping +{ + self = [super init]; + if (self) { + self.mutableMappings = [NSMutableSet set]; + [self visitMapping:mapping]; + } + return self; +} + +- (NSSet *)mappings +{ + return self.mutableMappings; +} + +- (void)visitMapping:(RKMapping *)mapping +{ + if ([self.mappings containsObject:mapping]) return; + [self.mutableMappings addObject:mapping]; - self.window.rootViewController = navigationController; - self.window.backgroundColor = [UIColor whiteColor]; - [self.window makeKeyAndVisible]; - return YES; + if ([mapping isKindOfClass:[RKDynamicMapping class]]) { + RKDynamicMapping *dynamicMapping = (RKDynamicMapping *)mapping; + for (RKMapping *nestedMapping in dynamicMapping.objectMappings) { + [self visitMapping:nestedMapping]; + } + } else if ([mapping isKindOfClass:[RKObjectMapping class]]) { + RKObjectMapping *objectMapping = (RKObjectMapping *)mapping; + for (RKRelationshipMapping *relationshipMapping in objectMapping.relationshipMappings) { + [self visitMapping:relationshipMapping.mapping]; + } + } } -- (void)applicationWillResignActive:(UIApplication *)application +@end + +/** + Returns `YES` if the given array of `RKResponseDescriptor` objects contains an `RKEntityMapping` anywhere in its object graph. + + @param responseDescriptors An array of `RKResponseDescriptor` objects. + @return `YES` if the `mapping` property of any of the response descriptor objects in the given array is an instance of `RKEntityMapping`, else `NO`. + */ +static BOOL RKDoesArrayOfResponseDescriptorsContainEntityMapping(NSArray *responseDescriptors) { - // 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. - // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. + // Visit all mappings accessible from the object graphs of all response descriptors + NSMutableSet *accessibleMappings = [NSMutableSet set]; + for (RKResponseDescriptor *responseDescriptor in responseDescriptors) { + if (! [accessibleMappings containsObject:responseDescriptor.mapping]) { + RKMappingGraphVisitor *graphVisitor = [[RKMappingGraphVisitor alloc] initWithMapping:responseDescriptor.mapping]; + [accessibleMappings unionSet:graphVisitor.mappings]; + } + } + + // Enumerate all mappings and search for an `RKEntityMapping` + for (RKMapping *mapping in accessibleMappings) { + if ([mapping isKindOfClass:[RKEntityMapping class]]) { + return YES; + } + + if ([mapping isKindOfClass:[RKDynamicMapping class]]) { + RKDynamicMapping *dynamicMapping = (RKDynamicMapping *)mapping; + if ([dynamicMapping.objectMappings count] == 0) { + // Likely means that there is a representation block, assume `YES` + return YES; + } + } + } + + return NO; } -- (void)applicationDidEnterBackground:(UIApplication *)application +BOOL RKDoesArrayOfResponseDescriptorsContainOnlyEntityMappings(NSArray *responseDescriptors); +BOOL RKDoesArrayOfResponseDescriptorsContainOnlyEntityMappings(NSArray *responseDescriptors) { - // 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. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + // Visit all mappings accessible from the object graphs of all response descriptors + NSMutableSet *accessibleMappings = [NSMutableSet set]; + for (RKResponseDescriptor *responseDescriptor in responseDescriptors) { + if (! [accessibleMappings containsObject:responseDescriptor.mapping]) { + RKMappingGraphVisitor *graphVisitor = [[RKMappingGraphVisitor alloc] initWithMapping:responseDescriptor.mapping]; + [accessibleMappings unionSet:graphVisitor.mappings]; + } + } + + NSMutableSet *mappingClasses = [NSMutableSet set]; + // Enumerate all mappings and search for an `RKEntityMapping` + for (RKMapping *mapping in accessibleMappings) { + if ([mapping isKindOfClass:[RKDynamicMapping class]]) { + [mappingClasses addObjectsFromArray:[[(RKDynamicMapping *)mapping objectMappings] valueForKey:@"class"]]; + } else { + [mappingClasses addObject:mapping.class]; + } + } + + if ([mappingClasses count]) { + for (Class mappingClass in mappingClasses) { + if (! [mappingClass isSubclassOfClass:[RKEntityMapping class]]) { + return NO; + } + } + return YES; + } + + return NO; } -- (void)applicationWillEnterForeground:(UIApplication *)application +static BOOL RKDoesArrayOfResponseDescriptorsContainMappingForClass(NSArray *responseDescriptors, Class classToBeMapped) { - // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. + // Visit all mappings accessible from the object graphs of all response descriptors + NSMutableSet *accessibleMappings = [NSMutableSet set]; + for (RKResponseDescriptor *responseDescriptor in responseDescriptors) { + if (! [accessibleMappings containsObject:responseDescriptor.mapping]) { + RKMappingGraphVisitor *graphVisitor = [[RKMappingGraphVisitor alloc] initWithMapping:responseDescriptor.mapping]; + [accessibleMappings unionSet:graphVisitor.mappings]; + } + } + + // Enumerate all mappings and search for a mapping matching the class + for (RKMapping *mapping in accessibleMappings) { + if ([mapping isKindOfClass:[RKObjectMapping class]]) { + if ([[(RKObjectMapping *)mapping objectClass] isSubclassOfClass:classToBeMapped]) return YES; + } + + if ([mapping isKindOfClass:[RKDynamicMapping class]]) { + RKDynamicMapping *dynamicMapping = (RKDynamicMapping *)mapping; + for (RKObjectMapping *mapping in dynamicMapping.objectMappings) { + if ([[(RKObjectMapping *)mapping objectClass] isSubclassOfClass:classToBeMapped]) return YES; + } + } + } + + return NO; } -- (void)applicationDidBecomeActive:(UIApplication *)application +static NSString *RKMIMETypeFromAFHTTPClientParameterEncoding(AFHTTPClientParameterEncoding encoding) { - // 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. + switch (encoding) { + case AFFormURLParameterEncoding: + return RKMIMETypeFormURLEncoded; + break; + + case AFJSONParameterEncoding: + return RKMIMETypeJSON; + break; + + case AFPropertyListParameterEncoding: + break; + + default: + RKLogWarning(@"RestKit is unable to infer the appropriate request serialization MIME Type from an `AFHTTPClientParameterEncoding` value of %d: defaulting to `RKMIMETypeFormURLEncoded`", encoding); + break; + } + + return RKMIMETypeFormURLEncoded; } -- (void)applicationWillTerminate:(UIApplication *)application +@interface AFHTTPClient () +@property (readonly, nonatomic, strong) NSURLCredential *defaultCredential; +@end + +/////////////////////////////////// + +@interface RKObjectManager () +@property (nonatomic, strong) NSMutableArray *mutableRequestDescriptors; +@property (nonatomic, strong) NSMutableArray *mutableResponseDescriptors; +@property (nonatomic, strong) NSMutableArray *mutableFetchRequestBlocks; +@property (nonatomic, strong) NSMutableArray *registeredHTTPRequestOperationClasses; +@property (nonatomic, strong) NSMutableArray *registeredObjectRequestOperationClasses; +@property (nonatomic, strong) NSMutableArray *registeredManagedObjectRequestOperationClasses; + +@end + +@implementation RKObjectManager + +- (id)initWithHTTPClient:(AFHTTPClient *)client +{ + self = [super init]; + if (self) { + self.HTTPClient = client; + self.router = [[RKRouter alloc] initWithBaseURL:client.baseURL]; + self.operationQueue = [NSOperationQueue new]; + self.mutableRequestDescriptors = [NSMutableArray new]; + self.mutableResponseDescriptors = [NSMutableArray new]; + self.mutableFetchRequestBlocks = [NSMutableArray new]; + self.registeredHTTPRequestOperationClasses = [NSMutableArray new]; + self.registeredManagedObjectRequestOperationClasses = [NSMutableArray new]; + self.registeredObjectRequestOperationClasses = [NSMutableArray new]; + self.requestSerializationMIMEType = RKMIMETypeFromAFHTTPClientParameterEncoding(client.parameterEncoding); + + // Set shared manager if nil + if (nil == sharedManager) { + [RKObjectManager setSharedManager:self]; + } + } + + return self; +} + ++ (instancetype)sharedManager +{ + return sharedManager; +} + ++ (void)setSharedManager:(RKObjectManager *)manager +{ + sharedManager = manager; +} + ++ (RKObjectManager *)managerWithBaseURL:(NSURL *)baseURL +{ + RKObjectManager *manager = [[self alloc] initWithHTTPClient:[AFHTTPClient clientWithBaseURL:baseURL]]; + [manager.HTTPClient registerHTTPOperationClass:[AFJSONRequestOperation class]]; + [manager setAcceptHeaderWithMIMEType:RKMIMETypeJSON]; + manager.requestSerializationMIMEType = RKMIMETypeFormURLEncoded; + return manager; +} + +- (void)setAcceptHeaderWithMIMEType:(NSString *)MIMEType; +{ + [self.HTTPClient setDefaultHeader:@"Accept" value:MIMEType]; +} + +- (NSURL *)baseURL +{ + return self.HTTPClient.baseURL; +} + +- (NSDictionary *)defaultHeaders { - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + return self.HTTPClient.defaultHeaders; +} + +#pragma mark - Building Requests + +/** + This method is the `RKObjectManager` analog for the method of the same name on `AFHTTPClient`. + */ +- (NSMutableURLRequest *)requestWithMethod:(NSString *)method + path:(NSString *)path + parameters:(NSDictionary *)parameters +{ + NSMutableURLRequest* request; + if (parameters && !([method isEqualToString:@"GET"] || [method isEqualToString:@"HEAD"] || [method isEqualToString:@"DELETE"])) { + // NOTE: If the HTTP client has been subclasses, then the developer may be trying to perform signing on the request + NSDictionary *parametersForClient = [self.HTTPClient isMemberOfClass:[AFHTTPClient class]] ? nil : parameters; + request = [self.HTTPClient requestWithMethod:method path:path parameters:parametersForClient]; + + NSError *error = nil; + NSString *charset = (__bridge NSString *)CFStringConvertEncodingToIANACharSetName(CFStringConvertNSStringEncodingToEncoding(self.HTTPClient.stringEncoding)); + [request setValue:[NSString stringWithFormat:@"%@; charset=%@", self.requestSerializationMIMEType, charset] forHTTPHeaderField:@"Content-Type"]; + NSData *requestBody = [RKMIMETypeSerialization dataFromObject:parameters MIMEType:self.requestSerializationMIMEType error:&error]; + [request setHTTPBody:requestBody]; + } else { + request = [self.HTTPClient requestWithMethod:method path:path parameters:parameters]; + } + + return request; +} + +- (NSMutableURLRequest *)requestWithPathForRouteNamed:(NSString *)routeName + object:(id)object + parameters:(NSDictionary *)parameters +{ + RKRequestMethod method; + NSURL *URL = [self.router URLForRouteNamed:routeName method:&method object:object]; + NSAssert(URL, @"No route found named '%@'", routeName); + return [self requestWithMethod:RKStringFromRequestMethod(method) path:[URL relativeString] parameters:parameters]; +} + +- (NSMutableURLRequest *)requestWithPathForRelationship:(NSString *)relationship + ofObject:(id)object + method:(RKRequestMethod)method + parameters:(NSDictionary *)parameters +{ + NSURL *URL = [self.router URLForRelationship:relationship ofObject:object method:method]; + NSAssert(URL, @"No relationship route found for the '%@' class with the name '%@'", NSStringFromClass([object class]), relationship); + return [self requestWithMethod:RKStringFromRequestMethod(method) path:[URL relativeString] parameters:parameters]; +} + +- (id)mergedParametersWithObject:(id)object method:(RKRequestMethod)method parameters:(NSDictionary *)parameters +{ + NSArray *objectsToParameterize = ([object isKindOfClass:[NSArray class]] || object == nil) ? object : @[ object ]; + RKObjectParameters *objectParameters = [RKObjectParameters new]; + for (id objectToParameterize in objectsToParameterize) { + RKRequestDescriptor *requestDescriptor = RKRequestDescriptorFromArrayMatchingObjectAndRequestMethod(self.requestDescriptors, objectToParameterize, method); + if ((method != RKRequestMethodGET && method != RKRequestMethodDELETE) && requestDescriptor) { + NSError *error = nil; + NSDictionary *parametersForObject = [RKObjectParameterization parametersWithObject:objectToParameterize requestDescriptor:requestDescriptor error:&error]; + if (error) { + RKLogError(@"Object parameterization failed while building %@ request for object '%@': %@", RKStringFromRequestMethod(method), objectToParameterize, error); + return nil; + } + // Ensure that a single object inputted as an array is emitted as an array when serialized + BOOL inArray = ([object isKindOfClass:[NSArray class]] && [object count] == 1); + [objectParameters addParameters:parametersForObject atRootKeyPath:requestDescriptor.rootKeyPath inArray:inArray]; + } + } + id requestParameters = [objectParameters requestParameters]; + + // Merge the extra parameters if possible + if ([requestParameters isKindOfClass:[NSArray class]] && parameters) { + [NSException raise:NSInvalidArgumentException format:@"Cannot merge parameters with array of object representations serialized with a nil root key path."]; + } else if (requestParameters && parameters) { + requestParameters = RKDictionaryByMergingDictionaryWithDictionary(requestParameters, parameters); + } else if (parameters && !requestParameters) { + requestParameters = parameters; + } + + return requestParameters; +} + +- (NSMutableURLRequest *)requestWithObject:(id)object + method:(RKRequestMethod)method + path:(NSString *)path + parameters:(NSDictionary *)parameters; +{ + NSString *requestPath = (path) ? path : [[self.router URLForObject:object method:method] relativeString]; + id requestParameters = [self mergedParametersWithObject:object method:method parameters:parameters]; + return [self requestWithMethod:RKStringFromRequestMethod(method) path:requestPath parameters:requestParameters]; +} + +- (NSMutableURLRequest *)multipartFormRequestWithObject:(id)object + method:(RKRequestMethod)method + path:(NSString *)path + parameters:(NSDictionary *)parameters + constructingBodyWithBlock:(void (^)(id formData))block +{ + NSString *requestPath = (path) ? path : [[self.router URLForObject:object method:method] relativeString]; + id requestParameters = [self mergedParametersWithObject:object method:method parameters:parameters]; + NSMutableURLRequest *multipartRequest = [self.HTTPClient multipartFormRequestWithMethod:RKStringFromRequestMethod(method) + path:requestPath + parameters:requestParameters + constructingBodyWithBlock:block]; + return multipartRequest; +} + +#pragma mark - Registering Subclasses + +- (BOOL)registerRequestOperationClass:(Class)operationClass +{ + if ([operationClass isSubclassOfClass:[RKManagedObjectRequestOperation class]]) { + [self.registeredManagedObjectRequestOperationClasses removeObject:operationClass]; + [self.registeredManagedObjectRequestOperationClasses insertObject:operationClass atIndex:0]; + return YES; + } else if ([operationClass isSubclassOfClass:[RKObjectRequestOperation class]]) { + [self.registeredObjectRequestOperationClasses removeObject:operationClass]; + [self.registeredObjectRequestOperationClasses insertObject:operationClass atIndex:0]; + return YES; + } else if ([operationClass isSubclassOfClass:[RKHTTPRequestOperation class]]) { + [self.registeredHTTPRequestOperationClasses removeObject:operationClass]; + [self.registeredHTTPRequestOperationClasses insertObject:operationClass atIndex:0]; + return YES; + } + + return NO; +} + +- (void)unregisterRequestOperationClass:(Class)operationClass +{ + [self.registeredHTTPRequestOperationClasses removeObject:operationClass]; + [self.registeredObjectRequestOperationClasses removeObject:operationClass]; + [self.registeredManagedObjectRequestOperationClasses removeObject:operationClass]; +} + +- (Class)requestOperationClassForRequest:(NSURLRequest *)request fromRegisteredClasses:(NSArray *)registeredClasses +{ + Class requestOperationClass = nil; + NSEnumerator *enumerator = [registeredClasses reverseObjectEnumerator]; + while (requestOperationClass = [enumerator nextObject]) { + if ([requestOperationClass canProcessRequest:request]) break; + requestOperationClass = nil; + } + return requestOperationClass; +} + +#pragma mark - Object Request Operations + +- (void)copyStateFromHTTPClientToHTTPRequestOperation:(AFHTTPRequestOperation *)operation +{ + operation.credential = self.HTTPClient.defaultCredential; + operation.allowsInvalidSSLCertificate = self.HTTPClient.allowsInvalidSSLCertificate; +#ifdef _AFNETWORKING_PIN_SSL_CERTIFICATES_ + operation.SSLPinningMode = self.HTTPClient.defaultSSLPinningMode; +#endif +} + +- (RKObjectRequestOperation *)objectRequestOperationWithRequest:(NSURLRequest *)request + success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success + failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure +{ + Class HTTPRequestOperationClass = [self requestOperationClassForRequest:request fromRegisteredClasses:self.registeredHTTPRequestOperationClasses] ?: [RKHTTPRequestOperation class]; + RKHTTPRequestOperation *HTTPRequestOperation = [[HTTPRequestOperationClass alloc] initWithRequest:request]; + [self copyStateFromHTTPClientToHTTPRequestOperation:HTTPRequestOperation]; + Class objectRequestOperationClass = [self requestOperationClassForRequest:request fromRegisteredClasses:self.registeredObjectRequestOperationClasses] ?: [RKObjectRequestOperation class]; + RKObjectRequestOperation *operation = [[objectRequestOperationClass alloc] initWithHTTPRequestOperation:HTTPRequestOperation responseDescriptors:self.responseDescriptors]; + [operation setCompletionBlockWithSuccess:success failure:failure]; + return operation; +} + +- (RKManagedObjectRequestOperation *)managedObjectRequestOperationWithRequest:(NSURLRequest *)request + managedObjectContext:(NSManagedObjectContext *)managedObjectContext + success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success + failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure +{ + Class HTTPRequestOperationClass = [self requestOperationClassForRequest:request fromRegisteredClasses:self.registeredHTTPRequestOperationClasses] ?: [RKHTTPRequestOperation class]; + RKHTTPRequestOperation *HTTPRequestOperation = [[HTTPRequestOperationClass alloc] initWithRequest:request]; + [self copyStateFromHTTPClientToHTTPRequestOperation:HTTPRequestOperation]; + Class objectRequestOperationClass = [self requestOperationClassForRequest:request fromRegisteredClasses:self.registeredManagedObjectRequestOperationClasses] ?: [RKManagedObjectRequestOperation class]; + RKManagedObjectRequestOperation *operation = (RKManagedObjectRequestOperation *)[[objectRequestOperationClass alloc] initWithHTTPRequestOperation:HTTPRequestOperation responseDescriptors:self.responseDescriptors]; + [operation setCompletionBlockWithSuccess:success failure:failure]; + operation.managedObjectContext = managedObjectContext ?: self.managedObjectStore.mainQueueManagedObjectContext; + operation.managedObjectCache = self.managedObjectStore.managedObjectCache; + operation.fetchRequestBlocks = self.fetchRequestBlocks; + return operation; +} + +- (id)appropriateObjectRequestOperationWithObject:(id)object + method:(RKRequestMethod)method + path:(NSString *)path + parameters:(NSDictionary *)parameters +{ + RKObjectRequestOperation *operation = nil; + NSURLRequest *request = [self requestWithObject:object method:method path:path parameters:parameters]; + NSDictionary *routingMetadata = nil; + if (! path) { + RKRoute *route = [self.router.routeSet routeForObject:object method:method]; + NSDictionary *interpolatedParameters = nil; + NSURL *URL = [self URLWithRoute:route object:object interpolatedParameters:&interpolatedParameters]; + if (! URL) { + RKLogError(@"Failed to construct a URL from the provided object. Returning nil."); + return operation; + } + path = [URL relativeString]; + routingMetadata = @{ @"routing": @{ @"parameters": interpolatedParameters, @"route": route } }; + } + + NSArray *matchingDescriptors = RKFilteredArrayOfResponseDescriptorsMatchingPathAndMethod(self.responseDescriptors, path, method); + BOOL containsEntityMapping = RKDoesArrayOfResponseDescriptorsContainEntityMapping(matchingDescriptors); + BOOL isManagedObjectRequestOperation = (containsEntityMapping || [object isKindOfClass:[NSManagedObject class]]); + + if (isManagedObjectRequestOperation && !self.managedObjectStore) RKLogWarning(@"Asked to create an `RKManagedObjectRequestOperation` object, but managedObjectStore is nil."); + if (isManagedObjectRequestOperation && self.managedObjectStore) { + // Construct a Core Data operation + NSManagedObjectContext *managedObjectContext = [object respondsToSelector:@selector(managedObjectContext)] ? [object managedObjectContext] : self.managedObjectStore.mainQueueManagedObjectContext; + operation = [self managedObjectRequestOperationWithRequest:request managedObjectContext:managedObjectContext success:nil failure:nil]; + + if ([object isKindOfClass:[NSManagedObject class]]) { + static NSPredicate *temporaryObjectsPredicate = nil; + if (! temporaryObjectsPredicate) temporaryObjectsPredicate = [NSPredicate predicateWithFormat:@"objectID.isTemporaryID == YES"]; + NSSet *temporaryObjects = [[managedObjectContext insertedObjects] filteredSetUsingPredicate:temporaryObjectsPredicate]; + if ([temporaryObjects count]) { + RKLogInfo(@"Asked to perform object request for NSManagedObject with temporary object IDs: Obtaining permanent ID before proceeding."); + __block BOOL _blockSuccess; + __block NSError *_blockError; + + [[object managedObjectContext] performBlockAndWait:^{ + _blockSuccess = [[object managedObjectContext] obtainPermanentIDsForObjects:[temporaryObjects allObjects] error:&_blockError]; + }]; + if (! _blockSuccess) RKLogWarning(@"Failed to obtain permanent ID for object %@: %@", object, _blockError); + } + } + } else { + // Non-Core Data operation + operation = [self objectRequestOperationWithRequest:request success:nil failure:nil]; + } + + if (RKDoesArrayOfResponseDescriptorsContainMappingForClass(self.responseDescriptors, [object class])) operation.targetObject = object; + operation.mappingMetadata = routingMetadata; + return operation; +} + +- (NSURL *)URLWithRoute:(RKRoute *)route object:(id)object interpolatedParameters:(NSDictionary **)interpolatedParameters +{ + NSString *path = nil; + if (object) { + RKPathMatcher *pathMatcher = [RKPathMatcher pathMatcherWithPattern:route.pathPattern]; + path = [pathMatcher pathFromObject:object addingEscapes:route.shouldEscapePath interpolatedParameters:interpolatedParameters]; + } else { + // When there is no object, the path pattern is our complete path + path = route.pathPattern; + if (interpolatedParameters) *interpolatedParameters = @{}; + } + return [NSURL URLWithString:path relativeToURL:self.baseURL]; +} + +- (void)getObjectsAtPathForRelationship:(NSString *)relationshipName + ofObject:(id)object + parameters:(NSDictionary *)parameters + success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success + failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure +{ + RKRoute *route = [self.router.routeSet routeForRelationship:relationshipName ofClass:[object class] method:RKRequestMethodGET]; + NSDictionary *interpolatedParameters = nil; + NSURL *URL = [self URLWithRoute:route object:object interpolatedParameters:&interpolatedParameters]; + NSAssert(URL, @"Failed to generate URL for relationship named '%@' for object: %@", relationshipName, object); + RKObjectRequestOperation *operation = [self appropriateObjectRequestOperationWithObject:nil method:RKRequestMethodGET path:[URL relativeString] parameters:parameters]; + operation.mappingMetadata = @{ @"routing": @{ @"parameters": interpolatedParameters, @"route": route } }; + [operation setCompletionBlockWithSuccess:success failure:failure]; + [self enqueueObjectRequestOperation:operation]; +} + +- (void)getObjectsAtPathForRouteNamed:(NSString *)routeName + object:(id)object + parameters:(NSDictionary *)parameters + success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success + failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure +{ + NSParameterAssert(routeName); + RKRoute *route = [self.router.routeSet routeForName:routeName]; + NSDictionary *interpolatedParameters = nil; + NSURL *URL = [self URLWithRoute:route object:object interpolatedParameters:&interpolatedParameters]; + NSAssert(URL, @"No route found named '%@'", routeName); + NSAssert(route.method & RKRequestMethodGET, @"Expected route named '%@' to specify a GET, but it does not", routeName); + + RKObjectRequestOperation *operation = [self appropriateObjectRequestOperationWithObject:nil method:RKRequestMethodGET path:[URL relativeString] parameters:parameters]; + operation.mappingMetadata = @{ @"routing": @{ @"parameters": interpolatedParameters, @"route": route } }; + [operation setCompletionBlockWithSuccess:success failure:failure]; + [self enqueueObjectRequestOperation:operation]; + +} + +- (void)getObjectsAtPath:(NSString *)path + parameters:(NSDictionary *)parameters + success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success + failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure +{ + NSParameterAssert(path); + RKObjectRequestOperation *operation = [self appropriateObjectRequestOperationWithObject:nil method:RKRequestMethodGET path:path parameters:parameters]; + [operation setCompletionBlockWithSuccess:success failure:failure]; + [self enqueueObjectRequestOperation:operation]; +} + +- (void)getObject:(id)object + path:(NSString *)path + parameters:(NSDictionary *)parameters + success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success + failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure +{ + NSAssert(object || path, @"Cannot make a request without an object or a path."); + RKObjectRequestOperation *operation = [self appropriateObjectRequestOperationWithObject:object method:RKRequestMethodGET path:path parameters:parameters]; + [operation setCompletionBlockWithSuccess:success failure:failure]; + [self enqueueObjectRequestOperation:operation]; +} + +- (void)postObject:(id)object + path:(NSString *)path + parameters:(NSDictionary *)parameters + success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success + failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure +{ + NSAssert(object || path, @"Cannot make a request without an object or a path."); + RKObjectRequestOperation *operation = [self appropriateObjectRequestOperationWithObject:object method:RKRequestMethodPOST path:path parameters:parameters]; + [operation setCompletionBlockWithSuccess:success failure:failure]; + [self enqueueObjectRequestOperation:operation]; +} + +- (void)putObject:(id)object + path:(NSString *)path + parameters:(NSDictionary *)parameters + success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success + failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure +{ + NSAssert(object || path, @"Cannot make a request without an object or a path."); + RKObjectRequestOperation *operation = [self appropriateObjectRequestOperationWithObject:object method:RKRequestMethodPUT path:path parameters:parameters]; + [operation setCompletionBlockWithSuccess:success failure:failure]; + [self enqueueObjectRequestOperation:operation]; +} + +- (void)patchObject:(id)object + path:(NSString *)path + parameters:(NSDictionary *)parameters + success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success + failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure +{ + NSAssert(object || path, @"Cannot make a request without an object or a path."); + RKObjectRequestOperation *operation = [self appropriateObjectRequestOperationWithObject:object method:RKRequestMethodPATCH path:path parameters:parameters]; + [operation setCompletionBlockWithSuccess:success failure:failure]; + [self enqueueObjectRequestOperation:operation]; +} + +- (void)deleteObject:(id)object + path:(NSString *)path + parameters:(NSDictionary *)parameters + success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success + failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure +{ + NSAssert(object || path, @"Cannot make a request without an object or a path."); + RKObjectRequestOperation *operation = [self appropriateObjectRequestOperationWithObject:object method:RKRequestMethodDELETE path:path parameters:parameters]; + [operation setCompletionBlockWithSuccess:success failure:failure]; + [self enqueueObjectRequestOperation:operation]; +} + +- (RKPaginator *)paginatorWithPathPattern:(NSString *)pathPattern +{ + NSAssert(self.paginationMapping, @"Cannot instantiate a paginator when `paginationMapping` is nil."); + NSMutableURLRequest *request = [self requestWithMethod:@"GET" path:pathPattern parameters:nil]; + RKPaginator *paginator = [[RKPaginator alloc] initWithRequest:request paginationMapping:self.paginationMapping responseDescriptors:self.responseDescriptors]; + paginator.managedObjectContext = self.managedObjectStore.mainQueueManagedObjectContext; + paginator.managedObjectCache = self.managedObjectStore.managedObjectCache; + paginator.fetchRequestBlocks = self.fetchRequestBlocks; + paginator.operationQueue = self.operationQueue; + Class HTTPOperationClass = [self requestOperationClassForRequest:request fromRegisteredClasses:self.registeredHTTPRequestOperationClasses]; + if (HTTPOperationClass) [paginator setHTTPOperationClass:HTTPOperationClass]; + return paginator; +} + +#pragma mark - Request & Response Descriptors + +- (NSArray *)requestDescriptors +{ + return [NSArray arrayWithArray:self.mutableRequestDescriptors]; +} + +- (void)addRequestDescriptor:(RKRequestDescriptor *)requestDescriptor +{ + NSParameterAssert(requestDescriptor); + if ([self.requestDescriptors containsObject:requestDescriptor]) return; + NSAssert([requestDescriptor isKindOfClass:[RKRequestDescriptor class]], @"Expected an object of type RKRequestDescriptor, got '%@'", [requestDescriptor class]); + [self.requestDescriptors enumerateObjectsUsingBlock:^(RKRequestDescriptor *registeredDescriptor, NSUInteger idx, BOOL *stop) { + NSAssert(!([registeredDescriptor.objectClass isEqual:requestDescriptor.objectClass] && (requestDescriptor.method == registeredDescriptor.method)), @"Cannot add request descriptor: An existing descriptor is already registered for the class '%@' and HTTP method'%@'.", requestDescriptor.objectClass, RKStringDescribingRequestMethod(requestDescriptor.method)); + }]; + [self.mutableRequestDescriptors addObject:requestDescriptor]; +} + +- (void)addRequestDescriptorsFromArray:(NSArray *)requestDescriptors +{ + for (RKRequestDescriptor *requestDescriptor in requestDescriptors) { + [self addRequestDescriptor:requestDescriptor]; + } +} + +- (void)removeRequestDescriptor:(RKRequestDescriptor *)requestDescriptor +{ + NSParameterAssert(requestDescriptor); + NSAssert([requestDescriptor isKindOfClass:[RKRequestDescriptor class]], @"Expected an object of type RKRequestDescriptor, got '%@'", [requestDescriptor class]); + [self.mutableRequestDescriptors removeObject:requestDescriptor]; +} + +- (NSArray *)responseDescriptors +{ + return [NSArray arrayWithArray:self.mutableResponseDescriptors]; +} + +- (void)addResponseDescriptor:(RKResponseDescriptor *)responseDescriptor +{ + NSParameterAssert(responseDescriptor); + NSAssert([responseDescriptor isKindOfClass:[RKResponseDescriptor class]], @"Expected an object of type RKResponseDescriptor, got '%@'", [responseDescriptor class]); + responseDescriptor.baseURL = self.baseURL; + [self.mutableResponseDescriptors addObject:responseDescriptor]; +} + +- (void)addResponseDescriptorsFromArray:(NSArray *)responseDescriptors +{ + for (RKResponseDescriptor *responseDescriptor in responseDescriptors) { + [self addResponseDescriptor:responseDescriptor]; + } +} + +- (void)removeResponseDescriptor:(RKResponseDescriptor *)responseDescriptor +{ + NSParameterAssert(responseDescriptor); + NSAssert([responseDescriptor isKindOfClass:[RKResponseDescriptor class]], @"Expected an object of type RKResponseDescriptor, got '%@'", [responseDescriptor class]); + [self.mutableResponseDescriptors removeObject:responseDescriptor]; +} + +#pragma mark - Fetch Request Blocks + +- (NSArray *)fetchRequestBlocks +{ + return [NSArray arrayWithArray:self.mutableFetchRequestBlocks]; +} + +- (void)addFetchRequestBlock:(RKFetchRequestBlock)block +{ + NSParameterAssert(block); + [self.mutableFetchRequestBlocks addObject:block]; +} + +#pragma mark - Queue Management + +- (void)enqueueObjectRequestOperation:(RKObjectRequestOperation *)objectRequestOperation +{ + [self.operationQueue addOperation:objectRequestOperation]; +} + +- (NSArray *)enqueuedObjectRequestOperationsWithMethod:(RKRequestMethod)method matchingPathPattern:(NSString *)pathPattern +{ + NSMutableArray *matches = [NSMutableArray array]; + RKPathMatcher *pathMatcher = [RKPathMatcher pathMatcherWithPattern:pathPattern]; + for (NSOperation *operation in [self.operationQueue operations]) { + if (![operation isKindOfClass:[RKObjectRequestOperation class]]) { + continue; + } + NSURLRequest *request = [(RKObjectRequestOperation *)operation HTTPRequestOperation].request; + NSString *pathAndQueryString = RKPathAndQueryStringFromURLRelativeToURL([request URL], self.baseURL); + + RKRequestMethod operationMethod = RKRequestMethodFromString([request HTTPMethod]); + if ((method & operationMethod) && [pathMatcher matchesPath:pathAndQueryString tokenizeQueryStrings:NO parsedArguments:nil]) { + [matches addObject:operation]; + } + } + return [matches copy]; +} + +- (void)cancelAllObjectRequestOperationsWithMethod:(RKRequestMethod)method matchingPathPattern:(NSString *)pathPattern +{ + for (RKObjectRequestOperation *operation in [self enqueuedObjectRequestOperationsWithMethod:method matchingPathPattern:pathPattern]) { + [operation cancel]; + } +} + +- (void)enqueueBatchOfObjectRequestOperationsWithRoute:(RKRoute *)route + objects:(NSArray *)objects + progress:(void (^)(NSUInteger numberOfFinishedOperations, + NSUInteger totalNumberOfOperations))progress + completion:(void (^)(NSArray *operations))completion { + NSMutableArray *operations = [[NSMutableArray alloc] initWithCapacity:objects.count]; + for (id object in objects) { + RKObjectRequestOperation *operation = nil; + NSDictionary *interpolatedParameters = nil; + NSURL *URL = [self URLWithRoute:route object:object interpolatedParameters:&interpolatedParameters]; + NSAssert(URL, @"Failed to generate URL for route %@ with object %@", route, object); + if ([route isClassRoute]) { + operation = [self appropriateObjectRequestOperationWithObject:object method:route.method path:[URL relativeString] parameters:nil]; + } else { + operation = [self appropriateObjectRequestOperationWithObject:nil method:route.method path:[URL relativeString] parameters:nil]; + } + operation.mappingMetadata = @{ @"routing": interpolatedParameters, @"route": route }; + [operations addObject:operation]; + } + return [self enqueueBatchOfObjectRequestOperations:operations progress:progress completion:completion]; +} + +- (void)enqueueBatchOfObjectRequestOperations:(NSArray *)operations + progress:(void (^)(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations))progress + completion:(void (^)(NSArray *operations))completion { + + __block dispatch_group_t dispatchGroup = dispatch_group_create(); + NSBlockOperation *batchedOperation = [NSBlockOperation blockOperationWithBlock:^{ + dispatch_group_notify(dispatchGroup, dispatch_get_main_queue(), ^{ + if (completion) { + completion(operations); + } + }); +#if !OS_OBJECT_USE_OBJC + dispatch_release(dispatchGroup); +#endif + }]; + + for (RKObjectRequestOperation *operation in operations) { + void (^originalCompletionBlock)(void) = [operation.completionBlock copy]; + __weak RKObjectRequestOperation *weakOperation = operation; + [operation setCompletionBlock:^{ + dispatch_queue_t queue = weakOperation.successCallbackQueue ?: dispatch_get_main_queue(); + dispatch_group_async(dispatchGroup, queue, ^{ + if (originalCompletionBlock) { + originalCompletionBlock(); + } + + __block NSUInteger numberOfFinishedOperations = 0; + [operations enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { + if ([(NSOperation *)obj isFinished]) { + numberOfFinishedOperations++; + } + }]; + + if (progress) { + progress(numberOfFinishedOperations, [operations count]); + } + + dispatch_group_leave(dispatchGroup); + }); + }]; + + dispatch_group_enter(dispatchGroup); + [batchedOperation addDependency:operation]; + + [self enqueueObjectRequestOperation:operation]; + } + [self.operationQueue addOperation:batchedOperation]; } @end + +#ifdef _SYSTEMCONFIGURATION_H +NSString *RKStringFromNetworkReachabilityStatus(AFNetworkReachabilityStatus networkReachabilityStatus) +{ + switch (networkReachabilityStatus) { + case AFNetworkReachabilityStatusNotReachable: return @"Not Reachable"; + case AFNetworkReachabilityStatusReachableViaWiFi: return @"Reachable via WiFi"; + case AFNetworkReachabilityStatusReachableViaWWAN: return @"Reachable via WWAN"; + case AFNetworkReachabilityStatusUnknown: return @"Reachability Unknown"; + default: break; + } + return nil; +} +#endif \ No newline at end of file diff --git a/Chromatism/ChromatismTests/bundle.bundle/description.txt b/Chromatism/ChromatismTests/bundle.bundle/description.txt index 2f26247..725bbb1 100644 --- a/Chromatism/ChromatismTests/bundle.bundle/description.txt +++ b/Chromatism/ChromatismTests/bundle.bundle/description.txt @@ -1,31 +1,31 @@ -JLScope, (null), nopaque: 1, nindexesSet:[number of indexes: 2466 (in 1 ranges), indexes: (0-2465)], - subscopes, JLTokenPattern, comment, Regex Pattern: /\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/, opaque: 1, indexesSet:(no indexes) +JLScope, (null), nopaque: 1, nindexesSet:[number of indexes: 46555 (in 1 ranges), indexes: (0-46554)], + subscopes, JLTokenPattern, comment, Regex Pattern: /\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/, opaque: 1, indexesSet:[number of indexes: 1383 (in 5 ranges), indexes: (1495-1940 2407-2755 5893-6018 7301-7659 14851-14953)] subscopes, - JLScope, (null), nopaque: 1, nindexesSet:[number of indexes: 2466 (in 1 ranges), indexes: (0-2465)], - subscopes, JLTokenPattern, comment, Regex Pattern: //.*+$, opaque: 1, indexesSet:[number of indexes: 1355 (in 14 ranges), indexes: (0-1 3-19 21-38 40-41 43-80 82-134 136-137 923-1199 1205-1351 1429-1639 1645-1777 1856-2004 2079-2264 2337-2456)] + JLScope, (null), nopaque: 1, nindexesSet:[number of indexes: 45172 (in 6 ranges), indexes: (0-1494 1941-2406 2756-5892 6019-7300 7660-14850 14954-46554)], + subscopes, JLTokenPattern, comment, Regex Pattern: //.*+$, opaque: 1, indexesSet:[number of indexes: 1936 (in 40 ranges), indexes: (0-1 3-23 25-35 37-38 40-80 82-138 140-141 143-209 211-278 280-322 324-325 327-372 374-375 377-447 449-517 519-594 596-666 668-701 703-704 1217-1326 1336-1369 1371-1388 1438-1471 1473-1492 5387-5479 7762-7844 8277-8337 8716-8781 9057-9139 9623-9683 10395-10477 10910-10978 12435-12469 13846-13873 15325-15439 18598-18687 18993-19033 27994-28027 29470-29495 30234-30298)] subscopes, - JLTokenPattern, preprocessor, Regex Pattern: #.*+$, opaque: 1, indexesSet:[number of indexes: 56 (in 2 ranges), indexes: (140-162 164-196)] - subscopes, JLTokenPattern, string, Regex Pattern: <.*?>, opaque: 1, indexesSet:[number of indexes: 25 (in 1 ranges), indexes: (172-196)] + JLTokenPattern, preprocessor, Regex Pattern: #.*+$, opaque: 1, indexesSet:[number of indexes: 830 (in 30 ranges), indexes: (707-730 732-758 760-795 797-828 830-860 862-893 895-927 929-951 953-969 971-1005 1007-1031 1033-1059 1061-1083 1085-1112 1114-1146 1149-1176 1178-1215 1328-1333 14817-14848 21249-21285 23000-23039 23285-23326 23398-23403 37974-38018 40708-40742 40995-41025 44573-44595 44638-44643 45935-45963 46549-46554)] + subscopes, JLTokenPattern, string, Regex Pattern: <.*?>, opaque: 1, indexesSet:[number of indexes: 16 (in 1 ranges), indexes: (715-730)] subscopes, - JLTokenPattern, (null), Regex Pattern: ("|@")[^"\n]*(@"|"), opaque: 1, indexesSet:[number of indexes: 15 (in 1 ranges), indexes: (148-162)] + JLTokenPattern, (null), Regex Pattern: ("|@")[^"\n]*(@"|"), opaque: 1, indexesSet:[number of indexes: 290 (in 14 ranges), indexes: (740-758 768-795 805-828 838-860 870-893 903-927 937-951 961-969 979-1005 1015-1031 1041-1059 1069-1083 1093-1112 1122-1146)] subscopes, - JLTokenPattern, string, Regex Pattern: ("|@")[^"\n]*(@"|"), opaque: 1, indexesSet:[number of indexes: 13 (in 1 ranges), indexes: (661-673)] + JLTokenPattern, string, Regex Pattern: ("|@")[^"\n]*(@"|"), opaque: 1, indexesSet:[number of indexes: 2359 (in 50 ranges), indexes: (4907-4979 5542-5846 9908-9915 12072-12242 14646-14654 15231-15236 15266-15272 15302-15310 15913-15929 15995-16009 16684-16711 17273-17340 18398-18476 19171-19270 27108-27176 27286-27295 27301-27313 27340-27347 27819-27912 28610-28641 28847-28969 29351-29400 31206-31273 31510-31519 31525-31537 31564-31571 32398-32425 32488-32549 32776-32785 32791-32803 32830-32837 33927-33979 34607-34659 35283-35335 35968-36020 36660-36712 37109-37174 37237-37242 38392-38450 38767-38884 39456-39514 39920-39979 40543-40602 43275-43327 43733-43742 43769-43776 46176-46191 46259-46279 46347-46367 46435-46457)] subscopes, - JLTokenPattern, number, Regex Pattern: (?<=\s)\d+, opaque: 1, indexesSet:(no indexes) + JLTokenPattern, number, Regex Pattern: (?<=\s)\d+, opaque: 1, indexesSet:[number of indexes: 5 (in 5 ranges), indexes: (5202 5352 8695 18777 45244)] subscopes, - JLTokenPattern, number, Regex Pattern: @[\(|\{|\[][^\(\{\[]+[\)|\}|\]], opaque: 0, indexesSet:(no indexes) + JLTokenPattern, number, Regex Pattern: @[\(|\{|\[][^\(\{\[]+[\)|\}|\]], opaque: 0, indexesSet:[number of indexes: 93 (in 3 ranges), indexes: (5067-5138 17736-17746 30396-30405)] subscopes, - JLTokenPattern, other_method_names, Regex Pattern: \w+\s*(?>\(.*\), opaque: 1, indexesSet:(no indexes) + JLTokenPattern, other_method_names, Regex Pattern: \w+\s*(?>\(.*\), opaque: 1, indexesSet:(no indexes) subscopes, - JLTokenPattern, other_method_names, Regex Pattern: \.(\w+), opaque: 1, indexesSet:[number of indexes: 62 (in 7 ranges), indexes: (348-353 653-657 690-695 697-714 749-754 756-770 806-811)] + JLTokenPattern, other_method_names, Regex Pattern: \.(\w+), opaque: 1, indexesSet:[number of indexes: 2694 (in 161 ranges), indexes: (2327-2332 3223-3233 3295-3300 3461-3471 3532-3537 4079-4088 4419-4428 4774-4783 5035-5044 5181-5190 5247-5256 5331-5340 5872-5881 6410-6424 6549-6563 6627-6634 6679-6693 6908-6921 7191-7210 7266-7272 8049-8055 8177-8183 8241-8248 8670-8683 9344-9350 9472-9478 9536-9543 9983-9987 10682-10688 10810-10816 10874-10881 11421-11434 13132-13141 13166-13171 13216-13222 13247-13260 13301-13325 13364-13389 13428-13452 13491-13527 13566-13611 13650-13688 13727-13754 13809-13825 14327-14336 14468-14495 14618-14627 14713-14722 14724-14730 14787-14796 14798-14811 15491-15500 15584-15593 15831-15840 15842-15855 15937-15964 16108-16135 16229-16238 16601-16606 17184-17189 17992-18009 18877-18887 19866-19871 20613-20618 20827-20836 21450-21495 21541-21586 21748-21786 21832-21870 22030-22066 22112-22148 22313-22349 22391-22429 22471-22516 23148-23157 23166-23175 23177-23193 23210-23236 23245-23254 23256-23282 23342-23355 23364-23373 23375-23395 23895-23931 24273-24311 24505-24523 25277-25313 25655-25700 25943-25961 26058-26077 26110-26127 26129-26157 26174-26191 26200-26217 26219-26236 26253-26270 26279-26296 26849-26854 26856-26863 27470-27488 27786-27803 27964-27981 28183-28200 28202-28230 29670-29688 29718-29729 29755-29769 30064-30074 30148-30163 30321-30331 30463-30469 30930-30935 30937-30944 31489-31503 32186-32191 32193-32200 32459-32464 32755-32769 37090-37106 37375-37391 37418-37436 37454-37473 37482-37499 37501-37529 37546-37563 37572-37589 37591-37608 37625-37642 37651-37668 37685-37698 37707-37720 37827-37863 38095-38119 38254-38271 38491-38508 38653-38663 38691-38701 38726-38731 38757-38762 38905-38915 38968-38973 38996-39020 39555-39579 39692-39717 40034-40040 40049-40055 40068-40093 40644-40669 40819-40843 40948-40972 41129-41142 41490-41503 41720-41726 41829-41835 43000-43004 43476-43481 43634-43639 43712-43726 44775-44789 44958-44977 45879-45892)] subscopes, - JLTokenPattern, other_method_names, Regex Pattern: \[\w+\s+(\w+)\], opaque: 1, indexesSet:[number of indexes: 35 (in 5 ranges), indexes: (368-372 400-409 493-497 583-587 783-792)] + JLTokenPattern, other_method_names, Regex Pattern: \[\w+\s+(\w+)\], opaque: 1, indexesSet:[number of indexes: 610 (in 94 ranges), indexes: (3094-3098 3612-3621 4043-4046 4113-4115 4296-4299 4519-4523 4635-4639 4989-4993 5279-5282 6374-6377 6442-6444 6769-6773 7038-7042 7899-7901 8135-8139 8444-8448 8551-8555 9194-9196 9430-9434 9613-9615 9791-9795 10032-10036 10162-10166 10532-10534 10768-10772 11085-11089 11274-11278 13096-13099 13186-13190 13282-13284 13345-13347 13409-13411 13472-13474 13547-13549 13631-13633 13708-13710 14245-14249 14389-14393 15532-15536 16805-16818 17369-17373 17472-17485 17699-17703 17812-17814 18748-18752 18767-18771 18968-18984 19085-19089 21425-21429 21723-21727 22005-22009 22758-22780 22831-22840 23961-23965 24048-24052 24343-24347 24423-24427 25343-25347 25430-25434 25739-25743 25861-25865 27240-27253 27722-27726 28154-28173 28428-28432 28706-28720 28811-28815 29089-29108 29179-29198 29248-29257 29699-29703 31000-31004 31435-31448 32701-32714 37321-37325 38383-38387 38472-38476 39447-39451 39536-39540 39911-39915 40002-40006 40534-40538 40625-40629 41356-41360 41584-41588 41818-41820 41925-41934 42152-42155 42441-42446 42968-42972 43365-43376 43493-43506 43651-43664 45599-45603)] subscopes, - JLTokenPattern, other_method_names, Regex Pattern: (?<=\w+):\s*[^\s;\]]+, opaque: 1, indexesSet:(no indexes) + JLTokenPattern, other_method_names, Regex Pattern: (?<=\w+):\s*[^\s;\]]+, opaque: 1, indexesSet:(no indexes) subscopes, - JLTokenPattern, other_class_names, Regex Pattern: (\b(?>NS|UI))\w+\b, opaque: 1, indexesSet:[number of indexes: 157 (in 12 ranges), indexes: (249-261 308-319 359-366 391-398 511-532 560-581 775-781 889-901 1395-1407 1822-1834 2045-2057 2303-2315)] + JLTokenPattern, other_class_names, Regex Pattern: (\b(?>NS|UI))\w+\b, opaque: 1, indexesSet:[number of indexes: 2261 (in 214 ranges), indexes: (1949-1955 2016-2022 2046-2053 2092-2101 2212-2221 2837-2843 2989-2995 3683-3690 3783-3790 3823-3841 3879-3890 3923-3930 4093-4111 4168-4179 4209-4216 4289-4294 4504-4517 4622-4633 4658-4671 4690-4703 4855-4865 4873-4898 5272-5277 5490-5500 5508-5533 6055-6062 6097-6101 6235-6246 6429-6440 6514-6518 7726-7732 7850-7861 7886-7897 8927-8933 9021-9027 9145-9156 9181-9192 9568-9579 9600-9611 10336-10342 10483-10494 10519-10530 11609-11616 12393-12407 12532-12545 12605-12618 12679-12692 12752-12765 12837-12850 12924-12937 13265-13280 13330-13343 13394-13407 13457-13470 13532-13545 13616-13629 13693-13706 14189-14193 14585-14592 14679-14683 14739-14750 14958-14976 14999-15006 15061-15068 15121-15132 15153-15171 15449-15460 15672-15678 15702-15709 15732-15739 15887-15894 16021-16026 16329-16347 16381-16388 16522-16533 16582-16586 16670-16677 16851-16869 16905-16912 17133-17144 17165-17169 17259-17266 17343-17359 17602-17613 17634-17640 17691-17697 18157-18163 18191-18202 18740-18746 19077-19083 19119-19129 19137-19162 19564-19582 19726-19733 19786-19797 19819-19826 20153-20171 20354-20361 20427-20438 20566-20573 20781-20799 22593-22604 22639-22645 22712-22723 23473-23484 23758-23764 24702-24713 24804-24825 25140-25146 26510-26517 26577-26588 26656-26667 26763-26774 26911-26922 26963-26967 27376-27382 27706-27720 28037-28058 28412-28426 28458-28468 28578-28588 28657-28661 29041-29047 29818-29822 29898-29909 29943-29950 30419-30423 30517-30524 30637-30648 30877-30883 31039-31050 31087-31091 31192-31199 31750-31757 31859-31870 32095-32101 32125-32141 32231-32242 32279-32283 32384-32391 32444-32451 33004-33011 33046-33057 33256-33262 33286-33302 33641-33648 33676-33687 33872-33878 33902-33909 34318-34325 34354-34365 34552-34558 34582-34589 34997-35004 35032-35043 35228-35234 35258-35265 35676-35683 35713-35724 35913-35919 35943-35950 36365-36372 36403-36414 36605-36611 36635-36642 37047-37054 37076-37083 37182-37200 38024-38030 38067-38073 38202-38218 38320-38327 38582-38591 38620-38627 39095-39101 39342-39358 39384-39391 39620-39626 39664-39670 39803-39819 39846-39853 40170-40176 40426-40442 40469-40476 40748-40754 40791-40797 40912-40928 41188-41194 41285-41292 41314-41327 41341-41354 41458-41468 41635-41646 41737-41744 42258-42265 42587-42593 42670-42679 42774-42783 42884-42890 42922-42935 42953-42966 43100-43111 43152-43156 43261-43268 43994-44000 44071-44080 44110-44119 44211-44217 44320-44335 44358-44373 45204-45213 45312-45321 45368-45378 45965-45972)] subscopes, - JLTokenPattern, keyword, Regex Pattern: (?<=\b)(?>true|false|yes|no|TRUE|FALSE|bool|BOOL|nil|id|void|self|NULL|if|else|strong|weak|nonatomic|atomic|assign|copy|typedef|enum|auto|break|case|const|char|continue|do|default|double|extern|float|for|goto|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|volatile|while|nonatomic|atomic|nonatomic|readonly|super )(\b), opaque: 1, indexesSet:[number of indexes: 46 (in 11 ranges), indexes: (231-234 343-346 685-688 744-747 801-804 837-842 855-858 1359-1362 1785-1788 2012-2015 2272-2275)] + JLTokenPattern, keyword, Regex Pattern: (?<=\b)(?>true|false|yes|no|TRUE|FALSE|bool|BOOL|nil|id|void|self|NULL|if|else|strong|weak|nonatomic|atomic|assign|copy|typedef|enum|auto|break|case|const|char|continue|do|default|double|extern|float|for|goto|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|volatile|while|nonatomic|atomic|nonatomic|readonly|super )(\b), opaque: 1, indexesSet:[number of indexes: 1817 (in 470 ranges), indexes: (1391-1396 1432-1434 1942-1947 2165-2168 2228-2231 2250-2255 2348-2353 2866-2867 3018-3019 3106-3107 3119-3121 3200-3201 3304-3309 3357-3359 3438-3439 3541-3546 3631-3635 3661-3666 3668-3670 3676-3681 3815-3820 3859-3862 3955-3958 4015-4016 4029-4032 4054-4055 4058-4061 4074-4077 4129-4134 4136-4139 4148-4151 4241-4244 4260-4261 4307-4308 4402-4403 4414-4417 4457-4458 4478-4479 4591-4594 4596-4597 4750-4752 4769-4772 4835-4838 5014-5017 5030-5033 5144-5145 5171-5172 5176-5179 5205-5210 5212-5214 5221-5222 5242-5245 5291-5292 5321-5322 5326-5329 5355-5360 5860-5865 5867-5870 6087-6094 6118-6119 6314-6315 6360-6363 6385-6386 6389-6392 6405-6408 6457-6460 6495-6500 6502-6505 6537-6542 6544-6547 6572-6575 6617-6618 6622-6625 6661-6666 6674-6677 6724-6725 6860-6862 6939-6942 6989-6992 6994-6995 7126-7128 7228-7231 7661-7666 7668-7671 7909-7911 7989-7990 8343-8345 8400-8401 8467-8472 8506-8507 8650-8651 8799-8804 8850-8855 8864-8867 8958-8961 9204-9206 9284-9285 9689-9691 9746-9747 9930-9933 10012-10013 10050-10052 10107-10108 10189-10194 10232-10237 10255-10260 10269-10274 10276-10279 10542-10544 10622-10623 10984-10986 11041-11042 11108-11109 11190-11195 11229-11230 11373-11375 11455-11456 11537-11542 11588-11593 11602-11607 11709-11714 11737-11740 11782-11787 11827-11831 11855-11858 11897-11902 11932-11936 11960-11963 12010-12014 12038-12044 12268-12272 12290-12295 12364-12371 12385-12390 12524-12529 12597-12602 12671-12676 12744-12749 12829-12834 12916-12921 13031-13032 13082-13085 13107-13108 13111-13114 13127-13130 13161-13164 13242-13245 13296-13299 13359-13362 13423-13426 13486-13489 13561-13564 13645-13648 13722-13725 13883-13884 13887-13889 13957-13960 13985-13990 13992-13995 14037-14042 14065-14068 14240-14243 14529-14534 14551-14554 14613-14616 14701-14706 14708-14711 14775-14780 14782-14785 15187-15188 15486-15489 15542-15544 15579-15582 15689-15691 15826-15829 15932-15935 16103-16106 16198-16201 16224-16227 16307-16312 16457-16458 16596-16599 16730-16735 16738-16741 16986-16987 17179-17182 17397-17402 17405-17408 17518-17519 17549-17550 17720-17722 17822-17824 17827-17828 17987-17990 18051-18052 18174-18176 18358-18359 18560-18565 18567-18569 18701-18704 18927-18928 19039-19040 19280-19283 19285-19286 19436-19439 19441-19442 19532-19537 19605-19606 19861-19864 19929-19930 19953-19956 20034-20039 20042-20045 20207-20208 20510-20513 20519-20520 20608-20611 20676-20677 20700-20703 20822-20825 21221-21226 21291-21294 21354-21355 21445-21448 21536-21539 21636-21641 21654-21657 21659-21660 21743-21746 21827-21830 21920-21925 21938-21941 21943-21944 22025-22028 22107-22110 22198-22203 22225-22230 22242-22245 22308-22311 22386-22389 22466-22469 22703-22705 22788-22792 22854-22855 22909-22913 22948-22950 22967-22972 23045-23048 23161-23164 23240-23243 23359-23362 23561-23564 23712-23715 23823-23826 23890-23893 24086-24089 24201-24204 24268-24271 24500-24503 24602-24607 24929-24932 25094-25097 25205-25208 25272-25275 25468-25471 25583-25586 25650-25653 25938-25941 26105-26108 26195-26198 26274-26277 26303-26308 26327-26328 26375-26376 26647-26649 26681-26684 26795-26797 26804-26805 26844-26847 26950-26952 26977-26980 27072-27073 27192-27197 27465-27468 27510-27513 27618-27621 27741-27742 27781-27784 27920-27921 27959-27962 28178-28181 28254-28257 28358-28360 28370-28372 28385-28386 28451-28456 28499-28501 28516-28517 28789-28790 28997-29000 29317-29318 29455-29458 29518-29521 29573-29575 29585-29587 29606-29607 29665-29668 29794-29799 29864-29865 29960-29962 29969-29970 30219-30222 30342-30343 30411-30416 30458-30461 30479-30482 30586-30587 30704-30707 30831-30834 30925-30928 31078-31080 31101-31104 31346-31349 31395-31397 31661-31664 31714-31717 31810-31811 31924-31927 32049-32052 32181-32184 32270-32272 32293-32296 32612-32615 32661-32663 32927-32930 32981-32984 33098-33101 33210-33213 33354-33357 33403-33405 33543-33546 33596-33599 33612-33613 33721-33724 33826-33829 34026-34029 34218-34221 34271-34274 34288-34289 34400-34403 34506-34509 34706-34709 34899-34902 34952-34955 34968-34969 35077-35080 35182-35185 35382-35385 35574-35577 35627-35630 35645-35646 35760-35763 35867-35870 36067-36070 36261-36264 36314-36317 36333-36334 36451-36454 36559-36562 36759-36762 36954-36957 37085-37088 37214-37217 37272-37274 37370-37373 37413-37416 37477-37480 37567-37570 37646-37649 37702-37705 37755-37758 37822-37825 37871-37872 37953-37958 38059-38064 38090-38093 38129-38132 38244-38245 38249-38252 38308-38313 38486-38489 38598-38601 38991-38994 39058-39061 39130-39132 39208-39211 39266-39269 39550-39553 39656-39661 39687-39690 39727-39730 40044-40047 40063-40066 40132-40135 40206-40208 40287-40290 40347-40350 40639-40642 40783-40788 40814-40817 40853-40856 40943-40946 41031-41034 41124-41127 41453-41455 41485-41488 41528-41529 41607-41614 41824-41827 41947-41948 42065-42067 42136-42141 42165-42168 42287-42289 42332-42335 42462-42465 42661-42664 42875-42878 43012-43014 43017-43018 43087-43089 43139-43141 43166-43169 43354-43355 43407-43410 43520-43522 43536-43539 43568-43571 43617-43619 43678-43680 43840-43845 43848-43851 43950-43953 44062-44065 44202-44205 44489-44490 44658-44660 44724-44727 44756-44759 44791-44794 45083-45084 45304-45305 45328-45331 45362-45363 45514-45515 45816-45819 45874-45877 46074-46079 46119-46122 46169-46174 46202-46205 46252-46257 46290-46293 46340-46345 46378-46381 46428-46433 46468-46474 46518-46522 46535-46540 46542-46544)] subscopes, - JLTokenPattern, keyword, Regex Pattern: @[a-zA-Z0-9_]+, opaque: 1, indexesSet:[number of indexes: 19 (in 2 ranges), indexes: (199-213 2461-2464)] + JLTokenPattern, keyword, Regex Pattern: @[a-zA-Z0-9_]+, opaque: 1, indexesSet:[number of indexes: 226 (in 27 ranges), indexes: (3751-3760 3793-3801 3970-3973 3976-3990 5887-5890 6020-6029 6065-6073 6160-6163 6166-6175 6202-6210 6266-6269 6272-6286 7295-7298 12326-12335 12353-12361 12429-12432 12472-12481 12502-12510 12575-12583 12649-12657 12722-12730 12807-12815 12894-12902 12989-12992 12995-13009 28111-28119 45929-45932)] subscopes, \ No newline at end of file From 5efb75b7c67819a0a5bdd7c070a19c9c59180f4c Mon Sep 17 00:00:00 2001 From: Anviking Date: Thu, 1 Aug 2013 14:10:14 +0200 Subject: [PATCH 062/140] Made JLTokenizer a nslayoutmanageddelegate --- Chromatism/Chromatism/JLTokenizer.h | 2 +- Chromatism/Chromatism/JLTokenizer.m | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/Chromatism/Chromatism/JLTokenizer.h b/Chromatism/Chromatism/JLTokenizer.h index a1b2caa..a8f3598 100644 --- a/Chromatism/Chromatism/JLTokenizer.h +++ b/Chromatism/Chromatism/JLTokenizer.h @@ -11,7 +11,7 @@ #import "Chromatism+Internal.h" @class TextViewChange, JLTextView; -@interface JLTokenizer : NSObject +@interface JLTokenizer : NSObject // Override to create your own syntax highlighting - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range; diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index 4fd5465..beb6e76 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -94,6 +94,30 @@ - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range r return YES; } +- (void)setTextView:(UITextView *)textView +{ + _textView = textView; + _textView.layoutManager.delegate = self; +} + +#pragma mark - NSLayoutManager delegeate +/* + * TODO: Find out a way to set intendation for entire paragraphs. + */ + +- (CGFloat)layoutManager:(NSLayoutManager *)layoutManager paragraphSpacingBeforeGlyphAtIndex:(NSUInteger)glyphIndex withProposedLineFragmentRect:(CGRect)rect +{ + return 0; +} + +- (BOOL)layoutManager:(NSLayoutManager *)layoutManager shouldBreakLineByWordBeforeCharacterAtIndex:(NSUInteger)charIndex +{ + NSString *character = [layoutManager.textStorage.string substringWithRange:NSMakeRange(charIndex, 1)]; + // NSLog(@"Asked about linebreak: %@",character); + if ([character isEqualToString:@"*"]) return NO; + return YES; +} + #pragma mark - Scopes // From 0c062d1b41be33efbcce28c5efc6cd4c8d35b7af Mon Sep 17 00:00:00 2001 From: Anviking Date: Thu, 1 Aug 2013 14:26:44 +0200 Subject: [PATCH 063/140] Decided that all the color and layout code should really go in JLTextView, not in the tokenizer --- Chromatism/Chromatism/JLTextView.h | 4 +- Chromatism/Chromatism/JLTextView.m | 91 +++++++++++++++++++++- Chromatism/Chromatism/JLTokenizer.h | 8 +- Chromatism/Chromatism/JLTokenizer.m | 113 ---------------------------- 4 files changed, 92 insertions(+), 124 deletions(-) diff --git a/Chromatism/Chromatism/JLTextView.h b/Chromatism/Chromatism/JLTextView.h index 8de27cd..badb88a 100644 --- a/Chromatism/Chromatism/JLTextView.h +++ b/Chromatism/Chromatism/JLTextView.h @@ -7,10 +7,12 @@ // #import +#import "Chromatism+Internal.h" @class JLTokenizer; -@interface JLTextView : UITextView +@interface JLTextView : UITextView @property (nonatomic, strong) JLTokenizer *syntaxTokenizer; +@property (nonatomic, assign) JLTokenizerTheme theme; @end diff --git a/Chromatism/Chromatism/JLTextView.m b/Chromatism/Chromatism/JLTextView.m index e4e4101..c18793b 100644 --- a/Chromatism/Chromatism/JLTextView.m +++ b/Chromatism/Chromatism/JLTextView.m @@ -11,6 +11,11 @@ #import "Chromatism.h" @implementation JLTextView +{ + NSString *_oldString; +} + +@synthesize theme = _theme; #pragma mark - Initialization & Setup @@ -45,10 +50,8 @@ - (void)setup { // Setup tokenizer self.syntaxTokenizer = [[JLTokenizer alloc] init]; - self.syntaxTokenizer.textView = self; self.textStorage.delegate = self.syntaxTokenizer; - self.delegate = self.syntaxTokenizer; - self.syntaxTokenizer.theme = JLTokenizerThemeDusk; + self.theme = JLTokenizerThemeDusk; // Set default properties self.scrollEnabled = YES; @@ -56,7 +59,89 @@ - (void)setup self.font = [UIFont fontWithName:@"Menlo" size:12]; self.autocorrectionType = UITextAutocorrectionTypeNo; self.autocapitalizationType = UITextAutocapitalizationTypeNone; + + // Setup delegates + self.delegate = self; + self.layoutManager.delegate = self; +} + +#pragma mark - Color Themes + +-(void)setTheme:(JLTokenizerTheme)theme +{ + self.syntaxTokenizer.colors = [Chromatism colorsForTheme:theme]; + self.typingAttributes = @{ NSForegroundColorAttributeName : self.syntaxTokenizer.colors[JLTokenTypeText]}; + _theme = theme; + + //Set font, text color and background color back to default + UIColor *backgroundColor = self.syntaxTokenizer.colors[JLTokenTypeBackground]; + [self setBackgroundColor:backgroundColor ? backgroundColor : [UIColor whiteColor] ]; +} + +- (JLTokenizerTheme)theme +{ + if (!_theme) _theme = JLTokenizerThemeDefault; + return _theme; } +#pragma mark - UITextViewDelegate + +- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text +{ + _oldString = nil; + + if (range.length == 0 && text.length == 1) { + // A normal character typed + } + else if (range.length == 1 && text.length == 0) { + // Backspace + } + else { + // Multicharacter edit + } + + if ([text isEqualToString:@"\n"]) { + // Return + // Start the new line with as many tabs or white spaces as the previous one. + NSRange lineRange = [textView.text lineRangeForRange:range]; + NSRange prefixRange = [textView.text rangeOfString:@"[\\t| ]*" options:NSRegularExpressionSearch range:lineRange]; + NSString *prefixString = [textView.text substringWithRange:prefixRange]; + + UITextPosition *beginning = textView.beginningOfDocument; + UITextPosition *start = [textView positionFromPosition:beginning offset:range.location]; + UITextPosition *stop = [textView positionFromPosition:start offset:range.length]; + + UITextRange *textRange = [textView textRangeFromPosition:start toPosition:stop]; + + [textView replaceRange:textRange withText:[NSString stringWithFormat:@"\n%@",prefixString]]; + + return NO; + } + + if (range.length > 0) + { + _oldString = [textView.text substringWithRange:range]; + } + + return YES; +} + +#pragma mark - NSLayoutManager delegeate +/* + * TODO: Find out a way to set intendation for entire paragraphs. + */ + +- (CGFloat)layoutManager:(NSLayoutManager *)layoutManager paragraphSpacingBeforeGlyphAtIndex:(NSUInteger)glyphIndex withProposedLineFragmentRect:(CGRect)rect +{ + return 0; +} + +- (BOOL)layoutManager:(NSLayoutManager *)layoutManager shouldBreakLineByWordBeforeCharacterAtIndex:(NSUInteger)charIndex +{ + NSString *character = [layoutManager.textStorage.string substringWithRange:NSMakeRange(charIndex, 1)]; + // NSLog(@"Asked about linebreak: %@",character); + if ([character isEqualToString:@"*"]) return NO; + return YES; +} @end diff --git a/Chromatism/Chromatism/JLTokenizer.h b/Chromatism/Chromatism/JLTokenizer.h index a8f3598..611d8d2 100644 --- a/Chromatism/Chromatism/JLTokenizer.h +++ b/Chromatism/Chromatism/JLTokenizer.h @@ -11,7 +11,7 @@ #import "Chromatism+Internal.h" @class TextViewChange, JLTextView; -@interface JLTokenizer : NSObject +@interface JLTokenizer : NSObject // Override to create your own syntax highlighting - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range; @@ -20,10 +20,4 @@ - (NSMutableAttributedString *)tokenizeString:(NSString *)string withDefaultAttributes:(NSDictionary *)attributes; @property (nonatomic, strong) NSDictionary *colors; -@property (nonatomic, strong) NSDictionary *defaultAttributes; - -@property (nonatomic, strong) UIColor *highlightColor; -@property (nonatomic, assign) JLTokenizerTheme theme; -@property (nonatomic, strong, readonly) NSArray *themes; -@property (nonatomic, weak) UITextView *textView; @end diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index beb6e76..5b154b4 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -43,80 +43,10 @@ #import "Chromatism.h" @interface JLTokenizer () -{ - NSString *_oldString; -} @end @implementation JLTokenizer -@synthesize theme = _theme, themes = _themes, colors = _colors; - -#pragma mark - UITextViewDelegate - -- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text -{ - _oldString = nil; - - if (range.length == 0 && text.length == 1) { - // A normal character typed - } - else if (range.length == 1 && text.length == 0) { - // Backspace - } - else { - // Multicharacter edit - } - - if ([text isEqualToString:@"\n"]) { - // Return - // Start the new line with as many tabs or white spaces as the previous one. - NSRange lineRange = [textView.text lineRangeForRange:range]; - NSRange prefixRange = [textView.text rangeOfString:@"[\\t| ]*" options:NSRegularExpressionSearch range:lineRange]; - NSString *prefixString = [textView.text substringWithRange:prefixRange]; - - UITextPosition *beginning = textView.beginningOfDocument; - UITextPosition *start = [textView positionFromPosition:beginning offset:range.location]; - UITextPosition *stop = [textView positionFromPosition:start offset:range.length]; - - UITextRange *textRange = [textView textRangeFromPosition:start toPosition:stop]; - - [textView replaceRange:textRange withText:[NSString stringWithFormat:@"\n%@",prefixString]]; - - return NO; - } - - if (range.length > 0) - { - _oldString = [textView.text substringWithRange:range]; - } - - return YES; -} - -- (void)setTextView:(UITextView *)textView -{ - _textView = textView; - _textView.layoutManager.delegate = self; -} - -#pragma mark - NSLayoutManager delegeate -/* - * TODO: Find out a way to set intendation for entire paragraphs. - */ - -- (CGFloat)layoutManager:(NSLayoutManager *)layoutManager paragraphSpacingBeforeGlyphAtIndex:(NSUInteger)glyphIndex withProposedLineFragmentRect:(CGRect)rect -{ - return 0; -} - -- (BOOL)layoutManager:(NSLayoutManager *)layoutManager shouldBreakLineByWordBeforeCharacterAtIndex:(NSUInteger)charIndex -{ - NSString *character = [layoutManager.textStorage.string substringWithRange:NSMakeRange(charIndex, 1)]; - // NSLog(@"Asked about linebreak: %@",character); - if ([character isEqualToString:@"*"]) return NO; - return YES; -} #pragma mark - Scopes @@ -246,48 +176,5 @@ - (void)clearColorAttributesInRange:(NSRange)range textStorage:(NSTextStorage *) [storage addAttribute:NSForegroundColorAttributeName value:self.colors[JLTokenTypeText] range:range]; } -#pragma mark - Color Themes - -- (NSDictionary *)defaultAttributes -{ - if (!_defaultAttributes) _defaultAttributes = @{NSForegroundColorAttributeName: self.colors[JLTokenTypeText], NSFontAttributeName : [UIFont fontWithName:@"Menlo" size:12]}; - return _defaultAttributes; -} - --(void)setTheme:(JLTokenizerTheme)theme -{ - self.colors = [Chromatism colorsForTheme:theme]; - self.textView.typingAttributes = @{ NSForegroundColorAttributeName : self.colors[JLTokenTypeText]}; - _theme = theme; - - //Set font, text color and background color back to default - UIColor *backgroundColor = self.colors[JLTokenTypeBackground]; - [self.textView setBackgroundColor:backgroundColor ? backgroundColor : [UIColor whiteColor] ]; -} - -- (NSDictionary *)colors -{ - if (!_colors) { - self.colors = [Chromatism colorsForTheme:self.theme]; - } - return _colors; -} - -- (void)setColors:(NSDictionary *)colors -{ - _colors = colors; -} - -- (NSArray *)themes -{ - if (!_themes) _themes = @[@(JLTokenizerThemeDefault),@(JLTokenizerThemeDusk)]; - return _themes; -} - -- (JLTokenizerTheme)theme -{ - if (!_theme) _theme = JLTokenizerThemeDefault; - return _theme; -} @end From 94fc0546530a477ecbd7d28eda5dba273656c42a Mon Sep 17 00:00:00 2001 From: Anviking Date: Thu, 1 Aug 2013 14:46:35 +0200 Subject: [PATCH 064/140] Added some delegates --- Chromatism/Chromatism/JLScope.h | 17 +++++++++++++++-- Chromatism/Chromatism/JLScope.m | 4 +++- Chromatism/Chromatism/JLTokenPattern.m | 3 ++- Chromatism/Chromatism/JLTokenizer.h | 13 ++++++++++++- Chromatism/Chromatism/JLTokenizer.m | 9 ++++++++- 5 files changed, 40 insertions(+), 6 deletions(-) diff --git a/Chromatism/Chromatism/JLScope.h b/Chromatism/Chromatism/JLScope.h index ab53e46..0217139 100644 --- a/Chromatism/Chromatism/JLScope.h +++ b/Chromatism/Chromatism/JLScope.h @@ -8,6 +8,8 @@ #import +@protocol JLScopeDelegate; + @interface JLScope : NSObject // Designated initializors @@ -66,8 +68,19 @@ @property (nonatomic, assign, getter = isEmpty) BOOL empty; /** - * A short description of the scope + * A identifier of the scope + */ +@property (nonatomic, copy) NSString *identifier; + +/** + * A simple delegate */ -@property (nonatomic, copy) NSString *descriptionName; +@property (nonatomic, weak) id delegate; + +@end + +@protocol JLScopeDelegate + +- (void)scopeDidFinishPerforming:(JLScope *)scope; @end diff --git a/Chromatism/Chromatism/JLScope.m b/Chromatism/Chromatism/JLScope.m index 217e12a..c422093 100644 --- a/Chromatism/Chromatism/JLScope.m +++ b/Chromatism/Chromatism/JLScope.m @@ -72,6 +72,7 @@ - (void)perform { NSAssert(!self.scope, @"Only call -perform to a rootlevel scope"); [self iterateSubscopes]; + if ([self.delegate respondsToSelector:@selector(scopeDidFinishPerforming:)]) [self.delegate scopeDidFinishPerforming:self]; } - (void)performInIndexSet:(NSIndexSet *)set @@ -79,6 +80,7 @@ - (void)performInIndexSet:(NSIndexSet *)set NSParameterAssert(set); self.set = [self.set intersectionWithSet:set]; [self iterateSubscopes]; + if ([self.delegate respondsToSelector:@selector(scopeDidFinishPerforming:)]) [self.delegate scopeDidFinishPerforming:self]; } #pragma mark - Scope Hierarchy Management @@ -133,7 +135,7 @@ - (NSMutableIndexSet *)set - (NSString *)description { NSString *subscopes = [[[[self.subscopes valueForKey:@"description"] componentsJoinedByString:@"\n"] componentsSeparatedByString:@"\n"] componentsJoinedByString:@"\n\t\t"]; - return [NSString stringWithFormat:@"%@, %@, nopaque: %i, nindexesSet:%@, \n subscopes, %@", NSStringFromClass(self.class), _descriptionName, _opaque, _set, subscopes]; + return [NSString stringWithFormat:@"%@, %@, nopaque: %i, nindexesSet:%@, \n subscopes, %@", NSStringFromClass(self.class), _identifier, _opaque, _set, subscopes]; } #pragma mark - NSCopying Protocol diff --git a/Chromatism/Chromatism/JLTokenPattern.m b/Chromatism/Chromatism/JLTokenPattern.m index 796889f..9b1e853 100644 --- a/Chromatism/Chromatism/JLTokenPattern.m +++ b/Chromatism/Chromatism/JLTokenPattern.m @@ -63,6 +63,7 @@ - (void)performInIndexSet:(NSIndexSet *)set }]; [self iterateSubscopes]; + if ([self.delegate respondsToSelector:@selector(scopeDidFinishPerforming:)]) [self.delegate scopeDidFinishPerforming:self]; } #pragma mark - Debugging @@ -70,7 +71,7 @@ - (void)performInIndexSet:(NSIndexSet *)set - (NSString *)description { NSString *subscopes = [[[[self.subscopes valueForKey:@"description"] componentsJoinedByString:@"\n"] componentsSeparatedByString:@"\n"] componentsJoinedByString:@"\n\t\t"]; - return [NSString stringWithFormat:@"%@, %@, Regex Pattern: %@, opaque: %i, indexesSet:%@ \nsubscopes, %@", NSStringFromClass(self.class), self.descriptionName, self.pattern, self.opaque, self.set, subscopes]; + return [NSString stringWithFormat:@"%@, %@, Regex Pattern: %@, opaque: %i, indexesSet:%@ \nsubscopes, %@", NSStringFromClass(self.class), self.identifier, self.pattern, self.opaque, self.set, subscopes]; } #pragma mark - NSCopying Protocol diff --git a/Chromatism/Chromatism/JLTokenizer.h b/Chromatism/Chromatism/JLTokenizer.h index 611d8d2..86dda1c 100644 --- a/Chromatism/Chromatism/JLTokenizer.h +++ b/Chromatism/Chromatism/JLTokenizer.h @@ -9,9 +9,13 @@ #import #import "Helpers.h" #import "Chromatism+Internal.h" +#import "JLScope.h" @class TextViewChange, JLTextView; -@interface JLTokenizer : NSObject + +@protocol JLTokenizerDelegate; + +@interface JLTokenizer : NSObject // Override to create your own syntax highlighting - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range; @@ -20,4 +24,11 @@ - (NSMutableAttributedString *)tokenizeString:(NSString *)string withDefaultAttributes:(NSDictionary *)attributes; @property (nonatomic, strong) NSDictionary *colors; +@property (nonatomic, weak) id delegate; +@end + +@protocol JLTokenizerDelegate + +- (void)scope:(JLScope *)scope didFinishProcessing:(JLTokenizer *)tokenizer; + @end diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index 5b154b4..61b8b08 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -95,6 +95,13 @@ - (void)textStorage:(NSTextStorage *)textStorage didProcessEditing:(NSTextStorag NSLog(@"Chromatism done tokenizing with time of %fms",ABS([date timeIntervalSinceNow]*1000)); } +#pragma mark - JLScope delegate + +- (void)scopeDidFinishPerforming:(JLScope *)scope +{ + if ([self.delegate respondsToSelector:@selector(scope:didFinishProcessing:)]) [self.delegate scope:scope didFinishProcessing:self]; +} + #pragma mark - Tokenizing - (JLTokenPattern *)addToken:(NSString *)type withPattern:(NSString *)pattern andScope:(JLScope *)scope @@ -107,7 +114,7 @@ - (JLTokenPattern *)addToken:(NSString *)type withPattern:(NSString *)pattern an NSAssert(color, @"%@ didn't return a color in color dictionary %@", type, self.colors); JLTokenPattern *token = [JLTokenPattern tokenPatternWithPattern:pattern andColor:self.colors[type]]; - token.descriptionName = type; + token.identifier = type; [scope addSubscope:token]; return token; } From c2bda64a537872688320b9f8a5f1bb32ca9ee396 Mon Sep 17 00:00:00 2001 From: Anviking Date: Thu, 1 Aug 2013 14:50:17 +0200 Subject: [PATCH 065/140] Fixed tests --- Chromatism/ChromatismTests/JLTokenizerTests.m | 1 + 1 file changed, 1 insertion(+) diff --git a/Chromatism/ChromatismTests/JLTokenizerTests.m b/Chromatism/ChromatismTests/JLTokenizerTests.m index 303a37f..3fd5ea8 100644 --- a/Chromatism/ChromatismTests/JLTokenizerTests.m +++ b/Chromatism/ChromatismTests/JLTokenizerTests.m @@ -29,6 +29,7 @@ - (void)setUp // Put setup code here. This method is called before the invocation of each test method in the class. tokenizer = [[JLTokenizer alloc] init]; + tokenizer.colors = [Chromatism colorsForTheme:JLTokenizerThemeDefault]; } - (void)tearDown From f4e7cfdada8607369b3d7bc556b9e8bd383ed817 Mon Sep 17 00:00:00 2001 From: Anviking Date: Thu, 1 Aug 2013 18:17:00 +0200 Subject: [PATCH 066/140] =?UTF-8?q?Don=E2=80=99t=20search=20for=20block=20?= =?UTF-8?q?comments=20unless=20=E2=80=99/=E2=80=99=20or=20=E2=80=99*?= =?UTF-8?q?=E2=80=99=20is=20either=20removed=20or=20added?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Chromatism/Chromatism/JLTextView.h | 3 ++- Chromatism/Chromatism/JLTextView.m | 10 +++++++++- Chromatism/Chromatism/JLTokenPattern.m | 2 +- Chromatism/Chromatism/JLTokenizer.h | 10 +++++++++- Chromatism/Chromatism/JLTokenizer.m | 22 ++++++++++++++++++++-- 5 files changed, 41 insertions(+), 6 deletions(-) diff --git a/Chromatism/Chromatism/JLTextView.h b/Chromatism/Chromatism/JLTextView.h index badb88a..ec7e124 100644 --- a/Chromatism/Chromatism/JLTextView.h +++ b/Chromatism/Chromatism/JLTextView.h @@ -8,10 +8,11 @@ #import #import "Chromatism+Internal.h" +#import "JLTokenizer.h" @class JLTokenizer; -@interface JLTextView : UITextView +@interface JLTextView : UITextView @property (nonatomic, strong) JLTokenizer *syntaxTokenizer; @property (nonatomic, assign) JLTokenizerTheme theme; diff --git a/Chromatism/Chromatism/JLTextView.m b/Chromatism/Chromatism/JLTextView.m index c18793b..4cf6115 100644 --- a/Chromatism/Chromatism/JLTextView.m +++ b/Chromatism/Chromatism/JLTextView.m @@ -7,7 +7,6 @@ // #import "JLTextView.h" -#import "JLTokenizer.h" #import "Chromatism.h" @implementation JLTextView @@ -52,6 +51,7 @@ - (void)setup self.syntaxTokenizer = [[JLTokenizer alloc] init]; self.textStorage.delegate = self.syntaxTokenizer; self.theme = JLTokenizerThemeDusk; + self.syntaxTokenizer.dataSource = self; // Set default properties self.scrollEnabled = YES; @@ -122,10 +122,18 @@ - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range r { _oldString = [textView.text substringWithRange:range]; } + else _oldString = @""; return YES; } +#pragma mark - JLTokenizer data source + +- (NSString *)recentlyReplacedText +{ + return _oldString; +} + #pragma mark - NSLayoutManager delegeate /* * TODO: Find out a way to set intendation for entire paragraphs. diff --git a/Chromatism/Chromatism/JLTokenPattern.m b/Chromatism/Chromatism/JLTokenPattern.m index 9b1e853..665c83e 100644 --- a/Chromatism/Chromatism/JLTokenPattern.m +++ b/Chromatism/Chromatism/JLTokenPattern.m @@ -1,4 +1,4 @@ -// + // // JLTokenPattern.m // iGitpad // diff --git a/Chromatism/Chromatism/JLTokenizer.h b/Chromatism/Chromatism/JLTokenizer.h index 86dda1c..fb47e4f 100644 --- a/Chromatism/Chromatism/JLTokenizer.h +++ b/Chromatism/Chromatism/JLTokenizer.h @@ -13,7 +13,7 @@ @class TextViewChange, JLTextView; -@protocol JLTokenizerDelegate; +@protocol JLTokenizerDelegate, JLTokenizerDataSource; @interface JLTokenizer : NSObject @@ -25,6 +25,14 @@ @property (nonatomic, strong) NSDictionary *colors; @property (nonatomic, weak) id delegate; +@property (nonatomic, weak) id dataSource; +@end + +@protocol JLTokenizerDataSource + +/// Return the text that was replaced in the most recent text edit or an empty string if there is none. +- (NSString *)recentlyReplacedText; + @end @protocol JLTokenizerDelegate diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index 61b8b08..f134c99 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -119,16 +119,34 @@ - (JLTokenPattern *)addToken:(NSString *)type withPattern:(NSString *)pattern an return token; } +- (BOOL)characters:(NSString *)characters appearInString:(NSString *)string +{ + if (!characters && !string) return NO; + return ([string rangeOfCharacterFromSet:[NSCharacterSet characterSetWithCharactersInString:characters]].location != NSNotFound); +} + - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range { // First, remove old attributes [self clearColorAttributesInRange:range textStorage:storage]; - + + // Get the string with everything that has changed + NSString *newString = [storage.string substringWithRange:range]; + NSString *oldString = [self.dataSource recentlyReplacedText]; + + NSString *diffString; + if (newString && oldString) { + diffString = [newString stringByAppendingString:oldString]; + } + JLScope *documentScope = [JLScope scopeWithTextStorage:storage]; JLScope *rangeScope = [JLScope scopeWithRange:range inTextStorage:storage]; // Block and line comments - [self addToken:JLTokenTypeComment withPattern:@"/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*+/" andScope:documentScope]; + if ([self characters:@"/*" appearInString:diffString]) { + [self addToken:JLTokenTypeComment withPattern:@"/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*+/" andScope:documentScope]; + } + [self addToken:JLTokenTypeComment withPattern:@"//.*+$" andScope:rangeScope]; // Preprocessor macros From 1e2814a165db4c610554a89f25bc0d196319616d Mon Sep 17 00:00:00 2001 From: Anviking Date: Thu, 1 Aug 2013 18:39:45 +0200 Subject: [PATCH 067/140] =?UTF-8?q?Don=E2=80=99t=20create=20new=20scopes?= =?UTF-8?q?=20(creating=20NSRegularExpressions=20are=20expensive)=20for=20?= =?UTF-8?q?every=20text=20change?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Chromatism/Chromatism/JLScope.h | 1 + Chromatism/Chromatism/JLScope.m | 8 ++ Chromatism/Chromatism/JLTokenizer.m | 197 +++++++++++++++++----------- 3 files changed, 126 insertions(+), 80 deletions(-) diff --git a/Chromatism/Chromatism/JLScope.h b/Chromatism/Chromatism/JLScope.h index 0217139..80481d2 100644 --- a/Chromatism/Chromatism/JLScope.h +++ b/Chromatism/Chromatism/JLScope.h @@ -22,6 +22,7 @@ */ - (void)perform; - (void)performInIndexSet:(NSIndexSet *)set; +- (void)reset; /// The color @property (nonatomic, strong) UIColor *color; diff --git a/Chromatism/Chromatism/JLScope.m b/Chromatism/Chromatism/JLScope.m index c422093..0969297 100644 --- a/Chromatism/Chromatism/JLScope.m +++ b/Chromatism/Chromatism/JLScope.m @@ -83,6 +83,14 @@ - (void)performInIndexSet:(NSIndexSet *)set if ([self.delegate respondsToSelector:@selector(scopeDidFinishPerforming:)]) [self.delegate scopeDidFinishPerforming:self]; } +- (void)reset +{ + self.set = nil; + for (JLScope *scope in self.subscopes) { + [scope reset]; + } +} + #pragma mark - Scope Hierarchy Management - (NSMutableArray *)subscopes diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index f134c99..b18dece 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -44,42 +44,96 @@ @interface JLTokenizer () +@property (nonatomic, strong) JLScope *documentScope; +@property (nonatomic, strong) JLScope *lineScope; + @end @implementation JLTokenizer -#pragma mark - Scopes +#pragma mark - Setup + +- (void)setup +{ + JLScope *documentScope = [JLScope new]; + JLScope *lineScope = [JLScope new]; + + // Block and line comments + [self addToken:JLTokenTypeComment withPattern:@"/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*+/" andScope:documentScope]; + + [self addToken:JLTokenTypeComment withPattern:@"//.*+$" andScope:lineScope]; + + // Preprocessor macros + JLTokenPattern *preprocessor = [self addToken:JLTokenTypePreprocessor withPattern:@"^#.*+$" andScope:lineScope]; + + // #import + // In xcode it only works for #import and #include, not all preprocessor statements. + [self addToken:JLTokenTypeString withPattern:@"<.*?>" andScope:preprocessor]; + + // Strings + [[self addToken:JLTokenTypeString withPattern:@"(\"|@\")[^\"\\n]*(@\"|\")" andScope:lineScope] addScope:preprocessor]; + + // Numbers + [self addToken:JLTokenTypeNumber withPattern:@"(?<=\\s)\\d+" andScope:lineScope]; + + // New literals, for example @[] + // TODO: Literals don't search through multiple lines. Nor does it keep track of nested things. + [[self addToken:JLTokenTypeNumber withPattern:@"@[\\(|\\{|\\[][^\\(\\{\\[]+[\\)|\\}|\\]]" andScope:lineScope] setOpaque:NO]; + + // C function names + [[self addToken:JLTokenTypeOtherMethodNames withPattern:@"\\w+\\s*(?>\\(.*\\)" andScope:lineScope] setCaptureGroup:1]; + + // Dot notation + [[self addToken:JLTokenTypeOtherMethodNames withPattern:@"\\.(\\w+)" andScope:lineScope] setCaptureGroup:1]; + + // Method Calls + [[self addToken:JLTokenTypeOtherMethodNames withPattern:@"\\[\\w+\\s+(\\w+)\\]" andScope:lineScope] setCaptureGroup:1]; + + // Method call parts + [[self addToken:JLTokenTypeOtherMethodNames withPattern:@"(?<=\\w+):\\s*[^\\s;\\]]+" andScope:lineScope] setCaptureGroup:1]; + + [self addToken:JLTokenTypeKeyword withPattern:@"\\b(true|false|yes|no|TRUE|FALSE|bool|BOOL|nil|id|void|self|NULL|if|else|strong|weak|nonatomic|atomic|assign|copy|typedef|enum|auto|break|case|const|char|continue|do|default|double|extern|float|for|goto|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|volatile|while|nonatomic|atomic|nonatomic|readonly|super)\\b" andScope:lineScope]; + [self addToken:JLTokenTypeKeyword withPattern:@"@[a-zA-Z0-9_]+" andScope:lineScope]; + + // Other Class Names + [self addToken:JLTokenTypeOtherClassNames withPattern:@"\\b[A-Z]{3}[a-zA-Z]*\\b" andScope:lineScope]; + + [documentScope addSubscope:lineScope]; + + self.documentScope = documentScope; + self.lineScope = lineScope; +} + +- (JLScope *)documentScope +{ + if (!_documentScope) [self setup]; + return _documentScope; +} + +- (JLScope *)lineScope +{ + if (!_lineScope) [self setup]; + return _lineScope; +} +//// Get the string with everything that has changed +//NSString *newString = [storage.string substringWithRange:range]; +//NSString *oldString = [self.dataSource recentlyReplacedText]; // -// NOT COMPLETED +//NSString *diffString; +//if (newString && oldString) { +// diffString = [newString stringByAppendingString:oldString]; +//} // -//- (void)refreshScopesInTextStorage:(NSTextStorage *)textStorage; -//{ -// NSString *string = textStorage.string; -// __block NSUInteger scope = 0; -// -// -// NSString *pattern = @"\\{|\\}"; -// NSError *error; -// NSString *attribute = @"ChromatismScopeAttributeName"; -// NSRegularExpression *expression = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:&error]; +//JLScope *documentScope = [JLScope scopeWithTextStorage:storage]; +//JLScope *rangeScope = [JLScope scopeWithRange:range inTextStorage:storage]; // -// NSAssert(!error, @"%@",error); -// -// [expression enumerateMatchesInString:string options:0 range:NSMakeRange(0, textStorage.length) usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { -// NSString *substring = [string substringWithRange:result.range]; -// if ([substring isEqualToString:@"{"]) { -// scope++; -// } -// else scope--; -// NSLog(@"Scope is %i",scope); -// float f = 0.3 + ((float)scope/10); -// NSLog(@"Color is :%f",f); -// UIColor *color = [UIColor colorWithWhite:f alpha:1]; -// [textStorage addAttribute:NSForegroundColorAttributeName value:color range:NSMakeRange(result.range.location, string.length - result.range.location)]; -// }]; +//// Block and line comments +//if ([self characters:@"/*" appearInString:diffString]) { +// [self addToken:JLTokenTypeComment withPattern:@"/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*+/" andScope:documentScope]; //} + #pragma mark - NSTextStorageDelegate - (void)textStorage:(NSTextStorage *)textStorage willProcessEditing:(NSTextStorageEditActions)editedMask range:(NSRange)editedRange changeInLength:(NSInteger)delta @@ -130,62 +184,13 @@ - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range // First, remove old attributes [self clearColorAttributesInRange:range textStorage:storage]; - // Get the string with everything that has changed - NSString *newString = [storage.string substringWithRange:range]; - NSString *oldString = [self.dataSource recentlyReplacedText]; - - NSString *diffString; - if (newString && oldString) { - diffString = [newString stringByAppendingString:oldString]; - } - - JLScope *documentScope = [JLScope scopeWithTextStorage:storage]; - JLScope *rangeScope = [JLScope scopeWithRange:range inTextStorage:storage]; - - // Block and line comments - if ([self characters:@"/*" appearInString:diffString]) { - [self addToken:JLTokenTypeComment withPattern:@"/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*+/" andScope:documentScope]; - } - - [self addToken:JLTokenTypeComment withPattern:@"//.*+$" andScope:rangeScope]; - - // Preprocessor macros - JLTokenPattern *preprocessor = [self addToken:JLTokenTypePreprocessor withPattern:@"^#.*+$" andScope:rangeScope]; - - // #import - // In xcode it only works for #import and #include, not all preprocessor statements. - [self addToken:JLTokenTypeString withPattern:@"<.*?>" andScope:preprocessor]; - - // Strings - [[self addToken:JLTokenTypeString withPattern:@"(\"|@\")[^\"\\n]*(@\"|\")" andScope:rangeScope] addScope:preprocessor]; + [self.documentScope reset]; - // Numbers - [self addToken:JLTokenTypeNumber withPattern:@"(?<=\\s)\\d+" andScope:rangeScope]; + [self.documentScope setTextStorage:storage]; + [self.documentScope.set addIndexesInRange:NSMakeRange(0, storage.length)]; + [self.lineScope.set addIndexesInRange:range]; - // New literals, for example @[] - // TODO: Literals don't search through multiple lines. Nor does it keep track of nested things. - [[self addToken:JLTokenTypeNumber withPattern:@"@[\\(|\\{|\\[][^\\(\\{\\[]+[\\)|\\}|\\]]" andScope:rangeScope] setOpaque:NO]; - - // C function names - [[self addToken:JLTokenTypeOtherMethodNames withPattern:@"\\w+\\s*(?>\\(.*\\)" andScope:rangeScope] setCaptureGroup:1]; - - // Dot notation - [[self addToken:JLTokenTypeOtherMethodNames withPattern:@"\\.(\\w+)" andScope:rangeScope] setCaptureGroup:1]; - - // Method Calls - [[self addToken:JLTokenTypeOtherMethodNames withPattern:@"\\[\\w+\\s+(\\w+)\\]" andScope:rangeScope] setCaptureGroup:1]; - - // Method call parts - [[self addToken:JLTokenTypeOtherMethodNames withPattern:@"(?<=\\w+):\\s*[^\\s;\\]]+" andScope:rangeScope] setCaptureGroup:1]; - - [self addToken:JLTokenTypeKeyword withPattern:@"\\b(true|false|yes|no|TRUE|FALSE|bool|BOOL|nil|id|void|self|NULL|if|else|strong|weak|nonatomic|atomic|assign|copy|typedef|enum|auto|break|case|const|char|continue|do|default|double|extern|float|for|goto|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|volatile|while|nonatomic|atomic|nonatomic|readonly|super)\\b" andScope:rangeScope]; - [self addToken:JLTokenTypeKeyword withPattern:@"@[a-zA-Z0-9_]+" andScope:rangeScope]; - - // Other Class Names - [self addToken:JLTokenTypeOtherClassNames withPattern:@"\\b[A-Z]{3}[a-zA-Z]*\\b" andScope:rangeScope]; - - [documentScope addSubscope:rangeScope]; - [documentScope perform]; + [self.documentScope perform]; } - (NSMutableAttributedString *)tokenizeString:(NSString *)string withDefaultAttributes:(NSDictionary *)attributes; @@ -201,5 +206,37 @@ - (void)clearColorAttributesInRange:(NSRange)range textStorage:(NSTextStorage *) [storage addAttribute:NSForegroundColorAttributeName value:self.colors[JLTokenTypeText] range:range]; } +#pragma mark - Scopes + +// +// NOT COMPLETED +// +//- (void)refreshScopesInTextStorage:(NSTextStorage *)textStorage; +//{ +// NSString *string = textStorage.string; +// __block NSUInteger scope = 0; +// +// +// NSString *pattern = @"\\{|\\}"; +// NSError *error; +// NSString *attribute = @"ChromatismScopeAttributeName"; +// NSRegularExpression *expression = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:&error]; +// +// NSAssert(!error, @"%@",error); +// +// [expression enumerateMatchesInString:string options:0 range:NSMakeRange(0, textStorage.length) usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { +// NSString *substring = [string substringWithRange:result.range]; +// if ([substring isEqualToString:@"{"]) { +// scope++; +// } +// else scope--; +// NSLog(@"Scope is %i",scope); +// float f = 0.3 + ((float)scope/10); +// NSLog(@"Color is :%f",f); +// UIColor *color = [UIColor colorWithWhite:f alpha:1]; +// [textStorage addAttribute:NSForegroundColorAttributeName value:color range:NSMakeRange(result.range.location, string.length - result.range.location)]; +// }]; +//} + @end From 22d741f6e1941c838e8d5ef7b71ca81fe6b84f74 Mon Sep 17 00:00:00 2001 From: Anviking Date: Thu, 1 Aug 2013 20:48:15 +0200 Subject: [PATCH 068/140] Some refactoring and added triggeringCharacterSet --- Chromatism/Chromatism/JLScope.h | 19 +++++- Chromatism/Chromatism/JLScope.m | 30 +++++++-- Chromatism/Chromatism/JLTextView.m | 3 +- Chromatism/Chromatism/JLTokenPattern.m | 2 + Chromatism/Chromatism/JLTokenizer.m | 84 +++++++++++++++----------- 5 files changed, 92 insertions(+), 46 deletions(-) diff --git a/Chromatism/Chromatism/JLScope.h b/Chromatism/Chromatism/JLScope.h index 80481d2..db7a8f5 100644 --- a/Chromatism/Chromatism/JLScope.h +++ b/Chromatism/Chromatism/JLScope.h @@ -69,19 +69,32 @@ @property (nonatomic, assign, getter = isEmpty) BOOL empty; /** - * A identifier of the scope + * An unique identifier of the scope */ -@property (nonatomic, copy) NSString *identifier; +@property (nonatomic, assign) NSString *identifier; + +/** + * What kind of scope is this? + */ +@property (nonatomic, copy) NSString *type; /** * A simple delegate */ @property (nonatomic, weak) id delegate; +/** + * If provided, the scope will only perform when matches of the set is found in the string returned from the -mergedModifiedStringForScope: delegate method. + */ +@property (nonatomic, strong) NSCharacterSet *triggeringCharacterSet; + @end @protocol JLScopeDelegate - +@optional +/// @see JLTokenizer and -triggeringCharacterSet +- (NSString *)mergedModifiedStringForScope:(JLScope *)scope; +- (BOOL)scopeShouldPerform:(JLScope *)scope; - (void)scopeDidFinishPerforming:(JLScope *)scope; @end diff --git a/Chromatism/Chromatism/JLScope.m b/Chromatism/Chromatism/JLScope.m index 0969297..edef1ce 100644 --- a/Chromatism/Chromatism/JLScope.m +++ b/Chromatism/Chromatism/JLScope.m @@ -10,10 +10,10 @@ #import "Helpers.h" @interface JLScope () -@property (nonatomic, readwrite, strong) NSString *string; - (void)iterateSubscopes; +@property (nonatomic, readwrite, strong) NSString *string; @end @implementation JLScope @@ -71,15 +71,19 @@ - (void)iterateSubscopes - (void)perform { NSAssert(!self.scope, @"Only call -perform to a rootlevel scope"); + if (![self shouldPerform]) return; [self iterateSubscopes]; + if ([self.delegate respondsToSelector:@selector(scopeDidFinishPerforming:)]) [self.delegate scopeDidFinishPerforming:self]; } - (void)performInIndexSet:(NSIndexSet *)set { NSParameterAssert(set); + if (![self shouldPerform]) return; self.set = [self.set intersectionWithSet:set]; [self iterateSubscopes]; + if ([self.delegate respondsToSelector:@selector(scopeDidFinishPerforming:)]) [self.delegate scopeDidFinishPerforming:self]; } @@ -91,6 +95,21 @@ - (void)reset } } +- (BOOL)shouldPerform +{ + if ([self.delegate respondsToSelector:@selector(scopeShouldPerform:)]) return [self.delegate scopeShouldPerform:self]; + + if (self.triggeringCharacterSet) { + NSString *string = [self.delegate mergedModifiedStringForScope:self]; + if (!string) return YES; + if ([string rangeOfCharacterFromSet:self.triggeringCharacterSet].location == NSNotFound) { + return NO; + } + return YES; + } + return YES; +} + #pragma mark - Scope Hierarchy Management - (NSMutableArray *)subscopes @@ -126,12 +145,13 @@ - (void)removeSubscope:(JLScope *)subscope [(NSMutableArray *)self.subscopes removeObject:subscope]; } -- (void)setTextStorage:(NSTextStorage *)textStorage +#pragma mark - Properties + +- (NSString *)string { - _textStorage = textStorage; - _string = textStorage.string; + if (!_string) _string = self.textStorage.string; + return _string; } - - (NSMutableIndexSet *)set { if (!_set) _set = [NSMutableIndexSet indexSet]; diff --git a/Chromatism/Chromatism/JLTextView.m b/Chromatism/Chromatism/JLTextView.m index 4cf6115..5db43ed 100644 --- a/Chromatism/Chromatism/JLTextView.m +++ b/Chromatism/Chromatism/JLTextView.m @@ -118,8 +118,7 @@ - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range r return NO; } - if (range.length > 0) - { + if (range.length > 0) { _oldString = [textView.text substringWithRange:range]; } else _oldString = @""; diff --git a/Chromatism/Chromatism/JLTokenPattern.m b/Chromatism/Chromatism/JLTokenPattern.m index 665c83e..183da0f 100644 --- a/Chromatism/Chromatism/JLTokenPattern.m +++ b/Chromatism/Chromatism/JLTokenPattern.m @@ -11,6 +11,7 @@ @interface JLScope () @property (nonatomic, readwrite, strong) NSString *string; - (void)iterateSubscopes; +- (BOOL)shouldPerform; @end @implementation JLTokenPattern @@ -55,6 +56,7 @@ - (void)setPattern:(NSString *)pattern - (void)performInIndexSet:(NSIndexSet *)set { + if (![self shouldPerform]) return; [set enumerateRangesUsingBlock:^(NSRange range, BOOL *stop) { [self.expression enumerateMatchesInString:self.string options:self.matchingOptions range:range usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { [self.textStorage addAttribute:NSForegroundColorAttributeName value:self.color range:[result rangeAtIndex:self.captureGroup]]; diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index b18dece..892d68a 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -42,6 +42,9 @@ #import "JLTokenPattern.h" #import "Chromatism.h" +#define BLOCK_COMMENT @"blockComment" +#define LINE_COMMENT @"lineComment" + @interface JLTokenizer () @property (nonatomic, strong) JLScope *documentScope; @@ -50,6 +53,10 @@ @interface JLTokenizer () @end @implementation JLTokenizer +{ + NSRange _editedRange; + NSRange _editedLineRange; +} #pragma mark - Setup @@ -59,12 +66,13 @@ - (void)setup JLScope *lineScope = [JLScope new]; // Block and line comments - [self addToken:JLTokenTypeComment withPattern:@"/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*+/" andScope:documentScope]; + JLTokenPattern *blockComment = [self addToken:JLTokenTypeComment withIdentifier:BLOCK_COMMENT pattern:@"/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*+/" andScope:documentScope]; + blockComment.triggeringCharacterSet = [NSCharacterSet characterSetWithCharactersInString:@"/*"]; - [self addToken:JLTokenTypeComment withPattern:@"//.*+$" andScope:lineScope]; + [self addToken:JLTokenTypeComment withIdentifier:LINE_COMMENT pattern:@"//.*+$" andScope:lineScope]; // Preprocessor macros - JLTokenPattern *preprocessor = [self addToken:JLTokenTypePreprocessor withPattern:@"^#.*+$" andScope:lineScope]; + JLTokenPattern *preprocessor = [self addToken:JLTokenTypePreprocessor withIdentifier:nil pattern:@"^#.*+$" andScope:lineScope]; // #import // In xcode it only works for #import and #include, not all preprocessor statements. @@ -116,24 +124,6 @@ - (JLScope *)lineScope return _lineScope; } -//// Get the string with everything that has changed -//NSString *newString = [storage.string substringWithRange:range]; -//NSString *oldString = [self.dataSource recentlyReplacedText]; -// -//NSString *diffString; -//if (newString && oldString) { -// diffString = [newString stringByAppendingString:oldString]; -//} -// -//JLScope *documentScope = [JLScope scopeWithTextStorage:storage]; -//JLScope *rangeScope = [JLScope scopeWithRange:range inTextStorage:storage]; -// -//// Block and line comments -//if ([self characters:@"/*" appearInString:diffString]) { -// [self addToken:JLTokenTypeComment withPattern:@"/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*+/" andScope:documentScope]; -//} - - #pragma mark - NSTextStorageDelegate - (void)textStorage:(NSTextStorage *)textStorage willProcessEditing:(NSTextStorageEditActions)editedMask range:(NSRange)editedRange changeInLength:(NSInteger)delta @@ -143,9 +133,11 @@ - (void)textStorage:(NSTextStorage *)textStorage willProcessEditing:(NSTextStora - (void)textStorage:(NSTextStorage *)textStorage didProcessEditing:(NSTextStorageEditActions)editedMask range:(NSRange)editedRange changeInLength:(NSInteger)delta { + _editedRange = editedRange; + _editedLineRange = [textStorage.string lineRangeForRange:editedRange]; // Measure performance NSDate *date = [NSDate date]; - [self tokenizeTextStorage:textStorage withRange:[textStorage.string lineRangeForRange:editedRange]]; + [self tokenizeTextStorage:textStorage withRange:_editedLineRange]; NSLog(@"Chromatism done tokenizing with time of %fms",ABS([date timeIntervalSinceNow]*1000)); } @@ -156,23 +148,18 @@ - (void)scopeDidFinishPerforming:(JLScope *)scope if ([self.delegate respondsToSelector:@selector(scope:didFinishProcessing:)]) [self.delegate scope:scope didFinishProcessing:self]; } -#pragma mark - Tokenizing - -- (JLTokenPattern *)addToken:(NSString *)type withPattern:(NSString *)pattern andScope:(JLScope *)scope +- (NSString *)mergedModifiedStringForScope:(JLScope *)scope { - NSParameterAssert(type); - NSParameterAssert(pattern); - NSParameterAssert(scope); - UIColor *color = self.colors[type]; - - NSAssert(color, @"%@ didn't return a color in color dictionary %@", type, self.colors); - - JLTokenPattern *token = [JLTokenPattern tokenPatternWithPattern:pattern andColor:self.colors[type]]; - token.identifier = type; - [scope addSubscope:token]; - return token; + NSString *oldString = [self.dataSource recentlyReplacedText]; + NSString *newString = [scope.string substringWithRange:_editedLineRange]; + if (oldString && newString) { + return [oldString stringByAppendingString:newString]; + } + return nil; } +#pragma mark - Tokenizing + - (BOOL)characters:(NSString *)characters appearInString:(NSString *)string { if (!characters && !string) return NO; @@ -200,6 +187,31 @@ - (NSMutableAttributedString *)tokenizeString:(NSString *)string withDefaultAttr return attributedString; } +#pragma mark - Helpers + +- (JLTokenPattern *)addToken:(NSString *)type withPattern:(NSString *)pattern andScope:(JLScope *)scope +{ + return [self addToken:type withIdentifier:type pattern:pattern andScope:scope]; +} + +- (JLTokenPattern *)addToken:(NSString *)type withIdentifier:(NSString *)identifier pattern:(NSString *)pattern andScope:(JLScope *)scope +{ + NSParameterAssert(type); + NSParameterAssert(pattern); + NSParameterAssert(scope); + UIColor *color = self.colors[type]; + + NSAssert(color, @"%@ didn't return a color in color dictionary %@", type, self.colors); + + JLTokenPattern *token = [JLTokenPattern tokenPatternWithPattern:pattern andColor:self.colors[type]]; + token.identifier = identifier; + token.type = type; + token.delegate = self; + [scope addSubscope:token]; + + return token; +} + - (void)clearColorAttributesInRange:(NSRange)range textStorage:(NSTextStorage *)storage; { [storage removeAttribute:NSForegroundColorAttributeName range:range]; From 23b701478466d6062080c00753ef111cae340671 Mon Sep 17 00:00:00 2001 From: Anviking Date: Thu, 1 Aug 2013 21:17:13 +0200 Subject: [PATCH 069/140] Simplified patterns --- Chromatism/Chromatism/JLTokenizer.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index 892d68a..e305bf6 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -66,7 +66,7 @@ - (void)setup JLScope *lineScope = [JLScope new]; // Block and line comments - JLTokenPattern *blockComment = [self addToken:JLTokenTypeComment withIdentifier:BLOCK_COMMENT pattern:@"/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*+/" andScope:documentScope]; + JLTokenPattern *blockComment = [self addToken:JLTokenTypeComment withIdentifier:BLOCK_COMMENT pattern:@"/\\*.*?\\*/" andScope:documentScope]; blockComment.triggeringCharacterSet = [NSCharacterSet characterSetWithCharactersInString:@"/*"]; [self addToken:JLTokenTypeComment withIdentifier:LINE_COMMENT pattern:@"//.*+$" andScope:lineScope]; @@ -85,8 +85,8 @@ - (void)setup [self addToken:JLTokenTypeNumber withPattern:@"(?<=\\s)\\d+" andScope:lineScope]; // New literals, for example @[] - // TODO: Literals don't search through multiple lines. Nor does it keep track of nested things. - [[self addToken:JLTokenTypeNumber withPattern:@"@[\\(|\\{|\\[][^\\(\\{\\[]+[\\)|\\}|\\]]" andScope:lineScope] setOpaque:NO]; + // TODO: Highlight the closing bracket too, but with some special "nested-token-pattern" + [[self addToken:JLTokenTypeNumber withPattern:@"@[\\[|\\{|\\(]" andScope:lineScope] setOpaque:NO]; // C function names [[self addToken:JLTokenTypeOtherMethodNames withPattern:@"\\w+\\s*(?>\\(.*\\)" andScope:lineScope] setCaptureGroup:1]; From 7ead3e029c3cc48b09c10bdca16abf1775056b57 Mon Sep 17 00:00:00 2001 From: Anviking Date: Thu, 1 Aug 2013 21:34:21 +0200 Subject: [PATCH 070/140] Added and implemented -attributesForScope: delegate method --- Chromatism/Chromatism/JLScope.h | 7 ++++--- Chromatism/Chromatism/JLScope.m | 3 +++ Chromatism/Chromatism/JLTokenPattern.h | 2 +- Chromatism/Chromatism/JLTokenPattern.m | 11 +++++++---- Chromatism/Chromatism/JLTokenizer.m | 9 ++++++++- 5 files changed, 23 insertions(+), 9 deletions(-) diff --git a/Chromatism/Chromatism/JLScope.h b/Chromatism/Chromatism/JLScope.h index db7a8f5..e1b4585 100644 --- a/Chromatism/Chromatism/JLScope.h +++ b/Chromatism/Chromatism/JLScope.h @@ -24,9 +24,6 @@ - (void)performInIndexSet:(NSIndexSet *)set; - (void)reset; -/// The color -@property (nonatomic, strong) UIColor *color; - /** * Array of nested JLScopes and JLTokenPatterns. Reverse realationship to scope, setting one causes the other to update. No not mutate. */ @@ -92,8 +89,12 @@ @protocol JLScopeDelegate @optional + +- (NSDictionary *)attributesForScope:(JLScope *)scope; + /// @see JLTokenizer and -triggeringCharacterSet - (NSString *)mergedModifiedStringForScope:(JLScope *)scope; + - (BOOL)scopeShouldPerform:(JLScope *)scope; - (void)scopeDidFinishPerforming:(JLScope *)scope; diff --git a/Chromatism/Chromatism/JLScope.m b/Chromatism/Chromatism/JLScope.m index edef1ce..5267583 100644 --- a/Chromatism/Chromatism/JLScope.m +++ b/Chromatism/Chromatism/JLScope.m @@ -175,6 +175,9 @@ - (id)copyWithZone:(NSZone *)zone [scope addSubscope:subscope.copy]; } scope.textStorage = self.textStorage; + scope.delegate = self.delegate; + scope.type = self.type.copy; + scope.identifier = self.identifier.copy; return scope; } diff --git a/Chromatism/Chromatism/JLTokenPattern.h b/Chromatism/Chromatism/JLTokenPattern.h index 060a7b0..5840a1f 100644 --- a/Chromatism/Chromatism/JLTokenPattern.h +++ b/Chromatism/Chromatism/JLTokenPattern.h @@ -10,7 +10,7 @@ @interface JLTokenPattern : JLScope -+ (instancetype)tokenPatternWithPattern:(NSString *)pattern andColor:(UIColor *)color; ++ (instancetype)tokenPatternWithPattern:(NSString *)pattern; // Setting either expression or pattern causes the other one to update. @property (nonatomic, strong) NSRegularExpression *expression; diff --git a/Chromatism/Chromatism/JLTokenPattern.m b/Chromatism/Chromatism/JLTokenPattern.m index 183da0f..dc5abc8 100644 --- a/Chromatism/Chromatism/JLTokenPattern.m +++ b/Chromatism/Chromatism/JLTokenPattern.m @@ -18,10 +18,9 @@ @implementation JLTokenPattern #pragma mark - Initialization -+ (instancetype)tokenPatternWithPattern:(NSString *)pattern andColor:(UIColor *)color ++ (instancetype)tokenPatternWithPattern:(NSString *)pattern { JLTokenPattern *tokenPattern = [JLTokenPattern new]; - tokenPattern.color = color; tokenPattern.pattern = pattern; return tokenPattern; } @@ -57,9 +56,11 @@ - (void)setPattern:(NSString *)pattern - (void)performInIndexSet:(NSIndexSet *)set { if (![self shouldPerform]) return; + NSDictionary *attributes = [self.delegate attributesForScope:self]; + NSAssert(attributes, @""); [set enumerateRangesUsingBlock:^(NSRange range, BOOL *stop) { [self.expression enumerateMatchesInString:self.string options:self.matchingOptions range:range usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { - [self.textStorage addAttribute:NSForegroundColorAttributeName value:self.color range:[result rangeAtIndex:self.captureGroup]]; + [self.textStorage addAttributes:attributes range:[result rangeAtIndex:self.captureGroup]]; [self.set addIndexesInRange:[result rangeAtIndex:self.captureGroup]]; }]; }]; @@ -87,7 +88,9 @@ - (id)copyWithZone:(NSZone *)zone pattern.textStorage = self.textStorage; pattern.expression = self.expression; pattern.set = self.set.mutableCopy; - pattern.color = self.color; + pattern.delegate = self.delegate; + pattern.type = self.type.copy; + pattern.identifier = self.identifier.copy; return pattern; } diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index e305bf6..4825c2a 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -158,6 +158,13 @@ - (NSString *)mergedModifiedStringForScope:(JLScope *)scope return nil; } +- (NSDictionary *)attributesForScope:(JLScope *)scope +{ + UIColor *color = self.colors[scope.type]; + NSAssert(color, @"Didn't get a color for type:%@ in colorDictionary: %@",scope.type, self.colors); + return @{ NSForegroundColorAttributeName : color }; +} + #pragma mark - Tokenizing - (BOOL)characters:(NSString *)characters appearInString:(NSString *)string @@ -203,7 +210,7 @@ - (JLTokenPattern *)addToken:(NSString *)type withIdentifier:(NSString *)identif NSAssert(color, @"%@ didn't return a color in color dictionary %@", type, self.colors); - JLTokenPattern *token = [JLTokenPattern tokenPatternWithPattern:pattern andColor:self.colors[type]]; + JLTokenPattern *token = [JLTokenPattern tokenPatternWithPattern:pattern]; token.identifier = identifier; token.type = type; token.delegate = self; From 01121c99dda9ad504aaad60223f1c96e528d9e6c Mon Sep 17 00:00:00 2001 From: Anviking Date: Thu, 1 Aug 2013 23:20:35 +0200 Subject: [PATCH 071/140] minor --- Chromatism/Chromatism/JLTokenizer.h | 1 + Chromatism/Chromatism/JLTokenizer.m | 5 ++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Chromatism/Chromatism/JLTokenizer.h b/Chromatism/Chromatism/JLTokenizer.h index fb47e4f..448f50f 100644 --- a/Chromatism/Chromatism/JLTokenizer.h +++ b/Chromatism/Chromatism/JLTokenizer.h @@ -19,6 +19,7 @@ // Override to create your own syntax highlighting - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range; +- (void)tokenizeTextStorage:(NSTextStorage *)storage; - (void)clearColorAttributesInRange:(NSRange)range textStorage:(NSTextStorage *)storage; - (NSMutableAttributedString *)tokenizeString:(NSString *)string withDefaultAttributes:(NSDictionary *)attributes; diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index 4825c2a..b17400f 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -167,10 +167,9 @@ - (NSDictionary *)attributesForScope:(JLScope *)scope #pragma mark - Tokenizing -- (BOOL)characters:(NSString *)characters appearInString:(NSString *)string +- (void)tokenizeTextStorage:(NSTextStorage *)storage { - if (!characters && !string) return NO; - return ([string rangeOfCharacterFromSet:[NSCharacterSet characterSetWithCharactersInString:characters]].location != NSNotFound); + [self tokenizeTextStorage:storage withRange:NSMakeRange(0, storage.length)]; } - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range From 786fb58eecb2d9740c5c1b0dcd4beb6f4a868aa6 Mon Sep 17 00:00:00 2001 From: Anviking Date: Thu, 1 Aug 2013 23:38:54 +0200 Subject: [PATCH 072/140] General cleanup --- Chromatism/Chromatism/Helpers.m | 109 ------------------------- Chromatism/Chromatism/JLTokenPattern.m | 8 +- 2 files changed, 4 insertions(+), 113 deletions(-) diff --git a/Chromatism/Chromatism/Helpers.m b/Chromatism/Chromatism/Helpers.m index b0152c3..fabfc71 100644 --- a/Chromatism/Chromatism/Helpers.m +++ b/Chromatism/Chromatism/Helpers.m @@ -8,84 +8,6 @@ #import "Helpers.h" -@implementation NSString (Helper) - -- (BOOL)string:(NSString *)longString containsString:(NSString *)shortString -{ - return ([longString rangeOfString:shortString].length != NSNotFound); -} - -- (NSMutableArray *)allOccurrencesOfString:(NSString *)searchString { - - NSMutableArray *array = [NSMutableArray array]; - - BOOL keepGoing = TRUE; - NSRange searchRange = NSMakeRange(0, self.length); - while (keepGoing) { - NSRange range = [self rangeOfString:searchString options:NSCaseInsensitiveSearch range:searchRange]; - if (range.location != NSNotFound) { - int pos = range.location + searchString.length; - [array addObject:[NSValue valueWithRange:range]]; - - searchRange = NSMakeRange(pos, [self length] - pos); - - } else { - keepGoing = NO; - } - } - - return array; -} - -@end - -@implementation NSArray (Helper) - -- (NSArray *)uniqueArray; -{ - NSMutableSet* existingNames = [NSMutableSet set]; - NSMutableArray* filteredArray = [NSMutableArray array]; - for (id object in self) { - if (![existingNames containsObject:[object name]]) { - [existingNames addObject:[object name]]; - [filteredArray addObject:object]; - } - } - return [NSArray arrayWithArray:filteredArray]; -} -@end - -@implementation NSMutableArray (Helper) - -- (NSMutableArray *)uniqueArray; -{ - NSMutableSet* existingNames = [NSMutableSet set]; - NSMutableArray* filteredArray = [NSMutableArray array]; - for (id object in self) { - if (![existingNames containsObject:object]) { - [existingNames addObject:object]; - [filteredArray addObject:object]; - } - } - return filteredArray; -} - -@end - -@implementation NSValue (Helper) - -- (NSComparisonResult)compareTo:(NSValue *)range { - if (self.rangeValue.location < range.rangeValue.location) { - return NSOrderedAscending; - } else if (self.rangeValue.location == range.rangeValue.location) { - return NSOrderedSame; - } else { - return NSOrderedDescending; - } -} - -@end - @implementation UIColor (CreateMethods) + (UIColor*)colorWith8BitRed:(NSInteger)red green:(NSInteger)green blue:(NSInteger)blue alpha:(CGFloat)alpha { @@ -117,37 +39,6 @@ + (UIColor*)colorWithHex:(NSString*)hex alpha:(CGFloat)alpha { @end -@implementation NSAttributedString (help) - -- (NSString *)description -{ - return self.string; -} - -@end - -@implementation NSMutableAttributedString (help) - -- (NSString *)description -{ - return self.string; -} - -@end - -@implementation NSDate (Helper) - -- (NSString *)iso8601String -{ - static NSDateFormatter* dateFormatter; - if (!dateFormatter) - { - dateFormatter = [[NSDateFormatter alloc] init]; - [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZ"]; - } - return [dateFormatter stringFromDate:self]; -} -@end @implementation NSIndexSet (GSIndexSetAdditions) - (NSMutableIndexSet *)intersectionWithSet:(NSIndexSet *)otherSet diff --git a/Chromatism/Chromatism/JLTokenPattern.m b/Chromatism/Chromatism/JLTokenPattern.m index dc5abc8..e2094b6 100644 --- a/Chromatism/Chromatism/JLTokenPattern.m +++ b/Chromatism/Chromatism/JLTokenPattern.m @@ -9,9 +9,11 @@ #import "JLTokenPattern.h" @interface JLScope () -@property (nonatomic, readwrite, strong) NSString *string; - (void)iterateSubscopes; - (BOOL)shouldPerform; + +@property (nonatomic, readwrite, strong) NSString *string; + @end @implementation JLTokenPattern @@ -40,14 +42,12 @@ - (id)init - (void)setExpression:(NSRegularExpression *)expression { _expression = expression; - - self.pattern = expression.pattern; + _pattern = expression.pattern; } - (void)setPattern:(NSString *)pattern { _pattern = pattern; - _expression = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionAnchorsMatchLines error:nil]; } From ccb7d1b5f106eb2cd3eceaaf420cbeb1d032715e Mon Sep 17 00:00:00 2001 From: Anviking Date: Thu, 1 Aug 2013 23:57:40 +0200 Subject: [PATCH 073/140] Added helper for creating keyword pattern --- Chromatism/Chromatism/JLTokenizer.m | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index b17400f..be9d637 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -100,7 +100,9 @@ - (void)setup // Method call parts [[self addToken:JLTokenTypeOtherMethodNames withPattern:@"(?<=\\w+):\\s*[^\\s;\\]]+" andScope:lineScope] setCaptureGroup:1]; - [self addToken:JLTokenTypeKeyword withPattern:@"\\b(true|false|yes|no|TRUE|FALSE|bool|BOOL|nil|id|void|self|NULL|if|else|strong|weak|nonatomic|atomic|assign|copy|typedef|enum|auto|break|case|const|char|continue|do|default|double|extern|float|for|goto|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|volatile|while|nonatomic|atomic|nonatomic|readonly|super)\\b" andScope:lineScope]; + NSString *keywords = @"true false yes no TRUE FALSE bool BOOL nil id void self NULL if else strong weak nonatomic atomic assign copy typedef enum auto break case const char continue do default double extern float for goto int long register return short signed sizeof static struct switch typedef union unsigned volatile while nonatomic atomic nonatomic readonly super"; + + [self addToken:JLTokenTypeKeyword withKeywords:keywords andScope:lineScope]; [self addToken:JLTokenTypeKeyword withPattern:@"@[a-zA-Z0-9_]+" andScope:lineScope]; // Other Class Names @@ -205,9 +207,6 @@ - (JLTokenPattern *)addToken:(NSString *)type withIdentifier:(NSString *)identif NSParameterAssert(type); NSParameterAssert(pattern); NSParameterAssert(scope); - UIColor *color = self.colors[type]; - - NSAssert(color, @"%@ didn't return a color in color dictionary %@", type, self.colors); JLTokenPattern *token = [JLTokenPattern tokenPatternWithPattern:pattern]; token.identifier = identifier; @@ -218,6 +217,12 @@ - (JLTokenPattern *)addToken:(NSString *)type withIdentifier:(NSString *)identif return token; } +- (JLTokenPattern *)addToken:(NSString *)type withKeywords:(NSString *)keywords andScope:(JLScope *)scope +{ + NSString *pattern = [NSString stringWithFormat:@"\\b(%@)\\b", [[keywords componentsSeparatedByString:@" "] componentsJoinedByString:@"|"]]; + return [self addToken:type withPattern:pattern andScope:scope]; +} + - (void)clearColorAttributesInRange:(NSRange)range textStorage:(NSTextStorage *)storage; { [storage removeAttribute:NSForegroundColorAttributeName range:range]; From 23792bc942bc0c4be77411abb460f56d435cc338 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Fri, 2 Aug 2013 18:50:04 +0200 Subject: [PATCH 074/140] Update README.md --- README.md | 40 ++-------------------------------------- 1 file changed, 2 insertions(+), 38 deletions(-) diff --git a/README.md b/README.md index e1981f3..8fdb913 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,8 @@ How to add Chromatism to your application: - `JLScope` has a `NSMutableIndexSet`-property that corresponds to ranges in the textStorage. Scopes can be arranged in a hierarchy. A scope's children is stored in the `subscopes` property, and a scopes parent is simply called its `scope`. A scope can be executed via the `-perform`-method. The method causes subscopes to perform cascadingly. - `JLTokenPattern` is a subclass of `JLScope`. It has a regex-pattern that in `-perform` searches through the ranges of its parent scope. +####However, the project is changing quickly. + ## Scopes and Patterns Scopes and patters can ensure that regex patterns search in the right place. To understand how they work, it is helpful to know what happens in the `-perform` method. @@ -25,41 +27,3 @@ Scopes and patters can ensure that regex patterns search in the right place. To For more detail, see the `-perform`-implementation on [`JLScope`](https://github.com/Anviking/Chromatism/blob/master/Chromatism/Chromatism/JLScope.m#65) and [`JLTokenPattern`](https://github.com/Anviking/Chromatism/blob/master/Chromatism/Chromatism/JLTokenPattern.m#56). -### Example -Modified snippet from `JLTokenizer`. - -````objc -// The documentScope will be our root scope -JLScope *documentScope = [JLScope scopeWithTextStorage:storage]; - -// A subscope with a specific range. In this case, the range is the range of the edited line. -JLScope *rangeScope = [JLScope scopeWithRange:range inTextStorage:storage]; - -// "/* ... */" comments should search through the whole document, and no other patterns should search in its results -JLTokenPattern *comments1 = [JLTokenPattern tokenPatternWithPattern:@"/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*+/" andColor:colors[JLTokenTypeComment]]; - -// "//" comments should search in the range of the edited line, but only where there is no /* */ comment. -JLTokenPattern *comments2 = [JLTokenPattern tokenPatternWithPattern:@"//.*+$" andColor:colors[JLTokenTypeComment]]; - -JLTokenPattern *preprocessor = [JLTokenPattern tokenPatternWithPattern:@"#.*+$" andColor:colors[JLTokenTypePreprocessor]]; - -// This pattern should only search in the the results from the preprocessor pattern. -JLTokenPattern *importAngleBrackets = [JLTokenPattern tokenPatternWithPattern:@"<.*?>" andColor:colors[JLTokenTypeString]]; -importAngleBrackets.scope = preprocessor; - -JLTokenPattern *strings = [JLTokenPattern tokenPatternWithPattern:@"(\"|@\")[^\"\\n]*(@\"|\")" andColor:colors[JLTokenTypeString]]; -// This pattern should search where there is nothing else, *and* in the results of the preprocessor pattern. -[strings addScope:preprocessor]; // Equivalent to [preprocessor addSubscope:strings.copy] - -JLTokenPattern *literals = [JLTokenPattern tokenPatternWithPattern:@"@[\\(|\\{|\\[][^\\(\\{\\[]+[\\)|\\}|\\]]" andColor:colors[JLTokenTypeNumber]]; -literals.opaque = NO; // Scopes and patterns are opaque per default. Setting this to NO makes it that patterns that follow in the same scope can search and overwrite the results from this pattern. - -// Setup the hiearchy -documentScope.subscopes = @[comments1, rangeScope]; -rangeScope.subscopes = @[comments2, preprocessor, literals]; - -// Causes every subscope to perform as well -[documentScope perform]; -```` - - From 06eee371ea70c3547d75bbd04d9116ad4f67e891 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Sat, 3 Aug 2013 22:52:51 +0200 Subject: [PATCH 075/140] Added screenshot --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 8fdb913..0d9a169 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,8 @@ Chromatism This is the beginning of a syntax highlighting `UITextView` for iOS. Currently it only knows about Obj-C. Previously Chromatism used a combination of `CoreText` and `UITableView` for performance, but luckily that is not needed anymore. +![](http://anviking.com/img/chromatism.png) + How to add Chromatism to your application: 1. Drag and drop `Chromatism.xcodeproj` to your project. @@ -27,3 +29,4 @@ Scopes and patters can ensure that regex patterns search in the right place. To For more detail, see the `-perform`-implementation on [`JLScope`](https://github.com/Anviking/Chromatism/blob/master/Chromatism/Chromatism/JLScope.m#65) and [`JLTokenPattern`](https://github.com/Anviking/Chromatism/blob/master/Chromatism/Chromatism/JLTokenPattern.m#56). + From a36506c87bcedf9a6a6cdba41dafc6b26454649a Mon Sep 17 00:00:00 2001 From: Anviking Date: Sun, 4 Aug 2013 19:25:03 +0200 Subject: [PATCH 076/140] Refactoring and changed demo app color scheme to black --- Chromatism/Chromatism/JLTextViewController.m | 29 +++++++++++--------- Chromatism/Chromatism/JLTokenizer.m | 4 +-- ChromatismDemo/ChromatismDemo/AppDelegate.m | 3 ++ 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/Chromatism/Chromatism/JLTextViewController.m b/Chromatism/Chromatism/JLTextViewController.m index 4533876..e4158a2 100644 --- a/Chromatism/Chromatism/JLTextViewController.m +++ b/Chromatism/Chromatism/JLTextViewController.m @@ -26,21 +26,21 @@ - (instancetype)initWithText:(NSString *)text } return self; } -- (void)loadView + +- (JLTextView *)textView { - UIView *view = [[UIView alloc] init]; - JLTextView *textView = [[JLTextView alloc] init]; - textView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; - - if (self.defaultText) { - textView.text = self.defaultText; - self.defaultText = nil; + if (!_textView) { + JLTextView *textView = [[JLTextView alloc] init]; + textView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; + + if (self.defaultText) { + textView.text = self.defaultText; + self.defaultText = nil; + } + + [self setTextView:textView]; } - - [view addSubview:textView]; - - [self setView:view]; - [self setTextView:textView]; + return _textView; } - (JLTokenizer *)tokenizer @@ -52,6 +52,9 @@ - (void)viewDidLoad { [super viewDidLoad]; + self.textView.frame = self.view.frame; + [self.view addSubview:self.textView]; + self.view.backgroundColor = self.textView.backgroundColor; self.navigationController.navigationBar.translucent = TRUE; } diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index be9d637..4e3565c 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -95,10 +95,10 @@ - (void)setup [[self addToken:JLTokenTypeOtherMethodNames withPattern:@"\\.(\\w+)" andScope:lineScope] setCaptureGroup:1]; // Method Calls - [[self addToken:JLTokenTypeOtherMethodNames withPattern:@"\\[\\w+\\s+(\\w+)\\]" andScope:lineScope] setCaptureGroup:1]; + [[self addToken:JLTokenTypeOtherMethodNames withPattern:@"(\\w+)\\]" andScope:lineScope] setCaptureGroup:1]; // Method call parts - [[self addToken:JLTokenTypeOtherMethodNames withPattern:@"(?<=\\w+):\\s*[^\\s;\\]]+" andScope:lineScope] setCaptureGroup:1]; + [[self addToken:JLTokenTypeOtherMethodNames withPattern:@"(?<=\\w+):" andScope:lineScope] setCaptureGroup:1]; NSString *keywords = @"true false yes no TRUE FALSE bool BOOL nil id void self NULL if else strong weak nonatomic atomic assign copy typedef enum auto break case const char continue do default double extern float for goto int long register return short signed sizeof static struct switch typedef union unsigned volatile while nonatomic atomic nonatomic readonly super"; diff --git a/ChromatismDemo/ChromatismDemo/AppDelegate.m b/ChromatismDemo/ChromatismDemo/AppDelegate.m index 476794f..3d06b1d 100644 --- a/ChromatismDemo/ChromatismDemo/AppDelegate.m +++ b/ChromatismDemo/ChromatismDemo/AppDelegate.m @@ -23,6 +23,9 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController]; viewController.title = @"Chromatism"; + [navigationController.navigationBar setBarStyle:UIBarStyleBlack]; + viewController.textView.keyboardAppearance = UIKeyboardAppearanceDark; + self.window.rootViewController = navigationController; self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; From 886bda3466e00e9a376e8b41ca502a9dbcab076b Mon Sep 17 00:00:00 2001 From: Anviking Date: Sun, 4 Aug 2013 20:56:28 +0200 Subject: [PATCH 077/140] Rough first attempt of retokenization after deleting a block comment --- Chromatism/Chromatism/JLScope.h | 2 +- Chromatism/Chromatism/JLScope.m | 13 ++----------- Chromatism/Chromatism/JLTokenPattern.m | 8 +++++++- Chromatism/Chromatism/JLTokenizer.m | 25 +++++++++++++++++++------ 4 files changed, 29 insertions(+), 19 deletions(-) diff --git a/Chromatism/Chromatism/JLScope.h b/Chromatism/Chromatism/JLScope.h index e1b4585..5dfdd3b 100644 --- a/Chromatism/Chromatism/JLScope.h +++ b/Chromatism/Chromatism/JLScope.h @@ -96,6 +96,6 @@ - (NSString *)mergedModifiedStringForScope:(JLScope *)scope; - (BOOL)scopeShouldPerform:(JLScope *)scope; -- (void)scopeDidFinishPerforming:(JLScope *)scope; +- (void)scope:(JLScope *)scope didChangeIndexesFrom:(NSIndexSet *)oldSet to:(NSIndexSet *)newSet; @end diff --git a/Chromatism/Chromatism/JLScope.m b/Chromatism/Chromatism/JLScope.m index 5267583..97a9f69 100644 --- a/Chromatism/Chromatism/JLScope.m +++ b/Chromatism/Chromatism/JLScope.m @@ -73,26 +73,17 @@ - (void)perform NSAssert(!self.scope, @"Only call -perform to a rootlevel scope"); if (![self shouldPerform]) return; [self iterateSubscopes]; - - if ([self.delegate respondsToSelector:@selector(scopeDidFinishPerforming:)]) [self.delegate scopeDidFinishPerforming:self]; } - (void)performInIndexSet:(NSIndexSet *)set { NSParameterAssert(set); if (![self shouldPerform]) return; + NSMutableIndexSet *oldSet = self.set; self.set = [self.set intersectionWithSet:set]; [self iterateSubscopes]; - if ([self.delegate respondsToSelector:@selector(scopeDidFinishPerforming:)]) [self.delegate scopeDidFinishPerforming:self]; -} - -- (void)reset -{ - self.set = nil; - for (JLScope *scope in self.subscopes) { - [scope reset]; - } + if ([self.delegate respondsToSelector:@selector(scope:didChangeIndexesFrom:to:)]) [self.delegate scope:self didChangeIndexesFrom:oldSet to:self.set]; } - (BOOL)shouldPerform diff --git a/Chromatism/Chromatism/JLTokenPattern.m b/Chromatism/Chromatism/JLTokenPattern.m index e2094b6..af17905 100644 --- a/Chromatism/Chromatism/JLTokenPattern.m +++ b/Chromatism/Chromatism/JLTokenPattern.m @@ -7,6 +7,7 @@ // #import "JLTokenPattern.h" +#import "Helpers.h" @interface JLScope () - (void)iterateSubscopes; @@ -55,8 +56,12 @@ - (void)setPattern:(NSString *)pattern - (void)performInIndexSet:(NSIndexSet *)set { + if (![self shouldPerform]) return; NSDictionary *attributes = [self.delegate attributesForScope:self]; + NSMutableIndexSet *oldSet = self.set; + self.set = [self.set intersectionWithSet:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, self.textStorage.length)]]; + [self.set removeIndexes:set]; NSAssert(attributes, @""); [set enumerateRangesUsingBlock:^(NSRange range, BOOL *stop) { [self.expression enumerateMatchesInString:self.string options:self.matchingOptions range:range usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { @@ -66,7 +71,8 @@ - (void)performInIndexSet:(NSIndexSet *)set }]; [self iterateSubscopes]; - if ([self.delegate respondsToSelector:@selector(scopeDidFinishPerforming:)]) [self.delegate scopeDidFinishPerforming:self]; + + if (![oldSet isEqualToIndexSet:self.set] && [self.delegate respondsToSelector:@selector(scope:didChangeIndexesFrom:to:)]) [self.delegate scope:self didChangeIndexesFrom:oldSet to:self.set]; } #pragma mark - Debugging diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index 4e3565c..a6aed87 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -66,8 +66,9 @@ - (void)setup JLScope *lineScope = [JLScope new]; // Block and line comments - JLTokenPattern *blockComment = [self addToken:JLTokenTypeComment withIdentifier:BLOCK_COMMENT pattern:@"/\\*.*?\\*/" andScope:documentScope]; + JLTokenPattern *blockComment = [self addToken:JLTokenTypeComment withIdentifier:BLOCK_COMMENT pattern:@"" andScope:documentScope]; blockComment.triggeringCharacterSet = [NSCharacterSet characterSetWithCharactersInString:@"/*"]; + blockComment.expression = [NSRegularExpression regularExpressionWithPattern:@"/\\*.*?\\*/" options:NSRegularExpressionDotMatchesLineSeparators error:nil]; [self addToken:JLTokenTypeComment withIdentifier:LINE_COMMENT pattern:@"//.*+$" andScope:lineScope]; @@ -145,9 +146,23 @@ - (void)textStorage:(NSTextStorage *)textStorage didProcessEditing:(NSTextStorag #pragma mark - JLScope delegate -- (void)scopeDidFinishPerforming:(JLScope *)scope +- (void)scope:(JLScope *)scope didChangeIndexesFrom:(NSIndexSet *)oldSet to:(NSIndexSet *)newSet { if ([self.delegate respondsToSelector:@selector(scope:didFinishProcessing:)]) [self.delegate scope:scope didFinishProcessing:self]; + + if (!scope.identifier) return; + if (![scope.identifier isEqualToString:BLOCK_COMMENT]) return; + + NSMutableIndexSet *removedIndexes = oldSet.mutableCopy; + [removedIndexes removeIndexes:newSet]; + + NSLog(@"Removed Indexes:%@",removedIndexes); + + if (removedIndexes) { + [removedIndexes enumerateRangesUsingBlock:^(NSRange range, BOOL *stop) { + [self tokenizeTextStorage:scope.textStorage withRange:range]; + }]; + } } - (NSString *)mergedModifiedStringForScope:(JLScope *)scope @@ -179,11 +194,9 @@ - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range // First, remove old attributes [self clearColorAttributesInRange:range textStorage:storage]; - [self.documentScope reset]; - [self.documentScope setTextStorage:storage]; - [self.documentScope.set addIndexesInRange:NSMakeRange(0, storage.length)]; - [self.lineScope.set addIndexesInRange:range]; + [self.documentScope setSet:[NSMutableIndexSet indexSetWithIndexesInRange:NSMakeRange(0, storage.length)]]; + [self.lineScope setSet:[NSMutableIndexSet indexSetWithIndexesInRange:range]]; [self.documentScope perform]; } From e56ef3d5bd19a8a03b4c58b58422419cd77319a7 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Tue, 6 Aug 2013 01:25:28 +0200 Subject: [PATCH 078/140] Added ChromatismLog and cleaned up a bit --- Chromatism/Chromatism/Chromatism+Internal.h | 6 ++++ Chromatism/Chromatism/Chromatism.h | 2 +- Chromatism/Chromatism/JLScope.h | 1 - Chromatism/Chromatism/JLTokenizer.m | 39 ++------------------- 4 files changed, 9 insertions(+), 39 deletions(-) diff --git a/Chromatism/Chromatism/Chromatism+Internal.h b/Chromatism/Chromatism/Chromatism+Internal.h index 0f049de..e2f9368 100644 --- a/Chromatism/Chromatism/Chromatism+Internal.h +++ b/Chromatism/Chromatism/Chromatism+Internal.h @@ -13,6 +13,12 @@ typedef NS_ENUM(NSInteger, JLTokenizerTheme) { JLTokenizerThemeDusk }; +#ifdef DEBUG +# define ChromatismLog(...) NSLog(__VA_ARGS__) +#else +# define ChromatismLog(...) +#endif + FOUNDATION_EXPORT NSString *const JLTokenTypeText; FOUNDATION_EXPORT NSString *const JLTokenTypeBackground; FOUNDATION_EXPORT NSString *const JLTokenTypeComment; diff --git a/Chromatism/Chromatism/Chromatism.h b/Chromatism/Chromatism/Chromatism.h index 920d3d1..6e94695 100644 --- a/Chromatism/Chromatism/Chromatism.h +++ b/Chromatism/Chromatism/Chromatism.h @@ -13,4 +13,4 @@ #import "JLTokenPattern.h" #import "JLMarkdownTokenizer.h" #import "JLTextView.h" -#import "Chromatism+Internal.h" +#import "Chromatism+Internal.h" \ No newline at end of file diff --git a/Chromatism/Chromatism/JLScope.h b/Chromatism/Chromatism/JLScope.h index 5dfdd3b..ebbd131 100644 --- a/Chromatism/Chromatism/JLScope.h +++ b/Chromatism/Chromatism/JLScope.h @@ -22,7 +22,6 @@ */ - (void)perform; - (void)performInIndexSet:(NSIndexSet *)set; -- (void)reset; /** * Array of nested JLScopes and JLTokenPatterns. Reverse realationship to scope, setting one causes the other to update. No not mutate. diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index a6aed87..5935989 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -138,10 +138,8 @@ - (void)textStorage:(NSTextStorage *)textStorage didProcessEditing:(NSTextStorag { _editedRange = editedRange; _editedLineRange = [textStorage.string lineRangeForRange:editedRange]; - // Measure performance - NSDate *date = [NSDate date]; + [self tokenizeTextStorage:textStorage withRange:_editedLineRange]; - NSLog(@"Chromatism done tokenizing with time of %fms",ABS([date timeIntervalSinceNow]*1000)); } #pragma mark - JLScope delegate @@ -156,7 +154,7 @@ - (void)scope:(JLScope *)scope didChangeIndexesFrom:(NSIndexSet *)oldSet to:(NSI NSMutableIndexSet *removedIndexes = oldSet.mutableCopy; [removedIndexes removeIndexes:newSet]; - NSLog(@"Removed Indexes:%@",removedIndexes); + ChromatismLog(@"Removed Indexes:%@",removedIndexes); if (removedIndexes) { [removedIndexes enumerateRangesUsingBlock:^(NSRange range, BOOL *stop) { @@ -242,37 +240,4 @@ - (void)clearColorAttributesInRange:(NSRange)range textStorage:(NSTextStorage *) [storage addAttribute:NSForegroundColorAttributeName value:self.colors[JLTokenTypeText] range:range]; } -#pragma mark - Scopes - -// -// NOT COMPLETED -// -//- (void)refreshScopesInTextStorage:(NSTextStorage *)textStorage; -//{ -// NSString *string = textStorage.string; -// __block NSUInteger scope = 0; -// -// -// NSString *pattern = @"\\{|\\}"; -// NSError *error; -// NSString *attribute = @"ChromatismScopeAttributeName"; -// NSRegularExpression *expression = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:&error]; -// -// NSAssert(!error, @"%@",error); -// -// [expression enumerateMatchesInString:string options:0 range:NSMakeRange(0, textStorage.length) usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { -// NSString *substring = [string substringWithRange:result.range]; -// if ([substring isEqualToString:@"{"]) { -// scope++; -// } -// else scope--; -// NSLog(@"Scope is %i",scope); -// float f = 0.3 + ((float)scope/10); -// NSLog(@"Color is :%f",f); -// UIColor *color = [UIColor colorWithWhite:f alpha:1]; -// [textStorage addAttribute:NSForegroundColorAttributeName value:color range:NSMakeRange(result.range.location, string.length - result.range.location)]; -// }]; -//} - - @end From 05e989531634859a10cbe85761400304c6c9be14 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Tue, 6 Aug 2013 01:30:39 +0200 Subject: [PATCH 079/140] Generalizing the retokenization after removing non-line attributes --- Chromatism/Chromatism/JLTokenizer.m | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index 5935989..740bc08 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -148,18 +148,18 @@ - (void)scope:(JLScope *)scope didChangeIndexesFrom:(NSIndexSet *)oldSet to:(NSI { if ([self.delegate respondsToSelector:@selector(scope:didFinishProcessing:)]) [self.delegate scope:scope didFinishProcessing:self]; - if (!scope.identifier) return; - if (![scope.identifier isEqualToString:BLOCK_COMMENT]) return; - - NSMutableIndexSet *removedIndexes = oldSet.mutableCopy; - [removedIndexes removeIndexes:newSet]; - - ChromatismLog(@"Removed Indexes:%@",removedIndexes); - - if (removedIndexes) { - [removedIndexes enumerateRangesUsingBlock:^(NSRange range, BOOL *stop) { - [self tokenizeTextStorage:scope.textStorage withRange:range]; - }]; + if ([self.documentScope.subscopes containsObject:scope] && scope != self.lineScope) + { + NSMutableIndexSet *removedIndexes = oldSet.mutableCopy; + [removedIndexes removeIndexes:newSet]; + + ChromatismLog(@"Removed Indexes:%@",removedIndexes); + + if (removedIndexes) { + [removedIndexes enumerateRangesUsingBlock:^(NSRange range, BOOL *stop) { + [self tokenizeTextStorage:scope.textStorage withRange:range]; + }]; + } } } From f8188958ca447415718015a9975ee9d8e7bfe4a4 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Tue, 6 Aug 2013 02:05:49 +0200 Subject: [PATCH 080/140] Updated image --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0d9a169..3942944 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ Chromatism This is the beginning of a syntax highlighting `UITextView` for iOS. Currently it only knows about Obj-C. Previously Chromatism used a combination of `CoreText` and `UITableView` for performance, but luckily that is not needed anymore. -![](http://anviking.com/img/chromatism.png) +![](http://anviking.com/img/chromatism_black.png) How to add Chromatism to your application: From a957143ab7d74b13598a52e3fb9d85c97ffc31d1 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Tue, 6 Aug 2013 02:24:15 +0200 Subject: [PATCH 081/140] Added a weak textStorage property to the tokenizer --- Chromatism/Chromatism/JLTextView.m | 1 + Chromatism/Chromatism/JLTokenizer.h | 7 ++++--- Chromatism/Chromatism/JLTokenizer.m | 14 ++++++++++---- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/Chromatism/Chromatism/JLTextView.m b/Chromatism/Chromatism/JLTextView.m index 5db43ed..01f17f9 100644 --- a/Chromatism/Chromatism/JLTextView.m +++ b/Chromatism/Chromatism/JLTextView.m @@ -52,6 +52,7 @@ - (void)setup self.textStorage.delegate = self.syntaxTokenizer; self.theme = JLTokenizerThemeDusk; self.syntaxTokenizer.dataSource = self; + self.syntaxTokenizer.textStorage = self.textStorage; // Set default properties self.scrollEnabled = YES; diff --git a/Chromatism/Chromatism/JLTokenizer.h b/Chromatism/Chromatism/JLTokenizer.h index 448f50f..9b5cade 100644 --- a/Chromatism/Chromatism/JLTokenizer.h +++ b/Chromatism/Chromatism/JLTokenizer.h @@ -17,14 +17,15 @@ @interface JLTokenizer : NSObject -// Override to create your own syntax highlighting -- (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range; -- (void)tokenizeTextStorage:(NSTextStorage *)storage; +- (void)tokenizeTextStorage:(NSTextStorage *)textStorage withRange:(NSRange)range; +- (void)tokenizeWithRange:(NSRange)range; +- (void)tokenize; - (void)clearColorAttributesInRange:(NSRange)range textStorage:(NSTextStorage *)storage; - (NSMutableAttributedString *)tokenizeString:(NSString *)string withDefaultAttributes:(NSDictionary *)attributes; @property (nonatomic, strong) NSDictionary *colors; +@property (nonatomic, weak) NSTextStorage *textStorage; @property (nonatomic, weak) id delegate; @property (nonatomic, weak) id dataSource; @end diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index 740bc08..7da05ae 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -131,15 +131,16 @@ - (JLScope *)lineScope - (void)textStorage:(NSTextStorage *)textStorage willProcessEditing:(NSTextStorageEditActions)editedMask range:(NSRange)editedRange changeInLength:(NSInteger)delta { - + NSAssert(textStorage == self.textStorage, @"A JLTokenizer should only handle one textStorage"); } - (void)textStorage:(NSTextStorage *)textStorage didProcessEditing:(NSTextStorageEditActions)editedMask range:(NSRange)editedRange changeInLength:(NSInteger)delta { + NSAssert(textStorage == self.textStorage, @"A JLTokenizer should only handle one textStorage"); _editedRange = editedRange; _editedLineRange = [textStorage.string lineRangeForRange:editedRange]; - [self tokenizeTextStorage:textStorage withRange:_editedLineRange]; + [self tokenizeWithRange:_editedLineRange]; } #pragma mark - JLScope delegate @@ -182,9 +183,14 @@ - (NSDictionary *)attributesForScope:(JLScope *)scope #pragma mark - Tokenizing -- (void)tokenizeTextStorage:(NSTextStorage *)storage +- (void)tokenize +{ + [self tokenizeTextStorage:self.textStorage withRange:NSMakeRange(0, self.textStorage.length)]; +} + +- (void)tokenizeWithRange:(NSRange)range { - [self tokenizeTextStorage:storage withRange:NSMakeRange(0, storage.length)]; + [self tokenizeTextStorage:self.textStorage withRange:range]; } - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range From e80991a6a7e8024ea0e444551d39bc53c75a24f2 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Tue, 6 Aug 2013 17:54:45 +0200 Subject: [PATCH 082/140] =?UTF-8?q?Lets=20do=20a=20background=20=E2=80=9Cv?= =?UTF-8?q?alidation=E2=80=9D=20for=20more=20expensive=20patterns=20like?= =?UTF-8?q?=20large=20lists=20of=20keywords.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Chromatism/Chromatism/JLTokenizer.h | 3 +++ Chromatism/Chromatism/JLTokenizer.m | 31 ++++++++++++++++++++++++++--- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/Chromatism/Chromatism/JLTokenizer.h b/Chromatism/Chromatism/JLTokenizer.h index 9b5cade..75a363f 100644 --- a/Chromatism/Chromatism/JLTokenizer.h +++ b/Chromatism/Chromatism/JLTokenizer.h @@ -21,11 +21,14 @@ - (void)tokenizeWithRange:(NSRange)range; - (void)tokenize; +- (void)validateTokenization; + - (void)clearColorAttributesInRange:(NSRange)range textStorage:(NSTextStorage *)storage; - (NSMutableAttributedString *)tokenizeString:(NSString *)string withDefaultAttributes:(NSDictionary *)attributes; @property (nonatomic, strong) NSDictionary *colors; @property (nonatomic, weak) NSTextStorage *textStorage; +@property (nonatomic, assign) BOOL needsValidation; @property (nonatomic, weak) id delegate; @property (nonatomic, weak) id dataSource; @end diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index 7da05ae..9b3ae63 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -49,6 +49,7 @@ @interface JLTokenizer () @property (nonatomic, strong) JLScope *documentScope; @property (nonatomic, strong) JLScope *lineScope; +@property (nonatomic, strong) NSTimer *validationTimer; @end @@ -99,9 +100,9 @@ - (void)setup [[self addToken:JLTokenTypeOtherMethodNames withPattern:@"(\\w+)\\]" andScope:lineScope] setCaptureGroup:1]; // Method call parts - [[self addToken:JLTokenTypeOtherMethodNames withPattern:@"(?<=\\w+):" andScope:lineScope] setCaptureGroup:1]; + [[self addToken:JLTokenTypeOtherMethodNames withPattern:@"(?<=\\w+):" andScope:lineScope] setCaptureGroup:0]; - NSString *keywords = @"true false yes no TRUE FALSE bool BOOL nil id void self NULL if else strong weak nonatomic atomic assign copy typedef enum auto break case const char continue do default double extern float for goto int long register return short signed sizeof static struct switch typedef union unsigned volatile while nonatomic atomic nonatomic readonly super"; + NSString *keywords = @"true false yes no YES TRUE FALSE bool BOOL nil id void self NULL if else strong weak nonatomic atomic assign copy typedef enum auto break case const char continue do default double extern float for goto int long register return short signed sizeof static struct switch typedef union unsigned volatile while nonatomic atomic nonatomic readonly super"; [self addToken:JLTokenTypeKeyword withKeywords:keywords andScope:lineScope]; [self addToken:JLTokenTypeKeyword withPattern:@"@[a-zA-Z0-9_]+" andScope:lineScope]; @@ -140,7 +141,8 @@ - (void)textStorage:(NSTextStorage *)textStorage didProcessEditing:(NSTextStorag _editedRange = editedRange; _editedLineRange = [textStorage.string lineRangeForRange:editedRange]; - [self tokenizeWithRange:_editedLineRange]; + [self tokenizeWithRange:_editedLineRange]; + [self setNeedsValidation:YES]; } #pragma mark - JLScope delegate @@ -205,6 +207,29 @@ - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range [self.documentScope perform]; } +#pragma mark - Validation + +- (void)setNeedsValidation:(BOOL)needsValidation +{ + _needsValidation = needsValidation; + if (needsValidation) { + [self.validationTimer invalidate]; // This is not neccecary, right? + self.validationTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(validateTokenization) userInfo:nil repeats:NO]; + } +} + +- (void)validateTokenization +{ + [self.textStorage beginEditing]; + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ + [self tokenize]; + dispatch_async(dispatch_get_main_queue(), ^{ + [self setNeedsValidation:NO]; + [self.textStorage endEditing]; + }); + }); +} + - (NSMutableAttributedString *)tokenizeString:(NSString *)string withDefaultAttributes:(NSDictionary *)attributes; { NSMutableAttributedString *attributedString = [[NSAttributedString alloc] initWithString:string attributes:attributes].mutableCopy; From 6ee6cb61a0ccfdd122c037e403c5aacc68ee5935 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Tue, 6 Aug 2013 18:48:48 +0200 Subject: [PATCH 083/140] Spelling and comments --- Chromatism/Chromatism/JLTokenizer.m | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index 9b3ae63..bbb2e9b 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -213,7 +213,7 @@ - (void)setNeedsValidation:(BOOL)needsValidation { _needsValidation = needsValidation; if (needsValidation) { - [self.validationTimer invalidate]; // This is not neccecary, right? + [self.validationTimer invalidate]; // This is not necessary, right? self.validationTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(validateTokenization) userInfo:nil repeats:NO]; } } @@ -223,6 +223,8 @@ - (void)validateTokenization [self.textStorage beginEditing]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ [self tokenize]; + + // This seem to be safe, is it? dispatch_async(dispatch_get_main_queue(), ^{ [self setNeedsValidation:NO]; [self.textStorage endEditing]; From 529dc6757c0156051e158fbffe372e4dea57b9b8 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Tue, 6 Aug 2013 18:56:08 +0200 Subject: [PATCH 084/140] Minor adjustments --- Chromatism/Chromatism/JLTokenizer.h | 1 - Chromatism/Chromatism/JLTokenizer.m | 22 ++++++++++++---------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/Chromatism/Chromatism/JLTokenizer.h b/Chromatism/Chromatism/JLTokenizer.h index 75a363f..0fadac4 100644 --- a/Chromatism/Chromatism/JLTokenizer.h +++ b/Chromatism/Chromatism/JLTokenizer.h @@ -17,7 +17,6 @@ @interface JLTokenizer : NSObject -- (void)tokenizeTextStorage:(NSTextStorage *)textStorage withRange:(NSRange)range; - (void)tokenizeWithRange:(NSRange)range; - (void)tokenize; diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index bbb2e9b..d3de55b 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -187,21 +187,16 @@ - (NSDictionary *)attributesForScope:(JLScope *)scope - (void)tokenize { - [self tokenizeTextStorage:self.textStorage withRange:NSMakeRange(0, self.textStorage.length)]; + [self tokenizeWithRange:NSMakeRange(0, self.textStorage.length)]; } - (void)tokenizeWithRange:(NSRange)range -{ - [self tokenizeTextStorage:self.textStorage withRange:range]; -} - -- (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range { // First, remove old attributes - [self clearColorAttributesInRange:range textStorage:storage]; + [self clearColorAttributesInRange:range textStorage:self.textStorage]; - [self.documentScope setTextStorage:storage]; - [self.documentScope setSet:[NSMutableIndexSet indexSetWithIndexesInRange:NSMakeRange(0, storage.length)]]; + [self.documentScope setTextStorage:self.textStorage]; + [self.documentScope setSet:[NSMutableIndexSet indexSetWithIndexesInRange:NSMakeRange(0, self.textStorage.length)]]; [self.lineScope setSet:[NSMutableIndexSet indexSetWithIndexesInRange:range]]; [self.documentScope perform]; @@ -232,12 +227,19 @@ - (void)validateTokenization }); } +/* - (NSMutableAttributedString *)tokenizeString:(NSString *)string withDefaultAttributes:(NSDictionary *)attributes; { NSMutableAttributedString *attributedString = [[NSAttributedString alloc] initWithString:string attributes:attributes].mutableCopy; - [self tokenizeTextStorage:(NSTextStorage *)attributedString withRange:NSMakeRange(0, string.length)]; + + [self.documentScope setTextStorage:self.textStorage]; + [self.documentScope setSet:[NSMutableIndexSet indexSetWithIndexesInRange:NSMakeRange(0, self.textStorage.length)]]; + + [self.documentScope perform]; + return attributedString; } +*/ #pragma mark - Helpers From d39296d42d6290abaf98ddfee880f368b86f1c11 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Tue, 6 Aug 2013 19:30:05 +0200 Subject: [PATCH 085/140] Minor --- Chromatism/Chromatism/JLTokenizer.h | 3 +-- Chromatism/Chromatism/JLTokenizer.m | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Chromatism/Chromatism/JLTokenizer.h b/Chromatism/Chromatism/JLTokenizer.h index 0fadac4..45ac240 100644 --- a/Chromatism/Chromatism/JLTokenizer.h +++ b/Chromatism/Chromatism/JLTokenizer.h @@ -19,10 +19,9 @@ - (void)tokenizeWithRange:(NSRange)range; - (void)tokenize; - - (void)validateTokenization; - - (void)clearColorAttributesInRange:(NSRange)range textStorage:(NSTextStorage *)storage; + - (NSMutableAttributedString *)tokenizeString:(NSString *)string withDefaultAttributes:(NSDictionary *)attributes; @property (nonatomic, strong) NSDictionary *colors; diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index d3de55b..8871b03 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -160,7 +160,7 @@ - (void)scope:(JLScope *)scope didChangeIndexesFrom:(NSIndexSet *)oldSet to:(NSI if (removedIndexes) { [removedIndexes enumerateRangesUsingBlock:^(NSRange range, BOOL *stop) { - [self tokenizeTextStorage:scope.textStorage withRange:range]; + [self tokenizeWithRange:range]; }]; } } @@ -202,6 +202,7 @@ - (void)tokenizeWithRange:(NSRange)range [self.documentScope perform]; } + #pragma mark - Validation - (void)setNeedsValidation:(BOOL)needsValidation From 0dedf030dcec54c02d9e81ee2636fb66a5be2a1d Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Wed, 7 Aug 2013 10:11:44 +0200 Subject: [PATCH 086/140] Added Project Token Types --- Chromatism/Chromatism/Chromatism+Internal.h | 2 ++ Chromatism/Chromatism/Chromatism.m | 14 +++++++++----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/Chromatism/Chromatism/Chromatism+Internal.h b/Chromatism/Chromatism/Chromatism+Internal.h index e2f9368..30aa652 100644 --- a/Chromatism/Chromatism/Chromatism+Internal.h +++ b/Chromatism/Chromatism/Chromatism+Internal.h @@ -33,6 +33,8 @@ FOUNDATION_EXPORT NSString *const JLTokenTypeURL; FOUNDATION_EXPORT NSString *const JLTokenTypeOther; FOUNDATION_EXPORT NSString *const JLTokenTypeOtherClassNames; FOUNDATION_EXPORT NSString *const JLTokenTypeOtherMethodNames; +FOUNDATION_EXPORT NSString *const JLTokenTypeProjectClassNames; +FOUNDATION_EXPORT NSString *const JLTokenTypeProjectMethodNames; /** * In addition to being the name of the library, the Chromatism class handles colors and TokenTypes diff --git a/Chromatism/Chromatism/Chromatism.m b/Chromatism/Chromatism/Chromatism.m index 8b3f43d..f120792 100644 --- a/Chromatism/Chromatism/Chromatism.m +++ b/Chromatism/Chromatism/Chromatism.m @@ -25,6 +25,9 @@ NSString *const JLTokenTypeOther = @"other"; NSString *const JLTokenTypeOtherMethodNames = @"other_method_names"; NSString *const JLTokenTypeOtherClassNames = @"other_class_names"; +NSString *const JLTokenTypeProjectMethodNames = @"project_method_names"; +NSString *const JLTokenTypeProjectClassNames = @"project_class_names"; + @implementation Chromatism @@ -46,10 +49,9 @@ + (NSDictionary *)colorsForTheme:(JLTokenizerTheme)theme JLTokenTypeURL: [UIColor colorWithRed:21.0/255 green:67.0/255 blue:244.0/255 alpha:1], JLTokenTypeOther: [UIColor colorWithRed:113.0/255 green:65.0/255 blue:163.0/255 alpha:1], JLTokenTypeOtherMethodNames : [UIColor colorWithHex:@"7040a6" alpha:1], - JLTokenTypeOtherClassNames : [UIColor colorWithHex:@"7040a6" alpha:1] - - - + JLTokenTypeOtherClassNames : [UIColor colorWithHex:@"7040a6" alpha:1], + JLTokenTypeProjectClassNames : [UIColor colorWithRed:63.0/255 green:110.0/255 blue:116.0/255 alpha:1], + JLTokenTypeProjectMethodNames : [UIColor colorWithRed:38.0/255 green:71.0/255 blue:75.0/255 alpha:1] }; break; case JLTokenizerThemeDusk: @@ -66,7 +68,9 @@ + (NSDictionary *)colorsForTheme:(JLTokenizerTheme)theme JLTokenTypeURL: [UIColor colorWithRed:35.0/255 green:63.0/255 blue:208.0/255 alpha:1], JLTokenTypeOther: [UIColor colorWithRed:0.0/255 green:175.0/255 blue:199.0/255 alpha:1], JLTokenTypeOtherClassNames : [UIColor colorWithHex:@"04afc8" alpha:1], - JLTokenTypeOtherMethodNames : [UIColor colorWithHex:@"04afc8" alpha:1] + JLTokenTypeOtherMethodNames : [UIColor colorWithHex:@"04afc8" alpha:1], + JLTokenTypeProjectMethodNames : [UIColor colorWithRed:131.0/255 green:192.0/255 blue:87.0/255 alpha:1], + JLTokenTypeProjectClassNames : [UIColor colorWithRed:131.0/255 green:192.0/255 blue:87.0/255 alpha:1] }; break; } From 04d53095bb0f9acacf422a4963089a16450fe136 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Thu, 8 Aug 2013 16:50:22 +0200 Subject: [PATCH 087/140] =?UTF-8?q?Basics=20for=20=E2=80=9Csymbolication?= =?UTF-8?q?=E2=80=9D,=20what=20ever=20that=20means.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Chromatism/Chromatism/JLTextView.m | 5 +++ Chromatism/Chromatism/JLTokenPattern.m | 12 +++++-- Chromatism/Chromatism/JLTokenizer.h | 1 + Chromatism/Chromatism/JLTokenizer.m | 44 ++++++++++++++++++++------ 4 files changed, 50 insertions(+), 12 deletions(-) diff --git a/Chromatism/Chromatism/JLTextView.m b/Chromatism/Chromatism/JLTextView.m index 01f17f9..8647ab5 100644 --- a/Chromatism/Chromatism/JLTextView.m +++ b/Chromatism/Chromatism/JLTextView.m @@ -127,6 +127,11 @@ - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range r return YES; } +- (void)textViewDidChange:(UITextView *)textView +{ + [self.syntaxTokenizer setNeedsValidation:YES]; +} + #pragma mark - JLTokenizer data source - (NSString *)recentlyReplacedText diff --git a/Chromatism/Chromatism/JLTokenPattern.m b/Chromatism/Chromatism/JLTokenPattern.m index af17905..de16aae 100644 --- a/Chromatism/Chromatism/JLTokenPattern.m +++ b/Chromatism/Chromatism/JLTokenPattern.m @@ -48,8 +48,10 @@ - (void)setExpression:(NSRegularExpression *)expression - (void)setPattern:(NSString *)pattern { - _pattern = pattern; - _expression = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionAnchorsMatchLines error:nil]; + if (pattern) { + _pattern = pattern; + _expression = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionAnchorsMatchLines error:nil]; + } } #pragma mark - Perform @@ -58,6 +60,7 @@ - (void)performInIndexSet:(NSIndexSet *)set { if (![self shouldPerform]) return; + if (!self.expression) return; NSDictionary *attributes = [self.delegate attributesForScope:self]; NSMutableIndexSet *oldSet = self.set; self.set = [self.set intersectionWithSet:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, self.textStorage.length)]]; @@ -65,7 +68,10 @@ - (void)performInIndexSet:(NSIndexSet *)set NSAssert(attributes, @""); [set enumerateRangesUsingBlock:^(NSRange range, BOOL *stop) { [self.expression enumerateMatchesInString:self.string options:self.matchingOptions range:range usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { - [self.textStorage addAttributes:attributes range:[result rangeAtIndex:self.captureGroup]]; + [attributes enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { + [self.textStorage removeAttribute:key range:[result rangeAtIndex:self.captureGroup]]; + [self.textStorage addAttribute:key value:obj range:[result rangeAtIndex:self.captureGroup]]; + }]; [self.set addIndexesInRange:[result rangeAtIndex:self.captureGroup]]; }]; }]; diff --git a/Chromatism/Chromatism/JLTokenizer.h b/Chromatism/Chromatism/JLTokenizer.h index 45ac240..9b07527 100644 --- a/Chromatism/Chromatism/JLTokenizer.h +++ b/Chromatism/Chromatism/JLTokenizer.h @@ -20,6 +20,7 @@ - (void)tokenizeWithRange:(NSRange)range; - (void)tokenize; - (void)validateTokenization; +- (void)symbolicate; - (void)clearColorAttributesInRange:(NSRange)range textStorage:(NSTextStorage *)storage; - (NSMutableAttributedString *)tokenizeString:(NSString *)string withDefaultAttributes:(NSDictionary *)attributes; diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index 8871b03..21aeae7 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -40,13 +40,16 @@ #import "JLTextViewController.h" #import "JLScope.h" #import "JLTokenPattern.h" -#import "Chromatism.h" +#import "Chromatism+Internal.h" #define BLOCK_COMMENT @"blockComment" #define LINE_COMMENT @"lineComment" +#define PROJECT_CLASS_NAMES JLTokenTypeProjectClassNames +#define PROJECT_METHOD_NAMES JLTokenTypeProjectMethodNames @interface JLTokenizer () +@property (nonatomic, strong) NSMutableDictionary *scopes; @property (nonatomic, strong) JLScope *documentScope; @property (nonatomic, strong) JLScope *lineScope; @property (nonatomic, strong) NSTimer *validationTimer; @@ -66,6 +69,8 @@ - (void)setup JLScope *documentScope = [JLScope new]; JLScope *lineScope = [JLScope new]; + self.scopes = [NSMutableDictionary dictionary]; + // Block and line comments JLTokenPattern *blockComment = [self addToken:JLTokenTypeComment withIdentifier:BLOCK_COMMENT pattern:@"" andScope:documentScope]; blockComment.triggeringCharacterSet = [NSCharacterSet characterSetWithCharactersInString:@"/*"]; @@ -74,7 +79,7 @@ - (void)setup [self addToken:JLTokenTypeComment withIdentifier:LINE_COMMENT pattern:@"//.*+$" andScope:lineScope]; // Preprocessor macros - JLTokenPattern *preprocessor = [self addToken:JLTokenTypePreprocessor withIdentifier:nil pattern:@"^#.*+$" andScope:lineScope]; + JLTokenPattern *preprocessor = [self addToken:JLTokenTypePreprocessor withIdentifier:JLTokenTypePreprocessor pattern:@"^#.*+$" andScope:lineScope]; // #import // In xcode it only works for #import and #include, not all preprocessor statements. @@ -105,6 +110,8 @@ - (void)setup NSString *keywords = @"true false yes no YES TRUE FALSE bool BOOL nil id void self NULL if else strong weak nonatomic atomic assign copy typedef enum auto break case const char continue do default double extern float for goto int long register return short signed sizeof static struct switch typedef union unsigned volatile while nonatomic atomic nonatomic readonly super"; [self addToken:JLTokenTypeKeyword withKeywords:keywords andScope:lineScope]; + [self addToken:JLTokenTypeProjectClassNames withIdentifier:PROJECT_CLASS_NAMES pattern:nil andScope:lineScope]; + [self addToken:JLTokenTypeProjectClassNames withIdentifier:PROJECT_METHOD_NAMES pattern:nil andScope:lineScope]; [self addToken:JLTokenTypeKeyword withPattern:@"@[a-zA-Z0-9_]+" andScope:lineScope]; // Other Class Names @@ -138,11 +145,11 @@ - (void)textStorage:(NSTextStorage *)textStorage willProcessEditing:(NSTextStora - (void)textStorage:(NSTextStorage *)textStorage didProcessEditing:(NSTextStorageEditActions)editedMask range:(NSRange)editedRange changeInLength:(NSInteger)delta { NSAssert(textStorage == self.textStorage, @"A JLTokenizer should only handle one textStorage"); + _editedRange = editedRange; _editedLineRange = [textStorage.string lineRangeForRange:editedRange]; [self tokenizeWithRange:_editedLineRange]; - [self setNeedsValidation:YES]; } #pragma mark - JLScope delegate @@ -202,23 +209,33 @@ - (void)tokenizeWithRange:(NSRange)range [self.documentScope perform]; } +#pragma mark - Symbolication + +- (void)symbolicate +{ + [self.scopes[PROJECT_CLASS_NAMES] setPattern:[NSString stringWithFormat:@"\\b(%@)\\b", [[self symbolsWithPattern:@"^@implementation (\\w+)" captureGroup:1] componentsJoinedByString:@"|"]]]; + [self.scopes[PROJECT_METHOD_NAMES] setPattern:[NSString stringWithFormat:@"\\b(%@)\\b", [[self symbolsWithPattern:@"^@property \\(.*?\\)\\s*\\w+[\\s*]+(\\w+);" captureGroup:1] componentsJoinedByString:@"|"]]]; +} #pragma mark - Validation - (void)setNeedsValidation:(BOOL)needsValidation { _needsValidation = needsValidation; + [self.validationTimer invalidate]; + if (needsValidation) { - [self.validationTimer invalidate]; // This is not necessary, right? self.validationTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(validateTokenization) userInfo:nil repeats:NO]; } + } - (void)validateTokenization { [self.textStorage beginEditing]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ - [self tokenize]; + [self symbolicate]; + //[self tokenize]; // This seem to be safe, is it? dispatch_async(dispatch_get_main_queue(), ^{ @@ -251,14 +268,11 @@ - (JLTokenPattern *)addToken:(NSString *)type withPattern:(NSString *)pattern an - (JLTokenPattern *)addToken:(NSString *)type withIdentifier:(NSString *)identifier pattern:(NSString *)pattern andScope:(JLScope *)scope { - NSParameterAssert(type); - NSParameterAssert(pattern); - NSParameterAssert(scope); - JLTokenPattern *token = [JLTokenPattern tokenPatternWithPattern:pattern]; token.identifier = identifier; token.type = type; token.delegate = self; + self.scopes[identifier] = token; [scope addSubscope:token]; return token; @@ -270,6 +284,18 @@ - (JLTokenPattern *)addToken:(NSString *)type withKeywords:(NSString *)keywords return [self addToken:type withPattern:pattern andScope:scope]; } +- (NSMutableArray *)symbolsWithPattern:(NSString *)pattern captureGroup:(int)group +{ + NSMutableArray *array = [NSMutableArray array]; + NSError *error = nil; + NSRegularExpression *expression = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionAnchorsMatchLines error:&error]; + [expression enumerateMatchesInString:self.textStorage.string options:0 range:NSMakeRange(0, self.textStorage.length) usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { + [array addObject:[self.textStorage.string substringWithRange:[result rangeAtIndex:group]]]; + }]; + NSAssert(!error, @"%@",error); + return array; +} + - (void)clearColorAttributesInRange:(NSRange)range textStorage:(NSTextStorage *)storage; { [storage removeAttribute:NSForegroundColorAttributeName range:range]; From 06499cfc7ed0330b461ccc69ed2ce3c4e33e5ac1 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Tue, 13 Aug 2013 05:02:58 +0200 Subject: [PATCH 088/140] avatarURL and color hex fixes --- Chromatism/Chromatism/Helpers.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Chromatism/Chromatism/Helpers.m b/Chromatism/Chromatism/Helpers.m index fabfc71..01c65f2 100644 --- a/Chromatism/Chromatism/Helpers.m +++ b/Chromatism/Chromatism/Helpers.m @@ -16,7 +16,7 @@ + (UIColor*)colorWith8BitRed:(NSInteger)red green:(NSInteger)green blue:(NSInteg + (UIColor*)colorWithHex:(NSString*)hex alpha:(CGFloat)alpha { - assert(6 == [hex length]); + if (hex.length != 6) return nil; NSString *redHex = [NSString stringWithFormat:@"0x%@", [hex substringWithRange:NSMakeRange(0, 2)]]; NSString *greenHex = [NSString stringWithFormat:@"0x%@", [hex substringWithRange:NSMakeRange(2, 2)]]; From a3056673378cb4d284b2334aa5ac90a03a913c90 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Tue, 20 Aug 2013 13:13:05 +0200 Subject: [PATCH 089/140] Subclass NSLayoutManager again --- .../Chromatism.xcodeproj/project.pbxproj | 16 ++++++++ Chromatism/Chromatism/JLLayoutManager.h | 13 +++++++ Chromatism/Chromatism/JLLayoutManager.m | 39 +++++++++++++++++++ Chromatism/Chromatism/JLTextView.m | 9 +++++ Chromatism/Chromatism/JLTextViewController.m | 13 ++++++- Chromatism/Chromatism/UIColor+Chromatism.h | 15 +++++++ Chromatism/Chromatism/UIColor+Chromatism.m | 22 +++++++++++ 7 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 Chromatism/Chromatism/JLLayoutManager.h create mode 100644 Chromatism/Chromatism/JLLayoutManager.m create mode 100644 Chromatism/Chromatism/UIColor+Chromatism.h create mode 100644 Chromatism/Chromatism/UIColor+Chromatism.m diff --git a/Chromatism/Chromatism.xcodeproj/project.pbxproj b/Chromatism/Chromatism.xcodeproj/project.pbxproj index 88d9d9a..25e571e 100644 --- a/Chromatism/Chromatism.xcodeproj/project.pbxproj +++ b/Chromatism/Chromatism.xcodeproj/project.pbxproj @@ -37,6 +37,10 @@ 8FA091A91791E99900179325 /* NSMutableAttributedString+Mush.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FA091A71791E99900179325 /* NSMutableAttributedString+Mush.m */; }; 8FA0CB0F1795F41B00FF8EB1 /* JLTextView.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FA0CB0D1795F41B00FF8EB1 /* JLTextView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8FA0CB101795F41B00FF8EB1 /* JLTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FA0CB0E1795F41B00FF8EB1 /* JLTextView.m */; }; + 8FD79A5917C3741400F2763E /* JLLayoutManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FD79A5717C3741400F2763E /* JLLayoutManager.h */; }; + 8FD79A5A17C3741400F2763E /* JLLayoutManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FD79A5817C3741400F2763E /* JLLayoutManager.m */; }; + 8FE2796517C3842900DD933A /* UIColor+Chromatism.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FE2796317C3842900DD933A /* UIColor+Chromatism.h */; }; + 8FE2796617C3842900DD933A /* UIColor+Chromatism.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FE2796417C3842900DD933A /* UIColor+Chromatism.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -83,6 +87,10 @@ 8FA091A71791E99900179325 /* NSMutableAttributedString+Mush.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSMutableAttributedString+Mush.m"; sourceTree = ""; }; 8FA0CB0D1795F41B00FF8EB1 /* JLTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JLTextView.h; sourceTree = ""; }; 8FA0CB0E1795F41B00FF8EB1 /* JLTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JLTextView.m; sourceTree = ""; }; + 8FD79A5717C3741400F2763E /* JLLayoutManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JLLayoutManager.h; sourceTree = ""; }; + 8FD79A5817C3741400F2763E /* JLLayoutManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JLLayoutManager.m; sourceTree = ""; }; + 8FE2796317C3842900DD933A /* UIColor+Chromatism.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIColor+Chromatism.h"; sourceTree = ""; }; + 8FE2796417C3842900DD933A /* UIColor+Chromatism.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIColor+Chromatism.m"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -152,12 +160,16 @@ 8F3AB9541781C1250023348A /* JLTextViewController.m */, 8FA0CB0D1795F41B00FF8EB1 /* JLTextView.h */, 8FA0CB0E1795F41B00FF8EB1 /* JLTextView.m */, + 8FD79A5717C3741400F2763E /* JLLayoutManager.h */, + 8FD79A5817C3741400F2763E /* JLLayoutManager.m */, 8FA091A61791E99900179325 /* NSMutableAttributedString+Mush.h */, 8FA091A71791E99900179325 /* NSMutableAttributedString+Mush.m */, 8F3AB94D1781C1250023348A /* Helpers.h */, 8F3AB94E1781C1250023348A /* Helpers.m */, 8F3AB94F1781C1250023348A /* JLScope.h */, 8F3AB9501781C1250023348A /* JLScope.m */, + 8FE2796317C3842900DD933A /* UIColor+Chromatism.h */, + 8FE2796417C3842900DD933A /* UIColor+Chromatism.m */, 8F3AB9571781C1250023348A /* JLTokenPattern.h */, 8F3AB9581781C1250023348A /* JLTokenPattern.m */, 8F3AB91E1781C0BA0023348A /* Supporting Files */, @@ -207,6 +219,8 @@ 8FA0CB0F1795F41B00FF8EB1 /* JLTextView.h in Headers */, 8F54EF0E1781C776008C1609 /* Chromatism.h in Headers */, 8F54EF101781C788008C1609 /* Helpers.h in Headers */, + 8FE2796517C3842900DD933A /* UIColor+Chromatism.h in Headers */, + 8FD79A5917C3741400F2763E /* JLLayoutManager.h in Headers */, 8F54EF111781C788008C1609 /* JLScope.h in Headers */, 8F54EF131781C788008C1609 /* JLTextViewController.h in Headers */, 8F54EF141781C788008C1609 /* JLTokenizer.h in Headers */, @@ -302,11 +316,13 @@ 8F54EF241781CD87008C1609 /* JLTokenPattern.m in Sources */, 8F54EF201781CD87008C1609 /* JLScope.m in Sources */, 8FA091A51791E62600179325 /* JLMarkdownTokenizer.m in Sources */, + 8FE2796617C3842900DD933A /* UIColor+Chromatism.m in Sources */, 8FA0CB101795F41B00FF8EB1 /* JLTextView.m in Sources */, 8F54EF1F1781CD87008C1609 /* Helpers.m in Sources */, 8F54EF221781CD87008C1609 /* JLTextViewController.m in Sources */, 8F54EF231781CD87008C1609 /* JLTokenizer.m in Sources */, 8F54EF1E1781CD87008C1609 /* Chromatism.m in Sources */, + 8FD79A5A17C3741400F2763E /* JLLayoutManager.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Chromatism/Chromatism/JLLayoutManager.h b/Chromatism/Chromatism/JLLayoutManager.h new file mode 100644 index 0000000..43108ca --- /dev/null +++ b/Chromatism/Chromatism/JLLayoutManager.h @@ -0,0 +1,13 @@ +// +// JLLayoutManager.h +// Chromatism +// +// Created by Johannes Lund on 2013-08-20. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import + +@interface JLLayoutManager : NSLayoutManager + +@end diff --git a/Chromatism/Chromatism/JLLayoutManager.m b/Chromatism/Chromatism/JLLayoutManager.m new file mode 100644 index 0000000..6ec38d2 --- /dev/null +++ b/Chromatism/Chromatism/JLLayoutManager.m @@ -0,0 +1,39 @@ +// +// JLLayoutManager.m +// Chromatism +// +// Created by Johannes Lund on 2013-08-20. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import "JLLayoutManager.h" +#import "UIColor+Chromatism.h" + +@implementation JLLayoutManager + +- (void)fillBackgroundRectArray:(const CGRect *)rectArray count:(NSUInteger)rectCount forCharacterRange:(NSRange)charRange color:(UIColor *)color +{ + if (color == [UIColor backgroundMarkupColor]) { + CGRect rect; + + //// Color Declarations + UIColor* borderColor = [UIColor colorWithRed: 0.867 green: 0.867 blue: 0.867 alpha: 1]; + UIColor* backgroundColor = [UIColor colorWithRed: 0.973 green: 0.973 blue: 0.973 alpha: 1]; + + for (int i = 0; i < rectCount; i++) { + rect = rectArray[i]; + + //// Rounded Rectangle Drawing + UIBezierPath* roundedRectanglePath = [UIBezierPath bezierPathWithRoundedRect:rect cornerRadius: 3]; + [backgroundColor setFill]; + [roundedRectanglePath fill]; + [borderColor setStroke]; + roundedRectanglePath.lineWidth = 1; + [roundedRectanglePath stroke]; + } + } else { + [super fillBackgroundRectArray:rectArray count:rectCount forCharacterRange:charRange color:color]; + } +} + +@end diff --git a/Chromatism/Chromatism/JLTextView.m b/Chromatism/Chromatism/JLTextView.m index 01f17f9..d596a20 100644 --- a/Chromatism/Chromatism/JLTextView.m +++ b/Chromatism/Chromatism/JLTextView.m @@ -36,6 +36,15 @@ - (id)initWithFrame:(CGRect)frame return self; } +- (id)initWithFrame:(CGRect)frame textContainer:(NSTextContainer *)textContainer +{ + self = [super initWithFrame:frame textContainer:textContainer]; + if (self) { + [self setup]; + } + return self; +} + - (id)initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder:aDecoder]; diff --git a/Chromatism/Chromatism/JLTextViewController.m b/Chromatism/Chromatism/JLTextViewController.m index e4158a2..ce02b28 100644 --- a/Chromatism/Chromatism/JLTextViewController.m +++ b/Chromatism/Chromatism/JLTextViewController.m @@ -10,6 +10,7 @@ #import "JLTokenizer.h" #import "JLTokenizer.h" #import "JLTextView.h" +#import "JLLayoutManager.h" @interface JLTextViewController () /// Only set from -initWithText: and directly set to nil in -loadView @@ -30,7 +31,17 @@ - (instancetype)initWithText:(NSString *)text - (JLTextView *)textView { if (!_textView) { - JLTextView *textView = [[JLTextView alloc] init]; + CGRect newTextViewRect = CGRectInset(self.view.bounds, 8., 0.); + + JLLayoutManager *layoutManager = [[JLLayoutManager alloc] init]; + NSTextContainer *container = [[NSTextContainer alloc] initWithSize:CGSizeMake(newTextViewRect.size.width, CGFLOAT_MAX)]; + container.widthTracksTextView = YES; + [layoutManager addTextContainer:container]; + + NSTextStorage *textStorage = [[NSTextStorage alloc] init]; + [textStorage addLayoutManager:layoutManager]; + + JLTextView *textView = [[JLTextView alloc] initWithFrame:newTextViewRect textContainer:container]; textView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; if (self.defaultText) { diff --git a/Chromatism/Chromatism/UIColor+Chromatism.h b/Chromatism/Chromatism/UIColor+Chromatism.h new file mode 100644 index 0000000..82e5d81 --- /dev/null +++ b/Chromatism/Chromatism/UIColor+Chromatism.h @@ -0,0 +1,15 @@ +// +// UIColor+Chromatism.h +// Chromatism +// +// Created by Johannes Lund on 2013-08-20. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import + +@interface UIColor (Chromatism) + ++ (UIColor *)backgroundMarkupColor; + +@end diff --git a/Chromatism/Chromatism/UIColor+Chromatism.m b/Chromatism/Chromatism/UIColor+Chromatism.m new file mode 100644 index 0000000..c100740 --- /dev/null +++ b/Chromatism/Chromatism/UIColor+Chromatism.m @@ -0,0 +1,22 @@ +// +// UIColor+Chromatism.m +// Chromatism +// +// Created by Johannes Lund on 2013-08-20. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import "UIColor+Chromatism.h" + +@implementation UIColor (Chromatism) + ++ (UIColor *)backgroundMarkupColor +{ + static UIColor *color; + if (!color) { + color = [UIColor colorWithWhite:0.1122334455 alpha:1]; + } + return color; +} + +@end From e0ba5b9e242654287b1fe021dd7eb859f47022c9 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Thu, 22 Aug 2013 07:55:33 +0200 Subject: [PATCH 090/140] Redo, do right. --- .../Chromatism.xcodeproj/project.pbxproj | 4 +- Chromatism/Chromatism/Chromatism.h | 2 + Chromatism/Chromatism/JLLayoutManager.h | 2 + Chromatism/Chromatism/JLLayoutManager.m | 49 +++++++++++-------- 4 files changed, 34 insertions(+), 23 deletions(-) diff --git a/Chromatism/Chromatism.xcodeproj/project.pbxproj b/Chromatism/Chromatism.xcodeproj/project.pbxproj index 25e571e..e065438 100644 --- a/Chromatism/Chromatism.xcodeproj/project.pbxproj +++ b/Chromatism/Chromatism.xcodeproj/project.pbxproj @@ -37,9 +37,9 @@ 8FA091A91791E99900179325 /* NSMutableAttributedString+Mush.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FA091A71791E99900179325 /* NSMutableAttributedString+Mush.m */; }; 8FA0CB0F1795F41B00FF8EB1 /* JLTextView.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FA0CB0D1795F41B00FF8EB1 /* JLTextView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8FA0CB101795F41B00FF8EB1 /* JLTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FA0CB0E1795F41B00FF8EB1 /* JLTextView.m */; }; - 8FD79A5917C3741400F2763E /* JLLayoutManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FD79A5717C3741400F2763E /* JLLayoutManager.h */; }; + 8FD79A5917C3741400F2763E /* JLLayoutManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FD79A5717C3741400F2763E /* JLLayoutManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8FD79A5A17C3741400F2763E /* JLLayoutManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FD79A5817C3741400F2763E /* JLLayoutManager.m */; }; - 8FE2796517C3842900DD933A /* UIColor+Chromatism.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FE2796317C3842900DD933A /* UIColor+Chromatism.h */; }; + 8FE2796517C3842900DD933A /* UIColor+Chromatism.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FE2796317C3842900DD933A /* UIColor+Chromatism.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8FE2796617C3842900DD933A /* UIColor+Chromatism.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FE2796417C3842900DD933A /* UIColor+Chromatism.m */; }; /* End PBXBuildFile section */ diff --git a/Chromatism/Chromatism/Chromatism.h b/Chromatism/Chromatism/Chromatism.h index 6e94695..e43caac 100644 --- a/Chromatism/Chromatism/Chromatism.h +++ b/Chromatism/Chromatism/Chromatism.h @@ -13,4 +13,6 @@ #import "JLTokenPattern.h" #import "JLMarkdownTokenizer.h" #import "JLTextView.h" +#import "UIColor+Chromatism.h" +#import "JLLayoutManager.h" #import "Chromatism+Internal.h" \ No newline at end of file diff --git a/Chromatism/Chromatism/JLLayoutManager.h b/Chromatism/Chromatism/JLLayoutManager.h index 43108ca..09366ed 100644 --- a/Chromatism/Chromatism/JLLayoutManager.h +++ b/Chromatism/Chromatism/JLLayoutManager.h @@ -8,6 +8,8 @@ #import +UIKIT_EXTERN NSString *const JLMarkdownCodeAttribute; + @interface JLLayoutManager : NSLayoutManager @end diff --git a/Chromatism/Chromatism/JLLayoutManager.m b/Chromatism/Chromatism/JLLayoutManager.m index 6ec38d2..6f23fef 100644 --- a/Chromatism/Chromatism/JLLayoutManager.m +++ b/Chromatism/Chromatism/JLLayoutManager.m @@ -9,31 +9,38 @@ #import "JLLayoutManager.h" #import "UIColor+Chromatism.h" +NSString *const JLMarkdownCodeAttribute = @"Code"; + @implementation JLLayoutManager -- (void)fillBackgroundRectArray:(const CGRect *)rectArray count:(NSUInteger)rectCount forCharacterRange:(NSRange)charRange color:(UIColor *)color +- (void)drawBackgroundForGlyphRange:(NSRange)glyphsToShow atPoint:(CGPoint)origin { - if (color == [UIColor backgroundMarkupColor]) { - CGRect rect; - - //// Color Declarations - UIColor* borderColor = [UIColor colorWithRed: 0.867 green: 0.867 blue: 0.867 alpha: 1]; - UIColor* backgroundColor = [UIColor colorWithRed: 0.973 green: 0.973 blue: 0.973 alpha: 1]; - - for (int i = 0; i < rectCount; i++) { - rect = rectArray[i]; - - //// Rounded Rectangle Drawing - UIBezierPath* roundedRectanglePath = [UIBezierPath bezierPathWithRoundedRect:rect cornerRadius: 3]; - [backgroundColor setFill]; - [roundedRectanglePath fill]; - [borderColor setStroke]; - roundedRectanglePath.lineWidth = 1; - [roundedRectanglePath stroke]; + NSRange range = [self characterRangeForGlyphRange:glyphsToShow actualGlyphRange:NULL]; + [self.textStorage enumerateAttribute:JLMarkdownCodeAttribute inRange:range options:0 usingBlock:^(id value, NSRange range, BOOL *stop) { + if (value) { + NSRange wholeGlyphRange = [self glyphRangeForCharacterRange:range actualCharacterRange:NULL]; + [self enumerateEnclosingRectsForGlyphRange:wholeGlyphRange withinSelectedGlyphRange:wholeGlyphRange inTextContainer:self.textContainers.firstObject usingBlock:^(CGRect rect, BOOL *stop) { + [self drawCodeContainerInRect:CGRectOffset(rect, origin.x, origin.y + 4)]; + }]; } - } else { - [super fillBackgroundRectArray:rectArray count:rectCount forCharacterRange:charRange color:color]; - } + }]; + + [super drawBackgroundForGlyphRange:glyphsToShow atPoint:origin]; +} + +- (void)drawCodeContainerInRect:(CGRect)rect +{ + //// Color Declarations + UIColor* borderColor = [UIColor colorWithRed: 0.867 green: 0.867 blue: 0.867 alpha: 1]; + UIColor* backgroundColor = [UIColor colorWithRed: 0.972549 green: 0.972549 blue: 0.972549 alpha: 1]; + + //// Rounded Rectangle Drawing + UIBezierPath* roundedRectanglePath = [UIBezierPath bezierPathWithRoundedRect:rect cornerRadius: 3]; + [backgroundColor setFill]; + [roundedRectanglePath fill]; + [borderColor setStroke]; + roundedRectanglePath.lineWidth = 1; + [roundedRectanglePath stroke]; } @end From 6ae1171afe70efe786fe939e1f6d121492c8614e Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Fri, 23 Aug 2013 15:28:24 +0200 Subject: [PATCH 091/140] Style Fixes --- Chromatism/Chromatism/JLLayoutManager.h | 1 + Chromatism/Chromatism/JLLayoutManager.m | 26 ++++++++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/Chromatism/Chromatism/JLLayoutManager.h b/Chromatism/Chromatism/JLLayoutManager.h index 09366ed..544f082 100644 --- a/Chromatism/Chromatism/JLLayoutManager.h +++ b/Chromatism/Chromatism/JLLayoutManager.h @@ -9,6 +9,7 @@ #import UIKIT_EXTERN NSString *const JLMarkdownCodeAttribute; +UIKIT_EXTERN NSString *const JLLineStrokeAttribute; @interface JLLayoutManager : NSLayoutManager diff --git a/Chromatism/Chromatism/JLLayoutManager.m b/Chromatism/Chromatism/JLLayoutManager.m index 6f23fef..334c8b8 100644 --- a/Chromatism/Chromatism/JLLayoutManager.m +++ b/Chromatism/Chromatism/JLLayoutManager.m @@ -10,6 +10,7 @@ #import "UIColor+Chromatism.h" NSString *const JLMarkdownCodeAttribute = @"Code"; +NSString *const JLLineStrokeAttribute = @"LineStroke"; @implementation JLLayoutManager @@ -20,14 +21,37 @@ - (void)drawBackgroundForGlyphRange:(NSRange)glyphsToShow atPoint:(CGPoint)origi if (value) { NSRange wholeGlyphRange = [self glyphRangeForCharacterRange:range actualCharacterRange:NULL]; [self enumerateEnclosingRectsForGlyphRange:wholeGlyphRange withinSelectedGlyphRange:wholeGlyphRange inTextContainer:self.textContainers.firstObject usingBlock:^(CGRect rect, BOOL *stop) { - [self drawCodeContainerInRect:CGRectOffset(rect, origin.x, origin.y + 4)]; + [self drawCodeContainerInRect:CGRectOffset(rect, origin.x, origin.y)]; }]; } }]; + [self.textStorage enumerateAttribute:JLLineStrokeAttribute inRange:range options:0 usingBlock:^(id value, NSRange range, BOOL *stop) { + if (value) { + NSRange wholeGlyphRange = [self glyphRangeForCharacterRange:range actualCharacterRange:NULL]; + NSUInteger index = NSMaxRange(wholeGlyphRange) - 1; + CGRect rect = [self lineFragmentUsedRectForGlyphAtIndex:index effectiveRange:NULL]; + rect.size.width = [self textContainerForGlyphAtIndex:index effectiveRange:NULL].size.width; + rect = CGRectOffset(rect, origin.x, origin.y); + + [self drawStrokeWithColor:value inRect:rect]; + } + }]; + [super drawBackgroundForGlyphRange:glyphsToShow atPoint:origin]; } +- (void)drawStrokeWithColor:(UIColor *)color inRect:(CGRect)rect +{ + //// Bezier Drawing + UIBezierPath* bezierPath = [UIBezierPath bezierPath]; + [bezierPath moveToPoint: CGPointMake(CGRectGetMinX(rect), CGRectGetMaxY(rect))]; + [bezierPath addLineToPoint: CGPointMake(CGRectGetMaxX(rect), CGRectGetMaxY(rect))]; + [color setStroke]; + bezierPath.lineWidth = 0.5; + [bezierPath stroke]; +} + - (void)drawCodeContainerInRect:(CGRect)rect { //// Color Declarations From f3da8ba541a806a01f83f182ab6cef63d3ea3314 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Sat, 24 Aug 2013 15:26:29 +0200 Subject: [PATCH 092/140] Move JLLayoutManager --- .../Chromatism.xcodeproj/project.pbxproj | 4 -- Chromatism/Chromatism/Chromatism.h | 1 - Chromatism/Chromatism/JLLayoutManager.h | 16 ----- Chromatism/Chromatism/JLLayoutManager.m | 70 ------------------- Chromatism/Chromatism/JLTextViewController.m | 3 +- 5 files changed, 1 insertion(+), 93 deletions(-) delete mode 100644 Chromatism/Chromatism/JLLayoutManager.h delete mode 100644 Chromatism/Chromatism/JLLayoutManager.m diff --git a/Chromatism/Chromatism.xcodeproj/project.pbxproj b/Chromatism/Chromatism.xcodeproj/project.pbxproj index e065438..bab5012 100644 --- a/Chromatism/Chromatism.xcodeproj/project.pbxproj +++ b/Chromatism/Chromatism.xcodeproj/project.pbxproj @@ -37,8 +37,6 @@ 8FA091A91791E99900179325 /* NSMutableAttributedString+Mush.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FA091A71791E99900179325 /* NSMutableAttributedString+Mush.m */; }; 8FA0CB0F1795F41B00FF8EB1 /* JLTextView.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FA0CB0D1795F41B00FF8EB1 /* JLTextView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8FA0CB101795F41B00FF8EB1 /* JLTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FA0CB0E1795F41B00FF8EB1 /* JLTextView.m */; }; - 8FD79A5917C3741400F2763E /* JLLayoutManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FD79A5717C3741400F2763E /* JLLayoutManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8FD79A5A17C3741400F2763E /* JLLayoutManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FD79A5817C3741400F2763E /* JLLayoutManager.m */; }; 8FE2796517C3842900DD933A /* UIColor+Chromatism.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FE2796317C3842900DD933A /* UIColor+Chromatism.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8FE2796617C3842900DD933A /* UIColor+Chromatism.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FE2796417C3842900DD933A /* UIColor+Chromatism.m */; }; /* End PBXBuildFile section */ @@ -220,7 +218,6 @@ 8F54EF0E1781C776008C1609 /* Chromatism.h in Headers */, 8F54EF101781C788008C1609 /* Helpers.h in Headers */, 8FE2796517C3842900DD933A /* UIColor+Chromatism.h in Headers */, - 8FD79A5917C3741400F2763E /* JLLayoutManager.h in Headers */, 8F54EF111781C788008C1609 /* JLScope.h in Headers */, 8F54EF131781C788008C1609 /* JLTextViewController.h in Headers */, 8F54EF141781C788008C1609 /* JLTokenizer.h in Headers */, @@ -322,7 +319,6 @@ 8F54EF221781CD87008C1609 /* JLTextViewController.m in Sources */, 8F54EF231781CD87008C1609 /* JLTokenizer.m in Sources */, 8F54EF1E1781CD87008C1609 /* Chromatism.m in Sources */, - 8FD79A5A17C3741400F2763E /* JLLayoutManager.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Chromatism/Chromatism/Chromatism.h b/Chromatism/Chromatism/Chromatism.h index e43caac..0cedd79 100644 --- a/Chromatism/Chromatism/Chromatism.h +++ b/Chromatism/Chromatism/Chromatism.h @@ -14,5 +14,4 @@ #import "JLMarkdownTokenizer.h" #import "JLTextView.h" #import "UIColor+Chromatism.h" -#import "JLLayoutManager.h" #import "Chromatism+Internal.h" \ No newline at end of file diff --git a/Chromatism/Chromatism/JLLayoutManager.h b/Chromatism/Chromatism/JLLayoutManager.h deleted file mode 100644 index 544f082..0000000 --- a/Chromatism/Chromatism/JLLayoutManager.h +++ /dev/null @@ -1,16 +0,0 @@ -// -// JLLayoutManager.h -// Chromatism -// -// Created by Johannes Lund on 2013-08-20. -// Copyright (c) 2013 Anviking. All rights reserved. -// - -#import - -UIKIT_EXTERN NSString *const JLMarkdownCodeAttribute; -UIKIT_EXTERN NSString *const JLLineStrokeAttribute; - -@interface JLLayoutManager : NSLayoutManager - -@end diff --git a/Chromatism/Chromatism/JLLayoutManager.m b/Chromatism/Chromatism/JLLayoutManager.m deleted file mode 100644 index 334c8b8..0000000 --- a/Chromatism/Chromatism/JLLayoutManager.m +++ /dev/null @@ -1,70 +0,0 @@ -// -// JLLayoutManager.m -// Chromatism -// -// Created by Johannes Lund on 2013-08-20. -// Copyright (c) 2013 Anviking. All rights reserved. -// - -#import "JLLayoutManager.h" -#import "UIColor+Chromatism.h" - -NSString *const JLMarkdownCodeAttribute = @"Code"; -NSString *const JLLineStrokeAttribute = @"LineStroke"; - -@implementation JLLayoutManager - -- (void)drawBackgroundForGlyphRange:(NSRange)glyphsToShow atPoint:(CGPoint)origin -{ - NSRange range = [self characterRangeForGlyphRange:glyphsToShow actualGlyphRange:NULL]; - [self.textStorage enumerateAttribute:JLMarkdownCodeAttribute inRange:range options:0 usingBlock:^(id value, NSRange range, BOOL *stop) { - if (value) { - NSRange wholeGlyphRange = [self glyphRangeForCharacterRange:range actualCharacterRange:NULL]; - [self enumerateEnclosingRectsForGlyphRange:wholeGlyphRange withinSelectedGlyphRange:wholeGlyphRange inTextContainer:self.textContainers.firstObject usingBlock:^(CGRect rect, BOOL *stop) { - [self drawCodeContainerInRect:CGRectOffset(rect, origin.x, origin.y)]; - }]; - } - }]; - - [self.textStorage enumerateAttribute:JLLineStrokeAttribute inRange:range options:0 usingBlock:^(id value, NSRange range, BOOL *stop) { - if (value) { - NSRange wholeGlyphRange = [self glyphRangeForCharacterRange:range actualCharacterRange:NULL]; - NSUInteger index = NSMaxRange(wholeGlyphRange) - 1; - CGRect rect = [self lineFragmentUsedRectForGlyphAtIndex:index effectiveRange:NULL]; - rect.size.width = [self textContainerForGlyphAtIndex:index effectiveRange:NULL].size.width; - rect = CGRectOffset(rect, origin.x, origin.y); - - [self drawStrokeWithColor:value inRect:rect]; - } - }]; - - [super drawBackgroundForGlyphRange:glyphsToShow atPoint:origin]; -} - -- (void)drawStrokeWithColor:(UIColor *)color inRect:(CGRect)rect -{ - //// Bezier Drawing - UIBezierPath* bezierPath = [UIBezierPath bezierPath]; - [bezierPath moveToPoint: CGPointMake(CGRectGetMinX(rect), CGRectGetMaxY(rect))]; - [bezierPath addLineToPoint: CGPointMake(CGRectGetMaxX(rect), CGRectGetMaxY(rect))]; - [color setStroke]; - bezierPath.lineWidth = 0.5; - [bezierPath stroke]; -} - -- (void)drawCodeContainerInRect:(CGRect)rect -{ - //// Color Declarations - UIColor* borderColor = [UIColor colorWithRed: 0.867 green: 0.867 blue: 0.867 alpha: 1]; - UIColor* backgroundColor = [UIColor colorWithRed: 0.972549 green: 0.972549 blue: 0.972549 alpha: 1]; - - //// Rounded Rectangle Drawing - UIBezierPath* roundedRectanglePath = [UIBezierPath bezierPathWithRoundedRect:rect cornerRadius: 3]; - [backgroundColor setFill]; - [roundedRectanglePath fill]; - [borderColor setStroke]; - roundedRectanglePath.lineWidth = 1; - [roundedRectanglePath stroke]; -} - -@end diff --git a/Chromatism/Chromatism/JLTextViewController.m b/Chromatism/Chromatism/JLTextViewController.m index ce02b28..128e1c3 100644 --- a/Chromatism/Chromatism/JLTextViewController.m +++ b/Chromatism/Chromatism/JLTextViewController.m @@ -10,7 +10,6 @@ #import "JLTokenizer.h" #import "JLTokenizer.h" #import "JLTextView.h" -#import "JLLayoutManager.h" @interface JLTextViewController () /// Only set from -initWithText: and directly set to nil in -loadView @@ -33,7 +32,7 @@ - (JLTextView *)textView if (!_textView) { CGRect newTextViewRect = CGRectInset(self.view.bounds, 8., 0.); - JLLayoutManager *layoutManager = [[JLLayoutManager alloc] init]; + NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init]; NSTextContainer *container = [[NSTextContainer alloc] initWithSize:CGSizeMake(newTextViewRect.size.width, CGFLOAT_MAX)]; container.widthTracksTextView = YES; [layoutManager addTextContainer:container]; From 557ded31bb124a214ca5eb2de4ebfcc034aae0e0 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Thu, 29 Aug 2013 00:50:51 +0200 Subject: [PATCH 093/140] =?UTF-8?q?Don=E2=80=99t=20care=20about=20keyboard?= =?UTF-8?q?=20blur=20performance,=20let=20the=20JLTextViewControllers=20vi?= =?UTF-8?q?ew=20be=20its=20textView?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Chromatism/Chromatism/JLTextViewController.m | 91 ++------------------ Chromatism/Chromatism/JLTokenizer.m | 2 + 2 files changed, 8 insertions(+), 85 deletions(-) diff --git a/Chromatism/Chromatism/JLTextViewController.m b/Chromatism/Chromatism/JLTextViewController.m index 128e1c3..dfb9720 100644 --- a/Chromatism/Chromatism/JLTextViewController.m +++ b/Chromatism/Chromatism/JLTextViewController.m @@ -27,20 +27,15 @@ - (instancetype)initWithText:(NSString *)text return self; } +- (void)loadView +{ + self.view = self.textView; +} + - (JLTextView *)textView { if (!_textView) { - CGRect newTextViewRect = CGRectInset(self.view.bounds, 8., 0.); - - NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init]; - NSTextContainer *container = [[NSTextContainer alloc] initWithSize:CGSizeMake(newTextViewRect.size.width, CGFLOAT_MAX)]; - container.widthTracksTextView = YES; - [layoutManager addTextContainer:container]; - - NSTextStorage *textStorage = [[NSTextStorage alloc] init]; - [textStorage addLayoutManager:layoutManager]; - - JLTextView *textView = [[JLTextView alloc] initWithFrame:newTextViewRect textContainer:container]; + JLTextView *textView = [[JLTextView alloc] initWithFrame:CGRectZero]; textView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; if (self.defaultText) { @@ -62,88 +57,14 @@ - (void)viewDidLoad { [super viewDidLoad]; - self.textView.frame = self.view.frame; - [self.view addSubview:self.textView]; self.view.backgroundColor = self.textView.backgroundColor; self.navigationController.navigationBar.translucent = TRUE; } -- (void)viewDidAppear:(BOOL)animated -{ - [super viewDidAppear:animated]; - - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; -} - - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } -- (void)viewWillDisappear:(BOOL)animated -{ - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - -#pragma mark - Responding to keyboard events - -- (void)keyboardWillShow:(NSNotification *)notification { - - /* - Reduce the size of the text view so that it's not obscured by the keyboard. - Animate the resize so that it's in sync with the appearance of the keyboard. - */ - - NSDictionary *userInfo = [notification userInfo]; - - // Get the origin of the keyboard when it's displayed. - NSValue *aValue = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey]; - - // Get the top of the keyboard as the y coordinate of its origin in self's view's - // coordinate system. The bottom of the text view's frame should align with the top - // of the keyboard's final position. - // - CGRect keyboardRect = [aValue CGRectValue]; - keyboardRect = [self.view convertRect:keyboardRect fromView:nil]; - - CGFloat keyboardTop = keyboardRect.origin.y; - CGRect newTextViewFrame = self.view.bounds; - newTextViewFrame.size.height = keyboardTop - self.view.bounds.origin.y; - - // Get the duration of the animation. - NSValue *animationDurationValue = [userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey]; - NSTimeInterval animationDuration; - [animationDurationValue getValue:&animationDuration]; - - // Animate the resize of the text view's frame in sync with the keyboard's appearance. - [UIView beginAnimations:nil context:NULL]; - [UIView setAnimationDuration:animationDuration]; - - self.textView.frame = newTextViewFrame; - - [UIView commitAnimations]; -} - -- (void)keyboardWillHide:(NSNotification *)notification { - - NSDictionary *userInfo = [notification userInfo]; - - /* - Restore the size of the text view (fill self's view). - Animate the resize so that it's in sync with the disappearance of the keyboard. - */ - NSValue *animationDurationValue = [userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey]; - NSTimeInterval animationDuration; - [animationDurationValue getValue:&animationDuration]; - - [UIView beginAnimations:nil context:NULL]; - [UIView setAnimationDuration:animationDuration]; - - self.textView.frame = self.view.bounds; - - [UIView commitAnimations]; -} - @end diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index 9b3ae63..3465968 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -141,6 +141,8 @@ - (void)textStorage:(NSTextStorage *)textStorage didProcessEditing:(NSTextStorag _editedRange = editedRange; _editedLineRange = [textStorage.string lineRangeForRange:editedRange]; + if (textStorage.editedMask == NSTextStorageEditedAttributes) return; + [self tokenizeWithRange:_editedLineRange]; [self setNeedsValidation:YES]; } From dc90dcc18d6ddb98805d026a7ba463ff483b9a37 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Sat, 31 Aug 2013 16:50:02 +0200 Subject: [PATCH 094/140] commented out validateTokenization --- Chromatism/Chromatism/JLTokenizer.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index 3465968..8580fb6 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -221,7 +221,7 @@ - (void)setNeedsValidation:(BOOL)needsValidation } - (void)validateTokenization -{ +{/* [self.textStorage beginEditing]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ [self tokenize]; @@ -230,6 +230,7 @@ - (void)validateTokenization [self.textStorage endEditing]; }); }); + */ } - (NSMutableAttributedString *)tokenizeString:(NSString *)string withDefaultAttributes:(NSDictionary *)attributes; From 13fdcd73da7ee4c74e441a1a535d3ab5fb5253ab Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Sun, 8 Sep 2013 15:19:57 +0200 Subject: [PATCH 095/140] Better Automatic Intendation --- Chromatism/Chromatism/JLTextView.m | 45 ++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/Chromatism/Chromatism/JLTextView.m b/Chromatism/Chromatism/JLTextView.m index d596a20..fa8c940 100644 --- a/Chromatism/Chromatism/JLTextView.m +++ b/Chromatism/Chromatism/JLTextView.m @@ -113,18 +113,22 @@ - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range r if ([text isEqualToString:@"\n"]) { // Return // Start the new line with as many tabs or white spaces as the previous one. - NSRange lineRange = [textView.text lineRangeForRange:range]; - NSRange prefixRange = [textView.text rangeOfString:@"[\\t| ]*" options:NSRegularExpressionSearch range:lineRange]; - NSString *prefixString = [textView.text substringWithRange:prefixRange]; - - UITextPosition *beginning = textView.beginningOfDocument; - UITextPosition *start = [textView positionFromPosition:beginning offset:range.location]; - UITextPosition *stop = [textView positionFromPosition:start offset:range.length]; - - UITextRange *textRange = [textView textRangeFromPosition:start toPosition:stop]; - - [textView replaceRange:textRange withText:[NSString stringWithFormat:@"\n%@",prefixString]]; + NSString *prefixString = [@"\n" stringByAppendingString:[self prefixStringFromRange:range]]; + + NSString *lastCharacter = [textView.text substringWithRange:NSMakeRange(range.location - 1, 1)]; + if ([lastCharacter isEqualToString:@"{"]) { + + prefixString = [prefixString stringByAppendingString:@" "]; + } else if ([lastCharacter isEqualToString:@"}"]) { + if ([[prefixString substringFromIndex:prefixString.length - 4] isEqualToString:@" "]) { + prefixString = [prefixString substringToIndex:prefixString.length - 4]; + } + else if ([[prefixString substringFromIndex:prefixString.length - 1] isEqualToString:@"\t"]) { + prefixString = [prefixString substringToIndex:prefixString.length - 1]; + } + } + [textView replaceRange:[self rangeWithRange:range] withText:prefixString]; return NO; } @@ -136,6 +140,24 @@ - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range r return YES; } +#pragma mark - Helpers + +- (UITextRange *)rangeWithRange:(NSRange)range +{ + UITextPosition *beginning = self.beginningOfDocument; + UITextPosition *start = [self positionFromPosition:beginning offset:range.location]; + UITextPosition *stop = [self positionFromPosition:start offset:range.length]; + + return [self textRangeFromPosition:start toPosition:stop]; +} + +- (NSString *)prefixStringFromRange:(NSRange)range +{ + NSRange lineRange = [self.text lineRangeForRange:range]; + NSRange prefixRange = [self.text rangeOfString:@"[\\t| ]*" options:NSRegularExpressionSearch range:lineRange]; + return [self.text substringWithRange:prefixRange]; +} + #pragma mark - JLTokenizer data source - (NSString *)recentlyReplacedText @@ -160,5 +182,4 @@ - (BOOL)layoutManager:(NSLayoutManager *)layoutManager shouldBreakLineByWordBefo if ([character isEqualToString:@"*"]) return NO; return YES; } - @end From df698ea0a012be4738c696cc2555c9ee37039c55 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Wed, 2 Oct 2013 17:49:40 +0200 Subject: [PATCH 096/140] Remove JLLayoutManager from project settings --- Chromatism/Chromatism.xcodeproj/project.pbxproj | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Chromatism/Chromatism.xcodeproj/project.pbxproj b/Chromatism/Chromatism.xcodeproj/project.pbxproj index bab5012..3ba76ec 100644 --- a/Chromatism/Chromatism.xcodeproj/project.pbxproj +++ b/Chromatism/Chromatism.xcodeproj/project.pbxproj @@ -85,8 +85,6 @@ 8FA091A71791E99900179325 /* NSMutableAttributedString+Mush.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSMutableAttributedString+Mush.m"; sourceTree = ""; }; 8FA0CB0D1795F41B00FF8EB1 /* JLTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JLTextView.h; sourceTree = ""; }; 8FA0CB0E1795F41B00FF8EB1 /* JLTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JLTextView.m; sourceTree = ""; }; - 8FD79A5717C3741400F2763E /* JLLayoutManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JLLayoutManager.h; sourceTree = ""; }; - 8FD79A5817C3741400F2763E /* JLLayoutManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JLLayoutManager.m; sourceTree = ""; }; 8FE2796317C3842900DD933A /* UIColor+Chromatism.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIColor+Chromatism.h"; sourceTree = ""; }; 8FE2796417C3842900DD933A /* UIColor+Chromatism.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIColor+Chromatism.m"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -158,8 +156,6 @@ 8F3AB9541781C1250023348A /* JLTextViewController.m */, 8FA0CB0D1795F41B00FF8EB1 /* JLTextView.h */, 8FA0CB0E1795F41B00FF8EB1 /* JLTextView.m */, - 8FD79A5717C3741400F2763E /* JLLayoutManager.h */, - 8FD79A5817C3741400F2763E /* JLLayoutManager.m */, 8FA091A61791E99900179325 /* NSMutableAttributedString+Mush.h */, 8FA091A71791E99900179325 /* NSMutableAttributedString+Mush.m */, 8F3AB94D1781C1250023348A /* Helpers.h */, From a3dd7d342277f73b091120ec6339af08091e44f2 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Thu, 3 Oct 2013 23:03:38 +0200 Subject: [PATCH 097/140] Update Tokenization when theme is changed --- Chromatism/Chromatism/JLTextView.m | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Chromatism/Chromatism/JLTextView.m b/Chromatism/Chromatism/JLTextView.m index fa8c940..726bcda 100644 --- a/Chromatism/Chromatism/JLTextView.m +++ b/Chromatism/Chromatism/JLTextView.m @@ -86,6 +86,9 @@ -(void)setTheme:(JLTokenizerTheme)theme //Set font, text color and background color back to default UIColor *backgroundColor = self.syntaxTokenizer.colors[JLTokenTypeBackground]; [self setBackgroundColor:backgroundColor ? backgroundColor : [UIColor whiteColor] ]; + + // Refresh Tokenization + [self.syntaxTokenizer tokenizeTextStorage:self.textStorage withRange:NSMakeRange(0, self.textStorage.length)]; } - (JLTokenizerTheme)theme From 3884284475f97c8d8463ec96d9e47abc6c5cb56b Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Thu, 3 Oct 2013 23:05:05 +0200 Subject: [PATCH 098/140] Use Apples new sample code for adjusting contentInsets to keyboard. --- Chromatism/Chromatism/JLTextViewController.m | 42 ++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/Chromatism/Chromatism/JLTextViewController.m b/Chromatism/Chromatism/JLTextViewController.m index dfb9720..ddfd1be 100644 --- a/Chromatism/Chromatism/JLTextViewController.m +++ b/Chromatism/Chromatism/JLTextViewController.m @@ -59,6 +59,8 @@ - (void)viewDidLoad self.view.backgroundColor = self.textView.backgroundColor; self.navigationController.navigationBar.translucent = TRUE; + + [self registerForKeyboardNotifications]; } - (void)didReceiveMemoryWarning @@ -67,4 +69,44 @@ - (void)didReceiveMemoryWarning // Dispose of any resources that can be recreated. } +#pragma mark - Content Insets and Keyboard + +// Call this method somewhere in your view controller setup code. +- (void)registerForKeyboardNotifications +{ + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(keyboardWasShown:) + name:UIKeyboardDidShowNotification object:nil]; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(keyboardWillBeHidden:) + name:UIKeyboardWillHideNotification object:nil]; + +} + +// Called when the UIKeyboardDidShowNotification is sent. +- (void)keyboardWasShown:(NSNotification *)notification +{ + NSDictionary* info = [notification userInfo]; + UIScrollView *scrollView = self.textView; + CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; + + UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0); + scrollView.contentInset = contentInsets; + scrollView.scrollIndicatorInsets = contentInsets; + + //CGPoint caretPosition = [self.textView caretRectForPosition:self.textView.selectedTextRange.start].origin; + //CGRect caretRect = CGRectMake(caretPosition.x, caretPosition.y, 1, 1); + //[self.textView scrollRectToVisible:caretRect animated:YES]; +} + +// Called when the UIKeyboardWillHideNotification is sent +- (void)keyboardWillBeHidden:(NSNotification *)notification +{ + UIScrollView *scrollView = self.textView; + UIEdgeInsets contentInsets = UIEdgeInsetsZero; + scrollView.contentInset = contentInsets; + scrollView.scrollIndicatorInsets = contentInsets; +} + @end From 0241655de96c2c14b1f3ee9dde19015bfd7b4009 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Fri, 4 Oct 2013 08:53:33 +0200 Subject: [PATCH 099/140] Only refresh indexes that are valid in the attributedString --- Chromatism/Chromatism/JLTokenizer.m | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index 8580fb6..de9e11d 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -158,6 +158,9 @@ - (void)scope:(JLScope *)scope didChangeIndexesFrom:(NSIndexSet *)oldSet to:(NSI NSMutableIndexSet *removedIndexes = oldSet.mutableCopy; [removedIndexes removeIndexes:newSet]; + // Make sure the indexes still excist in the attributedString + removedIndexes = [removedIndexes intersectionWithSet:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, self.textStorage.length)]]; + ChromatismLog(@"Removed Indexes:%@",removedIndexes); if (removedIndexes) { From 8c172c5ad761c72672c0c93717d2e0137aed9b71 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Fri, 4 Oct 2013 08:56:45 +0200 Subject: [PATCH 100/140] Remove JLMarkdownTokenizer --- .../Chromatism.xcodeproj/project.pbxproj | 16 --- Chromatism/Chromatism/Chromatism.h | 1 - Chromatism/Chromatism/JLMarkdownTokenizer.h | 17 --- Chromatism/Chromatism/JLMarkdownTokenizer.m | 116 ------------------ .../NSMutableAttributedString+Mush.h | 15 --- .../NSMutableAttributedString+Mush.m | 68 ---------- 6 files changed, 233 deletions(-) delete mode 100644 Chromatism/Chromatism/JLMarkdownTokenizer.h delete mode 100644 Chromatism/Chromatism/JLMarkdownTokenizer.m delete mode 100644 Chromatism/Chromatism/NSMutableAttributedString+Mush.h delete mode 100644 Chromatism/Chromatism/NSMutableAttributedString+Mush.m diff --git a/Chromatism/Chromatism.xcodeproj/project.pbxproj b/Chromatism/Chromatism.xcodeproj/project.pbxproj index 3ba76ec..83cde2d 100644 --- a/Chromatism/Chromatism.xcodeproj/project.pbxproj +++ b/Chromatism/Chromatism.xcodeproj/project.pbxproj @@ -31,10 +31,6 @@ 8F54EF221781CD87008C1609 /* JLTextViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F3AB9541781C1250023348A /* JLTextViewController.m */; }; 8F54EF231781CD87008C1609 /* JLTokenizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F3AB9561781C1250023348A /* JLTokenizer.m */; }; 8F54EF241781CD87008C1609 /* JLTokenPattern.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F3AB9581781C1250023348A /* JLTokenPattern.m */; }; - 8FA091A41791E62600179325 /* JLMarkdownTokenizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FA091A21791E62600179325 /* JLMarkdownTokenizer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8FA091A51791E62600179325 /* JLMarkdownTokenizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FA091A31791E62600179325 /* JLMarkdownTokenizer.m */; }; - 8FA091A81791E99900179325 /* NSMutableAttributedString+Mush.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FA091A61791E99900179325 /* NSMutableAttributedString+Mush.h */; }; - 8FA091A91791E99900179325 /* NSMutableAttributedString+Mush.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FA091A71791E99900179325 /* NSMutableAttributedString+Mush.m */; }; 8FA0CB0F1795F41B00FF8EB1 /* JLTextView.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FA0CB0D1795F41B00FF8EB1 /* JLTextView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8FA0CB101795F41B00FF8EB1 /* JLTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FA0CB0E1795F41B00FF8EB1 /* JLTextView.m */; }; 8FE2796517C3842900DD933A /* UIColor+Chromatism.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FE2796317C3842900DD933A /* UIColor+Chromatism.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -79,10 +75,6 @@ 8F3AB9581781C1250023348A /* JLTokenPattern.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JLTokenPattern.m; sourceTree = ""; }; 8F3AB95F1781C12F0023348A /* test.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = test.json; sourceTree = ""; }; 8F3AB9611781C26A0023348A /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 8FA091A21791E62600179325 /* JLMarkdownTokenizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JLMarkdownTokenizer.h; sourceTree = ""; }; - 8FA091A31791E62600179325 /* JLMarkdownTokenizer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JLMarkdownTokenizer.m; sourceTree = ""; }; - 8FA091A61791E99900179325 /* NSMutableAttributedString+Mush.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSMutableAttributedString+Mush.h"; sourceTree = ""; }; - 8FA091A71791E99900179325 /* NSMutableAttributedString+Mush.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSMutableAttributedString+Mush.m"; sourceTree = ""; }; 8FA0CB0D1795F41B00FF8EB1 /* JLTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JLTextView.h; sourceTree = ""; }; 8FA0CB0E1795F41B00FF8EB1 /* JLTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JLTextView.m; sourceTree = ""; }; 8FE2796317C3842900DD933A /* UIColor+Chromatism.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIColor+Chromatism.h"; sourceTree = ""; }; @@ -150,14 +142,10 @@ 8F3AB9221781C0BA0023348A /* Chromatism.m */, 8F3AB9551781C1250023348A /* JLTokenizer.h */, 8F3AB9561781C1250023348A /* JLTokenizer.m */, - 8FA091A21791E62600179325 /* JLMarkdownTokenizer.h */, - 8FA091A31791E62600179325 /* JLMarkdownTokenizer.m */, 8F3AB9531781C1250023348A /* JLTextViewController.h */, 8F3AB9541781C1250023348A /* JLTextViewController.m */, 8FA0CB0D1795F41B00FF8EB1 /* JLTextView.h */, 8FA0CB0E1795F41B00FF8EB1 /* JLTextView.m */, - 8FA091A61791E99900179325 /* NSMutableAttributedString+Mush.h */, - 8FA091A71791E99900179325 /* NSMutableAttributedString+Mush.m */, 8F3AB94D1781C1250023348A /* Helpers.h */, 8F3AB94E1781C1250023348A /* Helpers.m */, 8F3AB94F1781C1250023348A /* JLScope.h */, @@ -209,7 +197,6 @@ buildActionMask = 2147483647; files = ( 32102EE117A948F900CFA161 /* Chromatism+Internal.h in Headers */, - 8FA091A81791E99900179325 /* NSMutableAttributedString+Mush.h in Headers */, 8FA0CB0F1795F41B00FF8EB1 /* JLTextView.h in Headers */, 8F54EF0E1781C776008C1609 /* Chromatism.h in Headers */, 8F54EF101781C788008C1609 /* Helpers.h in Headers */, @@ -217,7 +204,6 @@ 8F54EF111781C788008C1609 /* JLScope.h in Headers */, 8F54EF131781C788008C1609 /* JLTextViewController.h in Headers */, 8F54EF141781C788008C1609 /* JLTokenizer.h in Headers */, - 8FA091A41791E62600179325 /* JLMarkdownTokenizer.h in Headers */, 8F54EF151781C788008C1609 /* JLTokenPattern.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; @@ -305,10 +291,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 8FA091A91791E99900179325 /* NSMutableAttributedString+Mush.m in Sources */, 8F54EF241781CD87008C1609 /* JLTokenPattern.m in Sources */, 8F54EF201781CD87008C1609 /* JLScope.m in Sources */, - 8FA091A51791E62600179325 /* JLMarkdownTokenizer.m in Sources */, 8FE2796617C3842900DD933A /* UIColor+Chromatism.m in Sources */, 8FA0CB101795F41B00FF8EB1 /* JLTextView.m in Sources */, 8F54EF1F1781CD87008C1609 /* Helpers.m in Sources */, diff --git a/Chromatism/Chromatism/Chromatism.h b/Chromatism/Chromatism/Chromatism.h index 0cedd79..c55bdaa 100644 --- a/Chromatism/Chromatism/Chromatism.h +++ b/Chromatism/Chromatism/Chromatism.h @@ -11,7 +11,6 @@ #import "JLTokenizer.h" #import "JLTextViewController.h" #import "JLTokenPattern.h" -#import "JLMarkdownTokenizer.h" #import "JLTextView.h" #import "UIColor+Chromatism.h" #import "Chromatism+Internal.h" \ No newline at end of file diff --git a/Chromatism/Chromatism/JLMarkdownTokenizer.h b/Chromatism/Chromatism/JLMarkdownTokenizer.h deleted file mode 100644 index 02f28c6..0000000 --- a/Chromatism/Chromatism/JLMarkdownTokenizer.h +++ /dev/null @@ -1,17 +0,0 @@ -// -// JLMarkdownTokenizer.h -// Chromatism -// -// Created by Johannes Lund on 2013-07-13. -// Copyright (c) 2013 Anviking. All rights reserved. -// - -#import - -@interface JLMarkdownTokenizer : JLTokenizer - -@property (nonatomic, strong) UIFont *font; -@property (nonatomic, strong) UIFont *boldFont; -@property (nonatomic, strong) UIFont *italicFont; -@property (nonatomic, strong) UIFont *monospaceFont; -@end diff --git a/Chromatism/Chromatism/JLMarkdownTokenizer.m b/Chromatism/Chromatism/JLMarkdownTokenizer.m deleted file mode 100644 index 6e072be..0000000 --- a/Chromatism/Chromatism/JLMarkdownTokenizer.m +++ /dev/null @@ -1,116 +0,0 @@ -// -// JLMarkdownTokenizer.m -// Chromatism -// -// Created by Johannes Lund on 2013-07-13. -// Copyright (c) 2013 Anviking. All rights reserved. -// - -#import "JLMarkdownTokenizer.h" -#import "NSMutableAttributedString+Mush.h" - -@implementation JLMarkdownTokenizer - -- (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range -{ - [NSException raise:@"Chromatism Exception" format:@"%@ cannot handle live syntax highlighting", self.class]; -} - -- (NSMutableAttributedString *)tokenizeString:(NSString *)string withDefaultAttributes:(NSDictionary *)attributes -{ - - NSMutableAttributedString *attributedString = [[NSAttributedString alloc] initWithString:string attributes:attributes].mutableCopy; - - // Get fonts - UIFont *defaultFont = (UIFont *)attributes[NSFontAttributeName]; - UIFontDescriptor *defaultFontDescriptor = [defaultFont fontDescriptor]; - - if (!self.boldFont) - { - UIFontDescriptor *descriptor = [defaultFontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold]; - self.boldFont = [UIFont fontWithDescriptor:descriptor size:descriptor.pointSize]; - } - if (!self.italicFont) - { - UIFontDescriptor *descriptor = [defaultFontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitItalic]; - self.italicFont = [UIFont fontWithDescriptor:descriptor size:descriptor.pointSize]; - } - if (!self.monospaceFont) - { - self.monospaceFont = [UIFont fontWithName:@"Courier" size:defaultFontDescriptor.pointSize]; - } - - - - NSDictionary *boldParser = @{ - @"regex":@"(\\*{2})(.+?)(\\*{2})", - @"replace":@[@"", @1, @""], - @"attributes":@[@{ }, @{ NSFontAttributeName:self.boldFont }, @{ }] - }; - - NSDictionary *italicParser = @{ - @"regex":@"(\\*)(.+?)(\\*)", - @"replace":@[@"", @1, @""], - @"attributes":@[@{ }, @{ NSFontAttributeName:self.italicFont }, @{ }] - }; - - NSDictionary *monospaceParser = @{ - @"regex":@"(`)(.+?)(`)", - @"replace":@[@"", @1, @""], - @"attributes":@[@{ }, @{ NSFontAttributeName:self.monospaceFont, NSBackgroundColorAttributeName : [UIColor colorWithWhite:0 alpha:0.01] }, @{ }] - }; - NSDictionary *linkParser = @{ - @"regex":@"(\\[)([^\\]]+)(\\])(\\()([^\\)]+)(\\))", - @"replace":@[@"", @1, @"", @"", @"" , @""], - }; - - // Links - NSString *markdown = attributedString.string.copy; - NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:linkParser[@"regex"] options:0 error:nil]; - - __block int nudge = 0; - [regex enumerateMatchesInString:markdown options:0 range:(NSRange){0, markdown.length} usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop) { - - NSMutableArray *substrs = @[].mutableCopy; - NSMutableArray *replacements = @[].mutableCopy; - - // fetch match substrings - for (int i = 0; i < match.numberOfRanges - 1; i++) { - NSRange nudged = [match rangeAtIndex:i + 1]; - nudged.location -= nudge; - substrs[i] = [attributedString attributedSubstringFromRange:nudged].mutableCopy; - } - - // make replacement substrings - for (int i = 0; i < match.numberOfRanges - 1; i++) { - NSString *repstr = linkParser[@"replace"][i]; - replacements[i] = [repstr isKindOfClass:NSNumber.class] - ? substrs[repstr.intValue] - : [[NSMutableAttributedString alloc] initWithString:repstr]; - } - - // apply attributes - - NSMutableAttributedString *repl = replacements[1]; - NSLog(@"Link is :%@",substrs[4]); - [repl addAttribute:NSLinkAttributeName value:substrs[2] range:(NSRange){0, repl.length}]; - - // replace - for (int i = 0; i < match.numberOfRanges - 1; i++) { - NSRange nudged = [match rangeAtIndex:i + 1]; - nudged.location -= nudge; - nudge += [substrs[i] length] - [replacements[i] length]; - [attributedString replaceCharactersInRange:nudged - withAttributedString:replacements[i]]; - } - }]; - - [attributedString applyMushDictionary:boldParser]; - [attributedString applyMushDictionary:italicParser]; - [attributedString applyMushDictionary:monospaceParser]; - - return attributedString; -} - - -@end diff --git a/Chromatism/Chromatism/NSMutableAttributedString+Mush.h b/Chromatism/Chromatism/NSMutableAttributedString+Mush.h deleted file mode 100644 index d9673e5..0000000 --- a/Chromatism/Chromatism/NSMutableAttributedString+Mush.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// NSMutableAttributedString+Mush.h -// Chromatism -// -// Created by Johannes Lund on 2013-07-13. -// Copyright (c) 2013 Anviking. All rights reserved. -// - -#import - -@interface NSMutableAttributedString (Mush) - -- (void)applyMushDictionary:(NSDictionary *)parser; - -@end diff --git a/Chromatism/Chromatism/NSMutableAttributedString+Mush.m b/Chromatism/Chromatism/NSMutableAttributedString+Mush.m deleted file mode 100644 index 83b313f..0000000 --- a/Chromatism/Chromatism/NSMutableAttributedString+Mush.m +++ /dev/null @@ -1,68 +0,0 @@ -// -// NSMutableAttributedString+Mush.m -// Chromatism -// -// Created by Johannes Lund on 2013-07-13. -// Copyright (c) 2013 Anviking. All rights reserved. -// - -// Original from sobri909/MGBox2 -// -// Created by matt on 7/11/12. -// -// https://github.com/sobri909/MGBox2/blob/master/MGBox/MGMushParser.m -// -// - -#import "NSMutableAttributedString+Mush.h" - -@implementation NSMutableAttributedString (Mush) - -- (void)applyMushDictionary:(NSDictionary *)parser -{ - id regex = [NSRegularExpression regularExpressionWithPattern:parser[@"regex"] - options:0 error:nil]; - NSString *markdown = self.string.copy; - - __block int nudge = 0; - [regex enumerateMatchesInString:markdown options:0 range:(NSRange){0, markdown.length} usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop) { - - NSMutableArray *substrs = @[].mutableCopy; - NSMutableArray *replacements = @[].mutableCopy; - - // fetch match substrings - for (int i = 0; i < match.numberOfRanges - 1; i++) { - NSRange nudged = [match rangeAtIndex:i + 1]; - nudged.location -= nudge; - substrs[i] = [self attributedSubstringFromRange:nudged].mutableCopy; - } - - // make replacement substrings - for (int i = 0; i < match.numberOfRanges - 1; i++) { - NSString *repstr = parser[@"replace"][i]; - replacements[i] = [repstr isKindOfClass:NSNumber.class] - ? substrs[repstr.intValue] - : [[NSMutableAttributedString alloc] initWithString:repstr]; - } - - // apply attributes - for (int i = 0; i < match.numberOfRanges - 1; i++) { - id attributes = parser[@"attributes"][i]; - if (attributes) { - NSMutableAttributedString *repl = replacements[i]; - [repl addAttributes:attributes range:(NSRange){0, repl.length}]; - } - } - - // replace - for (int i = 0; i < match.numberOfRanges - 1; i++) { - NSRange nudged = [match rangeAtIndex:i + 1]; - nudged.location -= nudge; - nudge += [substrs[i] length] - [replacements[i] length]; - [self replaceCharactersInRange:nudged - withAttributedString:replacements[i]]; - } - }]; -} - -@end From fc679970f7fed38b302a2e6b4ecac4de55ea8f58 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Fri, 4 Oct 2013 09:10:53 +0200 Subject: [PATCH 101/140] Spelling --- Chromatism/Chromatism/JLTokenizer.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index de9e11d..cd5948e 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -218,7 +218,7 @@ - (void)setNeedsValidation:(BOOL)needsValidation { _needsValidation = needsValidation; if (needsValidation) { - [self.validationTimer invalidate]; // This is not neccecary, right? + [self.validationTimer invalidate]; // This is not necessary, right? self.validationTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(validateTokenization) userInfo:nil repeats:NO]; } } From 8ed1aa4e6b96d0e2b2b99c5c946d21e3e3afa056 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Sat, 5 Oct 2013 15:40:30 +0200 Subject: [PATCH 102/140] #16 Removed .textStorage property of JLTokenizer. Validation-things are now commented. --- Chromatism/Chromatism/JLTextView.m | 1 - Chromatism/Chromatism/JLTokenizer.h | 10 +++++----- Chromatism/Chromatism/JLTokenizer.m | 23 +++++++++-------------- 3 files changed, 14 insertions(+), 20 deletions(-) diff --git a/Chromatism/Chromatism/JLTextView.m b/Chromatism/Chromatism/JLTextView.m index 726bcda..4fe03b0 100644 --- a/Chromatism/Chromatism/JLTextView.m +++ b/Chromatism/Chromatism/JLTextView.m @@ -61,7 +61,6 @@ - (void)setup self.textStorage.delegate = self.syntaxTokenizer; self.theme = JLTokenizerThemeDusk; self.syntaxTokenizer.dataSource = self; - self.syntaxTokenizer.textStorage = self.textStorage; // Set default properties self.scrollEnabled = YES; diff --git a/Chromatism/Chromatism/JLTokenizer.h b/Chromatism/Chromatism/JLTokenizer.h index 75a363f..e8f63eb 100644 --- a/Chromatism/Chromatism/JLTokenizer.h +++ b/Chromatism/Chromatism/JLTokenizer.h @@ -18,17 +18,17 @@ @interface JLTokenizer : NSObject - (void)tokenizeTextStorage:(NSTextStorage *)textStorage withRange:(NSRange)range; -- (void)tokenizeWithRange:(NSRange)range; -- (void)tokenize; +- (void)tokenizeTextStorage:(NSTextStorage *)textStorage; -- (void)validateTokenization; +// - (void)validateTokenization; - (void)clearColorAttributesInRange:(NSRange)range textStorage:(NSTextStorage *)storage; - (NSMutableAttributedString *)tokenizeString:(NSString *)string withDefaultAttributes:(NSDictionary *)attributes; @property (nonatomic, strong) NSDictionary *colors; -@property (nonatomic, weak) NSTextStorage *textStorage; -@property (nonatomic, assign) BOOL needsValidation; + +// @property (nonatomic, assign) BOOL needsValidation; + @property (nonatomic, weak) id delegate; @property (nonatomic, weak) id dataSource; @end diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index cd5948e..ff02526 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -132,19 +132,18 @@ - (JLScope *)lineScope - (void)textStorage:(NSTextStorage *)textStorage willProcessEditing:(NSTextStorageEditActions)editedMask range:(NSRange)editedRange changeInLength:(NSInteger)delta { - NSAssert(textStorage == self.textStorage, @"A JLTokenizer should only handle one textStorage"); + } - (void)textStorage:(NSTextStorage *)textStorage didProcessEditing:(NSTextStorageEditActions)editedMask range:(NSRange)editedRange changeInLength:(NSInteger)delta { - NSAssert(textStorage == self.textStorage, @"A JLTokenizer should only handle one textStorage"); _editedRange = editedRange; _editedLineRange = [textStorage.string lineRangeForRange:editedRange]; if (textStorage.editedMask == NSTextStorageEditedAttributes) return; - [self tokenizeWithRange:_editedLineRange]; - [self setNeedsValidation:YES]; + [self tokenizeTextStorage:textStorage withRange:_editedLineRange]; +// [self setNeedsValidation:YES]; } #pragma mark - JLScope delegate @@ -159,7 +158,7 @@ - (void)scope:(JLScope *)scope didChangeIndexesFrom:(NSIndexSet *)oldSet to:(NSI [removedIndexes removeIndexes:newSet]; // Make sure the indexes still excist in the attributedString - removedIndexes = [removedIndexes intersectionWithSet:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, self.textStorage.length)]]; + removedIndexes = [removedIndexes intersectionWithSet:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, scope.textStorage.length)]]; ChromatismLog(@"Removed Indexes:%@",removedIndexes); @@ -190,14 +189,9 @@ - (NSDictionary *)attributesForScope:(JLScope *)scope #pragma mark - Tokenizing -- (void)tokenize +- (void)tokenizeTextStorage:(NSTextStorage *)textStorage { - [self tokenizeTextStorage:self.textStorage withRange:NSMakeRange(0, self.textStorage.length)]; -} - -- (void)tokenizeWithRange:(NSRange)range -{ - [self tokenizeTextStorage:self.textStorage withRange:range]; + [self tokenizeTextStorage:textStorage withRange:NSMakeRange(0, textStorage.length)]; } - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range @@ -214,6 +208,7 @@ - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range #pragma mark - Validation +/* - (void)setNeedsValidation:(BOOL)needsValidation { _needsValidation = needsValidation; @@ -224,7 +219,7 @@ - (void)setNeedsValidation:(BOOL)needsValidation } - (void)validateTokenization -{/* +{ [self.textStorage beginEditing]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ [self tokenize]; @@ -233,8 +228,8 @@ - (void)validateTokenization [self.textStorage endEditing]; }); }); - */ } +*/ - (NSMutableAttributedString *)tokenizeString:(NSString *)string withDefaultAttributes:(NSDictionary *)attributes; { From 1ddfbaa31dcc9c7330797b4264827557c2703e81 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Sat, 5 Oct 2013 15:53:01 +0200 Subject: [PATCH 103/140] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3942944..7adedb8 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,8 @@ Chromatism This is the beginning of a syntax highlighting `UITextView` for iOS. Currently it only knows about Obj-C. Previously Chromatism used a combination of `CoreText` and `UITableView` for performance, but luckily that is not needed anymore. +**Chromatism is currently unstable, changing quickly and without test-coverage.** + ![](http://anviking.com/img/chromatism_black.png) How to add Chromatism to your application: @@ -18,7 +20,6 @@ How to add Chromatism to your application: - `JLScope` has a `NSMutableIndexSet`-property that corresponds to ranges in the textStorage. Scopes can be arranged in a hierarchy. A scope's children is stored in the `subscopes` property, and a scopes parent is simply called its `scope`. A scope can be executed via the `-perform`-method. The method causes subscopes to perform cascadingly. - `JLTokenPattern` is a subclass of `JLScope`. It has a regex-pattern that in `-perform` searches through the ranges of its parent scope. -####However, the project is changing quickly. ## Scopes and Patterns Scopes and patters can ensure that regex patterns search in the right place. To understand how they work, it is helpful to know what happens in the `-perform` method. From 4bdabd57492f3c48a912a1f0d0079c3df69b7baa Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Sat, 5 Oct 2013 16:32:38 +0200 Subject: [PATCH 104/140] Create LICENSE.txt --- LICENSE.txt | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE.txt diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..b331fcf --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,21 @@ + +The MIT License (MIT) + +Copyright (c) [year] [fullname] + +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. From 31d99a62ad45e75b7d328370ca7359c961c4abc1 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Sat, 5 Oct 2013 16:36:02 +0200 Subject: [PATCH 105/140] Update README.md --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7adedb8..1701bfe 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,10 @@ This is the beginning of a syntax highlighting `UITextView` for iOS. Currently i ![](http://anviking.com/img/chromatism_black.png) -How to add Chromatism to your application: +## License +MIT, see [LICENSE.txt](https://github.com/Anviking/Chromatism/blob/master/LICENSE.txt). If you develop Chromatism further, sharing your improvements are encouraged. + +## How to add Chromatism to your application: 1. Drag and drop `Chromatism.xcodeproj` to your project. 2. Add `Chromatism` as a target dependency and link to `libChromatism.a` @@ -30,4 +33,3 @@ Scopes and patters can ensure that regex patterns search in the right place. To For more detail, see the `-perform`-implementation on [`JLScope`](https://github.com/Anviking/Chromatism/blob/master/Chromatism/Chromatism/JLScope.m#65) and [`JLTokenPattern`](https://github.com/Anviking/Chromatism/blob/master/Chromatism/Chromatism/JLTokenPattern.m#56). - From f3575f2ca5e948bb9981b0c669785413175cb68b Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Sat, 5 Oct 2013 16:37:45 +0200 Subject: [PATCH 106/140] =?UTF-8?q?Oh,=20I=20have=20to=20enter=20name=20an?= =?UTF-8?q?d=20year=20too=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LICENSE.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/LICENSE.txt b/LICENSE.txt index b331fcf..bd28954 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,7 +1,6 @@ - The MIT License (MIT) -Copyright (c) [year] [fullname] +Copyright (c) 2013 Johannes Lund 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 From 784f0d7062102f0d682c3b2e2ff62d04ae7559e8 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Sat, 5 Oct 2013 16:49:24 +0200 Subject: [PATCH 107/140] Add MIT License to every file --- Chromatism/Chromatism/Chromatism+Internal.h | 18 +++++++++++++++++- Chromatism/Chromatism/Chromatism.h | 18 +++++++++++++++++- Chromatism/Chromatism/Chromatism.m | 18 +++++++++++++++++- Chromatism/Chromatism/JLScope.h | 18 +++++++++++++++++- Chromatism/Chromatism/JLScope.m | 18 +++++++++++++++++- Chromatism/Chromatism/JLTextView.h | 18 +++++++++++++++++- Chromatism/Chromatism/JLTextView.m | 19 ++++++++++++++++++- Chromatism/Chromatism/JLTextViewController.h | 18 +++++++++++++++++- Chromatism/Chromatism/JLTextViewController.m | 18 +++++++++++++++++- Chromatism/Chromatism/JLTokenPattern.h | 18 +++++++++++++++++- Chromatism/Chromatism/JLTokenPattern.m | 18 +++++++++++++++++- Chromatism/Chromatism/UIColor+Chromatism.h | 18 +++++++++++++++++- Chromatism/Chromatism/UIColor+Chromatism.m | 18 +++++++++++++++++- Chromatism/ChromatismTests/ChromatismTests.m | 18 +++++++++++++++++- Chromatism/ChromatismTests/JLTokenizerTests.m | 18 +++++++++++++++++- ChromatismDemo/ChromatismDemo/AppDelegate.h | 18 +++++++++++++++++- ChromatismDemo/ChromatismDemo/AppDelegate.m | 18 +++++++++++++++++- ChromatismDemo/ChromatismDemo/main.m | 18 +++++++++++++++++- .../ChromatismDemoTests/ChromatismDemoTests.m | 18 +++++++++++++++++- 19 files changed, 324 insertions(+), 19 deletions(-) diff --git a/Chromatism/Chromatism/Chromatism+Internal.h b/Chromatism/Chromatism/Chromatism+Internal.h index e2f9368..8f5e162 100644 --- a/Chromatism/Chromatism/Chromatism+Internal.h +++ b/Chromatism/Chromatism/Chromatism+Internal.h @@ -3,8 +3,24 @@ // Chromatism // // Created by Anviking on 2013-07-31. -// Copyright (c) 2013 Anviking. All rights reserved. +// Copyright (c) 2013 Johannes Lund // +// 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.// #import diff --git a/Chromatism/Chromatism/Chromatism.h b/Chromatism/Chromatism/Chromatism.h index c55bdaa..66342f6 100644 --- a/Chromatism/Chromatism/Chromatism.h +++ b/Chromatism/Chromatism/Chromatism.h @@ -3,8 +3,24 @@ // Chromatism // // Created by Johannes Lund on 2013-07-01. -// Copyright (c) 2013 Anviking. All rights reserved. +// Copyright (c) 2013 Johannes Lund // +// 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.// #import #import "JLScope.h" diff --git a/Chromatism/Chromatism/Chromatism.m b/Chromatism/Chromatism/Chromatism.m index 8b3f43d..ae192a7 100644 --- a/Chromatism/Chromatism/Chromatism.m +++ b/Chromatism/Chromatism/Chromatism.m @@ -3,8 +3,24 @@ // Chromatism // // Created by Johannes Lund on 2013-07-01. -// Copyright (c) 2013 Anviking. All rights reserved. +// Copyright (c) 2013 Johannes Lund // +// 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.// #import "Chromatism+Internal.h" #import "Helpers.h" diff --git a/Chromatism/Chromatism/JLScope.h b/Chromatism/Chromatism/JLScope.h index ebbd131..ce52d6e 100644 --- a/Chromatism/Chromatism/JLScope.h +++ b/Chromatism/Chromatism/JLScope.h @@ -3,8 +3,24 @@ // iGitpad // // Created by Johannes Lund on 2013-06-30. -// Copyright (c) 2013 Anviking. All rights reserved. +// Copyright (c) 2013 Johannes Lund // +// 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.// #import diff --git a/Chromatism/Chromatism/JLScope.m b/Chromatism/Chromatism/JLScope.m index 97a9f69..1a6f1b7 100644 --- a/Chromatism/Chromatism/JLScope.m +++ b/Chromatism/Chromatism/JLScope.m @@ -3,8 +3,24 @@ // iGitpad // // Created by Johannes Lund on 2013-06-30. -// Copyright (c) 2013 Anviking. All rights reserved. +// Copyright (c) 2013 Johannes Lund // +// 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.// #import "JLScope.h" #import "Helpers.h" diff --git a/Chromatism/Chromatism/JLTextView.h b/Chromatism/Chromatism/JLTextView.h index ec7e124..e6b2a8f 100644 --- a/Chromatism/Chromatism/JLTextView.h +++ b/Chromatism/Chromatism/JLTextView.h @@ -3,8 +3,24 @@ // Chromatism // // Created by Johannes Lund on 2013-07-16. -// Copyright (c) 2013 Anviking. All rights reserved. +// Copyright (c) 2013 Johannes Lund // +// 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.// #import #import "Chromatism+Internal.h" diff --git a/Chromatism/Chromatism/JLTextView.m b/Chromatism/Chromatism/JLTextView.m index 4fe03b0..9751a3e 100644 --- a/Chromatism/Chromatism/JLTextView.m +++ b/Chromatism/Chromatism/JLTextView.m @@ -3,8 +3,25 @@ // Chromatism // // Created by Johannes Lund on 2013-07-16. -// Copyright (c) 2013 Anviking. All rights reserved. // +// Copyright (c) 2013 Johannes Lund +// +// 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. #import "JLTextView.h" #import "Chromatism.h" diff --git a/Chromatism/Chromatism/JLTextViewController.h b/Chromatism/Chromatism/JLTextViewController.h index 3cb9f5b..3fc1b82 100644 --- a/Chromatism/Chromatism/JLTextViewController.h +++ b/Chromatism/Chromatism/JLTextViewController.h @@ -3,8 +3,24 @@ // iGitpad // // Created by Johannes Lund on 2013-06-13. -// Copyright (c) 2013 Anviking. All rights reserved. +// Copyright (c) 2013 Johannes Lund // +// 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.// #import diff --git a/Chromatism/Chromatism/JLTextViewController.m b/Chromatism/Chromatism/JLTextViewController.m index ddfd1be..abacff9 100644 --- a/Chromatism/Chromatism/JLTextViewController.m +++ b/Chromatism/Chromatism/JLTextViewController.m @@ -3,8 +3,24 @@ // iGitpad // // Created by Johannes Lund on 2013-06-13. -// Copyright (c) 2013 Anviking. All rights reserved. +// Copyright (c) 2013 Johannes Lund // +// 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.// #import "JLTextViewController.h" #import "JLTokenizer.h" diff --git a/Chromatism/Chromatism/JLTokenPattern.h b/Chromatism/Chromatism/JLTokenPattern.h index 5840a1f..c6f3bb1 100644 --- a/Chromatism/Chromatism/JLTokenPattern.h +++ b/Chromatism/Chromatism/JLTokenPattern.h @@ -3,8 +3,24 @@ // iGitpad // // Created by Johannes Lund on 2013-06-30. -// Copyright (c) 2013 Anviking. All rights reserved. +// Copyright (c) 2013 Johannes Lund // +// 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.// #import "JLScope.h" diff --git a/Chromatism/Chromatism/JLTokenPattern.m b/Chromatism/Chromatism/JLTokenPattern.m index af17905..2d9fbf6 100644 --- a/Chromatism/Chromatism/JLTokenPattern.m +++ b/Chromatism/Chromatism/JLTokenPattern.m @@ -3,8 +3,24 @@ // iGitpad // // Created by Johannes Lund on 2013-06-30. -// Copyright (c) 2013 Anviking. All rights reserved. +// Copyright (c) 2013 Johannes Lund // +// 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.// #import "JLTokenPattern.h" #import "Helpers.h" diff --git a/Chromatism/Chromatism/UIColor+Chromatism.h b/Chromatism/Chromatism/UIColor+Chromatism.h index 82e5d81..e67e335 100644 --- a/Chromatism/Chromatism/UIColor+Chromatism.h +++ b/Chromatism/Chromatism/UIColor+Chromatism.h @@ -3,8 +3,24 @@ // Chromatism // // Created by Johannes Lund on 2013-08-20. -// Copyright (c) 2013 Anviking. All rights reserved. +// Copyright (c) 2013 Johannes Lund // +// 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.// #import diff --git a/Chromatism/Chromatism/UIColor+Chromatism.m b/Chromatism/Chromatism/UIColor+Chromatism.m index c100740..52022cb 100644 --- a/Chromatism/Chromatism/UIColor+Chromatism.m +++ b/Chromatism/Chromatism/UIColor+Chromatism.m @@ -3,8 +3,24 @@ // Chromatism // // Created by Johannes Lund on 2013-08-20. -// Copyright (c) 2013 Anviking. All rights reserved. +// Copyright (c) 2013 Johannes Lund // +// 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.// #import "UIColor+Chromatism.h" diff --git a/Chromatism/ChromatismTests/ChromatismTests.m b/Chromatism/ChromatismTests/ChromatismTests.m index 367bc71..0045758 100644 --- a/Chromatism/ChromatismTests/ChromatismTests.m +++ b/Chromatism/ChromatismTests/ChromatismTests.m @@ -3,8 +3,24 @@ // ChromatismTests // // Created by Johannes Lund on 2013-07-01. -// Copyright (c) 2013 Anviking. All rights reserved. +// Copyright (c) 2013 Johannes Lund // +// 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.// #import #import "Chromatism.h" diff --git a/Chromatism/ChromatismTests/JLTokenizerTests.m b/Chromatism/ChromatismTests/JLTokenizerTests.m index 3fd5ea8..59fdf9c 100644 --- a/Chromatism/ChromatismTests/JLTokenizerTests.m +++ b/Chromatism/ChromatismTests/JLTokenizerTests.m @@ -3,8 +3,24 @@ // Chromatism // // Created by Anviking on 2013-07-31. -// Copyright (c) 2013 Anviking. All rights reserved. +// Copyright (c) 2013 Johannes Lund // +// 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.// #import #import "Chromatism.h" diff --git a/ChromatismDemo/ChromatismDemo/AppDelegate.h b/ChromatismDemo/ChromatismDemo/AppDelegate.h index 94b951c..dcc918d 100644 --- a/ChromatismDemo/ChromatismDemo/AppDelegate.h +++ b/ChromatismDemo/ChromatismDemo/AppDelegate.h @@ -3,8 +3,24 @@ // ChromatismDemo // // Created by Anviking on 2013-07-31. -// Copyright (c) 2013 Anviking. All rights reserved. +// Copyright (c) 2013 Johannes Lund // +// 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.// #import diff --git a/ChromatismDemo/ChromatismDemo/AppDelegate.m b/ChromatismDemo/ChromatismDemo/AppDelegate.m index 3d06b1d..ac354dd 100644 --- a/ChromatismDemo/ChromatismDemo/AppDelegate.m +++ b/ChromatismDemo/ChromatismDemo/AppDelegate.m @@ -3,8 +3,24 @@ // ChromatismDemo // // Created by Anviking on 2013-07-31. -// Copyright (c) 2013 Anviking. All rights reserved. +// Copyright (c) 2013 Johannes Lund // +// 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.// #import "AppDelegate.h" #import diff --git a/ChromatismDemo/ChromatismDemo/main.m b/ChromatismDemo/ChromatismDemo/main.m index cc23e52..526290a 100644 --- a/ChromatismDemo/ChromatismDemo/main.m +++ b/ChromatismDemo/ChromatismDemo/main.m @@ -3,8 +3,24 @@ // ChromatismDemo // // Created by Anviking on 2013-07-31. -// Copyright (c) 2013 Anviking. All rights reserved. +// Copyright (c) 2013 Johannes Lund // +// 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.// #import diff --git a/ChromatismDemo/ChromatismDemoTests/ChromatismDemoTests.m b/ChromatismDemo/ChromatismDemoTests/ChromatismDemoTests.m index 2c83f14..0ab6965 100644 --- a/ChromatismDemo/ChromatismDemoTests/ChromatismDemoTests.m +++ b/ChromatismDemo/ChromatismDemoTests/ChromatismDemoTests.m @@ -3,8 +3,24 @@ // ChromatismDemoTests // // Created by Anviking on 2013-07-31. -// Copyright (c) 2013 Anviking. All rights reserved. +// Copyright (c) 2013 Johannes Lund // +// 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.// #import From 6642186f5fae1a6322c5c66d253c760b061cd12f Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Sat, 5 Oct 2013 21:26:24 +0200 Subject: [PATCH 108/140] #9 Almost --- Chromatism/Chromatism/JLTextViewController.m | 23 +++++++++++++++----- ChromatismDemo/ChromatismDemo/AppDelegate.m | 1 + 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/Chromatism/Chromatism/JLTextViewController.m b/Chromatism/Chromatism/JLTextViewController.m index abacff9..2f77cc5 100644 --- a/Chromatism/Chromatism/JLTextViewController.m +++ b/Chromatism/Chromatism/JLTextViewController.m @@ -107,20 +107,33 @@ - (void)keyboardWasShown:(NSNotification *)notification UIScrollView *scrollView = self.textView; CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; - UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0); + UIEdgeInsets contentInsets = scrollView.contentInset; + contentInsets.bottom = kbSize.height; scrollView.contentInset = contentInsets; scrollView.scrollIndicatorInsets = contentInsets; - //CGPoint caretPosition = [self.textView caretRectForPosition:self.textView.selectedTextRange.start].origin; - //CGRect caretRect = CGRectMake(caretPosition.x, caretPosition.y, 1, 1); - //[self.textView scrollRectToVisible:caretRect animated:YES]; + CGPoint point = [self.textView caretRectForPosition:self.textView.selectedTextRange.start].origin; + point.y = MIN(point.y, self.textView.frame.size.height - kbSize.height); + + CGRect aRect = self.view.frame; + aRect.size.height -= kbSize.height; + if (!CGRectContainsPoint(aRect, point) ) { + + CGRect rect = CGRectMake(point.x, point.y, 1, 1); + rect.size.height = kbSize.height; + rect.origin.y += kbSize.height; + [self.textView scrollRectToVisible:rect animated:YES]; + } } // Called when the UIKeyboardWillHideNotification is sent - (void)keyboardWillBeHidden:(NSNotification *)notification { UIScrollView *scrollView = self.textView; - UIEdgeInsets contentInsets = UIEdgeInsetsZero; + UIEdgeInsets contentInsets = scrollView.contentInset; + contentInsets.bottom = 0; + scrollView.contentInset = contentInsets; + scrollView.scrollIndicatorInsets = contentInsets; scrollView.contentInset = contentInsets; scrollView.scrollIndicatorInsets = contentInsets; } diff --git a/ChromatismDemo/ChromatismDemo/AppDelegate.m b/ChromatismDemo/ChromatismDemo/AppDelegate.m index ac354dd..3c276d4 100644 --- a/ChromatismDemo/ChromatismDemo/AppDelegate.m +++ b/ChromatismDemo/ChromatismDemo/AppDelegate.m @@ -36,6 +36,7 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( NSString *string = [[NSString alloc] initWithData:[NSData dataWithContentsOfURL:URL] encoding:NSUTF8StringEncoding]; JLTextViewController *viewController = [[JLTextViewController alloc] initWithText:string]; + viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Resign" style:UIBarButtonItemStylePlain target:viewController.textView action:@selector(resignFirstResponder)]; UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController]; viewController.title = @"Chromatism"; From 511e7acc91224c9f9ea6e1bb155ce6c84333317c Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Tue, 29 Oct 2013 21:54:33 +0100 Subject: [PATCH 109/140] View Diffs --- ChromatismDemo/ChromatismDemo.xcodeproj/project.pbxproj | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/ChromatismDemo/ChromatismDemo.xcodeproj/project.pbxproj b/ChromatismDemo/ChromatismDemo.xcodeproj/project.pbxproj index 408bb50..36000b9 100644 --- a/ChromatismDemo/ChromatismDemo.xcodeproj/project.pbxproj +++ b/ChromatismDemo/ChromatismDemo.xcodeproj/project.pbxproj @@ -229,6 +229,9 @@ LastUpgradeCheck = 0500; ORGANIZATIONNAME = Anviking; TargetAttributes = { + 3260A15F17A88BA9008792E6 = { + DevelopmentTeam = XU2559U3TH; + }; 3260A17A17A88BA9008792E6 = { TestTargetID = 3260A15F17A88BA9008792E6; }; @@ -424,12 +427,15 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "ChromatismDemo/ChromatismDemo-Prefix.pch"; HEADER_SEARCH_PATHS = "\"$(BUILT_PRODUCTS_DIR)/../../Headers\""; INFOPLIST_FILE = "ChromatismDemo/ChromatismDemo-Info.plist"; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; WRAPPER_EXTENSION = app; }; name = Debug; @@ -439,12 +445,15 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "ChromatismDemo/ChromatismDemo-Prefix.pch"; HEADER_SEARCH_PATHS = "\"$(BUILT_PRODUCTS_DIR)/../../Headers\""; INFOPLIST_FILE = "ChromatismDemo/ChromatismDemo-Info.plist"; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; WRAPPER_EXTENSION = app; }; name = Release; From 4ce4edf02e4bf8900a66916f8531e89d9cd48225 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Sat, 2 Nov 2013 11:23:47 +0100 Subject: [PATCH 110/140] Added a simple DiffTokenizer --- .../Chromatism.xcodeproj/project.pbxproj | 8 ++++ Chromatism/Chromatism/Chromatism+Internal.h | 5 ++ Chromatism/Chromatism/Chromatism.h | 1 + Chromatism/Chromatism/Chromatism.m | 17 +++++-- Chromatism/Chromatism/JLDiffTokenizer.h | 14 ++++++ Chromatism/Chromatism/JLDiffTokenizer.m | 47 +++++++++++++++++++ Chromatism/Chromatism/JLTokenizer.h | 2 +- Chromatism/Chromatism/JLTokenizer.m | 4 +- 8 files changed, 92 insertions(+), 6 deletions(-) create mode 100644 Chromatism/Chromatism/JLDiffTokenizer.h create mode 100644 Chromatism/Chromatism/JLDiffTokenizer.m diff --git a/Chromatism/Chromatism.xcodeproj/project.pbxproj b/Chromatism/Chromatism.xcodeproj/project.pbxproj index 83cde2d..d68c030 100644 --- a/Chromatism/Chromatism.xcodeproj/project.pbxproj +++ b/Chromatism/Chromatism.xcodeproj/project.pbxproj @@ -31,6 +31,8 @@ 8F54EF221781CD87008C1609 /* JLTextViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F3AB9541781C1250023348A /* JLTextViewController.m */; }; 8F54EF231781CD87008C1609 /* JLTokenizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F3AB9561781C1250023348A /* JLTokenizer.m */; }; 8F54EF241781CD87008C1609 /* JLTokenPattern.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F3AB9581781C1250023348A /* JLTokenPattern.m */; }; + 8F9F6BC81822F09D00DE15A8 /* JLDiffTokenizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F9F6BC61822F09D00DE15A8 /* JLDiffTokenizer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8F9F6BC91822F09D00DE15A8 /* JLDiffTokenizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F9F6BC71822F09D00DE15A8 /* JLDiffTokenizer.m */; }; 8FA0CB0F1795F41B00FF8EB1 /* JLTextView.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FA0CB0D1795F41B00FF8EB1 /* JLTextView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8FA0CB101795F41B00FF8EB1 /* JLTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FA0CB0E1795F41B00FF8EB1 /* JLTextView.m */; }; 8FE2796517C3842900DD933A /* UIColor+Chromatism.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FE2796317C3842900DD933A /* UIColor+Chromatism.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -75,6 +77,8 @@ 8F3AB9581781C1250023348A /* JLTokenPattern.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JLTokenPattern.m; sourceTree = ""; }; 8F3AB95F1781C12F0023348A /* test.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = test.json; sourceTree = ""; }; 8F3AB9611781C26A0023348A /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + 8F9F6BC61822F09D00DE15A8 /* JLDiffTokenizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JLDiffTokenizer.h; path = ../../../Chromatism/Chromatism/Chromatism/JLDiffTokenizer.h; sourceTree = ""; }; + 8F9F6BC71822F09D00DE15A8 /* JLDiffTokenizer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = JLDiffTokenizer.m; path = ../../../Chromatism/Chromatism/Chromatism/JLDiffTokenizer.m; sourceTree = ""; }; 8FA0CB0D1795F41B00FF8EB1 /* JLTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JLTextView.h; sourceTree = ""; }; 8FA0CB0E1795F41B00FF8EB1 /* JLTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JLTextView.m; sourceTree = ""; }; 8FE2796317C3842900DD933A /* UIColor+Chromatism.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIColor+Chromatism.h"; sourceTree = ""; }; @@ -142,6 +146,8 @@ 8F3AB9221781C0BA0023348A /* Chromatism.m */, 8F3AB9551781C1250023348A /* JLTokenizer.h */, 8F3AB9561781C1250023348A /* JLTokenizer.m */, + 8F9F6BC61822F09D00DE15A8 /* JLDiffTokenizer.h */, + 8F9F6BC71822F09D00DE15A8 /* JLDiffTokenizer.m */, 8F3AB9531781C1250023348A /* JLTextViewController.h */, 8F3AB9541781C1250023348A /* JLTextViewController.m */, 8FA0CB0D1795F41B00FF8EB1 /* JLTextView.h */, @@ -197,6 +203,7 @@ buildActionMask = 2147483647; files = ( 32102EE117A948F900CFA161 /* Chromatism+Internal.h in Headers */, + 8F9F6BC81822F09D00DE15A8 /* JLDiffTokenizer.h in Headers */, 8FA0CB0F1795F41B00FF8EB1 /* JLTextView.h in Headers */, 8F54EF0E1781C776008C1609 /* Chromatism.h in Headers */, 8F54EF101781C788008C1609 /* Helpers.h in Headers */, @@ -292,6 +299,7 @@ buildActionMask = 2147483647; files = ( 8F54EF241781CD87008C1609 /* JLTokenPattern.m in Sources */, + 8F9F6BC91822F09D00DE15A8 /* JLDiffTokenizer.m in Sources */, 8F54EF201781CD87008C1609 /* JLScope.m in Sources */, 8FE2796617C3842900DD933A /* UIColor+Chromatism.m in Sources */, 8FA0CB101795F41B00FF8EB1 /* JLTextView.m in Sources */, diff --git a/Chromatism/Chromatism/Chromatism+Internal.h b/Chromatism/Chromatism/Chromatism+Internal.h index 8f5e162..f9a0860 100644 --- a/Chromatism/Chromatism/Chromatism+Internal.h +++ b/Chromatism/Chromatism/Chromatism+Internal.h @@ -49,6 +49,11 @@ FOUNDATION_EXPORT NSString *const JLTokenTypeURL; FOUNDATION_EXPORT NSString *const JLTokenTypeOther; FOUNDATION_EXPORT NSString *const JLTokenTypeOtherClassNames; FOUNDATION_EXPORT NSString *const JLTokenTypeOtherMethodNames; +FOUNDATION_EXPORT NSString *const JLTokenTypeDiffAddition; +FOUNDATION_EXPORT NSString *const JLTokenTypeDiffDeletion; + +/// Used as attribute in NSAttributedStrings. You may subclass NSLayoutManager to use this attribute. +FOUNDATION_EXPORT NSString *const JLDiffColorAttributeName; /** * In addition to being the name of the library, the Chromatism class handles colors and TokenTypes diff --git a/Chromatism/Chromatism/Chromatism.h b/Chromatism/Chromatism/Chromatism.h index 66342f6..d02fa77 100644 --- a/Chromatism/Chromatism/Chromatism.h +++ b/Chromatism/Chromatism/Chromatism.h @@ -29,4 +29,5 @@ #import "JLTokenPattern.h" #import "JLTextView.h" #import "UIColor+Chromatism.h" +#import "JLDiffTokenizer.h" #import "Chromatism+Internal.h" \ No newline at end of file diff --git a/Chromatism/Chromatism/Chromatism.m b/Chromatism/Chromatism/Chromatism.m index ae192a7..ddfa848 100644 --- a/Chromatism/Chromatism/Chromatism.m +++ b/Chromatism/Chromatism/Chromatism.m @@ -42,6 +42,12 @@ NSString *const JLTokenTypeOtherMethodNames = @"other_method_names"; NSString *const JLTokenTypeOtherClassNames = @"other_class_names"; +NSString *const JLTokenTypeDiffAddition = @"diff_addition"; +NSString *const JLTokenTypeDiffDeletion = @"diff_deletion"; + +NSString *const JLDiffColorAttributeName = @"diff_color_attribute_name"; + + @implementation Chromatism + (NSDictionary *)colorsForTheme:(JLTokenizerTheme)theme @@ -62,9 +68,10 @@ + (NSDictionary *)colorsForTheme:(JLTokenizerTheme)theme JLTokenTypeURL: [UIColor colorWithRed:21.0/255 green:67.0/255 blue:244.0/255 alpha:1], JLTokenTypeOther: [UIColor colorWithRed:113.0/255 green:65.0/255 blue:163.0/255 alpha:1], JLTokenTypeOtherMethodNames : [UIColor colorWithHex:@"7040a6" alpha:1], - JLTokenTypeOtherClassNames : [UIColor colorWithHex:@"7040a6" alpha:1] - + JLTokenTypeOtherClassNames : [UIColor colorWithHex:@"7040a6" alpha:1], + JLTokenTypeDiffAddition : [UIColor greenColor], + JLTokenTypeDiffDeletion : [UIColor redColor] }; break; @@ -82,7 +89,11 @@ + (NSDictionary *)colorsForTheme:(JLTokenizerTheme)theme JLTokenTypeURL: [UIColor colorWithRed:35.0/255 green:63.0/255 blue:208.0/255 alpha:1], JLTokenTypeOther: [UIColor colorWithRed:0.0/255 green:175.0/255 blue:199.0/255 alpha:1], JLTokenTypeOtherClassNames : [UIColor colorWithHex:@"04afc8" alpha:1], - JLTokenTypeOtherMethodNames : [UIColor colorWithHex:@"04afc8" alpha:1] + JLTokenTypeOtherMethodNames : [UIColor colorWithHex:@"04afc8" alpha:1], + + JLTokenTypeDiffAddition : [UIColor greenColor], + JLTokenTypeDiffDeletion : [UIColor redColor] + }; break; } diff --git a/Chromatism/Chromatism/JLDiffTokenizer.h b/Chromatism/Chromatism/JLDiffTokenizer.h new file mode 100644 index 0000000..12c2fe8 --- /dev/null +++ b/Chromatism/Chromatism/JLDiffTokenizer.h @@ -0,0 +1,14 @@ +// +// JLDiffTokenizer.h +// Chromatism +// +// Created by Johannes Lund on 2013-10-31. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import + +/// Very unsure about the idea of this class +@interface JLDiffTokenizer : JLTokenizer + +@end diff --git a/Chromatism/Chromatism/JLDiffTokenizer.m b/Chromatism/Chromatism/JLDiffTokenizer.m new file mode 100644 index 0000000..716772a --- /dev/null +++ b/Chromatism/Chromatism/JLDiffTokenizer.m @@ -0,0 +1,47 @@ +// +// JLDiffTokenizer.m +// Chromatism +// +// Created by Johannes Lund on 2013-10-31. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import "JLDiffTokenizer.h" + +@implementation JLDiffTokenizer + ++ (NSMutableAttributedString *)tokenizeString:(NSString *)string withDefaultAttributes:(NSDictionary *)attributes +{ + NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:string attributes:attributes]; + + NSRegularExpression *additionExpresssion = [[NSRegularExpression alloc] initWithPattern:@"^\\+.*?\\n" options:NSRegularExpressionAnchorsMatchLines | NSRegularExpressionDotMatchesLineSeparators error:NULL]; + NSRegularExpression *deletionExpression = [[NSRegularExpression alloc] initWithPattern:@"^-.*?\\n" options:NSRegularExpressionAnchorsMatchLines | NSRegularExpressionDotMatchesLineSeparators error:NULL]; + + NSUInteger removedCharacters = 0; + + UIColor *additionColor = attributes[JLTokenTypeDiffAddition]; + UIColor *deletionColor = attributes[JLTokenTypeDiffDeletion]; + + tokenizeStringWithExpression(additionExpresssion, string, attributedString, &removedCharacters, additionColor); + tokenizeStringWithExpression(deletionExpression, string, attributedString, &removedCharacters, deletionColor); + + return attributedString; +} + +void tokenizeStringWithExpression(NSRegularExpression *expression, NSString *string, NSMutableAttributedString *attributedString, NSUInteger *removedCharacters, UIColor *color) +{ + __block NSUInteger integer = *removedCharacters; + NSRange range = NSMakeRange(0, string.length); + [expression enumerateMatchesInString:string options:0 range:range usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { + NSUInteger location = result.range.location - integer; + NSRange lineRange = NSMakeRange(location, result.range.length); + NSRange tokenRange = NSMakeRange(location, 1); + + [attributedString addAttribute:JLDiffColorAttributeName value:color range:lineRange]; + [attributedString deleteCharactersInRange:tokenRange]; + integer++; + }]; + *removedCharacters = integer; +} + +@end diff --git a/Chromatism/Chromatism/JLTokenizer.h b/Chromatism/Chromatism/JLTokenizer.h index e8f63eb..3635a6a 100644 --- a/Chromatism/Chromatism/JLTokenizer.h +++ b/Chromatism/Chromatism/JLTokenizer.h @@ -23,7 +23,7 @@ // - (void)validateTokenization; - (void)clearColorAttributesInRange:(NSRange)range textStorage:(NSTextStorage *)storage; -- (NSMutableAttributedString *)tokenizeString:(NSString *)string withDefaultAttributes:(NSDictionary *)attributes; ++ (NSMutableAttributedString *)tokenizeString:(NSString *)string withDefaultAttributes:(NSDictionary *)attributes; @property (nonatomic, strong) NSDictionary *colors; diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index ff02526..dbaaa33 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -231,10 +231,10 @@ - (void)validateTokenization } */ -- (NSMutableAttributedString *)tokenizeString:(NSString *)string withDefaultAttributes:(NSDictionary *)attributes; ++ (NSMutableAttributedString *)tokenizeString:(NSString *)string withDefaultAttributes:(NSDictionary *)attributes; { NSMutableAttributedString *attributedString = [[NSAttributedString alloc] initWithString:string attributes:attributes].mutableCopy; - [self tokenizeTextStorage:(NSTextStorage *)attributedString withRange:NSMakeRange(0, string.length)]; + [[[self alloc] init] tokenizeTextStorage:(NSTextStorage *)attributedString withRange:NSMakeRange(0, string.length)]; return attributedString; } From f73fa2bf416ccf98e0b3c777875723c599fc6006 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Mon, 11 Nov 2013 00:31:44 +0100 Subject: [PATCH 111/140] #12 Up and down arrow on bluetooth keyboard (I only tested in simulator with MacBook keyboard) --- Chromatism/Chromatism/JLTextView.m | 66 ++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/Chromatism/Chromatism/JLTextView.m b/Chromatism/Chromatism/JLTextView.m index 9751a3e..d831fee 100644 --- a/Chromatism/Chromatism/JLTextView.m +++ b/Chromatism/Chromatism/JLTextView.m @@ -159,6 +159,72 @@ - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range r return YES; } +// http://stackoverflow.com/questions/19235762/how-can-i-support-the-up-and-down-arrow-keys-with-a-bluetooth-keyboard-under-ios + +#pragma mark - Bluethooth Keyboard Extension + +- (NSArray *)keyCommands { + UIKeyCommand *upArrow = [UIKeyCommand keyCommandWithInput: UIKeyInputUpArrow modifierFlags: 0 action: @selector(upArrow:)]; + UIKeyCommand *downArrow = [UIKeyCommand keyCommandWithInput: UIKeyInputDownArrow modifierFlags: 0 action: @selector(downArrow:)]; + return [[NSArray alloc] initWithObjects: upArrow, downArrow, nil]; +} + +- (void)upArrow:(UIKeyCommand *)keyCommand { + UITextRange *range = self.selectedTextRange; + if (range != nil) { + float lineHeight = self.font.lineHeight; + + CGRect caret = [self firstRectForRange: range]; + if (isinf(caret.origin.y)) { + // Work-around for a bug in iOS 7 that returns bogus values when the caret is at the start of a line. + range = [self textRangeFromPosition: range.start toPosition: [self positionFromPosition: range.start offset: 1]]; + caret = [self firstRectForRange: range]; + caret.origin.y = caret.origin.y + lineHeight; + } + caret.origin.y = caret.origin.y - lineHeight < 0 ? 0 : caret.origin.y - lineHeight; + caret.size.width = 1; + UITextPosition *position = [self closestPositionToPoint: caret.origin]; + self.selectedTextRange = [self textRangeFromPosition: position toPosition: position]; + + caret = [self firstRectForRange: self.selectedTextRange]; + if (isinf(caret.origin.y)) { + // Work-around for a bug in iOS 7 that occurs when the range is set to a position past the end of the last character + // on a line. + NSRange range = {0, 0}; + range.location = [self offsetFromPosition: self.beginningOfDocument toPosition: position]; + self.selectedRange = range; + } + } +} + +- (void)downArrow:(UIKeyCommand *)keyCommand { + UITextRange *range = self.selectedTextRange; + if (range != nil) { + float lineHeight = self.font.lineHeight; + + CGRect caret = [self firstRectForRange: range]; + if (isinf(caret.origin.y)) { + // Work-around for a bug in iOS 7 that returns bogus values when the caret is at the start of a line. + range = [self textRangeFromPosition: range.start toPosition: [self positionFromPosition: range.start offset: 1]]; + caret = [self firstRectForRange: range]; + caret.origin.y = caret.origin.y + lineHeight; + } + caret.origin.y = caret.origin.y + lineHeight < 0 ? 0 : caret.origin.y + lineHeight; + caret.size.width = 1; + UITextPosition *position = [self closestPositionToPoint: caret.origin]; + self.selectedTextRange = [self textRangeFromPosition: position toPosition: position]; + + caret = [self firstRectForRange: self.selectedTextRange]; + if (isinf(caret.origin.y)) { + // Work-around for a bug in iOS 7 that occurs when the range is set to a position past the end of the last character + // on a line. + NSRange range = {0, 0}; + range.location = [self offsetFromPosition: self.beginningOfDocument toPosition: position]; + self.selectedRange = range; + } + } +} + #pragma mark - Helpers - (UITextRange *)rangeWithRange:(NSRange)range From a344b22eacc490c2487596668f3b260a76449c5f Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Tue, 12 Nov 2013 20:42:33 +0100 Subject: [PATCH 112/140] NSLayoutManagerDelegate and UITextViewDelegate moved from JLTextView to JLTokenizer --- Chromatism/Chromatism/JLTextView.h | 2 +- Chromatism/Chromatism/JLTextView.m | 101 ++-------------------------- Chromatism/Chromatism/JLTokenizer.h | 12 +--- Chromatism/Chromatism/JLTokenizer.m | 89 +++++++++++++++++++++++- 4 files changed, 93 insertions(+), 111 deletions(-) diff --git a/Chromatism/Chromatism/JLTextView.h b/Chromatism/Chromatism/JLTextView.h index e6b2a8f..e11b3cb 100644 --- a/Chromatism/Chromatism/JLTextView.h +++ b/Chromatism/Chromatism/JLTextView.h @@ -28,7 +28,7 @@ @class JLTokenizer; -@interface JLTextView : UITextView +@interface JLTextView : UITextView @property (nonatomic, strong) JLTokenizer *syntaxTokenizer; @property (nonatomic, assign) JLTokenizerTheme theme; diff --git a/Chromatism/Chromatism/JLTextView.m b/Chromatism/Chromatism/JLTextView.m index d831fee..51a5cda 100644 --- a/Chromatism/Chromatism/JLTextView.m +++ b/Chromatism/Chromatism/JLTextView.m @@ -27,10 +27,6 @@ #import "Chromatism.h" @implementation JLTextView -{ - NSString *_oldString; -} - @synthesize theme = _theme; #pragma mark - Initialization & Setup @@ -77,7 +73,10 @@ - (void)setup self.syntaxTokenizer = [[JLTokenizer alloc] init]; self.textStorage.delegate = self.syntaxTokenizer; self.theme = JLTokenizerThemeDusk; - self.syntaxTokenizer.dataSource = self; + + // Delegates + self.layoutManager.delegate = self.syntaxTokenizer; + self.delegate = self.syntaxTokenizer; // Set default properties self.scrollEnabled = YES; @@ -86,9 +85,6 @@ - (void)setup self.autocorrectionType = UITextAutocorrectionTypeNo; self.autocapitalizationType = UITextAutocapitalizationTypeNone; - // Setup delegates - self.delegate = self; - self.layoutManager.delegate = self; } #pragma mark - Color Themes @@ -113,52 +109,6 @@ - (JLTokenizerTheme)theme return _theme; } -#pragma mark - UITextViewDelegate - -- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text -{ - _oldString = nil; - - if (range.length == 0 && text.length == 1) { - // A normal character typed - } - else if (range.length == 1 && text.length == 0) { - // Backspace - } - else { - // Multicharacter edit - } - - if ([text isEqualToString:@"\n"]) { - // Return - // Start the new line with as many tabs or white spaces as the previous one. - - NSString *prefixString = [@"\n" stringByAppendingString:[self prefixStringFromRange:range]]; - - NSString *lastCharacter = [textView.text substringWithRange:NSMakeRange(range.location - 1, 1)]; - if ([lastCharacter isEqualToString:@"{"]) { - - prefixString = [prefixString stringByAppendingString:@" "]; - } else if ([lastCharacter isEqualToString:@"}"]) { - if ([[prefixString substringFromIndex:prefixString.length - 4] isEqualToString:@" "]) { - prefixString = [prefixString substringToIndex:prefixString.length - 4]; - } - else if ([[prefixString substringFromIndex:prefixString.length - 1] isEqualToString:@"\t"]) { - prefixString = [prefixString substringToIndex:prefixString.length - 1]; - } - } - [textView replaceRange:[self rangeWithRange:range] withText:prefixString]; - return NO; - } - - if (range.length > 0) { - _oldString = [textView.text substringWithRange:range]; - } - else _oldString = @""; - - return YES; -} - // http://stackoverflow.com/questions/19235762/how-can-i-support-the-up-and-down-arrow-keys-with-a-bluetooth-keyboard-under-ios #pragma mark - Bluethooth Keyboard Extension @@ -224,47 +174,4 @@ - (void)downArrow:(UIKeyCommand *)keyCommand { } } } - -#pragma mark - Helpers - -- (UITextRange *)rangeWithRange:(NSRange)range -{ - UITextPosition *beginning = self.beginningOfDocument; - UITextPosition *start = [self positionFromPosition:beginning offset:range.location]; - UITextPosition *stop = [self positionFromPosition:start offset:range.length]; - - return [self textRangeFromPosition:start toPosition:stop]; -} - -- (NSString *)prefixStringFromRange:(NSRange)range -{ - NSRange lineRange = [self.text lineRangeForRange:range]; - NSRange prefixRange = [self.text rangeOfString:@"[\\t| ]*" options:NSRegularExpressionSearch range:lineRange]; - return [self.text substringWithRange:prefixRange]; -} - -#pragma mark - JLTokenizer data source - -- (NSString *)recentlyReplacedText -{ - return _oldString; -} - -#pragma mark - NSLayoutManager delegeate -/* - * TODO: Find out a way to set intendation for entire paragraphs. - */ - -- (CGFloat)layoutManager:(NSLayoutManager *)layoutManager paragraphSpacingBeforeGlyphAtIndex:(NSUInteger)glyphIndex withProposedLineFragmentRect:(CGRect)rect -{ - return 0; -} - -- (BOOL)layoutManager:(NSLayoutManager *)layoutManager shouldBreakLineByWordBeforeCharacterAtIndex:(NSUInteger)charIndex -{ - NSString *character = [layoutManager.textStorage.string substringWithRange:NSMakeRange(charIndex, 1)]; - // NSLog(@"Asked about linebreak: %@",character); - if ([character isEqualToString:@"*"]) return NO; - return YES; -} @end diff --git a/Chromatism/Chromatism/JLTokenizer.h b/Chromatism/Chromatism/JLTokenizer.h index 3635a6a..f9bb526 100644 --- a/Chromatism/Chromatism/JLTokenizer.h +++ b/Chromatism/Chromatism/JLTokenizer.h @@ -13,9 +13,9 @@ @class TextViewChange, JLTextView; -@protocol JLTokenizerDelegate, JLTokenizerDataSource; +@protocol JLTokenizerDelegate; -@interface JLTokenizer : NSObject +@interface JLTokenizer : NSObject - (void)tokenizeTextStorage:(NSTextStorage *)textStorage withRange:(NSRange)range; - (void)tokenizeTextStorage:(NSTextStorage *)textStorage; @@ -30,14 +30,6 @@ // @property (nonatomic, assign) BOOL needsValidation; @property (nonatomic, weak) id delegate; -@property (nonatomic, weak) id dataSource; -@end - -@protocol JLTokenizerDataSource - -/// Return the text that was replaced in the most recent text edit or an empty string if there is none. -- (NSString *)recentlyReplacedText; - @end @protocol JLTokenizerDelegate diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index dbaaa33..135bf34 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -57,6 +57,7 @@ @implementation JLTokenizer { NSRange _editedRange; NSRange _editedLineRange; + NSString *_oldString; } #pragma mark - Setup @@ -172,10 +173,9 @@ - (void)scope:(JLScope *)scope didChangeIndexesFrom:(NSIndexSet *)oldSet to:(NSI - (NSString *)mergedModifiedStringForScope:(JLScope *)scope { - NSString *oldString = [self.dataSource recentlyReplacedText]; NSString *newString = [scope.string substringWithRange:_editedLineRange]; - if (oldString && newString) { - return [oldString stringByAppendingString:newString]; + if (_oldString && newString) { + return [_oldString stringByAppendingString:newString]; } return nil; } @@ -272,4 +272,87 @@ - (void)clearColorAttributesInRange:(NSRange)range textStorage:(NSTextStorage *) [storage addAttribute:NSForegroundColorAttributeName value:self.colors[JLTokenTypeText] range:range]; } +#pragma mark - UITextViewDelegate + +- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text +{ + _oldString = nil; + + if (range.length == 0 && text.length == 1) { + // A normal character typed + } + else if (range.length == 1 && text.length == 0) { + // Backspace + } + else { + // Multicharacter edit + } + + if ([text isEqualToString:@"\n"]) { + // Return + // Start the new line with as many tabs or white spaces as the previous one. + + NSString *prefixString = [@"\n" stringByAppendingString:[self prefixStringFromRange:range inTextView:textView]]; + + NSString *lastCharacter = [textView.text substringWithRange:NSMakeRange(range.location - 1, 1)]; + if ([lastCharacter isEqualToString:@"{"]) { + + prefixString = [prefixString stringByAppendingString:@" "]; + } else if ([lastCharacter isEqualToString:@"}"]) { + if ([[prefixString substringFromIndex:prefixString.length - 4] isEqualToString:@" "]) { + prefixString = [prefixString substringToIndex:prefixString.length - 4]; + } + else if ([[prefixString substringFromIndex:prefixString.length - 1] isEqualToString:@"\t"]) { + prefixString = [prefixString substringToIndex:prefixString.length - 1]; + } + } + [textView replaceRange:[self rangeWithRange:range inTextView:textView] withText:prefixString]; + return NO; + } + + if (range.length > 0) { + _oldString = [textView.text substringWithRange:range]; + } + else _oldString = @""; + + return YES; +} + +#pragma mark - Helpers + +- (UITextRange *)rangeWithRange:(NSRange)range inTextView:(UITextView *)textView +{ + UITextPosition *beginning = textView.beginningOfDocument; + UITextPosition *start = [textView positionFromPosition:beginning offset:range.location]; + UITextPosition *stop = [textView positionFromPosition:start offset:range.length]; + + return [textView textRangeFromPosition:start toPosition:stop]; +} + +- (NSString *)prefixStringFromRange:(NSRange)range inTextView:(UITextView *)textView +{ + NSRange lineRange = [textView.text lineRangeForRange:range]; + NSRange prefixRange = [textView.text rangeOfString:@"[\\t| ]*" options:NSRegularExpressionSearch range:lineRange]; + return [textView.text substringWithRange:prefixRange]; +} + +#pragma mark - NSLayoutManager delegeate + +/* + * TODO: Find out a way to set intendation for entire paragraphs. + */ + +- (CGFloat)layoutManager:(NSLayoutManager *)layoutManager paragraphSpacingBeforeGlyphAtIndex:(NSUInteger)glyphIndex withProposedLineFragmentRect:(CGRect)rect +{ + return 0; +} + +- (BOOL)layoutManager:(NSLayoutManager *)layoutManager shouldBreakLineByWordBeforeCharacterAtIndex:(NSUInteger)charIndex +{ + NSString *character = [layoutManager.textStorage.string substringWithRange:NSMakeRange(charIndex, 1)]; + // NSLog(@"Asked about linebreak: %@",character); + if ([character isEqualToString:@"*"]) return NO; + return YES; +} + @end From aa1a17ec1c105d4c5e78e7d455562febdc62e979 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Tue, 12 Nov 2013 20:52:28 +0100 Subject: [PATCH 113/140] Minor --- Chromatism/Chromatism/JLTokenizer.m | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index 135bf34..fd17687 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -349,9 +349,8 @@ - (CGFloat)layoutManager:(NSLayoutManager *)layoutManager paragraphSpacingBefore - (BOOL)layoutManager:(NSLayoutManager *)layoutManager shouldBreakLineByWordBeforeCharacterAtIndex:(NSUInteger)charIndex { - NSString *character = [layoutManager.textStorage.string substringWithRange:NSMakeRange(charIndex, 1)]; - // NSLog(@"Asked about linebreak: %@",character); - if ([character isEqualToString:@"*"]) return NO; + unichar character = [layoutManager.textStorage.string characterAtIndex:charIndex]; + if (character == '*') return NO; return YES; } From 7f04b23ecf6871b2ae42fbe1ec0ad9fe55d92e92 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Tue, 12 Nov 2013 22:19:04 +0100 Subject: [PATCH 114/140] Trying to ease subclassing --- Chromatism/Chromatism/JLTokenizer.h | 8 ++++++ Chromatism/Chromatism/JLTokenizer.m | 38 ++++++++++++++++++++--------- 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/Chromatism/Chromatism/JLTokenizer.h b/Chromatism/Chromatism/JLTokenizer.h index f9bb526..ac751e3 100644 --- a/Chromatism/Chromatism/JLTokenizer.h +++ b/Chromatism/Chromatism/JLTokenizer.h @@ -11,6 +11,12 @@ #import "Chromatism+Internal.h" #import "JLScope.h" +typedef NS_ENUM(NSInteger, JLTokenizerIntendtationAction) { + JLTokenizerIntendtationActionIncrease = 1, + JLTokenizerIntendtationActionDecrease = -1, + JLTokenizerIntendtationActionNone = 0 +} NS_ENUM_AVAILABLE_IOS(7_0); + @class TextViewChange, JLTextView; @protocol JLTokenizerDelegate; @@ -25,6 +31,8 @@ - (void)clearColorAttributesInRange:(NSRange)range textStorage:(NSTextStorage *)storage; + (NSMutableAttributedString *)tokenizeString:(NSString *)string withDefaultAttributes:(NSDictionary *)attributes; +- (JLTokenizerIntendtationAction)intendationActionAfterReplacingTextInRange:(NSRange)range replacementText:(NSString *)text previousCharacter:(unichar)character textView:(UITextView *)textView; + @property (nonatomic, strong) NSDictionary *colors; // @property (nonatomic, assign) BOOL needsValidation; diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index fd17687..ff3f2f3 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -294,18 +294,23 @@ - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range r NSString *prefixString = [@"\n" stringByAppendingString:[self prefixStringFromRange:range inTextView:textView]]; - NSString *lastCharacter = [textView.text substringWithRange:NSMakeRange(range.location - 1, 1)]; - if ([lastCharacter isEqualToString:@"{"]) { - - prefixString = [prefixString stringByAppendingString:@" "]; - } else if ([lastCharacter isEqualToString:@"}"]) { - if ([[prefixString substringFromIndex:prefixString.length - 4] isEqualToString:@" "]) { - prefixString = [prefixString substringToIndex:prefixString.length - 4]; - } - else if ([[prefixString substringFromIndex:prefixString.length - 1] isEqualToString:@"\t"]) { - prefixString = [prefixString substringToIndex:prefixString.length - 1]; - } + unichar previousCharacter = [textView.text characterAtIndex:range.location - 1]; + switch ([self intendationActionAfterReplacingTextInRange:range replacementText:text previousCharacter:previousCharacter textView:textView]) { + case JLTokenizerIntendtationActionIncrease: + prefixString = [prefixString stringByAppendingString:@" "]; + break; + case JLTokenizerIntendtationActionDecrease: + if ([[prefixString substringFromIndex:prefixString.length - 4] isEqualToString:@" "]) { + prefixString = [prefixString substringToIndex:prefixString.length - 4]; + } + else if ([[prefixString substringFromIndex:prefixString.length - 1] isEqualToString:@"\t"]) { + prefixString = [prefixString substringToIndex:prefixString.length - 1]; + } + break; + case JLTokenizerIntendtationActionNone: + break; } + [textView replaceRange:[self rangeWithRange:range inTextView:textView] withText:prefixString]; return NO; } @@ -318,6 +323,17 @@ - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range r return YES; } +- (JLTokenizerIntendtationAction)intendationActionAfterReplacingTextInRange:(NSRange)range replacementText:(NSString *)text previousCharacter:(unichar)character textView:(UITextView *)textView; +{ + if (character == '{') { + return JLTokenizerIntendtationActionIncrease; + } else if (character == '}') { + return JLTokenizerIntendtationActionDecrease; + } else { + return JLTokenizerIntendtationActionNone; + } +} + #pragma mark - Helpers - (UITextRange *)rangeWithRange:(NSRange)range inTextView:(UITextView *)textView From 590e1c47e84d5a39cc00c9e0f7396bb14a0c3f52 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Wed, 13 Nov 2013 00:07:40 +0100 Subject: [PATCH 115/140] Make JLScope a NSOperation --- Chromatism/Chromatism/JLScope.h | 19 ++--- Chromatism/Chromatism/JLScope.m | 106 +++++-------------------- Chromatism/Chromatism/JLTokenPattern.m | 32 +++----- Chromatism/Chromatism/JLTokenizer.m | 13 ++- 4 files changed, 43 insertions(+), 127 deletions(-) diff --git a/Chromatism/Chromatism/JLScope.h b/Chromatism/Chromatism/JLScope.h index ce52d6e..af66ff7 100644 --- a/Chromatism/Chromatism/JLScope.h +++ b/Chromatism/Chromatism/JLScope.h @@ -26,7 +26,7 @@ @protocol JLScopeDelegate; -@interface JLScope : NSObject +@interface JLScope : NSOperation // Designated initializors + (instancetype)scopeWithRange:(NSRange)range inTextStorage:(NSTextStorage *)textStorage; @@ -36,8 +36,9 @@ /** * Causes the every scope to perform cascadingly */ -- (void)perform; -- (void)performInIndexSet:(NSIndexSet *)set; + +- (void)addSubscope:(JLScope*)scope; +- (void)addScope:(JLScope *)scope; /** * Array of nested JLScopes and JLTokenPatterns. Reverse realationship to scope, setting one causes the other to update. No not mutate. @@ -48,17 +49,7 @@ * Weak reference to the parent scope. Default nil means that there is no parent. Reverse realationship to subscopes, setting one causes the other to update. */ -@property (nonatomic, weak) JLScope *scope; - -- (void)addSubscope:(JLScope *)subscope; -- (void)removeSubscope:(JLScope *)subscope; - -/** - * Creates a copy of the instance, and adds - */ - -- (void)addScope:(JLScope *)scope; - +@property (nonatomic, weak) NSArray *scopes; /** * A weak reference to a textStorage in which the scope is operating. Will be passed down to subscopes. diff --git a/Chromatism/Chromatism/JLScope.m b/Chromatism/Chromatism/JLScope.m index 1a6f1b7..740d009 100644 --- a/Chromatism/Chromatism/JLScope.m +++ b/Chromatism/Chromatism/JLScope.m @@ -26,17 +26,10 @@ #import "Helpers.h" @interface JLScope () - -- (void)iterateSubscopes; - @property (nonatomic, readwrite, strong) NSString *string; @end @implementation JLScope -{ - NSMutableArray *_subscopes; -} -@synthesize subscopes = _subscopes; #pragma mark - Initialization @@ -64,42 +57,24 @@ + (instancetype)scopeWithTextStorage:(NSTextStorage *)textStorage #pragma mark - Perform -- (void)iterateSubscopes +- (void)main { - NSMutableIndexSet *set = (self.empty) ? self.scope.set.mutableCopy :self.set.mutableCopy; - for (JLScope *scope in self.subscopes) { - - NSAssert(scope != self, @"%@ can under no circumstances have itself as a subscope.", self); - scope.textStorage = self.textStorage; - scope.string = self.string; - - [scope performInIndexSet:set]; - - if (scope.opaque) { - [set removeIndexes:scope.set]; - if (self.empty) { - [self.set addIndexes:scope.set]; - } + NSMutableIndexSet *set = [NSMutableIndexSet indexSet]; + for (JLScope *scope in self.dependencies) { + if ([scope isKindOfClass:[JLScope class]]) { + [set addIndexes:scope.set]; } } -} - -- (void)perform -{ - NSAssert(!self.scope, @"Only call -perform to a rootlevel scope"); - if (![self shouldPerform]) return; - [self iterateSubscopes]; -} - -- (void)performInIndexSet:(NSIndexSet *)set -{ - NSParameterAssert(set); - if (![self shouldPerform]) return; - NSMutableIndexSet *oldSet = self.set; - self.set = [self.set intersectionWithSet:set]; - [self iterateSubscopes]; - if ([self.delegate respondsToSelector:@selector(scope:didChangeIndexesFrom:to:)]) [self.delegate scope:self didChangeIndexesFrom:oldSet to:self.set]; + if (set.count > 0) { + if (![self shouldPerform]) return; + NSMutableIndexSet *oldSet = self.set; + self.set = [self.set intersectionWithSet:set]; + + if ([self.delegate respondsToSelector:@selector(scope:didChangeIndexesFrom:to:)]) [self.delegate scope:self didChangeIndexesFrom:oldSet to:self.set]; + } else { + self.set = [NSMutableIndexSet indexSetWithIndexesInRange:NSMakeRange(0, self.string.length)]; + } } - (BOOL)shouldPerform @@ -117,39 +92,14 @@ - (BOOL)shouldPerform return YES; } -#pragma mark - Scope Hierarchy Management - -- (NSMutableArray *)subscopes -{ - if (!_subscopes) _subscopes = [NSMutableArray array]; - return _subscopes; -} - -- (void)setSubscopes:(NSArray *)subscopes +- (void)addSubscope:(JLScope *)scope { - for (JLScope *scope in subscopes) { - scope.scope = self; - } - _subscopes = subscopes.mutableCopy; -} - -- (void)setScope:(JLScope *)scope -{ - [(NSMutableArray *)_scope.subscopes removeObject:self]; - _scope = scope; - - [(NSMutableArray *)_scope.subscopes addObject:self]; + [scope addDependency:self]; } -- (void)addSubscope:(JLScope *)subscope -{ - [(NSMutableArray *)self.subscopes addObject:subscope]; - subscope->_scope = self; -} - -- (void)removeSubscope:(JLScope *)subscope +- (void)addScope:(JLScope *)scope { - [(NSMutableArray *)self.subscopes removeObject:subscope]; + [self addDependency:scope]; } #pragma mark - Properties @@ -173,25 +123,5 @@ - (NSString *)description return [NSString stringWithFormat:@"%@, %@, nopaque: %i, nindexesSet:%@, \n subscopes, %@", NSStringFromClass(self.class), _identifier, _opaque, _set, subscopes]; } -#pragma mark - NSCopying Protocol - -- (id)copyWithZone:(NSZone *)zone -{ - JLScope *scope = [[self.class allocWithZone:zone] init]; - for (JLScope *subscope in self.subscopes) { - [scope addSubscope:subscope.copy]; - } - scope.textStorage = self.textStorage; - scope.delegate = self.delegate; - scope.type = self.type.copy; - scope.identifier = self.identifier.copy; - return scope; -} - -- (void)addScope:(JLScope *)scope -{ - [scope addSubscope:self.copy]; -} - @end diff --git a/Chromatism/Chromatism/JLTokenPattern.m b/Chromatism/Chromatism/JLTokenPattern.m index 2d9fbf6..9f0c496 100644 --- a/Chromatism/Chromatism/JLTokenPattern.m +++ b/Chromatism/Chromatism/JLTokenPattern.m @@ -70,9 +70,15 @@ - (void)setPattern:(NSString *)pattern #pragma mark - Perform -- (void)performInIndexSet:(NSIndexSet *)set +- (void)main { - + NSMutableIndexSet *set = [NSMutableIndexSet indexSet]; + for (JLScope *scope in self.dependencies) { + if ([scope isKindOfClass:[JLScope class]]) { + [set addIndexes:scope.set]; + } + } + if (![self shouldPerform]) return; NSDictionary *attributes = [self.delegate attributesForScope:self]; NSMutableIndexSet *oldSet = self.set; @@ -85,9 +91,7 @@ - (void)performInIndexSet:(NSIndexSet *)set [self.set addIndexesInRange:[result rangeAtIndex:self.captureGroup]]; }]; }]; - - [self iterateSubscopes]; - + if (![oldSet isEqualToIndexSet:self.set] && [self.delegate respondsToSelector:@selector(scope:didChangeIndexesFrom:to:)]) [self.delegate scope:self didChangeIndexesFrom:oldSet to:self.set]; } @@ -99,22 +103,4 @@ - (NSString *)description return [NSString stringWithFormat:@"%@, %@, Regex Pattern: %@, opaque: %i, indexesSet:%@ \nsubscopes, %@", NSStringFromClass(self.class), self.identifier, self.pattern, self.opaque, self.set, subscopes]; } -#pragma mark - NSCopying Protocol - -- (id)copyWithZone:(NSZone *)zone -{ - JLTokenPattern *pattern = [[self.class allocWithZone:zone] init]; - for (JLScope *subscope in self.subscopes) { - [pattern addSubscope:subscope.copy]; - } - pattern.textStorage = self.textStorage; - pattern.expression = self.expression; - pattern.set = self.set.mutableCopy; - pattern.delegate = self.delegate; - pattern.type = self.type.copy; - pattern.identifier = self.identifier.copy; - - return pattern; -} - @end diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index ff3f2f3..a680839 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -50,6 +50,7 @@ @interface JLTokenizer () @property (nonatomic, strong) JLScope *documentScope; @property (nonatomic, strong) JLScope *lineScope; @property (nonatomic, strong) NSTimer *validationTimer; +@property (nonatomic, strong) NSMutableArray *scopes; @end @@ -67,6 +68,11 @@ - (void)setup JLScope *documentScope = [JLScope new]; JLScope *lineScope = [JLScope new]; + self.scopes = @[].mutableCopy; + + [self.scopes addObject:documentScope]; + [self.scopes addObject:lineScope]; + // Block and line comments JLTokenPattern *blockComment = [self addToken:JLTokenTypeComment withIdentifier:BLOCK_COMMENT pattern:@"" andScope:documentScope]; blockComment.triggeringCharacterSet = [NSCharacterSet characterSetWithCharactersInString:@"/*"]; @@ -203,7 +209,8 @@ - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range [self.documentScope setSet:[NSMutableIndexSet indexSetWithIndexesInRange:NSMakeRange(0, storage.length)]]; [self.lineScope setSet:[NSMutableIndexSet indexSetWithIndexesInRange:range]]; - [self.documentScope perform]; + [[NSOperationQueue mainQueue] setMaxConcurrentOperationCount:50]; + [[NSOperationQueue mainQueue] addOperations:self.scopes waitUntilFinished:NO]; } #pragma mark - Validation @@ -255,7 +262,9 @@ - (JLTokenPattern *)addToken:(NSString *)type withIdentifier:(NSString *)identif token.identifier = identifier; token.type = type; token.delegate = self; - [scope addSubscope:token]; + [token addDependency:scope]; + + [self.scopes addObject:token]; return token; } From 440843bd6fda303a544bda3572ce8532c4214f4f Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Wed, 13 Nov 2013 01:29:50 +0100 Subject: [PATCH 116/140] Well, apparently it works now --- Chromatism/Chromatism/JLScope.h | 10 ---------- Chromatism/Chromatism/JLScope.m | 2 +- Chromatism/Chromatism/JLTokenPattern.m | 8 ++++---- Chromatism/Chromatism/JLTokenizer.m | 14 +++++++++++--- 4 files changed, 16 insertions(+), 18 deletions(-) diff --git a/Chromatism/Chromatism/JLScope.h b/Chromatism/Chromatism/JLScope.h index af66ff7..00b1a2e 100644 --- a/Chromatism/Chromatism/JLScope.h +++ b/Chromatism/Chromatism/JLScope.h @@ -40,16 +40,6 @@ - (void)addSubscope:(JLScope*)scope; - (void)addScope:(JLScope *)scope; -/** - * Array of nested JLScopes and JLTokenPatterns. Reverse realationship to scope, setting one causes the other to update. No not mutate. - */ -@property (nonatomic, strong) NSArray *subscopes; - -/** - * Weak reference to the parent scope. Default nil means that there is no parent. Reverse realationship to subscopes, setting one causes the other to update. - */ - -@property (nonatomic, weak) NSArray *scopes; /** * A weak reference to a textStorage in which the scope is operating. Will be passed down to subscopes. diff --git a/Chromatism/Chromatism/JLScope.m b/Chromatism/Chromatism/JLScope.m index 740d009..d9dd18f 100644 --- a/Chromatism/Chromatism/JLScope.m +++ b/Chromatism/Chromatism/JLScope.m @@ -119,7 +119,7 @@ - (NSMutableIndexSet *)set - (NSString *)description { - NSString *subscopes = [[[[self.subscopes valueForKey:@"description"] componentsJoinedByString:@"\n"] componentsSeparatedByString:@"\n"] componentsJoinedByString:@"\n\t\t"]; + NSString *subscopes = [[[[self.dependencies valueForKey:@"description"] componentsJoinedByString:@"\n"] componentsSeparatedByString:@"\n"] componentsJoinedByString:@"\n\t\t"]; return [NSString stringWithFormat:@"%@, %@, nopaque: %i, nindexesSet:%@, \n subscopes, %@", NSStringFromClass(self.class), _identifier, _opaque, _set, subscopes]; } diff --git a/Chromatism/Chromatism/JLTokenPattern.m b/Chromatism/Chromatism/JLTokenPattern.m index 9f0c496..f76f5cc 100644 --- a/Chromatism/Chromatism/JLTokenPattern.m +++ b/Chromatism/Chromatism/JLTokenPattern.m @@ -26,11 +26,9 @@ #import "Helpers.h" @interface JLScope () -- (void)iterateSubscopes; - (BOOL)shouldPerform; @property (nonatomic, readwrite, strong) NSString *string; - @end @implementation JLTokenPattern @@ -87,7 +85,9 @@ - (void)main NSAssert(attributes, @""); [set enumerateRangesUsingBlock:^(NSRange range, BOOL *stop) { [self.expression enumerateMatchesInString:self.string options:self.matchingOptions range:range usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { - [self.textStorage addAttributes:attributes range:[result rangeAtIndex:self.captureGroup]]; + dispatch_async(dispatch_get_main_queue(), ^{ + [self.textStorage addAttributes:attributes range:[result rangeAtIndex:self.captureGroup]]; + }); [self.set addIndexesInRange:[result rangeAtIndex:self.captureGroup]]; }]; }]; @@ -99,7 +99,7 @@ - (void)main - (NSString *)description { - NSString *subscopes = [[[[self.subscopes valueForKey:@"description"] componentsJoinedByString:@"\n"] componentsSeparatedByString:@"\n"] componentsJoinedByString:@"\n\t\t"]; + NSString *subscopes = [[[[self.dependencies valueForKey:@"description"] componentsJoinedByString:@"\n"] componentsSeparatedByString:@"\n"] componentsJoinedByString:@"\n\t\t"]; return [NSString stringWithFormat:@"%@, %@, Regex Pattern: %@, opaque: %i, indexesSet:%@ \nsubscopes, %@", NSStringFromClass(self.class), self.identifier, self.pattern, self.opaque, self.set, subscopes]; } diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index a680839..68d75e1 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -159,7 +159,7 @@ - (void)scope:(JLScope *)scope didChangeIndexesFrom:(NSIndexSet *)oldSet to:(NSI { if ([self.delegate respondsToSelector:@selector(scope:didFinishProcessing:)]) [self.delegate scope:scope didFinishProcessing:self]; - if ([self.documentScope.subscopes containsObject:scope] && scope != self.lineScope) + if (![scope.dependencies containsObject:self.documentScope] && scope != self.lineScope) { NSMutableIndexSet *removedIndexes = oldSet.mutableCopy; [removedIndexes removeIndexes:newSet]; @@ -202,6 +202,7 @@ - (void)tokenizeTextStorage:(NSTextStorage *)textStorage - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range { + [self setup]; // First, remove old attributes [self clearColorAttributesInRange:range textStorage:storage]; @@ -209,8 +210,15 @@ - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range [self.documentScope setSet:[NSMutableIndexSet indexSetWithIndexesInRange:NSMakeRange(0, storage.length)]]; [self.lineScope setSet:[NSMutableIndexSet indexSetWithIndexesInRange:range]]; - [[NSOperationQueue mainQueue] setMaxConcurrentOperationCount:50]; - [[NSOperationQueue mainQueue] addOperations:self.scopes waitUntilFinished:NO]; + for (JLScope *scope in self.scopes) { + scope.textStorage = storage; + } + +// [[NSOperationQueue mainQueue] setMaxConcurrentOperationCount:50]; + [storage beginEditing]; + NSOperationQueue *queue = [[NSOperationQueue alloc] init]; + [queue addOperations:self.scopes waitUntilFinished:YES]; + [storage endEditing]; } #pragma mark - Validation From 0b639146edf42f1f45067a181be88dd01b6ab20a Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Wed, 13 Nov 2013 01:39:05 +0100 Subject: [PATCH 117/140] Cache Regular Expressions --- Chromatism/Chromatism/JLTokenPattern.m | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/Chromatism/Chromatism/JLTokenPattern.m b/Chromatism/Chromatism/JLTokenPattern.m index f76f5cc..0e1ad03 100644 --- a/Chromatism/Chromatism/JLTokenPattern.m +++ b/Chromatism/Chromatism/JLTokenPattern.m @@ -35,10 +35,26 @@ @implementation JLTokenPattern #pragma mark - Initialization +static NSCache *cache; + + (instancetype)tokenPatternWithPattern:(NSString *)pattern { + if (!cache) { + cache = [NSCache new]; + } + JLTokenPattern *tokenPattern = [JLTokenPattern new]; - tokenPattern.pattern = pattern; + NSRegularExpression *expression = [cache objectForKey:pattern]; + if (expression) { + tokenPattern->_expression = expression; + tokenPattern->_pattern = pattern; + } else { + tokenPattern.pattern = pattern; + if (tokenPattern.expression) { + [cache setObject:tokenPattern.expression forKey:pattern]; + } + } + return tokenPattern; } From c447e7ee2771da9372e329211aa955db62103d4f Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Sun, 17 Nov 2013 15:15:45 +0100 Subject: [PATCH 118/140] Refactoring --- Chromatism/Chromatism/JLScope.m | 2 + Chromatism/Chromatism/JLTokenPattern.m | 3 + Chromatism/Chromatism/JLTokenizer.m | 180 +++++++++++++------------ 3 files changed, 96 insertions(+), 89 deletions(-) diff --git a/Chromatism/Chromatism/JLScope.m b/Chromatism/Chromatism/JLScope.m index d9dd18f..32de1b7 100644 --- a/Chromatism/Chromatism/JLScope.m +++ b/Chromatism/Chromatism/JLScope.m @@ -63,6 +63,8 @@ - (void)main for (JLScope *scope in self.dependencies) { if ([scope isKindOfClass:[JLScope class]]) { [set addIndexes:scope.set]; + self.textStorage = scope.textStorage; + self.string = scope.string; } } diff --git a/Chromatism/Chromatism/JLTokenPattern.m b/Chromatism/Chromatism/JLTokenPattern.m index 0e1ad03..2cf61a4 100644 --- a/Chromatism/Chromatism/JLTokenPattern.m +++ b/Chromatism/Chromatism/JLTokenPattern.m @@ -78,6 +78,7 @@ - (void)setExpression:(NSRegularExpression *)expression - (void)setPattern:(NSString *)pattern { + if (!pattern) return; _pattern = pattern; _expression = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionAnchorsMatchLines error:nil]; } @@ -90,6 +91,8 @@ - (void)main for (JLScope *scope in self.dependencies) { if ([scope isKindOfClass:[JLScope class]]) { [set addIndexes:scope.set]; + self.string = scope.string; + self.textStorage = scope.textStorage; } } diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index 68d75e1..30a3336 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -42,15 +42,14 @@ #import "JLTokenPattern.h" #import "Chromatism.h" -#define BLOCK_COMMENT @"blockComment" -#define LINE_COMMENT @"lineComment" - @interface JLTokenizer () @property (nonatomic, strong) JLScope *documentScope; @property (nonatomic, strong) JLScope *lineScope; @property (nonatomic, strong) NSTimer *validationTimer; -@property (nonatomic, strong) NSMutableArray *scopes; +@property (nonatomic, strong) NSMutableDictionary *scopes; +@property (nonatomic, strong) NSMutableDictionary *scopeHierarchy; +@property (nonatomic, strong) NSOperationQueue *operationQueue; @end @@ -63,76 +62,31 @@ @implementation JLTokenizer #pragma mark - Setup -- (void)setup +- (id)init { - JLScope *documentScope = [JLScope new]; - JLScope *lineScope = [JLScope new]; - - self.scopes = @[].mutableCopy; - - [self.scopes addObject:documentScope]; - [self.scopes addObject:lineScope]; - - // Block and line comments - JLTokenPattern *blockComment = [self addToken:JLTokenTypeComment withIdentifier:BLOCK_COMMENT pattern:@"" andScope:documentScope]; - blockComment.triggeringCharacterSet = [NSCharacterSet characterSetWithCharactersInString:@"/*"]; - blockComment.expression = [NSRegularExpression regularExpressionWithPattern:@"/\\*.*?\\*/" options:NSRegularExpressionDotMatchesLineSeparators error:nil]; - - [self addToken:JLTokenTypeComment withIdentifier:LINE_COMMENT pattern:@"//.*+$" andScope:lineScope]; - - // Preprocessor macros - JLTokenPattern *preprocessor = [self addToken:JLTokenTypePreprocessor withIdentifier:nil pattern:@"^#.*+$" andScope:lineScope]; - - // #import - // In xcode it only works for #import and #include, not all preprocessor statements. - [self addToken:JLTokenTypeString withPattern:@"<.*?>" andScope:preprocessor]; - - // Strings - [[self addToken:JLTokenTypeString withPattern:@"(\"|@\")[^\"\\n]*(@\"|\")" andScope:lineScope] addScope:preprocessor]; - - // Numbers - [self addToken:JLTokenTypeNumber withPattern:@"(?<=\\s)\\d+" andScope:lineScope]; - - // New literals, for example @[] - // TODO: Highlight the closing bracket too, but with some special "nested-token-pattern" - [[self addToken:JLTokenTypeNumber withPattern:@"@[\\[|\\{|\\(]" andScope:lineScope] setOpaque:NO]; - - // C function names - [[self addToken:JLTokenTypeOtherMethodNames withPattern:@"\\w+\\s*(?>\\(.*\\)" andScope:lineScope] setCaptureGroup:1]; - - // Dot notation - [[self addToken:JLTokenTypeOtherMethodNames withPattern:@"\\.(\\w+)" andScope:lineScope] setCaptureGroup:1]; - - // Method Calls - [[self addToken:JLTokenTypeOtherMethodNames withPattern:@"(\\w+)\\]" andScope:lineScope] setCaptureGroup:1]; - - // Method call parts - [[self addToken:JLTokenTypeOtherMethodNames withPattern:@"(?<=\\w+):" andScope:lineScope] setCaptureGroup:0]; - - NSString *keywords = @"true false yes no YES TRUE FALSE bool BOOL nil id void self NULL if else strong weak nonatomic atomic assign copy typedef enum auto break case const char continue do default double extern float for goto int long register return short signed sizeof static struct switch typedef union unsigned volatile while nonatomic atomic nonatomic readonly super"; - - [self addToken:JLTokenTypeKeyword withKeywords:keywords andScope:lineScope]; - [self addToken:JLTokenTypeKeyword withPattern:@"@[a-zA-Z0-9_]+" andScope:lineScope]; - - // Other Class Names - [self addToken:JLTokenTypeOtherClassNames withPattern:@"\\b[A-Z]{3}[a-zA-Z]*\\b" andScope:lineScope]; - - [documentScope addSubscope:lineScope]; - - self.documentScope = documentScope; - self.lineScope = lineScope; -} - -- (JLScope *)documentScope -{ - if (!_documentScope) [self setup]; - return _documentScope; + self = [super init]; + if (self) { + self.operationQueue = [[NSOperationQueue alloc] init]; + } + return self; } -- (JLScope *)lineScope +- (JLTokenPattern *)addTokenOfType:(NSString *)type pattern:(NSString *)pattern scopes:(NSArray *)scopes; { - if (!_lineScope) [self setup]; - return _lineScope; + JLTokenPattern *token = [JLTokenPattern tokenPatternWithPattern:pattern]; + token.type = type; + token.delegate = self; + [self.operationQueue addOperation:token]; + + if (scopes) { + for (JLScope *scope in scopes) { + [token addScope:scope]; + } + } else { + [token addScope:self.lineScope]; + } + + return token; } #pragma mark - NSTextStorageDelegate @@ -189,7 +143,7 @@ - (NSString *)mergedModifiedStringForScope:(JLScope *)scope - (NSDictionary *)attributesForScope:(JLScope *)scope { UIColor *color = self.colors[scope.type]; - NSAssert(color, @"Didn't get a color for type:%@ in colorDictionary: %@",scope.type, self.colors); + NSAssert(color, @"Didn't get a color for type: %@ in colorDictionary: %@",scope.type, self.colors); return @{ NSForegroundColorAttributeName : color }; } @@ -202,25 +156,80 @@ - (void)tokenizeTextStorage:(NSTextStorage *)textStorage - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range { - [self setup]; - // First, remove old attributes + [storage beginEditing]; + + [self.operationQueue setSuspended:YES]; + [self createScopes]; + [self clearColorAttributesInRange:range textStorage:storage]; [self.documentScope setTextStorage:storage]; [self.documentScope setSet:[NSMutableIndexSet indexSetWithIndexesInRange:NSMakeRange(0, storage.length)]]; [self.lineScope setSet:[NSMutableIndexSet indexSetWithIndexesInRange:range]]; - for (JLScope *scope in self.scopes) { - scope.textStorage = storage; - } - -// [[NSOperationQueue mainQueue] setMaxConcurrentOperationCount:50]; - [storage beginEditing]; - NSOperationQueue *queue = [[NSOperationQueue alloc] init]; - [queue addOperations:self.scopes waitUntilFinished:YES]; + [self.operationQueue setSuspended:NO]; + [self.operationQueue waitUntilAllOperationsAreFinished]; [storage endEditing]; } +- (void)createScopes +{ + JLScope *documentScope = [JLScope new]; + JLScope *lineScope = [JLScope new]; + + [self.operationQueue addOperation:lineScope]; + [self.operationQueue addOperation:documentScope]; + + // Block and line comments + JLTokenPattern *blockComment = [self addToken:JLTokenTypeComment withPattern:@"" andScope:documentScope]; + blockComment.triggeringCharacterSet = [NSCharacterSet characterSetWithCharactersInString:@"/*"]; + blockComment.expression = [NSRegularExpression regularExpressionWithPattern:@"/\\*.*?\\*/" options:NSRegularExpressionDotMatchesLineSeparators error:nil]; + + [self addToken:JLTokenTypeComment withPattern:@"//.*+$" andScope:lineScope]; + + // Preprocessor macros + JLTokenPattern *preprocessor = [self addToken:JLTokenTypePreprocessor withPattern:@"^#.*+$" andScope:lineScope]; + + // #import + // In xcode it only works for #import and #include, not all preprocessor statements. + [self addToken:JLTokenTypeString withPattern:@"<.*?>" andScope:preprocessor]; + + // Strings + [[self addToken:JLTokenTypeString withPattern:@"(\"|@\")[^\"\\n]*(@\"|\")" andScope:lineScope] addScope:preprocessor]; + + // Numbers + [self addToken:JLTokenTypeNumber withPattern:@"(?<=\\s)\\d+" andScope:lineScope]; + + // New literals, for example @[] + // TODO: Highlight the closing bracket too, but with some special "nested-token-pattern" + [[self addToken:JLTokenTypeNumber withPattern:@"@[\\[|\\{|\\(]" andScope:lineScope] setOpaque:NO]; + + // C function names + [[self addToken:JLTokenTypeOtherMethodNames withPattern:@"\\w+\\s*(?>\\(.*\\)" andScope:lineScope] setCaptureGroup:1]; + + // Dot notation + [[self addToken:JLTokenTypeOtherMethodNames withPattern:@"\\.(\\w+)" andScope:lineScope] setCaptureGroup:1]; + + // Method Calls + [[self addToken:JLTokenTypeOtherMethodNames withPattern:@"(\\w+)\\]" andScope:lineScope] setCaptureGroup:1]; + + // Method call parts + [[self addToken:JLTokenTypeOtherMethodNames withPattern:@"(?<=\\w+):" andScope:lineScope] setCaptureGroup:0]; + + NSString *keywords = @"true false yes no YES TRUE FALSE bool BOOL nil id void self NULL if else strong weak nonatomic atomic assign copy typedef enum auto break case const char continue do default double extern float for goto int long register return short signed sizeof static struct switch typedef union unsigned volatile while nonatomic atomic nonatomic readonly super"; + + [self addToken:JLTokenTypeKeyword withKeywords:keywords andScope:lineScope]; + [self addToken:JLTokenTypeKeyword withPattern:@"@[a-zA-Z0-9_]+" andScope:lineScope]; + + // Other Class Names + [self addToken:JLTokenTypeOtherClassNames withPattern:@"\\b[A-Z]{3}[a-zA-Z]*\\b" andScope:lineScope]; + + [documentScope addSubscope:lineScope]; + + self.documentScope = documentScope; + self.lineScope = lineScope; +} + #pragma mark - Validation /* @@ -256,23 +265,16 @@ + (NSMutableAttributedString *)tokenizeString:(NSString *)string withDefaultAttr #pragma mark - Helpers - (JLTokenPattern *)addToken:(NSString *)type withPattern:(NSString *)pattern andScope:(JLScope *)scope -{ - return [self addToken:type withIdentifier:type pattern:pattern andScope:scope]; -} - -- (JLTokenPattern *)addToken:(NSString *)type withIdentifier:(NSString *)identifier pattern:(NSString *)pattern andScope:(JLScope *)scope { NSParameterAssert(type); NSParameterAssert(pattern); NSParameterAssert(scope); JLTokenPattern *token = [JLTokenPattern tokenPatternWithPattern:pattern]; - token.identifier = identifier; token.type = type; token.delegate = self; [token addDependency:scope]; - - [self.scopes addObject:token]; + [self.operationQueue addOperation:token]; return token; } From c1878050c5d4d3713fe6248ead08e9a4067e6872 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Mon, 18 Nov 2013 18:34:55 +0100 Subject: [PATCH 119/140] JLScope Dependencies and Hierarchy fixes --- Chromatism/Chromatism/JLScope.m | 6 ++++++ Chromatism/Chromatism/JLTokenPattern.m | 6 ++++++ Chromatism/Chromatism/JLTokenizer.m | 16 +++++++++++++--- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/Chromatism/Chromatism/JLScope.m b/Chromatism/Chromatism/JLScope.m index 32de1b7..0a0a5a2 100644 --- a/Chromatism/Chromatism/JLScope.m +++ b/Chromatism/Chromatism/JLScope.m @@ -77,6 +77,12 @@ - (void)main } else { self.set = [NSMutableIndexSet indexSetWithIndexesInRange:NSMakeRange(0, self.string.length)]; } + + for (JLScope *scope in self.dependencies) { + if ([scope isKindOfClass:[JLScope class]]) { + [scope.set removeIndexes:self.set]; + } + } } - (BOOL)shouldPerform diff --git a/Chromatism/Chromatism/JLTokenPattern.m b/Chromatism/Chromatism/JLTokenPattern.m index 2cf61a4..adec177 100644 --- a/Chromatism/Chromatism/JLTokenPattern.m +++ b/Chromatism/Chromatism/JLTokenPattern.m @@ -112,6 +112,12 @@ - (void)main }]; if (![oldSet isEqualToIndexSet:self.set] && [self.delegate respondsToSelector:@selector(scope:didChangeIndexesFrom:to:)]) [self.delegate scope:self didChangeIndexesFrom:oldSet to:self.set]; + + for (JLScope *scope in self.dependencies) { + if ([scope isKindOfClass:[JLScope class]]) { + [scope.set removeIndexes:self.set]; + } + } } #pragma mark - Debugging diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index 30a3336..c87604d 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -47,8 +47,7 @@ @interface JLTokenizer () @property (nonatomic, strong) JLScope *documentScope; @property (nonatomic, strong) JLScope *lineScope; @property (nonatomic, strong) NSTimer *validationTimer; -@property (nonatomic, strong) NSMutableDictionary *scopes; -@property (nonatomic, strong) NSMutableDictionary *scopeHierarchy; +@property (nonatomic, strong) NSMutableArray *scopes; @property (nonatomic, strong) NSOperationQueue *operationQueue; @end @@ -67,6 +66,7 @@ - (id)init self = [super init]; if (self) { self.operationQueue = [[NSOperationQueue alloc] init]; + self.operationQueue.maxConcurrentOperationCount = 1; } return self; } @@ -177,6 +177,8 @@ - (void)createScopes JLScope *documentScope = [JLScope new]; JLScope *lineScope = [JLScope new]; + self.scopes = [NSMutableArray arrayWithObjects:documentScope, lineScope, nil]; + [self.operationQueue addOperation:lineScope]; [self.operationQueue addOperation:documentScope]; @@ -185,9 +187,10 @@ - (void)createScopes blockComment.triggeringCharacterSet = [NSCharacterSet characterSetWithCharactersInString:@"/*"]; blockComment.expression = [NSRegularExpression regularExpressionWithPattern:@"/\\*.*?\\*/" options:NSRegularExpressionDotMatchesLineSeparators error:nil]; + [lineScope addDependency:blockComment]; + [self addToken:JLTokenTypeComment withPattern:@"//.*+$" andScope:lineScope]; - // Preprocessor macros JLTokenPattern *preprocessor = [self addToken:JLTokenTypePreprocessor withPattern:@"^#.*+$" andScope:lineScope]; // #import @@ -275,6 +278,13 @@ - (JLTokenPattern *)addToken:(NSString *)type withPattern:(NSString *)pattern an token.delegate = self; [token addDependency:scope]; [self.operationQueue addOperation:token]; + [self.scopes addObject:token]; + + [self.scopes enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { + if ([scope.dependencies containsObject:obj]) { + [token addDependency:obj]; + } + }]; return token; } From baca4cd709307d14c0a8f195ca5ebb528ebec746 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Mon, 18 Nov 2013 18:58:57 +0100 Subject: [PATCH 120/140] Add .scopes array again --- Chromatism/Chromatism/JLScope.h | 4 +++- Chromatism/Chromatism/JLScope.m | 26 ++++++++++++++++---------- Chromatism/Chromatism/JLTokenPattern.m | 10 +++------- Chromatism/Chromatism/JLTokenizer.m | 3 ++- 4 files changed, 24 insertions(+), 19 deletions(-) diff --git a/Chromatism/Chromatism/JLScope.h b/Chromatism/Chromatism/JLScope.h index 00b1a2e..8668adb 100644 --- a/Chromatism/Chromatism/JLScope.h +++ b/Chromatism/Chromatism/JLScope.h @@ -37,9 +37,11 @@ * Causes the every scope to perform cascadingly */ -- (void)addSubscope:(JLScope*)scope; +- (void)addSubscope:(JLScope *)scope; - (void)addScope:(JLScope *)scope; +/// Array of parent scopes +@property (nonatomic, strong) NSMutableArray *scopes; /** * A weak reference to a textStorage in which the scope is operating. Will be passed down to subscopes. diff --git a/Chromatism/Chromatism/JLScope.m b/Chromatism/Chromatism/JLScope.m index 0a0a5a2..ded6fa3 100644 --- a/Chromatism/Chromatism/JLScope.m +++ b/Chromatism/Chromatism/JLScope.m @@ -55,17 +55,23 @@ + (instancetype)scopeWithTextStorage:(NSTextStorage *)textStorage return [self scopeWithRange:NSMakeRange(0, textStorage.length) inTextStorage:textStorage]; } +- (NSMutableArray *)scopes +{ + if (!_scopes) { + self.scopes = @[].mutableCopy; + } + return _scopes; +} + #pragma mark - Perform - (void)main { NSMutableIndexSet *set = [NSMutableIndexSet indexSet]; - for (JLScope *scope in self.dependencies) { - if ([scope isKindOfClass:[JLScope class]]) { - [set addIndexes:scope.set]; - self.textStorage = scope.textStorage; - self.string = scope.string; - } + for (JLScope *scope in self.scopes) { + [set addIndexes:scope.set]; + self.textStorage = scope.textStorage; + self.string = scope.string; } if (set.count > 0) { @@ -78,10 +84,8 @@ - (void)main self.set = [NSMutableIndexSet indexSetWithIndexesInRange:NSMakeRange(0, self.string.length)]; } - for (JLScope *scope in self.dependencies) { - if ([scope isKindOfClass:[JLScope class]]) { - [scope.set removeIndexes:self.set]; - } + for (JLScope *scope in self.scopes) { + [scope.set removeIndexes:self.set]; } } @@ -103,11 +107,13 @@ - (BOOL)shouldPerform - (void)addSubscope:(JLScope *)scope { [scope addDependency:self]; + [scope.scopes addObject:self]; } - (void)addScope:(JLScope *)scope { [self addDependency:scope]; + [self.scopes addObject:scope]; } #pragma mark - Properties diff --git a/Chromatism/Chromatism/JLTokenPattern.m b/Chromatism/Chromatism/JLTokenPattern.m index adec177..975639f 100644 --- a/Chromatism/Chromatism/JLTokenPattern.m +++ b/Chromatism/Chromatism/JLTokenPattern.m @@ -88,12 +88,10 @@ - (void)setPattern:(NSString *)pattern - (void)main { NSMutableIndexSet *set = [NSMutableIndexSet indexSet]; - for (JLScope *scope in self.dependencies) { - if ([scope isKindOfClass:[JLScope class]]) { + for (JLScope *scope in self.scopes) { [set addIndexes:scope.set]; self.string = scope.string; self.textStorage = scope.textStorage; - } } if (![self shouldPerform]) return; @@ -113,10 +111,8 @@ - (void)main if (![oldSet isEqualToIndexSet:self.set] && [self.delegate respondsToSelector:@selector(scope:didChangeIndexesFrom:to:)]) [self.delegate scope:self didChangeIndexesFrom:oldSet to:self.set]; - for (JLScope *scope in self.dependencies) { - if ([scope isKindOfClass:[JLScope class]]) { - [scope.set removeIndexes:self.set]; - } + for (JLScope *scope in self.scopes) { + [scope.set removeIndexes:self.set]; } } diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index c87604d..8cecf91 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -276,7 +276,8 @@ - (JLTokenPattern *)addToken:(NSString *)type withPattern:(NSString *)pattern an JLTokenPattern *token = [JLTokenPattern tokenPatternWithPattern:pattern]; token.type = type; token.delegate = self; - [token addDependency:scope]; + [token addScope:scope]; + [self.operationQueue addOperation:token]; [self.scopes addObject:token]; From 6fa24c3cf896d94e5d6ae53bf834a7b3f4b16453 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Mon, 18 Nov 2013 19:11:18 +0100 Subject: [PATCH 121/140] A scope needs to know about its children and parents scopes to function properly. Weak references to parents, and strong references to children. --- Chromatism/Chromatism/JLScope.h | 7 +++++-- Chromatism/Chromatism/JLScope.m | 20 ++++++++++++++++---- Chromatism/Chromatism/JLTokenizer.m | 7 ------- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/Chromatism/Chromatism/JLScope.h b/Chromatism/Chromatism/JLScope.h index 8668adb..1b69ca2 100644 --- a/Chromatism/Chromatism/JLScope.h +++ b/Chromatism/Chromatism/JLScope.h @@ -40,8 +40,11 @@ - (void)addSubscope:(JLScope *)scope; - (void)addScope:(JLScope *)scope; -/// Array of parent scopes -@property (nonatomic, strong) NSMutableArray *scopes; +/// NSHashTable with weak references to parent scopes +@property (nonatomic, strong) NSHashTable *scopes; + +/// NSMutableArray of strong references to subscopes +@property (nonatomic, strong) NSMutableArray *subscopes; /** * A weak reference to a textStorage in which the scope is operating. Will be passed down to subscopes. diff --git a/Chromatism/Chromatism/JLScope.m b/Chromatism/Chromatism/JLScope.m index ded6fa3..fe64898 100644 --- a/Chromatism/Chromatism/JLScope.m +++ b/Chromatism/Chromatism/JLScope.m @@ -55,14 +55,22 @@ + (instancetype)scopeWithTextStorage:(NSTextStorage *)textStorage return [self scopeWithRange:NSMakeRange(0, textStorage.length) inTextStorage:textStorage]; } -- (NSMutableArray *)scopes +- (NSHashTable *)scopes { if (!_scopes) { - self.scopes = @[].mutableCopy; + self.scopes = [NSHashTable weakObjectsHashTable]; } return _scopes; } +- (NSMutableArray *)subscopes +{ + if (!_subscopes) { + self.subscopes = [NSMutableArray array]; + } + return _subscopes; +} + #pragma mark - Perform - (void)main @@ -106,14 +114,18 @@ - (BOOL)shouldPerform - (void)addSubscope:(JLScope *)scope { + for (JLScope *obj in self.subscopes) { + [scope addDependency:obj]; + } + [scope addDependency:self]; [scope.scopes addObject:self]; + [self.subscopes addObject:scope]; } - (void)addScope:(JLScope *)scope { - [self addDependency:scope]; - [self.scopes addObject:scope]; + [scope addSubscope:self]; } #pragma mark - Properties diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index 8cecf91..8effb91 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -279,13 +279,6 @@ - (JLTokenPattern *)addToken:(NSString *)type withPattern:(NSString *)pattern an [token addScope:scope]; [self.operationQueue addOperation:token]; - [self.scopes addObject:token]; - - [self.scopes enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { - if ([scope.dependencies containsObject:obj]) { - [token addDependency:obj]; - } - }]; return token; } From 9cbb1f7fed553907e0876f2ba41bf28f45e7f1a9 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Mon, 18 Nov 2013 20:15:54 +0100 Subject: [PATCH 122/140] Removed scopeDidChangeIndexes-method --- Chromatism/Chromatism/JLScope.h | 1 - Chromatism/Chromatism/JLScope.m | 2 -- Chromatism/Chromatism/JLTokenPattern.m | 3 --- Chromatism/Chromatism/JLTokenizer.m | 27 ++++---------------------- 4 files changed, 4 insertions(+), 29 deletions(-) diff --git a/Chromatism/Chromatism/JLScope.h b/Chromatism/Chromatism/JLScope.h index 1b69ca2..09b998b 100644 --- a/Chromatism/Chromatism/JLScope.h +++ b/Chromatism/Chromatism/JLScope.h @@ -97,6 +97,5 @@ - (NSString *)mergedModifiedStringForScope:(JLScope *)scope; - (BOOL)scopeShouldPerform:(JLScope *)scope; -- (void)scope:(JLScope *)scope didChangeIndexesFrom:(NSIndexSet *)oldSet to:(NSIndexSet *)newSet; @end diff --git a/Chromatism/Chromatism/JLScope.m b/Chromatism/Chromatism/JLScope.m index fe64898..bceb6fc 100644 --- a/Chromatism/Chromatism/JLScope.m +++ b/Chromatism/Chromatism/JLScope.m @@ -84,10 +84,8 @@ - (void)main if (set.count > 0) { if (![self shouldPerform]) return; - NSMutableIndexSet *oldSet = self.set; self.set = [self.set intersectionWithSet:set]; - if ([self.delegate respondsToSelector:@selector(scope:didChangeIndexesFrom:to:)]) [self.delegate scope:self didChangeIndexesFrom:oldSet to:self.set]; } else { self.set = [NSMutableIndexSet indexSetWithIndexesInRange:NSMakeRange(0, self.string.length)]; } diff --git a/Chromatism/Chromatism/JLTokenPattern.m b/Chromatism/Chromatism/JLTokenPattern.m index 975639f..21e5cba 100644 --- a/Chromatism/Chromatism/JLTokenPattern.m +++ b/Chromatism/Chromatism/JLTokenPattern.m @@ -96,7 +96,6 @@ - (void)main if (![self shouldPerform]) return; NSDictionary *attributes = [self.delegate attributesForScope:self]; - NSMutableIndexSet *oldSet = self.set; self.set = [self.set intersectionWithSet:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, self.textStorage.length)]]; [self.set removeIndexes:set]; NSAssert(attributes, @""); @@ -108,8 +107,6 @@ - (void)main [self.set addIndexesInRange:[result rangeAtIndex:self.captureGroup]]; }]; }]; - - if (![oldSet isEqualToIndexSet:self.set] && [self.delegate respondsToSelector:@selector(scope:didChangeIndexesFrom:to:)]) [self.delegate scope:self didChangeIndexesFrom:oldSet to:self.set]; for (JLScope *scope in self.scopes) { [scope.set removeIndexes:self.set]; diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index 8effb91..c66ab8b 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -109,27 +109,6 @@ - (void)textStorage:(NSTextStorage *)textStorage didProcessEditing:(NSTextStorag #pragma mark - JLScope delegate -- (void)scope:(JLScope *)scope didChangeIndexesFrom:(NSIndexSet *)oldSet to:(NSIndexSet *)newSet -{ - if ([self.delegate respondsToSelector:@selector(scope:didFinishProcessing:)]) [self.delegate scope:scope didFinishProcessing:self]; - - if (![scope.dependencies containsObject:self.documentScope] && scope != self.lineScope) - { - NSMutableIndexSet *removedIndexes = oldSet.mutableCopy; - [removedIndexes removeIndexes:newSet]; - - // Make sure the indexes still excist in the attributedString - removedIndexes = [removedIndexes intersectionWithSet:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, scope.textStorage.length)]]; - - ChromatismLog(@"Removed Indexes:%@",removedIndexes); - - if (removedIndexes) { - [removedIndexes enumerateRangesUsingBlock:^(NSRange range, BOOL *stop) { - [self tokenizeTextStorage:scope.textStorage withRange:range]; - }]; - } - } -} - (NSString *)mergedModifiedStringForScope:(JLScope *)scope { @@ -177,6 +156,9 @@ - (void)createScopes JLScope *documentScope = [JLScope new]; JLScope *lineScope = [JLScope new]; + self.documentScope = documentScope; + self.lineScope = lineScope; + self.scopes = [NSMutableArray arrayWithObjects:documentScope, lineScope, nil]; [self.operationQueue addOperation:lineScope]; @@ -229,8 +211,7 @@ - (void)createScopes [documentScope addSubscope:lineScope]; - self.documentScope = documentScope; - self.lineScope = lineScope; + } #pragma mark - Validation From 15f6cea84f54fb18c31f4c08c077935b0e3f3d00 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Mon, 18 Nov 2013 23:10:55 +0100 Subject: [PATCH 123/140] cleaning --- Chromatism/Chromatism/JLTokenizer.h | 5 ----- Chromatism/Chromatism/JLTokenizer.m | 27 --------------------------- 2 files changed, 32 deletions(-) diff --git a/Chromatism/Chromatism/JLTokenizer.h b/Chromatism/Chromatism/JLTokenizer.h index c975093..c3f63d2 100644 --- a/Chromatism/Chromatism/JLTokenizer.h +++ b/Chromatism/Chromatism/JLTokenizer.h @@ -26,16 +26,11 @@ typedef NS_ENUM(NSInteger, JLTokenizerIntendtationAction) { - (void)tokenizeTextStorage:(NSTextStorage *)textStorage withRange:(NSRange)range; - (void)tokenizeTextStorage:(NSTextStorage *)textStorage; -// - (void)validateTokenization; - - (void)clearColorAttributesInRange:(NSRange)range textStorage:(NSTextStorage *)storage; - (JLTokenizerIntendtationAction)intendationActionAfterReplacingTextInRange:(NSRange)range replacementText:(NSString *)text previousCharacter:(unichar)character textView:(UITextView *)textView; @property (nonatomic, strong) NSDictionary *colors; - -// @property (nonatomic, assign) BOOL needsValidation; - @property (nonatomic, weak) id delegate; @end diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index 8675eb0..11a0762 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -47,7 +47,6 @@ @interface JLTokenizer () @property (nonatomic, strong) JLScope *documentScope; @property (nonatomic, strong) JLScope *lineScope; @property (nonatomic, strong) NSTimer *validationTimer; -@property (nonatomic, strong) NSMutableArray *scopes; @property (nonatomic, strong) NSOperationQueue *operationQueue; @end @@ -71,24 +70,6 @@ - (id)init return self; } -- (JLTokenPattern *)addTokenOfType:(NSString *)type pattern:(NSString *)pattern scopes:(NSArray *)scopes; -{ - JLTokenPattern *token = [JLTokenPattern tokenPatternWithPattern:pattern]; - token.type = type; - token.delegate = self; - [self.operationQueue addOperation:token]; - - if (scopes) { - for (JLScope *scope in scopes) { - [token addScope:scope]; - } - } else { - [token addScope:self.lineScope]; - } - - return token; -} - #pragma mark - NSTextStorageDelegate - (void)textStorage:(NSTextStorage *)textStorage willProcessEditing:(NSTextStorageEditActions)editedMask range:(NSRange)editedRange changeInLength:(NSInteger)delta @@ -158,8 +139,6 @@ - (void)createScopes self.documentScope = documentScope; self.lineScope = lineScope; - self.scopes = [NSMutableArray arrayWithObjects:documentScope, lineScope, nil]; - [self.operationQueue addOperation:lineScope]; [self.operationQueue addOperation:documentScope]; @@ -209,8 +188,6 @@ - (void)createScopes [self addToken:JLTokenTypeOtherClassNames withPattern:@"\\b[A-Z]{3}[a-zA-Z]*\\b" andScope:lineScope]; [documentScope addSubscope:lineScope]; - - } #pragma mark - Symbolication @@ -349,10 +326,6 @@ - (NSString *)prefixStringFromRange:(NSRange)range inTextView:(UITextView *)text #pragma mark - NSLayoutManager delegeate -/* - * TODO: Find out a way to set intendation for entire paragraphs. - */ - - (CGFloat)layoutManager:(NSLayoutManager *)layoutManager paragraphSpacingBeforeGlyphAtIndex:(NSUInteger)glyphIndex withProposedLineFragmentRect:(CGRect)rect { return 0; From 6d05bcb6be9f8e6b07f6cd09fcfd067d4b2f962c Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Tue, 19 Nov 2013 00:00:47 +0100 Subject: [PATCH 124/140] Cleaning more, simplifying --- Chromatism/Chromatism/JLScope.h | 12 ++++-------- Chromatism/Chromatism/JLScope.m | 22 +++------------------- Chromatism/Chromatism/JLTokenPattern.m | 19 ++----------------- Chromatism/Chromatism/JLTokenizer.m | 16 ---------------- 4 files changed, 9 insertions(+), 60 deletions(-) diff --git a/Chromatism/Chromatism/JLScope.h b/Chromatism/Chromatism/JLScope.h index 09b998b..2fa6f3f 100644 --- a/Chromatism/Chromatism/JLScope.h +++ b/Chromatism/Chromatism/JLScope.h @@ -33,9 +33,10 @@ + (instancetype)scopeWithTextStorage:(NSTextStorage *)textStorage; @property (nonatomic, strong) NSMutableIndexSet *set; -/** - * Causes the every scope to perform cascadingly - */ + + +/// Used by subclasses +- (void)performInIndexSet:(NSMutableIndexSet *)set; - (void)addSubscope:(JLScope *)scope; - (void)addScope:(JLScope *)scope; @@ -93,9 +94,4 @@ - (NSDictionary *)attributesForScope:(JLScope *)scope; -/// @see JLTokenizer and -triggeringCharacterSet -- (NSString *)mergedModifiedStringForScope:(JLScope *)scope; - -- (BOOL)scopeShouldPerform:(JLScope *)scope; - @end diff --git a/Chromatism/Chromatism/JLScope.m b/Chromatism/Chromatism/JLScope.m index bceb6fc..b9b2235 100644 --- a/Chromatism/Chromatism/JLScope.m +++ b/Chromatism/Chromatism/JLScope.m @@ -82,32 +82,16 @@ - (void)main self.string = scope.string; } - if (set.count > 0) { - if (![self shouldPerform]) return; - self.set = [self.set intersectionWithSet:set]; - - } else { - self.set = [NSMutableIndexSet indexSetWithIndexesInRange:NSMakeRange(0, self.string.length)]; - } + [self performInIndexSet:set]; for (JLScope *scope in self.scopes) { [scope.set removeIndexes:self.set]; } } -- (BOOL)shouldPerform +- (void)performInIndexSet:(NSMutableIndexSet *)set { - if ([self.delegate respondsToSelector:@selector(scopeShouldPerform:)]) return [self.delegate scopeShouldPerform:self]; - - if (self.triggeringCharacterSet) { - NSString *string = [self.delegate mergedModifiedStringForScope:self]; - if (!string) return YES; - if ([string rangeOfCharacterFromSet:self.triggeringCharacterSet].location == NSNotFound) { - return NO; - } - return YES; - } - return YES; + self.set = (set.count > 0) ? [self.set intersectionWithSet:set] : [NSMutableIndexSet indexSetWithIndexesInRange:NSMakeRange(0, self.string.length)]; } - (void)addSubscope:(JLScope *)scope diff --git a/Chromatism/Chromatism/JLTokenPattern.m b/Chromatism/Chromatism/JLTokenPattern.m index ae16ccb..b6a1cdb 100644 --- a/Chromatism/Chromatism/JLTokenPattern.m +++ b/Chromatism/Chromatism/JLTokenPattern.m @@ -27,7 +27,7 @@ @interface JLScope () - (BOOL)shouldPerform; - +@property (nonatomic, strong) NSMutableIndexSet *backupSet; @property (nonatomic, readwrite, strong) NSString *string; @end @@ -85,20 +85,9 @@ - (void)setPattern:(NSString *)pattern #pragma mark - Perform -- (void)main +- (void)performInIndexSet:(NSMutableIndexSet *)set { - NSMutableIndexSet *set = [NSMutableIndexSet indexSet]; - for (JLScope *scope in self.scopes) { - [set addIndexes:scope.set]; - self.string = scope.string; - self.textStorage = scope.textStorage; - } - - if (![self shouldPerform]) return; - if (!self.expression) return; NSDictionary *attributes = [self.delegate attributesForScope:self]; - self.set = [self.set intersectionWithSet:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, self.textStorage.length)]]; - [self.set removeIndexes:set]; NSAssert(attributes, @""); [set enumerateRangesUsingBlock:^(NSRange range, BOOL *stop) { [self.expression enumerateMatchesInString:self.string options:self.matchingOptions range:range usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { @@ -108,10 +97,6 @@ - (void)main [self.set addIndexesInRange:[result rangeAtIndex:self.captureGroup]]; }]; }]; - - for (JLScope *scope in self.scopes) { - [scope.set removeIndexes:self.set]; - } } #pragma mark - Debugging diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index 11a0762..e0823d2 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -44,9 +44,6 @@ @interface JLTokenizer () -@property (nonatomic, strong) JLScope *documentScope; -@property (nonatomic, strong) JLScope *lineScope; -@property (nonatomic, strong) NSTimer *validationTimer; @property (nonatomic, strong) NSOperationQueue *operationQueue; @end @@ -85,20 +82,10 @@ - (void)textStorage:(NSTextStorage *)textStorage didProcessEditing:(NSTextStorag if (textStorage.editedMask == NSTextStorageEditedAttributes) return; [self tokenizeTextStorage:textStorage withRange:_editedLineRange]; -// [self setNeedsValidation:YES]; } #pragma mark - JLScope delegate -- (NSString *)mergedModifiedStringForScope:(JLScope *)scope -{ - NSString *newString = [scope.string substringWithRange:_editedLineRange]; - if (_oldString && newString) { - return [_oldString stringByAppendingString:newString]; - } - return nil; -} - - (NSDictionary *)attributesForScope:(JLScope *)scope { UIColor *color = self.colors[scope.type]; @@ -136,9 +123,6 @@ - (void)createScopes JLScope *documentScope = [JLScope new]; JLScope *lineScope = [JLScope new]; - self.documentScope = documentScope; - self.lineScope = lineScope; - [self.operationQueue addOperation:lineScope]; [self.operationQueue addOperation:documentScope]; From 05dfa16cdb2ef0abff089e8beddb196fe931dfa4 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Tue, 19 Nov 2013 00:06:54 +0100 Subject: [PATCH 125/140] Changed the way the scopes are created --- Chromatism/Chromatism/JLTokenizer.h | 4 ++++ Chromatism/Chromatism/JLTokenizer.m | 36 +++++++++++++++-------------- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/Chromatism/Chromatism/JLTokenizer.h b/Chromatism/Chromatism/JLTokenizer.h index c3f63d2..f6684c8 100644 --- a/Chromatism/Chromatism/JLTokenizer.h +++ b/Chromatism/Chromatism/JLTokenizer.h @@ -23,6 +23,10 @@ typedef NS_ENUM(NSInteger, JLTokenizerIntendtationAction) { @interface JLTokenizer : NSObject +/// Override these two methods and add your own scopes and tokenPatterns +- (void)prepareDocumentScope:(JLScope *)documentScope; +- (void)prepareLineScope:(JLScope *)lineScope; + - (void)tokenizeTextStorage:(NSTextStorage *)textStorage withRange:(NSRange)range; - (void)tokenizeTextStorage:(NSTextStorage *)textStorage; diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index e0823d2..fdc6ba9 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -105,34 +105,37 @@ - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range [storage beginEditing]; [self.operationQueue setSuspended:YES]; - [self createScopes]; + + JLScope *documentScope = [JLScope new]; + JLScope *lineScope = [JLScope new]; + + [self prepareDocumentScope:documentScope]; + [self prepareLineScope:lineScope]; + [documentScope addSubscope:lineScope]; + + [self.operationQueue addOperation:lineScope]; + [self.operationQueue addOperation:documentScope]; [self clearColorAttributesInRange:range textStorage:storage]; - [self.documentScope setTextStorage:storage]; - [self.documentScope setSet:[NSMutableIndexSet indexSetWithIndexesInRange:NSMakeRange(0, storage.length)]]; - [self.lineScope setSet:[NSMutableIndexSet indexSetWithIndexesInRange:range]]; + [documentScope setTextStorage:storage]; + [documentScope setSet:[NSMutableIndexSet indexSetWithIndexesInRange:NSMakeRange(0, storage.length)]]; + [lineScope setSet:[NSMutableIndexSet indexSetWithIndexesInRange:range]]; [self.operationQueue setSuspended:NO]; [self.operationQueue waitUntilAllOperationsAreFinished]; [storage endEditing]; } -- (void)createScopes +- (void)prepareDocumentScope:(JLScope *)documentScope { - JLScope *documentScope = [JLScope new]; - JLScope *lineScope = [JLScope new]; - - [self.operationQueue addOperation:lineScope]; - [self.operationQueue addOperation:documentScope]; - - // Block and line comments JLTokenPattern *blockComment = [self addToken:JLTokenTypeComment withPattern:@"" andScope:documentScope]; blockComment.triggeringCharacterSet = [NSCharacterSet characterSetWithCharactersInString:@"/*"]; blockComment.expression = [NSRegularExpression regularExpressionWithPattern:@"/\\*.*?\\*/" options:NSRegularExpressionDotMatchesLineSeparators error:nil]; - - [lineScope addDependency:blockComment]; - +} + +- (void)prepareLineScope:(JLScope *)lineScope +{ [self addToken:JLTokenTypeComment withPattern:@"//.*+$" andScope:lineScope]; JLTokenPattern *preprocessor = [self addToken:JLTokenTypePreprocessor withPattern:@"^#.*+$" andScope:lineScope]; @@ -170,10 +173,9 @@ - (void)createScopes // Other Class Names [self addToken:JLTokenTypeOtherClassNames withPattern:@"\\b[A-Z]{3}[a-zA-Z]*\\b" andScope:lineScope]; - - [documentScope addSubscope:lineScope]; } + #pragma mark - Symbolication /* From 3fc67914f47508bf60b25b7303901d389d7b323b Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Tue, 19 Nov 2013 00:11:39 +0100 Subject: [PATCH 126/140] removed JLScopeDelegate entirely --- Chromatism/Chromatism/JLScope.h | 19 ------------------- Chromatism/Chromatism/JLTokenPattern.h | 2 ++ Chromatism/Chromatism/JLTokenPattern.m | 2 +- Chromatism/Chromatism/JLTokenizer.h | 2 +- Chromatism/Chromatism/JLTokenizer.m | 16 ++-------------- 5 files changed, 6 insertions(+), 35 deletions(-) diff --git a/Chromatism/Chromatism/JLScope.h b/Chromatism/Chromatism/JLScope.h index 2fa6f3f..0ff308b 100644 --- a/Chromatism/Chromatism/JLScope.h +++ b/Chromatism/Chromatism/JLScope.h @@ -24,8 +24,6 @@ #import -@protocol JLScopeDelegate; - @interface JLScope : NSOperation // Designated initializors @@ -77,21 +75,4 @@ */ @property (nonatomic, copy) NSString *type; -/** - * A simple delegate - */ -@property (nonatomic, weak) id delegate; - -/** - * If provided, the scope will only perform when matches of the set is found in the string returned from the -mergedModifiedStringForScope: delegate method. - */ -@property (nonatomic, strong) NSCharacterSet *triggeringCharacterSet; - -@end - -@protocol JLScopeDelegate -@optional - -- (NSDictionary *)attributesForScope:(JLScope *)scope; - @end diff --git a/Chromatism/Chromatism/JLTokenPattern.h b/Chromatism/Chromatism/JLTokenPattern.h index c6f3bb1..1ba099c 100644 --- a/Chromatism/Chromatism/JLTokenPattern.h +++ b/Chromatism/Chromatism/JLTokenPattern.h @@ -39,4 +39,6 @@ */ @property (nonatomic, assign) NSUInteger captureGroup; +@property (nonatomic, strong) UIColor *color; + @end diff --git a/Chromatism/Chromatism/JLTokenPattern.m b/Chromatism/Chromatism/JLTokenPattern.m index b6a1cdb..1971efd 100644 --- a/Chromatism/Chromatism/JLTokenPattern.m +++ b/Chromatism/Chromatism/JLTokenPattern.m @@ -87,7 +87,7 @@ - (void)setPattern:(NSString *)pattern - (void)performInIndexSet:(NSMutableIndexSet *)set { - NSDictionary *attributes = [self.delegate attributesForScope:self]; + NSDictionary *attributes = @{ NSForegroundColorAttributeName : self.color }; NSAssert(attributes, @""); [set enumerateRangesUsingBlock:^(NSRange range, BOOL *stop) { [self.expression enumerateMatchesInString:self.string options:self.matchingOptions range:range usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { diff --git a/Chromatism/Chromatism/JLTokenizer.h b/Chromatism/Chromatism/JLTokenizer.h index f6684c8..8dea206 100644 --- a/Chromatism/Chromatism/JLTokenizer.h +++ b/Chromatism/Chromatism/JLTokenizer.h @@ -21,7 +21,7 @@ typedef NS_ENUM(NSInteger, JLTokenizerIntendtationAction) { @protocol JLTokenizerDelegate; -@interface JLTokenizer : NSObject +@interface JLTokenizer : NSObject /// Override these two methods and add your own scopes and tokenPatterns - (void)prepareDocumentScope:(JLScope *)documentScope; diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index fdc6ba9..976356d 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -43,9 +43,7 @@ #import "Chromatism+Internal.h" @interface JLTokenizer () - @property (nonatomic, strong) NSOperationQueue *operationQueue; - @end @implementation JLTokenizer @@ -84,15 +82,6 @@ - (void)textStorage:(NSTextStorage *)textStorage didProcessEditing:(NSTextStorag [self tokenizeTextStorage:textStorage withRange:_editedLineRange]; } -#pragma mark - JLScope delegate - -- (NSDictionary *)attributesForScope:(JLScope *)scope -{ - UIColor *color = self.colors[scope.type]; - NSAssert(color, @"Didn't get a color for type: %@ in colorDictionary: %@",scope.type, self.colors); - return @{ NSForegroundColorAttributeName : color }; -} - #pragma mark - Tokenizing - (void)tokenizeTextStorage:(NSTextStorage *)textStorage @@ -103,7 +92,6 @@ - (void)tokenizeTextStorage:(NSTextStorage *)textStorage - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range { [storage beginEditing]; - [self.operationQueue setSuspended:YES]; JLScope *documentScope = [JLScope new]; @@ -111,6 +99,7 @@ - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range [self prepareDocumentScope:documentScope]; [self prepareLineScope:lineScope]; + [documentScope addSubscope:lineScope]; [self.operationQueue addOperation:lineScope]; @@ -130,7 +119,6 @@ - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range - (void)prepareDocumentScope:(JLScope *)documentScope { JLTokenPattern *blockComment = [self addToken:JLTokenTypeComment withPattern:@"" andScope:documentScope]; - blockComment.triggeringCharacterSet = [NSCharacterSet characterSetWithCharactersInString:@"/*"]; blockComment.expression = [NSRegularExpression regularExpressionWithPattern:@"/\\*.*?\\*/" options:NSRegularExpressionDotMatchesLineSeparators error:nil]; } @@ -197,7 +185,7 @@ - (JLTokenPattern *)addToken:(NSString *)type withPattern:(NSString *)pattern an JLTokenPattern *token = [JLTokenPattern tokenPatternWithPattern:pattern]; token.type = type; - token.delegate = self; + token.color = self.colors[type]; [token addScope:scope]; From e349dbabacab04149333b21b64041fac62e1a4f6 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Tue, 19 Nov 2013 00:21:44 +0100 Subject: [PATCH 127/140] added JLObjectiveCTokenizer --- .../Chromatism.xcodeproj/project.pbxproj | 50 +++++++++---- Chromatism/Chromatism/JLObjectiveCTokenizer.h | 13 ++++ Chromatism/Chromatism/JLObjectiveCTokenizer.m | 75 +++++++++++++++++++ Chromatism/Chromatism/JLTokenizer.h | 8 +- Chromatism/Chromatism/JLTokenizer.m | 41 +--------- 5 files changed, 133 insertions(+), 54 deletions(-) create mode 100644 Chromatism/Chromatism/JLObjectiveCTokenizer.h create mode 100644 Chromatism/Chromatism/JLObjectiveCTokenizer.m diff --git a/Chromatism/Chromatism.xcodeproj/project.pbxproj b/Chromatism/Chromatism.xcodeproj/project.pbxproj index d68c030..90d714d 100644 --- a/Chromatism/Chromatism.xcodeproj/project.pbxproj +++ b/Chromatism/Chromatism.xcodeproj/project.pbxproj @@ -37,6 +37,8 @@ 8FA0CB101795F41B00FF8EB1 /* JLTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FA0CB0E1795F41B00FF8EB1 /* JLTextView.m */; }; 8FE2796517C3842900DD933A /* UIColor+Chromatism.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FE2796317C3842900DD933A /* UIColor+Chromatism.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8FE2796617C3842900DD933A /* UIColor+Chromatism.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FE2796417C3842900DD933A /* UIColor+Chromatism.m */; }; + 8FFEB27D183AD6740032C9FB /* JLObjectiveCTokenizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FFEB27B183AD6740032C9FB /* JLObjectiveCTokenizer.h */; }; + 8FFEB27E183AD6740032C9FB /* JLObjectiveCTokenizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FFEB27C183AD6740032C9FB /* JLObjectiveCTokenizer.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -77,12 +79,14 @@ 8F3AB9581781C1250023348A /* JLTokenPattern.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JLTokenPattern.m; sourceTree = ""; }; 8F3AB95F1781C12F0023348A /* test.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = test.json; sourceTree = ""; }; 8F3AB9611781C26A0023348A /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 8F9F6BC61822F09D00DE15A8 /* JLDiffTokenizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JLDiffTokenizer.h; path = ../../../Chromatism/Chromatism/Chromatism/JLDiffTokenizer.h; sourceTree = ""; }; - 8F9F6BC71822F09D00DE15A8 /* JLDiffTokenizer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = JLDiffTokenizer.m; path = ../../../Chromatism/Chromatism/Chromatism/JLDiffTokenizer.m; sourceTree = ""; }; + 8F9F6BC61822F09D00DE15A8 /* JLDiffTokenizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JLDiffTokenizer.h; sourceTree = ""; }; + 8F9F6BC71822F09D00DE15A8 /* JLDiffTokenizer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JLDiffTokenizer.m; sourceTree = ""; }; 8FA0CB0D1795F41B00FF8EB1 /* JLTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JLTextView.h; sourceTree = ""; }; 8FA0CB0E1795F41B00FF8EB1 /* JLTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JLTextView.m; sourceTree = ""; }; 8FE2796317C3842900DD933A /* UIColor+Chromatism.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIColor+Chromatism.h"; sourceTree = ""; }; 8FE2796417C3842900DD933A /* UIColor+Chromatism.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIColor+Chromatism.m"; sourceTree = ""; }; + 8FFEB27B183AD6740032C9FB /* JLObjectiveCTokenizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JLObjectiveCTokenizer.h; sourceTree = ""; }; + 8FFEB27C183AD6740032C9FB /* JLObjectiveCTokenizer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JLObjectiveCTokenizer.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -141,23 +145,14 @@ 8F3AB91D1781C0BA0023348A /* Chromatism */ = { isa = PBXGroup; children = ( - 8F3AB9201781C0BA0023348A /* Chromatism.h */, - 32102EE017A948F900CFA161 /* Chromatism+Internal.h */, - 8F3AB9221781C0BA0023348A /* Chromatism.m */, - 8F3AB9551781C1250023348A /* JLTokenizer.h */, - 8F3AB9561781C1250023348A /* JLTokenizer.m */, - 8F9F6BC61822F09D00DE15A8 /* JLDiffTokenizer.h */, - 8F9F6BC71822F09D00DE15A8 /* JLDiffTokenizer.m */, + 8FFEB280183AD6970032C9FB /* General */, + 8FFEB27F183AD68E0032C9FB /* Tokenizers */, 8F3AB9531781C1250023348A /* JLTextViewController.h */, 8F3AB9541781C1250023348A /* JLTextViewController.m */, 8FA0CB0D1795F41B00FF8EB1 /* JLTextView.h */, 8FA0CB0E1795F41B00FF8EB1 /* JLTextView.m */, - 8F3AB94D1781C1250023348A /* Helpers.h */, - 8F3AB94E1781C1250023348A /* Helpers.m */, 8F3AB94F1781C1250023348A /* JLScope.h */, 8F3AB9501781C1250023348A /* JLScope.m */, - 8FE2796317C3842900DD933A /* UIColor+Chromatism.h */, - 8FE2796417C3842900DD933A /* UIColor+Chromatism.m */, 8F3AB9571781C1250023348A /* JLTokenPattern.h */, 8F3AB9581781C1250023348A /* JLTokenPattern.m */, 8F3AB91E1781C0BA0023348A /* Supporting Files */, @@ -195,6 +190,33 @@ name = "Supporting Files"; sourceTree = ""; }; + 8FFEB27F183AD68E0032C9FB /* Tokenizers */ = { + isa = PBXGroup; + children = ( + 8F3AB9551781C1250023348A /* JLTokenizer.h */, + 8F3AB9561781C1250023348A /* JLTokenizer.m */, + 8FFEB27B183AD6740032C9FB /* JLObjectiveCTokenizer.h */, + 8FFEB27C183AD6740032C9FB /* JLObjectiveCTokenizer.m */, + 8F9F6BC61822F09D00DE15A8 /* JLDiffTokenizer.h */, + 8F9F6BC71822F09D00DE15A8 /* JLDiffTokenizer.m */, + ); + name = Tokenizers; + sourceTree = ""; + }; + 8FFEB280183AD6970032C9FB /* General */ = { + isa = PBXGroup; + children = ( + 8F3AB9201781C0BA0023348A /* Chromatism.h */, + 32102EE017A948F900CFA161 /* Chromatism+Internal.h */, + 8F3AB9221781C0BA0023348A /* Chromatism.m */, + 8F3AB94D1781C1250023348A /* Helpers.h */, + 8F3AB94E1781C1250023348A /* Helpers.m */, + 8FE2796317C3842900DD933A /* UIColor+Chromatism.h */, + 8FE2796417C3842900DD933A /* UIColor+Chromatism.m */, + ); + name = General; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -209,6 +231,7 @@ 8F54EF101781C788008C1609 /* Helpers.h in Headers */, 8FE2796517C3842900DD933A /* UIColor+Chromatism.h in Headers */, 8F54EF111781C788008C1609 /* JLScope.h in Headers */, + 8FFEB27D183AD6740032C9FB /* JLObjectiveCTokenizer.h in Headers */, 8F54EF131781C788008C1609 /* JLTextViewController.h in Headers */, 8F54EF141781C788008C1609 /* JLTokenizer.h in Headers */, 8F54EF151781C788008C1609 /* JLTokenPattern.h in Headers */, @@ -299,6 +322,7 @@ buildActionMask = 2147483647; files = ( 8F54EF241781CD87008C1609 /* JLTokenPattern.m in Sources */, + 8FFEB27E183AD6740032C9FB /* JLObjectiveCTokenizer.m in Sources */, 8F9F6BC91822F09D00DE15A8 /* JLDiffTokenizer.m in Sources */, 8F54EF201781CD87008C1609 /* JLScope.m in Sources */, 8FE2796617C3842900DD933A /* UIColor+Chromatism.m in Sources */, diff --git a/Chromatism/Chromatism/JLObjectiveCTokenizer.h b/Chromatism/Chromatism/JLObjectiveCTokenizer.h new file mode 100644 index 0000000..163c3cf --- /dev/null +++ b/Chromatism/Chromatism/JLObjectiveCTokenizer.h @@ -0,0 +1,13 @@ +// +// JLObjectiveCTokenizer.h +// Chromatism +// +// Created by Johannes Lund on 2013-11-19. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import + +@interface JLObjectiveCTokenizer : JLTokenizer + +@end diff --git a/Chromatism/Chromatism/JLObjectiveCTokenizer.m b/Chromatism/Chromatism/JLObjectiveCTokenizer.m new file mode 100644 index 0000000..82438dd --- /dev/null +++ b/Chromatism/Chromatism/JLObjectiveCTokenizer.m @@ -0,0 +1,75 @@ +// +// JLObjectiveCTokenizer.m +// Chromatism +// +// Created by Johannes Lund on 2013-11-19. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import "JLObjectiveCTokenizer.h" + +@implementation JLObjectiveCTokenizer + +- (void)prepareDocumentScope:(JLScope *)documentScope +{ + [super prepareDocumentScope:documentScope]; + + JLTokenPattern *blockComment = [self addToken:JLTokenTypeComment withPattern:@"" andScope:documentScope]; + blockComment.expression = [NSRegularExpression regularExpressionWithPattern:@"/\\*.*?\\*/" options:NSRegularExpressionDotMatchesLineSeparators error:nil]; +} + +- (void)prepareLineScope:(JLScope *)lineScope +{ + [super prepareLineScope:lineScope]; + + [self addToken:JLTokenTypeComment withPattern:@"//.*+$" andScope:lineScope]; + + JLTokenPattern *preprocessor = [self addToken:JLTokenTypePreprocessor withPattern:@"^#.*+$" andScope:lineScope]; + + // #import + // In xcode it only works for #import and #include, not all preprocessor statements. + [self addToken:JLTokenTypeString withPattern:@"<.*?>" andScope:preprocessor]; + + // Strings + [[self addToken:JLTokenTypeString withPattern:@"(\"|@\")[^\"\\n]*(@\"|\")" andScope:lineScope] addScope:preprocessor]; + + // Numbers + [self addToken:JLTokenTypeNumber withPattern:@"(?<=\\s)\\d+" andScope:lineScope]; + + // New literals, for example @[] + // TODO: Highlight the closing bracket too, but with some special "nested-token-pattern" + [[self addToken:JLTokenTypeNumber withPattern:@"@[\\[|\\{|\\(]" andScope:lineScope] setOpaque:NO]; + + // C function names + [[self addToken:JLTokenTypeOtherMethodNames withPattern:@"\\w+\\s*(?>\\(.*\\)" andScope:lineScope] setCaptureGroup:1]; + + // Dot notation + [[self addToken:JLTokenTypeOtherMethodNames withPattern:@"\\.(\\w+)" andScope:lineScope] setCaptureGroup:1]; + + // Method Calls + [[self addToken:JLTokenTypeOtherMethodNames withPattern:@"(\\w+)\\]" andScope:lineScope] setCaptureGroup:1]; + + // Method call parts + [[self addToken:JLTokenTypeOtherMethodNames withPattern:@"(?<=\\w+):" andScope:lineScope] setCaptureGroup:0]; + + NSString *keywords = @"true false yes no YES TRUE FALSE bool BOOL nil id void self NULL if else strong weak nonatomic atomic assign copy typedef enum auto break case const char continue do default double extern float for goto int long register return short signed sizeof static struct switch typedef union unsigned volatile while nonatomic atomic nonatomic readonly super"; + + [self addToken:JLTokenTypeKeyword withKeywords:keywords andScope:lineScope]; + [self addToken:JLTokenTypeKeyword withPattern:@"@[a-zA-Z0-9_]+" andScope:lineScope]; + + // Other Class Names + [self addToken:JLTokenTypeOtherClassNames withPattern:@"\\b[A-Z]{3}[a-zA-Z]*\\b" andScope:lineScope]; +} + +- (JLTokenizerIntendtationAction)intendationActionAfterReplacingTextInRange:(NSRange)range replacementText:(NSString *)text previousCharacter:(unichar)character textView:(UITextView *)textView; +{ + if (character == '{') { + return JLTokenizerIntendtationActionIncrease; + } else if (character == '}') { + return JLTokenizerIntendtationActionDecrease; + } else { + return JLTokenizerIntendtationActionNone; + } +} + +@end diff --git a/Chromatism/Chromatism/JLTokenizer.h b/Chromatism/Chromatism/JLTokenizer.h index 8dea206..228c77e 100644 --- a/Chromatism/Chromatism/JLTokenizer.h +++ b/Chromatism/Chromatism/JLTokenizer.h @@ -17,16 +17,20 @@ typedef NS_ENUM(NSInteger, JLTokenizerIntendtationAction) { JLTokenizerIntendtationActionNone = 0 } NS_ENUM_AVAILABLE_IOS(7_0); -@class TextViewChange, JLTextView; +@class TextViewChange, JLTextView, JLTokenPattern; @protocol JLTokenizerDelegate; @interface JLTokenizer : NSObject -/// Override these two methods and add your own scopes and tokenPatterns +// Override these two methods and add your own scopes and tokenPatterns - (void)prepareDocumentScope:(JLScope *)documentScope; - (void)prepareLineScope:(JLScope *)lineScope; +// Creates JLTokenPatterns and adds them to the operationQueue +- (JLTokenPattern *)addToken:(NSString *)type withPattern:(NSString *)pattern andScope:(JLScope *)scope; +- (JLTokenPattern *)addToken:(NSString *)type withKeywords:(NSString *)keywords andScope:(JLScope *)scope; + - (void)tokenizeTextStorage:(NSTextStorage *)textStorage withRange:(NSRange)range; - (void)tokenizeTextStorage:(NSTextStorage *)textStorage; diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index 976356d..8d9f824 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -118,49 +118,12 @@ - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range - (void)prepareDocumentScope:(JLScope *)documentScope { - JLTokenPattern *blockComment = [self addToken:JLTokenTypeComment withPattern:@"" andScope:documentScope]; - blockComment.expression = [NSRegularExpression regularExpressionWithPattern:@"/\\*.*?\\*/" options:NSRegularExpressionDotMatchesLineSeparators error:nil]; + } - (void)prepareLineScope:(JLScope *)lineScope { - [self addToken:JLTokenTypeComment withPattern:@"//.*+$" andScope:lineScope]; - - JLTokenPattern *preprocessor = [self addToken:JLTokenTypePreprocessor withPattern:@"^#.*+$" andScope:lineScope]; - - // #import - // In xcode it only works for #import and #include, not all preprocessor statements. - [self addToken:JLTokenTypeString withPattern:@"<.*?>" andScope:preprocessor]; - - // Strings - [[self addToken:JLTokenTypeString withPattern:@"(\"|@\")[^\"\\n]*(@\"|\")" andScope:lineScope] addScope:preprocessor]; - - // Numbers - [self addToken:JLTokenTypeNumber withPattern:@"(?<=\\s)\\d+" andScope:lineScope]; - - // New literals, for example @[] - // TODO: Highlight the closing bracket too, but with some special "nested-token-pattern" - [[self addToken:JLTokenTypeNumber withPattern:@"@[\\[|\\{|\\(]" andScope:lineScope] setOpaque:NO]; - - // C function names - [[self addToken:JLTokenTypeOtherMethodNames withPattern:@"\\w+\\s*(?>\\(.*\\)" andScope:lineScope] setCaptureGroup:1]; - - // Dot notation - [[self addToken:JLTokenTypeOtherMethodNames withPattern:@"\\.(\\w+)" andScope:lineScope] setCaptureGroup:1]; - - // Method Calls - [[self addToken:JLTokenTypeOtherMethodNames withPattern:@"(\\w+)\\]" andScope:lineScope] setCaptureGroup:1]; - - // Method call parts - [[self addToken:JLTokenTypeOtherMethodNames withPattern:@"(?<=\\w+):" andScope:lineScope] setCaptureGroup:0]; - - NSString *keywords = @"true false yes no YES TRUE FALSE bool BOOL nil id void self NULL if else strong weak nonatomic atomic assign copy typedef enum auto break case const char continue do default double extern float for goto int long register return short signed sizeof static struct switch typedef union unsigned volatile while nonatomic atomic nonatomic readonly super"; - - [self addToken:JLTokenTypeKeyword withKeywords:keywords andScope:lineScope]; - [self addToken:JLTokenTypeKeyword withPattern:@"@[a-zA-Z0-9_]+" andScope:lineScope]; - - // Other Class Names - [self addToken:JLTokenTypeOtherClassNames withPattern:@"\\b[A-Z]{3}[a-zA-Z]*\\b" andScope:lineScope]; + } From bc41293095dc0a41724ff4c0e82c0f257ddb46d4 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Tue, 19 Nov 2013 00:28:07 +0100 Subject: [PATCH 128/140] Categories and stuff --- .../Chromatism.xcodeproj/project.pbxproj | 8 +++++ Chromatism/Chromatism/JLTokenizer+Additions.h | 17 +++++++++++ Chromatism/Chromatism/JLTokenizer+Additions.m | 29 +++++++++++++++++++ 3 files changed, 54 insertions(+) create mode 100644 Chromatism/Chromatism/JLTokenizer+Additions.h create mode 100644 Chromatism/Chromatism/JLTokenizer+Additions.m diff --git a/Chromatism/Chromatism.xcodeproj/project.pbxproj b/Chromatism/Chromatism.xcodeproj/project.pbxproj index 90d714d..6ef5c26 100644 --- a/Chromatism/Chromatism.xcodeproj/project.pbxproj +++ b/Chromatism/Chromatism.xcodeproj/project.pbxproj @@ -39,6 +39,8 @@ 8FE2796617C3842900DD933A /* UIColor+Chromatism.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FE2796417C3842900DD933A /* UIColor+Chromatism.m */; }; 8FFEB27D183AD6740032C9FB /* JLObjectiveCTokenizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FFEB27B183AD6740032C9FB /* JLObjectiveCTokenizer.h */; }; 8FFEB27E183AD6740032C9FB /* JLObjectiveCTokenizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FFEB27C183AD6740032C9FB /* JLObjectiveCTokenizer.m */; }; + 8FFEB283183AD8B70032C9FB /* JLTokenizer+Additions.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FFEB281183AD8B70032C9FB /* JLTokenizer+Additions.h */; }; + 8FFEB284183AD8B70032C9FB /* JLTokenizer+Additions.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FFEB282183AD8B70032C9FB /* JLTokenizer+Additions.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -87,6 +89,8 @@ 8FE2796417C3842900DD933A /* UIColor+Chromatism.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIColor+Chromatism.m"; sourceTree = ""; }; 8FFEB27B183AD6740032C9FB /* JLObjectiveCTokenizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JLObjectiveCTokenizer.h; sourceTree = ""; }; 8FFEB27C183AD6740032C9FB /* JLObjectiveCTokenizer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JLObjectiveCTokenizer.m; sourceTree = ""; }; + 8FFEB281183AD8B70032C9FB /* JLTokenizer+Additions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "JLTokenizer+Additions.h"; sourceTree = ""; }; + 8FFEB282183AD8B70032C9FB /* JLTokenizer+Additions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "JLTokenizer+Additions.m"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -195,6 +199,8 @@ children = ( 8F3AB9551781C1250023348A /* JLTokenizer.h */, 8F3AB9561781C1250023348A /* JLTokenizer.m */, + 8FFEB281183AD8B70032C9FB /* JLTokenizer+Additions.h */, + 8FFEB282183AD8B70032C9FB /* JLTokenizer+Additions.m */, 8FFEB27B183AD6740032C9FB /* JLObjectiveCTokenizer.h */, 8FFEB27C183AD6740032C9FB /* JLObjectiveCTokenizer.m */, 8F9F6BC61822F09D00DE15A8 /* JLDiffTokenizer.h */, @@ -232,6 +238,7 @@ 8FE2796517C3842900DD933A /* UIColor+Chromatism.h in Headers */, 8F54EF111781C788008C1609 /* JLScope.h in Headers */, 8FFEB27D183AD6740032C9FB /* JLObjectiveCTokenizer.h in Headers */, + 8FFEB283183AD8B70032C9FB /* JLTokenizer+Additions.h in Headers */, 8F54EF131781C788008C1609 /* JLTextViewController.h in Headers */, 8F54EF141781C788008C1609 /* JLTokenizer.h in Headers */, 8F54EF151781C788008C1609 /* JLTokenPattern.h in Headers */, @@ -324,6 +331,7 @@ 8F54EF241781CD87008C1609 /* JLTokenPattern.m in Sources */, 8FFEB27E183AD6740032C9FB /* JLObjectiveCTokenizer.m in Sources */, 8F9F6BC91822F09D00DE15A8 /* JLDiffTokenizer.m in Sources */, + 8FFEB284183AD8B70032C9FB /* JLTokenizer+Additions.m in Sources */, 8F54EF201781CD87008C1609 /* JLScope.m in Sources */, 8FE2796617C3842900DD933A /* UIColor+Chromatism.m in Sources */, 8FA0CB101795F41B00FF8EB1 /* JLTextView.m in Sources */, diff --git a/Chromatism/Chromatism/JLTokenizer+Additions.h b/Chromatism/Chromatism/JLTokenizer+Additions.h new file mode 100644 index 0000000..25a87b0 --- /dev/null +++ b/Chromatism/Chromatism/JLTokenizer+Additions.h @@ -0,0 +1,17 @@ +// +// JLTokenizer+Additions.h +// Chromatism +// +// Created by Johannes Lund on 2013-11-19. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import + +@class JLObjectiveCTokenizer; + +@interface JLTokenizer (Additions) + ++ (JLObjectiveCTokenizer *)objectiveCTokenizer; + +@end diff --git a/Chromatism/Chromatism/JLTokenizer+Additions.m b/Chromatism/Chromatism/JLTokenizer+Additions.m new file mode 100644 index 0000000..cd8ff38 --- /dev/null +++ b/Chromatism/Chromatism/JLTokenizer+Additions.m @@ -0,0 +1,29 @@ +// +// JLTokenizer+Additions.m +// Chromatism +// +// Created by Johannes Lund on 2013-11-19. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import "JLTokenizer+Additions.h" +#import "JLObjectiveCTokenizer.h" + +@implementation JLTokenizer (Additions) + ++ (JLObjectiveCTokenizer *)objectiveCTokenizer +{ + return [[JLObjectiveCTokenizer alloc] init]; +} + +// For now, let every JLTokenizer be created as a JLObjectiveCTokenizer + ++ (id)alloc +{ + if ([self class] == [JLTokenizer class]) { + return [JLObjectiveCTokenizer alloc]; + } + return [super alloc]; +} + +@end From 165fe451e357c4a989d5fe95bd8544c3d6e4fbee Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Tue, 19 Nov 2013 00:35:17 +0100 Subject: [PATCH 129/140] More Cleaning --- Chromatism/Chromatism/JLTokenizer.m | 133 +++++++++++----------------- 1 file changed, 53 insertions(+), 80 deletions(-) diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index 8d9f824..29b81f7 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -47,11 +47,6 @@ @interface JLTokenizer () @end @implementation JLTokenizer -{ - NSRange _editedRange; - NSRange _editedLineRange; - NSString *_oldString; -} #pragma mark - Setup @@ -74,14 +69,55 @@ - (void)textStorage:(NSTextStorage *)textStorage willProcessEditing:(NSTextStora - (void)textStorage:(NSTextStorage *)textStorage didProcessEditing:(NSTextStorageEditActions)editedMask range:(NSRange)editedRange changeInLength:(NSInteger)delta { - _editedRange = editedRange; - _editedLineRange = [textStorage.string lineRangeForRange:editedRange]; - if (textStorage.editedMask == NSTextStorageEditedAttributes) return; + [self tokenizeTextStorage:textStorage withRange:[textStorage.string lineRangeForRange:editedRange]]; +} + +#pragma mark - NSLayoutManager delegeate + +- (CGFloat)layoutManager:(NSLayoutManager *)layoutManager paragraphSpacingBeforeGlyphAtIndex:(NSUInteger)glyphIndex withProposedLineFragmentRect:(CGRect)rect +{ + return 0; +} + +- (BOOL)layoutManager:(NSLayoutManager *)layoutManager shouldBreakLineByWordBeforeCharacterAtIndex:(NSUInteger)charIndex +{ + unichar character = [layoutManager.textStorage.string characterAtIndex:charIndex]; + if (character == '*') return NO; + return YES; +} + +#pragma mark - UITextViewDelegate + +- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text +{ + if (![text isEqualToString:@"\n"]) return YES; // Something else than return + + // Return has been pressed, start the new line with as many tabs or white spaces as the previous one. + NSString *prefixString = [@"\n" stringByAppendingString:[self prefixStringFromRange:range inTextView:textView]]; + + unichar previousCharacter = [textView.text characterAtIndex:range.location - 1]; + switch ([self intendationActionAfterReplacingTextInRange:range replacementText:text previousCharacter:previousCharacter textView:textView]) { + case JLTokenizerIntendtationActionIncrease: + prefixString = [prefixString stringByAppendingString:@" "]; + break; + case JLTokenizerIntendtationActionDecrease: + if ([[prefixString substringFromIndex:prefixString.length - 4] isEqualToString:@" "]) { + prefixString = [prefixString substringToIndex:prefixString.length - 4]; + } + else if ([[prefixString substringFromIndex:prefixString.length - 1] isEqualToString:@"\t"]) { + prefixString = [prefixString substringToIndex:prefixString.length - 1]; + } + break; + case JLTokenizerIntendtationActionNone: + break; + } - [self tokenizeTextStorage:textStorage withRange:_editedLineRange]; + [textView replaceRange:[self rangeWithRange:range inTextView:textView] withText:prefixString]; + return NO; } + #pragma mark - Tokenizing - (void)tokenizeTextStorage:(NSTextStorage *)textStorage @@ -116,6 +152,8 @@ - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range [storage endEditing]; } +#pragma mark - Setup Token Patterns + - (void)prepareDocumentScope:(JLScope *)documentScope { @@ -175,63 +213,6 @@ - (NSMutableArray *)symbolsWithPattern:(NSString *)pattern captureGroup:(int)gro return array; } -- (void)clearColorAttributesInRange:(NSRange)range textStorage:(NSTextStorage *)storage; -{ - [storage removeAttribute:NSForegroundColorAttributeName range:range]; - [storage addAttribute:NSForegroundColorAttributeName value:self.colors[JLTokenTypeText] range:range]; -} - -#pragma mark - UITextViewDelegate - -- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text -{ - _oldString = nil; - - if (range.length == 0 && text.length == 1) { - // A normal character typed - } - else if (range.length == 1 && text.length == 0) { - // Backspace - } - else { - // Multicharacter edit - } - - if ([text isEqualToString:@"\n"]) { - // Return - // Start the new line with as many tabs or white spaces as the previous one. - - NSString *prefixString = [@"\n" stringByAppendingString:[self prefixStringFromRange:range inTextView:textView]]; - - unichar previousCharacter = [textView.text characterAtIndex:range.location - 1]; - switch ([self intendationActionAfterReplacingTextInRange:range replacementText:text previousCharacter:previousCharacter textView:textView]) { - case JLTokenizerIntendtationActionIncrease: - prefixString = [prefixString stringByAppendingString:@" "]; - break; - case JLTokenizerIntendtationActionDecrease: - if ([[prefixString substringFromIndex:prefixString.length - 4] isEqualToString:@" "]) { - prefixString = [prefixString substringToIndex:prefixString.length - 4]; - } - else if ([[prefixString substringFromIndex:prefixString.length - 1] isEqualToString:@"\t"]) { - prefixString = [prefixString substringToIndex:prefixString.length - 1]; - } - break; - case JLTokenizerIntendtationActionNone: - break; - } - - [textView replaceRange:[self rangeWithRange:range inTextView:textView] withText:prefixString]; - return NO; - } - - if (range.length > 0) { - _oldString = [textView.text substringWithRange:range]; - } - else _oldString = @""; - - return YES; -} - - (JLTokenizerIntendtationAction)intendationActionAfterReplacingTextInRange:(NSRange)range replacementText:(NSString *)text previousCharacter:(unichar)character textView:(UITextView *)textView; { if (character == '{') { @@ -254,6 +235,12 @@ - (UITextRange *)rangeWithRange:(NSRange)range inTextView:(UITextView *)textView return [textView textRangeFromPosition:start toPosition:stop]; } +- (void)clearColorAttributesInRange:(NSRange)range textStorage:(NSTextStorage *)storage; +{ + [storage removeAttribute:NSForegroundColorAttributeName range:range]; + [storage addAttribute:NSForegroundColorAttributeName value:self.colors[JLTokenTypeText] range:range]; +} + - (NSString *)prefixStringFromRange:(NSRange)range inTextView:(UITextView *)textView { NSRange lineRange = [textView.text lineRangeForRange:range]; @@ -261,18 +248,4 @@ - (NSString *)prefixStringFromRange:(NSRange)range inTextView:(UITextView *)text return [textView.text substringWithRange:prefixRange]; } -#pragma mark - NSLayoutManager delegeate - -- (CGFloat)layoutManager:(NSLayoutManager *)layoutManager paragraphSpacingBeforeGlyphAtIndex:(NSUInteger)glyphIndex withProposedLineFragmentRect:(CGRect)rect -{ - return 0; -} - -- (BOOL)layoutManager:(NSLayoutManager *)layoutManager shouldBreakLineByWordBeforeCharacterAtIndex:(NSUInteger)charIndex -{ - unichar character = [layoutManager.textStorage.string characterAtIndex:charIndex]; - if (character == '*') return NO; - return YES; -} - @end From 94b92639d14661f109b2a240a51c2580fd3f5680 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Tue, 19 Nov 2013 10:40:34 +0100 Subject: [PATCH 130/140] Refactoring --- Chromatism/Chromatism/JLTokenPattern.h | 8 ++---- Chromatism/Chromatism/JLTokenPattern.m | 34 +++----------------------- Chromatism/Chromatism/JLTokenizer.m | 11 ++++++++- 3 files changed, 15 insertions(+), 38 deletions(-) diff --git a/Chromatism/Chromatism/JLTokenPattern.h b/Chromatism/Chromatism/JLTokenPattern.h index 1ba099c..9e88804 100644 --- a/Chromatism/Chromatism/JLTokenPattern.h +++ b/Chromatism/Chromatism/JLTokenPattern.h @@ -26,17 +26,13 @@ @interface JLTokenPattern : JLScope -+ (instancetype)tokenPatternWithPattern:(NSString *)pattern; ++ (instancetype)tokenPatternWithRegularExpression:(NSRegularExpression *)expressino;; -// Setting either expression or pattern causes the other one to update. @property (nonatomic, strong) NSRegularExpression *expression; -@property (nonatomic, copy) NSString *pattern; @property (nonatomic, assign) NSMatchingOptions matchingOptions; -/** - * The index of the capture group which will be used as result from the regex search. Default is 0. - */ +/// The index of the capture group which will be used as result from the regex search. Default is 0. @property (nonatomic, assign) NSUInteger captureGroup; @property (nonatomic, strong) UIColor *color; diff --git a/Chromatism/Chromatism/JLTokenPattern.m b/Chromatism/Chromatism/JLTokenPattern.m index 1971efd..2b61f5c 100644 --- a/Chromatism/Chromatism/JLTokenPattern.m +++ b/Chromatism/Chromatism/JLTokenPattern.m @@ -37,23 +37,10 @@ @implementation JLTokenPattern static NSCache *cache; -+ (instancetype)tokenPatternWithPattern:(NSString *)pattern ++ (instancetype)tokenPatternWithRegularExpression:(NSRegularExpression *)expression; { - if (!cache) { - cache = [NSCache new]; - } - JLTokenPattern *tokenPattern = [JLTokenPattern new]; - NSRegularExpression *expression = [cache objectForKey:pattern]; - if (expression) { - tokenPattern->_expression = expression; - tokenPattern->_pattern = pattern; - } else { - tokenPattern.pattern = pattern; - if (tokenPattern.expression) { - [cache setObject:tokenPattern.expression forKey:pattern]; - } - } + tokenPattern.expression = expression; return tokenPattern; } @@ -68,21 +55,6 @@ - (id)init return self; } -#pragma mark - Regular Expression - -- (void)setExpression:(NSRegularExpression *)expression -{ - _expression = expression; - _pattern = expression.pattern; -} - -- (void)setPattern:(NSString *)pattern -{ - if (!pattern) return; - _pattern = pattern; - _expression = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionAnchorsMatchLines error:nil]; -} - #pragma mark - Perform - (void)performInIndexSet:(NSMutableIndexSet *)set @@ -104,7 +76,7 @@ - (void)performInIndexSet:(NSMutableIndexSet *)set - (NSString *)description { NSString *subscopes = [[[[self.dependencies valueForKey:@"description"] componentsJoinedByString:@"\n"] componentsSeparatedByString:@"\n"] componentsJoinedByString:@"\n\t\t"]; - return [NSString stringWithFormat:@"%@, %@, Regex Pattern: %@, opaque: %i, indexesSet:%@ \nsubscopes, %@", NSStringFromClass(self.class), self.identifier, self.pattern, self.opaque, self.set, subscopes]; + return [NSString stringWithFormat:@"%@, %@, Regex Pattern: %@, opaque: %i, indexesSet:%@ \nsubscopes, %@", NSStringFromClass(self.class), self.identifier, self.expression, self.opaque, self.set, subscopes]; } @end diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index 29b81f7..ac7a602 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -44,6 +44,7 @@ @interface JLTokenizer () @property (nonatomic, strong) NSOperationQueue *operationQueue; +@property (nonatomic, strong) NSMutableDictionary *expressions; @end @implementation JLTokenizer @@ -184,7 +185,15 @@ - (JLTokenPattern *)addToken:(NSString *)type withPattern:(NSString *)pattern an NSParameterAssert(pattern); NSParameterAssert(scope); - JLTokenPattern *token = [JLTokenPattern tokenPatternWithPattern:pattern]; + NSRegularExpression *expression = self.expressions[pattern]; + if (expression) { + self.expressions[pattern] = expression; + } else { + expression = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionAnchorsMatchLines error:NULL]; + self.expressions[pattern] = expression; + } + + JLTokenPattern *token = [JLTokenPattern tokenPatternWithRegularExpression:expression]; token.type = type; token.color = self.colors[type]; From 7b0a6d9352014be3158c5a733e7414e0b1fa24c0 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Tue, 19 Nov 2013 10:45:26 +0100 Subject: [PATCH 131/140] renamed syntaxTokenizer to tokenizer --- Chromatism/Chromatism/JLTextView.h | 2 +- Chromatism/Chromatism/JLTextView.m | 26 +++++++++++--------- Chromatism/Chromatism/JLTextViewController.m | 2 +- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/Chromatism/Chromatism/JLTextView.h b/Chromatism/Chromatism/JLTextView.h index e11b3cb..04891d8 100644 --- a/Chromatism/Chromatism/JLTextView.h +++ b/Chromatism/Chromatism/JLTextView.h @@ -30,6 +30,6 @@ @interface JLTextView : UITextView -@property (nonatomic, strong) JLTokenizer *syntaxTokenizer; +@property (nonatomic, strong) JLTokenizer *tokenizer; @property (nonatomic, assign) JLTokenizerTheme theme; @end diff --git a/Chromatism/Chromatism/JLTextView.m b/Chromatism/Chromatism/JLTextView.m index 51a5cda..ef2daf1 100644 --- a/Chromatism/Chromatism/JLTextView.m +++ b/Chromatism/Chromatism/JLTextView.m @@ -27,7 +27,7 @@ #import "Chromatism.h" @implementation JLTextView -@synthesize theme = _theme; +@synthesize theme = _theme, tokenizer = _tokenizer; #pragma mark - Initialization & Setup @@ -70,14 +70,9 @@ - (id)initWithCoder:(NSCoder *)aDecoder - (void)setup { // Setup tokenizer - self.syntaxTokenizer = [[JLTokenizer alloc] init]; - self.textStorage.delegate = self.syntaxTokenizer; + self.tokenizer = [[JLTokenizer alloc] init]; self.theme = JLTokenizerThemeDusk; - // Delegates - self.layoutManager.delegate = self.syntaxTokenizer; - self.delegate = self.syntaxTokenizer; - // Set default properties self.scrollEnabled = YES; self.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive; @@ -87,20 +82,29 @@ - (void)setup } +- (void)setTokenizer:(JLTokenizer *)tokenizer +{ + _tokenizer = tokenizer; + + self.textStorage.delegate = self.tokenizer; + self.layoutManager.delegate = self.tokenizer; + self.delegate = self.tokenizer; +} + #pragma mark - Color Themes -(void)setTheme:(JLTokenizerTheme)theme { - self.syntaxTokenizer.colors = [Chromatism colorsForTheme:theme]; - self.typingAttributes = @{ NSForegroundColorAttributeName : self.syntaxTokenizer.colors[JLTokenTypeText]}; + self.tokenizer.colors = [Chromatism colorsForTheme:theme]; + self.typingAttributes = @{ NSForegroundColorAttributeName : self.tokenizer.colors[JLTokenTypeText]}; _theme = theme; //Set font, text color and background color back to default - UIColor *backgroundColor = self.syntaxTokenizer.colors[JLTokenTypeBackground]; + UIColor *backgroundColor = self.tokenizer.colors[JLTokenTypeBackground]; [self setBackgroundColor:backgroundColor ? backgroundColor : [UIColor whiteColor] ]; // Refresh Tokenization - [self.syntaxTokenizer tokenizeTextStorage:self.textStorage withRange:NSMakeRange(0, self.textStorage.length)]; + [self.tokenizer tokenizeTextStorage:self.textStorage withRange:NSMakeRange(0, self.textStorage.length)]; } - (JLTokenizerTheme)theme diff --git a/Chromatism/Chromatism/JLTextViewController.m b/Chromatism/Chromatism/JLTextViewController.m index 2f77cc5..f2f6041 100644 --- a/Chromatism/Chromatism/JLTextViewController.m +++ b/Chromatism/Chromatism/JLTextViewController.m @@ -66,7 +66,7 @@ - (JLTextView *)textView - (JLTokenizer *)tokenizer { - return self.textView.syntaxTokenizer; + return self.textView.tokenizer; } - (void)viewDidLoad From 386fd9623c08ded75c67c23cb0c7c40bc7b1309a Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Sat, 23 Nov 2013 19:48:51 +0100 Subject: [PATCH 132/140] Add -fetchParticipation --- Chromatism/Chromatism/JLDiffTokenizer.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Chromatism/Chromatism/JLDiffTokenizer.h b/Chromatism/Chromatism/JLDiffTokenizer.h index 12c2fe8..e98ef85 100644 --- a/Chromatism/Chromatism/JLDiffTokenizer.h +++ b/Chromatism/Chromatism/JLDiffTokenizer.h @@ -9,6 +9,8 @@ #import /// Very unsure about the idea of this class -@interface JLDiffTokenizer : JLTokenizer +@interface JLDiffTokenizer : NSObject + ++ (NSMutableAttributedString *)tokenizeString:(NSString *)string withDefaultAttributes:(NSDictionary *)attributes; @end From 8e17f792caa15242234a57f2b71e209e9f8376e6 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Wed, 27 Nov 2013 22:38:52 +0100 Subject: [PATCH 133/140] =?UTF-8?q?Just=20some=20refactoring=20and=20chang?= =?UTF-8?q?e=20of=20=E2=80=99tokenizer=E2=80=99=20back=20to=20=E2=80=99syn?= =?UTF-8?q?taxTokeniezer=E2=80=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Chromatism/Chromatism/JLObjectiveCTokenizer.m | 8 +++++ Chromatism/Chromatism/JLScope.h | 4 ++- Chromatism/Chromatism/JLScope.m | 11 ++++++ Chromatism/Chromatism/JLTextView.h | 2 +- Chromatism/Chromatism/JLTextView.m | 22 ++++++------ Chromatism/Chromatism/JLTokenizer.h | 9 +++-- Chromatism/Chromatism/JLTokenizer.m | 35 +++++++++---------- 7 files changed, 57 insertions(+), 34 deletions(-) diff --git a/Chromatism/Chromatism/JLObjectiveCTokenizer.m b/Chromatism/Chromatism/JLObjectiveCTokenizer.m index 82438dd..503530f 100644 --- a/Chromatism/Chromatism/JLObjectiveCTokenizer.m +++ b/Chromatism/Chromatism/JLObjectiveCTokenizer.m @@ -61,6 +61,14 @@ - (void)prepareLineScope:(JLScope *)lineScope [self addToken:JLTokenTypeOtherClassNames withPattern:@"\\b[A-Z]{3}[a-zA-Z]*\\b" andScope:lineScope]; } +#pragma mark - Symbolication + + - (void)symbolicate + { +// [self.scopes[PROJECT_CLASS_NAMES] setPattern:[NSString stringWithFormat:@"\\b(%@)\\b", [[self symbolsWithPattern:@"^@implementation (\\w+)" captureGroup:1] componentsJoinedByString:@"|"]]]; +// [self.scopes[PROJECT_METHOD_NAMES] setPattern:[NSString stringWithFormat:@"\\b(%@)\\b", [[self symbolsWithPattern:@"^@property \\(.*?\\)\\s*\\w+[\\s*]+(\\w+);" captureGroup:1] componentsJoinedByString:@"|"]]]; + } + - (JLTokenizerIntendtationAction)intendationActionAfterReplacingTextInRange:(NSRange)range replacementText:(NSString *)text previousCharacter:(unichar)character textView:(UITextView *)textView; { if (character == '{') { diff --git a/Chromatism/Chromatism/JLScope.h b/Chromatism/Chromatism/JLScope.h index 0ff308b..2615624 100644 --- a/Chromatism/Chromatism/JLScope.h +++ b/Chromatism/Chromatism/JLScope.h @@ -32,13 +32,15 @@ @property (nonatomic, strong) NSMutableIndexSet *set; - /// Used by subclasses - (void)performInIndexSet:(NSMutableIndexSet *)set; - (void)addSubscope:(JLScope *)scope; - (void)addScope:(JLScope *)scope; +/// Returns a set of ALL subscopes recursivly. The instance-scope adds itself to the set as well. +- (NSMutableSet *)recursiveSubscopes; + /// NSHashTable with weak references to parent scopes @property (nonatomic, strong) NSHashTable *scopes; diff --git a/Chromatism/Chromatism/JLScope.m b/Chromatism/Chromatism/JLScope.m index b9b2235..020b35f 100644 --- a/Chromatism/Chromatism/JLScope.m +++ b/Chromatism/Chromatism/JLScope.m @@ -110,6 +110,17 @@ - (void)addScope:(JLScope *)scope [scope addSubscope:self]; } +- (NSMutableSet *)recursiveSubscopes +{ + NSMutableSet *recursiveSubscopes = [NSMutableSet setWithObject:self]; + for (JLScope *scope in self.subscopes) { + for (JLScope *aScope in [scope recursiveSubscopes]) { + [recursiveSubscopes addObject:aScope]; + } + } + return recursiveSubscopes; +} + #pragma mark - Properties - (NSString *)string diff --git a/Chromatism/Chromatism/JLTextView.h b/Chromatism/Chromatism/JLTextView.h index 04891d8..e11b3cb 100644 --- a/Chromatism/Chromatism/JLTextView.h +++ b/Chromatism/Chromatism/JLTextView.h @@ -30,6 +30,6 @@ @interface JLTextView : UITextView -@property (nonatomic, strong) JLTokenizer *tokenizer; +@property (nonatomic, strong) JLTokenizer *syntaxTokenizer; @property (nonatomic, assign) JLTokenizerTheme theme; @end diff --git a/Chromatism/Chromatism/JLTextView.m b/Chromatism/Chromatism/JLTextView.m index ef2daf1..e189f65 100644 --- a/Chromatism/Chromatism/JLTextView.m +++ b/Chromatism/Chromatism/JLTextView.m @@ -27,7 +27,7 @@ #import "Chromatism.h" @implementation JLTextView -@synthesize theme = _theme, tokenizer = _tokenizer; +@synthesize theme = _theme; #pragma mark - Initialization & Setup @@ -70,7 +70,7 @@ - (id)initWithCoder:(NSCoder *)aDecoder - (void)setup { // Setup tokenizer - self.tokenizer = [[JLTokenizer alloc] init]; + self.syntaxTokenizer = [[JLTokenizer alloc] init]; self.theme = JLTokenizerThemeDusk; // Set default properties @@ -82,29 +82,29 @@ - (void)setup } -- (void)setTokenizer:(JLTokenizer *)tokenizer +- (void)setSyntaxTokenizer:(JLTokenizer *)tokenizer { - _tokenizer = tokenizer; + _syntaxTokenizer = tokenizer; - self.textStorage.delegate = self.tokenizer; - self.layoutManager.delegate = self.tokenizer; - self.delegate = self.tokenizer; + self.textStorage.delegate = self.syntaxTokenizer; + self.layoutManager.delegate = self.syntaxTokenizer; + self.delegate = self.syntaxTokenizer; } #pragma mark - Color Themes -(void)setTheme:(JLTokenizerTheme)theme { - self.tokenizer.colors = [Chromatism colorsForTheme:theme]; - self.typingAttributes = @{ NSForegroundColorAttributeName : self.tokenizer.colors[JLTokenTypeText]}; + self.syntaxTokenizer.colors = [Chromatism colorsForTheme:theme]; + self.typingAttributes = @{ NSForegroundColorAttributeName : self.syntaxTokenizer.colors[JLTokenTypeText]}; _theme = theme; //Set font, text color and background color back to default - UIColor *backgroundColor = self.tokenizer.colors[JLTokenTypeBackground]; + UIColor *backgroundColor = self.syntaxTokenizer.colors[JLTokenTypeBackground]; [self setBackgroundColor:backgroundColor ? backgroundColor : [UIColor whiteColor] ]; // Refresh Tokenization - [self.tokenizer tokenizeTextStorage:self.textStorage withRange:NSMakeRange(0, self.textStorage.length)]; + [self.syntaxTokenizer refreshTokenizationOfTextStorage:self.textStorage]; } - (JLTokenizerTheme)theme diff --git a/Chromatism/Chromatism/JLTokenizer.h b/Chromatism/Chromatism/JLTokenizer.h index 228c77e..b847130 100644 --- a/Chromatism/Chromatism/JLTokenizer.h +++ b/Chromatism/Chromatism/JLTokenizer.h @@ -23,16 +23,21 @@ typedef NS_ENUM(NSInteger, JLTokenizerIntendtationAction) { @interface JLTokenizer : NSObject +- (void)refreshTokenizationOfTextStorage:(NSTextStorage *)textStorage; + +- (void)tokenizeTextStorage:(NSTextStorage *)textStorage withScope:(JLScope *)scope; +- (JLScope *)documentScopeForTokenizingTextStorage:(NSTextStorage *)textStorage inRange:(NSRange)range; + // Override these two methods and add your own scopes and tokenPatterns - (void)prepareDocumentScope:(JLScope *)documentScope; - (void)prepareLineScope:(JLScope *)lineScope; +- (NSMutableArray *)symbolsWithPattern:(NSString *)pattern captureGroup:(int)group textStorage:(NSTextStorage *)textStorage; + // Creates JLTokenPatterns and adds them to the operationQueue - (JLTokenPattern *)addToken:(NSString *)type withPattern:(NSString *)pattern andScope:(JLScope *)scope; - (JLTokenPattern *)addToken:(NSString *)type withKeywords:(NSString *)keywords andScope:(JLScope *)scope; -- (void)tokenizeTextStorage:(NSTextStorage *)textStorage withRange:(NSRange)range; -- (void)tokenizeTextStorage:(NSTextStorage *)textStorage; - (void)clearColorAttributesInRange:(NSRange)range textStorage:(NSTextStorage *)storage; diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index ac7a602..99ee81f 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -71,7 +71,7 @@ - (void)textStorage:(NSTextStorage *)textStorage willProcessEditing:(NSTextStora - (void)textStorage:(NSTextStorage *)textStorage didProcessEditing:(NSTextStorageEditActions)editedMask range:(NSRange)editedRange changeInLength:(NSInteger)delta { if (textStorage.editedMask == NSTextStorageEditedAttributes) return; - [self tokenizeTextStorage:textStorage withRange:[textStorage.string lineRangeForRange:editedRange]]; + [self tokenizeTextStorage:textStorage withScope:[self documentScopeForTokenizingTextStorage:textStorage inRange:editedRange]]; } #pragma mark - NSLayoutManager delegeate @@ -121,16 +121,13 @@ - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range r #pragma mark - Tokenizing -- (void)tokenizeTextStorage:(NSTextStorage *)textStorage +- (void)refreshTokenizationOfTextStorage:(NSTextStorage *)textStorage; { - [self tokenizeTextStorage:textStorage withRange:NSMakeRange(0, textStorage.length)]; + [self tokenizeTextStorage:textStorage withScope:[self documentScopeForTokenizingTextStorage:textStorage inRange:NSMakeRange(0, textStorage.length)]]; } -- (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range +- (JLScope *)documentScopeForTokenizingTextStorage:(NSTextStorage *)textStorage inRange:(NSRange)range { - [storage beginEditing]; - [self.operationQueue setSuspended:YES]; - JLScope *documentScope = [JLScope new]; JLScope *lineScope = [JLScope new]; @@ -139,18 +136,20 @@ - (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range [documentScope addSubscope:lineScope]; - [self.operationQueue addOperation:lineScope]; - [self.operationQueue addOperation:documentScope]; - - [self clearColorAttributesInRange:range textStorage:storage]; + [self clearColorAttributesInRange:range textStorage:textStorage]; - [documentScope setTextStorage:storage]; - [documentScope setSet:[NSMutableIndexSet indexSetWithIndexesInRange:NSMakeRange(0, storage.length)]]; - [lineScope setSet:[NSMutableIndexSet indexSetWithIndexesInRange:range]]; + [documentScope setTextStorage:textStorage]; + [documentScope setSet:[NSMutableIndexSet indexSetWithIndexesInRange:NSMakeRange(0, textStorage.length)]]; + [lineScope setSet:[NSMutableIndexSet indexSetWithIndexesInRange:[textStorage.string lineRangeForRange:range]]]; - [self.operationQueue setSuspended:NO]; - [self.operationQueue waitUntilAllOperationsAreFinished]; - [storage endEditing]; + return documentScope; +} + +- (void)tokenizeTextStorage:(NSTextStorage *)textStorage withScope:(JLScope *)scope +{ + [textStorage beginEditing]; + [self.operationQueue addOperations:[[scope recursiveSubscopes] allObjects] waitUntilFinished:YES]; + [textStorage endEditing]; } #pragma mark - Setup Token Patterns @@ -199,8 +198,6 @@ - (JLTokenPattern *)addToken:(NSString *)type withPattern:(NSString *)pattern an [token addScope:scope]; - [self.operationQueue addOperation:token]; - return token; } From eab6f85ed3e59b45d81fc2a598d600c6d6aaaca2 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Sat, 30 Nov 2013 16:15:41 +0100 Subject: [PATCH 134/140] Misc --- Chromatism/Chromatism/JLObjectiveCTokenizer.m | 8 +++++--- Chromatism/Chromatism/JLTokenizer.m | 4 ++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Chromatism/Chromatism/JLObjectiveCTokenizer.m b/Chromatism/Chromatism/JLObjectiveCTokenizer.m index 503530f..ba7e61d 100644 --- a/Chromatism/Chromatism/JLObjectiveCTokenizer.m +++ b/Chromatism/Chromatism/JLObjectiveCTokenizer.m @@ -63,9 +63,11 @@ - (void)prepareLineScope:(JLScope *)lineScope #pragma mark - Symbolication - - (void)symbolicate - { -// [self.scopes[PROJECT_CLASS_NAMES] setPattern:[NSString stringWithFormat:@"\\b(%@)\\b", [[self symbolsWithPattern:@"^@implementation (\\w+)" captureGroup:1] componentsJoinedByString:@"|"]]]; +- (void)prepareSymbolicateScope:(JLScope *)scope +{ + //NSString *pattern = [NSString stringWithFormat:@"\\b(%@)\\b", [[self symbolsWithPattern:@"^@implementation (\\w+)" captureGroup:1 textStorage:scope.textStorage] componentsJoinedByString:@"|"]]; + //JLTokenizer *pattern = [JLTokenPattern tokenPatternWithRegularExpression:[NSRegularExpression regularExpressionWithPattern:pattern options:0 error:NULL]]; + // [self.scopes[PROJECT_METHOD_NAMES] setPattern:[NSString stringWithFormat:@"\\b(%@)\\b", [[self symbolsWithPattern:@"^@property \\(.*?\\)\\s*\\w+[\\s*]+(\\w+);" captureGroup:1] componentsJoinedByString:@"|"]]]; } diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index 99ee81f..7e15730 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -147,9 +147,9 @@ - (JLScope *)documentScopeForTokenizingTextStorage:(NSTextStorage *)textStorage - (void)tokenizeTextStorage:(NSTextStorage *)textStorage withScope:(JLScope *)scope { - [textStorage beginEditing]; + //[textStorage beginEditing]; [self.operationQueue addOperations:[[scope recursiveSubscopes] allObjects] waitUntilFinished:YES]; - [textStorage endEditing]; + //[textStorage endEditing]; } #pragma mark - Setup Token Patterns From 87548052f8926f40b0e20c3465060c3bfdf14791 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Wed, 4 Dec 2013 12:59:41 +0100 Subject: [PATCH 135/140] Update README.md --- README.md | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 1701bfe..d82d842 100644 --- a/README.md +++ b/README.md @@ -20,16 +20,12 @@ MIT, see [LICENSE.txt](https://github.com/Anviking/Chromatism/blob/master/LICENS ## Classes - `JLTextView` is a textView with a syntaxTokenixer property to a `JLTokenizer` - `JLTokenizer` is the work horse of Chromatism. It uses scopes and tokenPatterns to appropriately tokenize a textStorage or a string. It is a delegate of `NSTextStorage` and `UITextView`. -- `JLScope` has a `NSMutableIndexSet`-property that corresponds to ranges in the textStorage. Scopes can be arranged in a hierarchy. A scope's children is stored in the `subscopes` property, and a scopes parent is simply called its `scope`. A scope can be executed via the `-perform`-method. The method causes subscopes to perform cascadingly. +- `JLScope` has a `NSMutableIndexSet`-property that corresponds to ranges in the textStorage. Scopes can be arranged in a complex hierarchy, especially since it is a subclass of `NSOperation`. - `JLTokenPattern` is a subclass of `JLScope`. It has a regex-pattern that in `-perform` searches through the ranges of its parent scope. -## Scopes and Patterns -Scopes and patters can ensure that regex patterns search in the right place. To understand how they work, it is helpful to know what happens in the `-perform` method. - -1. A scope may contain ranges before it's performed. When it's performed, the scope's set is intersected with the parent scope set. A scope can never contain more indexes that its parent scope. -2. The scope calls perform on its subscopes. -3. The scope ensures that its siblings don't search where the scope have found things. - -For more detail, see the `-perform`-implementation on [`JLScope`](https://github.com/Anviking/Chromatism/blob/master/Chromatism/Chromatism/JLScope.m#65) and [`JLTokenPattern`](https://github.com/Anviking/Chromatism/blob/master/Chromatism/Chromatism/JLTokenPattern.m#56). +## Implementing your own syntax highlighting for another language +1. Subclass `JLTokenizer. +2. Checkout `JLObjectiveCTokenizer` to see what to do next. +3. (Optional) Be awesome and submit a PR. From 9def98eadab7f2f17f83221890dcfb298ed99178 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Wed, 4 Dec 2013 13:00:17 +0100 Subject: [PATCH 136/140] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d82d842..3f57e02 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ MIT, see [LICENSE.txt](https://github.com/Anviking/Chromatism/blob/master/LICENS ## Implementing your own syntax highlighting for another language -1. Subclass `JLTokenizer. +1. Subclass `JLTokenizer`. 2. Checkout `JLObjectiveCTokenizer` to see what to do next. 3. (Optional) Be awesome and submit a PR. From 775786bd4b16de62f332badddd68a22657e169a5 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Wed, 28 May 2014 19:39:32 +0200 Subject: [PATCH 137/140] More public headers --- Chromatism/Chromatism.xcodeproj/project.pbxproj | 6 +++--- Chromatism/Chromatism/Chromatism.h | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Chromatism/Chromatism.xcodeproj/project.pbxproj b/Chromatism/Chromatism.xcodeproj/project.pbxproj index 6ef5c26..f65a503 100644 --- a/Chromatism/Chromatism.xcodeproj/project.pbxproj +++ b/Chromatism/Chromatism.xcodeproj/project.pbxproj @@ -37,9 +37,9 @@ 8FA0CB101795F41B00FF8EB1 /* JLTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FA0CB0E1795F41B00FF8EB1 /* JLTextView.m */; }; 8FE2796517C3842900DD933A /* UIColor+Chromatism.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FE2796317C3842900DD933A /* UIColor+Chromatism.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8FE2796617C3842900DD933A /* UIColor+Chromatism.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FE2796417C3842900DD933A /* UIColor+Chromatism.m */; }; - 8FFEB27D183AD6740032C9FB /* JLObjectiveCTokenizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FFEB27B183AD6740032C9FB /* JLObjectiveCTokenizer.h */; }; + 8FFEB27D183AD6740032C9FB /* JLObjectiveCTokenizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FFEB27B183AD6740032C9FB /* JLObjectiveCTokenizer.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8FFEB27E183AD6740032C9FB /* JLObjectiveCTokenizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FFEB27C183AD6740032C9FB /* JLObjectiveCTokenizer.m */; }; - 8FFEB283183AD8B70032C9FB /* JLTokenizer+Additions.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FFEB281183AD8B70032C9FB /* JLTokenizer+Additions.h */; }; + 8FFEB283183AD8B70032C9FB /* JLTokenizer+Additions.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FFEB281183AD8B70032C9FB /* JLTokenizer+Additions.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8FFEB284183AD8B70032C9FB /* JLTokenizer+Additions.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FFEB282183AD8B70032C9FB /* JLTokenizer+Additions.m */; }; /* End PBXBuildFile section */ @@ -238,8 +238,8 @@ 8FE2796517C3842900DD933A /* UIColor+Chromatism.h in Headers */, 8F54EF111781C788008C1609 /* JLScope.h in Headers */, 8FFEB27D183AD6740032C9FB /* JLObjectiveCTokenizer.h in Headers */, - 8FFEB283183AD8B70032C9FB /* JLTokenizer+Additions.h in Headers */, 8F54EF131781C788008C1609 /* JLTextViewController.h in Headers */, + 8FFEB283183AD8B70032C9FB /* JLTokenizer+Additions.h in Headers */, 8F54EF141781C788008C1609 /* JLTokenizer.h in Headers */, 8F54EF151781C788008C1609 /* JLTokenPattern.h in Headers */, ); diff --git a/Chromatism/Chromatism/Chromatism.h b/Chromatism/Chromatism/Chromatism.h index d02fa77..b0dae4e 100644 --- a/Chromatism/Chromatism/Chromatism.h +++ b/Chromatism/Chromatism/Chromatism.h @@ -30,4 +30,6 @@ #import "JLTextView.h" #import "UIColor+Chromatism.h" #import "JLDiffTokenizer.h" +#import "JLTokenizer+Additions.h" +#import "JLObjectiveCTokenizer.h" #import "Chromatism+Internal.h" \ No newline at end of file From d42fa605b817aa95bd98b89d1473319dcf3fcb34 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Wed, 28 May 2014 19:40:26 +0200 Subject: [PATCH 138/140] added -waitUntilFinished to tokenizer --- Chromatism/Chromatism/JLTokenizer.h | 2 ++ Chromatism/Chromatism/JLTokenizer.m | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/Chromatism/Chromatism/JLTokenizer.h b/Chromatism/Chromatism/JLTokenizer.h index b847130..dbc6477 100644 --- a/Chromatism/Chromatism/JLTokenizer.h +++ b/Chromatism/Chromatism/JLTokenizer.h @@ -23,6 +23,8 @@ typedef NS_ENUM(NSInteger, JLTokenizerIntendtationAction) { @interface JLTokenizer : NSObject +- (void)waitUntilFinished; /// Wait untill all syntax-highlighting operations are finished. + - (void)refreshTokenizationOfTextStorage:(NSTextStorage *)textStorage; - (void)tokenizeTextStorage:(NSTextStorage *)textStorage withScope:(JLScope *)scope; diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m index 7e15730..f156fe1 100644 --- a/Chromatism/Chromatism/JLTokenizer.m +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -61,6 +61,12 @@ - (id)init return self; } + +- (void)waitUntilFinished +{ + [self.operationQueue waitUntilAllOperationsAreFinished]; +} + #pragma mark - NSTextStorageDelegate - (void)textStorage:(NSTextStorage *)textStorage willProcessEditing:(NSTextStorageEditActions)editedMask range:(NSRange)editedRange changeInLength:(NSInteger)delta From a5b8ee4392e99bef89c29fdaf9f09c3ad462e69f Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Mon, 21 Jul 2014 04:27:30 +0200 Subject: [PATCH 139/140] Fixes #11 --- Chromatism/Chromatism/JLTextView.m | 1 + 1 file changed, 1 insertion(+) diff --git a/Chromatism/Chromatism/JLTextView.m b/Chromatism/Chromatism/JLTextView.m index e189f65..fc7025f 100644 --- a/Chromatism/Chromatism/JLTextView.m +++ b/Chromatism/Chromatism/JLTextView.m @@ -79,6 +79,7 @@ - (void)setup self.font = [UIFont fontWithName:@"Menlo" size:12]; self.autocorrectionType = UITextAutocorrectionTypeNo; self.autocapitalizationType = UITextAutocapitalizationTypeNone; + self.layoutManager.allowsNonContiguousLayout = YES; } From cbb3b89c25cd49f9f6d05e69e067dde168346de1 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Mon, 25 Aug 2014 13:54:09 +0200 Subject: [PATCH 140/140] Don't create new typingAttributes in -setTheme --- Chromatism/Chromatism/JLTextView.m | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Chromatism/Chromatism/JLTextView.m b/Chromatism/Chromatism/JLTextView.m index fc7025f..121437b 100644 --- a/Chromatism/Chromatism/JLTextView.m +++ b/Chromatism/Chromatism/JLTextView.m @@ -96,11 +96,14 @@ - (void)setSyntaxTokenizer:(JLTokenizer *)tokenizer -(void)setTheme:(JLTokenizerTheme)theme { - self.syntaxTokenizer.colors = [Chromatism colorsForTheme:theme]; - self.typingAttributes = @{ NSForegroundColorAttributeName : self.syntaxTokenizer.colors[JLTokenTypeText]}; _theme = theme; - //Set font, text color and background color back to default + // Set font- and background color from the theme + self.syntaxTokenizer.colors = [Chromatism colorsForTheme:theme]; + NSMutableDictionary *typingAttributes = self.typingAttributes.mutableCopy; + typingAttributes[NSForegroundColorAttributeName] = self.syntaxTokenizer.colors[JLTokenTypeText]; + self.typingAttributes = typingAttributes; + UIColor *backgroundColor = self.syntaxTokenizer.colors[JLTokenTypeBackground]; [self setBackgroundColor:backgroundColor ? backgroundColor : [UIColor whiteColor] ];

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%0AFh7}=GN2L*T# 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ξ6SX@de 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 WZXT#&?Eki=Y WZXT#&?E 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�%7hfbaTrCc0%tDCbv^#*My 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

w=z)8+A@DO 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 +#import + +#define MARGIN 8 + +@interface TextLineCell : UITableViewCell + +@property (nonatomic, assign) CTLineRef line; +@end diff --git a/Chromatism/TextLineCell.m b/Chromatism/TextLineCell.m new file mode 100644 index 0000000..6d2fc3f --- /dev/null +++ b/Chromatism/TextLineCell.m @@ -0,0 +1,59 @@ +// +// LineLayer.m +// iGitpad +// +// Created by Johannes Lund on 2012-12-17. +// +// + +#import "TextLineCell.h" + +@implementation TextLineCell { + CTLineRef _line; +} + +- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier +{ + self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; + if (self) { + self.layer.geometryFlipped = YES; + } + return self; +} + +- (id)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self) { + self.layer.geometryFlipped = YES; + } + return self; +} + +- (id)initWithCoder:(NSCoder *)aDecoder +{ + self = [super initWithCoder:aDecoder]; + if (self) { + self.layer.geometryFlipped = YES; + } + return self; +} + +#define MARGIN 8 +- (void)drawRect:(CGRect)rect +{ + CGContextRef context = UIGraphicsGetCurrentContext(); + CGContextSetTextPosition(context, MARGIN, MARGIN/2); + CTLineDraw(self.line, context); +} + +- (UIView *)backgroundView +{ + return nil; +} + +- (UIView *)contentView +{ + return nil; +} +@end diff --git a/Chromatism/ViewController.h b/Chromatism/ViewController.h index f6630ca..50d3ffb 100644 --- a/Chromatism/ViewController.h +++ b/Chromatism/ViewController.h @@ -8,6 +8,8 @@ #import +@class JLTextView; @interface ViewController : UIViewController +@property (nonatomic, weak) JLTextView *textView; @end diff --git a/Chromatism/ViewController.m b/Chromatism/ViewController.m index 8062964..799f25c 100644 --- a/Chromatism/ViewController.m +++ b/Chromatism/ViewController.m @@ -7,9 +7,9 @@ // #import "ViewController.h" +#import "JLTextView.h" @interface ViewController () - @end @implementation ViewController @@ -17,7 +17,25 @@ @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; - // Do any additional setup after loading the view, typically from a nib. +} + +- (void)viewDidAppear:(BOOL)animated +{ + [super viewDidAppear:animated]; + + //There are some problems with the textView when setting text while its frame isn't yet set. + self.textView.text = [[NSString alloc] initWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"text" withExtension:@"txt"] encoding:NSUTF8StringEncoding error:nil]; +} + +- (void)loadView +{ + JLTextView *textView = [[JLTextView alloc] initWithFrame:CGRectZero]; + textView.autoresizingMask = UIViewAutoresizingFlexibleHeight; + textView.font = [UIFont fontWithName:@"Menlo-Regular" size:13]; + textView.syntaxTokenizer = [[JLTokenizer alloc] init]; + textView.syntaxTokenizer.theme = kTokenizerThemeDusk; + self.view = textView; + self.textView = textView; } - (void)didReceiveMemoryWarning diff --git a/Chromatism/en.lproj/MainStoryboard_iPhone.storyboard b/Chromatism/en.lproj/MainStoryboard_iPhone.storyboard index c9acc6d..d29ca54 100644 --- a/Chromatism/en.lproj/MainStoryboard_iPhone.storyboard +++ b/Chromatism/en.lproj/MainStoryboard_iPhone.storyboard @@ -1,15 +1,15 @@ - + - + - + - + diff --git a/Chromatism/text.txt b/Chromatism/text.txt new file mode 100644 index 0000000..cf4f9d3 --- /dev/null +++ b/Chromatism/text.txt @@ -0,0 +1,845 @@ +// +// Tokenizer.m +// iGitpad +// +// Created by Johannes Lund on 2012-11-24. +// +// + +// This file builds upon the work of Kristian Kraljic +// +// RegexHighlightView.m +// Simple Objective-C Syntax Highlighter +// +// Created by Kristian Kraljic on 30/08/12. +// Copyright (c) 2012 Kristian Kraljic (dikrypt.com, ksquared.de). 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. +// + +#import "JLTokenizer.h" +#import + +NSString *const kTokenizerTypeText = @"text"; +NSString *const kTokenizerTypeBackground = @"background"; +NSString *const kTokenizerTypeComment = @"comment"; +NSString *const kTokenizerTypeDocumentationComment = @"documentation_comment"; +NSString *const kTokenizerTypeDocumentationCommentKeyword = @"documentation_comment_keyword"; +NSString *const kTokenizerTypeString = @"string"; +NSString *const kTokenizerTypeCharacter = @"character"; +NSString *const kTokenizerTypeNumber = @"number"; +NSString *const kTokenizerTypeKeyword = @"keyword"; +NSString *const kTokenizerTypePreprocessor = @"preprocessor"; +NSString *const kTokenizerTypeURL = @"url"; +NSString *const kTokenizerTypeAttribute = @"attribute"; +NSString *const kTokenizerTypeProject = @"project"; +NSString *const kTokenizerTypeOther = @"other"; +NSString *const kTokenizerTypeOtherMethodNames = @"other_method_names"; +NSString *const kTokenizerTypeOtherClassNames = @"other_class_names"; + +@interface NSMutableAttributedString (Regex) +- (void)addRanges:(NSArray *)array withColor:(UIColor *)color; +- (void)addRanges:(NSArray *)array withAttributes:(NSDictionary *)dic; +- (NSArray *)allMatchesOfPattern:(NSString *)pattern inString:(NSString *)string; + +- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color andDescription:(NSString *)description; +- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color range:(NSRange)range andDescription:(NSString *)description; +- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color group:(int)index range:(NSRange)range andDescription:(NSString *)description; +- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color options:(NSRegularExpressionOptions)options andDescription:(NSString *)description; +- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color options:(NSRegularExpressionOptions)options range:(NSRange)range andDescription:(NSString *)description; +- (void)removeAttribute:(NSString *)name withValue:(id)compareValue range:(NSRange)range; +@end + +@interface JLTokenizer () + ++ (NSDictionary*)highlightTheme:(RegexHighlightViewTheme)theme; + +@end + +@implementation JLTokenizer +@synthesize theme = _theme; + +- (NSMutableAttributedString *)tokenizeAttributedString:(NSMutableAttributedString *)string withRecentTextViewChange:(TextViewChange *)options { + UIColor *color; + color = [UIColor blueColor]; + + if (string.length == 0) return string; + + NSRange newWord = NSMakeRange(options.range.location, options.replacementText.length); + NSRange currentLine = NSMakeRange(0, string.length); + NSRange stringRange = currentLine; + if (options) { + NSRange start = [string.string rangeOfString:@"\n" options:NSBackwardsSearch range:NSMakeRange(0, newWord.location)]; + NSRange stop = [string.string rangeOfString:@"\n" options:0 range:NSMakeRange(newWord.length+newWord.location, string.length-(newWord.location+newWord.length))]; + + int location = MIN(MAX(start.location, 0), string.length); + int length = MIN(MAX(0,(stop.location+stop.length-location)), string.length-location); + + currentLine = NSMakeRange(location, length); + } + + NSDictionary *dic = self.colorDictionary; + + //Clear the comments to later be rebuilt + UIColor *compareColor = dic[kTokenizerTypeComment]; + [string removeAttribute:(NSString *)kCTForegroundColorAttributeName withValue:compareColor range:stringRange]; + + [string removeAttribute:(NSString *)kCTForegroundColorAttributeName range:currentLine]; + [string addAttribute:(NSString *)kCTForegroundColorAttributeName value:dic[kTokenizerTypeText] range:currentLine]; + + //TODO: Much more cleanup is needed + + + color = dic[kTokenizerTypeNumber]; + + [string addRegularExpressionWithPattern:@"(?<=\\s)\\d+" withColor:color range:currentLine andDescription:@"Numbers"]; + + [string addRegularExpressionWithPattern:@"@\\s*[\(|\{|\[]" withColor:color andDescription:@"New literals"]; + + //C – functions and similiar – foo(whatever msö409å5jt) + color = dic[kTokenizerTypeOtherMethodNames]; + [string addRegularExpressionWithPattern:@"\\w+\\s*(?>\\(.*\\)" withColor:color group:1 range:currentLine andDescription:@"C function names"]; + + //Dot notation + [string addRegularExpressionWithPattern:@"\\.(\\w+)" withColor:color group:1 range:currentLine andDescription:@"Dot notation"]; + + //Method calls + [string addRegularExpressionWithPattern:@"\\[\\w+\\s+(\\w+)\\]" withColor:color group:1 range:currentLine andDescription:@"Method calls"]; + [string addRegularExpressionWithPattern:@"(?<=\\w+):\\s*[^\\s;\\]]+" withColor:color group:1 range:currentLine andDescription:@"Method calls parts"]; + + color = dic[kTokenizerTypeOtherClassNames]; + [string addRegularExpressionWithPattern:@"(\\b(?>NS|UI))\\w+\\b" withColor:color range:currentLine andDescription:@"UIKit and NS"]; + + color = dic[kTokenizerTypeKeyword]; + [string addRegularExpressionWithPattern:@"(?<=\\b)(?>true|false|yes|no|TRUE|FALSE|bool|BOOL|nil|id|void|self|NULL|if|else|strong|weak|nonatomic|atomic|assign|copy|typedef|enum|auto|break|case|const|char|continue|do|default|double|extern|float|for|goto|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|volatile|while|nonatomic|atomic|readonly)(\\b)" withColor:color range:currentLine andDescription:@"Keywords"]; + + + [string addRegularExpressionWithPattern:@"@[a-zA-Z0-9_]+" withColor:color range:currentLine andDescription:@"@things"]; + + color = dic[kTokenizerTypePreprocessor]; + [string addRegularExpressionWithPattern:@"#.*+\n" withColor:color range:currentLine andDescription:@"Prefixes"]; + + color = dic[kTokenizerTypeString]; + [string addRegularExpressionWithPattern:@"(\"|@\")[^\"]*(@\"|\")" withColor:color andDescription:@"Strings"]; + + color = dic[kTokenizerTypeComment]; + [string addRegularExpressionWithPattern:@"//.*+\n" withColor:color andDescription:@"Comments"]; + + [string addRegularExpressionWithPattern:@"/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*+/" withColor:color andDescription:@"Comments"]; + + return string; +} + +#pragma mark - Pattern help + +- (NSString *)patternBetweenString:(NSString *)start andString:(NSString *)stop +{ + return nil; +} + +#pragma mark - Color shemes + + + +-(void)setTheme:(RegexHighlightViewTheme)theme +{ + self.colorDictionary = [JLTokenizer highlightTheme:theme]; + _theme = theme; + + //Set font, text color and background color back to default + UIColor* backgroundColor = self.colorDictionary[kTokenizerTypeBackground]; + if(backgroundColor) + self.backgroundColor = backgroundColor; + else self.backgroundColor = [UIColor whiteColor]; +} + +- (NSDictionary *)colorDictionary +{ + if (!_colorDictionary) { + _colorDictionary = [JLTokenizer highlightTheme:self.theme]; + } + return _colorDictionary; +} + +- (NSArray *)themes +{ + if (!_themes) _themes = @[@(kTokenizerThemeDefault),@(kTokenizerThemeDusk)]; + return _themes; +} + +- (RegexHighlightViewTheme)theme +{ + if (!_theme) _theme = kTokenizerThemeDefault; + return _theme; +} + ++ (NSDictionary*)highlightTheme:(RegexHighlightViewTheme)theme { + //Check if the highlight theme has already been defined + NSDictionary* themeColor = nil; + //If not define the theme and return it + switch(theme) { + case kTokenizerThemeBasic: + themeColor = @{kTokenizerTypeText: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], + kTokenizerTypeBackground: [UIColor colorWithRed:255.0/255 green:255.0/255 blue:255.0/255 alpha:1], + kTokenizerTypeComment: [UIColor colorWithRed:0.0/255 green:142.0/255 blue:43.0/255 alpha:1], + kTokenizerTypeDocumentationComment: [UIColor colorWithRed:0.0/255 green:142.0/255 blue:43.0/255 alpha:1], + kTokenizerTypeDocumentationCommentKeyword: [UIColor colorWithRed:0.0/255 green:142.0/255 blue:43.0/255 alpha:1], + kTokenizerTypeString: [UIColor colorWithRed:181.0/255 green:37.0/255 blue:34.0/255 alpha:1], + kTokenizerTypeCharacter: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], + kTokenizerTypeNumber: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], + kTokenizerTypeKeyword: [UIColor colorWithRed:6.0/255 green:63.0/255 blue:244.0/255 alpha:1], + kTokenizerTypePreprocessor: [UIColor colorWithRed:6.0/255 green:63.0/255 blue:244.0/255 alpha:1], + kTokenizerTypeURL: [UIColor colorWithRed:6.0/255 green:63.0/255 blue:244.0/255 alpha:1], + kTokenizerTypeAttribute: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], + kTokenizerTypeProject: [UIColor colorWithRed:49.0/255 green:149.0/255 blue:172.0/255 alpha:1], + kTokenizerTypeOther: [UIColor colorWithRed:49.0/255 green:149.0/255 blue:172.0/255 alpha:1]}; + break; + case kTokenizerThemeDefault: + themeColor = @{kTokenizerTypeText: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], + kTokenizerTypeBackground: [UIColor colorWithRed:255.0/255 green:255.0/255 blue:255.0/255 alpha:1], + kTokenizerTypeComment: [UIColor colorWithRed:0.0/255 green:131.0/255 blue:39.0/255 alpha:1], + kTokenizerTypeDocumentationComment: [UIColor colorWithRed:0.0/255 green:131.0/255 blue:39.0/255 alpha:1], + kTokenizerTypeDocumentationCommentKeyword: [UIColor colorWithRed:0.0/255 green:76.0/255 blue:29.0/255 alpha:1], + kTokenizerTypeString: [UIColor colorWithRed:211.0/255 green:45.0/255 blue:38.0/255 alpha:1], + kTokenizerTypeCharacter: [UIColor colorWithRed:40.0/255 green:52.0/255 blue:206.0/255 alpha:1], + kTokenizerTypeNumber: [UIColor colorWithRed:40.0/255 green:52.0/255 blue:206.0/255 alpha:1], + kTokenizerTypeKeyword: [UIColor colorWithRed:188.0/255 green:49.0/255 blue:156.0/255 alpha:1], + kTokenizerTypePreprocessor: [UIColor colorWithRed:120.0/255 green:72.0/255 blue:48.0/255 alpha:1], + kTokenizerTypeURL: [UIColor colorWithRed:21.0/255 green:67.0/255 blue:244.0/255 alpha:1], + kTokenizerTypeAttribute: [UIColor colorWithRed:150.0/255 green:125.0/255 blue:65.0/255 alpha:1], + kTokenizerTypeProject: [UIColor colorWithRed:77.0/255 green:129.0/255 blue:134.0/255 alpha:1], + kTokenizerTypeOther: [UIColor colorWithRed:113.0/255 green:65.0/255 blue:163.0/255 alpha:1], + kTokenizerTypeOtherMethodNames : [UIColor colorWithHex:@"7040a6" alpha:1], + kTokenizerTypeOtherClassNames : [UIColor colorWithHex:@"7040a6" alpha:1] + + + + }; + break; + case kTokenizerThemeDusk: + themeColor = @{kTokenizerTypeText: [UIColor whiteColor], + kTokenizerTypeBackground: [UIColor colorWithRed:30.0/255.0 green:32.0/255.0 blue:40.0/255.0 alpha:1], + kTokenizerTypeComment: [UIColor colorWithRed:72.0/255 green:190.0/255 blue:102.0/255 alpha:1], + kTokenizerTypeDocumentationComment: [UIColor colorWithRed:72.0/255 green:190.0/255 blue:102.0/255 alpha:1], + kTokenizerTypeDocumentationCommentKeyword: [UIColor colorWithRed:72.0/255 green:190.0/255 blue:102.0/255 alpha:1], + kTokenizerTypeString: [UIColor colorWithRed:230.0/255 green:66.0/255 blue:75.0/255 alpha:1], + kTokenizerTypeCharacter: [UIColor colorWithRed:139.0/255 green:134.0/255 blue:201.0/255 alpha:1], + kTokenizerTypeNumber: [UIColor colorWithRed:139.0/255 green:134.0/255 blue:201.0/255 alpha:1], + kTokenizerTypeKeyword: [UIColor colorWithRed:195.0/255 green:55.0/255 blue:149.0/255 alpha:1], + kTokenizerTypePreprocessor: [UIColor colorWithRed:198.0/255.0 green:124.0/255.0 blue:72.0/255.0 alpha:1], + kTokenizerTypeURL: [UIColor colorWithRed:35.0/255 green:63.0/255 blue:208.0/255 alpha:1], + kTokenizerTypeAttribute: [UIColor colorWithRed:103.0/255 green:135.0/255 blue:142.0/255 alpha:1], + kTokenizerTypeProject: [UIColor colorWithRed:146.0/255 green:199.0/255 blue:119.0/255 alpha:1], + kTokenizerTypeOther: [UIColor colorWithRed:0.0/255 green:175.0/255 blue:199.0/255 alpha:1], + kTokenizerTypeOtherClassNames : [UIColor colorWithHex:@"04afc8" alpha:1], + kTokenizerTypeOtherMethodNames : [UIColor colorWithHex:@"04afc8" alpha:1] + }; + break; + case kTokenizerThemeLowKey: + themeColor = @{kTokenizerTypeText: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], + kTokenizerTypeBackground: [UIColor colorWithRed:255.0/255 green:255.0/255 blue:255.0/255 alpha:1], + kTokenizerTypeComment: [UIColor colorWithRed:84.0/255 green:99.0/255 blue:75.0/255 alpha:1], + kTokenizerTypeDocumentationComment: [UIColor colorWithRed:84.0/255 green:99.0/255 blue:75.0/255 alpha:1], + kTokenizerTypeDocumentationCommentKeyword: [UIColor colorWithRed:84.0/255 green:99.0/255 blue:75.0/255 alpha:1], + kTokenizerTypeString: [UIColor colorWithRed:133.0/255 green:63.0/255 blue:98.0/255 alpha:1], + kTokenizerTypeCharacter: [UIColor colorWithRed:50.0/255 green:64.0/255 blue:121.0/255 alpha:1], + kTokenizerTypeNumber: [UIColor colorWithRed:50.0/255 green:64.0/255 blue:121.0/255 alpha:1], + kTokenizerTypeKeyword: [UIColor colorWithRed:50.0/255 green:64.0/255 blue:121.0/255 alpha:1], + kTokenizerTypePreprocessor: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], + kTokenizerTypeURL: [UIColor colorWithRed:24.0/255 green:49.0/255 blue:168.0/255 alpha:1], + kTokenizerTypeAttribute: [UIColor colorWithRed:35.0/255 green:93.0/255 blue:43.0/255 alpha:1], + kTokenizerTypeProject: [UIColor colorWithRed:87.0/255 green:127.0/255 blue:164.0/255 alpha:1], + kTokenizerTypeOther: [UIColor colorWithRed:87.0/255 green:127.0/255 blue:164.0/255 alpha:1]}; + break; + case kTokenizerThemeMidnight: + themeColor = @{kTokenizerTypeText: [UIColor colorWithRed:255.0/255 green:255.0/255 blue:255.0/255 alpha:1], + kTokenizerTypeBackground: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], + kTokenizerTypeComment: [UIColor colorWithRed:69.0/255 green:208.0/255 blue:106.0/255 alpha:1], + kTokenizerTypeDocumentationComment: [UIColor colorWithRed:69.0/255 green:208.0/255 blue:106.0/255 alpha:1], + kTokenizerTypeDocumentationCommentKeyword: [UIColor colorWithRed:69.0/255 green:208.0/255 blue:106.0/255 alpha:1], + kTokenizerTypeString: [UIColor colorWithRed:255.0/255 green:68.0/255 blue:77.0/255 alpha:1], + kTokenizerTypeCharacter: [UIColor colorWithRed:139.0/255 green:138.0/255 blue:247.0/255 alpha:1], + kTokenizerTypeNumber: [UIColor colorWithRed:139.0/255 green:138.0/255 blue:247.0/255 alpha:1], + kTokenizerTypeKeyword: [UIColor colorWithRed:224.0/255 green:59.0/255 blue:160.0/255 alpha:1], + kTokenizerTypePreprocessor: [UIColor colorWithRed:237.0/255 green:143.0/255 blue:100.0/255 alpha:1], + kTokenizerTypeURL: [UIColor colorWithRed:36.0/255 green:72.0/255 blue:244.0/255 alpha:1], + kTokenizerTypeAttribute: [UIColor colorWithRed:79.0/255 green:108.0/255 blue:132.0/255 alpha:1], + kTokenizerTypeProject: [UIColor colorWithRed:0.0/255 green:249.0/255 blue:161.0/255 alpha:1], + kTokenizerTypeOther: [UIColor colorWithRed:0.0/255 green:179.0/255 blue:248.0/255 alpha:1]}; + break; + case kTokenizerThemePresentation: + themeColor = @{kTokenizerTypeText: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], + kTokenizerTypeBackground: [UIColor colorWithRed:255.0/255 green:255.0/255 blue:255.0/255 alpha:1], + kTokenizerTypeComment: [UIColor colorWithRed:38.0/255 green:126.0/255 blue:61.0/255 alpha:1], + kTokenizerTypeDocumentationComment: [UIColor colorWithRed:38.0/255 green:126.0/255 blue:61.0/255 alpha:1], + kTokenizerTypeDocumentationCommentKeyword: [UIColor colorWithRed:38.0/255 green:126.0/255 blue:61.0/255 alpha:1], + kTokenizerTypeString: [UIColor colorWithRed:158.0/255 green:32.0/255 blue:32.0/255 alpha:1], + kTokenizerTypeCharacter: [UIColor colorWithRed:6.0/255 green:63.0/255 blue:244.0/255 alpha:1], + kTokenizerTypeNumber: [UIColor colorWithRed:6.0/255 green:63.0/255 blue:244.0/255 alpha:1], + kTokenizerTypeKeyword: [UIColor colorWithRed:140.0/255 green:34.0/255 blue:96.0/255 alpha:1], + kTokenizerTypePreprocessor: [UIColor colorWithRed:125.0/255 green:72.0/255 blue:49.0/255 alpha:1], + kTokenizerTypeURL: [UIColor colorWithRed:21.0/255 green:67.0/255 blue:244.0/255 alpha:1], + kTokenizerTypeAttribute: [UIColor colorWithRed:150.0/255 green:125.0/255 blue:65.0/255 alpha:1], + kTokenizerTypeProject: [UIColor colorWithRed:77.0/255 green:129.0/255 blue:134.0/255 alpha:1], + kTokenizerTypeOther: [UIColor colorWithRed:113.0/255 green:65.0/255 blue:163.0/255 alpha:1]}; + break; + case kTokenizerThemePrinting: + themeColor = @{kTokenizerTypeText: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], + kTokenizerTypeBackground: [UIColor colorWithRed:255.0/255 green:255.0/255 blue:255.0/255 alpha:1], + kTokenizerTypeComment: [UIColor colorWithRed:113.0/255 green:113.0/255 blue:113.0/255 alpha:1], + kTokenizerTypeDocumentationComment: [UIColor colorWithRed:113.0/255 green:113.0/255 blue:113.0/255 alpha:1], + kTokenizerTypeDocumentationCommentKeyword: [UIColor colorWithRed:64.0/255 green:64.0/255 blue:64.0/255 alpha:1], + kTokenizerTypeString: [UIColor colorWithRed:112.0/255 green:112.0/255 blue:112.0/255 alpha:1], + kTokenizerTypeCharacter: [UIColor colorWithRed:71.0/255 green:71.0/255 blue:71.0/255 alpha:1], + kTokenizerTypeNumber: [UIColor colorWithRed:71.0/255 green:71.0/255 blue:71.0/255 alpha:1], + kTokenizerTypeKeyword: [UIColor colorWithRed:108.0/255 green:108.0/255 blue:108.0/255 alpha:1], + kTokenizerTypePreprocessor: [UIColor colorWithRed:85.0/255 green:85.0/255 blue:85.0/255 alpha:1], + kTokenizerTypeURL: [UIColor colorWithRed:84.0/255 green:84.0/255 blue:84.0/255 alpha:1], + kTokenizerTypeAttribute: [UIColor colorWithRed:129.0/255 green:129.0/255 blue:129.0/255 alpha:1], + kTokenizerTypeProject: [UIColor colorWithRed:120.0/255 green:120.0/255 blue:120.0/255 alpha:1], + kTokenizerTypeOther: [UIColor colorWithRed:86.0/255 green:86.0/255 blue:86.0/255 alpha:1]}; + break; + case kTokenizerThemeSunset: + themeColor = @{kTokenizerTypeText: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], + kTokenizerTypeBackground: [UIColor colorWithRed:255.0/255 green:252.0/255 blue:236.0/255 alpha:1], + kTokenizerTypeComment: [UIColor colorWithRed:208.0/255 green:134.0/255 blue:59.0/255 alpha:1], + kTokenizerTypeDocumentationComment: [UIColor colorWithRed:208.0/255 green:134.0/255 blue:59.0/255 alpha:1], + kTokenizerTypeDocumentationCommentKeyword: [UIColor colorWithRed:190.0/255 green:116.0/255 blue:55.0/255 alpha:1], + kTokenizerTypeString: [UIColor colorWithRed:234.0/255 green:32.0/255 blue:24.0/255 alpha:1], + kTokenizerTypeCharacter: [UIColor colorWithRed:53.0/255 green:87.0/255 blue:134.0/255 alpha:1], + kTokenizerTypeNumber: [UIColor colorWithRed:53.0/255 green:87.0/255 blue:134.0/255 alpha:1], + kTokenizerTypeKeyword: [UIColor colorWithRed:53.0/255 green:87.0/255 blue:134.0/255 alpha:1], + kTokenizerTypePreprocessor: [UIColor colorWithRed:119.0/255 green:121.0/255 blue:148.0/255 alpha:1], + kTokenizerTypeURL: [UIColor colorWithRed:85.0/255 green:99.0/255 blue:179.0/255 alpha:1], + kTokenizerTypeAttribute: [UIColor colorWithRed:58.0/255 green:76.0/255 blue:166.0/255 alpha:1], + kTokenizerTypeProject: [UIColor colorWithRed:196.0/255 green:88.0/255 blue:31.0/255 alpha:1], + kTokenizerTypeOther: [UIColor colorWithRed:196.0/255 green:88.0/255 blue:31.0/255 alpha:1]}; + break; + } + return themeColor; +} + + +@end + +#pragma mark - Regex Helpers + + +@implementation NSMutableAttributedString (Regex) + +- (void)removeAttribute:(NSString *)name withValue:(id)compareValue range:(NSRange)range +{ + [self enumerateAttribute:(NSString *)kCTForegroundColorAttributeName inRange:range options:0 usingBlock:^(id value, NSRange range, BOOL *stop) { + if ([value isEqual:compareValue]) { + [self removeAttribute:(NSString *)kCTForegroundColorAttributeName range:range]; + } + + }]; +} + + +- (void)addRanges:(NSArray *)array withColor:(UIColor *)color +{ + for (NSValue *value in array) { + [self removeAttribute:(NSString *)kCTForegroundColorAttributeName range:value.rangeValue]; + [self addAttribute:(NSString *)kCTForegroundColorAttributeName value:color range:value.rangeValue]; + } +} + +- (void)addRanges:(NSArray *)array withAttributes:(NSDictionary *)dic +{ + for (NSValue *value in array) { + if (value.rangeValue.location + value.rangeValue.length <= self.length){ + [self removeAttribute:(NSString *)kCTForegroundColorAttributeName range:value.rangeValue]; + [self addAttributes:dic range:value.rangeValue]; + } + } +} + +- (NSArray *)allMatchesOfPattern:(NSString *)pattern inString:(NSString *)string +{ + NSArray *mathces = [[NSRegularExpression regularExpressionWithPattern:pattern options:0 error:nil] matchesInString:string options:0 range:NSMakeRange(0, string.length)]; + + return mathces; +} + +- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color andDescription:(NSString *)description +{ + [self addRegularExpressionWithPattern:pattern withColor:color options:0 andDescription:description]; +} + +- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color group:(int)index range:(NSRange)range andDescription:(NSString *)description +{ + NSString *string = self.string; + + + NSRegularExpression* expression = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionAnchorsMatchLines error:nil]; + + [expression enumerateMatchesInString:string options:0 range:range usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { + [self addAttribute:(NSString *)kCTForegroundColorAttributeName value:color range:[result rangeAtIndex:index]]; + }]; +} + +- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color options:(NSRegularExpressionOptions)options andDescription:(NSString *)description +{ + [self addRegularExpressionWithPattern:pattern withColor:color options:options range:NSMakeRange(0, self.length) andDescription:description]; +} + +- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color options:(NSRegularExpressionOptions)options range:(NSRange)range andDescription:(NSString *)description +{ + NSString *string = self.string; + NSRegularExpression* expression = [NSRegularExpression regularExpressionWithPattern:pattern options:options error:nil]; + + [expression enumerateMatchesInString:string options:options range:range usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { + [self addAttribute:(NSString *)kCTForegroundColorAttributeName value:color range:result.range]; + }]; +} + +- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color range:(NSRange)range andDescription:(NSString *)description +{ + [self addRegularExpressionWithPattern:pattern withColor:color options:0 range:range andDescription:description]; +} + +@end + +// +// Tokenizer.m +// iGitpad +// +// Created by Johannes Lund on 2012-11-24. +// +// + +// This file builds upon the work of Kristian Kraljic +// +// RegexHighlightView.m +// Simple Objective-C Syntax Highlighter +// +// Created by Kristian Kraljic on 30/08/12. +// Copyright (c) 2012 Kristian Kraljic (dikrypt.com, ksquared.de). 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. +// + +#import "JLTokenizer.h" +#import + +NSString *const kTokenizerTypeText = @"text"; +NSString *const kTokenizerTypeBackground = @"background"; +NSString *const kTokenizerTypeComment = @"comment"; +NSString *const kTokenizerTypeDocumentationComment = @"documentation_comment"; +NSString *const kTokenizerTypeDocumentationCommentKeyword = @"documentation_comment_keyword"; +NSString *const kTokenizerTypeString = @"string"; +NSString *const kTokenizerTypeCharacter = @"character"; +NSString *const kTokenizerTypeNumber = @"number"; +NSString *const kTokenizerTypeKeyword = @"keyword"; +NSString *const kTokenizerTypePreprocessor = @"preprocessor"; +NSString *const kTokenizerTypeURL = @"url"; +NSString *const kTokenizerTypeAttribute = @"attribute"; +NSString *const kTokenizerTypeProject = @"project"; +NSString *const kTokenizerTypeOther = @"other"; +NSString *const kTokenizerTypeOtherMethodNames = @"other_method_names"; +NSString *const kTokenizerTypeOtherClassNames = @"other_class_names"; + +@interface NSMutableAttributedString (Regex) +- (void)addRanges:(NSArray *)array withColor:(UIColor *)color; +- (void)addRanges:(NSArray *)array withAttributes:(NSDictionary *)dic; +- (NSArray *)allMatchesOfPattern:(NSString *)pattern inString:(NSString *)string; + +- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color andDescription:(NSString *)description; +- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color range:(NSRange)range andDescription:(NSString *)description; +- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color group:(int)index range:(NSRange)range andDescription:(NSString *)description; +- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color options:(NSRegularExpressionOptions)options andDescription:(NSString *)description; +- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color options:(NSRegularExpressionOptions)options range:(NSRange)range andDescription:(NSString *)description; +- (void)removeAttribute:(NSString *)name withValue:(id)compareValue range:(NSRange)range; +@end + +@interface JLTokenizer () + ++ (NSDictionary*)highlightTheme:(RegexHighlightViewTheme)theme; + +@end + +@implementation JLTokenizer +@synthesize theme = _theme; + +- (NSMutableAttributedString *)tokenizeAttributedString:(NSMutableAttributedString *)string withRecentTextViewChange:(TextViewChange *)options { + UIColor *color; + color = [UIColor blueColor]; + + if (string.length == 0) return string; + + NSRange newWord = NSMakeRange(options.range.location, options.replacementText.length); + NSRange currentLine = NSMakeRange(0, string.length); + NSRange stringRange = currentLine; + if (options) { + NSRange start = [string.string rangeOfString:@"\n" options:NSBackwardsSearch range:NSMakeRange(0, newWord.location)]; + NSRange stop = [string.string rangeOfString:@"\n" options:0 range:NSMakeRange(newWord.length+newWord.location, string.length-(newWord.location+newWord.length))]; + + int location = MIN(MAX(start.location, 0), string.length); + int length = MIN(MAX(0,(stop.location+stop.length-location)), string.length-location); + + currentLine = NSMakeRange(location, length); + } + + NSDictionary *dic = self.colorDictionary; + + //Clear the comments to later be rebuilt + UIColor *compareColor = dic[kTokenizerTypeComment]; + [string removeAttribute:(NSString *)kCTForegroundColorAttributeName withValue:compareColor range:stringRange]; + + [string removeAttribute:(NSString *)kCTForegroundColorAttributeName range:currentLine]; + [string addAttribute:(NSString *)kCTForegroundColorAttributeName value:dic[kTokenizerTypeText] range:currentLine]; + + //TODO: Much more cleanup is needed + + + color = dic[kTokenizerTypeNumber]; + + [string addRegularExpressionWithPattern:@"(?<=\\s)\\d+" withColor:color range:currentLine andDescription:@"Numbers"]; + + [string addRegularExpressionWithPattern:@"@\\s*[\(|\{|\[]" withColor:color andDescription:@"New literals"]; + + //C – functions and similiar – foo(whatever msö409å5jt) + color = dic[kTokenizerTypeOtherMethodNames]; + [string addRegularExpressionWithPattern:@"\\w+\\s*(?>\\(.*\\)" withColor:color group:1 range:currentLine andDescription:@"C function names"]; + + //Dot notation + [string addRegularExpressionWithPattern:@"\\.(\\w+)" withColor:color group:1 range:currentLine andDescription:@"Dot notation"]; + + //Method calls + [string addRegularExpressionWithPattern:@"\\[\\w+\\s+(\\w+)\\]" withColor:color group:1 range:currentLine andDescription:@"Method calls"]; + [string addRegularExpressionWithPattern:@"(?<=\\w+):\\s*[^\\s;\\]]+" withColor:color group:1 range:currentLine andDescription:@"Method calls parts"]; + + color = dic[kTokenizerTypeOtherClassNames]; + [string addRegularExpressionWithPattern:@"(\\b(?>NS|UI))\\w+\\b" withColor:color range:currentLine andDescription:@"UIKit and NS"]; + + color = dic[kTokenizerTypeKeyword]; + [string addRegularExpressionWithPattern:@"(?<=\\b)(?>true|false|yes|no|TRUE|FALSE|bool|BOOL|nil|id|void|self|NULL|if|else|strong|weak|nonatomic|atomic|assign|copy|typedef|enum|auto|break|case|const|char|continue|do|default|double|extern|float|for|goto|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|volatile|while|nonatomic|atomic|readonly)(\\b)" withColor:color range:currentLine andDescription:@"Keywords"]; + + + [string addRegularExpressionWithPattern:@"@[a-zA-Z0-9_]+" withColor:color range:currentLine andDescription:@"@things"]; + + color = dic[kTokenizerTypePreprocessor]; + [string addRegularExpressionWithPattern:@"#.*+\n" withColor:color range:currentLine andDescription:@"Prefixes"]; + + color = dic[kTokenizerTypeString]; + [string addRegularExpressionWithPattern:@"(\"|@\")[^\"]*(@\"|\")" withColor:color andDescription:@"Strings"]; + + color = dic[kTokenizerTypeComment]; + [string addRegularExpressionWithPattern:@"//.*+\n" withColor:color andDescription:@"Comments"]; + + [string addRegularExpressionWithPattern:@"/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*+/" withColor:color andDescription:@"Comments"]; + + return string; +} + +#pragma mark - Pattern help + +- (NSString *)patternBetweenString:(NSString *)start andString:(NSString *)stop +{ + return nil; +} + +#pragma mark - Color shemes + + + +-(void)setTheme:(RegexHighlightViewTheme)theme +{ + self.colorDictionary = [JLTokenizer highlightTheme:theme]; + _theme = theme; + + //Set font, text color and background color back to default + UIColor* backgroundColor = self.colorDictionary[kTokenizerTypeBackground]; + if(backgroundColor) + self.backgroundColor = backgroundColor; + else self.backgroundColor = [UIColor whiteColor]; +} + +- (NSDictionary *)colorDictionary +{ + if (!_colorDictionary) { + _colorDictionary = [JLTokenizer highlightTheme:self.theme]; + } + return _colorDictionary; +} + +- (NSArray *)themes +{ + if (!_themes) _themes = @[@(kTokenizerThemeDefault),@(kTokenizerThemeDusk)]; + return _themes; +} + +- (RegexHighlightViewTheme)theme +{ + if (!_theme) _theme = kTokenizerThemeDefault; + return _theme; +} + ++ (NSDictionary*)highlightTheme:(RegexHighlightViewTheme)theme { + //Check if the highlight theme has already been defined + NSDictionary* themeColor = nil; + //If not define the theme and return it + switch(theme) { + case kTokenizerThemeBasic: + themeColor = @{kTokenizerTypeText: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], + kTokenizerTypeBackground: [UIColor colorWithRed:255.0/255 green:255.0/255 blue:255.0/255 alpha:1], + kTokenizerTypeComment: [UIColor colorWithRed:0.0/255 green:142.0/255 blue:43.0/255 alpha:1], + kTokenizerTypeDocumentationComment: [UIColor colorWithRed:0.0/255 green:142.0/255 blue:43.0/255 alpha:1], + kTokenizerTypeDocumentationCommentKeyword: [UIColor colorWithRed:0.0/255 green:142.0/255 blue:43.0/255 alpha:1], + kTokenizerTypeString: [UIColor colorWithRed:181.0/255 green:37.0/255 blue:34.0/255 alpha:1], + kTokenizerTypeCharacter: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], + kTokenizerTypeNumber: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], + kTokenizerTypeKeyword: [UIColor colorWithRed:6.0/255 green:63.0/255 blue:244.0/255 alpha:1], + kTokenizerTypePreprocessor: [UIColor colorWithRed:6.0/255 green:63.0/255 blue:244.0/255 alpha:1], + kTokenizerTypeURL: [UIColor colorWithRed:6.0/255 green:63.0/255 blue:244.0/255 alpha:1], + kTokenizerTypeAttribute: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], + kTokenizerTypeProject: [UIColor colorWithRed:49.0/255 green:149.0/255 blue:172.0/255 alpha:1], + kTokenizerTypeOther: [UIColor colorWithRed:49.0/255 green:149.0/255 blue:172.0/255 alpha:1]}; + break; + case kTokenizerThemeDefault: + themeColor = @{kTokenizerTypeText: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], + kTokenizerTypeBackground: [UIColor colorWithRed:255.0/255 green:255.0/255 blue:255.0/255 alpha:1], + kTokenizerTypeComment: [UIColor colorWithRed:0.0/255 green:131.0/255 blue:39.0/255 alpha:1], + kTokenizerTypeDocumentationComment: [UIColor colorWithRed:0.0/255 green:131.0/255 blue:39.0/255 alpha:1], + kTokenizerTypeDocumentationCommentKeyword: [UIColor colorWithRed:0.0/255 green:76.0/255 blue:29.0/255 alpha:1], + kTokenizerTypeString: [UIColor colorWithRed:211.0/255 green:45.0/255 blue:38.0/255 alpha:1], + kTokenizerTypeCharacter: [UIColor colorWithRed:40.0/255 green:52.0/255 blue:206.0/255 alpha:1], + kTokenizerTypeNumber: [UIColor colorWithRed:40.0/255 green:52.0/255 blue:206.0/255 alpha:1], + kTokenizerTypeKeyword: [UIColor colorWithRed:188.0/255 green:49.0/255 blue:156.0/255 alpha:1], + kTokenizerTypePreprocessor: [UIColor colorWithRed:120.0/255 green:72.0/255 blue:48.0/255 alpha:1], + kTokenizerTypeURL: [UIColor colorWithRed:21.0/255 green:67.0/255 blue:244.0/255 alpha:1], + kTokenizerTypeAttribute: [UIColor colorWithRed:150.0/255 green:125.0/255 blue:65.0/255 alpha:1], + kTokenizerTypeProject: [UIColor colorWithRed:77.0/255 green:129.0/255 blue:134.0/255 alpha:1], + kTokenizerTypeOther: [UIColor colorWithRed:113.0/255 green:65.0/255 blue:163.0/255 alpha:1], + kTokenizerTypeOtherMethodNames : [UIColor colorWithHex:@"7040a6" alpha:1], + kTokenizerTypeOtherClassNames : [UIColor colorWithHex:@"7040a6" alpha:1] + + + + }; + break; + case kTokenizerThemeDusk: + themeColor = @{kTokenizerTypeText: [UIColor whiteColor], + kTokenizerTypeBackground: [UIColor colorWithRed:30.0/255.0 green:32.0/255.0 blue:40.0/255.0 alpha:1], + kTokenizerTypeComment: [UIColor colorWithRed:72.0/255 green:190.0/255 blue:102.0/255 alpha:1], + kTokenizerTypeDocumentationComment: [UIColor colorWithRed:72.0/255 green:190.0/255 blue:102.0/255 alpha:1], + kTokenizerTypeDocumentationCommentKeyword: [UIColor colorWithRed:72.0/255 green:190.0/255 blue:102.0/255 alpha:1], + kTokenizerTypeString: [UIColor colorWithRed:230.0/255 green:66.0/255 blue:75.0/255 alpha:1], + kTokenizerTypeCharacter: [UIColor colorWithRed:139.0/255 green:134.0/255 blue:201.0/255 alpha:1], + kTokenizerTypeNumber: [UIColor colorWithRed:139.0/255 green:134.0/255 blue:201.0/255 alpha:1], + kTokenizerTypeKeyword: [UIColor colorWithRed:195.0/255 green:55.0/255 blue:149.0/255 alpha:1], + kTokenizerTypePreprocessor: [UIColor colorWithRed:198.0/255.0 green:124.0/255.0 blue:72.0/255.0 alpha:1], + kTokenizerTypeURL: [UIColor colorWithRed:35.0/255 green:63.0/255 blue:208.0/255 alpha:1], + kTokenizerTypeAttribute: [UIColor colorWithRed:103.0/255 green:135.0/255 blue:142.0/255 alpha:1], + kTokenizerTypeProject: [UIColor colorWithRed:146.0/255 green:199.0/255 blue:119.0/255 alpha:1], + kTokenizerTypeOther: [UIColor colorWithRed:0.0/255 green:175.0/255 blue:199.0/255 alpha:1], + kTokenizerTypeOtherClassNames : [UIColor colorWithHex:@"04afc8" alpha:1], + kTokenizerTypeOtherMethodNames : [UIColor colorWithHex:@"04afc8" alpha:1] + }; + break; + case kTokenizerThemeLowKey: + themeColor = @{kTokenizerTypeText: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], + kTokenizerTypeBackground: [UIColor colorWithRed:255.0/255 green:255.0/255 blue:255.0/255 alpha:1], + kTokenizerTypeComment: [UIColor colorWithRed:84.0/255 green:99.0/255 blue:75.0/255 alpha:1], + kTokenizerTypeDocumentationComment: [UIColor colorWithRed:84.0/255 green:99.0/255 blue:75.0/255 alpha:1], + kTokenizerTypeDocumentationCommentKeyword: [UIColor colorWithRed:84.0/255 green:99.0/255 blue:75.0/255 alpha:1], + kTokenizerTypeString: [UIColor colorWithRed:133.0/255 green:63.0/255 blue:98.0/255 alpha:1], + kTokenizerTypeCharacter: [UIColor colorWithRed:50.0/255 green:64.0/255 blue:121.0/255 alpha:1], + kTokenizerTypeNumber: [UIColor colorWithRed:50.0/255 green:64.0/255 blue:121.0/255 alpha:1], + kTokenizerTypeKeyword: [UIColor colorWithRed:50.0/255 green:64.0/255 blue:121.0/255 alpha:1], + kTokenizerTypePreprocessor: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], + kTokenizerTypeURL: [UIColor colorWithRed:24.0/255 green:49.0/255 blue:168.0/255 alpha:1], + kTokenizerTypeAttribute: [UIColor colorWithRed:35.0/255 green:93.0/255 blue:43.0/255 alpha:1], + kTokenizerTypeProject: [UIColor colorWithRed:87.0/255 green:127.0/255 blue:164.0/255 alpha:1], + kTokenizerTypeOther: [UIColor colorWithRed:87.0/255 green:127.0/255 blue:164.0/255 alpha:1]}; + break; + case kTokenizerThemeMidnight: + themeColor = @{kTokenizerTypeText: [UIColor colorWithRed:255.0/255 green:255.0/255 blue:255.0/255 alpha:1], + kTokenizerTypeBackground: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], + kTokenizerTypeComment: [UIColor colorWithRed:69.0/255 green:208.0/255 blue:106.0/255 alpha:1], + kTokenizerTypeDocumentationComment: [UIColor colorWithRed:69.0/255 green:208.0/255 blue:106.0/255 alpha:1], + kTokenizerTypeDocumentationCommentKeyword: [UIColor colorWithRed:69.0/255 green:208.0/255 blue:106.0/255 alpha:1], + kTokenizerTypeString: [UIColor colorWithRed:255.0/255 green:68.0/255 blue:77.0/255 alpha:1], + kTokenizerTypeCharacter: [UIColor colorWithRed:139.0/255 green:138.0/255 blue:247.0/255 alpha:1], + kTokenizerTypeNumber: [UIColor colorWithRed:139.0/255 green:138.0/255 blue:247.0/255 alpha:1], + kTokenizerTypeKeyword: [UIColor colorWithRed:224.0/255 green:59.0/255 blue:160.0/255 alpha:1], + kTokenizerTypePreprocessor: [UIColor colorWithRed:237.0/255 green:143.0/255 blue:100.0/255 alpha:1], + kTokenizerTypeURL: [UIColor colorWithRed:36.0/255 green:72.0/255 blue:244.0/255 alpha:1], + kTokenizerTypeAttribute: [UIColor colorWithRed:79.0/255 green:108.0/255 blue:132.0/255 alpha:1], + kTokenizerTypeProject: [UIColor colorWithRed:0.0/255 green:249.0/255 blue:161.0/255 alpha:1], + kTokenizerTypeOther: [UIColor colorWithRed:0.0/255 green:179.0/255 blue:248.0/255 alpha:1]}; + break; + case kTokenizerThemePresentation: + themeColor = @{kTokenizerTypeText: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], + kTokenizerTypeBackground: [UIColor colorWithRed:255.0/255 green:255.0/255 blue:255.0/255 alpha:1], + kTokenizerTypeComment: [UIColor colorWithRed:38.0/255 green:126.0/255 blue:61.0/255 alpha:1], + kTokenizerTypeDocumentationComment: [UIColor colorWithRed:38.0/255 green:126.0/255 blue:61.0/255 alpha:1], + kTokenizerTypeDocumentationCommentKeyword: [UIColor colorWithRed:38.0/255 green:126.0/255 blue:61.0/255 alpha:1], + kTokenizerTypeString: [UIColor colorWithRed:158.0/255 green:32.0/255 blue:32.0/255 alpha:1], + kTokenizerTypeCharacter: [UIColor colorWithRed:6.0/255 green:63.0/255 blue:244.0/255 alpha:1], + kTokenizerTypeNumber: [UIColor colorWithRed:6.0/255 green:63.0/255 blue:244.0/255 alpha:1], + kTokenizerTypeKeyword: [UIColor colorWithRed:140.0/255 green:34.0/255 blue:96.0/255 alpha:1], + kTokenizerTypePreprocessor: [UIColor colorWithRed:125.0/255 green:72.0/255 blue:49.0/255 alpha:1], + kTokenizerTypeURL: [UIColor colorWithRed:21.0/255 green:67.0/255 blue:244.0/255 alpha:1], + kTokenizerTypeAttribute: [UIColor colorWithRed:150.0/255 green:125.0/255 blue:65.0/255 alpha:1], + kTokenizerTypeProject: [UIColor colorWithRed:77.0/255 green:129.0/255 blue:134.0/255 alpha:1], + kTokenizerTypeOther: [UIColor colorWithRed:113.0/255 green:65.0/255 blue:163.0/255 alpha:1]}; + break; + case kTokenizerThemePrinting: + themeColor = @{kTokenizerTypeText: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], + kTokenizerTypeBackground: [UIColor colorWithRed:255.0/255 green:255.0/255 blue:255.0/255 alpha:1], + kTokenizerTypeComment: [UIColor colorWithRed:113.0/255 green:113.0/255 blue:113.0/255 alpha:1], + kTokenizerTypeDocumentationComment: [UIColor colorWithRed:113.0/255 green:113.0/255 blue:113.0/255 alpha:1], + kTokenizerTypeDocumentationCommentKeyword: [UIColor colorWithRed:64.0/255 green:64.0/255 blue:64.0/255 alpha:1], + kTokenizerTypeString: [UIColor colorWithRed:112.0/255 green:112.0/255 blue:112.0/255 alpha:1], + kTokenizerTypeCharacter: [UIColor colorWithRed:71.0/255 green:71.0/255 blue:71.0/255 alpha:1], + kTokenizerTypeNumber: [UIColor colorWithRed:71.0/255 green:71.0/255 blue:71.0/255 alpha:1], + kTokenizerTypeKeyword: [UIColor colorWithRed:108.0/255 green:108.0/255 blue:108.0/255 alpha:1], + kTokenizerTypePreprocessor: [UIColor colorWithRed:85.0/255 green:85.0/255 blue:85.0/255 alpha:1], + kTokenizerTypeURL: [UIColor colorWithRed:84.0/255 green:84.0/255 blue:84.0/255 alpha:1], + kTokenizerTypeAttribute: [UIColor colorWithRed:129.0/255 green:129.0/255 blue:129.0/255 alpha:1], + kTokenizerTypeProject: [UIColor colorWithRed:120.0/255 green:120.0/255 blue:120.0/255 alpha:1], + kTokenizerTypeOther: [UIColor colorWithRed:86.0/255 green:86.0/255 blue:86.0/255 alpha:1]}; + break; + case kTokenizerThemeSunset: + themeColor = @{kTokenizerTypeText: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], + kTokenizerTypeBackground: [UIColor colorWithRed:255.0/255 green:252.0/255 blue:236.0/255 alpha:1], + kTokenizerTypeComment: [UIColor colorWithRed:208.0/255 green:134.0/255 blue:59.0/255 alpha:1], + kTokenizerTypeDocumentationComment: [UIColor colorWithRed:208.0/255 green:134.0/255 blue:59.0/255 alpha:1], + kTokenizerTypeDocumentationCommentKeyword: [UIColor colorWithRed:190.0/255 green:116.0/255 blue:55.0/255 alpha:1], + kTokenizerTypeString: [UIColor colorWithRed:234.0/255 green:32.0/255 blue:24.0/255 alpha:1], + kTokenizerTypeCharacter: [UIColor colorWithRed:53.0/255 green:87.0/255 blue:134.0/255 alpha:1], + kTokenizerTypeNumber: [UIColor colorWithRed:53.0/255 green:87.0/255 blue:134.0/255 alpha:1], + kTokenizerTypeKeyword: [UIColor colorWithRed:53.0/255 green:87.0/255 blue:134.0/255 alpha:1], + kTokenizerTypePreprocessor: [UIColor colorWithRed:119.0/255 green:121.0/255 blue:148.0/255 alpha:1], + kTokenizerTypeURL: [UIColor colorWithRed:85.0/255 green:99.0/255 blue:179.0/255 alpha:1], + kTokenizerTypeAttribute: [UIColor colorWithRed:58.0/255 green:76.0/255 blue:166.0/255 alpha:1], + kTokenizerTypeProject: [UIColor colorWithRed:196.0/255 green:88.0/255 blue:31.0/255 alpha:1], + kTokenizerTypeOther: [UIColor colorWithRed:196.0/255 green:88.0/255 blue:31.0/255 alpha:1]}; + break; + } + return themeColor; +} + + +@end + +#pragma mark - Regex Helpers + + +@implementation NSMutableAttributedString (Regex) + +- (void)removeAttribute:(NSString *)name withValue:(id)compareValue range:(NSRange)range +{ + [self enumerateAttribute:(NSString *)kCTForegroundColorAttributeName inRange:range options:0 usingBlock:^(id value, NSRange range, BOOL *stop) { + if ([value isEqual:compareValue]) { + [self removeAttribute:(NSString *)kCTForegroundColorAttributeName range:range]; + } + + }]; +} + + +- (void)addRanges:(NSArray *)array withColor:(UIColor *)color +{ + for (NSValue *value in array) { + [self removeAttribute:(NSString *)kCTForegroundColorAttributeName range:value.rangeValue]; + [self addAttribute:(NSString *)kCTForegroundColorAttributeName value:color range:value.rangeValue]; + } +} + +- (void)addRanges:(NSArray *)array withAttributes:(NSDictionary *)dic +{ + for (NSValue *value in array) { + if (value.rangeValue.location + value.rangeValue.length <= self.length){ + [self removeAttribute:(NSString *)kCTForegroundColorAttributeName range:value.rangeValue]; + [self addAttributes:dic range:value.rangeValue]; + } + } +} + +- (NSArray *)allMatchesOfPattern:(NSString *)pattern inString:(NSString *)string +{ + NSArray *mathces = [[NSRegularExpression regularExpressionWithPattern:pattern options:0 error:nil] matchesInString:string options:0 range:NSMakeRange(0, string.length)]; + + return mathces; +} + +- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color andDescription:(NSString *)description +{ + [self addRegularExpressionWithPattern:pattern withColor:color options:0 andDescription:description]; +} + +- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color group:(int)index range:(NSRange)range andDescription:(NSString *)description +{ + NSString *string = self.string; + + + NSRegularExpression* expression = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionAnchorsMatchLines error:nil]; + + [expression enumerateMatchesInString:string options:0 range:range usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { + [self addAttribute:(NSString *)kCTForegroundColorAttributeName value:color range:[result rangeAtIndex:index]]; + }]; +} + +- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color options:(NSRegularExpressionOptions)options andDescription:(NSString *)description +{ + [self addRegularExpressionWithPattern:pattern withColor:color options:options range:NSMakeRange(0, self.length) andDescription:description]; +} + +- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color options:(NSRegularExpressionOptions)options range:(NSRange)range andDescription:(NSString *)description +{ + NSString *string = self.string; + NSRegularExpression* expression = [NSRegularExpression regularExpressionWithPattern:pattern options:options error:nil]; + + [expression enumerateMatchesInString:string options:options range:range usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { + [self addAttribute:(NSString *)kCTForegroundColorAttributeName value:color range:result.range]; + }]; +} + +- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color range:(NSRange)range andDescription:(NSString *)description +{ + [self addRegularExpressionWithPattern:pattern withColor:color options:0 range:range andDescription:description]; +} + +@end From f7d20600390fe16fb5c07c6e2209cc30d584de71 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Wed, 9 Jan 2013 21:15:18 +0100 Subject: [PATCH 004/140] Update README.md --- README.md | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e2fa9d8..e42927f 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,27 @@ Chromatism -========== \ No newline at end of file +========== + +This is an experimation of a Syntax Highlighting textView using a tableView and CoreText. It consists of a UITextView with a UITableVIew overlay. The UITextView has its textColor set to `[UIColor clearColor]` and ints only purpose is to provide a textinput. Ontop of the textView there is a `UITableView`, which render the lines currently visible. + + +##This is what happens when the text editor is created: + +1. The text is broken up into lines by a CTTypesetter on initialization and stored in an array. +2. The tableview asks for the lines that should be visible. +3. The tableView creates UITableViewCells which draw the lines. + +##What happens upon scrolling: +1. The tableView takes the cells that go offscreen and reuse them by telling them to draw new lines. Cells still onscreen are not redrawn. + +##What happens upon text change: +1. What type of text change is it? +2. If it can be handled by slightly modifying the lines, do so. No typesetter is required to look through the entire text. +3. If not there is no option but to recalculate everything with the typesetter. + + + +The tokenizing itself uses regex to modify an attributed string. The tokenizer tries to tokenizer as little as possible. If the user types a letter most regex patterns are going to be applied to the current line. + + + + From 0c1afbb98ef1ef67dd57e60603dea82bb158d35d Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Wed, 9 Jan 2013 21:18:08 +0100 Subject: [PATCH 005/140] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e42927f..f21b1ee 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ This is an experimation of a Syntax Highlighting textView using a tableView and ##This is what happens when the text editor is created: -1. The text is broken up into lines by a CTTypesetter on initialization and stored in an array. +1. The text is broken up into lines by a CTTypesetter and stored in an array. 2. The tableview asks for the lines that should be visible. 3. The tableView creates UITableViewCells which draw the lines. From 56552e8e1fe6efa9883031af841c0d5dff0bab5b Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Thu, 10 Jan 2013 21:10:28 +0100 Subject: [PATCH 006/140] Long-line performance #1 --- Chromatism/JLTextView.m | 57 +++++++++++++++++++++++++---------------- 1 file changed, 35 insertions(+), 22 deletions(-) diff --git a/Chromatism/JLTextView.m b/Chromatism/JLTextView.m index 5b8da02..47f0ed1 100644 --- a/Chromatism/JLTextView.m +++ b/Chromatism/JLTextView.m @@ -39,14 +39,12 @@ @implementation JLTextView { #pragma mark – -//Update the syntax highlighting if the text gets changed or the scrollview gets updated - - (void)scrollViewDidScroll:(UIScrollView *)scrollView { [self.tableView setContentOffset:self.contentOffset]; } -//Helper method +// Helper method - (void)setRange:(NSRange)range forLinenumber:(int)i { CTLineRef line = CTLineCreateWithAttributedString((__bridge CFAttributedStringRef)([self.attributedString attributedSubstringFromRange:range])); @@ -88,18 +86,17 @@ - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range r NSInteger i = [self lineNumberAtIndex:NSMaxRange(range)]; - //Fix the ranges - for (int j = i+1; j < self.lineStartIndexes.count; j++) { - _lineStartIndexes[j] = @([(NSNumber *)[self.lineStartIndexes objectAtIndex:j] intValue]+text.length); - } + //Fix the ranges + for (int j = i+1; j < self.lineStartIndexes.count; j++) { + _lineStartIndexes[j] = @([(NSNumber *)[self.lineStartIndexes objectAtIndex:j] intValue]+text.length); + } + + //Get range of line + CTLineRef currentLine = (__bridge CTLineRef)(self.lines[i]); + NSRange currentLineRange = NSMakeRange([(NSNumber *)self.lineStartIndexes[i] intValue], CTLineGetStringRange(currentLine).length+text.length - range.length); + NSRange newWord = NSMakeRange(options.range.location, options.replacementText.length); - //Get range of line - NSString *string = self.attributedString.string; - CTLineRef currentLine = (__bridge CTLineRef)(self.lines[i]); - NSRange currentLineRange = NSMakeRange([(NSNumber *)self.lineStartIndexes[i] intValue], CTLineGetStringRange(currentLine).length+text.length - range.length); - NSRange newWord = NSMakeRange(options.range.location, options.replacementText.length); - //BACKSPACE if ([text isEqualToString:@""] && range.length == 1) { @@ -123,19 +120,35 @@ - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range r return YES; } - //CHARACTER TYPED, and the line is not overflowing - NSString *lineString = [string substringWithRange:currentLineRange]; - CGSize size = [lineString sizeWithFont:self.font constrainedToSize:CGSizeMake(self.frame.size.width-2*MARGIN, 2000) lineBreakMode:NSLineBreakByWordWrapping]; - BOOL overflowing = size.height > _lineHeight*1.5; - if (text.length == 1 && range.length == 0 && !overflowing) { + float maxWidth = self.frame.size.width - 2*MARGIN; + float currentEstimatedWidth = currentLineRange.length * _charWidth; + + // This seems to estimate the lineWidth to be too large. + // If the estimatedWith is clearly less than the maxWidth there is no need to involve the typesetter. + if (currentEstimatedWidth < maxWidth) { [self setRange:currentLineRange forLinenumber:i]; - return TRUE; + return YES; } - NSLog(@"Generating new lines, this should be concidered as failuere. Not good. Need to improve the stuff above."); - [self generateLines]; - [self.tableView reloadData]; + // We're not sure, but the line may be overflowing. Use the typesetter. + + NSAttributedString *currentLineString = [self.attributedString attributedSubstringFromRange:currentLineRange]; + CTTypesetterRef typesetter = CTTypesetterCreateWithAttributedString((__bridge CFAttributedStringRef)(currentLineString)); + CFIndex length = CTTypesetterSuggestLineBreak(typesetter, 0, self.frame.size.width-2*MARGIN); + + if (length < currentLineRange.length) { + NSRange range1 = NSMakeRange(currentLineRange.location, length); + NSRange range2 = NSMakeRange(NSMaxRange(range1), NSMaxRange(currentLineRange)-NSMaxRange(range1)); + + [self setRange:range1 forLinenumber:i]; + [self insertLineWithRange:range2 atIndex:i+1]; + return YES; + } + else { + [self setRange:currentLineRange forLinenumber:i]; + return YES; + } return YES; } From 248b3bf1b0dc0df7a1a46f2f43f195fe232ef45e Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Thu, 17 Jan 2013 14:00:52 +0100 Subject: [PATCH 007/140] #4 Delete lines --- Chromatism/JLTextView.m | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/Chromatism/JLTextView.m b/Chromatism/JLTextView.m index 47f0ed1..80f072c 100644 --- a/Chromatism/JLTextView.m +++ b/Chromatism/JLTextView.m @@ -52,6 +52,12 @@ - (void)setRange:(NSRange)range forLinenumber:(int)i [self.tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:i inSection:0]] withRowAnimation:UITableViewRowAnimationNone]; } +- (void)deleteLineWithNumber:(int)i +{ + [self.lines removeObjectAtIndex:i]; + [self.tableView deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:i inSection:0]] withRowAnimation:UITableViewRowAnimationNone]; +} + - (void)insertLineWithRange:(NSRange)range atIndex:(int)i { NSAttributedString *string; @@ -91,13 +97,13 @@ - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range r _lineStartIndexes[j] = @([(NSNumber *)[self.lineStartIndexes objectAtIndex:j] intValue]+text.length); } - //Get range of line + // Get range of line CTLineRef currentLine = (__bridge CTLineRef)(self.lines[i]); NSRange currentLineRange = NSMakeRange([(NSNumber *)self.lineStartIndexes[i] intValue], CTLineGetStringRange(currentLine).length+text.length - range.length); NSRange newWord = NSMakeRange(options.range.location, options.replacementText.length); - //BACKSPACE + // BACKSPACE if ([text isEqualToString:@""] && range.length == 1) { if (range.location >= currentLineRange.location) @@ -106,9 +112,12 @@ - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range r [self setRange:currentLineRange forLinenumber:i]; return TRUE; } + else { + [self deleteLineWithNumber:i]; + } } - //NEWLINE + // NEWLINE if ([text isEqualToString:@"\n"]) { NSRange range1 = NSMakeRange(currentLineRange.location, NSMaxRange(newWord) - currentLineRange.location); From cf11d44a6c99b7e40c4b423bbd5d9b8f048b61b7 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Thu, 18 Apr 2013 11:31:06 +0200 Subject: [PATCH 008/140] Exception for incorrect length of the current line. This helps debugging a bit. --- Chromatism/JLTextView.m | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/Chromatism/JLTextView.m b/Chromatism/JLTextView.m index 80f072c..7ed9bd0 100644 --- a/Chromatism/JLTextView.m +++ b/Chromatism/JLTextView.m @@ -102,7 +102,12 @@ - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range r NSRange currentLineRange = NSMakeRange([(NSNumber *)self.lineStartIndexes[i] intValue], CTLineGetStringRange(currentLine).length+text.length - range.length); NSRange newWord = NSMakeRange(options.range.location, options.replacementText.length); - + + if (currentLineRange.length == INT_MAX || currentLineRange.length > self.text.length) + { + // This is bad + @throw [NSException exceptionWithName:@"JLTextViewException" reason:@"The range of the current line is incorrect" userInfo:nil]; + } // BACKSPACE if ([text isEqualToString:@""] && range.length == 1) { @@ -113,7 +118,14 @@ - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range r return TRUE; } else { - [self deleteLineWithNumber:i]; + [self deleteLineWithNumber:i+1]; + [self setRange:currentLineRange forLinenumber:i]; + + NSRange deleteLineRange = NSMakeRange([(NSNumber *)self.lineStartIndexes[i+1] intValue], CTLineGetStringRange(currentLine).length+text.length - range.length); + + + NSLog(@"Deleting line with number:%i",i+1); + NSLog(@"Length of deleted line:%i",deleteLineRange.length); } } From eea576e5199916dd68ea2ffa5c172882fb2d30d9 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Thu, 18 Apr 2013 16:59:27 +0200 Subject: [PATCH 009/140] Backspace fixes and more debugging --- Chromatism/JLTextView.m | 32 +++++++++++++++++++++++--------- Chromatism/text.txt | 7 +++++++ 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/Chromatism/JLTextView.m b/Chromatism/JLTextView.m index 7ed9bd0..77eb427 100644 --- a/Chromatism/JLTextView.m +++ b/Chromatism/JLTextView.m @@ -63,7 +63,7 @@ - (void)insertLineWithRange:(NSRange)range atIndex:(int)i NSAttributedString *string; if (range.location != NSNotFound && range.length < self.attributedString.length) string = [self.attributedString attributedSubstringFromRange:range]; - else [[NSException exceptionWithName:@"JLTextViewException" reason:@"A new line was created, but its assigned range is invalid" userInfo:nil] raise]; + else @throw [NSException exceptionWithName:@"JLTextViewException" reason:@"A new line was created, but its assigned range is invalid" userInfo:nil]; CTLineRef line = CTLineCreateWithAttributedString((__bridge CFAttributedStringRef)(string)); @@ -92,6 +92,8 @@ - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range r NSInteger i = [self lineNumberAtIndex:NSMaxRange(range)]; + NSLog(@"Current line: %i", i); + //Fix the ranges for (int j = i+1; j < self.lineStartIndexes.count; j++) { _lineStartIndexes[j] = @([(NSNumber *)[self.lineStartIndexes objectAtIndex:j] intValue]+text.length); @@ -99,14 +101,27 @@ - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range r // Get range of line CTLineRef currentLine = (__bridge CTLineRef)(self.lines[i]); + + NSAssert(currentLine != nil, @"The current line cannot be found"); + NSRange currentLineRange = NSMakeRange([(NSNumber *)self.lineStartIndexes[i] intValue], CTLineGetStringRange(currentLine).length+text.length - range.length); NSRange newWord = NSMakeRange(options.range.location, options.replacementText.length); + /* + if (currentLineRange.length == 0) + { + [self deleteLineWithNumber:i]; + return TRUE; + } + */ + + NSLog(@"Length of current line #%i is: %i",i,currentLineRange.length); + NSLog(@"Current line contains \"%@\"", [self.text substringWithRange:currentLineRange]); - if (currentLineRange.length == INT_MAX || currentLineRange.length > self.text.length) + if (currentLineRange.length == INT_MAX || currentLineRange.length > self.text.length) // TODO: Cache the text.length??? { // This is bad - @throw [NSException exceptionWithName:@"JLTextViewException" reason:@"The range of the current line is incorrect" userInfo:nil]; + @throw [NSException exceptionWithName:@"JLTextViewException" reason:@"The range of the current line is incorrect" userInfo:@{@"Range" : NSStringFromRange(currentLineRange)}]; } // BACKSPACE if ([text isEqualToString:@""] && range.length == 1) @@ -118,14 +133,13 @@ - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range r return TRUE; } else { - [self deleteLineWithNumber:i+1]; - [self setRange:currentLineRange forLinenumber:i]; - NSRange deleteLineRange = NSMakeRange([(NSNumber *)self.lineStartIndexes[i+1] intValue], CTLineGetStringRange(currentLine).length+text.length - range.length); + // TODO: Involve a typesetter here + NSRange previousLineRange = NSMakeRange([(NSNumber *)self.lineStartIndexes[i-1] intValue], CTLineGetStringRange(currentLine).length+text.length - range.length); + NSRange mergedLineRange = NSMakeRange(previousLineRange.location, NSMaxRange(currentLineRange)-previousLineRange.location); - - NSLog(@"Deleting line with number:%i",i+1); - NSLog(@"Length of deleted line:%i",deleteLineRange.length); + //[self setRange:mergedLineRange forLinenumber:i-1]; + [self deleteLineWithNumber:i]; } } diff --git a/Chromatism/text.txt b/Chromatism/text.txt index cf4f9d3..86fb657 100644 --- a/Chromatism/text.txt +++ b/Chromatism/text.txt @@ -1,3 +1,10 @@ +00 +01 +02 +03 +04 +05 +06 // // Tokenizer.m // iGitpad From dcc25ac481f172fd16c3406cb3590531c5a00c56 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Fri, 19 Apr 2013 20:12:02 +0200 Subject: [PATCH 010/140] =?UTF-8?q?#4=20Fixed=20various=20bugs=20regarding?= =?UTF-8?q?=20backspace.=20=E2=80=93=20Backspace=20bugs=20=E2=80=93=C2=A0W?= =?UTF-8?q?orking=20on=20splitting=20the=20monster=20-shouldChangeTextInRa?= =?UTF-8?q?nge=20=E2=80=93=20More=20NSLogs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Chromatism/JLTextView.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Chromatism/JLTextView.m b/Chromatism/JLTextView.m index 77eb427..ee582b1 100644 --- a/Chromatism/JLTextView.m +++ b/Chromatism/JLTextView.m @@ -45,7 +45,7 @@ - (void)scrollViewDidScroll:(UIScrollView *)scrollView } // Helper method -- (void)setRange:(NSRange)range forLinenumber:(int)i +- (void)setRange:(NSRange)range forLineWithIndex:(int)i { CTLineRef line = CTLineCreateWithAttributedString((__bridge CFAttributedStringRef)([self.attributedString attributedSubstringFromRange:range])); self.lines[i] = (__bridge id)(line); @@ -129,7 +129,7 @@ - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range r if (range.location >= currentLineRange.location) { // No text changes line - [self setRange:currentLineRange forLinenumber:i]; + [self setRange:currentLineRange forLineWithIndex:i]; return TRUE; } else { From e73c0bc0e590d45365a84a51c1e7f5a27e398b9e Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Sun, 21 Apr 2013 01:34:42 +0300 Subject: [PATCH 011/140] Update README.md --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index f21b1ee..ed39270 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,11 @@ This is an experimation of a Syntax Highlighting textView using a tableView and The tokenizing itself uses regex to modify an attributed string. The tokenizer tries to tokenizer as little as possible. If the user types a letter most regex patterns are going to be applied to the current line. +##Performance +Performance is the whole reason Chromatism was created. + +###Screenshot of Time Profiling: +![Alt text](http://anviking.com/Time.png "Performance") From e34df5da47703cdf2a3119197029335c1d141d4d Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Sun, 21 Apr 2013 16:49:22 +0200 Subject: [PATCH 012/140] Reorganizing code --- Chromatism/JLTextView.m | 150 ++++++++++++++++++++++++++-------------- 1 file changed, 100 insertions(+), 50 deletions(-) diff --git a/Chromatism/JLTextView.m b/Chromatism/JLTextView.m index ee582b1..e332a8f 100644 --- a/Chromatism/JLTextView.m +++ b/Chromatism/JLTextView.m @@ -34,6 +34,8 @@ @implementation JLTextView { UIView *_debugView; + NSUInteger textLength; + } @synthesize attributes = _attributes, syntaxTokenizer = _syntaxTokenizer; @@ -52,10 +54,19 @@ - (void)setRange:(NSRange)range forLineWithIndex:(int)i [self.tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:i inSection:0]] withRowAnimation:UITableViewRowAnimationNone]; } +// This is probably not helpful at all +- (void)reloadLineWithIndex:(int)index +{ + NSRange range = [self rangeOfLineWithIndex:index]; + CTLineRef line = CTLineCreateWithAttributedString((__bridge CFAttributedStringRef)([self.attributedString attributedSubstringFromRange:range])); + self.lines[index] = (__bridge id)(line); +} + - (void)deleteLineWithNumber:(int)i { [self.lines removeObjectAtIndex:i]; - [self.tableView deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:i inSection:0]] withRowAnimation:UITableViewRowAnimationNone]; + [self.lineStartIndexes removeObjectAtIndex:i]; + [self.tableView deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:i inSection:0]] withRowAnimation:UITableViewRowAnimationTop]; } - (void)insertLineWithRange:(NSRange)range atIndex:(int)i @@ -73,86 +84,91 @@ - (void)insertLineWithRange:(NSRange)range atIndex:(int)i [self.lineStartIndexes insertObject:@(range.location) atIndex:i]; } -- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text +- (NSRange)rangeOfLineWithIndex:(int)index { - //TODO: deactivate core-text overlay upon failure - //TODO: Nicer designflow - //TODO: Handle out of bound errors - - //Basic stuff, tokenize the string - TextViewChange *options = [[TextViewChange alloc] init]; - options.replacementText = text; - options.range = range; - - [self.attributedString replaceCharactersInRange:range withAttributedString:[[NSAttributedString alloc] initWithString:text attributes:_attributes]]; - - _attributedString = [self.syntaxTokenizer tokenizeAttributedString:self.attributedString withRecentTextViewChange:options]; - - - - NSInteger i = [self lineNumberAtIndex:NSMaxRange(range)]; - - NSLog(@"Current line: %i", i); - - //Fix the ranges - for (int j = i+1; j < self.lineStartIndexes.count; j++) { - _lineStartIndexes[j] = @([(NSNumber *)[self.lineStartIndexes objectAtIndex:j] intValue]+text.length); + CTLineRef currentLine = (__bridge CTLineRef)(self.lines[index]); + NSRange range = NSMakeRange([(NSNumber *)self.lineStartIndexes[index] intValue], CTLineGetStringRange(currentLine).length); + return range; +} + +- (void)offsetLineRangeLocationsFromLine:(int)index offset:(int)offset +{ + for (int j = index; j < self.lineStartIndexes.count; j++) { + _lineStartIndexes[j] = @([(NSNumber *)[self.lineStartIndexes objectAtIndex:j] intValue] + offset); } +} + +- (void)updatLineWithIndex:(int)i andRecentTextChange:(TextViewChange *)options +{ + NSString *replacementText = options.replacementText; + NSRange range = options.range; - // Get range of line CTLineRef currentLine = (__bridge CTLineRef)(self.lines[i]); - + NSInteger offset = options.replacementText.length - options.range.length; + NSAssert(currentLine != nil, @"The current line cannot be found"); - NSRange currentLineRange = NSMakeRange([(NSNumber *)self.lineStartIndexes[i] intValue], CTLineGetStringRange(currentLine).length+text.length - range.length); + NSRange currentLineRange = [self rangeOfLineWithIndex:i]; + currentLineRange.length += offset; + NSRange newWord = NSMakeRange(options.range.location, options.replacementText.length); - /* + // TEST if (currentLineRange.length == 0) { [self deleteLineWithNumber:i]; - return TRUE; + return; } - */ - NSLog(@"Length of current line #%i is: %i",i,currentLineRange.length); - NSLog(@"Current line contains \"%@\"", [self.text substringWithRange:currentLineRange]); - - if (currentLineRange.length == INT_MAX || currentLineRange.length > self.text.length) // TODO: Cache the text.length??? + //NSLog(@"Length of current line #%i is: %i",i,currentLineRange.length); + //NSLog(@"Current line contains \"%@\"", [self.attributedString attributedSubstringFromRange:currentLineRange]); + + if (currentLineRange.length == INT_MAX || currentLineRange.length > textLength) { - // This is bad @throw [NSException exceptionWithName:@"JLTextViewException" reason:@"The range of the current line is incorrect" userInfo:@{@"Range" : NSStringFromRange(currentLineRange)}]; } // BACKSPACE - if ([text isEqualToString:@""] && range.length == 1) + if ([replacementText isEqualToString:@""] && range.length == 1) { if (range.location >= currentLineRange.location) { // No text changes line [self setRange:currentLineRange forLineWithIndex:i]; - return TRUE; + return; } else { - // TODO: Involve a typesetter here - NSRange previousLineRange = NSMakeRange([(NSNumber *)self.lineStartIndexes[i-1] intValue], CTLineGetStringRange(currentLine).length+text.length - range.length); + // TODO: Involve a typesetter here + + CTLineRef previousLine = (__bridge CTLineRef)(self.lines[i-1]); + NSAssert(previousLine != nil, @"The current line cannot be found"); + + NSRange previousLineRange = [self rangeOfLineWithIndex:i-1]; NSRange mergedLineRange = NSMakeRange(previousLineRange.location, NSMaxRange(currentLineRange)-previousLineRange.location); - - //[self setRange:mergedLineRange forLinenumber:i-1]; + /* + NSRange nextLineRange = [self rangeOfLineWithIndex:i+1]; + + NSLog(@"Merging to line %i with range: %@ text:%@", i-1, NSStringFromRange(mergedLineRange),[self.attributedString.string substringWithRange:mergedLineRange]); + NSLog(@"Deleting line %i with range: %@ text:%@", i, NSStringFromRange(currentLineRange), [self.attributedString.string substringWithRange:currentLineRange]); + NSLog(@"Next line %i with range: %@ text:%@", i+1, NSStringFromRange(nextLineRange), [self.attributedString.string substringWithRange:nextLineRange]); + */ + + [self setRange:mergedLineRange forLineWithIndex:i-1]; [self deleteLineWithNumber:i]; + return; } } // NEWLINE - if ([text isEqualToString:@"\n"]) { + if ([replacementText isEqualToString:@"\n"]) { NSRange range1 = NSMakeRange(currentLineRange.location, NSMaxRange(newWord) - currentLineRange.location); NSRange range2 = NSMakeRange(NSMaxRange(newWord), NSMaxRange(currentLineRange)-NSMaxRange(newWord)); - [self setRange:range1 forLinenumber:i]; + [self setRange:range1 forLineWithIndex:i]; [self insertLineWithRange:range2 atIndex:i+1]; - return YES; + return; } @@ -162,8 +178,8 @@ - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range r // This seems to estimate the lineWidth to be too large. // If the estimatedWith is clearly less than the maxWidth there is no need to involve the typesetter. if (currentEstimatedWidth < maxWidth) { - [self setRange:currentLineRange forLinenumber:i]; - return YES; + [self setRange:currentLineRange forLineWithIndex:i]; + return; } // We're not sure, but the line may be overflowing. Use the typesetter. @@ -176,14 +192,42 @@ - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range r NSRange range1 = NSMakeRange(currentLineRange.location, length); NSRange range2 = NSMakeRange(NSMaxRange(range1), NSMaxRange(currentLineRange)-NSMaxRange(range1)); - [self setRange:range1 forLinenumber:i]; + [self setRange:range1 forLineWithIndex:i]; [self insertLineWithRange:range2 atIndex:i+1]; - return YES; + return; } else { - [self setRange:currentLineRange forLinenumber:i]; - return YES; + [self setRange:currentLineRange forLineWithIndex:i]; + return; + } +} + +- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text +{ + //TODO: deactivate core-text overlay upon failure + //TODO: Nicer designflow + //TODO: Handle out of bound errors + + //Basic stuff, tokenize the string + TextViewChange *options = [[TextViewChange alloc] init]; + options.replacementText = text; + options.range = range; + + [self.attributedString replaceCharactersInRange:range withAttributedString:[[NSAttributedString alloc] initWithString:text attributes:_attributes]]; + _attributedString = [self.syntaxTokenizer tokenizeAttributedString:self.attributedString withRecentTextViewChange:options]; + + NSInteger lineIndex = [self lineNumberAtIndex:NSMaxRange(range)]; + NSInteger offset = text.length - range.length; + + // Check if multiple lines are changed + if (range.length > 1) + { + NSInteger firstLine = [self lineNumberAtIndex:range.location]; + // TODO: Handle cases where the range reaches across multiple lines } + + [self offsetLineRangeLocationsFromLine:lineIndex + 1 offset:offset]; + [self updatLineWithIndex:lineIndex andRecentTextChange:options]; return YES; } @@ -266,6 +310,11 @@ - (void)generateLines CTTypesetterRef typesetter = CTFramesetterGetTypesetter(_framesetter); CFIndex count = CTTypesetterSuggestLineBreak(typesetter, start, boundsWidth); CTLineRef line = CTLineCreateWithAttributedString((__bridge CFAttributedStringRef)([self.attributedString attributedSubstringFromRange:NSMakeRange(start, count)])); + + //NSString *string = [self.text substringWithRange:NSMakeRange(start, count)]; + //if ([string rangeOfString:@"\n"].location != NSNotFound) NSLog(@"YES"); + //else NSLog(@"NO"); + [self.lines addObject:(__bridge id)(line)]; [self.lineStartIndexes addObject:@(start)]; @@ -304,6 +353,7 @@ - (UITableView *)tableView - (void)setAttributedString:(NSMutableAttributedString *)attributedString { + textLength = attributedString.length; _attributedString = attributedString; [self generateLines]; [self.tableView reloadData]; From 88246e196ef7d14bdc749261eab87fd185c22d72 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Sun, 21 Apr 2013 17:13:55 +0200 Subject: [PATCH 013/140] Improved comments --- Chromatism/JLTextView.m | 152 ++++++++++++++++++++------------------- Chromatism/JLTokenizer.m | 8 +-- 2 files changed, 83 insertions(+), 77 deletions(-) diff --git a/Chromatism/JLTextView.m b/Chromatism/JLTextView.m index e332a8f..4b05742 100644 --- a/Chromatism/JLTextView.m +++ b/Chromatism/JLTextView.m @@ -39,14 +39,9 @@ @implementation JLTextView { } @synthesize attributes = _attributes, syntaxTokenizer = _syntaxTokenizer; -#pragma mark – +#pragma mark - Helpers -- (void)scrollViewDidScroll:(UIScrollView *)scrollView -{ - [self.tableView setContentOffset:self.contentOffset]; -} - -// Helper method +// Updates the range of a given line - (void)setRange:(NSRange)range forLineWithIndex:(int)i { CTLineRef line = CTLineCreateWithAttributedString((__bridge CFAttributedStringRef)([self.attributedString attributedSubstringFromRange:range])); @@ -62,6 +57,7 @@ - (void)reloadLineWithIndex:(int)index self.lines[index] = (__bridge id)(line); } +// Deletes the given line - (void)deleteLineWithNumber:(int)i { [self.lines removeObjectAtIndex:i]; @@ -69,6 +65,7 @@ - (void)deleteLineWithNumber:(int)i [self.tableView deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:i inSection:0]] withRowAnimation:UITableViewRowAnimationTop]; } +// Inserts a new line with given range and index. - (void)insertLineWithRange:(NSRange)range atIndex:(int)i { NSAttributedString *string; @@ -84,6 +81,7 @@ - (void)insertLineWithRange:(NSRange)range atIndex:(int)i [self.lineStartIndexes insertObject:@(range.location) atIndex:i]; } +// Retrieves the range of a given line - (NSRange)rangeOfLineWithIndex:(int)index { CTLineRef currentLine = (__bridge CTLineRef)(self.lines[index]); @@ -91,6 +89,7 @@ - (NSRange)rangeOfLineWithIndex:(int)index return range; } +// Adjustes the range locations of lines after the index, as well as the index line itself, with a given offset. - (void)offsetLineRangeLocationsFromLine:(int)index offset:(int)offset { for (int j = index; j < self.lineStartIndexes.count; j++) { @@ -98,6 +97,65 @@ - (void)offsetLineRangeLocationsFromLine:(int)index offset:(int)offset } } +// Retrieves the index of the line, that contains the given character-index. +- (NSUInteger)lineNumberAtIndex:(NSUInteger)index +{ + for (int i = 0; i < self.lineStartIndexes.count; i++) { + if ([(NSNumber *)self.lineStartIndexes[i] intValue] > index) return i-1; + } + return 0; +} + +NS_INLINE NSRange NSRangeFromCFRange(CFRange range) { + return NSMakeRange(range.location, range.length); +} + +// Helper method to release our cached Core Text framesetter and frame +- (void)clearPreviousLayoutInformation +{ + if (_framesetter != NULL) { + CFRelease(_framesetter); + _framesetter = NULL; + } +} + +// This generates the lines from scratch. Use only if necessary. +- (void)generateLines +{ + if (!self.attributedString) return; + + [self clearPreviousLayoutInformation]; + self.lines = @[].mutableCopy; + self.lineStartIndexes = @[].mutableCopy; + + CFAttributedStringRef ref = (CFAttributedStringRef)CFBridgingRetain(self.attributedString); + _framesetter = CTFramesetterCreateWithAttributedString(ref); + + // Work out the geometry + CGRect insetBounds = CGRectInset([self bounds], MARGIN, MARGIN); + CGFloat boundsWidth = CGRectGetWidth(insetBounds); + + // Calculate the lines + CFIndex start = 0; + NSUInteger length = CFAttributedStringGetLength((__bridge CFAttributedStringRef)(self.attributedString)); + while (start < length) + { + CTTypesetterRef typesetter = CTFramesetterGetTypesetter(_framesetter); + CFIndex count = CTTypesetterSuggestLineBreak(typesetter, start, boundsWidth); + CTLineRef line = CTLineCreateWithAttributedString((__bridge CFAttributedStringRef)([self.attributedString attributedSubstringFromRange:NSMakeRange(start, count)])); + + //NSString *string = [self.text substringWithRange:NSMakeRange(start, count)]; + //if ([string rangeOfString:@"\n"].location != NSNotFound) NSLog(@"YES"); + //else NSLog(@"NO"); + + [self.lines addObject:(__bridge id)(line)]; + [self.lineStartIndexes addObject:@(start)]; + + start += count; + } +} + +// This is what uses the helper methods above. It makes sure that the tableView is updated when the user changes the text. It should be called from -textView:shouldChangeTextInRange:replacementText: - (void)updatLineWithIndex:(int)i andRecentTextChange:(TextViewChange *)options { NSString *replacementText = options.replacementText; @@ -202,20 +260,20 @@ - (void)updatLineWithIndex:(int)i andRecentTextChange:(TextViewChange *)options } } +#pragma mark - TextView + - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { - //TODO: deactivate core-text overlay upon failure - //TODO: Nicer designflow - //TODO: Handle out of bound errors - - //Basic stuff, tokenize the string + // Create a TextViewChange to store range and replacementText TextViewChange *options = [[TextViewChange alloc] init]; options.replacementText = text; options.range = range; + // Keep the attributedString up to date, and tokenize it. [self.attributedString replaceCharactersInRange:range withAttributedString:[[NSAttributedString alloc] initWithString:text attributes:_attributes]]; _attributedString = [self.syntaxTokenizer tokenizeAttributedString:self.attributedString withRecentTextViewChange:options]; + // Get lineIndex of the current line NSInteger lineIndex = [self lineNumberAtIndex:NSMaxRange(range)]; NSInteger offset = text.length - range.length; @@ -226,7 +284,10 @@ - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range r // TODO: Handle cases where the range reaches across multiple lines } + // When adding or removing characters in the text, the rangeLocations of the lines must be updated [self offsetLineRangeLocationsFromLine:lineIndex + 1 offset:offset]; + + // This handles the setting of a new range for the current line, as well as newlines and backspace [self updatLineWithIndex:lineIndex andRecentTextChange:options]; return YES; @@ -234,8 +295,6 @@ - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range r #pragma mark - TableView - - - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return _lineHeight; @@ -266,64 +325,6 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N #pragma mark - -// Helper method to release our cached Core Text framesetter and frame -- (void)clearPreviousLayoutInformation -{ - if (_framesetter != NULL) { - CFRelease(_framesetter); - _framesetter = NULL; - } -} - -- (NSUInteger)lineNumberAtIndex:(NSUInteger)index -{ - for (int i = 0; i < self.lineStartIndexes.count; i++) { - if ([(NSNumber *)self.lineStartIndexes[i] intValue] > index) return i-1; - } - return 0; -} - -NS_INLINE NSRange NSRangeFromCFRange(CFRange range) { - return NSMakeRange(range.location, range.length); -} - -- (void)generateLines -{ - if (!self.attributedString) return; - - [self clearPreviousLayoutInformation]; - self.lines = @[].mutableCopy; - self.lineStartIndexes = @[].mutableCopy; - - CFAttributedStringRef ref = (CFAttributedStringRef)CFBridgingRetain(self.attributedString); - _framesetter = CTFramesetterCreateWithAttributedString(ref); - - // Work out the geometry - CGRect insetBounds = CGRectInset([self bounds], MARGIN, MARGIN); - CGFloat boundsWidth = CGRectGetWidth(insetBounds); - - // Calculate the lines - CFIndex start = 0; - NSUInteger length = CFAttributedStringGetLength((__bridge CFAttributedStringRef)(self.attributedString)); - while (start < length) - { - CTTypesetterRef typesetter = CTFramesetterGetTypesetter(_framesetter); - CFIndex count = CTTypesetterSuggestLineBreak(typesetter, start, boundsWidth); - CTLineRef line = CTLineCreateWithAttributedString((__bridge CFAttributedStringRef)([self.attributedString attributedSubstringFromRange:NSMakeRange(start, count)])); - - //NSString *string = [self.text substringWithRange:NSMakeRange(start, count)]; - //if ([string rangeOfString:@"\n"].location != NSNotFound) NSLog(@"YES"); - //else NSLog(@"NO"); - - [self.lines addObject:(__bridge id)(line)]; - [self.lineStartIndexes addObject:@(start)]; - - start += count; - } -} - -#pragma mark - - - (void)layoutSubviews { // This feels a bit strange. The tableview should maybe not be a subview of the tableView so that it doesn't move? @@ -348,8 +349,13 @@ - (UITableView *)tableView return _tableView; } +- (void)scrollViewDidScroll:(UIScrollView *)scrollView +{ + [self.tableView setContentOffset:self.contentOffset]; +} + -#pragma mark – +#pragma mark - (void)setAttributedString:(NSMutableAttributedString *)attributedString { diff --git a/Chromatism/JLTokenizer.m b/Chromatism/JLTokenizer.m index 04dcd88..e64cb1d 100644 --- a/Chromatism/JLTokenizer.m +++ b/Chromatism/JLTokenizer.m @@ -149,16 +149,16 @@ - (NSMutableAttributedString *)tokenizeAttributedString:(NSMutableAttributedStri return string; } -#pragma mark - Pattern help +#pragma mark - Pattern Helpers + +// TODO: Extend this - (NSString *)patternBetweenString:(NSString *)start andString:(NSString *)stop { return nil; } -#pragma mark - Color shemes - - +#pragma mark - Color Themes -(void)setTheme:(RegexHighlightViewTheme)theme { From a168f61b0e0800b256c3805f5befa4bd74d9a0bd Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Thu, 25 Apr 2013 14:13:46 +0200 Subject: [PATCH 014/140] Basics for live word-wrapping. --- Chromatism/JLTextView.m | 65 ++++++++++++++++++++++++++++++++++++++++- Chromatism/text.txt | 4 +++ 2 files changed, 68 insertions(+), 1 deletion(-) diff --git a/Chromatism/JLTextView.m b/Chromatism/JLTextView.m index 4b05742..309eb8a 100644 --- a/Chromatism/JLTextView.m +++ b/Chromatism/JLTextView.m @@ -145,7 +145,7 @@ - (void)generateLines CTLineRef line = CTLineCreateWithAttributedString((__bridge CFAttributedStringRef)([self.attributedString attributedSubstringFromRange:NSMakeRange(start, count)])); //NSString *string = [self.text substringWithRange:NSMakeRange(start, count)]; - //if ([string rangeOfString:@"\n"].location != NSNotFound) NSLog(@"YES"); + //NSLog(@"Generating Line:\"%@\"",string); //else NSLog(@"NO"); [self.lines addObject:(__bridge id)(line)]; @@ -155,6 +155,67 @@ - (void)generateLines } } +- (void)wordWrapLineWithIndex:(int)index +{ + NSRange lineRange = [self rangeOfLineWithIndex:index]; + NSLog(@"Word wrapping on line:\"%@\"",[self.attributedString.string substringWithRange:lineRange]); + + CGRect insetBounds = CGRectInset([self bounds], MARGIN, MARGIN); + CGFloat boundsWidth = CGRectGetWidth(insetBounds); + + // Calculate the lines + CFIndex start = lineRange.location; + CFIndex currentIndex = index; + NSUInteger length = CFAttributedStringGetLength((__bridge CFAttributedStringRef)(self.attributedString)); + + NSLog(@"Deleting the first line with an index of %li", currentIndex); + [self deleteLineWithNumber:index]; + + // This is very time-consuming, but reusing the old framesetter seem to cause trouble. + CTTypesetterRef typesetter = CTTypesetterCreateWithAttributedString((__bridge CFAttributedStringRef)(self.attributedString)); + + while (start < length) + { + CFIndex count = CTTypesetterSuggestLineBreak(typesetter, start, boundsWidth); + NSRange range = NSMakeRange(start, count); + + + // Check if hard or soft linebreak + if ([self.attributedString.string rangeOfString:@"\n" options:NSBackwardsSearch range:range].location != NSNotFound) + { + // This line contains a hard return. Stop. + NSLog(@"Inserting the last line to an index of :%li and string of \"%@\"", currentIndex, [self.attributedString.string substringWithRange:range]); + [self insertLineWithRange:range atIndex:currentIndex]; + + // Avoid duplicate lines + int maxRange = count + start; + for (int i = currentIndex + 1;; i++) { + int location = [(NSNumber *)self.lineStartIndexes[i] intValue]; + if (location < maxRange) + { + NSLog(@"Deleting Line With Index: %i, because it has a start location of %i while the refreshed maxRange is %i", i, location, maxRange); + [self deleteLineWithNumber:i]; + } + else break; + } + return; + + } + else + { + // This line contains a soft return. Continue. + NSLog(@"Inserting line to an index of :%li with text of \"%@\"", currentIndex, [self.attributedString.string substringWithRange:range]); + [self insertLineWithRange:range atIndex:currentIndex]; + + start += count; + currentIndex++; + } + } + + return; +} + + // This is what uses the helper methods above. It makes sure that the tableView is updated when the user changes the text. It should be called from -textView:shouldChangeTextInRange:replacementText: - (void)updatLineWithIndex:(int)i andRecentTextChange:(TextViewChange *)options { @@ -213,6 +274,8 @@ - (void)updatLineWithIndex:(int)i andRecentTextChange:(TextViewChange *)options [self setRange:mergedLineRange forLineWithIndex:i-1]; [self deleteLineWithNumber:i]; + + [self wordWrapLineWithIndex:i-1]; return; } } diff --git a/Chromatism/text.txt b/Chromatism/text.txt index 86fb657..b45ecdc 100644 --- a/Chromatism/text.txt +++ b/Chromatism/text.txt @@ -1,3 +1,7 @@ +00 +0000 1111 2222 3333 4444 5555 6666 +7777 8888 9999 + 00 01 02 From 6b64d7952943b87e00c84305164eff5f878feec8 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Wed, 22 May 2013 13:44:04 +0200 Subject: [PATCH 015/140] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index ed39270..b7cf403 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,8 @@ Chromatism This is an experimation of a Syntax Highlighting textView using a tableView and CoreText. It consists of a UITextView with a UITableVIew overlay. The UITextView has its textColor set to `[UIColor clearColor]` and ints only purpose is to provide a textinput. Ontop of the textView there is a `UITableView`, which render the lines currently visible. +## Bugs +At this moment there are *a lot* of bugs that need fixing. This is an experiment and a work in progress. ##This is what happens when the text editor is created: From 0d56fccc4d9d7e0806c63ab6b5c95a925e48dd67 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Wed, 12 Jun 2013 12:16:24 +0300 Subject: [PATCH 016/140] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index b7cf403..1914312 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ Chromatism ========== This is an experimation of a Syntax Highlighting textView using a tableView and CoreText. It consists of a UITextView with a UITableVIew overlay. The UITextView has its textColor set to `[UIColor clearColor]` and ints only purpose is to provide a textinput. Ontop of the textView there is a `UITableView`, which render the lines currently visible. +## iOS 7 +Most of this code will be thrown away in favor for new iOS 7 features. ## Bugs At this moment there are *a lot* of bugs that need fixing. This is an experiment and a work in progress. From 55d9a32fc919e68808dbe917b4265a63b3d44944 Mon Sep 17 00:00:00 2001 From: Johannes Lund Date: Mon, 1 Jul 2013 16:53:33 +0200 Subject: [PATCH 017/140] Chromatism is now a static library. From the chromatism frame of reference, this commit brings a lot of unnamed changes. Chromatism is once again a submodule in a far bigger project. --- Chromatism.xcodeproj/project.pbxproj | 540 ----------- Chromatism/AppDelegate.h | 15 - Chromatism/AppDelegate.m | 46 - Chromatism/Chromatism-Info.plist | 55 -- Chromatism/Chromatism-Prefix.pch | 14 - .../Chromatism.xcodeproj/project.pbxproj | 488 ++++++++++ Chromatism/Chromatism/CHLayoutManager.h | 13 + Chromatism/Chromatism/CHLayoutManager.m | 14 + Chromatism/Chromatism/Chromatism-Prefix.pch | 9 + Chromatism/Chromatism/Chromatism.h | 17 + Chromatism/Chromatism/Chromatism.m | 13 + Chromatism/{ => Chromatism}/Helpers.h | 14 +- Chromatism/{ => Chromatism}/Helpers.m | 16 +- Chromatism/Chromatism/JLScope.h | 51 ++ Chromatism/Chromatism/JLScope.m | 71 ++ Chromatism/Chromatism/JLTextStorage.h | 22 + Chromatism/Chromatism/JLTextStorage.m | 77 ++ Chromatism/Chromatism/JLTextViewController.h | 43 + Chromatism/Chromatism/JLTextViewController.m | 203 +++++ Chromatism/Chromatism/JLTokenPattern.h | 25 + Chromatism/Chromatism/JLTokenPattern.m | 32 + Chromatism/Chromatism/JLTokenizer.h | 17 + Chromatism/Chromatism/JLTokenizer.m | 242 +++++ Chromatism/Chromatism/test.json | 3 + .../ChromatismTests-Info.plist | 0 Chromatism/ChromatismTests/ChromatismTests.m | 53 ++ .../en.lproj/InfoPlist.strings | 0 Chromatism/Default-568h@2x.png | Bin 18594 -> 0 bytes Chromatism/Default.png | Bin 6540 -> 0 bytes Chromatism/Default@2x.png | Bin 16107 -> 0 bytes Chromatism/JLTextView.h | 51 -- Chromatism/JLTextView.m | 535 ----------- Chromatism/JLTokenizer.h | 48 - Chromatism/JLTokenizer.m | 339 ------- Chromatism/Menlo.ttf | Bin 2172912 -> 0 bytes Chromatism/TextLineCell.h | 17 - Chromatism/TextLineCell.m | 59 -- Chromatism/ViewController.h | 15 - Chromatism/ViewController.m | 47 - .../en.lproj/MainStoryboard_iPad.storyboard | 26 - .../en.lproj/MainStoryboard_iPhone.storyboard | 26 - Chromatism/main.m | 18 - Chromatism/text.txt | 856 ------------------ ChromatismTests/ChromatismTests.h | 13 - ChromatismTests/ChromatismTests.m | 32 - ChromatismTests/en.lproj/InfoPlist.strings | 2 - 46 files changed, 1418 insertions(+), 2759 deletions(-) delete mode 100644 Chromatism.xcodeproj/project.pbxproj delete mode 100644 Chromatism/AppDelegate.h delete mode 100644 Chromatism/AppDelegate.m delete mode 100644 Chromatism/Chromatism-Info.plist delete mode 100644 Chromatism/Chromatism-Prefix.pch create mode 100644 Chromatism/Chromatism.xcodeproj/project.pbxproj create mode 100644 Chromatism/Chromatism/CHLayoutManager.h create mode 100644 Chromatism/Chromatism/CHLayoutManager.m create mode 100644 Chromatism/Chromatism/Chromatism-Prefix.pch create mode 100644 Chromatism/Chromatism/Chromatism.h create mode 100644 Chromatism/Chromatism/Chromatism.m rename Chromatism/{ => Chromatism}/Helpers.h (73%) rename Chromatism/{ => Chromatism}/Helpers.m (91%) create mode 100644 Chromatism/Chromatism/JLScope.h create mode 100644 Chromatism/Chromatism/JLScope.m create mode 100644 Chromatism/Chromatism/JLTextStorage.h create mode 100644 Chromatism/Chromatism/JLTextStorage.m create mode 100644 Chromatism/Chromatism/JLTextViewController.h create mode 100644 Chromatism/Chromatism/JLTextViewController.m create mode 100644 Chromatism/Chromatism/JLTokenPattern.h create mode 100644 Chromatism/Chromatism/JLTokenPattern.m create mode 100644 Chromatism/Chromatism/JLTokenizer.h create mode 100644 Chromatism/Chromatism/JLTokenizer.m create mode 100644 Chromatism/Chromatism/test.json rename {ChromatismTests => Chromatism/ChromatismTests}/ChromatismTests-Info.plist (100%) create mode 100644 Chromatism/ChromatismTests/ChromatismTests.m rename Chromatism/{ => ChromatismTests}/en.lproj/InfoPlist.strings (100%) delete mode 100644 Chromatism/Default-568h@2x.png delete mode 100644 Chromatism/Default.png delete mode 100644 Chromatism/Default@2x.png delete mode 100644 Chromatism/JLTextView.h delete mode 100644 Chromatism/JLTextView.m delete mode 100644 Chromatism/JLTokenizer.h delete mode 100644 Chromatism/JLTokenizer.m delete mode 100644 Chromatism/Menlo.ttf delete mode 100644 Chromatism/TextLineCell.h delete mode 100644 Chromatism/TextLineCell.m delete mode 100644 Chromatism/ViewController.h delete mode 100644 Chromatism/ViewController.m delete mode 100644 Chromatism/en.lproj/MainStoryboard_iPad.storyboard delete mode 100644 Chromatism/en.lproj/MainStoryboard_iPhone.storyboard delete mode 100644 Chromatism/main.m delete mode 100644 Chromatism/text.txt delete mode 100644 ChromatismTests/ChromatismTests.h delete mode 100644 ChromatismTests/ChromatismTests.m delete mode 100644 ChromatismTests/en.lproj/InfoPlist.strings diff --git a/Chromatism.xcodeproj/project.pbxproj b/Chromatism.xcodeproj/project.pbxproj deleted file mode 100644 index 16917f2..0000000 --- a/Chromatism.xcodeproj/project.pbxproj +++ /dev/null @@ -1,540 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 8F0F057A169C98770060CB48 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F0F0579169C98770060CB48 /* UIKit.framework */; }; - 8F0F057C169C98770060CB48 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F0F057B169C98770060CB48 /* Foundation.framework */; }; - 8F0F057E169C98770060CB48 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F0F057D169C98770060CB48 /* CoreGraphics.framework */; }; - 8F0F0584169C98770060CB48 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 8F0F0582169C98770060CB48 /* InfoPlist.strings */; }; - 8F0F0586169C98770060CB48 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F0F0585169C98770060CB48 /* main.m */; }; - 8F0F058A169C98770060CB48 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F0F0589169C98770060CB48 /* AppDelegate.m */; }; - 8F0F058C169C98770060CB48 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 8F0F058B169C98770060CB48 /* Default.png */; }; - 8F0F058E169C98770060CB48 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8F0F058D169C98770060CB48 /* Default@2x.png */; }; - 8F0F0590169C98770060CB48 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8F0F058F169C98770060CB48 /* Default-568h@2x.png */; }; - 8F0F0593169C98770060CB48 /* MainStoryboard_iPhone.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8F0F0591169C98770060CB48 /* MainStoryboard_iPhone.storyboard */; }; - 8F0F0596169C98770060CB48 /* MainStoryboard_iPad.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8F0F0594169C98770060CB48 /* MainStoryboard_iPad.storyboard */; }; - 8F0F0599169C98770060CB48 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F0F0598169C98770060CB48 /* ViewController.m */; }; - 8F0F05A1169C98770060CB48 /* SenTestingKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F0F05A0169C98770060CB48 /* SenTestingKit.framework */; }; - 8F0F05A2169C98770060CB48 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F0F0579169C98770060CB48 /* UIKit.framework */; }; - 8F0F05A3169C98770060CB48 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F0F057B169C98770060CB48 /* Foundation.framework */; }; - 8F0F05AB169C98770060CB48 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 8F0F05A9169C98770060CB48 /* InfoPlist.strings */; }; - 8F0F05AE169C98770060CB48 /* ChromatismTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F0F05AD169C98770060CB48 /* ChromatismTests.m */; }; - 8F103C89169C9EDC000E8716 /* Menlo.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 8F103C88169C9EDC000E8716 /* Menlo.ttf */; }; - 8F103C8A169C9EDC000E8716 /* Menlo.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 8F103C88169C9EDC000E8716 /* Menlo.ttf */; }; - 8F15D048169D894A0040A698 /* JLTokenizer.m in Resources */ = {isa = PBXBuildFile; fileRef = 8F503F60169C99AE0064717A /* JLTokenizer.m */; }; - 8F15D04A169D8A180040A698 /* text.txt in Resources */ = {isa = PBXBuildFile; fileRef = 8F15D049169D8A180040A698 /* text.txt */; }; - 8F5040A1169C99AE0064717A /* JLTokenizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F503F60169C99AE0064717A /* JLTokenizer.m */; }; - 8F5040A2169C99AE0064717A /* JLTokenizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F503F60169C99AE0064717A /* JLTokenizer.m */; }; - 8F5040A5169C99C60064717A /* JLTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F5040A4169C99C60064717A /* JLTextView.m */; }; - 8F5040A6169C99C60064717A /* JLTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F5040A4169C99C60064717A /* JLTextView.m */; }; - 8F5040AC169C9A5A0064717A /* TextLineCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F5040AB169C9A5A0064717A /* TextLineCell.m */; }; - 8F5040AD169C9A5A0064717A /* TextLineCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F5040AB169C9A5A0064717A /* TextLineCell.m */; }; - 8F5040B1169C9AFF0064717A /* Helpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F5040B0169C9AFF0064717A /* Helpers.m */; }; - 8F5040B2169C9AFF0064717A /* Helpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F5040B0169C9AFF0064717A /* Helpers.m */; }; - 8F5040B4169C9B240064717A /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F5040B3169C9B240064717A /* CoreText.framework */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 8F0F05A4169C98770060CB48 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 8F0F056E169C98770060CB48 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 8F0F0575169C98770060CB48; - remoteInfo = Chromatism; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 8F0F0576169C98770060CB48 /* Chromatism.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Chromatism.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 8F0F0579169C98770060CB48 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 8F0F057B169C98770060CB48 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; - 8F0F057D169C98770060CB48 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - 8F0F0581169C98770060CB48 /* Chromatism-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Chromatism-Info.plist"; sourceTree = ""; }; - 8F0F0583169C98770060CB48 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - 8F0F0585169C98770060CB48 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 8F0F0587169C98770060CB48 /* Chromatism-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Chromatism-Prefix.pch"; sourceTree = ""; }; - 8F0F0588169C98770060CB48 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; - 8F0F0589169C98770060CB48 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; - 8F0F058B169C98770060CB48 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = ""; }; - 8F0F058D169C98770060CB48 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x.png"; sourceTree = ""; }; - 8F0F058F169C98770060CB48 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; - 8F0F0592169C98770060CB48 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainStoryboard_iPhone.storyboard; sourceTree = ""; }; - 8F0F0595169C98770060CB48 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainStoryboard_iPad.storyboard; sourceTree = ""; }; - 8F0F0597169C98770060CB48 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; - 8F0F0598169C98770060CB48 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; - 8F0F059F169C98770060CB48 /* ChromatismTests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ChromatismTests.octest; sourceTree = BUILT_PRODUCTS_DIR; }; - 8F0F05A0169C98770060CB48 /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; }; - 8F0F05A8169C98770060CB48 /* ChromatismTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ChromatismTests-Info.plist"; sourceTree = ""; }; - 8F0F05AA169C98770060CB48 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - 8F0F05AC169C98770060CB48 /* ChromatismTests.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ChromatismTests.h; sourceTree = ""; }; - 8F0F05AD169C98770060CB48 /* ChromatismTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ChromatismTests.m; sourceTree = ""; }; - 8F103C88169C9EDC000E8716 /* Menlo.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = Menlo.ttf; sourceTree = ""; }; - 8F15D049169D8A180040A698 /* text.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = text.txt; sourceTree = ""; }; - 8F503F5F169C99AE0064717A /* JLTokenizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JLTokenizer.h; sourceTree = ""; }; - 8F503F60169C99AE0064717A /* JLTokenizer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JLTokenizer.m; sourceTree = ""; }; - 8F5040A3169C99C60064717A /* JLTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JLTextView.h; sourceTree = ""; }; - 8F5040A4169C99C60064717A /* JLTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JLTextView.m; sourceTree = ""; }; - 8F5040AA169C9A5A0064717A /* TextLineCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextLineCell.h; sourceTree = ""; }; - 8F5040AB169C9A5A0064717A /* TextLineCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TextLineCell.m; sourceTree = ""; }; - 8F5040AF169C9AFF0064717A /* Helpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Helpers.h; sourceTree = ""; }; - 8F5040B0169C9AFF0064717A /* Helpers.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Helpers.m; sourceTree = ""; }; - 8F5040B3169C9B240064717A /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 8F0F0573169C98770060CB48 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 8F5040B4169C9B240064717A /* CoreText.framework in Frameworks */, - 8F0F057A169C98770060CB48 /* UIKit.framework in Frameworks */, - 8F0F057C169C98770060CB48 /* Foundation.framework in Frameworks */, - 8F0F057E169C98770060CB48 /* CoreGraphics.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8F0F059B169C98770060CB48 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 8F0F05A1169C98770060CB48 /* SenTestingKit.framework in Frameworks */, - 8F0F05A2169C98770060CB48 /* UIKit.framework in Frameworks */, - 8F0F05A3169C98770060CB48 /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 8F0F056D169C98770060CB48 = { - isa = PBXGroup; - children = ( - 8F0F057F169C98770060CB48 /* Chromatism */, - 8F0F05A6169C98770060CB48 /* ChromatismTests */, - 8F0F0578169C98770060CB48 /* Frameworks */, - 8F0F0577169C98770060CB48 /* Products */, - ); - sourceTree = ""; - }; - 8F0F0577169C98770060CB48 /* Products */ = { - isa = PBXGroup; - children = ( - 8F0F0576169C98770060CB48 /* Chromatism.app */, - 8F0F059F169C98770060CB48 /* ChromatismTests.octest */, - ); - name = Products; - sourceTree = ""; - }; - 8F0F0578169C98770060CB48 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 8F5040B3169C9B240064717A /* CoreText.framework */, - 8F0F0579169C98770060CB48 /* UIKit.framework */, - 8F0F057B169C98770060CB48 /* Foundation.framework */, - 8F0F057D169C98770060CB48 /* CoreGraphics.framework */, - 8F0F05A0169C98770060CB48 /* SenTestingKit.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 8F0F057F169C98770060CB48 /* Chromatism */ = { - isa = PBXGroup; - children = ( - 8F5040AE169C9A660064717A /* Syntax Highlighting */, - 8F0F0588169C98770060CB48 /* AppDelegate.h */, - 8F0F0589169C98770060CB48 /* AppDelegate.m */, - 8F0F0591169C98770060CB48 /* MainStoryboard_iPhone.storyboard */, - 8F0F0594169C98770060CB48 /* MainStoryboard_iPad.storyboard */, - 8F0F0597169C98770060CB48 /* ViewController.h */, - 8F0F0598169C98770060CB48 /* ViewController.m */, - 8F0F0580169C98770060CB48 /* Supporting Files */, - ); - path = Chromatism; - sourceTree = ""; - }; - 8F0F0580169C98770060CB48 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 8F103C88169C9EDC000E8716 /* Menlo.ttf */, - 8F15D049169D8A180040A698 /* text.txt */, - 8F0F0581169C98770060CB48 /* Chromatism-Info.plist */, - 8F0F0582169C98770060CB48 /* InfoPlist.strings */, - 8F0F0585169C98770060CB48 /* main.m */, - 8F0F0587169C98770060CB48 /* Chromatism-Prefix.pch */, - 8F0F058B169C98770060CB48 /* Default.png */, - 8F0F058D169C98770060CB48 /* Default@2x.png */, - 8F0F058F169C98770060CB48 /* Default-568h@2x.png */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 8F0F05A6169C98770060CB48 /* ChromatismTests */ = { - isa = PBXGroup; - children = ( - 8F0F05AC169C98770060CB48 /* ChromatismTests.h */, - 8F0F05AD169C98770060CB48 /* ChromatismTests.m */, - 8F0F05A7169C98770060CB48 /* Supporting Files */, - ); - path = ChromatismTests; - sourceTree = ""; - }; - 8F0F05A7169C98770060CB48 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 8F0F05A8169C98770060CB48 /* ChromatismTests-Info.plist */, - 8F0F05A9169C98770060CB48 /* InfoPlist.strings */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 8F5040AE169C9A660064717A /* Syntax Highlighting */ = { - isa = PBXGroup; - children = ( - 8F503F5F169C99AE0064717A /* JLTokenizer.h */, - 8F503F60169C99AE0064717A /* JLTokenizer.m */, - 8F5040A3169C99C60064717A /* JLTextView.h */, - 8F5040A4169C99C60064717A /* JLTextView.m */, - 8F5040AA169C9A5A0064717A /* TextLineCell.h */, - 8F5040AB169C9A5A0064717A /* TextLineCell.m */, - 8F5040AF169C9AFF0064717A /* Helpers.h */, - 8F5040B0169C9AFF0064717A /* Helpers.m */, - ); - name = "Syntax Highlighting"; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 8F0F0575169C98770060CB48 /* Chromatism */ = { - isa = PBXNativeTarget; - buildConfigurationList = 8F0F05B1169C98770060CB48 /* Build configuration list for PBXNativeTarget "Chromatism" */; - buildPhases = ( - 8F0F0572169C98770060CB48 /* Sources */, - 8F0F0573169C98770060CB48 /* Frameworks */, - 8F0F0574169C98770060CB48 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Chromatism; - productName = Chromatism; - productReference = 8F0F0576169C98770060CB48 /* Chromatism.app */; - productType = "com.apple.product-type.application"; - }; - 8F0F059E169C98770060CB48 /* ChromatismTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 8F0F05B4169C98770060CB48 /* Build configuration list for PBXNativeTarget "ChromatismTests" */; - buildPhases = ( - 8F0F059A169C98770060CB48 /* Sources */, - 8F0F059B169C98770060CB48 /* Frameworks */, - 8F0F059C169C98770060CB48 /* Resources */, - 8F0F059D169C98770060CB48 /* ShellScript */, - ); - buildRules = ( - ); - dependencies = ( - 8F0F05A5169C98770060CB48 /* PBXTargetDependency */, - ); - name = ChromatismTests; - productName = ChromatismTests; - productReference = 8F0F059F169C98770060CB48 /* ChromatismTests.octest */; - productType = "com.apple.product-type.bundle"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 8F0F056E169C98770060CB48 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0460; - ORGANIZATIONNAME = Anviking; - }; - buildConfigurationList = 8F0F0571169C98770060CB48 /* Build configuration list for PBXProject "Chromatism" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = 8F0F056D169C98770060CB48; - productRefGroup = 8F0F0577169C98770060CB48 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 8F0F0575169C98770060CB48 /* Chromatism */, - 8F0F059E169C98770060CB48 /* ChromatismTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 8F0F0574169C98770060CB48 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 8F15D048169D894A0040A698 /* JLTokenizer.m in Resources */, - 8F0F0584169C98770060CB48 /* InfoPlist.strings in Resources */, - 8F0F058C169C98770060CB48 /* Default.png in Resources */, - 8F0F058E169C98770060CB48 /* Default@2x.png in Resources */, - 8F0F0590169C98770060CB48 /* Default-568h@2x.png in Resources */, - 8F0F0593169C98770060CB48 /* MainStoryboard_iPhone.storyboard in Resources */, - 8F0F0596169C98770060CB48 /* MainStoryboard_iPad.storyboard in Resources */, - 8F103C89169C9EDC000E8716 /* Menlo.ttf in Resources */, - 8F15D04A169D8A180040A698 /* text.txt in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8F0F059C169C98770060CB48 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 8F0F05AB169C98770060CB48 /* InfoPlist.strings in Resources */, - 8F103C8A169C9EDC000E8716 /* Menlo.ttf in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 8F0F059D169C98770060CB48 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 8F0F0572169C98770060CB48 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 8F0F0586169C98770060CB48 /* main.m in Sources */, - 8F0F058A169C98770060CB48 /* AppDelegate.m in Sources */, - 8F0F0599169C98770060CB48 /* ViewController.m in Sources */, - 8F5040A1169C99AE0064717A /* JLTokenizer.m in Sources */, - 8F5040A5169C99C60064717A /* JLTextView.m in Sources */, - 8F5040AC169C9A5A0064717A /* TextLineCell.m in Sources */, - 8F5040B1169C9AFF0064717A /* Helpers.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8F0F059A169C98770060CB48 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 8F0F05AE169C98770060CB48 /* ChromatismTests.m in Sources */, - 8F5040A2169C99AE0064717A /* JLTokenizer.m in Sources */, - 8F5040A6169C99C60064717A /* JLTextView.m in Sources */, - 8F5040AD169C9A5A0064717A /* TextLineCell.m in Sources */, - 8F5040B2169C9AFF0064717A /* Helpers.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 8F0F05A5169C98770060CB48 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 8F0F0575169C98770060CB48 /* Chromatism */; - targetProxy = 8F0F05A4169C98770060CB48 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 8F0F0582169C98770060CB48 /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - 8F0F0583169C98770060CB48 /* en */, - ); - name = InfoPlist.strings; - sourceTree = ""; - }; - 8F0F0591169C98770060CB48 /* MainStoryboard_iPhone.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 8F0F0592169C98770060CB48 /* en */, - ); - name = MainStoryboard_iPhone.storyboard; - sourceTree = ""; - }; - 8F0F0594169C98770060CB48 /* MainStoryboard_iPad.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 8F0F0595169C98770060CB48 /* en */, - ); - name = MainStoryboard_iPad.storyboard; - sourceTree = ""; - }; - 8F0F05A9169C98770060CB48 /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - 8F0F05AA169C98770060CB48 /* en */, - ); - name = InfoPlist.strings; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 8F0F05AF169C98770060CB48 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 6.1; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 8F0F05B0169C98770060CB48 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 6.1; - OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 8F0F05B2169C98770060CB48 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Chromatism/Chromatism-Prefix.pch"; - INFOPLIST_FILE = "Chromatism/Chromatism-Info.plist"; - PRODUCT_NAME = "$(TARGET_NAME)"; - WRAPPER_EXTENSION = app; - }; - name = Debug; - }; - 8F0F05B3169C98770060CB48 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Chromatism/Chromatism-Prefix.pch"; - INFOPLIST_FILE = "Chromatism/Chromatism-Info.plist"; - PRODUCT_NAME = "$(TARGET_NAME)"; - WRAPPER_EXTENSION = app; - }; - name = Release; - }; - 8F0F05B5169C98770060CB48 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/Chromatism.app/Chromatism"; - FRAMEWORK_SEARCH_PATHS = ( - "\"$(SDKROOT)/Developer/Library/Frameworks\"", - "\"$(DEVELOPER_LIBRARY_DIR)/Frameworks\"", - ); - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Chromatism/Chromatism-Prefix.pch"; - INFOPLIST_FILE = "ChromatismTests/ChromatismTests-Info.plist"; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUNDLE_LOADER)"; - WRAPPER_EXTENSION = octest; - }; - name = Debug; - }; - 8F0F05B6169C98770060CB48 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/Chromatism.app/Chromatism"; - FRAMEWORK_SEARCH_PATHS = ( - "\"$(SDKROOT)/Developer/Library/Frameworks\"", - "\"$(DEVELOPER_LIBRARY_DIR)/Frameworks\"", - ); - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Chromatism/Chromatism-Prefix.pch"; - INFOPLIST_FILE = "ChromatismTests/ChromatismTests-Info.plist"; - PRODUCT_NAME = "$(TARGET_NAME)"; - TEST_HOST = "$(BUNDLE_LOADER)"; - WRAPPER_EXTENSION = octest; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 8F0F0571169C98770060CB48 /* Build configuration list for PBXProject "Chromatism" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 8F0F05AF169C98770060CB48 /* Debug */, - 8F0F05B0169C98770060CB48 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 8F0F05B1169C98770060CB48 /* Build configuration list for PBXNativeTarget "Chromatism" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 8F0F05B2169C98770060CB48 /* Debug */, - 8F0F05B3169C98770060CB48 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 8F0F05B4169C98770060CB48 /* Build configuration list for PBXNativeTarget "ChromatismTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 8F0F05B5169C98770060CB48 /* Debug */, - 8F0F05B6169C98770060CB48 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 8F0F056E169C98770060CB48 /* Project object */; -} diff --git a/Chromatism/AppDelegate.h b/Chromatism/AppDelegate.h deleted file mode 100644 index c22f5bf..0000000 --- a/Chromatism/AppDelegate.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// AppDelegate.h -// Chromatism -// -// Created by Johannes Lund on 2013-01-08. -// Copyright (c) 2013 Anviking. All rights reserved. -// - -#import - -@interface AppDelegate : UIResponder - -@property (strong, nonatomic) UIWindow *window; - -@end diff --git a/Chromatism/AppDelegate.m b/Chromatism/AppDelegate.m deleted file mode 100644 index 9d271c5..0000000 --- a/Chromatism/AppDelegate.m +++ /dev/null @@ -1,46 +0,0 @@ -// -// AppDelegate.m -// Chromatism -// -// Created by Johannes Lund on 2013-01-08. -// Copyright (c) 2013 Anviking. All rights reserved. -// - -#import "AppDelegate.h" - -@implementation AppDelegate - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions -{ - // Override point for customization after application launch. - return YES; -} - -- (void)applicationWillResignActive:(UIApplication *)application -{ - // 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. - // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. -} - -- (void)applicationDidEnterBackground:(UIApplication *)application -{ - // 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. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. -} - -- (void)applicationWillEnterForeground:(UIApplication *)application -{ - // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. -} - -- (void)applicationDidBecomeActive:(UIApplication *)application -{ - // 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. -} - -- (void)applicationWillTerminate:(UIApplication *)application -{ - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. -} - -@end diff --git a/Chromatism/Chromatism-Info.plist b/Chromatism/Chromatism-Info.plist deleted file mode 100644 index c77cef6..0000000 --- a/Chromatism/Chromatism-Info.plist +++ /dev/null @@ -1,55 +0,0 @@ - - - - - ATSApplicationFontsPath - - CFBundleDevelopmentRegion - en - CFBundleDisplayName - ${PRODUCT_NAME} - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - anviking.${PRODUCT_NAME:rfc1034identifier} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - LSRequiresIPhoneOS - - UIMainStoryboardFile - MainStoryboard_iPhone - UIMainStoryboardFile~ipad - MainStoryboard_iPad - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIAppFonts - - Menlo.ttf - - - diff --git a/Chromatism/Chromatism-Prefix.pch b/Chromatism/Chromatism-Prefix.pch deleted file mode 100644 index 3a6a08c..0000000 --- a/Chromatism/Chromatism-Prefix.pch +++ /dev/null @@ -1,14 +0,0 @@ -// -// Prefix header for all source files of the 'Chromatism' target in the 'Chromatism' project -// - -#import - -#ifndef __IPHONE_5_0 -#warning "This project uses features only available in iOS SDK 5.0 and later." -#endif - -#ifdef __OBJC__ - #import - #import -#endif diff --git a/Chromatism/Chromatism.xcodeproj/project.pbxproj b/Chromatism/Chromatism.xcodeproj/project.pbxproj new file mode 100644 index 0000000..1dae815 --- /dev/null +++ b/Chromatism/Chromatism.xcodeproj/project.pbxproj @@ -0,0 +1,488 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 8F3AB92A1781C0BA0023348A /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F3AB9291781C0BA0023348A /* XCTest.framework */; }; + 8F3AB92B1781C0BB0023348A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F3AB91B1781C0BA0023348A /* Foundation.framework */; }; + 8F3AB92D1781C0BB0023348A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F3AB92C1781C0BB0023348A /* UIKit.framework */; }; + 8F3AB9301781C0BB0023348A /* libChromatism.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F3AB9181781C0BA0023348A /* libChromatism.a */; }; + 8F3AB9361781C0BB0023348A /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 8F3AB9341781C0BB0023348A /* InfoPlist.strings */; }; + 8F3AB9381781C0BB0023348A /* ChromatismTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F3AB9371781C0BB0023348A /* ChromatismTests.m */; }; + 8F3AB9621781C26A0023348A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8F3AB9611781C26A0023348A /* UIKit.framework */; }; + 8F54EF0E1781C776008C1609 /* Chromatism.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F3AB9201781C0BA0023348A /* Chromatism.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8F54EF0F1781C788008C1609 /* CHLayoutManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F3AB94A1781C1180023348A /* CHLayoutManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8F54EF101781C788008C1609 /* Helpers.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F3AB94D1781C1250023348A /* Helpers.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8F54EF111781C788008C1609 /* JLScope.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F3AB94F1781C1250023348A /* JLScope.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8F54EF121781C788008C1609 /* JLTextStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F3AB9511781C1250023348A /* JLTextStorage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8F54EF131781C788008C1609 /* JLTextViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F3AB9531781C1250023348A /* JLTextViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8F54EF141781C788008C1609 /* JLTokenizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F3AB9551781C1250023348A /* JLTokenizer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8F54EF151781C788008C1609 /* JLTokenPattern.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F3AB9571781C1250023348A /* JLTokenPattern.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8F54EF1D1781CD87008C1609 /* CHLayoutManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F3AB94B1781C1180023348A /* CHLayoutManager.m */; }; + 8F54EF1E1781CD87008C1609 /* Chromatism.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F3AB9221781C0BA0023348A /* Chromatism.m */; }; + 8F54EF1F1781CD87008C1609 /* Helpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F3AB94E1781C1250023348A /* Helpers.m */; }; + 8F54EF201781CD87008C1609 /* JLScope.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F3AB9501781C1250023348A /* JLScope.m */; }; + 8F54EF211781CD87008C1609 /* JLTextStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F3AB9521781C1250023348A /* JLTextStorage.m */; }; + 8F54EF221781CD87008C1609 /* JLTextViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F3AB9541781C1250023348A /* JLTextViewController.m */; }; + 8F54EF231781CD87008C1609 /* JLTokenizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F3AB9561781C1250023348A /* JLTokenizer.m */; }; + 8F54EF241781CD87008C1609 /* JLTokenPattern.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F3AB9581781C1250023348A /* JLTokenPattern.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 8F3AB92E1781C0BB0023348A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 8F3AB9101781C0BA0023348A /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8F3AB9171781C0BA0023348A; + remoteInfo = Chromatism; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 8F3AB9181781C0BA0023348A /* libChromatism.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libChromatism.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 8F3AB91B1781C0BA0023348A /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 8F3AB91F1781C0BA0023348A /* Chromatism-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Chromatism-Prefix.pch"; sourceTree = ""; }; + 8F3AB9201781C0BA0023348A /* Chromatism.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Chromatism.h; sourceTree = ""; }; + 8F3AB9221781C0BA0023348A /* Chromatism.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Chromatism.m; sourceTree = ""; }; + 8F3AB9281781C0BA0023348A /* ChromatismTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ChromatismTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 8F3AB9291781C0BA0023348A /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; + 8F3AB92C1781C0BB0023348A /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; + 8F3AB9331781C0BB0023348A /* ChromatismTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "ChromatismTests-Info.plist"; sourceTree = ""; }; + 8F3AB9351781C0BB0023348A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 8F3AB9371781C0BB0023348A /* ChromatismTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ChromatismTests.m; sourceTree = ""; }; + 8F3AB94A1781C1180023348A /* CHLayoutManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CHLayoutManager.h; sourceTree = ""; }; + 8F3AB94B1781C1180023348A /* CHLayoutManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CHLayoutManager.m; sourceTree = ""; }; + 8F3AB94D1781C1250023348A /* Helpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Helpers.h; sourceTree = ""; }; + 8F3AB94E1781C1250023348A /* Helpers.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Helpers.m; sourceTree = ""; }; + 8F3AB94F1781C1250023348A /* JLScope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JLScope.h; sourceTree = ""; }; + 8F3AB9501781C1250023348A /* JLScope.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JLScope.m; sourceTree = ""; }; + 8F3AB9511781C1250023348A /* JLTextStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JLTextStorage.h; sourceTree = ""; }; + 8F3AB9521781C1250023348A /* JLTextStorage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JLTextStorage.m; sourceTree = ""; }; + 8F3AB9531781C1250023348A /* JLTextViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JLTextViewController.h; sourceTree = ""; }; + 8F3AB9541781C1250023348A /* JLTextViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JLTextViewController.m; sourceTree = ""; }; + 8F3AB9551781C1250023348A /* JLTokenizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JLTokenizer.h; sourceTree = ""; }; + 8F3AB9561781C1250023348A /* JLTokenizer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JLTokenizer.m; sourceTree = ""; }; + 8F3AB9571781C1250023348A /* JLTokenPattern.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JLTokenPattern.h; sourceTree = ""; }; + 8F3AB9581781C1250023348A /* JLTokenPattern.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JLTokenPattern.m; sourceTree = ""; }; + 8F3AB95F1781C12F0023348A /* test.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = test.json; sourceTree = ""; }; + 8F3AB9611781C26A0023348A /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8F3AB9151781C0BA0023348A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 8F3AB9621781C26A0023348A /* UIKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8F3AB9251781C0BA0023348A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 8F3AB9301781C0BB0023348A /* libChromatism.a in Frameworks */, + 8F3AB92A1781C0BA0023348A /* XCTest.framework in Frameworks */, + 8F3AB92D1781C0BB0023348A /* UIKit.framework in Frameworks */, + 8F3AB92B1781C0BB0023348A /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 8F3AB90F1781C0BA0023348A = { + isa = PBXGroup; + children = ( + 8F3AB91D1781C0BA0023348A /* Chromatism */, + 8F3AB9311781C0BB0023348A /* ChromatismTests */, + 8F3AB91A1781C0BA0023348A /* Frameworks */, + 8F3AB9191781C0BA0023348A /* Products */, + ); + sourceTree = ""; + }; + 8F3AB9191781C0BA0023348A /* Products */ = { + isa = PBXGroup; + children = ( + 8F3AB9181781C0BA0023348A /* libChromatism.a */, + 8F3AB9281781C0BA0023348A /* ChromatismTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 8F3AB91A1781C0BA0023348A /* Frameworks */ = { + isa = PBXGroup; + children = ( + 8F3AB9611781C26A0023348A /* UIKit.framework */, + 8F3AB91B1781C0BA0023348A /* Foundation.framework */, + 8F3AB9291781C0BA0023348A /* XCTest.framework */, + 8F3AB92C1781C0BB0023348A /* UIKit.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 8F3AB91D1781C0BA0023348A /* Chromatism */ = { + isa = PBXGroup; + children = ( + 8F3AB94A1781C1180023348A /* CHLayoutManager.h */, + 8F3AB94B1781C1180023348A /* CHLayoutManager.m */, + 8F3AB9201781C0BA0023348A /* Chromatism.h */, + 8F3AB9221781C0BA0023348A /* Chromatism.m */, + 8F3AB94D1781C1250023348A /* Helpers.h */, + 8F3AB94E1781C1250023348A /* Helpers.m */, + 8F3AB94F1781C1250023348A /* JLScope.h */, + 8F3AB9501781C1250023348A /* JLScope.m */, + 8F3AB9511781C1250023348A /* JLTextStorage.h */, + 8F3AB9521781C1250023348A /* JLTextStorage.m */, + 8F3AB9531781C1250023348A /* JLTextViewController.h */, + 8F3AB9541781C1250023348A /* JLTextViewController.m */, + 8F3AB9551781C1250023348A /* JLTokenizer.h */, + 8F3AB9561781C1250023348A /* JLTokenizer.m */, + 8F3AB9571781C1250023348A /* JLTokenPattern.h */, + 8F3AB9581781C1250023348A /* JLTokenPattern.m */, + 8F3AB91E1781C0BA0023348A /* Supporting Files */, + ); + path = Chromatism; + sourceTree = ""; + }; + 8F3AB91E1781C0BA0023348A /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 8F3AB95F1781C12F0023348A /* test.json */, + 8F3AB91F1781C0BA0023348A /* Chromatism-Prefix.pch */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 8F3AB9311781C0BB0023348A /* ChromatismTests */ = { + isa = PBXGroup; + children = ( + 8F3AB9371781C0BB0023348A /* ChromatismTests.m */, + 8F3AB9321781C0BB0023348A /* Supporting Files */, + ); + path = ChromatismTests; + sourceTree = ""; + }; + 8F3AB9321781C0BB0023348A /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 8F3AB9331781C0BB0023348A /* ChromatismTests-Info.plist */, + 8F3AB9341781C0BB0023348A /* InfoPlist.strings */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 8F54EF0D1781C769008C1609 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 8F54EF0E1781C776008C1609 /* Chromatism.h in Headers */, + 8F54EF0F1781C788008C1609 /* CHLayoutManager.h in Headers */, + 8F54EF101781C788008C1609 /* Helpers.h in Headers */, + 8F54EF111781C788008C1609 /* JLScope.h in Headers */, + 8F54EF121781C788008C1609 /* JLTextStorage.h in Headers */, + 8F54EF131781C788008C1609 /* JLTextViewController.h in Headers */, + 8F54EF141781C788008C1609 /* JLTokenizer.h in Headers */, + 8F54EF151781C788008C1609 /* JLTokenPattern.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 8F3AB9171781C0BA0023348A /* Chromatism */ = { + isa = PBXNativeTarget; + buildConfigurationList = 8F3AB93B1781C0BB0023348A /* Build configuration list for PBXNativeTarget "Chromatism" */; + buildPhases = ( + 8F3AB9141781C0BA0023348A /* Sources */, + 8F3AB9151781C0BA0023348A /* Frameworks */, + 8F54EF0D1781C769008C1609 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Chromatism; + productName = Chromatism; + productReference = 8F3AB9181781C0BA0023348A /* libChromatism.a */; + productType = "com.apple.product-type.library.static"; + }; + 8F3AB9271781C0BA0023348A /* ChromatismTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 8F3AB93E1781C0BB0023348A /* Build configuration list for PBXNativeTarget "ChromatismTests" */; + buildPhases = ( + 8F3AB9241781C0BA0023348A /* Sources */, + 8F3AB9251781C0BA0023348A /* Frameworks */, + 8F3AB9261781C0BA0023348A /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 8F3AB92F1781C0BB0023348A /* PBXTargetDependency */, + ); + name = ChromatismTests; + productName = ChromatismTests; + productReference = 8F3AB9281781C0BA0023348A /* ChromatismTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 8F3AB9101781C0BA0023348A /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0500; + ORGANIZATIONNAME = Anviking; + }; + buildConfigurationList = 8F3AB9131781C0BA0023348A /* Build configuration list for PBXProject "Chromatism" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 8F3AB90F1781C0BA0023348A; + productRefGroup = 8F3AB9191781C0BA0023348A /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 8F3AB9171781C0BA0023348A /* Chromatism */, + 8F3AB9271781C0BA0023348A /* ChromatismTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 8F3AB9261781C0BA0023348A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8F3AB9361781C0BB0023348A /* InfoPlist.strings in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 8F3AB9141781C0BA0023348A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8F54EF241781CD87008C1609 /* JLTokenPattern.m in Sources */, + 8F54EF201781CD87008C1609 /* JLScope.m in Sources */, + 8F54EF1F1781CD87008C1609 /* Helpers.m in Sources */, + 8F54EF211781CD87008C1609 /* JLTextStorage.m in Sources */, + 8F54EF221781CD87008C1609 /* JLTextViewController.m in Sources */, + 8F54EF231781CD87008C1609 /* JLTokenizer.m in Sources */, + 8F54EF1E1781CD87008C1609 /* Chromatism.m in Sources */, + 8F54EF1D1781CD87008C1609 /* CHLayoutManager.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8F3AB9241781C0BA0023348A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8F3AB9381781C0BB0023348A /* ChromatismTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 8F3AB92F1781C0BB0023348A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 8F3AB9171781C0BA0023348A /* Chromatism */; + targetProxy = 8F3AB92E1781C0BB0023348A /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 8F3AB9341781C0BB0023348A /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 8F3AB9351781C0BB0023348A /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 8F3AB9391781C0BB0023348A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; + ONLY_ACTIVE_ARCH = YES; + PRIVATE_HEADERS_FOLDER_PATH = "$(PUBLIC_HEADERS_FOLDER_PATH)/Private"; + PRODUCT_NAME = Chromatism; + PUBLIC_HEADERS_FOLDER_PATH = ../../Headers/Chromatism; + SDKROOT = iphoneos; + }; + name = Debug; + }; + 8F3AB93A1781C0BB0023348A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; + PRIVATE_HEADERS_FOLDER_PATH = "$(PUBLIC_HEADERS_FOLDER_PATH)/Private"; + PRODUCT_NAME = Chromatism; + PUBLIC_HEADERS_FOLDER_PATH = ../../Headers/Chromatism; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 8F3AB93C1781C0BB0023348A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + DSTROOT = /tmp/Chromatism.dst; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Chromatism/Chromatism-Prefix.pch"; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 8F3AB93D1781C0BB0023348A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + DSTROOT = /tmp/Chromatism.dst; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Chromatism/Chromatism-Prefix.pch"; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 8F3AB93F1781C0BB0023348A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + "$(SYSTEM_APPS_DIR)/Xcode5-DP2.app/Contents/Developer/Library/Frameworks", + ); + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Chromatism/Chromatism-Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = "ChromatismTests/ChromatismTests-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = xctest; + }; + name = Debug; + }; + 8F3AB9401781C0BB0023348A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + "$(SYSTEM_APPS_DIR)/Xcode5-DP2.app/Contents/Developer/Library/Frameworks", + ); + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Chromatism/Chromatism-Prefix.pch"; + INFOPLIST_FILE = "ChromatismTests/ChromatismTests-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = xctest; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 8F3AB9131781C0BA0023348A /* Build configuration list for PBXProject "Chromatism" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 8F3AB9391781C0BB0023348A /* Debug */, + 8F3AB93A1781C0BB0023348A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 8F3AB93B1781C0BB0023348A /* Build configuration list for PBXNativeTarget "Chromatism" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 8F3AB93C1781C0BB0023348A /* Debug */, + 8F3AB93D1781C0BB0023348A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 8F3AB93E1781C0BB0023348A /* Build configuration list for PBXNativeTarget "ChromatismTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 8F3AB93F1781C0BB0023348A /* Debug */, + 8F3AB9401781C0BB0023348A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 8F3AB9101781C0BA0023348A /* Project object */; +} diff --git a/Chromatism/Chromatism/CHLayoutManager.h b/Chromatism/Chromatism/CHLayoutManager.h new file mode 100644 index 0000000..0521485 --- /dev/null +++ b/Chromatism/Chromatism/CHLayoutManager.h @@ -0,0 +1,13 @@ +// +// CHLayoutManager.h +// iGitpad +// +// Created by Johannes Lund on 2013-06-25. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import + +@interface CHLayoutManager : NSLayoutManager + +@end diff --git a/Chromatism/Chromatism/CHLayoutManager.m b/Chromatism/Chromatism/CHLayoutManager.m new file mode 100644 index 0000000..1807f9c --- /dev/null +++ b/Chromatism/Chromatism/CHLayoutManager.m @@ -0,0 +1,14 @@ +// +// CHLayoutManager.m +// iGitpad +// +// Created by Johannes Lund on 2013-06-25. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import "CHLayoutManager.h" + +@implementation CHLayoutManager + + +@end diff --git a/Chromatism/Chromatism/Chromatism-Prefix.pch b/Chromatism/Chromatism/Chromatism-Prefix.pch new file mode 100644 index 0000000..eb2007e --- /dev/null +++ b/Chromatism/Chromatism/Chromatism-Prefix.pch @@ -0,0 +1,9 @@ +// +// Prefix header +// +// The contents of this file are implicitly included at the beginning of every source file. +// + +#ifdef __OBJC__ + #import +#endif diff --git a/Chromatism/Chromatism/Chromatism.h b/Chromatism/Chromatism/Chromatism.h new file mode 100644 index 0000000..eb21a7c --- /dev/null +++ b/Chromatism/Chromatism/Chromatism.h @@ -0,0 +1,17 @@ +// +// Chromatism.h +// Chromatism +// +// Created by Johannes Lund on 2013-07-01. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import +#import "JLScope.h" +#import "JLTokenizer.h" +#import "JLTextViewController.h" +#import "JLTokenPattern.h" + +@interface Chromatism : NSObject + +@end diff --git a/Chromatism/Chromatism/Chromatism.m b/Chromatism/Chromatism/Chromatism.m new file mode 100644 index 0000000..47f3cef --- /dev/null +++ b/Chromatism/Chromatism/Chromatism.m @@ -0,0 +1,13 @@ +// +// Chromatism.m +// Chromatism +// +// Created by Johannes Lund on 2013-07-01. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import "Chromatism.h" + +@implementation Chromatism + +@end diff --git a/Chromatism/Helpers.h b/Chromatism/Chromatism/Helpers.h similarity index 73% rename from Chromatism/Helpers.h rename to Chromatism/Chromatism/Helpers.h index 732788f..260a470 100644 --- a/Chromatism/Helpers.h +++ b/Chromatism/Chromatism/Helpers.h @@ -6,7 +6,7 @@ // Copyright (c) 2012 Anviking. All rights reserved. // -#import +@import UIKit; @interface NSString (Helper) - (BOOL)string:(NSString *)longString containsString:(NSString *)shortString; @@ -21,16 +21,16 @@ - (NSMutableArray *)uniqueArray; @end -@interface UIColor (CreateMethods) +@interface UIColor (Helper) // wrapper for [UIColor colorWithRed:green:blue:alpha:] // values must be in range 0 - 255 -+ (UIColor*)colorWith8BitRed:(NSInteger)red green:(NSInteger)green blue:(NSInteger)blue alpha:(CGFloat)alpha; ++ (UIColor *)colorWith8BitRed:(NSInteger)red green:(NSInteger)green blue:(NSInteger)blue alpha:(CGFloat)alpha; // Creates color using hex representation // hex - must be in format: #FF00CC // alpha - must be in range 0.0 - 1.0 -+ (UIColor*)colorWithHex:(NSString*)hex alpha:(CGFloat)alpha; ++ (UIColor *)colorWithHex:(NSString*)hex alpha:(CGFloat)alpha; @end @@ -38,5 +38,11 @@ - (NSComparisonResult)compareTo:(NSValue *)range; @end +@interface NSDate (Helper) + +- (NSString *)iso8601String; + +@end + diff --git a/Chromatism/Helpers.m b/Chromatism/Chromatism/Helpers.m similarity index 91% rename from Chromatism/Helpers.m rename to Chromatism/Chromatism/Helpers.m index 8be7ef2..74874a5 100644 --- a/Chromatism/Helpers.m +++ b/Chromatism/Chromatism/Helpers.m @@ -7,7 +7,6 @@ // #import "Helpers.h" -#import @implementation NSString (Helper) @@ -135,3 +134,18 @@ - (NSString *)description } @end + +@implementation NSDate (Helper) + +- (NSString *)iso8601String +{ + static NSDateFormatter* dateFormatter; + if (!dateFormatter) + { + dateFormatter = [[NSDateFormatter alloc] init]; + [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZ"]; + } + return [dateFormatter stringFromDate:self]; +} + +@end diff --git a/Chromatism/Chromatism/JLScope.h b/Chromatism/Chromatism/JLScope.h new file mode 100644 index 0000000..ae2c071 --- /dev/null +++ b/Chromatism/Chromatism/JLScope.h @@ -0,0 +1,51 @@ +// +// JLScope.h +// iGitpad +// +// Created by Johannes Lund on 2013-06-30. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import + +@interface JLScope : NSMutableIndexSet + +// Designated initializors ++ (instancetype)scopeWithRange:(NSRange)range inTextStorage:(NSTextStorage *)textStorage; ++ (instancetype)scopeWithTextStorage:(NSTextStorage *)textStorage; + +/** + * Causes the every scope to perform cascadingly + */ +- (void)perform; + +/** + * Array of nested JLScopes and JLTokenPatterns. Reverse realationship to scope, setting one causes the other to update. No not mutate. + */ +@property (nonatomic, strong) NSArray *subscopes; + +/** + * Weak reference to the parent scope. Default nil means that there is no parent. Reverse realationship to subscopes, setting one causes the other to update. + */ + +@property (nonatomic, weak) JLScope *scope; + +- (void)addSubscope:(JLScope *)subscope; +- (void)removeSubscope:(JLScope *)subscope; + + +/** + * A weak reference to a textStorage in which the scope is operating. Will be passed down to subscopes. + */ +@property (nonatomic, weak) NSTextStorage *textStorage; + +/** + * Describes wether the pattern matches will remove indexes from the clearIndexes property. Default is FALSE for JLScope and TRUE for JLTokenPattern. + */ +@property (nonatomic, assign, getter = isOpaque) BOOL opaque; + +/** + * Indexes where there are no opaque subscopes. + */ +@property (nonatomic, strong) NSMutableIndexSet *clearIndexes; +@end diff --git a/Chromatism/Chromatism/JLScope.m b/Chromatism/Chromatism/JLScope.m new file mode 100644 index 0000000..c7f7bf7 --- /dev/null +++ b/Chromatism/Chromatism/JLScope.m @@ -0,0 +1,71 @@ +// +// JLScope.m +// iGitpad +// +// Created by Johannes Lund on 2013-06-30. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import "JLScope.h" + +@implementation JLScope +{ + NSMutableArray *_subscopes; +} +@synthesize subscopes = _subscopes; + ++ (instancetype)scopeWithRange:(NSRange)range inTextStorage:(NSTextStorage *)textStorage +{ + JLScope *scope = [[JLScope alloc] initWithIndexesInRange:range]; + scope.textStorage = textStorage; + return scope; +} + ++ (instancetype)scopeWithTextStorage:(NSTextStorage *)textStorage +{ + return [self scopeWithRange:NSMakeRange(0, textStorage.length) inTextStorage:textStorage]; +} + +- (void)perform +{ + for (JLScope *scope in self.subscopes) { + [scope perform]; + } +} + +#pragma mark - Scope Hierarchy Management + +- (NSMutableArray *)subscopes +{ + if (!_subscopes) _subscopes = [NSMutableArray array]; + return _subscopes; +} + +- (void)setSubscopes:(NSArray *)subscopes +{ + for (JLScope *scope in subscopes) { + scope.scope = self; + } + _subscopes = subscopes.mutableCopy; +} + +- (void)setScope:(JLScope *)scope +{ + [(NSMutableArray *)_scope.subscopes removeObject:scope]; + _scope = scope; + + [(NSMutableArray *)_scope.subscopes addObject:scope]; +} + +- (void)addSubscope:(JLScope *)subscope +{ + subscope.scope = self; +} + +- (void)removeSubscope:(JLScope *)subscope +{ + [(NSMutableArray *)self.subscopes removeObject:subscope]; +} + +@end + diff --git a/Chromatism/Chromatism/JLTextStorage.h b/Chromatism/Chromatism/JLTextStorage.h new file mode 100644 index 0000000..fc4f979 --- /dev/null +++ b/Chromatism/Chromatism/JLTextStorage.h @@ -0,0 +1,22 @@ +// +// JLTextStorage.h +// iGitpad +// +// Created by Johannes Lund on 2013-06-13. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import + +@protocol JLTextStorageTokenizer; +@interface JLTextStorage : NSTextStorage + +@property (nonatomic, weak) id tokenizer; + +@end + +@protocol JLTextStorageTokenizer + +- (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range; + +@end diff --git a/Chromatism/Chromatism/JLTextStorage.m b/Chromatism/Chromatism/JLTextStorage.m new file mode 100644 index 0000000..ae3a360 --- /dev/null +++ b/Chromatism/Chromatism/JLTextStorage.m @@ -0,0 +1,77 @@ +// +// JLTextStorage.m +// iGitpad +// +// Created by Johannes Lund on 2013-06-13. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import "JLTextStorage.h" + +@interface JLTextStorage () +{ + NSMutableAttributedString *_backingStore; + BOOL _dynamicTextNeedsUpdate; +} +@end + +@implementation JLTextStorage + +- (id)init +{ + self = [super init]; + if (self) { + _backingStore = [[NSMutableAttributedString alloc] init]; + } + return self; +} + +- (NSString *)string +{ + return [_backingStore string]; +} + +- (NSDictionary *)attributesAtIndex:(NSUInteger)index effectiveRange:(NSRangePointer)aRange +{ + return [_backingStore attributesAtIndex:index effectiveRange:aRange]; +} + +- (void)replaceCharactersInRange:(NSRange)range withString:(NSString *)str +{ + [_backingStore replaceCharactersInRange:range withString:str]; + [self edited:NSTextStorageEditedCharacters range:range changeInLength:str.length - range.length]; + _dynamicTextNeedsUpdate = YES; +} + +- (void)setAttributes:(NSDictionary *)attrs range:(NSRange)range +{ + [_backingStore setAttributes:attrs range:range]; + [self edited:NSTextStorageEditedAttributes range:range changeInLength:0]; +} + +- (void)processEditing +{ + if (_dynamicTextNeedsUpdate) { + _dynamicTextNeedsUpdate = NO; + [self preformReplacementsForCharacterChangeInRange:[self editedRange]]; + } + + [super processEditing]; +} + +- (void)preformReplacementsForCharacterChangeInRange:(NSRange)range +{ + NSRange extendedRange = NSUnionRange(range, [[_backingStore string] lineRangeForRange:NSMakeRange(NSMaxRange(range), 0)]); + + [self tokenizeRange:extendedRange]; +} + +- (void)tokenizeRange:(NSRange)range +{ + if (self.tokenizer && [self.tokenizer conformsToProtocol:@protocol(JLTextStorageTokenizer)]) + { + [self.tokenizer tokenizeTextStorage:self withRange:range]; + } +} + +@end \ No newline at end of file diff --git a/Chromatism/Chromatism/JLTextViewController.h b/Chromatism/Chromatism/JLTextViewController.h new file mode 100644 index 0000000..02579d1 --- /dev/null +++ b/Chromatism/Chromatism/JLTextViewController.h @@ -0,0 +1,43 @@ +// +// JLTextViewController.h +// iGitpad +// +// Created by Johannes Lund on 2013-06-13. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import + +typedef NS_ENUM(NSInteger, JLTokenizerTheme) { + JLTokenizerThemeDefault, + JLTokenizerThemeDusk +}; + +FOUNDATION_EXPORT NSString *const JLTokenTypeText; +FOUNDATION_EXPORT NSString *const JLTokenTypeBackground; +FOUNDATION_EXPORT NSString *const JLTokenTypeComment; +FOUNDATION_EXPORT NSString *const JLTokenTypeDocumentationComment; +FOUNDATION_EXPORT NSString *const JLTokenTypeDocumentationCommentKeyword; +FOUNDATION_EXPORT NSString *const JLTokenTypeString; +FOUNDATION_EXPORT NSString *const JLTokenTypeCharacter; +FOUNDATION_EXPORT NSString *const JLTokenTypeNumber; +FOUNDATION_EXPORT NSString *const JLTokenTypeKeyword; +FOUNDATION_EXPORT NSString *const JLTokenTypePreprocessor; +FOUNDATION_EXPORT NSString *const JLTokenTypeURL; +FOUNDATION_EXPORT NSString *const JLTokenTypeOther; +FOUNDATION_EXPORT NSString *const JLTokenTypeOtherClassNames; +FOUNDATION_EXPORT NSString *const JLTokenTypeOtherMethodNames; + +@class JLTokenizer; +@interface JLTextViewController : UIViewController + +@property (nonatomic, strong) NSDictionary *defaultAttributes; +@property (nonatomic, strong) UITextView *textView; +@property (nonatomic, strong) JLTokenizer *tokenizer; + +@property (nonatomic, strong) UIColor *highlightColor; +@property(nonatomic, strong) NSDictionary *colors; +@property (nonatomic, assign) JLTokenizerTheme theme; +@property (nonatomic, strong, readonly) NSArray *themes; + +@end diff --git a/Chromatism/Chromatism/JLTextViewController.m b/Chromatism/Chromatism/JLTextViewController.m new file mode 100644 index 0000000..1db193b --- /dev/null +++ b/Chromatism/Chromatism/JLTextViewController.m @@ -0,0 +1,203 @@ +// +// JLTextViewController.m +// iGitpad +// +// Created by Johannes Lund on 2013-06-13. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import "JLTextViewController.h" +#import "JLTextStorage.h" +#import "JLTokenizer.h" +#import "JLTokenizer.h" +#import "CHLayoutManager.h" + +NSString *const JLTokenTypeText = @"text"; +NSString *const JLTokenTypeBackground = @"background"; +NSString *const JLTokenTypeComment = @"comment"; +NSString *const JLTokenTypeDocumentationComment = @"documentation_comment"; +NSString *const JLTokenTypeDocumentationCommentKeyword = @"documentation_comment_keyword"; +NSString *const JLTokenTypeString = @"string"; +NSString *const JLTokenTypeCharacter = @"character"; +NSString *const JLTokenTypeNumber = @"number"; +NSString *const JLTokenTypeKeyword = @"keyword"; +NSString *const JLTokenTypePreprocessor = @"preprocessor"; +NSString *const JLTokenTypeURL = @"url"; +NSString *const JLTokenTypeAttribute = @"attribute"; +NSString *const JLTokenTypeProject = @"project"; +NSString *const JLTokenTypeOther = @"other"; +NSString *const JLTokenTypeOtherMethodNames = @"other_method_names"; +NSString *const JLTokenTypeOtherClassNames = @"other_class_names"; + +@interface JLTextViewController () + ++ (NSDictionary *)colorsFromTheme:(JLTokenizerTheme)theme; + +@property (nonatomic, strong) JLTextStorage *textStorage; +@end + +@implementation JLTextViewController +@synthesize theme = _theme, themes = _themes, colors = _colors; + +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil +{ + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + if (self) { + // Custom initialization + } + return self; +} + +- (void)loadView +{ + // Create a tokenizer + self.tokenizer = [JLTokenizer new]; + self.tokenizer.colors = self.colors; + + self.textStorage = [JLTextStorage new]; + _textStorage.tokenizer = _tokenizer; + + CHLayoutManager *layoutManager = [[CHLayoutManager alloc] init]; + layoutManager.allowsNonContiguousLayout = YES; + + NSTextContainer *container = [[NSTextContainer alloc] initWithSize:CGSizeMake(self.textView.frame.size.width, CGFLOAT_MAX)]; + container.widthTracksTextView = YES; + [layoutManager addTextContainer:container]; + [_textStorage addLayoutManager:layoutManager]; + + _textView = [[UITextView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame] textContainer:container]; + _textView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; + _textView.scrollEnabled = YES; + _textView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive; + _textView.font = [UIFont fontWithName:@"Menlo" size:12]; + _textView.autocorrectionType = UITextAutocorrectionTypeNo; + _textView.delegate = self; + _textView.autocapitalizationType = UITextAutocapitalizationTypeNone; + + self.theme = JLTokenizerThemeDusk; + + [self setView:_textView]; +} + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + self.navigationController.navigationBar.translucent = TRUE; +} + +- (void)viewDidAppear:(BOOL)animated +{ + [super viewDidAppear:animated]; +} + +- (void)didReceiveMemoryWarning +{ + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +#pragma mark - UITextViewDelegate + +- (void)textViewDidBeginEditing:(UITextView *)textView +{ + +} + +- (void)textViewDidEndEditing:(UITextView *)textView +{ + +} + +#pragma mark - Color Themes + +- (NSDictionary *)defaultAttributes +{ + if (!_defaultAttributes) _defaultAttributes = @{NSForegroundColorAttributeName: self.colors[JLTokenTypeText], NSFontAttributeName : [UIFont fontWithName:@"Menlo" size:12]}; + return _defaultAttributes; +} + +-(void)setTheme:(JLTokenizerTheme)theme +{ + self.colors = [self.class colorsFromTheme:theme]; + self.textView.typingAttributes = @{ NSForegroundColorAttributeName : self.colors[JLTokenTypeText]}; + _theme = theme; + + //Set font, text color and background color back to default + UIColor *backgroundColor = self.colors[JLTokenTypeBackground]; + [self.textView setBackgroundColor:backgroundColor ? backgroundColor : [UIColor whiteColor] ]; +} + +- (NSDictionary *)colors +{ + if (!_colors) { + self.colors = [self.class colorsFromTheme:self.theme]; + } + return _colors; +} + +- (void)setColors:(NSDictionary *)colors +{ + _colors = colors; + [self.tokenizer setColors:colors]; +} + +- (NSArray *)themes +{ + if (!_themes) _themes = @[@(JLTokenizerThemeDefault),@(JLTokenizerThemeDusk)]; + return _themes; +} + +- (JLTokenizerTheme)theme +{ + if (!_theme) _theme = JLTokenizerThemeDefault; + return _theme; +} + +// Just a bunch of colors ++ (NSDictionary *)colorsFromTheme:(JLTokenizerTheme)theme +{ + NSDictionary* colors; + switch(theme) { + case JLTokenizerThemeDefault: + colors = @{JLTokenTypeText: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], + JLTokenTypeBackground: [UIColor colorWithRed:255.0/255 green:255.0/255 blue:255.0/255 alpha:1], + JLTokenTypeComment: [UIColor colorWithRed:0.0/255 green:131.0/255 blue:39.0/255 alpha:1], + JLTokenTypeDocumentationComment: [UIColor colorWithRed:0.0/255 green:131.0/255 blue:39.0/255 alpha:1], + JLTokenTypeDocumentationCommentKeyword: [UIColor colorWithRed:0.0/255 green:76.0/255 blue:29.0/255 alpha:1], + JLTokenTypeString: [UIColor colorWithRed:211.0/255 green:45.0/255 blue:38.0/255 alpha:1], + JLTokenTypeCharacter: [UIColor colorWithRed:40.0/255 green:52.0/255 blue:206.0/255 alpha:1], + JLTokenTypeNumber: [UIColor colorWithRed:40.0/255 green:52.0/255 blue:206.0/255 alpha:1], + JLTokenTypeKeyword: [UIColor colorWithRed:188.0/255 green:49.0/255 blue:156.0/255 alpha:1], + JLTokenTypePreprocessor: [UIColor colorWithRed:120.0/255 green:72.0/255 blue:48.0/255 alpha:1], + JLTokenTypeURL: [UIColor colorWithRed:21.0/255 green:67.0/255 blue:244.0/255 alpha:1], + JLTokenTypeOther: [UIColor colorWithRed:113.0/255 green:65.0/255 blue:163.0/255 alpha:1], + JLTokenTypeOtherMethodNames : [UIColor colorWithHex:@"7040a6" alpha:1], + JLTokenTypeOtherClassNames : [UIColor colorWithHex:@"7040a6" alpha:1] + + + + }; + break; + case JLTokenizerThemeDusk: + colors = @{JLTokenTypeText: [UIColor whiteColor], + JLTokenTypeBackground: [UIColor colorWithRed:30.0/255.0 green:32.0/255.0 blue:40.0/255.0 alpha:1], + JLTokenTypeComment: [UIColor colorWithRed:72.0/255 green:190.0/255 blue:102.0/255 alpha:1], + JLTokenTypeDocumentationComment: [UIColor colorWithRed:72.0/255 green:190.0/255 blue:102.0/255 alpha:1], + JLTokenTypeDocumentationCommentKeyword: [UIColor colorWithRed:72.0/255 green:190.0/255 blue:102.0/255 alpha:1], + JLTokenTypeString: [UIColor colorWithRed:230.0/255 green:66.0/255 blue:75.0/255 alpha:1], + JLTokenTypeCharacter: [UIColor colorWithRed:139.0/255 green:134.0/255 blue:201.0/255 alpha:1], + JLTokenTypeNumber: [UIColor colorWithRed:139.0/255 green:134.0/255 blue:201.0/255 alpha:1], + JLTokenTypeKeyword: [UIColor colorWithRed:195.0/255 green:55.0/255 blue:149.0/255 alpha:1], + JLTokenTypePreprocessor: [UIColor colorWithRed:198.0/255.0 green:124.0/255.0 blue:72.0/255.0 alpha:1], + JLTokenTypeURL: [UIColor colorWithRed:35.0/255 green:63.0/255 blue:208.0/255 alpha:1], + JLTokenTypeOther: [UIColor colorWithRed:0.0/255 green:175.0/255 blue:199.0/255 alpha:1], + JLTokenTypeOtherClassNames : [UIColor colorWithHex:@"04afc8" alpha:1], + JLTokenTypeOtherMethodNames : [UIColor colorWithHex:@"04afc8" alpha:1] + }; + break; + } + return colors; +} + +@end diff --git a/Chromatism/Chromatism/JLTokenPattern.h b/Chromatism/Chromatism/JLTokenPattern.h new file mode 100644 index 0000000..adaecf5 --- /dev/null +++ b/Chromatism/Chromatism/JLTokenPattern.h @@ -0,0 +1,25 @@ +// +// JLTokenPattern.h +// iGitpad +// +// Created by Johannes Lund on 2013-06-30. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import "JLScope.h" + +@interface JLTokenPattern : JLScope + ++ (instancetype)tokenPatternWithPatternAndColor:(UIColor *)color; + +// The color +@property (nonatomic, strong) UIColor *color; + +// Setting either expression or pattern causes the other one to update. +@property (nonatomic, strong) NSRegularExpression *expression; +@property (nonatomic, copy) NSString *pattern; + +/// Describes if the pattern search for matches in indexes marked as unclear. If false, the search will happen in the scopes clearIndexes. If true, the serach will happen in the scope itself. Default: FALSE. +@property (nonatomic, assign) BOOL dirtySearch; + +@end diff --git a/Chromatism/Chromatism/JLTokenPattern.m b/Chromatism/Chromatism/JLTokenPattern.m new file mode 100644 index 0000000..d6d2137 --- /dev/null +++ b/Chromatism/Chromatism/JLTokenPattern.m @@ -0,0 +1,32 @@ +// +// JLTokenPattern.m +// iGitpad +// +// Created by Johannes Lund on 2013-06-30. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import "JLTokenPattern.h" + +@implementation JLTokenPattern + +- (void)setExpression:(NSRegularExpression *)expression +{ + _expression = expression; + + self.pattern = expression.pattern; +} + +- (void)setPattern:(NSString *)pattern +{ + _pattern = pattern; + + _expression = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:nil]; +} + +- (void)perform +{ + +} + +@end diff --git a/Chromatism/Chromatism/JLTokenizer.h b/Chromatism/Chromatism/JLTokenizer.h new file mode 100644 index 0000000..3a34679 --- /dev/null +++ b/Chromatism/Chromatism/JLTokenizer.h @@ -0,0 +1,17 @@ +// +// Tokenizer.h +// iGitpad +// +// Created by Johannes Lund on 2012-11-24. +// +// + +#import +#import "JLTextStorage.h" +#import "Helpers.h" + +@class TextViewChange, JLTextView; +@interface JLTokenizer : NSObject + +@property (nonatomic, strong) NSDictionary *colors; +@end diff --git a/Chromatism/Chromatism/JLTokenizer.m b/Chromatism/Chromatism/JLTokenizer.m new file mode 100644 index 0000000..7d305f1 --- /dev/null +++ b/Chromatism/Chromatism/JLTokenizer.m @@ -0,0 +1,242 @@ +// +// Tokenizer.m +// iGitpad +// +// Created by Johannes Lund on 2012-11-24. +// +// + +// This file builds upon the work of Kristian Kraljic +// +// RegexHighlightView.m +// Simple Objective-C Syntax Highlighter +// +// Created by Kristian Kraljic on 30/08/12. +// Copyright (c) 2012 Kristian Kraljic (dikrypt.com, ksquared.de). 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. +// + +#import "JLTokenizer.h" +#import "JLTextViewController.h" + + +@interface NSMutableAttributedString (Regex) +- (void)addRanges:(NSArray *)array withColor:(UIColor *)color; +- (void)addRanges:(NSArray *)array withAttributes:(NSDictionary *)colors; +- (NSArray *)allMatchesOfPattern:(NSString *)pattern inString:(NSString *)string; + +- (NSMutableIndexSet *)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color group:(int)index indexSet:(NSIndexSet *)indexSet andDescription:(NSString *)description; +- (NSMutableIndexSet *)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color indexSet:(NSIndexSet *)indexSet andDescription:(NSString *)description; + +- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color andDescription:(NSString *)description; +- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color range:(NSRange)range andDescription:(NSString *)description; +- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color group:(int)index range:(NSRange)range andDescription:(NSString *)description; +- (void)removeAttribute:(NSString *)name withValue:(id)compareValue range:(NSRange)range; +@end + +@interface JLTokenizer () + +@end + +@implementation JLTokenizer + +- (void)tokenizeTextStorage:(NSTextStorage *)storage withRange:(NSRange)range +{ + // First, remove old attributes + [self clearColorAttributesInRange:range textStorage:storage]; + + NSIndexSet *stringIndexes = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, storage.length)]; + NSMutableIndexSet *set = [[NSIndexSet alloc] initWithIndexesInRange:range].mutableCopy; + + NSDictionary *colors = self.colors; + + UIColor *color = color = colors[JLTokenTypeComment]; + NSMutableIndexSet *comments1 = [storage addRegularExpressionWithPattern:@"/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*+/" withColor:color indexSet:stringIndexes andDescription:@"Comments"]; + [set removeIndexes:comments1]; + + NSMutableIndexSet *comments2 = [storage addRegularExpressionWithPattern:@"//.*+\n" withColor:color indexSet:set andDescription:@"Comments"]; + [set removeIndexes:comments2]; + + color = colors[JLTokenTypePreprocessor]; + NSMutableIndexSet *preprocessor = [storage addRegularExpressionWithPattern:@"#.*+\n" withColor:color indexSet:set andDescription:@"Preprocessor"]; + [set removeIndexes:preprocessor]; + + color = colors[JLTokenTypeString]; + NSMutableIndexSet *strings1 = [storage addRegularExpressionWithPattern:@"(\"|@\")[^\"\\n]*(@\"|\")" withColor:color indexSet:set andDescription:@"Strings"]; + [set removeIndexes:strings1]; + NSMutableIndexSet *strings2 = [storage addRegularExpressionWithPattern:@"(\"|@\")[^\"\\n]*(@\"|\")" withColor:color indexSet:preprocessor andDescription:@"Strings"]; + [set removeIndexes:strings2]; + + color = colors[JLTokenTypeNumber]; + [storage addRegularExpressionWithPattern:@"(?<=\\s)\\d+" withColor:color indexSet:set andDescription:@"Numbers"]; + + [storage addRegularExpressionWithPattern:@"@\\s*[\(|\{|\[]" withColor:color indexSet:set andDescription:@"New literals"]; + + //C – functions and similiar + color = colors[JLTokenTypeOtherMethodNames]; + [storage addRegularExpressionWithPattern:@"\\w+\\s*(?>\\(.*\\)" withColor:color group:1 indexSet:set andDescription:@"C function names"]; + + //Dot notation + [storage addRegularExpressionWithPattern:@"\\.(\\w+)" withColor:color group:1 indexSet:set andDescription:@"Dot notation"]; + + //Method calls + [storage addRegularExpressionWithPattern:@"\\[\\w+\\s+(\\w+)\\]" withColor:color group:1 indexSet:set andDescription:@"Method calls"]; + [storage addRegularExpressionWithPattern:@"(?<=\\w+):\\s*[^\\s;\\]]+" withColor:color group:1 indexSet:set andDescription:@"Method calls parts"]; + + color = colors[JLTokenTypeOtherClassNames]; + [storage addRegularExpressionWithPattern:@"(\\b(?>NS|UI))\\w+\\b" withColor:color indexSet:set andDescription:@"UIKit and NS"]; + + color = colors[JLTokenTypeKeyword]; + [storage addRegularExpressionWithPattern:@"(?<=\\b)(?>true|false|yes|no|TRUE|FALSE|bool|BOOL|nil|id|void|self|NULL|if|else|strong|weak|nonatomic|atomic|assign|copy|typedef|enum|auto|break|case|const|char|continue|do|default|double|extern|float|for|goto|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|volatile|while|nonatomic|atomic|readonly)(\\b)" withColor:color indexSet:set andDescription:@"Keywords"]; + + + [storage addRegularExpressionWithPattern:@"@[a-zA-Z0-9_]+" withColor:color indexSet:set andDescription:@"@things"]; + + + + + +} + +- (void)clearColorAttributesInRange:(NSRange)range textStorage:(NSTextStorage *)storage; +{ + //Clear the comments to later be rebuilt + UIColor *compareColor = self.colors[JLTokenTypeComment]; + [storage removeAttribute:NSForegroundColorAttributeName withValue:compareColor range:range]; + + [storage removeAttribute:NSForegroundColorAttributeName range:range]; + [storage addAttribute:NSForegroundColorAttributeName value:self.colors[JLTokenTypeText] range:range]; +} + +#pragma mark - Pattern Helpers + +// TODO: Extend this + +- (NSString *)patternBetweenString:(NSString *)start andString:(NSString *)stop +{ + return nil; +} + + +@end + +#pragma mark - Regex Helpers + + +@implementation NSTextStorage (Regex) + +- (void)removeAttribute:(NSString *)name withValue:(id)compareValue range:(NSRange)range +{ + [self enumerateAttribute:NSForegroundColorAttributeName inRange:range options:0 usingBlock:^(id value, NSRange range, BOOL *stop) { + if ([value isEqual:compareValue]) { + [self removeAttribute:NSForegroundColorAttributeName range:range]; + } + + }]; +} + + +- (void)addRanges:(NSArray *)array withColor:(UIColor *)color +{ + for (NSValue *value in array) { + NSAssert(value.rangeValue.location < self.string.length, @"Range should be within the string"); + [self removeAttribute:NSForegroundColorAttributeName range:value.rangeValue]; + [self addAttribute:NSForegroundColorAttributeName value:color range:value.rangeValue]; + } +} + +- (void)addRanges:(NSArray *)array withAttributes:(NSDictionary *)dic +{ + for (NSValue *value in array) { + if (value.rangeValue.location + value.rangeValue.length <= self.length){ + NSAssert(value.rangeValue.location < self.string.length, @"Range should be within the string"); + [self removeAttribute:NSForegroundColorAttributeName range:value.rangeValue]; + [self addAttributes:dic range:value.rangeValue]; + } + } +} + +- (NSArray *)allMatchesOfPattern:(NSString *)pattern inString:(NSString *)string +{ + NSArray *mathces = [[NSRegularExpression regularExpressionWithPattern:pattern options:0 error:nil] matchesInString:string options:0 range:NSMakeRange(0, string.length)]; + + return mathces; +} + +- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color group:(int)index range:(NSRange)range andDescription:(NSString *)description +{ + NSString *string = self.string; + + + NSRegularExpression* expression = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionAnchorsMatchLines error:nil]; + + [expression enumerateMatchesInString:string options:0 range:range usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { + NSAssert(range.location < string.length, @"Range should be within the string"); + [self addAttribute:NSForegroundColorAttributeName value:color range:[result rangeAtIndex:index]]; + }]; +} + +// indexSet is a indexset containing the available indexes for tokenizing +- (NSMutableIndexSet *)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color indexSet:(NSMutableIndexSet **)indexSet andDescription:(NSString *)description +{ + __block NSMutableIndexSet *restultSet = [NSIndexSet indexSet].mutableCopy; + NSRegularExpression* expression = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionAnchorsMatchLines error:nil]; + __weak typeof(self) _self = self; + + [*indexSet enumerateRangesUsingBlock:^(NSRange range, BOOL *stop) { + [expression enumerateMatchesInString:self.string options:0 range:range usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { + NSAssert(range.location < self.length, @"Range should be within the string"); + [_self addAttribute:NSForegroundColorAttributeName value:color range:[result range]]; + [restultSet addIndexesInRange:[result range]]; + }]; + }]; + + [*indexSet removeIndexes:restultSet]; + return restultSet; +} + +- (NSMutableIndexSet *)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color group:(int)index indexSet:(NSMutableIndexSet **)indexSet andDescription:(NSString *)description +{ + NSString *string = self.string; + __block NSMutableIndexSet *restultSet = [NSIndexSet indexSet].mutableCopy; + __weak typeof(self) _self = self; + + NSRegularExpression* expression = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionAnchorsMatchLines error:nil]; + [*indexSet enumerateRangesUsingBlock:^(NSRange range, BOOL *stop) { + [expression enumerateMatchesInString:string options:0 range:range usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { + NSAssert(range.location < string.length, @"Range should be within the string"); + [_self addAttribute:NSForegroundColorAttributeName value:color range:[result rangeAtIndex:index]]; + [restultSet addIndexesInRange:[result rangeAtIndex:index]]; + }]; + }]; + [*indexSet removeIndexes:restultSet]; + return restultSet; +} + +- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color andDescription:(NSString *)description +{ + [self addRegularExpressionWithPattern:pattern withColor:color range:NSMakeRange(0, self.length) andDescription:description]; +} + + +@end diff --git a/Chromatism/Chromatism/test.json b/Chromatism/Chromatism/test.json new file mode 100644 index 0000000..fc37ebf --- /dev/null +++ b/Chromatism/Chromatism/test.json @@ -0,0 +1,3 @@ +{ + "language" : "objective-c" +} diff --git a/ChromatismTests/ChromatismTests-Info.plist b/Chromatism/ChromatismTests/ChromatismTests-Info.plist similarity index 100% rename from ChromatismTests/ChromatismTests-Info.plist rename to Chromatism/ChromatismTests/ChromatismTests-Info.plist diff --git a/Chromatism/ChromatismTests/ChromatismTests.m b/Chromatism/ChromatismTests/ChromatismTests.m new file mode 100644 index 0000000..f6f7973 --- /dev/null +++ b/Chromatism/ChromatismTests/ChromatismTests.m @@ -0,0 +1,53 @@ +// +// ChromatismTests.m +// ChromatismTests +// +// Created by Johannes Lund on 2013-07-01. +// Copyright (c) 2013 Anviking. All rights reserved. +// + +#import +#import "Chromatism.h" + +@interface ChromatismTests : XCTestCase + +@end + +@implementation ChromatismTests + +- (void)setUp +{ + [super setUp]; + + // Set-up code here. +} + +- (void)tearDown +{ + // Tear-down code here. + + [super tearDown]; +} + +- (void)testSubscopes +{ + JLScope *scope = [JLScope new]; + JLScope *subscope1 = [JLScope new]; + JLScope *subscope2 = [JLScope new]; + JLScope *subscope3 = [JLScope new]; + JLScope *subscope4 = [JLScope new]; + + [scope setSubscopes:@[subscope1, subscope2]]; + [scope addSubscope:subscope3]; + + subscope4.scope = scope; + + XCTAssertEqualObjects(subscope1.scope, scope, @""); + XCTAssertEqualObjects(subscope2.scope, scope, @""); + XCTAssertEqualObjects(subscope3.scope, scope, @""); + XCTAssertEqualObjects(subscope4.scope, scope, @""); + + XCTAssertEquals(scope.subscopes.class, [NSMutableArray class], @"subscopes should be of type NSMutableArray"); +} + +@end diff --git a/Chromatism/en.lproj/InfoPlist.strings b/Chromatism/ChromatismTests/en.lproj/InfoPlist.strings similarity index 100% rename from Chromatism/en.lproj/InfoPlist.strings rename to Chromatism/ChromatismTests/en.lproj/InfoPlist.strings diff --git a/Chromatism/Default-568h@2x.png b/Chromatism/Default-568h@2x.png deleted file mode 100644 index 0891b7aabfcf3422423b109c8beed2bab838c607..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18594 zcmeI4X;f257Jx&9fS`ixvS;&$x8J@slQFSel)6zJN=?13FB7H(lQjRkSy8x_-S~tvu2gzn1oS+dLcF#eqtq$ z%tf9TTvX?`)R@}3uBI;jzS-=ZR-Td&MHaS&;!0?Ni*#$#`n*~CcQK)Q9vAQ~TUpnI!j)a2biYK^R)M~A5wUDZhx?ULMX z3x1P&qt=trOY6P2U67L=m=U?F|5#Uj(eCueNTZaHs_ceWiHeET+j+tp3Jt9g(ekqP z2WOvfR{qV+9r+o4J5?qK>7;;^+I7tGv-i)es$X_D=EoKF+S?zsyj^oRFElP}c}JT< zd8SUs-?O?}2YD#ngKbnHgzHBcboxK_2r9l(?eNCl-pEzkJm}fY?WC*jnS?VBE4EpY zO$fEejz6fU;W2Kl>JeQBZBl-%Irg`obSlg*@4QB;Dd1H7^Oi5wvt4d{RZ!8Og?^aE z)k0$1g+V3fd(gdQ3d&q2q-FL*uy#}|bc^=VhFsl0jBgUGJ+-s3U8MK9A!YJJMxpci z5hJ%|{DwV48fZn0{n5l$N_KcSb#NKE4plB`9I6Zt=Z!~-zw0{9tg$L&Ju1F0X)Cy8 zKF;(&lJ>x)Jw(=;p~sF(Sd9VWGwFE2rnyS9!f^DZ8+aCLq zQ};>lcJ1GDLqjm6Hd>|Eabno@P`~Bn(~6^aD_#yoEH(a?Nm1S<;S+hSxI5d16^<1lEM3NPFi zkqPrpL)+ zgnseFikg`gJVBha1&7C4;O6>h=dt~`ND+;Zd?W(4v2JIb7Pt>Td42%M-Ju-XAH#Pns762L}K3 zDhvsRqN0Ni(1UrishD2YvV?4*h2iFj$+&N||Fn$4n|^NSU+o?~jq`0jVQt8T9l{7b zXiwwODFh2V!Q6sqP9S>WH$oOf$N~=d0-bqTlD61!=`&0eAP-F>XN?*|gtOXX{ zQVTWyYo4ZK0GAw!GHf|pz9`D;-bbb*5LBX*{bnz|+)$@&P9|ORM2o?95{;ejvo&r- zq8cBhTN6nn)7~W>54U)%-F_-b?YKdfk5I8MHcuzBD5)!;yv#Z&R&^y=@=>VTIMy#r zX&U<=BsPkdqcMe<_}2+>H%XKyrr5ZR8_KVe>ZqYN z^=^~TFD};;rHJ$U;{~w^hYojl4hRI@SH$^K{YEo=sg)WY87r!*7blQK&qnpDo0`Vn zkl)9u9g=mCh&ZCJS(L4yN3k0kQ zuvg$h2KEEk51T+O0JQ+r0`R>g{jvqM0Mr6d3qUOZwE!?PI7HY@CE|dr sfw?Q;rAv?G4&^^8-z_>&sWXMxvD*gPOU4CBe-*@OtE+wfmVJNyHv)PfH~;_u diff --git a/Chromatism/Default.png b/Chromatism/Default.png deleted file mode 100644 index 4c8ca6f693f96d511e9113c0eb59eec552354e42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6540 zcmeAS@N?(olHy`uVBq!ia0y~yU~~ZD2OMlbkt;o0To@QwR5G2N13aCb6#|O#(=u~X z85k@CTSM>X-wqM6>&y>YB4)1;;ojbLbbV-W^iFB1wa3^zCog^LCAReC4K0-?R_2{6 zrP*)4+_uWUy3w5N52M3PW_}MFMP9a~>YLvVZ1D_k*IMQ2QT^fwzoOb(*3gH$%aYWC zkHmcab=va2<#X%jakpJ;<1@F;k__#bwtC&%^D0v(FBh9K&$sK+<}2RJS609D)17$w ztdQP8(eLM8Ka}m_IQ@3wyMKP)l=oM4-?`YS_*P?4V_ORLPxsj&7Ju#kH;>6^Kp?T7~ zl+q?{UOOqV==?+d{=)5s|M~T1mwtH@+Z^$G&eEO9JNP^AX@3jZ*J*!!>lc|1-W%fA z@AOQpXZ_Lt>rxFXrGp*zLPiW@uo_c7C{As>j zWeX)wi+LTp_)@KYZCX{j;H?|1yXT4DnlS(Fr8gyP5|uaX_gLvaW0ScZdnG7o+u{T6 zFI-%d{ls*WuCDa5UJ@|RXv&ejZe}*BMkiWY51&pnRPw(hlykSzvj6e%mYz-GdvzBD zF10?szF_~!jS=?2HyQuPCvARXAe}C}WP|yQ*>5~~=*Nxq8+HHW1~FMDRCP^TcacKuk$ z(U#REVv)D!PhJ*ecH-ELFUrfyV&*)Z)>UCOuS?yd^L@Afk>ihynYPc{^CRwu+JHX+#$@YsC4c|l0tGigsn@jy) zXD($Ouk>H+V(Mr6NQT0S9BFM~V6nkj;1OBOz`zY;a|<&v%$g$sEJPk;hD4M^`1)8S z=jZArrsOB3>Q&?x097+E*i={nnYpPYi3%0DIeEoa6}C!X6;?ntNLXJ<0j#7X+g2&U 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 diff --git a/Chromatism/JLTextView.h b/Chromatism/JLTextView.h deleted file mode 100644 index a558508..0000000 --- a/Chromatism/JLTextView.h +++ /dev/null @@ -1,51 +0,0 @@ -// -// RegexHighlightView.h -// iOS Syntax Highlighter -// -// Created by Kristian Kraljic on 30/8/12. -// Copyright (c) 2012 Kristian Kraljic (dikrypt.com, ksquared.de). 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. -// - -#import -#import -#import "JLTokenizer.h" - -@interface TextViewChange : NSObject - -@property (nonatomic, copy) NSString *replacementText; -@property (nonatomic) NSRange range; -@end - -@class JLTokenizer; -@interface JLTextView : UITextView - -@property (nonatomic, strong) UITableView *tableView; -@property (nonatomic, strong) NSMutableAttributedString *attributedString; -@property (nonatomic, strong) NSDictionary *attributes; -@property (nonatomic, strong) JLTokenizer *syntaxTokenizer; - -//Refreshes syntax coloring. -- (void)refreshTokenization; - -@end \ No newline at end of file diff --git a/Chromatism/JLTextView.m b/Chromatism/JLTextView.m deleted file mode 100644 index 309eb8a..0000000 --- a/Chromatism/JLTextView.m +++ /dev/null @@ -1,535 +0,0 @@ - - -#import "JLTextView.h" -#import "Helpers.h" -#import "TextLineCell.h" -#import "JLTokenizer.h" - -#define EMPTY @"" - -@interface JLTextView () { - id internalDelegate; -} - -@property (nonatomic, strong) NSMutableArray *lines; -@property (nonatomic, strong) NSMutableArray *lineLayers; -@property (nonatomic, strong) NSMutableArray *lineLayerIndex; -@property (nonatomic, strong) NSMutableArray *lineStartIndexes; -@end - -@implementation TextViewChange - - -@end - -@implementation JLTextView { - - CGFloat lastUpdateOffset; - CGFloat currentOffset; - - CGFloat _lineHeight; - CGFloat _charWidth; - - CTFramesetterRef _framesetter; // Cached Core Text framesetter - - UIView *_debugView; - - NSUInteger textLength; - -} -@synthesize attributes = _attributes, syntaxTokenizer = _syntaxTokenizer; - -#pragma mark - Helpers - -// Updates the range of a given line -- (void)setRange:(NSRange)range forLineWithIndex:(int)i -{ - CTLineRef line = CTLineCreateWithAttributedString((__bridge CFAttributedStringRef)([self.attributedString attributedSubstringFromRange:range])); - self.lines[i] = (__bridge id)(line); - [self.tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:i inSection:0]] withRowAnimation:UITableViewRowAnimationNone]; -} - -// This is probably not helpful at all -- (void)reloadLineWithIndex:(int)index -{ - NSRange range = [self rangeOfLineWithIndex:index]; - CTLineRef line = CTLineCreateWithAttributedString((__bridge CFAttributedStringRef)([self.attributedString attributedSubstringFromRange:range])); - self.lines[index] = (__bridge id)(line); -} - -// Deletes the given line -- (void)deleteLineWithNumber:(int)i -{ - [self.lines removeObjectAtIndex:i]; - [self.lineStartIndexes removeObjectAtIndex:i]; - [self.tableView deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:i inSection:0]] withRowAnimation:UITableViewRowAnimationTop]; -} - -// Inserts a new line with given range and index. -- (void)insertLineWithRange:(NSRange)range atIndex:(int)i -{ - NSAttributedString *string; - - if (range.location != NSNotFound && range.length < self.attributedString.length) string = [self.attributedString attributedSubstringFromRange:range]; - else @throw [NSException exceptionWithName:@"JLTextViewException" reason:@"A new line was created, but its assigned range is invalid" userInfo:nil]; - - - CTLineRef line = CTLineCreateWithAttributedString((__bridge CFAttributedStringRef)(string)); - - [self.lines insertObject:(__bridge id)(line) atIndex:i]; - [self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:i inSection:0]] withRowAnimation:UITableViewRowAnimationNone]; - [self.lineStartIndexes insertObject:@(range.location) atIndex:i]; -} - -// Retrieves the range of a given line -- (NSRange)rangeOfLineWithIndex:(int)index -{ - CTLineRef currentLine = (__bridge CTLineRef)(self.lines[index]); - NSRange range = NSMakeRange([(NSNumber *)self.lineStartIndexes[index] intValue], CTLineGetStringRange(currentLine).length); - return range; -} - -// Adjustes the range locations of lines after the index, as well as the index line itself, with a given offset. -- (void)offsetLineRangeLocationsFromLine:(int)index offset:(int)offset -{ - for (int j = index; j < self.lineStartIndexes.count; j++) { - _lineStartIndexes[j] = @([(NSNumber *)[self.lineStartIndexes objectAtIndex:j] intValue] + offset); - } -} - -// Retrieves the index of the line, that contains the given character-index. -- (NSUInteger)lineNumberAtIndex:(NSUInteger)index -{ - for (int i = 0; i < self.lineStartIndexes.count; i++) { - if ([(NSNumber *)self.lineStartIndexes[i] intValue] > index) return i-1; - } - return 0; -} - -NS_INLINE NSRange NSRangeFromCFRange(CFRange range) { - return NSMakeRange(range.location, range.length); -} - -// Helper method to release our cached Core Text framesetter and frame -- (void)clearPreviousLayoutInformation -{ - if (_framesetter != NULL) { - CFRelease(_framesetter); - _framesetter = NULL; - } -} - -// This generates the lines from scratch. Use only if necessary. -- (void)generateLines -{ - if (!self.attributedString) return; - - [self clearPreviousLayoutInformation]; - self.lines = @[].mutableCopy; - self.lineStartIndexes = @[].mutableCopy; - - CFAttributedStringRef ref = (CFAttributedStringRef)CFBridgingRetain(self.attributedString); - _framesetter = CTFramesetterCreateWithAttributedString(ref); - - // Work out the geometry - CGRect insetBounds = CGRectInset([self bounds], MARGIN, MARGIN); - CGFloat boundsWidth = CGRectGetWidth(insetBounds); - - // Calculate the lines - CFIndex start = 0; - NSUInteger length = CFAttributedStringGetLength((__bridge CFAttributedStringRef)(self.attributedString)); - while (start < length) - { - CTTypesetterRef typesetter = CTFramesetterGetTypesetter(_framesetter); - CFIndex count = CTTypesetterSuggestLineBreak(typesetter, start, boundsWidth); - CTLineRef line = CTLineCreateWithAttributedString((__bridge CFAttributedStringRef)([self.attributedString attributedSubstringFromRange:NSMakeRange(start, count)])); - - //NSString *string = [self.text substringWithRange:NSMakeRange(start, count)]; - //NSLog(@"Generating Line:\"%@\"",string); - //else NSLog(@"NO"); - - [self.lines addObject:(__bridge id)(line)]; - [self.lineStartIndexes addObject:@(start)]; - - start += count; - } -} - -- (void)wordWrapLineWithIndex:(int)index -{ - NSRange lineRange = [self rangeOfLineWithIndex:index]; - NSLog(@"Word wrapping on line:\"%@\"",[self.attributedString.string substringWithRange:lineRange]); - - CGRect insetBounds = CGRectInset([self bounds], MARGIN, MARGIN); - CGFloat boundsWidth = CGRectGetWidth(insetBounds); - - // Calculate the lines - CFIndex start = lineRange.location; - CFIndex currentIndex = index; - NSUInteger length = CFAttributedStringGetLength((__bridge CFAttributedStringRef)(self.attributedString)); - - NSLog(@"Deleting the first line with an index of %li", currentIndex); - [self deleteLineWithNumber:index]; - - // This is very time-consuming, but reusing the old framesetter seem to cause trouble. - CTTypesetterRef typesetter = CTTypesetterCreateWithAttributedString((__bridge CFAttributedStringRef)(self.attributedString)); - - while (start < length) - { - CFIndex count = CTTypesetterSuggestLineBreak(typesetter, start, boundsWidth); - NSRange range = NSMakeRange(start, count); - - - // Check if hard or soft linebreak - if ([self.attributedString.string rangeOfString:@"\n" options:NSBackwardsSearch range:range].location != NSNotFound) - { - // This line contains a hard return. Stop. - NSLog(@"Inserting the last line to an index of :%li and string of \"%@\"", currentIndex, [self.attributedString.string substringWithRange:range]); - [self insertLineWithRange:range atIndex:currentIndex]; - - // Avoid duplicate lines - int maxRange = count + start; - for (int i = currentIndex + 1;; i++) { - int location = [(NSNumber *)self.lineStartIndexes[i] intValue]; - if (location < maxRange) - { - NSLog(@"Deleting Line With Index: %i, because it has a start location of %i while the refreshed maxRange is %i", i, location, maxRange); - [self deleteLineWithNumber:i]; - } - else break; - } - return; - - } - else - { - // This line contains a soft return. Continue. - NSLog(@"Inserting line to an index of :%li with text of \"%@\"", currentIndex, [self.attributedString.string substringWithRange:range]); - [self insertLineWithRange:range atIndex:currentIndex]; - - start += count; - currentIndex++; - } - } - - return; -} - - -// This is what uses the helper methods above. It makes sure that the tableView is updated when the user changes the text. It should be called from -textView:shouldChangeTextInRange:replacementText: -- (void)updatLineWithIndex:(int)i andRecentTextChange:(TextViewChange *)options -{ - NSString *replacementText = options.replacementText; - NSRange range = options.range; - - CTLineRef currentLine = (__bridge CTLineRef)(self.lines[i]); - NSInteger offset = options.replacementText.length - options.range.length; - - NSAssert(currentLine != nil, @"The current line cannot be found"); - - NSRange currentLineRange = [self rangeOfLineWithIndex:i]; - currentLineRange.length += offset; - - NSRange newWord = NSMakeRange(options.range.location, options.replacementText.length); - - // TEST - if (currentLineRange.length == 0) - { - [self deleteLineWithNumber:i]; - return; - } - - //NSLog(@"Length of current line #%i is: %i",i,currentLineRange.length); - //NSLog(@"Current line contains \"%@\"", [self.attributedString attributedSubstringFromRange:currentLineRange]); - - if (currentLineRange.length == INT_MAX || currentLineRange.length > textLength) - { - @throw [NSException exceptionWithName:@"JLTextViewException" reason:@"The range of the current line is incorrect" userInfo:@{@"Range" : NSStringFromRange(currentLineRange)}]; - } - // BACKSPACE - if ([replacementText isEqualToString:@""] && range.length == 1) - { - if (range.location >= currentLineRange.location) - { - // No text changes line - [self setRange:currentLineRange forLineWithIndex:i]; - return; - } - else { - - // TODO: Involve a typesetter here - - CTLineRef previousLine = (__bridge CTLineRef)(self.lines[i-1]); - NSAssert(previousLine != nil, @"The current line cannot be found"); - - NSRange previousLineRange = [self rangeOfLineWithIndex:i-1]; - NSRange mergedLineRange = NSMakeRange(previousLineRange.location, NSMaxRange(currentLineRange)-previousLineRange.location); - /* - NSRange nextLineRange = [self rangeOfLineWithIndex:i+1]; - - NSLog(@"Merging to line %i with range: %@ text:%@", i-1, NSStringFromRange(mergedLineRange),[self.attributedString.string substringWithRange:mergedLineRange]); - NSLog(@"Deleting line %i with range: %@ text:%@", i, NSStringFromRange(currentLineRange), [self.attributedString.string substringWithRange:currentLineRange]); - NSLog(@"Next line %i with range: %@ text:%@", i+1, NSStringFromRange(nextLineRange), [self.attributedString.string substringWithRange:nextLineRange]); - */ - - [self setRange:mergedLineRange forLineWithIndex:i-1]; - [self deleteLineWithNumber:i]; - - [self wordWrapLineWithIndex:i-1]; - return; - } - } - - // NEWLINE - if ([replacementText isEqualToString:@"\n"]) { - - NSRange range1 = NSMakeRange(currentLineRange.location, NSMaxRange(newWord) - currentLineRange.location); - NSRange range2 = NSMakeRange(NSMaxRange(newWord), NSMaxRange(currentLineRange)-NSMaxRange(newWord)); - - [self setRange:range1 forLineWithIndex:i]; - [self insertLineWithRange:range2 atIndex:i+1]; - - return; - - } - - float maxWidth = self.frame.size.width - 2*MARGIN; - float currentEstimatedWidth = currentLineRange.length * _charWidth; - - // This seems to estimate the lineWidth to be too large. - // If the estimatedWith is clearly less than the maxWidth there is no need to involve the typesetter. - if (currentEstimatedWidth < maxWidth) { - [self setRange:currentLineRange forLineWithIndex:i]; - return; - } - - // We're not sure, but the line may be overflowing. Use the typesetter. - - NSAttributedString *currentLineString = [self.attributedString attributedSubstringFromRange:currentLineRange]; - CTTypesetterRef typesetter = CTTypesetterCreateWithAttributedString((__bridge CFAttributedStringRef)(currentLineString)); - CFIndex length = CTTypesetterSuggestLineBreak(typesetter, 0, self.frame.size.width-2*MARGIN); - - if (length < currentLineRange.length) { - NSRange range1 = NSMakeRange(currentLineRange.location, length); - NSRange range2 = NSMakeRange(NSMaxRange(range1), NSMaxRange(currentLineRange)-NSMaxRange(range1)); - - [self setRange:range1 forLineWithIndex:i]; - [self insertLineWithRange:range2 atIndex:i+1]; - return; - } - else { - [self setRange:currentLineRange forLineWithIndex:i]; - return; - } -} - -#pragma mark - TextView - -- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text -{ - // Create a TextViewChange to store range and replacementText - TextViewChange *options = [[TextViewChange alloc] init]; - options.replacementText = text; - options.range = range; - - // Keep the attributedString up to date, and tokenize it. - [self.attributedString replaceCharactersInRange:range withAttributedString:[[NSAttributedString alloc] initWithString:text attributes:_attributes]]; - _attributedString = [self.syntaxTokenizer tokenizeAttributedString:self.attributedString withRecentTextViewChange:options]; - - // Get lineIndex of the current line - NSInteger lineIndex = [self lineNumberAtIndex:NSMaxRange(range)]; - NSInteger offset = text.length - range.length; - - // Check if multiple lines are changed - if (range.length > 1) - { - NSInteger firstLine = [self lineNumberAtIndex:range.location]; - // TODO: Handle cases where the range reaches across multiple lines - } - - // When adding or removing characters in the text, the rangeLocations of the lines must be updated - [self offsetLineRangeLocationsFromLine:lineIndex + 1 offset:offset]; - - // This handles the setting of a new range for the current line, as well as newlines and backspace - [self updatLineWithIndex:lineIndex andRecentTextChange:options]; - - return YES; -} - -#pragma mark - TableView - -- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath -{ - return _lineHeight; -} -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView -{ - return 1; -} - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section -{ - return self.lines.count; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath -{ - static NSString *CellIdentifier = @"LineLayer"; - TextLineCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier - forIndexPath:indexPath]; - - NSUInteger lineNumber = indexPath.row; - CTLineRef ref = (__bridge CTLineRef)([self.lines objectAtIndex:lineNumber]); - cell.line = ref; - [cell setNeedsDisplay]; - - return cell; -} - -#pragma mark - - -- (void)layoutSubviews -{ - // This feels a bit strange. The tableview should maybe not be a subview of the tableView so that it doesn't move? - self.tableView.frame = self.bounds; -} - -- (UITableView *)tableView -{ - if (!_tableView) { - - _tableView = [[UITableView alloc] initWithFrame:self.bounds style:UITableViewStylePlain]; - [_tableView registerClass:[TextLineCell class] forCellReuseIdentifier:@"LineLayer"]; - _tableView.delegate = self; - _tableView.dataSource = self; - - _tableView.userInteractionEnabled = NO; - _tableView.separatorStyle = UITableViewCellSeparatorStyleNone; - _tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 8)]; - - [self addSubview:_tableView]; - } - return _tableView; -} - -- (void)scrollViewDidScroll:(UIScrollView *)scrollView -{ - [self.tableView setContentOffset:self.contentOffset]; -} - - -#pragma mark - -- (void)setAttributedString:(NSMutableAttributedString *)attributedString -{ - textLength = attributedString.length; - _attributedString = attributedString; - [self generateLines]; - [self.tableView reloadData]; -} - -- (void)setAttributes:(NSDictionary *)attributes -{ - _attributes = attributes; -} - -- (NSDictionary *)attributes -{ - if (!_attributes) { - //Set line height, font, color and break mode - CTFontRef font = CTFontCreateWithName((__bridge CFStringRef)self.font.fontName,self.font.pointSize,NULL); - CGFloat minimumLineHeight = [@"a" sizeWithFont:self.font].height,maximumLineHeight = minimumLineHeight; - CTLineBreakMode lineBreakMode = kCTLineBreakByWordWrapping; - - _lineHeight = minimumLineHeight; - _charWidth = [@"a" sizeWithFont:self.font].width; - - //Apply paragraph settings - CTParagraphStyleRef style = CTParagraphStyleCreate((CTParagraphStyleSetting[3]){ - {kCTParagraphStyleSpecifierMinimumLineHeight,sizeof(minimumLineHeight),&minimumLineHeight}, - {kCTParagraphStyleSpecifierMaximumLineHeight,sizeof(maximumLineHeight),&maximumLineHeight}, - {kCTParagraphStyleSpecifierLineBreakMode,sizeof(CTLineBreakMode),&lineBreakMode} - },3); - - self.attributes = @{(NSString*)kCTFontAttributeName: (__bridge id)font,(NSString*)kCTForegroundColorAttributeName: (__bridge id)[UIColor blackColor].CGColor,(NSString*)kCTParagraphStyleAttributeName: (__bridge id)style}; - - } - return _attributes; -} - -- (JLTokenizer *)syntaxTokenizer -{ - if (!_syntaxTokenizer) self.syntaxTokenizer = [JLTokenizer new]; - return _syntaxTokenizer; -} - -- (void)setSyntaxTokenizer:(JLTokenizer *)syntaxTokenizer -{ - _syntaxTokenizer = syntaxTokenizer; - _syntaxTokenizer.textView = self; -} - -- (void)setFont:(UIFont *)font -{ - [super setFont:font]; - - //Refresh attributes - _attributes = nil; - [self attributes]; -} - -- (void)refreshTokenization -{ - self.attributedString = [self.syntaxTokenizer tokenizeAttributedString:self.attributedString withRecentTextViewChange:nil]; - self.backgroundColor = self.syntaxTokenizer.backgroundColor; - [self.tableView setBackgroundColor:self.syntaxTokenizer.backgroundColor]; -} - --(id)init { - self = [super init]; - if(self) { - [self setup]; - } - return self; -} -- (id)initWithCoder:(NSCoder*)decoder { - self = [super initWithCoder:decoder]; - if (self) { - [self setup]; - } - return self; -} -- (id)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (self) { - [self setup]; - } - return self; -} - -- (void)awakeFromNib -{ - [self setup]; -} - -- (void)setup -{ - self.textColor = [UIColor clearColor]; - self.delegate = self; - self.autocapitalizationType = UITextAutocapitalizationTypeNone; - self.autocorrectionType = UITextAutocorrectionTypeNo; - - _debugView = [[UIView alloc] init]; - [self addSubview:_debugView]; -} - -- (void)setText:(NSString *)text -{ - [super setText:text]; - - _attributedString = [[NSMutableAttributedString alloc] initWithString:text attributes:self.attributes]; - self.attributedString = [self.syntaxTokenizer tokenizeAttributedString:_attributedString withRecentTextViewChange:nil]; - [self generateLines]; -} -@end - diff --git a/Chromatism/JLTokenizer.h b/Chromatism/JLTokenizer.h deleted file mode 100644 index 83731d6..0000000 --- a/Chromatism/JLTokenizer.h +++ /dev/null @@ -1,48 +0,0 @@ -// -// Tokenizer.h -// iGitpad -// -// Created by Johannes Lund on 2012-11-24. -// -// - -#import -#import "JLTextView.h" -#import "Helpers.h" - -FOUNDATION_EXPORT NSString *const kTokenizerTypeText; -FOUNDATION_EXPORT NSString *const kTokenizerTypeBackground; -FOUNDATION_EXPORT NSString *const kTokenizerTypeComment; -FOUNDATION_EXPORT NSString *const kTokenizerTypeDocumentationComment; -FOUNDATION_EXPORT NSString *const kTokenizerTypeString; -FOUNDATION_EXPORT NSString *const kTokenizerTypeCharacter; -FOUNDATION_EXPORT NSString *const kTokenizerTypeNumber; -FOUNDATION_EXPORT NSString *const kTokenizerTypeKeyword; -FOUNDATION_EXPORT NSString *const kTokenizerTypePreprocessor; -FOUNDATION_EXPORT NSString *const kTokenizerTypeURL; -FOUNDATION_EXPORT NSString *const kTokenizerTypeAttribute; -FOUNDATION_EXPORT NSString *const kTokenizerTypeProject; -FOUNDATION_EXPORT NSString *const kTokenizerTypeOther; -FOUNDATION_EXPORT NSString *const kTokenizerTypeOtherClassNames; -FOUNDATION_EXPORT NSString *const kTokenizerTypeOtherMethodNames; - -typedef enum { - kTokenizerThemeDefault, - kTokenizerThemeDusk -} RegexHighlightViewTheme; - -//TODO: Clean this header -@class TextViewChange, JLTextView; -@interface JLTokenizer : NSObject - -- (NSMutableAttributedString *)tokenizeAttributedString:(NSMutableAttributedString *)attributedString withRecentTextViewChange:(TextViewChange *)change; - -@property (nonatomic, strong) UIColor *backgroundColor; -@property (nonatomic, strong) UIColor *highlightColor; - -@property(nonatomic) NSDictionary *colorDictionary; -@property (nonatomic, assign) RegexHighlightViewTheme theme; -@property (nonatomic, strong) NSArray *themes; -@property (nonatomic, weak) JLTextView *textView; - -@end diff --git a/Chromatism/JLTokenizer.m b/Chromatism/JLTokenizer.m deleted file mode 100644 index e64cb1d..0000000 --- a/Chromatism/JLTokenizer.m +++ /dev/null @@ -1,339 +0,0 @@ -// -// Tokenizer.m -// iGitpad -// -// Created by Johannes Lund on 2012-11-24. -// -// - -// This file builds upon the work of Kristian Kraljic -// -// RegexHighlightView.m -// Simple Objective-C Syntax Highlighter -// -// Created by Kristian Kraljic on 30/08/12. -// Copyright (c) 2012 Kristian Kraljic (dikrypt.com, ksquared.de). 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. -// - -#import "JLTokenizer.h" -#import "JLTextView.h" -#import - -NSString *const kTokenizerTypeText = @"text"; -NSString *const kTokenizerTypeBackground = @"background"; -NSString *const kTokenizerTypeComment = @"comment"; -NSString *const kTokenizerTypeDocumentationComment = @"documentation_comment"; -NSString *const kTokenizerTypeDocumentationCommentKeyword = @"documentation_comment_keyword"; -NSString *const kTokenizerTypeString = @"string"; -NSString *const kTokenizerTypeCharacter = @"character"; -NSString *const kTokenizerTypeNumber = @"number"; -NSString *const kTokenizerTypeKeyword = @"keyword"; -NSString *const kTokenizerTypePreprocessor = @"preprocessor"; -NSString *const kTokenizerTypeURL = @"url"; -NSString *const kTokenizerTypeAttribute = @"attribute"; -NSString *const kTokenizerTypeProject = @"project"; -NSString *const kTokenizerTypeOther = @"other"; -NSString *const kTokenizerTypeOtherMethodNames = @"other_method_names"; -NSString *const kTokenizerTypeOtherClassNames = @"other_class_names"; - -@interface NSMutableAttributedString (Regex) -- (void)addRanges:(NSArray *)array withColor:(UIColor *)color; -- (void)addRanges:(NSArray *)array withAttributes:(NSDictionary *)dic; -- (NSArray *)allMatchesOfPattern:(NSString *)pattern inString:(NSString *)string; - -- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color andDescription:(NSString *)description; -- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color range:(NSRange)range andDescription:(NSString *)description; -- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color group:(int)index range:(NSRange)range andDescription:(NSString *)description; -- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color options:(NSRegularExpressionOptions)options andDescription:(NSString *)description; -- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color options:(NSRegularExpressionOptions)options range:(NSRange)range andDescription:(NSString *)description; -- (void)removeAttribute:(NSString *)name withValue:(id)compareValue range:(NSRange)range; -@end - -@interface JLTokenizer () - -+ (NSDictionary*)highlightTheme:(RegexHighlightViewTheme)theme; - -@end - -@implementation JLTokenizer -@synthesize theme = _theme; - -- (NSMutableAttributedString *)tokenizeAttributedString:(NSMutableAttributedString *)string withRecentTextViewChange:(TextViewChange *)options { - UIColor *color; - color = [UIColor blueColor]; - - if (string.length == 0) return string; - - NSRange newWord = NSMakeRange(options.range.location, options.replacementText.length); - NSRange currentLine = NSMakeRange(0, string.length); - NSRange stringRange = currentLine; - if (options) { - NSRange start = [string.string rangeOfString:@"\n" options:NSBackwardsSearch range:NSMakeRange(0, newWord.location)]; - NSRange stop = [string.string rangeOfString:@"\n" options:0 range:NSMakeRange(newWord.length+newWord.location, string.length-(newWord.location+newWord.length))]; - - int location = MIN(MAX(start.location, 0), string.length); - int length = MIN(MAX(0,(stop.location+stop.length-location)), string.length-location); - - currentLine = NSMakeRange(location, length); - } - - NSDictionary *dic = self.colorDictionary; - - //Clear the comments to later be rebuilt - UIColor *compareColor = dic[kTokenizerTypeComment]; - [string removeAttribute:(NSString *)kCTForegroundColorAttributeName withValue:compareColor range:stringRange]; - - [string removeAttribute:(NSString *)kCTForegroundColorAttributeName range:currentLine]; - [string addAttribute:(NSString *)kCTForegroundColorAttributeName value:dic[kTokenizerTypeText] range:currentLine]; - - //TODO: Make this... better - - color = dic[kTokenizerTypeNumber]; - - [string addRegularExpressionWithPattern:@"(?<=\\s)\\d+" withColor:color range:currentLine andDescription:@"Numbers"]; - - [string addRegularExpressionWithPattern:@"@\\s*[\(|\{|\[]" withColor:color andDescription:@"New literals"]; - - //C – functions and similiar - color = dic[kTokenizerTypeOtherMethodNames]; - [string addRegularExpressionWithPattern:@"\\w+\\s*(?>\\(.*\\)" withColor:color group:1 range:currentLine andDescription:@"C function names"]; - - //Dot notation - [string addRegularExpressionWithPattern:@"\\.(\\w+)" withColor:color group:1 range:currentLine andDescription:@"Dot notation"]; - - //Method calls - [string addRegularExpressionWithPattern:@"\\[\\w+\\s+(\\w+)\\]" withColor:color group:1 range:currentLine andDescription:@"Method calls"]; - [string addRegularExpressionWithPattern:@"(?<=\\w+):\\s*[^\\s;\\]]+" withColor:color group:1 range:currentLine andDescription:@"Method calls parts"]; - - color = dic[kTokenizerTypeOtherClassNames]; - [string addRegularExpressionWithPattern:@"(\\b(?>NS|UI))\\w+\\b" withColor:color range:currentLine andDescription:@"UIKit and NS"]; - - color = dic[kTokenizerTypeKeyword]; - [string addRegularExpressionWithPattern:@"(?<=\\b)(?>true|false|yes|no|TRUE|FALSE|bool|BOOL|nil|id|void|self|NULL|if|else|strong|weak|nonatomic|atomic|assign|copy|typedef|enum|auto|break|case|const|char|continue|do|default|double|extern|float|for|goto|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|volatile|while|nonatomic|atomic|readonly)(\\b)" withColor:color range:currentLine andDescription:@"Keywords"]; - - - [string addRegularExpressionWithPattern:@"@[a-zA-Z0-9_]+" withColor:color range:currentLine andDescription:@"@things"]; - - color = dic[kTokenizerTypePreprocessor]; - [string addRegularExpressionWithPattern:@"#.*+\n" withColor:color range:currentLine andDescription:@"Prefixes"]; - - color = dic[kTokenizerTypeString]; - [string addRegularExpressionWithPattern:@"(\"|@\")[^\"]*(@\"|\")" withColor:color andDescription:@"Strings"]; - - color = dic[kTokenizerTypeComment]; - [string addRegularExpressionWithPattern:@"//.*+\n" withColor:color andDescription:@"Comments"]; - - [string addRegularExpressionWithPattern:@"/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*+/" withColor:color andDescription:@"Comments"]; - - return string; -} - -#pragma mark - Pattern Helpers - -// TODO: Extend this - -- (NSString *)patternBetweenString:(NSString *)start andString:(NSString *)stop -{ - return nil; -} - -#pragma mark - Color Themes - --(void)setTheme:(RegexHighlightViewTheme)theme -{ - self.colorDictionary = [JLTokenizer highlightTheme:theme]; - _theme = theme; - - //Set font, text color and background color back to default - UIColor* backgroundColor = self.colorDictionary[kTokenizerTypeBackground]; - if(backgroundColor) - self.backgroundColor = backgroundColor; - else self.backgroundColor = [UIColor whiteColor]; -} - -- (NSDictionary *)colorDictionary -{ - if (!_colorDictionary) { - _colorDictionary = [JLTokenizer highlightTheme:self.theme]; - } - return _colorDictionary; -} - -- (NSArray *)themes -{ - if (!_themes) _themes = @[@(kTokenizerThemeDefault),@(kTokenizerThemeDusk)]; - return _themes; -} - -- (RegexHighlightViewTheme)theme -{ - if (!_theme) _theme = kTokenizerThemeDefault; - return _theme; -} - -- (void)setTextView:(JLTextView *)textView -{ - _textView = textView; -} - -- (void)setBackgroundColor:(UIColor *)backgroundColor -{ - [self.textView.tableView setBackgroundColor:backgroundColor]; - - _backgroundColor = backgroundColor; -} - -// Just a bunch of colors -+ (NSDictionary*)highlightTheme:(RegexHighlightViewTheme)theme { - //Check if the highlight theme has already been defined - NSDictionary* themeColor = nil; - //If not define the theme and return it - switch(theme) { - case kTokenizerThemeDefault: - themeColor = @{kTokenizerTypeText: [UIColor colorWithRed:0.0/255 green:0.0/255 blue:0.0/255 alpha:1], - kTokenizerTypeBackground: [UIColor colorWithRed:255.0/255 green:255.0/255 blue:255.0/255 alpha:1], - kTokenizerTypeComment: [UIColor colorWithRed:0.0/255 green:131.0/255 blue:39.0/255 alpha:1], - kTokenizerTypeDocumentationComment: [UIColor colorWithRed:0.0/255 green:131.0/255 blue:39.0/255 alpha:1], - kTokenizerTypeDocumentationCommentKeyword: [UIColor colorWithRed:0.0/255 green:76.0/255 blue:29.0/255 alpha:1], - kTokenizerTypeString: [UIColor colorWithRed:211.0/255 green:45.0/255 blue:38.0/255 alpha:1], - kTokenizerTypeCharacter: [UIColor colorWithRed:40.0/255 green:52.0/255 blue:206.0/255 alpha:1], - kTokenizerTypeNumber: [UIColor colorWithRed:40.0/255 green:52.0/255 blue:206.0/255 alpha:1], - kTokenizerTypeKeyword: [UIColor colorWithRed:188.0/255 green:49.0/255 blue:156.0/255 alpha:1], - kTokenizerTypePreprocessor: [UIColor colorWithRed:120.0/255 green:72.0/255 blue:48.0/255 alpha:1], - kTokenizerTypeURL: [UIColor colorWithRed:21.0/255 green:67.0/255 blue:244.0/255 alpha:1], - kTokenizerTypeAttribute: [UIColor colorWithRed:150.0/255 green:125.0/255 blue:65.0/255 alpha:1], - kTokenizerTypeProject: [UIColor colorWithRed:77.0/255 green:129.0/255 blue:134.0/255 alpha:1], - kTokenizerTypeOther: [UIColor colorWithRed:113.0/255 green:65.0/255 blue:163.0/255 alpha:1], - kTokenizerTypeOtherMethodNames : [UIColor colorWithHex:@"7040a6" alpha:1], - kTokenizerTypeOtherClassNames : [UIColor colorWithHex:@"7040a6" alpha:1] - - - - }; - break; - case kTokenizerThemeDusk: - themeColor = @{kTokenizerTypeText: [UIColor whiteColor], - kTokenizerTypeBackground: [UIColor colorWithRed:30.0/255.0 green:32.0/255.0 blue:40.0/255.0 alpha:1], - kTokenizerTypeComment: [UIColor colorWithRed:72.0/255 green:190.0/255 blue:102.0/255 alpha:1], - kTokenizerTypeDocumentationComment: [UIColor colorWithRed:72.0/255 green:190.0/255 blue:102.0/255 alpha:1], - kTokenizerTypeDocumentationCommentKeyword: [UIColor colorWithRed:72.0/255 green:190.0/255 blue:102.0/255 alpha:1], - kTokenizerTypeString: [UIColor colorWithRed:230.0/255 green:66.0/255 blue:75.0/255 alpha:1], - kTokenizerTypeCharacter: [UIColor colorWithRed:139.0/255 green:134.0/255 blue:201.0/255 alpha:1], - kTokenizerTypeNumber: [UIColor colorWithRed:139.0/255 green:134.0/255 blue:201.0/255 alpha:1], - kTokenizerTypeKeyword: [UIColor colorWithRed:195.0/255 green:55.0/255 blue:149.0/255 alpha:1], - kTokenizerTypePreprocessor: [UIColor colorWithRed:198.0/255.0 green:124.0/255.0 blue:72.0/255.0 alpha:1], - kTokenizerTypeURL: [UIColor colorWithRed:35.0/255 green:63.0/255 blue:208.0/255 alpha:1], - kTokenizerTypeAttribute: [UIColor colorWithRed:103.0/255 green:135.0/255 blue:142.0/255 alpha:1], - kTokenizerTypeProject: [UIColor colorWithRed:146.0/255 green:199.0/255 blue:119.0/255 alpha:1], - kTokenizerTypeOther: [UIColor colorWithRed:0.0/255 green:175.0/255 blue:199.0/255 alpha:1], - kTokenizerTypeOtherClassNames : [UIColor colorWithHex:@"04afc8" alpha:1], - kTokenizerTypeOtherMethodNames : [UIColor colorWithHex:@"04afc8" alpha:1] - }; - break; - } - return themeColor; -} - - -@end - -#pragma mark - Regex Helpers - - -@implementation NSMutableAttributedString (Regex) - -- (void)removeAttribute:(NSString *)name withValue:(id)compareValue range:(NSRange)range -{ - [self enumerateAttribute:(NSString *)kCTForegroundColorAttributeName inRange:range options:0 usingBlock:^(id value, NSRange range, BOOL *stop) { - if ([value isEqual:compareValue]) { - [self removeAttribute:(NSString *)kCTForegroundColorAttributeName range:range]; - } - - }]; -} - - -- (void)addRanges:(NSArray *)array withColor:(UIColor *)color -{ - for (NSValue *value in array) { - [self removeAttribute:(NSString *)kCTForegroundColorAttributeName range:value.rangeValue]; - [self addAttribute:(NSString *)kCTForegroundColorAttributeName value:color range:value.rangeValue]; - } -} - -- (void)addRanges:(NSArray *)array withAttributes:(NSDictionary *)dic -{ - for (NSValue *value in array) { - if (value.rangeValue.location + value.rangeValue.length <= self.length){ - [self removeAttribute:(NSString *)kCTForegroundColorAttributeName range:value.rangeValue]; - [self addAttributes:dic range:value.rangeValue]; - } - } -} - -- (NSArray *)allMatchesOfPattern:(NSString *)pattern inString:(NSString *)string -{ - NSArray *mathces = [[NSRegularExpression regularExpressionWithPattern:pattern options:0 error:nil] matchesInString:string options:0 range:NSMakeRange(0, string.length)]; - - return mathces; -} - -- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color andDescription:(NSString *)description -{ - [self addRegularExpressionWithPattern:pattern withColor:color options:0 andDescription:description]; -} - -- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color group:(int)index range:(NSRange)range andDescription:(NSString *)description -{ - NSString *string = self.string; - - - NSRegularExpression* expression = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionAnchorsMatchLines error:nil]; - - [expression enumerateMatchesInString:string options:0 range:range usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { - [self addAttribute:(NSString *)kCTForegroundColorAttributeName value:color range:[result rangeAtIndex:index]]; - }]; -} - -- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color options:(NSRegularExpressionOptions)options andDescription:(NSString *)description -{ - [self addRegularExpressionWithPattern:pattern withColor:color options:options range:NSMakeRange(0, self.length) andDescription:description]; -} - -- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color options:(NSRegularExpressionOptions)options range:(NSRange)range andDescription:(NSString *)description -{ - NSString *string = self.string; - NSRegularExpression* expression = [NSRegularExpression regularExpressionWithPattern:pattern options:options error:nil]; - - [expression enumerateMatchesInString:string options:options range:range usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { - [self addAttribute:(NSString *)kCTForegroundColorAttributeName value:color range:result.range]; - }]; -} - -- (void)addRegularExpressionWithPattern:(NSString *)pattern withColor:(UIColor *)color range:(NSRange)range andDescription:(NSString *)description -{ - [self addRegularExpressionWithPattern:pattern withColor:color options:0 range:range andDescription:description]; -} - -@end diff --git a/Chromatism/Menlo.ttf b/Chromatism/Menlo.ttf deleted file mode 100644 index c20a0001739181a04a66b1006c543a2f44c21a55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2172912 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%0AFh7}=GN2L*T# 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ξ6SX@de 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