├── .gitignore ├── Cartfile ├── Cartfile.resolved ├── CodeReader.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ └── contents.xcworkspacedata └── xcuserdata │ └── wangshudao.xcuserdatad │ └── xcschemes │ ├── CodeReader.xcscheme │ └── xcschememanagement.plist ├── CodeReader ├── AppDelegate.swift ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── Icon-29.png │ │ ├── Icon-29@2x-1.png │ │ ├── Icon-29@2x.png │ │ ├── Icon-29@3x.png │ │ ├── Icon-40.png │ │ ├── Icon-40@2x-1.png │ │ ├── Icon-40@2x.png │ │ ├── Icon-40@3x.png │ │ ├── Icon-60@2x.png │ │ ├── Icon-60@3x.png │ │ ├── Icon-76.png │ │ ├── Icon-76@2x.png │ │ └── Icon-83.5@2x.png │ ├── Contents.json │ ├── buy_coffee.imageset │ │ ├── Contents.json │ │ └── buy_coffee.pdf │ ├── coffee_highlight.imageset │ │ ├── Contents.json │ │ └── coffee_highlight.pdf │ ├── dir.imageset │ │ ├── Contents.json │ │ └── dir.pdf │ ├── explore_highlight.imageset │ │ ├── Contents.json │ │ └── explore_highlight.pdf │ ├── favorite.imageset │ │ ├── Contents.json │ │ └── favorite.pdf │ ├── file.imageset │ │ ├── Contents.json │ │ └── file.pdf │ ├── file_addition.imageset │ │ ├── Contents.json │ │ └── file_addition.pdf │ ├── file_deletion.imageset │ │ ├── Contents.json │ │ └── file_deletion.pdf │ ├── file_modification.imageset │ │ ├── Contents.json │ │ └── file_modification.pdf │ ├── fork.imageset │ │ ├── Contents.json │ │ └── fork.pdf │ ├── lock.imageset │ │ ├── Contents.json │ │ └── coffee_lock.pdf │ ├── purchased_coffee.imageset │ │ ├── Contents.json │ │ └── purchased_coffee.pdf │ ├── recents_highlight.imageset │ │ ├── Contents.json │ │ └── recents_highlight.pdf │ ├── star.imageset │ │ ├── Contents.json │ │ └── star.pdf │ ├── themes.imageset │ │ ├── Contents.json │ │ └── themes.pdf │ ├── unfavorite.imageset │ │ ├── Contents.json │ │ └── unfavorite.pdf │ ├── unlock.imageset │ │ ├── Contents.json │ │ └── unlock.pdf │ ├── user_avatar.imageset │ │ ├── Contents.json │ │ └── user_avatar.pdf │ └── watch.imageset │ │ ├── Contents.json │ │ └── watch.pdf ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard ├── HTML │ ├── file_change.html │ ├── github-markdown.css │ ├── readme.html │ └── template.html ├── Helper │ ├── Extensions.swift │ └── ThemeFactory.swift ├── IAP │ ├── DonationProduct.swift │ └── IAPHelper.swift ├── Info.plist ├── JS │ └── highlight.pack.js ├── Model │ ├── Branch.swift │ ├── Commit.swift │ ├── CommitItem.swift │ ├── Recent.swift │ ├── RecentsManager.swift │ ├── Repo.swift │ ├── RepoFile.swift │ ├── SearchRepoResponse.swift │ ├── Theme.swift │ └── User.swift ├── Themes │ ├── agate.css │ ├── androidstudio.css │ ├── arduino-light.css │ ├── arta.css │ ├── ascetic.css │ ├── atelier-cave-dark.css │ ├── atelier-cave-light.css │ ├── atelier-dune-dark.css │ ├── atelier-dune-light.css │ ├── atelier-estuary-dark.css │ ├── atelier-estuary-light.css │ ├── atelier-forest-dark.css │ ├── atelier-forest-light.css │ ├── atelier-heath-dark.css │ ├── atelier-heath-light.css │ ├── atelier-lakeside-dark.css │ ├── atelier-lakeside-light.css │ ├── atelier-plateau-dark.css │ ├── atelier-plateau-light.css │ ├── atelier-savanna-dark.css │ ├── atelier-savanna-light.css │ ├── atelier-seaside-dark.css │ ├── atelier-seaside-light.css │ ├── atelier-sulphurpool-dark.css │ ├── atelier-sulphurpool-light.css │ ├── brown-paper.css │ ├── brown-papersq.png │ ├── codepen-embed.css │ ├── color-brewer.css │ ├── dark.css │ ├── darkula.css │ ├── default.css │ ├── docco.css │ ├── dracula.css │ ├── far.css │ ├── foundation.css │ ├── github-gist.css │ ├── github.css │ ├── googlecode.css │ ├── grayscale.css │ ├── gruvbox-dark.css │ ├── gruvbox-light.css │ ├── hopscotch.css │ ├── hybrid.css │ ├── idea.css │ ├── ir-black.css │ ├── kimbie.dark.css │ ├── kimbie.light.css │ ├── magula.css │ ├── mono-blue.css │ ├── monokai-sublime.css │ ├── monokai.css │ ├── obsidian.css │ ├── paraiso-dark.css │ ├── paraiso-light.css │ ├── pojoaque.css │ ├── pojoaque.jpg │ ├── purebasic.css │ ├── qtcreator_dark.css │ ├── qtcreator_light.css │ ├── railscasts.css │ ├── rainbow.css │ ├── school-book.css │ ├── school-book.png │ ├── solarized-dark.css │ ├── solarized-light.css │ ├── sunburst.css │ ├── tomorrow-night-blue.css │ ├── tomorrow-night-bright.css │ ├── tomorrow-night-eighties.css │ ├── tomorrow-night.css │ ├── tomorrow.css │ ├── vs.css │ ├── xcode.css │ ├── xt256.css │ └── zenburn.css ├── View │ ├── AboutViewController.swift │ ├── BaseTableViewController.swift │ ├── BaseViewController.swift │ ├── BranchCell.swift │ ├── BranchCell.xib │ ├── BranchListViewController.swift │ ├── CodeViewController.swift │ ├── CommitCell.swift │ ├── CommitCell.xib │ ├── CommitFileCell.swift │ ├── CommitFileListViewController.swift │ ├── CommitListViewController.swift │ ├── FileCell.swift │ ├── FileCell.xib │ ├── FileChangeViewController.swift │ ├── FileListViewController.swift │ ├── HistoryViewController.swift │ ├── InsetsLabel.swift │ ├── RecentFileCell.swift │ ├── RecentFileCell.xib │ ├── RepoViewController.swift │ ├── SearchRepoCell.swift │ ├── SearchRepoCell.xib │ ├── SearchViewController.swift │ ├── ThemeCell.swift │ ├── ThemeCell.xib │ └── ThemeListViewController.swift └── ViewModel │ ├── BranchListViewModel.swift │ ├── CommitFileListViewModel.swift │ ├── CommitListViewModel.swift │ ├── RepoViewModel.swift │ ├── SearchRepoViewModel.swift │ └── ThemeViewModel.swift ├── LICENSE ├── README.md ├── fix_carthage.sh ├── logo.png └── scripts └── set_build_number.sh /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## Build generated 6 | build/ 7 | DerivedData/ 8 | 9 | ## Various settings 10 | *.pbxuser 11 | !default.pbxuser 12 | *.mode1v3 13 | !default.mode1v3 14 | *.mode2v3 15 | !default.mode2v3 16 | *.perspectivev3 17 | !default.perspectivev3 18 | 19 | xcuserdata 20 | *.xccheckout 21 | *.moved-aside 22 | DerivedData 23 | *.hmap 24 | *.ipa 25 | *.xcuserstate 26 | xcuserdata/ 27 | 28 | ## Other 29 | *.moved-aside 30 | *.xcuserstate 31 | 32 | ## Obj-C/Swift specific 33 | *.hmap 34 | *.ipa 35 | *.dSYM.zip 36 | *.dSYM 37 | 38 | ## Playgrounds 39 | timeline.xctimeline 40 | playground.xcworkspace 41 | 42 | # Swift Package Manager 43 | # 44 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 45 | # Packages/ 46 | .build/ 47 | 48 | # CocoaPods 49 | # 50 | # We recommend against adding the Pods directory to your .gitignore. However 51 | # you should judge for yourself, the pros and cons are mentioned at: 52 | # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control 53 | # 54 | #Pods/ 55 | 56 | # Carthage 57 | Carthage/ 58 | 59 | # Reveal 60 | Reveal.framework/ 61 | 62 | # Fabric 63 | Fabric.framework/ 64 | Crashlytics.framework/ 65 | 66 | 67 | -------------------------------------------------------------------------------- /Cartfile: -------------------------------------------------------------------------------- 1 | github "Alamofire/Alamofire" ~> 4.0 2 | github "Hearst-DD/ObjectMapper" ~> 2.0.0 3 | github "onevcat/Kingfisher" ~> 3.0 4 | github "yeahdongcn/UIColor-Hex-Swift" >= 3.0.2 5 | github "malcommac/SwiftDate" ~> 4.0 6 | github "SwiftyBeaver/SwiftyBeaver" 7 | github "tristanhimmelman/AlamofireObjectMapper" ~> 4.0 8 | github "ReactiveX/RxSwift" ~> 3.0 9 | github "goktugyil/EZLoadingActivity" 10 | github "RxSwiftCommunity/RxDataSources" ~> 1.0 11 | -------------------------------------------------------------------------------- /Cartfile.resolved: -------------------------------------------------------------------------------- 1 | github "Alamofire/Alamofire" "4.0.1" 2 | github "goktugyil/EZLoadingActivity" "2.1" 3 | github "onevcat/Kingfisher" "3.2.1" 4 | github "Hearst-DD/ObjectMapper" "2.2.1" 5 | github "ReactiveX/RxSwift" "3.0.1" 6 | github "malcommac/SwiftDate" "4.0.7" 7 | github "SwiftyBeaver/SwiftyBeaver" "1.1.1" 8 | github "yeahdongcn/UIColor-Hex-Swift" "3.0.2" 9 | github "RxSwiftCommunity/RxDataSources" "1.0.1" 10 | github "tristanhimmelman/AlamofireObjectMapper" "4.0.0" 11 | -------------------------------------------------------------------------------- /CodeReader.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /CodeReader.xcodeproj/xcuserdata/wangshudao.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | CodeReader.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | D2204DD11DBB9A4700F44A6E 16 | 17 | primary 18 | 19 | 20 | D23EE4031CDF56B100D6143D 21 | 22 | primary 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /CodeReader/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // CodeReader 4 | // 5 | // Created by vulgur on 16/5/8. 6 | // Copyright © 2016年 MAD. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import Fabric 11 | import Crashlytics 12 | import SwiftyBeaver 13 | import EZLoadingActivity 14 | 15 | let log = SwiftyBeaver.self 16 | 17 | @UIApplicationMain 18 | class AppDelegate: UIResponder, UIApplicationDelegate { 19 | 20 | var window: UIWindow? 21 | 22 | 23 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 24 | 25 | UITabBar.appearance().tintColor = UIColor.black 26 | UINavigationBar.appearance().tintColor = UIColor.black 27 | 28 | Fabric.with([Answers.self, Crashlytics.self]) 29 | 30 | let console = ConsoleDestination() 31 | log.addDestination(console) 32 | 33 | EZLoadingActivity.Settings.BackgroundColor = UIColor.white 34 | EZLoadingActivity.Settings.DarkensBackground = true 35 | 36 | return true 37 | } 38 | 39 | func applicationWillResignActive(_ application: UIApplication) { 40 | // 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. 41 | // 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. 42 | } 43 | 44 | func applicationDidEnterBackground(_ application: UIApplication) { 45 | RecentsManager.sharedManager.save(RecentsManager.SaveType.Recent) 46 | RecentsManager.sharedManager.save(RecentsManager.SaveType.Favorite) 47 | } 48 | 49 | func applicationWillEnterForeground(_ application: UIApplication) { 50 | // 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. 51 | if DonationProduct.store.isProductPurchased(DonationProduct.BuyMeACoffee) { 52 | if let recentsData = UserDefaults.standard.object(forKey: "favorites") { 53 | RecentsManager.sharedManager.favorites = NSKeyedUnarchiver.unarchiveObject(with: recentsData as! Data) as! [Recent] 54 | log.info("Favorites loaded") 55 | } 56 | if let recentsData = UserDefaults.standard.object(forKey: "recents") { 57 | RecentsManager.sharedManager.recents = NSKeyedUnarchiver.unarchiveObject(with: recentsData as! Data) as! [Recent] 58 | log.info("Recents loaded") 59 | } 60 | Answers.logCustomEvent(withName: "Purchased", customAttributes: nil) 61 | } else { 62 | Answers.logCustomEvent(withName: "Not Purchased", customAttributes: nil) 63 | } 64 | } 65 | 66 | func applicationDidBecomeActive(_ application: UIApplication) { 67 | // 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. 68 | } 69 | 70 | func applicationWillTerminate(_ application: UIApplication) { 71 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 72 | } 73 | 74 | 75 | } 76 | 77 | -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "size" : "29x29", 15 | "idiom" : "iphone", 16 | "filename" : "Icon-29@2x.png", 17 | "scale" : "2x" 18 | }, 19 | { 20 | "size" : "29x29", 21 | "idiom" : "iphone", 22 | "filename" : "Icon-29@3x.png", 23 | "scale" : "3x" 24 | }, 25 | { 26 | "size" : "40x40", 27 | "idiom" : "iphone", 28 | "filename" : "Icon-40@2x.png", 29 | "scale" : "2x" 30 | }, 31 | { 32 | "size" : "40x40", 33 | "idiom" : "iphone", 34 | "filename" : "Icon-40@3x.png", 35 | "scale" : "3x" 36 | }, 37 | { 38 | "size" : "60x60", 39 | "idiom" : "iphone", 40 | "filename" : "Icon-60@2x.png", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "size" : "60x60", 45 | "idiom" : "iphone", 46 | "filename" : "Icon-60@3x.png", 47 | "scale" : "3x" 48 | }, 49 | { 50 | "idiom" : "ipad", 51 | "size" : "20x20", 52 | "scale" : "1x" 53 | }, 54 | { 55 | "idiom" : "ipad", 56 | "size" : "20x20", 57 | "scale" : "2x" 58 | }, 59 | { 60 | "size" : "29x29", 61 | "idiom" : "ipad", 62 | "filename" : "Icon-29.png", 63 | "scale" : "1x" 64 | }, 65 | { 66 | "size" : "29x29", 67 | "idiom" : "ipad", 68 | "filename" : "Icon-29@2x-1.png", 69 | "scale" : "2x" 70 | }, 71 | { 72 | "size" : "40x40", 73 | "idiom" : "ipad", 74 | "filename" : "Icon-40.png", 75 | "scale" : "1x" 76 | }, 77 | { 78 | "size" : "40x40", 79 | "idiom" : "ipad", 80 | "filename" : "Icon-40@2x-1.png", 81 | "scale" : "2x" 82 | }, 83 | { 84 | "size" : "76x76", 85 | "idiom" : "ipad", 86 | "filename" : "Icon-76.png", 87 | "scale" : "1x" 88 | }, 89 | { 90 | "size" : "76x76", 91 | "idiom" : "ipad", 92 | "filename" : "Icon-76@2x.png", 93 | "scale" : "2x" 94 | }, 95 | { 96 | "size" : "83.5x83.5", 97 | "idiom" : "ipad", 98 | "filename" : "Icon-83.5@2x.png", 99 | "scale" : "2x" 100 | } 101 | ], 102 | "info" : { 103 | "version" : 1, 104 | "author" : "xcode" 105 | } 106 | } -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/AppIcon.appiconset/Icon-29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vulgur/Sources/5b99855d8cb09ac2e68f8ca617c8045130d9648b/CodeReader/Assets.xcassets/AppIcon.appiconset/Icon-29.png -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/AppIcon.appiconset/Icon-29@2x-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vulgur/Sources/5b99855d8cb09ac2e68f8ca617c8045130d9648b/CodeReader/Assets.xcassets/AppIcon.appiconset/Icon-29@2x-1.png -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/AppIcon.appiconset/Icon-29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vulgur/Sources/5b99855d8cb09ac2e68f8ca617c8045130d9648b/CodeReader/Assets.xcassets/AppIcon.appiconset/Icon-29@2x.png -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/AppIcon.appiconset/Icon-29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vulgur/Sources/5b99855d8cb09ac2e68f8ca617c8045130d9648b/CodeReader/Assets.xcassets/AppIcon.appiconset/Icon-29@3x.png -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/AppIcon.appiconset/Icon-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vulgur/Sources/5b99855d8cb09ac2e68f8ca617c8045130d9648b/CodeReader/Assets.xcassets/AppIcon.appiconset/Icon-40.png -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/AppIcon.appiconset/Icon-40@2x-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vulgur/Sources/5b99855d8cb09ac2e68f8ca617c8045130d9648b/CodeReader/Assets.xcassets/AppIcon.appiconset/Icon-40@2x-1.png -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/AppIcon.appiconset/Icon-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vulgur/Sources/5b99855d8cb09ac2e68f8ca617c8045130d9648b/CodeReader/Assets.xcassets/AppIcon.appiconset/Icon-40@2x.png -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/AppIcon.appiconset/Icon-40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vulgur/Sources/5b99855d8cb09ac2e68f8ca617c8045130d9648b/CodeReader/Assets.xcassets/AppIcon.appiconset/Icon-40@3x.png -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vulgur/Sources/5b99855d8cb09ac2e68f8ca617c8045130d9648b/CodeReader/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vulgur/Sources/5b99855d8cb09ac2e68f8ca617c8045130d9648b/CodeReader/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/AppIcon.appiconset/Icon-76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vulgur/Sources/5b99855d8cb09ac2e68f8ca617c8045130d9648b/CodeReader/Assets.xcassets/AppIcon.appiconset/Icon-76.png -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vulgur/Sources/5b99855d8cb09ac2e68f8ca617c8045130d9648b/CodeReader/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/AppIcon.appiconset/Icon-83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vulgur/Sources/5b99855d8cb09ac2e68f8ca617c8045130d9648b/CodeReader/Assets.xcassets/AppIcon.appiconset/Icon-83.5@2x.png -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/buy_coffee.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "buy_coffee.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/buy_coffee.imageset/buy_coffee.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vulgur/Sources/5b99855d8cb09ac2e68f8ca617c8045130d9648b/CodeReader/Assets.xcassets/buy_coffee.imageset/buy_coffee.pdf -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/coffee_highlight.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "coffee_highlight.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/coffee_highlight.imageset/coffee_highlight.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vulgur/Sources/5b99855d8cb09ac2e68f8ca617c8045130d9648b/CodeReader/Assets.xcassets/coffee_highlight.imageset/coffee_highlight.pdf -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/dir.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "dir.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/dir.imageset/dir.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vulgur/Sources/5b99855d8cb09ac2e68f8ca617c8045130d9648b/CodeReader/Assets.xcassets/dir.imageset/dir.pdf -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/explore_highlight.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "explore_highlight.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/explore_highlight.imageset/explore_highlight.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vulgur/Sources/5b99855d8cb09ac2e68f8ca617c8045130d9648b/CodeReader/Assets.xcassets/explore_highlight.imageset/explore_highlight.pdf -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/favorite.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "favorite.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/favorite.imageset/favorite.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vulgur/Sources/5b99855d8cb09ac2e68f8ca617c8045130d9648b/CodeReader/Assets.xcassets/favorite.imageset/favorite.pdf -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/file.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "file.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/file.imageset/file.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vulgur/Sources/5b99855d8cb09ac2e68f8ca617c8045130d9648b/CodeReader/Assets.xcassets/file.imageset/file.pdf -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/file_addition.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "file_addition.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/file_addition.imageset/file_addition.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vulgur/Sources/5b99855d8cb09ac2e68f8ca617c8045130d9648b/CodeReader/Assets.xcassets/file_addition.imageset/file_addition.pdf -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/file_deletion.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "file_deletion.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/file_deletion.imageset/file_deletion.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vulgur/Sources/5b99855d8cb09ac2e68f8ca617c8045130d9648b/CodeReader/Assets.xcassets/file_deletion.imageset/file_deletion.pdf -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/file_modification.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "file_modification.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/file_modification.imageset/file_modification.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vulgur/Sources/5b99855d8cb09ac2e68f8ca617c8045130d9648b/CodeReader/Assets.xcassets/file_modification.imageset/file_modification.pdf -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/fork.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "fork.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/fork.imageset/fork.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vulgur/Sources/5b99855d8cb09ac2e68f8ca617c8045130d9648b/CodeReader/Assets.xcassets/fork.imageset/fork.pdf -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/lock.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "coffee_lock.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/lock.imageset/coffee_lock.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vulgur/Sources/5b99855d8cb09ac2e68f8ca617c8045130d9648b/CodeReader/Assets.xcassets/lock.imageset/coffee_lock.pdf -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/purchased_coffee.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "purchased_coffee.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/purchased_coffee.imageset/purchased_coffee.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vulgur/Sources/5b99855d8cb09ac2e68f8ca617c8045130d9648b/CodeReader/Assets.xcassets/purchased_coffee.imageset/purchased_coffee.pdf -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/recents_highlight.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "recents_highlight.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/recents_highlight.imageset/recents_highlight.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vulgur/Sources/5b99855d8cb09ac2e68f8ca617c8045130d9648b/CodeReader/Assets.xcassets/recents_highlight.imageset/recents_highlight.pdf -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/star.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "star.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/star.imageset/star.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vulgur/Sources/5b99855d8cb09ac2e68f8ca617c8045130d9648b/CodeReader/Assets.xcassets/star.imageset/star.pdf -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/themes.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "themes.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/themes.imageset/themes.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vulgur/Sources/5b99855d8cb09ac2e68f8ca617c8045130d9648b/CodeReader/Assets.xcassets/themes.imageset/themes.pdf -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/unfavorite.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "unfavorite.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/unfavorite.imageset/unfavorite.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vulgur/Sources/5b99855d8cb09ac2e68f8ca617c8045130d9648b/CodeReader/Assets.xcassets/unfavorite.imageset/unfavorite.pdf -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/unlock.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "unlock.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/unlock.imageset/unlock.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vulgur/Sources/5b99855d8cb09ac2e68f8ca617c8045130d9648b/CodeReader/Assets.xcassets/unlock.imageset/unlock.pdf -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/user_avatar.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "user_avatar.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/user_avatar.imageset/user_avatar.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vulgur/Sources/5b99855d8cb09ac2e68f8ca617c8045130d9648b/CodeReader/Assets.xcassets/user_avatar.imageset/user_avatar.pdf -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/watch.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "watch.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /CodeReader/Assets.xcassets/watch.imageset/watch.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vulgur/Sources/5b99855d8cb09ac2e68f8ca617c8045130d9648b/CodeReader/Assets.xcassets/watch.imageset/watch.pdf -------------------------------------------------------------------------------- /CodeReader/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /CodeReader/HTML/file_change.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | #patch# 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /CodeReader/HTML/readme.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | #code# 9 | 10 | 11 | -------------------------------------------------------------------------------- /CodeReader/HTML/template.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | #title# 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |

13 | 
14 | #code#
15 | 
16 | 
17 | 18 | -------------------------------------------------------------------------------- /CodeReader/Helper/Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Extensions.swift 3 | // CodeReader 4 | // 5 | // Created by vulgur on 16/5/11. 6 | // Copyright © 2016年 MAD. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | extension UITableView { 12 | func reloadDataWithAutoSizingCells() { 13 | self.reloadData() 14 | self.setNeedsDisplay() 15 | self.layoutIfNeeded() 16 | self.reloadData() 17 | } 18 | } 19 | 20 | extension UIScrollView { 21 | func resizeContentSize() { 22 | let contentWidth = self.frame.width 23 | var contentHeight: CGFloat = 0 24 | for subview in subviews { 25 | contentHeight += subview.frame.height 26 | } 27 | self.contentSize = CGSize(width: contentWidth, height: contentHeight) 28 | } 29 | 30 | func isNearBottomEdge(edgeOffset: CGFloat = 20.0) -> Bool { 31 | return self.contentOffset.y + self.frame.size.height + edgeOffset > self.contentSize.height 32 | } 33 | } 34 | 35 | extension Date { 36 | var dateString: String { 37 | let formatter = DateFormatter() 38 | formatter.dateFormat = "yyyy-MM-dd HH:mm:ss" 39 | return formatter.string(from: self) 40 | } 41 | } 42 | 43 | extension UITableView { 44 | func hideEmptyCells() { 45 | self.tableFooterView = UIView(frame: .zero) 46 | } 47 | } 48 | 49 | extension String { 50 | var URLEscaped: String { 51 | return self.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) ?? "" 52 | } 53 | } 54 | 55 | extension String { 56 | var fileBaseName: String { 57 | let parts = self.components(separatedBy: "/") 58 | return parts.last ?? self 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /CodeReader/IAP/DonationProduct.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DonationProduct.swift 3 | // CodeReader 4 | // 5 | // Created by vulgur on 16/6/20. 6 | // Copyright © 2016年 MAD. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public struct DonationProduct { 12 | fileprivate static let Prefix = "com.wsd.Sources." 13 | public static let BuyMeACoffee = Prefix + "Donation" 14 | fileprivate static let productIdentifiers: Set = [DonationProduct.BuyMeACoffee] 15 | public static let store = IAPHelper(productIds: DonationProduct.productIdentifiers) 16 | } 17 | 18 | func resourceNameForProductIdentifier(_ productIdentifier: String) -> String? { 19 | return productIdentifier.components(separatedBy: ".").last 20 | } 21 | 22 | 23 | -------------------------------------------------------------------------------- /CodeReader/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | Sources 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.2.2 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 121 23 | Fabric 24 | 25 | APIKey 26 | f88d269e9ebddfa5288c332293c76d498259c44c 27 | Kits 28 | 29 | 30 | KitInfo 31 | 32 | KitName 33 | Answers 34 | 35 | 36 | KitInfo 37 | 38 | KitName 39 | Crashlytics 40 | 41 | 42 | 43 | LSRequiresIPhoneOS 44 | 45 | NSAppTransportSecurity 46 | 47 | NSAllowsArbitraryLoads 48 | 49 | 50 | UILaunchStoryboardName 51 | LaunchScreen 52 | UIMainStoryboardFile 53 | Main 54 | UIRequiredDeviceCapabilities 55 | 56 | armv7 57 | 58 | UIRequiresFullScreen 59 | 60 | UISupportedInterfaceOrientations 61 | 62 | UIInterfaceOrientationPortrait 63 | UIInterfaceOrientationLandscapeLeft 64 | UIInterfaceOrientationLandscapeRight 65 | UIInterfaceOrientationPortraitUpsideDown 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /CodeReader/Model/Branch.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Branch.swift 3 | // CodeReader 4 | // 5 | // Created by vulgur on 16/9/5. 6 | // Copyright © 2016年 MAD. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import ObjectMapper 11 | 12 | struct LatestCommit: Mappable { 13 | var sha: String? 14 | var URLString: String? 15 | 16 | init?(map: Map) { 17 | 18 | } 19 | 20 | mutating func mapping(map: Map) { 21 | sha <- map["sha"] 22 | URLString <- map["url"] 23 | } 24 | } 25 | 26 | struct Branch: Mappable { 27 | 28 | var name: String? 29 | var latestCommitURLString: String? 30 | // var lastestUpdateDate: String? 31 | 32 | init?(map: Map) { 33 | 34 | } 35 | 36 | mutating func mapping(map: Map) { 37 | name <- map["name"] 38 | latestCommitURLString <- map["commit.url"] 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /CodeReader/Model/Commit.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CommitFile.swift 3 | // CodeReader 4 | // 5 | // Created by vulgur on 16/9/2. 6 | // Copyright © 2016年 MAD. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import ObjectMapper 11 | 12 | /** 13 | item in one commit, reperesent for changes of a file 14 | **/ 15 | struct CommitFile: Mappable { 16 | 17 | var sha: String? 18 | var filename: String? 19 | var status: String? 20 | var additions: Int? 21 | var deletions: Int? 22 | var changes: Int? 23 | // var blogURLString: String? 24 | // var contentsURLString: String? 25 | // var rawURLString: String? 26 | var patch: String? 27 | 28 | init?(map: Map) { 29 | 30 | } 31 | 32 | mutating func mapping(map: Map) { 33 | sha <- map["sha"] 34 | filename <- map["filename"] 35 | status <- map["status"] 36 | additions <- map["additions"] 37 | deletions <- map["deletions"] 38 | changes <- map["changes"] 39 | patch <- map["patch"] 40 | } 41 | } 42 | 43 | /** single commit **/ 44 | struct Commit: Mappable { 45 | var files = [CommitFile]() 46 | 47 | init?(map: Map) { 48 | 49 | } 50 | 51 | mutating func mapping(map: Map) { 52 | files <- map["files"] 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /CodeReader/Model/CommitItem.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Commit.swift 3 | // CodeReader 4 | // 5 | // Created by vulgur on 16/9/1. 6 | // Copyright © 2016年 MAD. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import ObjectMapper 11 | 12 | // "parents" item in JSON 13 | struct ParentCommit: Mappable { 14 | var URLString: String? 15 | var htmlURLString: String? 16 | var sha: String? 17 | 18 | init?(map: Map) { 19 | 20 | } 21 | 22 | mutating func mapping(map: Map) { 23 | URLString <- map["url"] 24 | htmlURLString <- map["html_url"] 25 | sha <- map["sha"] 26 | } 27 | } 28 | 29 | struct CommitUser: Mappable { 30 | 31 | var name: String? 32 | var email: String? 33 | var dateString: String? 34 | 35 | init?(map: Map) { 36 | 37 | } 38 | 39 | mutating func mapping(map: Map) { 40 | name <- map["name"] 41 | email <- map["email"] 42 | dateString <- map["date"] 43 | } 44 | } 45 | 46 | struct CommitInfo: Mappable { 47 | var author: CommitUser? 48 | var committer: CommitUser? 49 | var message: String? 50 | 51 | init?(map: Map) { 52 | 53 | } 54 | 55 | mutating func mapping(map: Map) { 56 | author <- map["author"] 57 | committer <- map["committer"] 58 | message <- map["message"] 59 | } 60 | } 61 | 62 | 63 | struct CommitItem: Mappable { 64 | var sha: String? 65 | // var author: User? 66 | var committer: User? 67 | var URLString: String? 68 | var htmlURLString: String? 69 | var parents = [ParentCommit]() 70 | var commitInfo: CommitInfo? 71 | 72 | init?(map: Map) { 73 | 74 | } 75 | 76 | mutating func mapping(map: Map) { 77 | sha <- map["sha"] 78 | URLString <- map["url"] 79 | htmlURLString <- map["html_url"] 80 | commitInfo <- map["commit"] 81 | committer <- map["committer"] 82 | parents <- map["parents"] 83 | 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /CodeReader/Model/Recent.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Recent.swift 3 | // CodeReader 4 | // 5 | // Created by vulgur on 16/6/23. 6 | // Copyright © 2016年 MAD. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | let RecentRepoFileKey = "recent_repo_file" 12 | let RecentOwnerNameKey = "recent_owner_name" 13 | let RecentRepoNameKey = "recent_repo_name" 14 | 15 | class Recent: NSObject, NSCoding{ 16 | 17 | var file: RepoFile 18 | var ownerName: String 19 | var repoName: String 20 | 21 | init(file: RepoFile, ownerName: String, repoName: String) { 22 | self.file = file 23 | self.ownerName = ownerName 24 | self.repoName = repoName 25 | } 26 | 27 | // MARK: NSCoding 28 | convenience required init?(coder aDecoder: NSCoder) { 29 | guard let file = aDecoder.decodeObject(forKey: RecentRepoFileKey) as? RepoFile, 30 | let ownerName = aDecoder.decodeObject(forKey: RecentOwnerNameKey) as? String, 31 | let repoName = aDecoder.decodeObject(forKey: RecentRepoNameKey) as? String 32 | else { 33 | return nil 34 | } 35 | self.init(file: file, ownerName: ownerName, repoName: repoName) 36 | } 37 | 38 | func encode(with aCoder: NSCoder) { 39 | aCoder.encode(self.file, forKey: RecentRepoFileKey) 40 | aCoder.encode(self.ownerName, forKey: RecentOwnerNameKey) 41 | aCoder.encode(self.repoName, forKey: RecentRepoNameKey) 42 | } 43 | 44 | override func isEqual(_ object: Any?) -> Bool { 45 | if let anotherRecent = object as? Recent { 46 | return self.repoName == anotherRecent.repoName 47 | && self.ownerName == anotherRecent.ownerName 48 | && self.file == anotherRecent.file 49 | } 50 | return false 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /CodeReader/Model/RecentsManager.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RecentsManager.swift 3 | // CodeReader 4 | // 5 | // Created by vulgur on 16/6/23. 6 | // Copyright © 2016年 MAD. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Crashlytics 11 | 12 | class RecentsManager { 13 | 14 | enum SaveType : String { 15 | case Recent = "recents" 16 | case Favorite = "favorites" 17 | } 18 | 19 | static let sharedManager = RecentsManager() 20 | 21 | var recents = [Recent]() 22 | var favorites = [Recent]() 23 | var currentRepoName: String? 24 | var currentOwnerName: String? 25 | 26 | fileprivate var maxCapacity: Int { 27 | if DonationProduct.store.isProductPurchased(DonationProduct.BuyMeACoffee) { 28 | return 50 29 | } else { 30 | return 5 31 | } 32 | } 33 | 34 | func save(_ type: SaveType) { 35 | var data: AnyObject? 36 | var shouldSave = false 37 | switch type { 38 | case .Recent: 39 | if DonationProduct.store.isProductPurchased(DonationProduct.BuyMeACoffee) && self.recents.count > 0 { 40 | shouldSave = true 41 | data = NSKeyedArchiver.archivedData(withRootObject: self.recents) as AnyObject? 42 | } else { 43 | shouldSave = false 44 | } 45 | case .Favorite: 46 | if self.favorites.count > 0 { 47 | shouldSave = true 48 | data = NSKeyedArchiver.archivedData(withRootObject: self.favorites) as AnyObject? 49 | } else { 50 | shouldSave = false 51 | } 52 | } 53 | 54 | if shouldSave { 55 | UserDefaults.standard.set(data, forKey: type.rawValue) 56 | UserDefaults.standard.synchronize() 57 | print("\(type.rawValue) saved") 58 | } 59 | } 60 | 61 | func addRecentFile(_ file: RepoFile) { 62 | let ownerName = currentOwnerName ?? "Unknown" 63 | let repoName = currentRepoName ?? "Unknown" 64 | let recent = Recent(file: file, ownerName: ownerName, repoName: repoName) 65 | if recents.contains(recent) { 66 | if let index = recents.index(of: recent) { 67 | recents.remove(at: index) 68 | } 69 | } 70 | recents.insert(recent, at: 0) 71 | if recents.count <= maxCapacity { 72 | } else { 73 | recents.removeLast() 74 | } 75 | } 76 | 77 | func addFavoriteByFile(_ file: RepoFile) { 78 | let ownerName = currentOwnerName ?? "Unknown" 79 | let repoName = currentRepoName ?? "Unknown" 80 | let recent = Recent(file: file, ownerName: ownerName, repoName: repoName) 81 | if favorites.contains(recent) { 82 | if let index = favorites.index(of: recent) { 83 | favorites.remove(at: index) 84 | } 85 | } 86 | favorites.insert(recent, at: 0) 87 | Answers.logCustomEvent(withName: "favorite", customAttributes: ["from": "file"]) 88 | } 89 | 90 | func addFavoriteByRecent(_ recent: Recent) { 91 | let favorite = recent 92 | if favorites.contains(favorite) { 93 | if let index = favorites.index(of: favorite) { 94 | favorites.remove(at: index) 95 | } 96 | } 97 | favorites.insert(favorite, at: 0) 98 | Answers.logCustomEvent(withName: "favorite", customAttributes: ["from": "recent"]) 99 | } 100 | 101 | func removeFavoriteByRecent(_ recent: Recent) { 102 | assert(favorites.count > 0, "Favorites must not be empty") 103 | if let index = favorites.index(of: recent) { 104 | favorites.remove(at: index) 105 | } 106 | } 107 | 108 | func removeFavoriteByFile(_ file: RepoFile) { 109 | assert(favorites.count > 0, "Favorites must not be empty") 110 | var indexToDelete: Int = -1 111 | for (index, favorite) in favorites.enumerated() { 112 | if favorite.file == file { 113 | indexToDelete = index 114 | break 115 | } 116 | } 117 | if indexToDelete >= 0 { 118 | favorites.remove(at: indexToDelete) 119 | } 120 | } 121 | } 122 | -------------------------------------------------------------------------------- /CodeReader/Model/Repo.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Repo.swift 3 | // CodeReader 4 | // 5 | // Created by vulgur on 16/5/10. 6 | // Copyright © 2016年 MAD. All rights reserved. 7 | // 8 | 9 | import ObjectMapper 10 | 11 | class Repo: Mappable { 12 | 13 | var repoId: String? 14 | var name: String? 15 | var fullName: String? 16 | var owner: User? 17 | var description: String? 18 | var size: Int? 19 | var starsCount: Int? 20 | var watchersCount: Int? 21 | var language: String? 22 | var forksCount: Int? 23 | var createdDate: String? 24 | var pushedDate: String? 25 | 26 | required init?(map: Map) { 27 | 28 | } 29 | 30 | // Mappable 31 | func mapping(map: Map) { 32 | repoId <- map["id"] 33 | name <- map["name"] 34 | fullName <- map["full_name"] 35 | owner <- map["owner"] 36 | description <- map["description"] 37 | size <- map["size"] 38 | starsCount <- map["stargazers_count"] 39 | language <- map["language"] 40 | forksCount <- map["forks"] 41 | createdDate <- map["created_at"] 42 | pushedDate <- map["pushed_at"] 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /CodeReader/Model/RepoFile.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RepoFile.swift 3 | // CodeReader 4 | // 5 | // Created by vulgur on 16/5/27. 6 | // Copyright © 2016年 MAD. All rights reserved. 7 | // 8 | 9 | import ObjectMapper 10 | 11 | let RepoFileNameKey = "repo_file_name" 12 | let RepoFileTypeKey = "repo_file_type" 13 | let RepoFilePathKey = "repo_file_path" 14 | let RepoFileDownloadURLKey = "repo_file_download_url" 15 | let RepoFileHTMLURLKey = "repo_file_html_url" 16 | let RepoFileAPIURLKey = "repo_file_api_url" 17 | 18 | class RepoFile: NSObject, Mappable { 19 | var name: String? 20 | var type: String? 21 | var path: String? 22 | var downloadURLString: String? 23 | var htmlURLString: String? 24 | var apiURLString: String? 25 | 26 | required init?(map: Map) { 27 | 28 | } 29 | 30 | required init?(coder aDecoder: NSCoder) { 31 | guard let name = aDecoder.decodeObject(forKey: RepoFileNameKey) as? String, 32 | let type = aDecoder.decodeObject(forKey: RepoFileTypeKey) as? String, 33 | let path = aDecoder.decodeObject(forKey: RepoFilePathKey) as? String, 34 | let downloadURLString = aDecoder.decodeObject(forKey: RepoFileDownloadURLKey) as? String, 35 | let htmlURLString = aDecoder.decodeObject(forKey: RepoFileHTMLURLKey) as? String, 36 | let apiURLString = aDecoder.decodeObject(forKey: RepoFileAPIURLKey) as? String 37 | else { 38 | return nil 39 | } 40 | self.name = name 41 | self.type = type 42 | self.path = path 43 | self.downloadURLString = downloadURLString 44 | self.htmlURLString = htmlURLString 45 | self.apiURLString = apiURLString 46 | } 47 | 48 | func mapping(map: Map) { 49 | name <- map["name"] 50 | type <- map["type"] 51 | path <- map["path"] 52 | downloadURLString <- map["download_url"] 53 | htmlURLString <- map["html_url"] 54 | apiURLString <- map["url"] 55 | } 56 | 57 | 58 | 59 | 60 | } 61 | 62 | extension RepoFile: NSCoding { 63 | 64 | override func isEqual(_ object: Any?) -> Bool { 65 | if let anotherRepoFile = object as? RepoFile { 66 | return self.htmlURLString == anotherRepoFile.htmlURLString 67 | } 68 | return false 69 | } 70 | 71 | func encode(with aCoder: NSCoder) { 72 | aCoder.encode(name, forKey: RepoFileNameKey) 73 | aCoder.encode(type, forKey: RepoFileTypeKey) 74 | aCoder.encode(path, forKey: RepoFilePathKey) 75 | aCoder.encode(downloadURLString, forKey: RepoFileDownloadURLKey) 76 | aCoder.encode(htmlURLString, forKey: RepoFileHTMLURLKey) 77 | aCoder.encode(apiURLString, forKey: RepoFileAPIURLKey) 78 | } 79 | 80 | 81 | } 82 | -------------------------------------------------------------------------------- /CodeReader/Model/SearchRepoResponse.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SearchRepoResponse.swift 3 | // CodeReader 4 | // 5 | // Created by vulgur on 16/5/10. 6 | // Copyright © 2016年 MAD. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import ObjectMapper 11 | 12 | class SearchRepoResponse: Mappable { 13 | var totalCount: Int? 14 | var items: [Repo]? 15 | 16 | required init?(map: Map) { 17 | 18 | } 19 | 20 | func mapping(map: Map) { 21 | totalCount <- map["total_count"] 22 | items <- map["items"] 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /CodeReader/Model/Theme.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Theme.swift 3 | // CodeReader 4 | // 5 | // Created by vulgur on 16/6/11. 6 | // Copyright © 2016年 MAD. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class Theme { 12 | var name: String! 13 | var colors = [UIColor?]() 14 | var isPurchased: Bool = true 15 | required init(name: String, purchased: Bool = false) { 16 | self.name = name 17 | self.isPurchased = purchased 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /CodeReader/Model/User.swift: -------------------------------------------------------------------------------- 1 | // 2 | // User.swift 3 | // CodeReader 4 | // 5 | // Created by vulgur on 16/9/2. 6 | // Copyright © 2016年 MAD. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import ObjectMapper 11 | 12 | /** 13 | User object for search result and bio page 14 | */ 15 | struct User: Mappable { 16 | 17 | /** search info **/ 18 | var loginName: String? 19 | var userId: String? 20 | var avatarURLString: String? 21 | var URLString: String? 22 | var reposURLString: String? 23 | 24 | /** bio info **/ 25 | var username: String? 26 | var company: String? 27 | var blog: String? 28 | var location: String? 29 | var email: String? 30 | var bio: String? 31 | var publicReposCount: Int? 32 | var followersCount: Int? 33 | var followingCount: Int? 34 | var joinAtDate: Date? 35 | 36 | 37 | init() { 38 | 39 | } 40 | 41 | init?(map: Map) { 42 | 43 | } 44 | 45 | mutating func mapping(map: Map) { 46 | loginName <- map["login"] 47 | userId <- map["id"] 48 | avatarURLString <- map["avatar_url"] 49 | URLString <- map["url"] 50 | reposURLString <- map["repos_url"] 51 | 52 | username <- map["name"] 53 | company <- map["company"] 54 | blog <- map["blog"] 55 | location <- map["location"] 56 | email <- map["email"] 57 | bio <- map["bio"] 58 | publicReposCount <- map["public_repos"] 59 | followersCount <- map["followers"] 60 | followingCount <- map["following"] 61 | joinAtDate <- map["created_at"] 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /CodeReader/Themes/agate.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Agate by Taufik Nurrohman 3 | * ---------------------------------------------------- 4 | * 5 | * #ade5fc 6 | * #a2fca2 7 | * #c6b4f0 8 | * #d36363 9 | * #fcc28c 10 | * #fc9b9b 11 | * #ffa 12 | * #fff 13 | * #333 14 | * #62c8f3 15 | * #888 16 | * 17 | */ 18 | 19 | .hljs { 20 | display: block; 21 | overflow-x: auto; 22 | padding: 0.5em; 23 | background: #333; 24 | color: white; 25 | } 26 | 27 | .hljs-name, 28 | .hljs-strong { 29 | font-weight: bold; 30 | } 31 | 32 | .hljs-code, 33 | .hljs-emphasis { 34 | font-style: italic; 35 | } 36 | 37 | .hljs-tag { 38 | color: #62c8f3; 39 | } 40 | 41 | .hljs-variable, 42 | .hljs-template-variable, 43 | .hljs-selector-id, 44 | .hljs-selector-class { 45 | color: #ade5fc; 46 | } 47 | 48 | .hljs-string, 49 | .hljs-bullet { 50 | color: #a2fca2; 51 | } 52 | 53 | .hljs-type, 54 | .hljs-title, 55 | .hljs-section, 56 | .hljs-attribute, 57 | .hljs-quote, 58 | .hljs-built_in, 59 | .hljs-builtin-name { 60 | color: #ffa; 61 | } 62 | 63 | .hljs-number, 64 | .hljs-symbol, 65 | .hljs-bullet { 66 | color: #d36363; 67 | } 68 | 69 | .hljs-keyword, 70 | .hljs-selector-tag, 71 | .hljs-literal { 72 | color: #fcc28c; 73 | } 74 | 75 | .hljs-comment, 76 | .hljs-deletion, 77 | .hljs-code { 78 | color: #888; 79 | } 80 | 81 | .hljs-regexp, 82 | .hljs-link { 83 | color: #c6b4f0; 84 | } 85 | 86 | .hljs-meta { 87 | color: #fc9b9b; 88 | } 89 | 90 | .hljs-deletion { 91 | background-color: #fc9b9b; 92 | color: #333; 93 | } 94 | 95 | .hljs-addition { 96 | background-color: #a2fca2; 97 | color: #333; 98 | } 99 | 100 | .hljs a { 101 | color: inherit; 102 | } 103 | 104 | .hljs a:focus, 105 | .hljs a:hover { 106 | color: inherit; 107 | text-decoration: underline; 108 | } 109 | -------------------------------------------------------------------------------- /CodeReader/Themes/androidstudio.css: -------------------------------------------------------------------------------- 1 | /* 2 | Date: 24 Fev 2015 3 | Author: Pedro Oliveira 4 | */ 5 | 6 | .hljs { 7 | color: #a9b7c6; 8 | background: #282b2e; 9 | display: block; 10 | overflow-x: auto; 11 | padding: 0.5em; 12 | } 13 | 14 | .hljs-number, 15 | .hljs-literal, 16 | .hljs-symbol, 17 | .hljs-bullet { 18 | color: #6897BB; 19 | } 20 | 21 | .hljs-keyword, 22 | .hljs-selector-tag, 23 | .hljs-deletion { 24 | color: #cc7832; 25 | } 26 | 27 | .hljs-variable, 28 | .hljs-template-variable, 29 | .hljs-link { 30 | color: #629755; 31 | } 32 | 33 | .hljs-comment, 34 | .hljs-quote { 35 | color: #808080; 36 | } 37 | 38 | .hljs-meta { 39 | color: #bbb529; 40 | } 41 | 42 | .hljs-string, 43 | .hljs-attribute, 44 | .hljs-addition { 45 | color: #6A8759; 46 | } 47 | 48 | .hljs-section, 49 | .hljs-title, 50 | .hljs-type { 51 | color: #ffc66d; 52 | } 53 | 54 | .hljs-name, 55 | .hljs-selector-id, 56 | .hljs-selector-class { 57 | color: #e8bf6a; 58 | } 59 | 60 | .hljs-emphasis { 61 | font-style: italic; 62 | } 63 | 64 | .hljs-strong { 65 | font-weight: bold; 66 | } 67 | -------------------------------------------------------------------------------- /CodeReader/Themes/arduino-light.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Arduino® Light Theme - Stefania Mellai 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | background: #FFFFFF; 12 | } 13 | 14 | .hljs, 15 | .hljs-subst { 16 | color: #434f54; 17 | } 18 | 19 | .hljs-keyword, 20 | .hljs-attribute, 21 | .hljs-selector-tag, 22 | .hljs-doctag, 23 | .hljs-name { 24 | color: #00979D; 25 | } 26 | 27 | .hljs-built_in, 28 | .hljs-literal, 29 | .hljs-bullet, 30 | .hljs-code, 31 | .hljs-addition { 32 | color: #D35400; 33 | } 34 | 35 | .hljs-regexp, 36 | .hljs-symbol, 37 | .hljs-variable, 38 | .hljs-template-variable, 39 | .hljs-link, 40 | .hljs-selector-attr, 41 | .hljs-selector-pseudo { 42 | color: #00979D; 43 | } 44 | 45 | .hljs-type, 46 | .hljs-string, 47 | .hljs-selector-id, 48 | .hljs-selector-class, 49 | .hljs-quote, 50 | .hljs-template-tag, 51 | .hljs-deletion { 52 | color: #005C5F; 53 | } 54 | 55 | .hljs-title, 56 | .hljs-section { 57 | color: #880000; 58 | font-weight: bold; 59 | } 60 | 61 | .hljs-comment { 62 | color: rgba(149,165,166,.8); 63 | } 64 | 65 | .hljs-meta-keyword { 66 | color: #728E00; 67 | } 68 | 69 | .hljs-meta { 70 | color: #728E00; 71 | color: #434f54; 72 | } 73 | 74 | .hljs-emphasis { 75 | font-style: italic; 76 | } 77 | 78 | .hljs-strong { 79 | font-weight: bold; 80 | } 81 | 82 | .hljs-function { 83 | color: #728E00; 84 | } 85 | 86 | .hljs-number { 87 | color: #8A7B52; 88 | } 89 | -------------------------------------------------------------------------------- /CodeReader/Themes/arta.css: -------------------------------------------------------------------------------- 1 | /* 2 | Date: 17.V.2011 3 | Author: pumbur 4 | */ 5 | 6 | .hljs { 7 | display: block; 8 | overflow-x: auto; 9 | padding: 0.5em; 10 | background: #222; 11 | } 12 | 13 | .hljs, 14 | .hljs-subst { 15 | color: #aaa; 16 | } 17 | 18 | .hljs-section { 19 | color: #fff; 20 | } 21 | 22 | .hljs-comment, 23 | .hljs-quote, 24 | .hljs-meta { 25 | color: #444; 26 | } 27 | 28 | .hljs-string, 29 | .hljs-symbol, 30 | .hljs-bullet, 31 | .hljs-regexp { 32 | color: #ffcc33; 33 | } 34 | 35 | .hljs-number, 36 | .hljs-addition { 37 | color: #00cc66; 38 | } 39 | 40 | .hljs-built_in, 41 | .hljs-builtin-name, 42 | .hljs-literal, 43 | .hljs-type, 44 | .hljs-template-variable, 45 | .hljs-attribute, 46 | .hljs-link { 47 | color: #32aaee; 48 | } 49 | 50 | .hljs-keyword, 51 | .hljs-selector-tag, 52 | .hljs-name, 53 | .hljs-selector-id, 54 | .hljs-selector-class { 55 | color: #6644aa; 56 | } 57 | 58 | .hljs-title, 59 | .hljs-variable, 60 | .hljs-deletion, 61 | .hljs-template-tag { 62 | color: #bb1166; 63 | } 64 | 65 | .hljs-section, 66 | .hljs-doctag, 67 | .hljs-strong { 68 | font-weight: bold; 69 | } 70 | 71 | .hljs-emphasis { 72 | font-style: italic; 73 | } 74 | -------------------------------------------------------------------------------- /CodeReader/Themes/ascetic.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Original style from softwaremaniacs.org (c) Ivan Sagalaev 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | background: white; 12 | color: black; 13 | } 14 | 15 | .hljs-string, 16 | .hljs-variable, 17 | .hljs-template-variable, 18 | .hljs-symbol, 19 | .hljs-bullet, 20 | .hljs-section, 21 | .hljs-addition, 22 | .hljs-attribute, 23 | .hljs-link { 24 | color: #888; 25 | } 26 | 27 | .hljs-comment, 28 | .hljs-quote, 29 | .hljs-meta, 30 | .hljs-deletion { 31 | color: #ccc; 32 | } 33 | 34 | .hljs-keyword, 35 | .hljs-selector-tag, 36 | .hljs-section, 37 | .hljs-name, 38 | .hljs-type, 39 | .hljs-strong { 40 | font-weight: bold; 41 | } 42 | 43 | .hljs-emphasis { 44 | font-style: italic; 45 | } 46 | -------------------------------------------------------------------------------- /CodeReader/Themes/atelier-cave-dark.css: -------------------------------------------------------------------------------- 1 | /* Base16 Atelier Cave Dark - Theme */ 2 | /* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/cave) */ 3 | /* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ 4 | 5 | /* Atelier-Cave Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #7e7887; 9 | } 10 | 11 | /* Atelier-Cave Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-attribute, 15 | .hljs-regexp, 16 | .hljs-link, 17 | .hljs-tag, 18 | .hljs-name, 19 | .hljs-selector-id, 20 | .hljs-selector-class { 21 | color: #be4678; 22 | } 23 | 24 | /* Atelier-Cave Orange */ 25 | .hljs-number, 26 | .hljs-meta, 27 | .hljs-built_in, 28 | .hljs-builtin-name, 29 | .hljs-literal, 30 | .hljs-type, 31 | .hljs-params { 32 | color: #aa573c; 33 | } 34 | 35 | /* Atelier-Cave Green */ 36 | .hljs-string, 37 | .hljs-symbol, 38 | .hljs-bullet { 39 | color: #2a9292; 40 | } 41 | 42 | /* Atelier-Cave Blue */ 43 | .hljs-title, 44 | .hljs-section { 45 | color: #576ddb; 46 | } 47 | 48 | /* Atelier-Cave Purple */ 49 | .hljs-keyword, 50 | .hljs-selector-tag { 51 | color: #955ae7; 52 | } 53 | 54 | .hljs-deletion, 55 | .hljs-addition { 56 | color: #19171c; 57 | display: inline-block; 58 | width: 100%; 59 | } 60 | 61 | .hljs-deletion { 62 | background-color: #be4678; 63 | } 64 | 65 | .hljs-addition { 66 | background-color: #2a9292; 67 | } 68 | 69 | .hljs { 70 | display: block; 71 | overflow-x: auto; 72 | background: #19171c; 73 | color: #8b8792; 74 | padding: 0.5em; 75 | } 76 | 77 | .hljs-emphasis { 78 | font-style: italic; 79 | } 80 | 81 | .hljs-strong { 82 | font-weight: bold; 83 | } 84 | -------------------------------------------------------------------------------- /CodeReader/Themes/atelier-cave-light.css: -------------------------------------------------------------------------------- 1 | /* Base16 Atelier Cave Light - Theme */ 2 | /* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/cave) */ 3 | /* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ 4 | 5 | /* Atelier-Cave Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #655f6d; 9 | } 10 | 11 | /* Atelier-Cave Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-attribute, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-regexp, 18 | .hljs-link, 19 | .hljs-name, 20 | .hljs-name, 21 | .hljs-selector-id, 22 | .hljs-selector-class { 23 | color: #be4678; 24 | } 25 | 26 | /* Atelier-Cave Orange */ 27 | .hljs-number, 28 | .hljs-meta, 29 | .hljs-built_in, 30 | .hljs-builtin-name, 31 | .hljs-literal, 32 | .hljs-type, 33 | .hljs-params { 34 | color: #aa573c; 35 | } 36 | 37 | /* Atelier-Cave Green */ 38 | .hljs-string, 39 | .hljs-symbol, 40 | .hljs-bullet { 41 | color: #2a9292; 42 | } 43 | 44 | /* Atelier-Cave Blue */ 45 | .hljs-title, 46 | .hljs-section { 47 | color: #576ddb; 48 | } 49 | 50 | /* Atelier-Cave Purple */ 51 | .hljs-keyword, 52 | .hljs-selector-tag { 53 | color: #955ae7; 54 | } 55 | 56 | .hljs-deletion, 57 | .hljs-addition { 58 | color: #19171c; 59 | display: inline-block; 60 | width: 100%; 61 | } 62 | 63 | .hljs-deletion { 64 | background-color: #be4678; 65 | } 66 | 67 | .hljs-addition { 68 | background-color: #2a9292; 69 | } 70 | 71 | .hljs { 72 | display: block; 73 | overflow-x: auto; 74 | background: #efecf4; 75 | color: #585260; 76 | padding: 0.5em; 77 | } 78 | 79 | .hljs-emphasis { 80 | font-style: italic; 81 | } 82 | 83 | .hljs-strong { 84 | font-weight: bold; 85 | } 86 | -------------------------------------------------------------------------------- /CodeReader/Themes/atelier-dune-dark.css: -------------------------------------------------------------------------------- 1 | /* Base16 Atelier Dune Dark - Theme */ 2 | /* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) */ 3 | /* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ 4 | 5 | /* Atelier-Dune Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #999580; 9 | } 10 | 11 | /* Atelier-Dune Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-attribute, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-regexp, 18 | .hljs-link, 19 | .hljs-name, 20 | .hljs-selector-id, 21 | .hljs-selector-class { 22 | color: #d73737; 23 | } 24 | 25 | /* Atelier-Dune Orange */ 26 | .hljs-number, 27 | .hljs-meta, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params { 33 | color: #b65611; 34 | } 35 | 36 | /* Atelier-Dune Green */ 37 | .hljs-string, 38 | .hljs-symbol, 39 | .hljs-bullet { 40 | color: #60ac39; 41 | } 42 | 43 | /* Atelier-Dune Blue */ 44 | .hljs-title, 45 | .hljs-section { 46 | color: #6684e1; 47 | } 48 | 49 | /* Atelier-Dune Purple */ 50 | .hljs-keyword, 51 | .hljs-selector-tag { 52 | color: #b854d4; 53 | } 54 | 55 | .hljs { 56 | display: block; 57 | overflow-x: auto; 58 | background: #20201d; 59 | color: #a6a28c; 60 | padding: 0.5em; 61 | } 62 | 63 | .hljs-emphasis { 64 | font-style: italic; 65 | } 66 | 67 | .hljs-strong { 68 | font-weight: bold; 69 | } 70 | -------------------------------------------------------------------------------- /CodeReader/Themes/atelier-dune-light.css: -------------------------------------------------------------------------------- 1 | /* Base16 Atelier Dune Light - Theme */ 2 | /* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) */ 3 | /* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ 4 | 5 | /* Atelier-Dune Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #7d7a68; 9 | } 10 | 11 | /* Atelier-Dune Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-attribute, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-regexp, 18 | .hljs-link, 19 | .hljs-name, 20 | .hljs-selector-id, 21 | .hljs-selector-class { 22 | color: #d73737; 23 | } 24 | 25 | /* Atelier-Dune Orange */ 26 | .hljs-number, 27 | .hljs-meta, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params { 33 | color: #b65611; 34 | } 35 | 36 | /* Atelier-Dune Green */ 37 | .hljs-string, 38 | .hljs-symbol, 39 | .hljs-bullet { 40 | color: #60ac39; 41 | } 42 | 43 | /* Atelier-Dune Blue */ 44 | .hljs-title, 45 | .hljs-section { 46 | color: #6684e1; 47 | } 48 | 49 | /* Atelier-Dune Purple */ 50 | .hljs-keyword, 51 | .hljs-selector-tag { 52 | color: #b854d4; 53 | } 54 | 55 | .hljs { 56 | display: block; 57 | overflow-x: auto; 58 | background: #fefbec; 59 | color: #6e6b5e; 60 | padding: 0.5em; 61 | } 62 | 63 | .hljs-emphasis { 64 | font-style: italic; 65 | } 66 | 67 | .hljs-strong { 68 | font-weight: bold; 69 | } 70 | -------------------------------------------------------------------------------- /CodeReader/Themes/atelier-estuary-dark.css: -------------------------------------------------------------------------------- 1 | /* Base16 Atelier Estuary Dark - Theme */ 2 | /* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/estuary) */ 3 | /* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ 4 | 5 | /* Atelier-Estuary Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #878573; 9 | } 10 | 11 | /* Atelier-Estuary Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-attribute, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-regexp, 18 | .hljs-link, 19 | .hljs-name, 20 | .hljs-selector-id, 21 | .hljs-selector-class { 22 | color: #ba6236; 23 | } 24 | 25 | /* Atelier-Estuary Orange */ 26 | .hljs-number, 27 | .hljs-meta, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params { 33 | color: #ae7313; 34 | } 35 | 36 | /* Atelier-Estuary Green */ 37 | .hljs-string, 38 | .hljs-symbol, 39 | .hljs-bullet { 40 | color: #7d9726; 41 | } 42 | 43 | /* Atelier-Estuary Blue */ 44 | .hljs-title, 45 | .hljs-section { 46 | color: #36a166; 47 | } 48 | 49 | /* Atelier-Estuary Purple */ 50 | .hljs-keyword, 51 | .hljs-selector-tag { 52 | color: #5f9182; 53 | } 54 | 55 | .hljs-deletion, 56 | .hljs-addition { 57 | color: #22221b; 58 | display: inline-block; 59 | width: 100%; 60 | } 61 | 62 | .hljs-deletion { 63 | background-color: #ba6236; 64 | } 65 | 66 | .hljs-addition { 67 | background-color: #7d9726; 68 | } 69 | 70 | .hljs { 71 | display: block; 72 | overflow-x: auto; 73 | background: #22221b; 74 | color: #929181; 75 | padding: 0.5em; 76 | } 77 | 78 | .hljs-emphasis { 79 | font-style: italic; 80 | } 81 | 82 | .hljs-strong { 83 | font-weight: bold; 84 | } 85 | -------------------------------------------------------------------------------- /CodeReader/Themes/atelier-estuary-light.css: -------------------------------------------------------------------------------- 1 | /* Base16 Atelier Estuary Light - Theme */ 2 | /* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/estuary) */ 3 | /* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ 4 | 5 | /* Atelier-Estuary Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #6c6b5a; 9 | } 10 | 11 | /* Atelier-Estuary Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-attribute, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-regexp, 18 | .hljs-link, 19 | .hljs-name, 20 | .hljs-selector-id, 21 | .hljs-selector-class { 22 | color: #ba6236; 23 | } 24 | 25 | /* Atelier-Estuary Orange */ 26 | .hljs-number, 27 | .hljs-meta, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params { 33 | color: #ae7313; 34 | } 35 | 36 | /* Atelier-Estuary Green */ 37 | .hljs-string, 38 | .hljs-symbol, 39 | .hljs-bullet { 40 | color: #7d9726; 41 | } 42 | 43 | /* Atelier-Estuary Blue */ 44 | .hljs-title, 45 | .hljs-section { 46 | color: #36a166; 47 | } 48 | 49 | /* Atelier-Estuary Purple */ 50 | .hljs-keyword, 51 | .hljs-selector-tag { 52 | color: #5f9182; 53 | } 54 | 55 | .hljs-deletion, 56 | .hljs-addition { 57 | color: #22221b; 58 | display: inline-block; 59 | width: 100%; 60 | } 61 | 62 | .hljs-deletion { 63 | background-color: #ba6236; 64 | } 65 | 66 | .hljs-addition { 67 | background-color: #7d9726; 68 | } 69 | 70 | .hljs { 71 | display: block; 72 | overflow-x: auto; 73 | background: #f4f3ec; 74 | color: #5f5e4e; 75 | padding: 0.5em; 76 | } 77 | 78 | .hljs-emphasis { 79 | font-style: italic; 80 | } 81 | 82 | .hljs-strong { 83 | font-weight: bold; 84 | } 85 | -------------------------------------------------------------------------------- /CodeReader/Themes/atelier-forest-dark.css: -------------------------------------------------------------------------------- 1 | /* Base16 Atelier Forest Dark - Theme */ 2 | /* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/forest) */ 3 | /* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ 4 | 5 | /* Atelier-Forest Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #9c9491; 9 | } 10 | 11 | /* Atelier-Forest Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-attribute, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-regexp, 18 | .hljs-link, 19 | .hljs-name, 20 | .hljs-selector-id, 21 | .hljs-selector-class { 22 | color: #f22c40; 23 | } 24 | 25 | /* Atelier-Forest Orange */ 26 | .hljs-number, 27 | .hljs-meta, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params { 33 | color: #df5320; 34 | } 35 | 36 | /* Atelier-Forest Green */ 37 | .hljs-string, 38 | .hljs-symbol, 39 | .hljs-bullet { 40 | color: #7b9726; 41 | } 42 | 43 | /* Atelier-Forest Blue */ 44 | .hljs-title, 45 | .hljs-section { 46 | color: #407ee7; 47 | } 48 | 49 | /* Atelier-Forest Purple */ 50 | .hljs-keyword, 51 | .hljs-selector-tag { 52 | color: #6666ea; 53 | } 54 | 55 | .hljs { 56 | display: block; 57 | overflow-x: auto; 58 | background: #1b1918; 59 | color: #a8a19f; 60 | padding: 0.5em; 61 | } 62 | 63 | .hljs-emphasis { 64 | font-style: italic; 65 | } 66 | 67 | .hljs-strong { 68 | font-weight: bold; 69 | } 70 | -------------------------------------------------------------------------------- /CodeReader/Themes/atelier-forest-light.css: -------------------------------------------------------------------------------- 1 | /* Base16 Atelier Forest Light - Theme */ 2 | /* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/forest) */ 3 | /* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ 4 | 5 | /* Atelier-Forest Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #766e6b; 9 | } 10 | 11 | /* Atelier-Forest Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-attribute, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-regexp, 18 | .hljs-link, 19 | .hljs-name, 20 | .hljs-selector-id, 21 | .hljs-selector-class { 22 | color: #f22c40; 23 | } 24 | 25 | /* Atelier-Forest Orange */ 26 | .hljs-number, 27 | .hljs-meta, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params { 33 | color: #df5320; 34 | } 35 | 36 | /* Atelier-Forest Green */ 37 | .hljs-string, 38 | .hljs-symbol, 39 | .hljs-bullet { 40 | color: #7b9726; 41 | } 42 | 43 | /* Atelier-Forest Blue */ 44 | .hljs-title, 45 | .hljs-section { 46 | color: #407ee7; 47 | } 48 | 49 | /* Atelier-Forest Purple */ 50 | .hljs-keyword, 51 | .hljs-selector-tag { 52 | color: #6666ea; 53 | } 54 | 55 | .hljs { 56 | display: block; 57 | overflow-x: auto; 58 | background: #f1efee; 59 | color: #68615e; 60 | padding: 0.5em; 61 | } 62 | 63 | .hljs-emphasis { 64 | font-style: italic; 65 | } 66 | 67 | .hljs-strong { 68 | font-weight: bold; 69 | } 70 | -------------------------------------------------------------------------------- /CodeReader/Themes/atelier-heath-dark.css: -------------------------------------------------------------------------------- 1 | /* Base16 Atelier Heath Dark - Theme */ 2 | /* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/heath) */ 3 | /* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ 4 | 5 | /* Atelier-Heath Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #9e8f9e; 9 | } 10 | 11 | /* Atelier-Heath Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-attribute, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-regexp, 18 | .hljs-link, 19 | .hljs-name, 20 | .hljs-selector-id, 21 | .hljs-selector-class { 22 | color: #ca402b; 23 | } 24 | 25 | /* Atelier-Heath Orange */ 26 | .hljs-number, 27 | .hljs-meta, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params { 33 | color: #a65926; 34 | } 35 | 36 | /* Atelier-Heath Green */ 37 | .hljs-string, 38 | .hljs-symbol, 39 | .hljs-bullet { 40 | color: #918b3b; 41 | } 42 | 43 | /* Atelier-Heath Blue */ 44 | .hljs-title, 45 | .hljs-section { 46 | color: #516aec; 47 | } 48 | 49 | /* Atelier-Heath Purple */ 50 | .hljs-keyword, 51 | .hljs-selector-tag { 52 | color: #7b59c0; 53 | } 54 | 55 | .hljs { 56 | display: block; 57 | overflow-x: auto; 58 | background: #1b181b; 59 | color: #ab9bab; 60 | padding: 0.5em; 61 | } 62 | 63 | .hljs-emphasis { 64 | font-style: italic; 65 | } 66 | 67 | .hljs-strong { 68 | font-weight: bold; 69 | } 70 | -------------------------------------------------------------------------------- /CodeReader/Themes/atelier-heath-light.css: -------------------------------------------------------------------------------- 1 | /* Base16 Atelier Heath Light - Theme */ 2 | /* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/heath) */ 3 | /* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ 4 | 5 | /* Atelier-Heath Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #776977; 9 | } 10 | 11 | /* Atelier-Heath Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-attribute, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-regexp, 18 | .hljs-link, 19 | .hljs-name, 20 | .hljs-selector-id, 21 | .hljs-selector-class { 22 | color: #ca402b; 23 | } 24 | 25 | /* Atelier-Heath Orange */ 26 | .hljs-number, 27 | .hljs-meta, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params { 33 | color: #a65926; 34 | } 35 | 36 | /* Atelier-Heath Green */ 37 | .hljs-string, 38 | .hljs-symbol, 39 | .hljs-bullet { 40 | color: #918b3b; 41 | } 42 | 43 | /* Atelier-Heath Blue */ 44 | .hljs-title, 45 | .hljs-section { 46 | color: #516aec; 47 | } 48 | 49 | /* Atelier-Heath Purple */ 50 | .hljs-keyword, 51 | .hljs-selector-tag { 52 | color: #7b59c0; 53 | } 54 | 55 | .hljs { 56 | display: block; 57 | overflow-x: auto; 58 | background: #f7f3f7; 59 | color: #695d69; 60 | padding: 0.5em; 61 | } 62 | 63 | .hljs-emphasis { 64 | font-style: italic; 65 | } 66 | 67 | .hljs-strong { 68 | font-weight: bold; 69 | } 70 | -------------------------------------------------------------------------------- /CodeReader/Themes/atelier-lakeside-dark.css: -------------------------------------------------------------------------------- 1 | /* Base16 Atelier Lakeside Dark - Theme */ 2 | /* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/lakeside) */ 3 | /* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ 4 | 5 | /* Atelier-Lakeside Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #7195a8; 9 | } 10 | 11 | /* Atelier-Lakeside Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-attribute, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-regexp, 18 | .hljs-link, 19 | .hljs-name, 20 | .hljs-selector-id, 21 | .hljs-selector-class { 22 | color: #d22d72; 23 | } 24 | 25 | /* Atelier-Lakeside Orange */ 26 | .hljs-number, 27 | .hljs-meta, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params { 33 | color: #935c25; 34 | } 35 | 36 | /* Atelier-Lakeside Green */ 37 | .hljs-string, 38 | .hljs-symbol, 39 | .hljs-bullet { 40 | color: #568c3b; 41 | } 42 | 43 | /* Atelier-Lakeside Blue */ 44 | .hljs-title, 45 | .hljs-section { 46 | color: #257fad; 47 | } 48 | 49 | /* Atelier-Lakeside Purple */ 50 | .hljs-keyword, 51 | .hljs-selector-tag { 52 | color: #6b6bb8; 53 | } 54 | 55 | .hljs { 56 | display: block; 57 | overflow-x: auto; 58 | background: #161b1d; 59 | color: #7ea2b4; 60 | padding: 0.5em; 61 | } 62 | 63 | .hljs-emphasis { 64 | font-style: italic; 65 | } 66 | 67 | .hljs-strong { 68 | font-weight: bold; 69 | } 70 | -------------------------------------------------------------------------------- /CodeReader/Themes/atelier-lakeside-light.css: -------------------------------------------------------------------------------- 1 | /* Base16 Atelier Lakeside Light - Theme */ 2 | /* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/lakeside) */ 3 | /* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ 4 | 5 | /* Atelier-Lakeside Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #5a7b8c; 9 | } 10 | 11 | /* Atelier-Lakeside Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-attribute, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-regexp, 18 | .hljs-link, 19 | .hljs-name, 20 | .hljs-selector-id, 21 | .hljs-selector-class { 22 | color: #d22d72; 23 | } 24 | 25 | /* Atelier-Lakeside Orange */ 26 | .hljs-number, 27 | .hljs-meta, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params { 33 | color: #935c25; 34 | } 35 | 36 | /* Atelier-Lakeside Green */ 37 | .hljs-string, 38 | .hljs-symbol, 39 | .hljs-bullet { 40 | color: #568c3b; 41 | } 42 | 43 | /* Atelier-Lakeside Blue */ 44 | .hljs-title, 45 | .hljs-section { 46 | color: #257fad; 47 | } 48 | 49 | /* Atelier-Lakeside Purple */ 50 | .hljs-keyword, 51 | .hljs-selector-tag { 52 | color: #6b6bb8; 53 | } 54 | 55 | .hljs { 56 | display: block; 57 | overflow-x: auto; 58 | background: #ebf8ff; 59 | color: #516d7b; 60 | padding: 0.5em; 61 | } 62 | 63 | .hljs-emphasis { 64 | font-style: italic; 65 | } 66 | 67 | .hljs-strong { 68 | font-weight: bold; 69 | } 70 | -------------------------------------------------------------------------------- /CodeReader/Themes/atelier-plateau-dark.css: -------------------------------------------------------------------------------- 1 | /* Base16 Atelier Plateau Dark - Theme */ 2 | /* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/plateau) */ 3 | /* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ 4 | 5 | /* Atelier-Plateau Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #7e7777; 9 | } 10 | 11 | /* Atelier-Plateau Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-attribute, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-regexp, 18 | .hljs-link, 19 | .hljs-name, 20 | .hljs-selector-id, 21 | .hljs-selector-class { 22 | color: #ca4949; 23 | } 24 | 25 | /* Atelier-Plateau Orange */ 26 | .hljs-number, 27 | .hljs-meta, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params { 33 | color: #b45a3c; 34 | } 35 | 36 | /* Atelier-Plateau Green */ 37 | .hljs-string, 38 | .hljs-symbol, 39 | .hljs-bullet { 40 | color: #4b8b8b; 41 | } 42 | 43 | /* Atelier-Plateau Blue */ 44 | .hljs-title, 45 | .hljs-section { 46 | color: #7272ca; 47 | } 48 | 49 | /* Atelier-Plateau Purple */ 50 | .hljs-keyword, 51 | .hljs-selector-tag { 52 | color: #8464c4; 53 | } 54 | 55 | .hljs-deletion, 56 | .hljs-addition { 57 | color: #1b1818; 58 | display: inline-block; 59 | width: 100%; 60 | } 61 | 62 | .hljs-deletion { 63 | background-color: #ca4949; 64 | } 65 | 66 | .hljs-addition { 67 | background-color: #4b8b8b; 68 | } 69 | 70 | .hljs { 71 | display: block; 72 | overflow-x: auto; 73 | background: #1b1818; 74 | color: #8a8585; 75 | padding: 0.5em; 76 | } 77 | 78 | .hljs-emphasis { 79 | font-style: italic; 80 | } 81 | 82 | .hljs-strong { 83 | font-weight: bold; 84 | } 85 | -------------------------------------------------------------------------------- /CodeReader/Themes/atelier-plateau-light.css: -------------------------------------------------------------------------------- 1 | /* Base16 Atelier Plateau Light - Theme */ 2 | /* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/plateau) */ 3 | /* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ 4 | 5 | /* Atelier-Plateau Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #655d5d; 9 | } 10 | 11 | /* Atelier-Plateau Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-attribute, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-regexp, 18 | .hljs-link, 19 | .hljs-name, 20 | .hljs-selector-id, 21 | .hljs-selector-class { 22 | color: #ca4949; 23 | } 24 | 25 | /* Atelier-Plateau Orange */ 26 | .hljs-number, 27 | .hljs-meta, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params { 33 | color: #b45a3c; 34 | } 35 | 36 | /* Atelier-Plateau Green */ 37 | .hljs-string, 38 | .hljs-symbol, 39 | .hljs-bullet { 40 | color: #4b8b8b; 41 | } 42 | 43 | /* Atelier-Plateau Blue */ 44 | .hljs-title, 45 | .hljs-section { 46 | color: #7272ca; 47 | } 48 | 49 | /* Atelier-Plateau Purple */ 50 | .hljs-keyword, 51 | .hljs-selector-tag { 52 | color: #8464c4; 53 | } 54 | 55 | .hljs-deletion, 56 | .hljs-addition { 57 | color: #1b1818; 58 | display: inline-block; 59 | width: 100%; 60 | } 61 | 62 | .hljs-deletion { 63 | background-color: #ca4949; 64 | } 65 | 66 | .hljs-addition { 67 | background-color: #4b8b8b; 68 | } 69 | 70 | .hljs { 71 | display: block; 72 | overflow-x: auto; 73 | background: #f4ecec; 74 | color: #585050; 75 | padding: 0.5em; 76 | } 77 | 78 | .hljs-emphasis { 79 | font-style: italic; 80 | } 81 | 82 | .hljs-strong { 83 | font-weight: bold; 84 | } 85 | -------------------------------------------------------------------------------- /CodeReader/Themes/atelier-savanna-dark.css: -------------------------------------------------------------------------------- 1 | /* Base16 Atelier Savanna Dark - Theme */ 2 | /* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/savanna) */ 3 | /* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ 4 | 5 | /* Atelier-Savanna Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #78877d; 9 | } 10 | 11 | /* Atelier-Savanna Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-attribute, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-regexp, 18 | .hljs-link, 19 | .hljs-name, 20 | .hljs-selector-id, 21 | .hljs-selector-class { 22 | color: #b16139; 23 | } 24 | 25 | /* Atelier-Savanna Orange */ 26 | .hljs-number, 27 | .hljs-meta, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params { 33 | color: #9f713c; 34 | } 35 | 36 | /* Atelier-Savanna Green */ 37 | .hljs-string, 38 | .hljs-symbol, 39 | .hljs-bullet { 40 | color: #489963; 41 | } 42 | 43 | /* Atelier-Savanna Blue */ 44 | .hljs-title, 45 | .hljs-section { 46 | color: #478c90; 47 | } 48 | 49 | /* Atelier-Savanna Purple */ 50 | .hljs-keyword, 51 | .hljs-selector-tag { 52 | color: #55859b; 53 | } 54 | 55 | .hljs-deletion, 56 | .hljs-addition { 57 | color: #171c19; 58 | display: inline-block; 59 | width: 100%; 60 | } 61 | 62 | .hljs-deletion { 63 | background-color: #b16139; 64 | } 65 | 66 | .hljs-addition { 67 | background-color: #489963; 68 | } 69 | 70 | .hljs { 71 | display: block; 72 | overflow-x: auto; 73 | background: #171c19; 74 | color: #87928a; 75 | padding: 0.5em; 76 | } 77 | 78 | .hljs-emphasis { 79 | font-style: italic; 80 | } 81 | 82 | .hljs-strong { 83 | font-weight: bold; 84 | } 85 | -------------------------------------------------------------------------------- /CodeReader/Themes/atelier-savanna-light.css: -------------------------------------------------------------------------------- 1 | /* Base16 Atelier Savanna Light - Theme */ 2 | /* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/savanna) */ 3 | /* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ 4 | 5 | /* Atelier-Savanna Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #5f6d64; 9 | } 10 | 11 | /* Atelier-Savanna Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-attribute, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-regexp, 18 | .hljs-link, 19 | .hljs-name, 20 | .hljs-selector-id, 21 | .hljs-selector-class { 22 | color: #b16139; 23 | } 24 | 25 | /* Atelier-Savanna Orange */ 26 | .hljs-number, 27 | .hljs-meta, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params { 33 | color: #9f713c; 34 | } 35 | 36 | /* Atelier-Savanna Green */ 37 | .hljs-string, 38 | .hljs-symbol, 39 | .hljs-bullet { 40 | color: #489963; 41 | } 42 | 43 | /* Atelier-Savanna Blue */ 44 | .hljs-title, 45 | .hljs-section { 46 | color: #478c90; 47 | } 48 | 49 | /* Atelier-Savanna Purple */ 50 | .hljs-keyword, 51 | .hljs-selector-tag { 52 | color: #55859b; 53 | } 54 | 55 | .hljs-deletion, 56 | .hljs-addition { 57 | color: #171c19; 58 | display: inline-block; 59 | width: 100%; 60 | } 61 | 62 | .hljs-deletion { 63 | background-color: #b16139; 64 | } 65 | 66 | .hljs-addition { 67 | background-color: #489963; 68 | } 69 | 70 | .hljs { 71 | display: block; 72 | overflow-x: auto; 73 | background: #ecf4ee; 74 | color: #526057; 75 | padding: 0.5em; 76 | } 77 | 78 | .hljs-emphasis { 79 | font-style: italic; 80 | } 81 | 82 | .hljs-strong { 83 | font-weight: bold; 84 | } 85 | -------------------------------------------------------------------------------- /CodeReader/Themes/atelier-seaside-dark.css: -------------------------------------------------------------------------------- 1 | /* Base16 Atelier Seaside Dark - Theme */ 2 | /* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/seaside) */ 3 | /* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ 4 | 5 | /* Atelier-Seaside Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #809980; 9 | } 10 | 11 | /* Atelier-Seaside Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-attribute, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-regexp, 18 | .hljs-link, 19 | .hljs-name, 20 | .hljs-selector-id, 21 | .hljs-selector-class { 22 | color: #e6193c; 23 | } 24 | 25 | /* Atelier-Seaside Orange */ 26 | .hljs-number, 27 | .hljs-meta, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params { 33 | color: #87711d; 34 | } 35 | 36 | /* Atelier-Seaside Green */ 37 | .hljs-string, 38 | .hljs-symbol, 39 | .hljs-bullet { 40 | color: #29a329; 41 | } 42 | 43 | /* Atelier-Seaside Blue */ 44 | .hljs-title, 45 | .hljs-section { 46 | color: #3d62f5; 47 | } 48 | 49 | /* Atelier-Seaside Purple */ 50 | .hljs-keyword, 51 | .hljs-selector-tag { 52 | color: #ad2bee; 53 | } 54 | 55 | .hljs { 56 | display: block; 57 | overflow-x: auto; 58 | background: #131513; 59 | color: #8ca68c; 60 | padding: 0.5em; 61 | } 62 | 63 | .hljs-emphasis { 64 | font-style: italic; 65 | } 66 | 67 | .hljs-strong { 68 | font-weight: bold; 69 | } 70 | -------------------------------------------------------------------------------- /CodeReader/Themes/atelier-seaside-light.css: -------------------------------------------------------------------------------- 1 | /* Base16 Atelier Seaside Light - Theme */ 2 | /* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/seaside) */ 3 | /* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ 4 | 5 | /* Atelier-Seaside Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #687d68; 9 | } 10 | 11 | /* Atelier-Seaside Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-attribute, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-regexp, 18 | .hljs-link, 19 | .hljs-name, 20 | .hljs-selector-id, 21 | .hljs-selector-class { 22 | color: #e6193c; 23 | } 24 | 25 | /* Atelier-Seaside Orange */ 26 | .hljs-number, 27 | .hljs-meta, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params { 33 | color: #87711d; 34 | } 35 | 36 | /* Atelier-Seaside Green */ 37 | .hljs-string, 38 | .hljs-symbol, 39 | .hljs-bullet { 40 | color: #29a329; 41 | } 42 | 43 | /* Atelier-Seaside Blue */ 44 | .hljs-title, 45 | .hljs-section { 46 | color: #3d62f5; 47 | } 48 | 49 | /* Atelier-Seaside Purple */ 50 | .hljs-keyword, 51 | .hljs-selector-tag { 52 | color: #ad2bee; 53 | } 54 | 55 | .hljs { 56 | display: block; 57 | overflow-x: auto; 58 | background: #f4fbf4; 59 | color: #5e6e5e; 60 | padding: 0.5em; 61 | } 62 | 63 | .hljs-emphasis { 64 | font-style: italic; 65 | } 66 | 67 | .hljs-strong { 68 | font-weight: bold; 69 | } 70 | -------------------------------------------------------------------------------- /CodeReader/Themes/atelier-sulphurpool-dark.css: -------------------------------------------------------------------------------- 1 | /* Base16 Atelier Sulphurpool Dark - Theme */ 2 | /* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/sulphurpool) */ 3 | /* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ 4 | 5 | /* Atelier-Sulphurpool Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #898ea4; 9 | } 10 | 11 | /* Atelier-Sulphurpool Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-attribute, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-regexp, 18 | .hljs-link, 19 | .hljs-name, 20 | .hljs-selector-id, 21 | .hljs-selector-class { 22 | color: #c94922; 23 | } 24 | 25 | /* Atelier-Sulphurpool Orange */ 26 | .hljs-number, 27 | .hljs-meta, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params { 33 | color: #c76b29; 34 | } 35 | 36 | /* Atelier-Sulphurpool Green */ 37 | .hljs-string, 38 | .hljs-symbol, 39 | .hljs-bullet { 40 | color: #ac9739; 41 | } 42 | 43 | /* Atelier-Sulphurpool Blue */ 44 | .hljs-title, 45 | .hljs-section { 46 | color: #3d8fd1; 47 | } 48 | 49 | /* Atelier-Sulphurpool Purple */ 50 | .hljs-keyword, 51 | .hljs-selector-tag { 52 | color: #6679cc; 53 | } 54 | 55 | .hljs { 56 | display: block; 57 | overflow-x: auto; 58 | background: #202746; 59 | color: #979db4; 60 | padding: 0.5em; 61 | } 62 | 63 | .hljs-emphasis { 64 | font-style: italic; 65 | } 66 | 67 | .hljs-strong { 68 | font-weight: bold; 69 | } 70 | -------------------------------------------------------------------------------- /CodeReader/Themes/atelier-sulphurpool-light.css: -------------------------------------------------------------------------------- 1 | /* Base16 Atelier Sulphurpool Light - Theme */ 2 | /* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/sulphurpool) */ 3 | /* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ 4 | 5 | /* Atelier-Sulphurpool Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #6b7394; 9 | } 10 | 11 | /* Atelier-Sulphurpool Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-attribute, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-regexp, 18 | .hljs-link, 19 | .hljs-name, 20 | .hljs-selector-id, 21 | .hljs-selector-class { 22 | color: #c94922; 23 | } 24 | 25 | /* Atelier-Sulphurpool Orange */ 26 | .hljs-number, 27 | .hljs-meta, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params { 33 | color: #c76b29; 34 | } 35 | 36 | /* Atelier-Sulphurpool Green */ 37 | .hljs-string, 38 | .hljs-symbol, 39 | .hljs-bullet { 40 | color: #ac9739; 41 | } 42 | 43 | /* Atelier-Sulphurpool Blue */ 44 | .hljs-title, 45 | .hljs-section { 46 | color: #3d8fd1; 47 | } 48 | 49 | /* Atelier-Sulphurpool Purple */ 50 | .hljs-keyword, 51 | .hljs-selector-tag { 52 | color: #6679cc; 53 | } 54 | 55 | .hljs { 56 | display: block; 57 | overflow-x: auto; 58 | background: #f5f7ff; 59 | color: #5e6687; 60 | padding: 0.5em; 61 | } 62 | 63 | .hljs-emphasis { 64 | font-style: italic; 65 | } 66 | 67 | .hljs-strong { 68 | font-weight: bold; 69 | } 70 | -------------------------------------------------------------------------------- /CodeReader/Themes/brown-paper.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Brown Paper style from goldblog.com.ua (c) Zaripov Yura 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | background:#b7a68e url(./brown-papersq.png); 12 | } 13 | 14 | .hljs-keyword, 15 | .hljs-selector-tag, 16 | .hljs-literal { 17 | color:#005599; 18 | font-weight:bold; 19 | } 20 | 21 | .hljs, 22 | .hljs-subst { 23 | color: #363c69; 24 | } 25 | 26 | .hljs-string, 27 | .hljs-title, 28 | .hljs-section, 29 | .hljs-type, 30 | .hljs-attribute, 31 | .hljs-symbol, 32 | .hljs-bullet, 33 | .hljs-built_in, 34 | .hljs-addition, 35 | .hljs-variable, 36 | .hljs-template-tag, 37 | .hljs-template-variable, 38 | .hljs-link, 39 | .hljs-name { 40 | color: #2c009f; 41 | } 42 | 43 | .hljs-comment, 44 | .hljs-quote, 45 | .hljs-meta, 46 | .hljs-deletion { 47 | color: #802022; 48 | } 49 | 50 | .hljs-keyword, 51 | .hljs-selector-tag, 52 | .hljs-literal, 53 | .hljs-doctag, 54 | .hljs-title, 55 | .hljs-section, 56 | .hljs-type, 57 | .hljs-name, 58 | .hljs-strong { 59 | font-weight: bold; 60 | } 61 | 62 | .hljs-emphasis { 63 | font-style: italic; 64 | } 65 | -------------------------------------------------------------------------------- /CodeReader/Themes/brown-papersq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vulgur/Sources/5b99855d8cb09ac2e68f8ca617c8045130d9648b/CodeReader/Themes/brown-papersq.png -------------------------------------------------------------------------------- /CodeReader/Themes/codepen-embed.css: -------------------------------------------------------------------------------- 1 | /* 2 | codepen.io Embed Theme 3 | Author: Justin Perry 4 | Original theme - https://github.com/chriskempson/tomorrow-theme 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | background: #222; 12 | color: #fff; 13 | } 14 | 15 | .hljs-comment, 16 | .hljs-quote { 17 | color: #777; 18 | } 19 | 20 | .hljs-variable, 21 | .hljs-template-variable, 22 | .hljs-tag, 23 | .hljs-regexp, 24 | .hljs-meta, 25 | .hljs-number, 26 | .hljs-built_in, 27 | .hljs-builtin-name, 28 | .hljs-literal, 29 | .hljs-params, 30 | .hljs-symbol, 31 | .hljs-bullet, 32 | .hljs-link, 33 | .hljs-deletion { 34 | color: #ab875d; 35 | } 36 | 37 | .hljs-section, 38 | .hljs-title, 39 | .hljs-name, 40 | .hljs-selector-id, 41 | .hljs-selector-class, 42 | .hljs-type, 43 | .hljs-attribute { 44 | color: #9b869b; 45 | } 46 | 47 | .hljs-string, 48 | .hljs-keyword, 49 | .hljs-selector-tag, 50 | .hljs-addition { 51 | color: #8f9c6c; 52 | } 53 | 54 | .hljs-emphasis { 55 | font-style: italic; 56 | } 57 | 58 | .hljs-strong { 59 | font-weight: bold; 60 | } 61 | -------------------------------------------------------------------------------- /CodeReader/Themes/color-brewer.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Colorbrewer theme 4 | Original: https://github.com/mbostock/colorbrewer-theme (c) Mike Bostock 5 | Ported by Fabrício Tavares de Oliveira 6 | 7 | */ 8 | 9 | .hljs { 10 | display: block; 11 | overflow-x: auto; 12 | padding: 0.5em; 13 | background: #fff; 14 | } 15 | 16 | .hljs, 17 | .hljs-subst { 18 | color: #000; 19 | } 20 | 21 | .hljs-string, 22 | .hljs-meta, 23 | .hljs-symbol, 24 | .hljs-template-tag, 25 | .hljs-template-variable, 26 | .hljs-addition { 27 | color: #756bb1; 28 | } 29 | 30 | .hljs-comment, 31 | .hljs-quote { 32 | color: #636363; 33 | } 34 | 35 | .hljs-number, 36 | .hljs-regexp, 37 | .hljs-literal, 38 | .hljs-bullet, 39 | .hljs-link { 40 | color: #31a354; 41 | } 42 | 43 | .hljs-deletion, 44 | .hljs-variable { 45 | color: #88f; 46 | } 47 | 48 | 49 | 50 | .hljs-keyword, 51 | .hljs-selector-tag, 52 | .hljs-title, 53 | .hljs-section, 54 | .hljs-built_in, 55 | .hljs-doctag, 56 | .hljs-type, 57 | .hljs-tag, 58 | .hljs-name, 59 | .hljs-selector-id, 60 | .hljs-selector-class, 61 | .hljs-strong { 62 | color: #3182bd; 63 | } 64 | 65 | .hljs-emphasis { 66 | font-style: italic; 67 | } 68 | 69 | .hljs-attribute { 70 | color: #e6550d; 71 | } 72 | -------------------------------------------------------------------------------- /CodeReader/Themes/dark.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Dark style from softwaremaniacs.org (c) Ivan Sagalaev 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | background: #444; 12 | } 13 | 14 | .hljs-keyword, 15 | .hljs-selector-tag, 16 | .hljs-literal, 17 | .hljs-section, 18 | .hljs-link { 19 | color: white; 20 | } 21 | 22 | .hljs, 23 | .hljs-subst { 24 | color: #ddd; 25 | } 26 | 27 | .hljs-string, 28 | .hljs-title, 29 | .hljs-name, 30 | .hljs-type, 31 | .hljs-attribute, 32 | .hljs-symbol, 33 | .hljs-bullet, 34 | .hljs-built_in, 35 | .hljs-addition, 36 | .hljs-variable, 37 | .hljs-template-tag, 38 | .hljs-template-variable { 39 | color: #d88; 40 | } 41 | 42 | .hljs-comment, 43 | .hljs-quote, 44 | .hljs-deletion, 45 | .hljs-meta { 46 | color: #777; 47 | } 48 | 49 | .hljs-keyword, 50 | .hljs-selector-tag, 51 | .hljs-literal, 52 | .hljs-title, 53 | .hljs-section, 54 | .hljs-doctag, 55 | .hljs-type, 56 | .hljs-name, 57 | .hljs-strong { 58 | font-weight: bold; 59 | } 60 | 61 | .hljs-emphasis { 62 | font-style: italic; 63 | } 64 | -------------------------------------------------------------------------------- /CodeReader/Themes/darkula.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Darkula color scheme from the JetBrains family of IDEs 4 | 5 | */ 6 | 7 | 8 | .hljs { 9 | display: block; 10 | overflow-x: auto; 11 | padding: 0.5em; 12 | background: #2b2b2b; 13 | } 14 | 15 | .hljs { 16 | color: #bababa; 17 | } 18 | 19 | .hljs-strong, 20 | .hljs-emphasis { 21 | color: #a8a8a2; 22 | } 23 | 24 | .hljs-bullet, 25 | .hljs-quote, 26 | .hljs-link, 27 | .hljs-number, 28 | .hljs-regexp, 29 | .hljs-literal { 30 | color: #6896ba; 31 | } 32 | 33 | .hljs-code, 34 | .hljs-selector-class { 35 | color: #a6e22e; 36 | } 37 | 38 | .hljs-emphasis { 39 | font-style: italic; 40 | } 41 | 42 | .hljs-keyword, 43 | .hljs-selector-tag, 44 | .hljs-section, 45 | .hljs-attribute, 46 | .hljs-name, 47 | .hljs-variable { 48 | color: #cb7832; 49 | } 50 | 51 | .hljs-params { 52 | color: #b9b9b9; 53 | } 54 | 55 | .hljs-string, 56 | .hljs-subst, 57 | .hljs-type, 58 | .hljs-built_in, 59 | .hljs-builtin-name, 60 | .hljs-symbol, 61 | .hljs-selector-id, 62 | .hljs-selector-attr, 63 | .hljs-selector-pseudo, 64 | .hljs-template-tag, 65 | .hljs-template-variable, 66 | .hljs-addition { 67 | color: #e0c46c; 68 | } 69 | 70 | .hljs-comment, 71 | .hljs-deletion, 72 | .hljs-meta { 73 | color: #7f7f7f; 74 | } 75 | -------------------------------------------------------------------------------- /CodeReader/Themes/default.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Original highlight.js style (c) Ivan Sagalaev 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | background: #F0F0F0; 12 | } 13 | 14 | 15 | /* Base color: saturation 0; */ 16 | 17 | .hljs, 18 | .hljs-subst { 19 | color: #444; 20 | } 21 | 22 | .hljs-comment { 23 | color: #888888; 24 | } 25 | 26 | .hljs-keyword, 27 | .hljs-attribute, 28 | .hljs-selector-tag, 29 | .hljs-meta-keyword, 30 | .hljs-doctag, 31 | .hljs-name { 32 | font-weight: bold; 33 | } 34 | 35 | 36 | /* User color: hue: 0 */ 37 | 38 | .hljs-type, 39 | .hljs-string, 40 | .hljs-number, 41 | .hljs-selector-id, 42 | .hljs-selector-class, 43 | .hljs-quote, 44 | .hljs-template-tag, 45 | .hljs-deletion { 46 | color: #880000; 47 | } 48 | 49 | .hljs-title, 50 | .hljs-section { 51 | color: #880000; 52 | font-weight: bold; 53 | } 54 | 55 | .hljs-regexp, 56 | .hljs-symbol, 57 | .hljs-variable, 58 | .hljs-template-variable, 59 | .hljs-link, 60 | .hljs-selector-attr, 61 | .hljs-selector-pseudo { 62 | color: #BC6060; 63 | } 64 | 65 | 66 | /* Language color: hue: 90; */ 67 | 68 | .hljs-literal { 69 | color: #78A960; 70 | } 71 | 72 | .hljs-built_in, 73 | .hljs-bullet, 74 | .hljs-code, 75 | .hljs-addition { 76 | color: #397300; 77 | } 78 | 79 | 80 | /* Meta color: hue: 200 */ 81 | 82 | .hljs-meta { 83 | color: #1f7199; 84 | } 85 | 86 | .hljs-meta-string { 87 | color: #4d99bf; 88 | } 89 | 90 | 91 | /* Misc effects */ 92 | 93 | .hljs-emphasis { 94 | font-style: italic; 95 | } 96 | 97 | .hljs-strong { 98 | font-weight: bold; 99 | } 100 | -------------------------------------------------------------------------------- /CodeReader/Themes/docco.css: -------------------------------------------------------------------------------- 1 | /* 2 | Docco style used in http://jashkenas.github.com/docco/ converted by Simon Madine (@thingsinjars) 3 | */ 4 | 5 | .hljs { 6 | display: block; 7 | overflow-x: auto; 8 | padding: 0.5em; 9 | color: #000; 10 | background: #f8f8ff; 11 | } 12 | 13 | .hljs-comment, 14 | .hljs-quote { 15 | color: #408080; 16 | font-style: italic; 17 | } 18 | 19 | .hljs-keyword, 20 | .hljs-selector-tag, 21 | .hljs-literal, 22 | .hljs-subst { 23 | color: #954121; 24 | } 25 | 26 | .hljs-number { 27 | color: #40a070; 28 | } 29 | 30 | .hljs-string, 31 | .hljs-doctag { 32 | color: #219161; 33 | } 34 | 35 | .hljs-selector-id, 36 | .hljs-selector-class, 37 | .hljs-section, 38 | .hljs-type { 39 | color: #19469d; 40 | } 41 | 42 | .hljs-params { 43 | color: #00f; 44 | } 45 | 46 | .hljs-title { 47 | color: #458; 48 | font-weight: bold; 49 | } 50 | 51 | .hljs-tag, 52 | .hljs-name, 53 | .hljs-attribute { 54 | color: #000080; 55 | font-weight: normal; 56 | } 57 | 58 | .hljs-variable, 59 | .hljs-template-variable { 60 | color: #008080; 61 | } 62 | 63 | .hljs-regexp, 64 | .hljs-link { 65 | color: #b68; 66 | } 67 | 68 | .hljs-symbol, 69 | .hljs-bullet { 70 | color: #990073; 71 | } 72 | 73 | .hljs-built_in, 74 | .hljs-builtin-name { 75 | color: #0086b3; 76 | } 77 | 78 | .hljs-meta { 79 | color: #999; 80 | font-weight: bold; 81 | } 82 | 83 | .hljs-deletion { 84 | background: #fdd; 85 | } 86 | 87 | .hljs-addition { 88 | background: #dfd; 89 | } 90 | 91 | .hljs-emphasis { 92 | font-style: italic; 93 | } 94 | 95 | .hljs-strong { 96 | font-weight: bold; 97 | } 98 | -------------------------------------------------------------------------------- /CodeReader/Themes/dracula.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Dracula Theme v1.2.0 4 | 5 | https://github.com/zenorocha/dracula-theme 6 | 7 | Copyright 2015, All rights reserved 8 | 9 | Code licensed under the MIT license 10 | http://zenorocha.mit-license.org 11 | 12 | @author Éverton Ribeiro 13 | @author Zeno Rocha 14 | 15 | */ 16 | 17 | .hljs { 18 | display: block; 19 | overflow-x: auto; 20 | padding: 0.5em; 21 | background: #282a36; 22 | } 23 | 24 | .hljs-keyword, 25 | .hljs-selector-tag, 26 | .hljs-literal, 27 | .hljs-section, 28 | .hljs-link { 29 | color: #8be9fd; 30 | } 31 | 32 | .hljs-function .hljs-keyword { 33 | color: #ff79c6; 34 | } 35 | 36 | .hljs, 37 | .hljs-subst { 38 | color: #f8f8f2; 39 | } 40 | 41 | .hljs-string, 42 | .hljs-title, 43 | .hljs-name, 44 | .hljs-type, 45 | .hljs-attribute, 46 | .hljs-symbol, 47 | .hljs-bullet, 48 | .hljs-addition, 49 | .hljs-variable, 50 | .hljs-template-tag, 51 | .hljs-template-variable { 52 | color: #f1fa8c; 53 | } 54 | 55 | .hljs-comment, 56 | .hljs-quote, 57 | .hljs-deletion, 58 | .hljs-meta { 59 | color: #6272a4; 60 | } 61 | 62 | .hljs-keyword, 63 | .hljs-selector-tag, 64 | .hljs-literal, 65 | .hljs-title, 66 | .hljs-section, 67 | .hljs-doctag, 68 | .hljs-type, 69 | .hljs-name, 70 | .hljs-strong { 71 | font-weight: bold; 72 | } 73 | 74 | .hljs-emphasis { 75 | font-style: italic; 76 | } 77 | -------------------------------------------------------------------------------- /CodeReader/Themes/far.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | FAR Style (c) MajestiC 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | background: #000080; 12 | } 13 | 14 | .hljs, 15 | .hljs-subst { 16 | color: #0ff; 17 | } 18 | 19 | .hljs-string, 20 | .hljs-attribute, 21 | .hljs-symbol, 22 | .hljs-bullet, 23 | .hljs-built_in, 24 | .hljs-builtin-name, 25 | .hljs-template-tag, 26 | .hljs-template-variable, 27 | .hljs-addition { 28 | color: #ff0; 29 | } 30 | 31 | .hljs-keyword, 32 | .hljs-selector-tag, 33 | .hljs-section, 34 | .hljs-type, 35 | .hljs-name, 36 | .hljs-selector-id, 37 | .hljs-selector-class, 38 | .hljs-variable { 39 | color: #fff; 40 | } 41 | 42 | .hljs-comment, 43 | .hljs-quote, 44 | .hljs-doctag, 45 | .hljs-deletion { 46 | color: #888; 47 | } 48 | 49 | .hljs-number, 50 | .hljs-regexp, 51 | .hljs-literal, 52 | .hljs-link { 53 | color: #0f0; 54 | } 55 | 56 | .hljs-meta { 57 | color: #008080; 58 | } 59 | 60 | .hljs-keyword, 61 | .hljs-selector-tag, 62 | .hljs-title, 63 | .hljs-section, 64 | .hljs-name, 65 | .hljs-strong { 66 | font-weight: bold; 67 | } 68 | 69 | .hljs-emphasis { 70 | font-style: italic; 71 | } 72 | -------------------------------------------------------------------------------- /CodeReader/Themes/foundation.css: -------------------------------------------------------------------------------- 1 | /* 2 | Description: Foundation 4 docs style for highlight.js 3 | Author: Dan Allen 4 | Website: http://foundation.zurb.com/docs/ 5 | Version: 1.0 6 | Date: 2013-04-02 7 | */ 8 | 9 | .hljs { 10 | display: block; 11 | overflow-x: auto; 12 | padding: 0.5em; 13 | background: #eee; color: black; 14 | } 15 | 16 | .hljs-link, 17 | .hljs-emphasis, 18 | .hljs-attribute, 19 | .hljs-addition { 20 | color: #070; 21 | } 22 | 23 | .hljs-emphasis { 24 | font-style: italic; 25 | } 26 | 27 | .hljs-strong, 28 | .hljs-string, 29 | .hljs-deletion { 30 | color: #d14; 31 | } 32 | 33 | .hljs-strong { 34 | font-weight: bold; 35 | } 36 | 37 | .hljs-quote, 38 | .hljs-comment { 39 | color: #998; 40 | font-style: italic; 41 | } 42 | 43 | .hljs-section, 44 | .hljs-title { 45 | color: #900; 46 | } 47 | 48 | .hljs-class .hljs-title, 49 | .hljs-type { 50 | color: #458; 51 | } 52 | 53 | .hljs-variable, 54 | .hljs-template-variable { 55 | color: #336699; 56 | } 57 | 58 | .hljs-bullet { 59 | color: #997700; 60 | } 61 | 62 | .hljs-meta { 63 | color: #3344bb; 64 | } 65 | 66 | .hljs-code, 67 | .hljs-number, 68 | .hljs-literal, 69 | .hljs-keyword, 70 | .hljs-selector-tag { 71 | color: #099; 72 | } 73 | 74 | .hljs-regexp { 75 | background-color: #fff0ff; 76 | color: #880088; 77 | } 78 | 79 | .hljs-symbol { 80 | color: #990073; 81 | } 82 | 83 | .hljs-tag, 84 | .hljs-name, 85 | .hljs-selector-id, 86 | .hljs-selector-class { 87 | color: #007700; 88 | } 89 | -------------------------------------------------------------------------------- /CodeReader/Themes/github-gist.css: -------------------------------------------------------------------------------- 1 | /** 2 | * GitHub Gist Theme 3 | * Author : Louis Barranqueiro - https://github.com/LouisBarranqueiro 4 | */ 5 | 6 | .hljs { 7 | display: block; 8 | background: white; 9 | padding: 0.5em; 10 | color: #333333; 11 | overflow-x: auto; 12 | } 13 | 14 | .hljs-comment, 15 | .hljs-meta { 16 | color: #969896; 17 | } 18 | 19 | .hljs-string, 20 | .hljs-variable, 21 | .hljs-template-variable, 22 | .hljs-strong, 23 | .hljs-emphasis, 24 | .hljs-quote { 25 | color: #df5000; 26 | } 27 | 28 | .hljs-keyword, 29 | .hljs-selector-tag, 30 | .hljs-type { 31 | color: #a71d5d; 32 | } 33 | 34 | .hljs-literal, 35 | .hljs-symbol, 36 | .hljs-bullet, 37 | .hljs-attribute { 38 | color: #0086b3; 39 | } 40 | 41 | .hljs-section, 42 | .hljs-name { 43 | color: #63a35c; 44 | } 45 | 46 | .hljs-tag { 47 | color: #333333; 48 | } 49 | 50 | .hljs-title, 51 | .hljs-attr, 52 | .hljs-selector-id, 53 | .hljs-selector-class, 54 | .hljs-selector-attr, 55 | .hljs-selector-pseudo { 56 | color: #795da3; 57 | } 58 | 59 | .hljs-addition { 60 | color: #55a532; 61 | background-color: #eaffea; 62 | } 63 | 64 | .hljs-deletion { 65 | color: #bd2c00; 66 | background-color: #ffecec; 67 | } 68 | 69 | .hljs-link { 70 | text-decoration: underline; 71 | } 72 | -------------------------------------------------------------------------------- /CodeReader/Themes/github.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | github.com style (c) Vasily Polovnyov 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | color: #333; 12 | background: #f8f8f8; 13 | } 14 | 15 | .hljs-comment, 16 | .hljs-quote { 17 | color: #998; 18 | font-style: italic; 19 | } 20 | 21 | .hljs-keyword, 22 | .hljs-selector-tag, 23 | .hljs-subst { 24 | color: #333; 25 | font-weight: bold; 26 | } 27 | 28 | .hljs-number, 29 | .hljs-literal, 30 | .hljs-variable, 31 | .hljs-template-variable, 32 | .hljs-tag .hljs-attr { 33 | color: #008080; 34 | } 35 | 36 | .hljs-string, 37 | .hljs-doctag { 38 | color: #d14; 39 | } 40 | 41 | .hljs-title, 42 | .hljs-section, 43 | .hljs-selector-id { 44 | color: #900; 45 | font-weight: bold; 46 | } 47 | 48 | .hljs-subst { 49 | font-weight: normal; 50 | } 51 | 52 | .hljs-type, 53 | .hljs-class .hljs-title { 54 | color: #458; 55 | font-weight: bold; 56 | } 57 | 58 | .hljs-tag, 59 | .hljs-name, 60 | .hljs-attribute { 61 | color: #000080; 62 | font-weight: normal; 63 | } 64 | 65 | .hljs-regexp, 66 | .hljs-link { 67 | color: #009926; 68 | } 69 | 70 | .hljs-symbol, 71 | .hljs-bullet { 72 | color: #990073; 73 | } 74 | 75 | .hljs-built_in, 76 | .hljs-builtin-name { 77 | color: #0086b3; 78 | } 79 | 80 | .hljs-meta { 81 | color: #999; 82 | font-weight: bold; 83 | } 84 | 85 | .hljs-deletion { 86 | background: #fdd; 87 | } 88 | 89 | .hljs-addition { 90 | background: #dfd; 91 | } 92 | 93 | .hljs-emphasis { 94 | font-style: italic; 95 | } 96 | 97 | .hljs-strong { 98 | font-weight: bold; 99 | } 100 | -------------------------------------------------------------------------------- /CodeReader/Themes/googlecode.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Google Code style (c) Aahan Krish 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | background: white; 12 | color: black; 13 | } 14 | 15 | .hljs-comment, 16 | .hljs-quote { 17 | color: #800; 18 | } 19 | 20 | .hljs-keyword, 21 | .hljs-selector-tag, 22 | .hljs-section, 23 | .hljs-title, 24 | .hljs-name { 25 | color: #008; 26 | } 27 | 28 | .hljs-variable, 29 | .hljs-template-variable { 30 | color: #660; 31 | } 32 | 33 | .hljs-string, 34 | .hljs-selector-attr, 35 | .hljs-selector-pseudo, 36 | .hljs-regexp { 37 | color: #080; 38 | } 39 | 40 | .hljs-literal, 41 | .hljs-symbol, 42 | .hljs-bullet, 43 | .hljs-meta, 44 | .hljs-number, 45 | .hljs-link { 46 | color: #066; 47 | } 48 | 49 | .hljs-title, 50 | .hljs-doctag, 51 | .hljs-type, 52 | .hljs-attr, 53 | .hljs-built_in, 54 | .hljs-builtin-name, 55 | .hljs-params { 56 | color: #606; 57 | } 58 | 59 | .hljs-attribute, 60 | .hljs-subst { 61 | color: #000; 62 | } 63 | 64 | .hljs-formula { 65 | background-color: #eee; 66 | font-style: italic; 67 | } 68 | 69 | .hljs-selector-id, 70 | .hljs-selector-class { 71 | color: #9B703F 72 | } 73 | 74 | .hljs-addition { 75 | background-color: #baeeba; 76 | } 77 | 78 | .hljs-deletion { 79 | background-color: #ffc8bd; 80 | } 81 | 82 | .hljs-doctag, 83 | .hljs-strong { 84 | font-weight: bold; 85 | } 86 | 87 | .hljs-emphasis { 88 | font-style: italic; 89 | } 90 | -------------------------------------------------------------------------------- /CodeReader/Themes/grayscale.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | grayscale style (c) MY Sun 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | color: #333; 12 | background: #fff; 13 | } 14 | 15 | .hljs-comment, 16 | .hljs-quote { 17 | color: #777; 18 | font-style: italic; 19 | } 20 | 21 | .hljs-keyword, 22 | .hljs-selector-tag, 23 | .hljs-subst { 24 | color: #333; 25 | font-weight: bold; 26 | } 27 | 28 | .hljs-number, 29 | .hljs-literal { 30 | color: #777; 31 | } 32 | 33 | .hljs-string, 34 | .hljs-doctag, 35 | .hljs-formula { 36 | color: #333; 37 | background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAJ0lEQVQIW2O8e/fufwYGBgZBQUEQxcCIIfDu3Tuwivfv30NUoAsAALHpFMMLqZlPAAAAAElFTkSuQmCC) repeat; 38 | } 39 | 40 | .hljs-title, 41 | .hljs-section, 42 | .hljs-selector-id { 43 | color: #000; 44 | font-weight: bold; 45 | } 46 | 47 | .hljs-subst { 48 | font-weight: normal; 49 | } 50 | 51 | .hljs-class .hljs-title, 52 | .hljs-type, 53 | .hljs-name { 54 | color: #333; 55 | font-weight: bold; 56 | } 57 | 58 | .hljs-tag { 59 | color: #333; 60 | } 61 | 62 | .hljs-regexp { 63 | color: #333; 64 | background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAICAYAAADA+m62AAAAPUlEQVQYV2NkQAN37979r6yszIgujiIAU4RNMVwhuiQ6H6wQl3XI4oy4FMHcCJPHcDS6J2A2EqUQpJhohQDexSef15DBCwAAAABJRU5ErkJggg==) repeat; 65 | } 66 | 67 | .hljs-symbol, 68 | .hljs-bullet, 69 | .hljs-link { 70 | color: #000; 71 | background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAKElEQVQIW2NkQAO7d+/+z4gsBhJwdXVlhAvCBECKwIIwAbhKZBUwBQA6hBpm5efZsgAAAABJRU5ErkJggg==) repeat; 72 | } 73 | 74 | .hljs-built_in, 75 | .hljs-builtin-name { 76 | color: #000; 77 | text-decoration: underline; 78 | } 79 | 80 | .hljs-meta { 81 | color: #999; 82 | font-weight: bold; 83 | } 84 | 85 | .hljs-deletion { 86 | color: #fff; 87 | background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAADCAYAAABS3WWCAAAAE0lEQVQIW2MMDQ39zzhz5kwIAQAyxweWgUHd1AAAAABJRU5ErkJggg==) repeat; 88 | } 89 | 90 | .hljs-addition { 91 | color: #000; 92 | background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAALUlEQVQYV2N89+7dfwYk8P79ewZBQUFkIQZGOiu6e/cuiptQHAPl0NtNxAQBAM97Oejj3Dg7AAAAAElFTkSuQmCC) repeat; 93 | } 94 | 95 | .hljs-emphasis { 96 | font-style: italic; 97 | } 98 | 99 | .hljs-strong { 100 | font-weight: bold; 101 | } 102 | -------------------------------------------------------------------------------- /CodeReader/Themes/gruvbox-dark.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Gruvbox style (dark) (c) Pavel Pertsev (original style at https://github.com/morhetz/gruvbox) 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | background: #282828; 12 | } 13 | 14 | .hljs, 15 | .hljs-subst { 16 | color: #ebdbb2; 17 | } 18 | 19 | /* Gruvbox Red */ 20 | .hljs-deletion, 21 | .hljs-formula, 22 | .hljs-keyword, 23 | .hljs-link, 24 | .hljs-selector-tag { 25 | color: #fb4934; 26 | } 27 | 28 | /* Gruvbox Blue */ 29 | .hljs-built_in, 30 | .hljs-emphasis, 31 | .hljs-name, 32 | .hljs-quote, 33 | .hljs-strong, 34 | .hljs-title, 35 | .hljs-variable { 36 | color: #83a598; 37 | } 38 | 39 | /* Gruvbox Yellow */ 40 | .hljs-attr, 41 | .hljs-params, 42 | .hljs-template-tag, 43 | .hljs-type { 44 | color: #fabd2f; 45 | } 46 | 47 | /* Gruvbox Purple */ 48 | .hljs-builtin-name, 49 | .hljs-doctag, 50 | .hljs-literal, 51 | .hljs-number { 52 | color: #8f3f71; 53 | } 54 | 55 | /* Gruvbox Orange */ 56 | .hljs-code, 57 | .hljs-meta, 58 | .hljs-regexp, 59 | .hljs-selector-id, 60 | .hljs-template-variable { 61 | color: #fe8019; 62 | } 63 | 64 | /* Gruvbox Green */ 65 | .hljs-addition, 66 | .hljs-meta-string, 67 | .hljs-section, 68 | .hljs-selector-attr, 69 | .hljs-selector-class, 70 | .hljs-string, 71 | .hljs-symbol { 72 | color: #b8bb26; 73 | } 74 | 75 | /* Gruvbox Aqua */ 76 | .hljs-attribute, 77 | .hljs-bullet, 78 | .hljs-class, 79 | .hljs-function, 80 | .hljs-function .hljs-keyword, 81 | .hljs-meta-keyword, 82 | .hljs-selector-pseudo, 83 | .hljs-tag { 84 | color: #8ec07c; 85 | } 86 | 87 | /* Gruvbox Gray */ 88 | .hljs-comment { 89 | color: #928374; 90 | } 91 | 92 | /* Gruvbox Purple */ 93 | .hljs-link_label, 94 | .hljs-literal, 95 | .hljs-number { 96 | color: #d3869b; 97 | } 98 | 99 | .hljs-comment, 100 | .hljs-emphasis { 101 | font-style: italic; 102 | } 103 | 104 | .hljs-section, 105 | .hljs-strong, 106 | .hljs-tag { 107 | font-weight: bold; 108 | } 109 | -------------------------------------------------------------------------------- /CodeReader/Themes/gruvbox-light.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Gruvbox style (light) (c) Pavel Pertsev (original style at https://github.com/morhetz/gruvbox) 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | background: #fbf1c7; 12 | } 13 | 14 | .hljs, 15 | .hljs-subst { 16 | color: #3c3836; 17 | } 18 | 19 | /* Gruvbox Red */ 20 | .hljs-deletion, 21 | .hljs-formula, 22 | .hljs-keyword, 23 | .hljs-link, 24 | .hljs-selector-tag { 25 | color: #9d0006; 26 | } 27 | 28 | /* Gruvbox Blue */ 29 | .hljs-built_in, 30 | .hljs-emphasis, 31 | .hljs-name, 32 | .hljs-quote, 33 | .hljs-strong, 34 | .hljs-title, 35 | .hljs-variable { 36 | color: #076678; 37 | } 38 | 39 | /* Gruvbox Yellow */ 40 | .hljs-attr, 41 | .hljs-params, 42 | .hljs-template-tag, 43 | .hljs-type { 44 | color: #b57614; 45 | } 46 | 47 | /* Gruvbox Purple */ 48 | .hljs-builtin-name, 49 | .hljs-doctag, 50 | .hljs-literal, 51 | .hljs-number { 52 | color: #8f3f71; 53 | } 54 | 55 | /* Gruvbox Orange */ 56 | .hljs-code, 57 | .hljs-meta, 58 | .hljs-regexp, 59 | .hljs-selector-id, 60 | .hljs-template-variable { 61 | color: #af3a03; 62 | } 63 | 64 | /* Gruvbox Green */ 65 | .hljs-addition, 66 | .hljs-meta-string, 67 | .hljs-section, 68 | .hljs-selector-attr, 69 | .hljs-selector-class, 70 | .hljs-string, 71 | .hljs-symbol { 72 | color: #79740e; 73 | } 74 | 75 | /* Gruvbox Aqua */ 76 | .hljs-attribute, 77 | .hljs-bullet, 78 | .hljs-class, 79 | .hljs-function, 80 | .hljs-function .hljs-keyword, 81 | .hljs-meta-keyword, 82 | .hljs-selector-pseudo, 83 | .hljs-tag { 84 | color: #427b58; 85 | } 86 | 87 | /* Gruvbox Gray */ 88 | .hljs-comment { 89 | color: #928374; 90 | } 91 | 92 | /* Gruvbox Purple */ 93 | .hljs-link_label, 94 | .hljs-literal, 95 | .hljs-number { 96 | color: #8f3f71; 97 | } 98 | 99 | .hljs-comment, 100 | .hljs-emphasis { 101 | font-style: italic; 102 | } 103 | 104 | .hljs-section, 105 | .hljs-strong, 106 | .hljs-tag { 107 | font-weight: bold; 108 | } 109 | -------------------------------------------------------------------------------- /CodeReader/Themes/hopscotch.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Hopscotch 3 | * by Jan T. Sott 4 | * https://github.com/idleberg/Hopscotch 5 | * 6 | * This work is licensed under the Creative Commons CC0 1.0 Universal License 7 | */ 8 | 9 | /* Comment */ 10 | .hljs-comment, 11 | .hljs-quote { 12 | color: #989498; 13 | } 14 | 15 | /* Red */ 16 | .hljs-variable, 17 | .hljs-template-variable, 18 | .hljs-attribute, 19 | .hljs-tag, 20 | .hljs-name, 21 | .hljs-selector-id, 22 | .hljs-selector-class, 23 | .hljs-regexp, 24 | .hljs-link, 25 | .hljs-deletion { 26 | color: #dd464c; 27 | } 28 | 29 | /* Orange */ 30 | .hljs-number, 31 | .hljs-built_in, 32 | .hljs-builtin-name, 33 | .hljs-literal, 34 | .hljs-type, 35 | .hljs-params { 36 | color: #fd8b19; 37 | } 38 | 39 | /* Yellow */ 40 | .hljs-class .hljs-title { 41 | color: #fdcc59; 42 | } 43 | 44 | /* Green */ 45 | .hljs-string, 46 | .hljs-symbol, 47 | .hljs-bullet, 48 | .hljs-addition { 49 | color: #8fc13e; 50 | } 51 | 52 | /* Aqua */ 53 | .hljs-meta { 54 | color: #149b93; 55 | } 56 | 57 | /* Blue */ 58 | .hljs-function, 59 | .hljs-section, 60 | .hljs-title { 61 | color: #1290bf; 62 | } 63 | 64 | /* Purple */ 65 | .hljs-keyword, 66 | .hljs-selector-tag { 67 | color: #c85e7c; 68 | } 69 | 70 | .hljs { 71 | display: block; 72 | background: #322931; 73 | color: #b9b5b8; 74 | padding: 0.5em; 75 | } 76 | 77 | .hljs-emphasis { 78 | font-style: italic; 79 | } 80 | 81 | .hljs-strong { 82 | font-weight: bold; 83 | } 84 | -------------------------------------------------------------------------------- /CodeReader/Themes/hybrid.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | vim-hybrid theme by w0ng (https://github.com/w0ng/vim-hybrid) 4 | 5 | */ 6 | 7 | /*background color*/ 8 | .hljs { 9 | display: block; 10 | overflow-x: auto; 11 | padding: 0.5em; 12 | background: #1d1f21; 13 | } 14 | 15 | /*selection color*/ 16 | .hljs::selection, 17 | .hljs span::selection { 18 | background: #373b41; 19 | } 20 | 21 | .hljs::-moz-selection, 22 | .hljs span::-moz-selection { 23 | background: #373b41; 24 | } 25 | 26 | /*foreground color*/ 27 | .hljs { 28 | color: #c5c8c6; 29 | } 30 | 31 | /*color: fg_yellow*/ 32 | .hljs-title, 33 | .hljs-name { 34 | color: #f0c674; 35 | } 36 | 37 | /*color: fg_comment*/ 38 | .hljs-comment, 39 | .hljs-meta, 40 | .hljs-meta .hljs-keyword { 41 | color: #707880; 42 | } 43 | 44 | /*color: fg_red*/ 45 | .hljs-number, 46 | .hljs-symbol, 47 | .hljs-literal, 48 | .hljs-deletion, 49 | .hljs-link { 50 | color: #cc6666 51 | } 52 | 53 | /*color: fg_green*/ 54 | .hljs-string, 55 | .hljs-doctag, 56 | .hljs-addition, 57 | .hljs-regexp, 58 | .hljs-selector-attr, 59 | .hljs-selector-pseudo { 60 | color: #b5bd68; 61 | } 62 | 63 | /*color: fg_purple*/ 64 | .hljs-attribute, 65 | .hljs-code, 66 | .hljs-selector-id { 67 | color: #b294bb; 68 | } 69 | 70 | /*color: fg_blue*/ 71 | .hljs-keyword, 72 | .hljs-selector-tag, 73 | .hljs-bullet, 74 | .hljs-tag { 75 | color: #81a2be; 76 | } 77 | 78 | /*color: fg_aqua*/ 79 | .hljs-subst, 80 | .hljs-variable, 81 | .hljs-template-tag, 82 | .hljs-template-variable { 83 | color: #8abeb7; 84 | } 85 | 86 | /*color: fg_orange*/ 87 | .hljs-type, 88 | .hljs-built_in, 89 | .hljs-builtin-name, 90 | .hljs-quote, 91 | .hljs-section, 92 | .hljs-selector-class { 93 | color: #de935f; 94 | } 95 | 96 | .hljs-emphasis { 97 | font-style: italic; 98 | } 99 | 100 | .hljs-strong { 101 | font-weight: bold; 102 | } 103 | -------------------------------------------------------------------------------- /CodeReader/Themes/idea.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Intellij Idea-like styling (c) Vasily Polovnyov 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | color: #000; 12 | background: #fff; 13 | } 14 | 15 | .hljs-subst, 16 | .hljs-title { 17 | font-weight: normal; 18 | color: #000; 19 | } 20 | 21 | .hljs-comment, 22 | .hljs-quote { 23 | color: #808080; 24 | font-style: italic; 25 | } 26 | 27 | .hljs-meta { 28 | color: #808000; 29 | } 30 | 31 | .hljs-tag { 32 | background: #efefef; 33 | } 34 | 35 | .hljs-section, 36 | .hljs-name, 37 | .hljs-literal, 38 | .hljs-keyword, 39 | .hljs-selector-tag, 40 | .hljs-type, 41 | .hljs-selector-id, 42 | .hljs-selector-class { 43 | font-weight: bold; 44 | color: #000080; 45 | } 46 | 47 | .hljs-attribute, 48 | .hljs-number, 49 | .hljs-regexp, 50 | .hljs-link { 51 | font-weight: bold; 52 | color: #0000ff; 53 | } 54 | 55 | .hljs-number, 56 | .hljs-regexp, 57 | .hljs-link { 58 | font-weight: normal; 59 | } 60 | 61 | .hljs-string { 62 | color: #008000; 63 | font-weight: bold; 64 | } 65 | 66 | .hljs-symbol, 67 | .hljs-bullet, 68 | .hljs-formula { 69 | color: #000; 70 | background: #d0eded; 71 | font-style: italic; 72 | } 73 | 74 | .hljs-doctag { 75 | text-decoration: underline; 76 | } 77 | 78 | .hljs-variable, 79 | .hljs-template-variable { 80 | color: #660e7a; 81 | } 82 | 83 | .hljs-addition { 84 | background: #baeeba; 85 | } 86 | 87 | .hljs-deletion { 88 | background: #ffc8bd; 89 | } 90 | 91 | .hljs-emphasis { 92 | font-style: italic; 93 | } 94 | 95 | .hljs-strong { 96 | font-weight: bold; 97 | } 98 | -------------------------------------------------------------------------------- /CodeReader/Themes/ir-black.css: -------------------------------------------------------------------------------- 1 | /* 2 | IR_Black style (c) Vasily Mikhailitchenko 3 | */ 4 | 5 | .hljs { 6 | display: block; 7 | overflow-x: auto; 8 | padding: 0.5em; 9 | background: #000; 10 | color: #f8f8f8; 11 | } 12 | 13 | .hljs-comment, 14 | .hljs-quote, 15 | .hljs-meta { 16 | color: #7c7c7c; 17 | } 18 | 19 | .hljs-keyword, 20 | .hljs-selector-tag, 21 | .hljs-tag, 22 | .hljs-name { 23 | color: #96cbfe; 24 | } 25 | 26 | .hljs-attribute, 27 | .hljs-selector-id { 28 | color: #ffffb6; 29 | } 30 | 31 | .hljs-string, 32 | .hljs-selector-attr, 33 | .hljs-selector-pseudo, 34 | .hljs-addition { 35 | color: #a8ff60; 36 | } 37 | 38 | .hljs-subst { 39 | color: #daefa3; 40 | } 41 | 42 | .hljs-regexp, 43 | .hljs-link { 44 | color: #e9c062; 45 | } 46 | 47 | .hljs-title, 48 | .hljs-section, 49 | .hljs-type, 50 | .hljs-doctag { 51 | color: #ffffb6; 52 | } 53 | 54 | .hljs-symbol, 55 | .hljs-bullet, 56 | .hljs-variable, 57 | .hljs-template-variable, 58 | .hljs-literal { 59 | color: #c6c5fe; 60 | } 61 | 62 | .hljs-number, 63 | .hljs-deletion { 64 | color:#ff73fd; 65 | } 66 | 67 | .hljs-emphasis { 68 | font-style: italic; 69 | } 70 | 71 | .hljs-strong { 72 | font-weight: bold; 73 | } 74 | -------------------------------------------------------------------------------- /CodeReader/Themes/kimbie.dark.css: -------------------------------------------------------------------------------- 1 | /* 2 | Name: Kimbie (dark) 3 | Author: Jan T. Sott 4 | License: Creative Commons Attribution-ShareAlike 4.0 Unported License 5 | URL: https://github.com/idleberg/Kimbie-highlight.js 6 | */ 7 | 8 | /* Kimbie Comment */ 9 | .hljs-comment, 10 | .hljs-quote { 11 | color: #d6baad; 12 | } 13 | 14 | /* Kimbie Red */ 15 | .hljs-variable, 16 | .hljs-template-variable, 17 | .hljs-tag, 18 | .hljs-name, 19 | .hljs-selector-id, 20 | .hljs-selector-class, 21 | .hljs-regexp, 22 | .hljs-meta { 23 | color: #dc3958; 24 | } 25 | 26 | /* Kimbie Orange */ 27 | .hljs-number, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params, 33 | .hljs-deletion, 34 | .hljs-link { 35 | color: #f79a32; 36 | } 37 | 38 | /* Kimbie Yellow */ 39 | .hljs-title, 40 | .hljs-section, 41 | .hljs-attribute { 42 | color: #f06431; 43 | } 44 | 45 | /* Kimbie Green */ 46 | .hljs-string, 47 | .hljs-symbol, 48 | .hljs-bullet, 49 | .hljs-addition { 50 | color: #889b4a; 51 | } 52 | 53 | /* Kimbie Purple */ 54 | .hljs-keyword, 55 | .hljs-selector-tag, 56 | .hljs-function { 57 | color: #98676a; 58 | } 59 | 60 | .hljs { 61 | display: block; 62 | overflow-x: auto; 63 | background: #221a0f; 64 | color: #d3af86; 65 | padding: 0.5em; 66 | } 67 | 68 | .hljs-emphasis { 69 | font-style: italic; 70 | } 71 | 72 | .hljs-strong { 73 | font-weight: bold; 74 | } 75 | -------------------------------------------------------------------------------- /CodeReader/Themes/kimbie.light.css: -------------------------------------------------------------------------------- 1 | /* 2 | Name: Kimbie (light) 3 | Author: Jan T. Sott 4 | License: Creative Commons Attribution-ShareAlike 4.0 Unported License 5 | URL: https://github.com/idleberg/Kimbie-highlight.js 6 | */ 7 | 8 | /* Kimbie Comment */ 9 | .hljs-comment, 10 | .hljs-quote { 11 | color: #a57a4c; 12 | } 13 | 14 | /* Kimbie Red */ 15 | .hljs-variable, 16 | .hljs-template-variable, 17 | .hljs-tag, 18 | .hljs-name, 19 | .hljs-selector-id, 20 | .hljs-selector-class, 21 | .hljs-regexp, 22 | .hljs-meta { 23 | color: #dc3958; 24 | } 25 | 26 | /* Kimbie Orange */ 27 | .hljs-number, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params, 33 | .hljs-deletion, 34 | .hljs-link { 35 | color: #f79a32; 36 | } 37 | 38 | /* Kimbie Yellow */ 39 | .hljs-title, 40 | .hljs-section, 41 | .hljs-attribute { 42 | color: #f06431; 43 | } 44 | 45 | /* Kimbie Green */ 46 | .hljs-string, 47 | .hljs-symbol, 48 | .hljs-bullet, 49 | .hljs-addition { 50 | color: #889b4a; 51 | } 52 | 53 | /* Kimbie Purple */ 54 | .hljs-keyword, 55 | .hljs-selector-tag, 56 | .hljs-function { 57 | color: #98676a; 58 | } 59 | 60 | .hljs { 61 | display: block; 62 | overflow-x: auto; 63 | background: #fbebd4; 64 | color: #84613d; 65 | padding: 0.5em; 66 | } 67 | 68 | .hljs-emphasis { 69 | font-style: italic; 70 | } 71 | 72 | .hljs-strong { 73 | font-weight: bold; 74 | } 75 | -------------------------------------------------------------------------------- /CodeReader/Themes/magula.css: -------------------------------------------------------------------------------- 1 | /* 2 | Description: Magula style for highligh.js 3 | Author: Ruslan Keba 4 | Website: http://rukeba.com/ 5 | Version: 1.0 6 | Date: 2009-01-03 7 | Music: Aphex Twin / Xtal 8 | */ 9 | 10 | .hljs { 11 | display: block; 12 | overflow-x: auto; 13 | padding: 0.5em; 14 | background-color: #f4f4f4; 15 | } 16 | 17 | .hljs, 18 | .hljs-subst { 19 | color: black; 20 | } 21 | 22 | .hljs-string, 23 | .hljs-title, 24 | .hljs-symbol, 25 | .hljs-bullet, 26 | .hljs-attribute, 27 | .hljs-addition, 28 | .hljs-variable, 29 | .hljs-template-tag, 30 | .hljs-template-variable { 31 | color: #050; 32 | } 33 | 34 | .hljs-comment, 35 | .hljs-quote { 36 | color: #777; 37 | } 38 | 39 | .hljs-number, 40 | .hljs-regexp, 41 | .hljs-literal, 42 | .hljs-type, 43 | .hljs-link { 44 | color: #800; 45 | } 46 | 47 | .hljs-deletion, 48 | .hljs-meta { 49 | color: #00e; 50 | } 51 | 52 | .hljs-keyword, 53 | .hljs-selector-tag, 54 | .hljs-doctag, 55 | .hljs-title, 56 | .hljs-section, 57 | .hljs-built_in, 58 | .hljs-tag, 59 | .hljs-name { 60 | font-weight: bold; 61 | color: navy; 62 | } 63 | 64 | .hljs-emphasis { 65 | font-style: italic; 66 | } 67 | 68 | .hljs-strong { 69 | font-weight: bold; 70 | } 71 | -------------------------------------------------------------------------------- /CodeReader/Themes/mono-blue.css: -------------------------------------------------------------------------------- 1 | /* 2 | Five-color theme from a single blue hue. 3 | */ 4 | .hljs { 5 | display: block; 6 | overflow-x: auto; 7 | padding: 0.5em; 8 | background: #eaeef3; 9 | } 10 | 11 | .hljs { 12 | color: #00193a; 13 | } 14 | 15 | .hljs-keyword, 16 | .hljs-selector-tag, 17 | .hljs-title, 18 | .hljs-section, 19 | .hljs-doctag, 20 | .hljs-name, 21 | .hljs-strong { 22 | font-weight: bold; 23 | } 24 | 25 | .hljs-comment { 26 | color: #738191; 27 | } 28 | 29 | .hljs-string, 30 | .hljs-title, 31 | .hljs-section, 32 | .hljs-built_in, 33 | .hljs-literal, 34 | .hljs-type, 35 | .hljs-addition, 36 | .hljs-tag, 37 | .hljs-quote, 38 | .hljs-name, 39 | .hljs-selector-id, 40 | .hljs-selector-class { 41 | color: #0048ab; 42 | } 43 | 44 | .hljs-meta, 45 | .hljs-subst, 46 | .hljs-symbol, 47 | .hljs-regexp, 48 | .hljs-attribute, 49 | .hljs-deletion, 50 | .hljs-variable, 51 | .hljs-template-variable, 52 | .hljs-link, 53 | .hljs-bullet { 54 | color: #4c81c9; 55 | } 56 | 57 | .hljs-emphasis { 58 | font-style: italic; 59 | } 60 | -------------------------------------------------------------------------------- /CodeReader/Themes/monokai-sublime.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Monokai Sublime style. Derived from Monokai by noformnocontent http://nn.mit-license.org/ 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | background: #23241f; 12 | } 13 | 14 | .hljs, 15 | .hljs-tag, 16 | .hljs-subst { 17 | color: #f8f8f2; 18 | } 19 | 20 | .hljs-strong, 21 | .hljs-emphasis { 22 | color: #a8a8a2; 23 | } 24 | 25 | .hljs-bullet, 26 | .hljs-quote, 27 | .hljs-number, 28 | .hljs-regexp, 29 | .hljs-literal, 30 | .hljs-link { 31 | color: #ae81ff; 32 | } 33 | 34 | .hljs-code, 35 | .hljs-title, 36 | .hljs-section, 37 | .hljs-selector-class { 38 | color: #a6e22e; 39 | } 40 | 41 | .hljs-strong { 42 | font-weight: bold; 43 | } 44 | 45 | .hljs-emphasis { 46 | font-style: italic; 47 | } 48 | 49 | .hljs-keyword, 50 | .hljs-selector-tag, 51 | .hljs-name, 52 | .hljs-attr { 53 | color: #f92672; 54 | } 55 | 56 | .hljs-symbol, 57 | .hljs-attribute { 58 | color: #66d9ef; 59 | } 60 | 61 | .hljs-params, 62 | .hljs-class .hljs-title { 63 | color: #f8f8f2; 64 | } 65 | 66 | .hljs-string, 67 | .hljs-type, 68 | .hljs-built_in, 69 | .hljs-builtin-name, 70 | .hljs-selector-id, 71 | .hljs-selector-attr, 72 | .hljs-selector-pseudo, 73 | .hljs-addition, 74 | .hljs-variable, 75 | .hljs-template-variable { 76 | color: #e6db74; 77 | } 78 | 79 | .hljs-comment, 80 | .hljs-deletion, 81 | .hljs-meta { 82 | color: #75715e; 83 | } 84 | -------------------------------------------------------------------------------- /CodeReader/Themes/monokai.css: -------------------------------------------------------------------------------- 1 | /* 2 | Monokai style - ported by Luigi Maselli - http://grigio.org 3 | */ 4 | 5 | .hljs { 6 | display: block; 7 | overflow-x: auto; 8 | padding: 0.5em; 9 | background: #272822; color: #ddd; 10 | } 11 | 12 | .hljs-tag, 13 | .hljs-keyword, 14 | .hljs-selector-tag, 15 | .hljs-literal, 16 | .hljs-strong, 17 | .hljs-name { 18 | color: #f92672; 19 | } 20 | 21 | .hljs-code { 22 | color: #66d9ef; 23 | } 24 | 25 | .hljs-class .hljs-title { 26 | color: white; 27 | } 28 | 29 | .hljs-attribute, 30 | .hljs-symbol, 31 | .hljs-regexp, 32 | .hljs-link { 33 | color: #bf79db; 34 | } 35 | 36 | .hljs-string, 37 | .hljs-bullet, 38 | .hljs-subst, 39 | .hljs-title, 40 | .hljs-section, 41 | .hljs-emphasis, 42 | .hljs-type, 43 | .hljs-built_in, 44 | .hljs-builtin-name, 45 | .hljs-selector-attr, 46 | .hljs-selector-pseudo, 47 | .hljs-addition, 48 | .hljs-variable, 49 | .hljs-template-tag, 50 | .hljs-template-variable { 51 | color: #a6e22e; 52 | } 53 | 54 | .hljs-comment, 55 | .hljs-quote, 56 | .hljs-deletion, 57 | .hljs-meta { 58 | color: #75715e; 59 | } 60 | 61 | .hljs-keyword, 62 | .hljs-selector-tag, 63 | .hljs-literal, 64 | .hljs-doctag, 65 | .hljs-title, 66 | .hljs-section, 67 | .hljs-type, 68 | .hljs-selector-id { 69 | font-weight: bold; 70 | } 71 | -------------------------------------------------------------------------------- /CodeReader/Themes/obsidian.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Obsidian style 3 | * ported by Alexander Marenin (http://github.com/ioncreature) 4 | */ 5 | 6 | .hljs { 7 | display: block; 8 | overflow-x: auto; 9 | padding: 0.5em; 10 | background: #282b2e; 11 | } 12 | 13 | .hljs-keyword, 14 | .hljs-selector-tag, 15 | .hljs-literal, 16 | .hljs-selector-id { 17 | color: #93c763; 18 | } 19 | 20 | .hljs-number { 21 | color: #ffcd22; 22 | } 23 | 24 | .hljs { 25 | color: #e0e2e4; 26 | } 27 | 28 | .hljs-attribute { 29 | color: #668bb0; 30 | } 31 | 32 | .hljs-code, 33 | .hljs-class .hljs-title, 34 | .hljs-section { 35 | color: white; 36 | } 37 | 38 | .hljs-regexp, 39 | .hljs-link { 40 | color: #d39745; 41 | } 42 | 43 | .hljs-meta { 44 | color: #557182; 45 | } 46 | 47 | .hljs-tag, 48 | .hljs-name, 49 | .hljs-bullet, 50 | .hljs-subst, 51 | .hljs-emphasis, 52 | .hljs-type, 53 | .hljs-built_in, 54 | .hljs-selector-attr, 55 | .hljs-selector-pseudo, 56 | .hljs-addition, 57 | .hljs-variable, 58 | .hljs-template-tag, 59 | .hljs-template-variable { 60 | color: #8cbbad; 61 | } 62 | 63 | .hljs-string, 64 | .hljs-symbol { 65 | color: #ec7600; 66 | } 67 | 68 | .hljs-comment, 69 | .hljs-quote, 70 | .hljs-deletion { 71 | color: #818e96; 72 | } 73 | 74 | .hljs-selector-class { 75 | color: #A082BD 76 | } 77 | 78 | .hljs-keyword, 79 | .hljs-selector-tag, 80 | .hljs-literal, 81 | .hljs-doctag, 82 | .hljs-title, 83 | .hljs-section, 84 | .hljs-type, 85 | .hljs-name, 86 | .hljs-strong { 87 | font-weight: bold; 88 | } 89 | -------------------------------------------------------------------------------- /CodeReader/Themes/paraiso-dark.css: -------------------------------------------------------------------------------- 1 | /* 2 | Paraíso (dark) 3 | Created by Jan T. Sott (http://github.com/idleberg) 4 | Inspired by the art of Rubens LP (http://www.rubenslp.com.br) 5 | */ 6 | 7 | /* Paraíso Comment */ 8 | .hljs-comment, 9 | .hljs-quote { 10 | color: #8d8687; 11 | } 12 | 13 | /* Paraíso Red */ 14 | .hljs-variable, 15 | .hljs-template-variable, 16 | .hljs-tag, 17 | .hljs-name, 18 | .hljs-selector-id, 19 | .hljs-selector-class, 20 | .hljs-regexp, 21 | .hljs-link, 22 | .hljs-meta { 23 | color: #ef6155; 24 | } 25 | 26 | /* Paraíso Orange */ 27 | .hljs-number, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params, 33 | .hljs-deletion { 34 | color: #f99b15; 35 | } 36 | 37 | /* Paraíso Yellow */ 38 | .hljs-title, 39 | .hljs-section, 40 | .hljs-attribute { 41 | color: #fec418; 42 | } 43 | 44 | /* Paraíso Green */ 45 | .hljs-string, 46 | .hljs-symbol, 47 | .hljs-bullet, 48 | .hljs-addition { 49 | color: #48b685; 50 | } 51 | 52 | /* Paraíso Purple */ 53 | .hljs-keyword, 54 | .hljs-selector-tag { 55 | color: #815ba4; 56 | } 57 | 58 | .hljs { 59 | display: block; 60 | overflow-x: auto; 61 | background: #2f1e2e; 62 | color: #a39e9b; 63 | padding: 0.5em; 64 | } 65 | 66 | .hljs-emphasis { 67 | font-style: italic; 68 | } 69 | 70 | .hljs-strong { 71 | font-weight: bold; 72 | } 73 | -------------------------------------------------------------------------------- /CodeReader/Themes/paraiso-light.css: -------------------------------------------------------------------------------- 1 | /* 2 | Paraíso (light) 3 | Created by Jan T. Sott (http://github.com/idleberg) 4 | Inspired by the art of Rubens LP (http://www.rubenslp.com.br) 5 | */ 6 | 7 | /* Paraíso Comment */ 8 | .hljs-comment, 9 | .hljs-quote { 10 | color: #776e71; 11 | } 12 | 13 | /* Paraíso Red */ 14 | .hljs-variable, 15 | .hljs-template-variable, 16 | .hljs-tag, 17 | .hljs-name, 18 | .hljs-selector-id, 19 | .hljs-selector-class, 20 | .hljs-regexp, 21 | .hljs-link, 22 | .hljs-meta { 23 | color: #ef6155; 24 | } 25 | 26 | /* Paraíso Orange */ 27 | .hljs-number, 28 | .hljs-built_in, 29 | .hljs-builtin-name, 30 | .hljs-literal, 31 | .hljs-type, 32 | .hljs-params, 33 | .hljs-deletion { 34 | color: #f99b15; 35 | } 36 | 37 | /* Paraíso Yellow */ 38 | .hljs-title, 39 | .hljs-section, 40 | .hljs-attribute { 41 | color: #fec418; 42 | } 43 | 44 | /* Paraíso Green */ 45 | .hljs-string, 46 | .hljs-symbol, 47 | .hljs-bullet, 48 | .hljs-addition { 49 | color: #48b685; 50 | } 51 | 52 | /* Paraíso Purple */ 53 | .hljs-keyword, 54 | .hljs-selector-tag { 55 | color: #815ba4; 56 | } 57 | 58 | .hljs { 59 | display: block; 60 | overflow-x: auto; 61 | background: #e7e9db; 62 | color: #4f424c; 63 | padding: 0.5em; 64 | } 65 | 66 | .hljs-emphasis { 67 | font-style: italic; 68 | } 69 | 70 | .hljs-strong { 71 | font-weight: bold; 72 | } 73 | -------------------------------------------------------------------------------- /CodeReader/Themes/pojoaque.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Pojoaque Style by Jason Tate 4 | http://web-cms-designs.com/ftopict-10-pojoaque-style-for-highlight-js-code-highlighter.html 5 | Based on Solarized Style from http://ethanschoonover.com/solarized 6 | 7 | */ 8 | 9 | .hljs { 10 | display: block; 11 | overflow-x: auto; 12 | padding: 0.5em; 13 | color: #dccf8f; 14 | background: url(./pojoaque.jpg) repeat scroll left top #181914; 15 | } 16 | 17 | .hljs-comment, 18 | .hljs-quote { 19 | color: #586e75; 20 | font-style: italic; 21 | } 22 | 23 | .hljs-keyword, 24 | .hljs-selector-tag, 25 | .hljs-literal, 26 | .hljs-addition { 27 | color: #b64926; 28 | } 29 | 30 | .hljs-number, 31 | .hljs-string, 32 | .hljs-doctag, 33 | .hljs-regexp { 34 | color: #468966; 35 | } 36 | 37 | .hljs-title, 38 | .hljs-section, 39 | .hljs-built_in, 40 | .hljs-name { 41 | color: #ffb03b; 42 | } 43 | 44 | .hljs-variable, 45 | .hljs-template-variable, 46 | .hljs-class .hljs-title, 47 | .hljs-type, 48 | .hljs-tag { 49 | color: #b58900; 50 | } 51 | 52 | .hljs-attribute { 53 | color: #b89859; 54 | } 55 | 56 | .hljs-symbol, 57 | .hljs-bullet, 58 | .hljs-link, 59 | .hljs-subst, 60 | .hljs-meta { 61 | color: #cb4b16; 62 | } 63 | 64 | .hljs-deletion { 65 | color: #dc322f; 66 | } 67 | 68 | .hljs-selector-id, 69 | .hljs-selector-class { 70 | color: #d3a60c; 71 | } 72 | 73 | .hljs-formula { 74 | background: #073642; 75 | } 76 | 77 | .hljs-emphasis { 78 | font-style: italic; 79 | } 80 | 81 | .hljs-strong { 82 | font-weight: bold; 83 | } 84 | -------------------------------------------------------------------------------- /CodeReader/Themes/pojoaque.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vulgur/Sources/5b99855d8cb09ac2e68f8ca617c8045130d9648b/CodeReader/Themes/pojoaque.jpg -------------------------------------------------------------------------------- /CodeReader/Themes/purebasic.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | PureBASIC native IDE style ( version 1.0 - April 2016 ) 4 | 5 | by Tristano Ajmone 6 | 7 | Public Domain 8 | 9 | NOTE_1: PureBASIC code syntax highlighting only applies the following classes: 10 | .hljs-comment 11 | .hljs-function 12 | .hljs-keywords 13 | .hljs-string 14 | .hljs-symbol 15 | 16 | Other classes are added here for the benefit of styling other languages with the look and feel of PureBASIC native IDE style. 17 | If you need to customize a stylesheet for PureBASIC only, remove all non-relevant classes -- PureBASIC-related classes are followed by 18 | a "--- used for PureBASIC ... ---" comment on same line. 19 | 20 | NOTE_2: Color names provided in comments were derived using "Name that Color" online tool: 21 | http://chir.ag/projects/name-that-color 22 | */ 23 | 24 | .hljs { /* Common set of rules required by highlight.js (don'r remove!) */ 25 | display: block; 26 | overflow-x: auto; 27 | padding: 0.5em; 28 | background: #FFFFDF; /* Half and Half (approx.) */ 29 | /* --- Uncomment to add PureBASIC native IDE styled font! 30 | font-family: Consolas; 31 | */ 32 | } 33 | 34 | .hljs, /* --- used for PureBASIC base color --- */ 35 | .hljs-type, /* --- used for PureBASIC Procedures return type --- */ 36 | .hljs-function, /* --- used for wrapping PureBASIC Procedures definitions --- */ 37 | .hljs-name, 38 | .hljs-number, 39 | .hljs-attr, 40 | .hljs-params, 41 | .hljs-subst { 42 | color: #000000; /* Black */ 43 | } 44 | 45 | .hljs-comment, /* --- used for PureBASIC Comments --- */ 46 | .hljs-regexp, 47 | .hljs-section, 48 | .hljs-selector-pseudo, 49 | .hljs-addition { 50 | color: #00AAAA; /* Persian Green (approx.) */ 51 | } 52 | 53 | .hljs-title, /* --- used for PureBASIC Procedures Names --- */ 54 | .hljs-tag, 55 | .hljs-variable, 56 | .hljs-code { 57 | color: #006666; /* Blue Stone (approx.) */ 58 | } 59 | 60 | .hljs-keyword, /* --- used for PureBASIC Keywords --- */ 61 | .hljs-class, 62 | .hljs-meta-keyword, 63 | .hljs-selector-class, 64 | .hljs-built_in, 65 | .hljs-builtin-name { 66 | color: #006666; /* Blue Stone (approx.) */ 67 | font-weight: bold; 68 | } 69 | 70 | .hljs-string, /* --- used for PureBASIC Strings --- */ 71 | .hljs-selector-attr { 72 | color: #0080FF; /* Azure Radiance (approx.) */ 73 | } 74 | 75 | .hljs-symbol, /* --- used for PureBASIC Constants --- */ 76 | .hljs-link, 77 | .hljs-deletion, 78 | .hljs-attribute { 79 | color: #924B72; /* Cannon Pink (approx.) */ 80 | } 81 | 82 | .hljs-meta, 83 | .hljs-literal, 84 | .hljs-selector-id { 85 | color: #924B72; /* Cannon Pink (approx.) */ 86 | font-weight: bold; 87 | } 88 | 89 | .hljs-strong, 90 | .hljs-name { 91 | font-weight: bold; 92 | } 93 | 94 | .hljs-emphasis { 95 | font-style: italic; 96 | } 97 | -------------------------------------------------------------------------------- /CodeReader/Themes/qtcreator_dark.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Qt Creator dark color scheme 4 | 5 | */ 6 | 7 | 8 | .hljs { 9 | display: block; 10 | overflow-x: auto; 11 | padding: 0.5em; 12 | background: #000000; 13 | } 14 | 15 | .hljs, 16 | .hljs-subst, 17 | .hljs-tag, 18 | .hljs-title { 19 | color: #aaaaaa; 20 | } 21 | 22 | .hljs-strong, 23 | .hljs-emphasis { 24 | color: #a8a8a2; 25 | } 26 | 27 | .hljs-bullet, 28 | .hljs-quote, 29 | .hljs-number, 30 | .hljs-regexp, 31 | .hljs-literal { 32 | color: #ff55ff; 33 | } 34 | 35 | .hljs-code 36 | .hljs-selector-class { 37 | color: #aaaaff; 38 | } 39 | 40 | .hljs-emphasis, 41 | .hljs-stronge, 42 | .hljs-type { 43 | font-style: italic; 44 | } 45 | 46 | .hljs-keyword, 47 | .hljs-selector-tag, 48 | .hljs-function, 49 | .hljs-section, 50 | .hljs-symbol, 51 | .hljs-name { 52 | color: #ffff55; 53 | } 54 | 55 | .hljs-attribute { 56 | color: #ff5555; 57 | } 58 | 59 | .hljs-variable, 60 | .hljs-params, 61 | .hljs-class .hljs-title { 62 | color: #8888ff; 63 | } 64 | 65 | .hljs-string, 66 | .hljs-selector-id, 67 | .hljs-selector-attr, 68 | .hljs-selector-pseudo, 69 | .hljs-type, 70 | .hljs-built_in, 71 | .hljs-builtin-name, 72 | .hljs-template-tag, 73 | .hljs-template-variable, 74 | .hljs-addition, 75 | .hljs-link { 76 | color: #ff55ff; 77 | } 78 | 79 | .hljs-comment, 80 | .hljs-meta, 81 | .hljs-deletion { 82 | color: #55ffff; 83 | } 84 | -------------------------------------------------------------------------------- /CodeReader/Themes/qtcreator_light.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Qt Creator light color scheme 4 | 5 | */ 6 | 7 | 8 | .hljs { 9 | display: block; 10 | overflow-x: auto; 11 | padding: 0.5em; 12 | background: #ffffff; 13 | } 14 | 15 | .hljs, 16 | .hljs-subst, 17 | .hljs-tag, 18 | .hljs-title { 19 | color: #000000; 20 | } 21 | 22 | .hljs-strong, 23 | .hljs-emphasis { 24 | color: #000000; 25 | } 26 | 27 | .hljs-bullet, 28 | .hljs-quote, 29 | .hljs-number, 30 | .hljs-regexp, 31 | .hljs-literal { 32 | color: #000080; 33 | } 34 | 35 | .hljs-code 36 | .hljs-selector-class { 37 | color: #800080; 38 | } 39 | 40 | .hljs-emphasis, 41 | .hljs-stronge, 42 | .hljs-type { 43 | font-style: italic; 44 | } 45 | 46 | .hljs-keyword, 47 | .hljs-selector-tag, 48 | .hljs-function, 49 | .hljs-section, 50 | .hljs-symbol, 51 | .hljs-name { 52 | color: #808000; 53 | } 54 | 55 | .hljs-attribute { 56 | color: #800000; 57 | } 58 | 59 | .hljs-variable, 60 | .hljs-params, 61 | .hljs-class .hljs-title { 62 | color: #0055AF; 63 | } 64 | 65 | .hljs-string, 66 | .hljs-selector-id, 67 | .hljs-selector-attr, 68 | .hljs-selector-pseudo, 69 | .hljs-type, 70 | .hljs-built_in, 71 | .hljs-builtin-name, 72 | .hljs-template-tag, 73 | .hljs-template-variable, 74 | .hljs-addition, 75 | .hljs-link { 76 | color: #008000; 77 | } 78 | 79 | .hljs-comment, 80 | .hljs-meta, 81 | .hljs-deletion { 82 | color: #008000; 83 | } 84 | -------------------------------------------------------------------------------- /CodeReader/Themes/railscasts.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Railscasts-like style (c) Visoft, Inc. (Damien White) 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | background: #232323; 12 | color: #e6e1dc; 13 | } 14 | 15 | .hljs-comment, 16 | .hljs-quote { 17 | color: #bc9458; 18 | font-style: italic; 19 | } 20 | 21 | .hljs-keyword, 22 | .hljs-selector-tag { 23 | color: #c26230; 24 | } 25 | 26 | .hljs-string, 27 | .hljs-number, 28 | .hljs-regexp, 29 | .hljs-variable, 30 | .hljs-template-variable { 31 | color: #a5c261; 32 | } 33 | 34 | .hljs-subst { 35 | color: #519f50; 36 | } 37 | 38 | .hljs-tag, 39 | .hljs-name { 40 | color: #e8bf6a; 41 | } 42 | 43 | .hljs-type { 44 | color: #da4939; 45 | } 46 | 47 | 48 | .hljs-symbol, 49 | .hljs-bullet, 50 | .hljs-built_in, 51 | .hljs-builtin-name, 52 | .hljs-attr, 53 | .hljs-link { 54 | color: #6d9cbe; 55 | } 56 | 57 | .hljs-params { 58 | color: #d0d0ff; 59 | } 60 | 61 | .hljs-attribute { 62 | color: #cda869; 63 | } 64 | 65 | .hljs-meta { 66 | color: #9b859d; 67 | } 68 | 69 | .hljs-title, 70 | .hljs-section { 71 | color: #ffc66d; 72 | } 73 | 74 | .hljs-addition { 75 | background-color: #144212; 76 | color: #e6e1dc; 77 | display: inline-block; 78 | width: 100%; 79 | } 80 | 81 | .hljs-deletion { 82 | background-color: #600; 83 | color: #e6e1dc; 84 | display: inline-block; 85 | width: 100%; 86 | } 87 | 88 | .hljs-selector-class { 89 | color: #9b703f; 90 | } 91 | 92 | .hljs-selector-id { 93 | color: #8b98ab; 94 | } 95 | 96 | .hljs-emphasis { 97 | font-style: italic; 98 | } 99 | 100 | .hljs-strong { 101 | font-weight: bold; 102 | } 103 | 104 | .hljs-link { 105 | text-decoration: underline; 106 | } 107 | -------------------------------------------------------------------------------- /CodeReader/Themes/rainbow.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Style with support for rainbow parens 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | background: #474949; 12 | color: #d1d9e1; 13 | } 14 | 15 | 16 | .hljs-comment, 17 | .hljs-quote { 18 | color: #969896; 19 | font-style: italic; 20 | } 21 | 22 | .hljs-keyword, 23 | .hljs-selector-tag, 24 | .hljs-literal, 25 | .hljs-type, 26 | .hljs-addition { 27 | color: #cc99cc; 28 | } 29 | 30 | .hljs-number, 31 | .hljs-selector-attr, 32 | .hljs-selector-pseudo { 33 | color: #f99157; 34 | } 35 | 36 | .hljs-string, 37 | .hljs-doctag, 38 | .hljs-regexp { 39 | color: #8abeb7; 40 | } 41 | 42 | .hljs-title, 43 | .hljs-name, 44 | .hljs-section, 45 | .hljs-built_in { 46 | color: #b5bd68; 47 | } 48 | 49 | .hljs-variable, 50 | .hljs-template-variable, 51 | .hljs-selector-id, 52 | .hljs-class .hljs-title { 53 | color: #ffcc66; 54 | } 55 | 56 | .hljs-section, 57 | .hljs-name, 58 | .hljs-strong { 59 | font-weight: bold; 60 | } 61 | 62 | .hljs-symbol, 63 | .hljs-bullet, 64 | .hljs-subst, 65 | .hljs-meta, 66 | .hljs-link { 67 | color: #f99157; 68 | } 69 | 70 | .hljs-deletion { 71 | color: #dc322f; 72 | } 73 | 74 | .hljs-formula { 75 | background: #eee8d5; 76 | } 77 | 78 | .hljs-attr, 79 | .hljs-attribute { 80 | color: #81a2be; 81 | } 82 | 83 | .hljs-emphasis { 84 | font-style: italic; 85 | } 86 | -------------------------------------------------------------------------------- /CodeReader/Themes/school-book.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | School Book style from goldblog.com.ua (c) Zaripov Yura 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 15px 0.5em 0.5em 30px; 11 | font-size: 11px; 12 | line-height:16px; 13 | } 14 | 15 | pre{ 16 | background:#f6f6ae url(./school-book.png); 17 | border-top: solid 2px #d2e8b9; 18 | border-bottom: solid 1px #d2e8b9; 19 | } 20 | 21 | .hljs-keyword, 22 | .hljs-selector-tag, 23 | .hljs-literal { 24 | color:#005599; 25 | font-weight:bold; 26 | } 27 | 28 | .hljs, 29 | .hljs-subst { 30 | color: #3e5915; 31 | } 32 | 33 | .hljs-string, 34 | .hljs-title, 35 | .hljs-section, 36 | .hljs-type, 37 | .hljs-symbol, 38 | .hljs-bullet, 39 | .hljs-attribute, 40 | .hljs-built_in, 41 | .hljs-builtin-name, 42 | .hljs-addition, 43 | .hljs-variable, 44 | .hljs-template-tag, 45 | .hljs-template-variable, 46 | .hljs-link { 47 | color: #2c009f; 48 | } 49 | 50 | .hljs-comment, 51 | .hljs-quote, 52 | .hljs-deletion, 53 | .hljs-meta { 54 | color: #e60415; 55 | } 56 | 57 | .hljs-keyword, 58 | .hljs-selector-tag, 59 | .hljs-literal, 60 | .hljs-doctag, 61 | .hljs-title, 62 | .hljs-section, 63 | .hljs-type, 64 | .hljs-name, 65 | .hljs-selector-id, 66 | .hljs-strong { 67 | font-weight: bold; 68 | } 69 | 70 | .hljs-emphasis { 71 | font-style: italic; 72 | } 73 | -------------------------------------------------------------------------------- /CodeReader/Themes/school-book.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vulgur/Sources/5b99855d8cb09ac2e68f8ca617c8045130d9648b/CodeReader/Themes/school-book.png -------------------------------------------------------------------------------- /CodeReader/Themes/solarized-dark.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | background: #002b36; 12 | color: #839496; 13 | } 14 | 15 | .hljs-comment, 16 | .hljs-quote { 17 | color: #586e75; 18 | } 19 | 20 | /* Solarized Green */ 21 | .hljs-keyword, 22 | .hljs-selector-tag, 23 | .hljs-addition { 24 | color: #859900; 25 | } 26 | 27 | /* Solarized Cyan */ 28 | .hljs-number, 29 | .hljs-string, 30 | .hljs-meta .hljs-meta-string, 31 | .hljs-literal, 32 | .hljs-doctag, 33 | .hljs-regexp { 34 | color: #2aa198; 35 | } 36 | 37 | /* Solarized Blue */ 38 | .hljs-title, 39 | .hljs-section, 40 | .hljs-name, 41 | .hljs-selector-id, 42 | .hljs-selector-class { 43 | color: #268bd2; 44 | } 45 | 46 | /* Solarized Yellow */ 47 | .hljs-attribute, 48 | .hljs-attr, 49 | .hljs-variable, 50 | .hljs-template-variable, 51 | .hljs-class .hljs-title, 52 | .hljs-type { 53 | color: #b58900; 54 | } 55 | 56 | /* Solarized Orange */ 57 | .hljs-symbol, 58 | .hljs-bullet, 59 | .hljs-subst, 60 | .hljs-meta, 61 | .hljs-meta .hljs-keyword, 62 | .hljs-selector-attr, 63 | .hljs-selector-pseudo, 64 | .hljs-link { 65 | color: #cb4b16; 66 | } 67 | 68 | /* Solarized Red */ 69 | .hljs-built_in, 70 | .hljs-deletion { 71 | color: #dc322f; 72 | } 73 | 74 | .hljs-formula { 75 | background: #073642; 76 | } 77 | 78 | .hljs-emphasis { 79 | font-style: italic; 80 | } 81 | 82 | .hljs-strong { 83 | font-weight: bold; 84 | } 85 | -------------------------------------------------------------------------------- /CodeReader/Themes/solarized-light.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | background: #fdf6e3; 12 | color: #657b83; 13 | } 14 | 15 | .hljs-comment, 16 | .hljs-quote { 17 | color: #93a1a1; 18 | } 19 | 20 | /* Solarized Green */ 21 | .hljs-keyword, 22 | .hljs-selector-tag, 23 | .hljs-addition { 24 | color: #859900; 25 | } 26 | 27 | /* Solarized Cyan */ 28 | .hljs-number, 29 | .hljs-string, 30 | .hljs-meta .hljs-meta-string, 31 | .hljs-literal, 32 | .hljs-doctag, 33 | .hljs-regexp { 34 | color: #2aa198; 35 | } 36 | 37 | /* Solarized Blue */ 38 | .hljs-title, 39 | .hljs-section, 40 | .hljs-name, 41 | .hljs-selector-id, 42 | .hljs-selector-class { 43 | color: #268bd2; 44 | } 45 | 46 | /* Solarized Yellow */ 47 | .hljs-attribute, 48 | .hljs-attr, 49 | .hljs-variable, 50 | .hljs-template-variable, 51 | .hljs-class .hljs-title, 52 | .hljs-type { 53 | color: #b58900; 54 | } 55 | 56 | /* Solarized Orange */ 57 | .hljs-symbol, 58 | .hljs-bullet, 59 | .hljs-subst, 60 | .hljs-meta, 61 | .hljs-meta .hljs-keyword, 62 | .hljs-selector-attr, 63 | .hljs-selector-pseudo, 64 | .hljs-link { 65 | color: #cb4b16; 66 | } 67 | 68 | /* Solarized Red */ 69 | .hljs-built_in, 70 | .hljs-deletion { 71 | color: #dc322f; 72 | } 73 | 74 | .hljs-formula { 75 | background: #eee8d5; 76 | } 77 | 78 | .hljs-emphasis { 79 | font-style: italic; 80 | } 81 | 82 | .hljs-strong { 83 | font-weight: bold; 84 | } 85 | -------------------------------------------------------------------------------- /CodeReader/Themes/sunburst.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Sunburst-like style (c) Vasily Polovnyov 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | background: #000; 12 | color: #f8f8f8; 13 | } 14 | 15 | .hljs-comment, 16 | .hljs-quote { 17 | color: #aeaeae; 18 | font-style: italic; 19 | } 20 | 21 | .hljs-keyword, 22 | .hljs-selector-tag, 23 | .hljs-type { 24 | color: #e28964; 25 | } 26 | 27 | .hljs-string { 28 | color: #65b042; 29 | } 30 | 31 | .hljs-subst { 32 | color: #daefa3; 33 | } 34 | 35 | .hljs-regexp, 36 | .hljs-link { 37 | color: #e9c062; 38 | } 39 | 40 | .hljs-title, 41 | .hljs-section, 42 | .hljs-tag, 43 | .hljs-name { 44 | color: #89bdff; 45 | } 46 | 47 | .hljs-class .hljs-title, 48 | .hljs-doctag { 49 | text-decoration: underline; 50 | } 51 | 52 | .hljs-symbol, 53 | .hljs-bullet, 54 | .hljs-number { 55 | color: #3387cc; 56 | } 57 | 58 | .hljs-params, 59 | .hljs-variable, 60 | .hljs-template-variable { 61 | color: #3e87e3; 62 | } 63 | 64 | .hljs-attribute { 65 | color: #cda869; 66 | } 67 | 68 | .hljs-meta { 69 | color: #8996a8; 70 | } 71 | 72 | .hljs-formula { 73 | background-color: #0e2231; 74 | color: #f8f8f8; 75 | font-style: italic; 76 | } 77 | 78 | .hljs-addition { 79 | background-color: #253b22; 80 | color: #f8f8f8; 81 | } 82 | 83 | .hljs-deletion { 84 | background-color: #420e09; 85 | color: #f8f8f8; 86 | } 87 | 88 | .hljs-selector-class { 89 | color: #9b703f; 90 | } 91 | 92 | .hljs-selector-id { 93 | color: #8b98ab; 94 | } 95 | 96 | .hljs-emphasis { 97 | font-style: italic; 98 | } 99 | 100 | .hljs-strong { 101 | font-weight: bold; 102 | } 103 | -------------------------------------------------------------------------------- /CodeReader/Themes/tomorrow-night-blue.css: -------------------------------------------------------------------------------- 1 | /* Tomorrow Night Blue Theme */ 2 | /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ 3 | /* Original theme - https://github.com/chriskempson/tomorrow-theme */ 4 | /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ 5 | 6 | /* Tomorrow Comment */ 7 | .hljs-comment, 8 | .hljs-quote { 9 | color: #7285b7; 10 | } 11 | 12 | /* Tomorrow Red */ 13 | .hljs-variable, 14 | .hljs-template-variable, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-selector-id, 18 | .hljs-selector-class, 19 | .hljs-regexp, 20 | .hljs-deletion { 21 | color: #ff9da4; 22 | } 23 | 24 | /* Tomorrow Orange */ 25 | .hljs-number, 26 | .hljs-built_in, 27 | .hljs-builtin-name, 28 | .hljs-literal, 29 | .hljs-type, 30 | .hljs-params, 31 | .hljs-meta, 32 | .hljs-link { 33 | color: #ffc58f; 34 | } 35 | 36 | /* Tomorrow Yellow */ 37 | .hljs-attribute { 38 | color: #ffeead; 39 | } 40 | 41 | /* Tomorrow Green */ 42 | .hljs-string, 43 | .hljs-symbol, 44 | .hljs-bullet, 45 | .hljs-addition { 46 | color: #d1f1a9; 47 | } 48 | 49 | /* Tomorrow Blue */ 50 | .hljs-title, 51 | .hljs-section { 52 | color: #bbdaff; 53 | } 54 | 55 | /* Tomorrow Purple */ 56 | .hljs-keyword, 57 | .hljs-selector-tag { 58 | color: #ebbbff; 59 | } 60 | 61 | .hljs { 62 | display: block; 63 | overflow-x: auto; 64 | background: #002451; 65 | color: white; 66 | padding: 0.5em; 67 | } 68 | 69 | .hljs-emphasis { 70 | font-style: italic; 71 | } 72 | 73 | .hljs-strong { 74 | font-weight: bold; 75 | } 76 | -------------------------------------------------------------------------------- /CodeReader/Themes/tomorrow-night-bright.css: -------------------------------------------------------------------------------- 1 | /* Tomorrow Night Bright Theme */ 2 | /* Original theme - https://github.com/chriskempson/tomorrow-theme */ 3 | /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ 4 | 5 | /* Tomorrow Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #969896; 9 | } 10 | 11 | /* Tomorrow Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-tag, 15 | .hljs-name, 16 | .hljs-selector-id, 17 | .hljs-selector-class, 18 | .hljs-regexp, 19 | .hljs-deletion { 20 | color: #d54e53; 21 | } 22 | 23 | /* Tomorrow Orange */ 24 | .hljs-number, 25 | .hljs-built_in, 26 | .hljs-builtin-name, 27 | .hljs-literal, 28 | .hljs-type, 29 | .hljs-params, 30 | .hljs-meta, 31 | .hljs-link { 32 | color: #e78c45; 33 | } 34 | 35 | /* Tomorrow Yellow */ 36 | .hljs-attribute { 37 | color: #e7c547; 38 | } 39 | 40 | /* Tomorrow Green */ 41 | .hljs-string, 42 | .hljs-symbol, 43 | .hljs-bullet, 44 | .hljs-addition { 45 | color: #b9ca4a; 46 | } 47 | 48 | /* Tomorrow Blue */ 49 | .hljs-title, 50 | .hljs-section { 51 | color: #7aa6da; 52 | } 53 | 54 | /* Tomorrow Purple */ 55 | .hljs-keyword, 56 | .hljs-selector-tag { 57 | color: #c397d8; 58 | } 59 | 60 | .hljs { 61 | display: block; 62 | overflow-x: auto; 63 | background: black; 64 | color: #eaeaea; 65 | padding: 0.5em; 66 | } 67 | 68 | .hljs-emphasis { 69 | font-style: italic; 70 | } 71 | 72 | .hljs-strong { 73 | font-weight: bold; 74 | } 75 | -------------------------------------------------------------------------------- /CodeReader/Themes/tomorrow-night-eighties.css: -------------------------------------------------------------------------------- 1 | /* Tomorrow Night Eighties Theme */ 2 | /* Original theme - https://github.com/chriskempson/tomorrow-theme */ 3 | /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ 4 | 5 | /* Tomorrow Comment */ 6 | .hljs-comment, 7 | .hljs-quote { 8 | color: #999999; 9 | } 10 | 11 | /* Tomorrow Red */ 12 | .hljs-variable, 13 | .hljs-template-variable, 14 | .hljs-tag, 15 | .hljs-name, 16 | .hljs-selector-id, 17 | .hljs-selector-class, 18 | .hljs-regexp, 19 | .hljs-deletion { 20 | color: #f2777a; 21 | } 22 | 23 | /* Tomorrow Orange */ 24 | .hljs-number, 25 | .hljs-built_in, 26 | .hljs-builtin-name, 27 | .hljs-literal, 28 | .hljs-type, 29 | .hljs-params, 30 | .hljs-meta, 31 | .hljs-link { 32 | color: #f99157; 33 | } 34 | 35 | /* Tomorrow Yellow */ 36 | .hljs-attribute { 37 | color: #ffcc66; 38 | } 39 | 40 | /* Tomorrow Green */ 41 | .hljs-string, 42 | .hljs-symbol, 43 | .hljs-bullet, 44 | .hljs-addition { 45 | color: #99cc99; 46 | } 47 | 48 | /* Tomorrow Blue */ 49 | .hljs-title, 50 | .hljs-section { 51 | color: #6699cc; 52 | } 53 | 54 | /* Tomorrow Purple */ 55 | .hljs-keyword, 56 | .hljs-selector-tag { 57 | color: #cc99cc; 58 | } 59 | 60 | .hljs { 61 | display: block; 62 | overflow-x: auto; 63 | background: #2d2d2d; 64 | color: #cccccc; 65 | padding: 0.5em; 66 | } 67 | 68 | .hljs-emphasis { 69 | font-style: italic; 70 | } 71 | 72 | .hljs-strong { 73 | font-weight: bold; 74 | } 75 | -------------------------------------------------------------------------------- /CodeReader/Themes/tomorrow-night.css: -------------------------------------------------------------------------------- 1 | /* Tomorrow Night Theme */ 2 | /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ 3 | /* Original theme - https://github.com/chriskempson/tomorrow-theme */ 4 | /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ 5 | 6 | /* Tomorrow Comment */ 7 | .hljs-comment, 8 | .hljs-quote { 9 | color: #969896; 10 | } 11 | 12 | /* Tomorrow Red */ 13 | .hljs-variable, 14 | .hljs-template-variable, 15 | .hljs-tag, 16 | .hljs-name, 17 | .hljs-selector-id, 18 | .hljs-selector-class, 19 | .hljs-regexp, 20 | .hljs-deletion { 21 | color: #cc6666; 22 | } 23 | 24 | /* Tomorrow Orange */ 25 | .hljs-number, 26 | .hljs-built_in, 27 | .hljs-builtin-name, 28 | .hljs-literal, 29 | .hljs-type, 30 | .hljs-params, 31 | .hljs-meta, 32 | .hljs-link { 33 | color: #de935f; 34 | } 35 | 36 | /* Tomorrow Yellow */ 37 | .hljs-attribute { 38 | color: #f0c674; 39 | } 40 | 41 | /* Tomorrow Green */ 42 | .hljs-string, 43 | .hljs-symbol, 44 | .hljs-bullet, 45 | .hljs-addition { 46 | color: #b5bd68; 47 | } 48 | 49 | /* Tomorrow Blue */ 50 | .hljs-title, 51 | .hljs-section { 52 | color: #81a2be; 53 | } 54 | 55 | /* Tomorrow Purple */ 56 | .hljs-keyword, 57 | .hljs-selector-tag { 58 | color: #b294bb; 59 | } 60 | 61 | .hljs { 62 | display: block; 63 | overflow-x: auto; 64 | background: #1d1f21; 65 | color: #c5c8c6; 66 | padding: 0.5em; 67 | } 68 | 69 | .hljs-emphasis { 70 | font-style: italic; 71 | } 72 | 73 | .hljs-strong { 74 | font-weight: bold; 75 | } 76 | -------------------------------------------------------------------------------- /CodeReader/Themes/tomorrow.css: -------------------------------------------------------------------------------- 1 | /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ 2 | 3 | /* Tomorrow Comment */ 4 | .hljs-comment, 5 | .hljs-quote { 6 | color: #8e908c; 7 | } 8 | 9 | /* Tomorrow Red */ 10 | .hljs-variable, 11 | .hljs-template-variable, 12 | .hljs-tag, 13 | .hljs-name, 14 | .hljs-selector-id, 15 | .hljs-selector-class, 16 | .hljs-regexp, 17 | .hljs-deletion { 18 | color: #c82829; 19 | } 20 | 21 | /* Tomorrow Orange */ 22 | .hljs-number, 23 | .hljs-built_in, 24 | .hljs-builtin-name, 25 | .hljs-literal, 26 | .hljs-type, 27 | .hljs-params, 28 | .hljs-meta, 29 | .hljs-link { 30 | color: #f5871f; 31 | } 32 | 33 | /* Tomorrow Yellow */ 34 | .hljs-attribute { 35 | color: #eab700; 36 | } 37 | 38 | /* Tomorrow Green */ 39 | .hljs-string, 40 | .hljs-symbol, 41 | .hljs-bullet, 42 | .hljs-addition { 43 | color: #718c00; 44 | } 45 | 46 | /* Tomorrow Blue */ 47 | .hljs-title, 48 | .hljs-section { 49 | color: #4271ae; 50 | } 51 | 52 | /* Tomorrow Purple */ 53 | .hljs-keyword, 54 | .hljs-selector-tag { 55 | color: #8959a8; 56 | } 57 | 58 | .hljs { 59 | display: block; 60 | overflow-x: auto; 61 | background: white; 62 | color: #4d4d4c; 63 | padding: 0.5em; 64 | } 65 | 66 | .hljs-emphasis { 67 | font-style: italic; 68 | } 69 | 70 | .hljs-strong { 71 | font-weight: bold; 72 | } 73 | -------------------------------------------------------------------------------- /CodeReader/Themes/vs.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Visual Studio-like style based on original C# coloring by Jason Diamond 4 | 5 | */ 6 | .hljs { 7 | display: block; 8 | overflow-x: auto; 9 | padding: 0.5em; 10 | background: white; 11 | color: black; 12 | } 13 | 14 | .hljs-comment, 15 | .hljs-quote, 16 | .hljs-variable { 17 | color: #008000; 18 | } 19 | 20 | .hljs-keyword, 21 | .hljs-selector-tag, 22 | .hljs-built_in, 23 | .hljs-name, 24 | .hljs-tag { 25 | color: #00f; 26 | } 27 | 28 | .hljs-string, 29 | .hljs-title, 30 | .hljs-section, 31 | .hljs-attribute, 32 | .hljs-literal, 33 | .hljs-template-tag, 34 | .hljs-template-variable, 35 | .hljs-type, 36 | .hljs-addition { 37 | color: #a31515; 38 | } 39 | 40 | .hljs-deletion, 41 | .hljs-selector-attr, 42 | .hljs-selector-pseudo, 43 | .hljs-meta { 44 | color: #2b91af; 45 | } 46 | 47 | .hljs-doctag { 48 | color: #808080; 49 | } 50 | 51 | .hljs-attr { 52 | color: #f00; 53 | } 54 | 55 | .hljs-symbol, 56 | .hljs-bullet, 57 | .hljs-link { 58 | color: #00b0e8; 59 | } 60 | 61 | 62 | .hljs-emphasis { 63 | font-style: italic; 64 | } 65 | 66 | .hljs-strong { 67 | font-weight: bold; 68 | } 69 | -------------------------------------------------------------------------------- /CodeReader/Themes/xcode.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | XCode style (c) Angel Garcia 4 | 5 | */ 6 | 7 | .hljs { 8 | display: block; 9 | overflow-x: auto; 10 | padding: 0.5em; 11 | background: #fff; 12 | color: black; 13 | } 14 | 15 | .hljs-comment, 16 | .hljs-quote { 17 | color: #006a00; 18 | } 19 | 20 | .hljs-keyword, 21 | .hljs-selector-tag, 22 | .hljs-literal { 23 | color: #aa0d91; 24 | } 25 | 26 | .hljs-name { 27 | color: #008; 28 | } 29 | 30 | .hljs-variable, 31 | .hljs-template-variable { 32 | color: #660; 33 | } 34 | 35 | .hljs-string { 36 | color: #c41a16; 37 | } 38 | 39 | .hljs-regexp, 40 | .hljs-link { 41 | color: #080; 42 | } 43 | 44 | .hljs-title, 45 | .hljs-tag, 46 | .hljs-symbol, 47 | .hljs-bullet, 48 | .hljs-number, 49 | .hljs-meta { 50 | color: #1c00cf; 51 | } 52 | 53 | .hljs-section, 54 | .hljs-class .hljs-title, 55 | .hljs-type, 56 | .hljs-attr, 57 | .hljs-built_in, 58 | .hljs-builtin-name, 59 | .hljs-params { 60 | color: #5c2699; 61 | } 62 | 63 | .hljs-attribute, 64 | .hljs-subst { 65 | color: #000; 66 | } 67 | 68 | .hljs-formula { 69 | background-color: #eee; 70 | font-style: italic; 71 | } 72 | 73 | .hljs-addition { 74 | background-color: #baeeba; 75 | } 76 | 77 | .hljs-deletion { 78 | background-color: #ffc8bd; 79 | } 80 | 81 | .hljs-selector-id, 82 | .hljs-selector-class { 83 | color: #9b703f; 84 | } 85 | 86 | .hljs-doctag, 87 | .hljs-strong { 88 | font-weight: bold; 89 | } 90 | 91 | .hljs-emphasis { 92 | font-style: italic; 93 | } 94 | -------------------------------------------------------------------------------- /CodeReader/Themes/xt256.css: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | xt256.css 4 | 5 | Contact: initbar [at] protonmail [dot] ch 6 | : github.com/initbar 7 | */ 8 | 9 | .hljs { 10 | display: block; 11 | overflow-x: auto; 12 | color: #eaeaea; 13 | background: #000; 14 | padding: 0.5; 15 | } 16 | 17 | .hljs-subst { 18 | color: #eaeaea; 19 | } 20 | 21 | .hljs-emphasis { 22 | font-style: italic; 23 | } 24 | 25 | .hljs-strong { 26 | font-weight: bold; 27 | } 28 | 29 | .hljs-builtin-name, 30 | .hljs-type { 31 | color: #eaeaea; 32 | } 33 | 34 | .hljs-params { 35 | color: #da0000; 36 | } 37 | 38 | .hljs-literal, 39 | .hljs-number, 40 | .hljs-name { 41 | color: #ff0000; 42 | font-weight: bolder; 43 | } 44 | 45 | .hljs-comment { 46 | color: #969896; 47 | } 48 | 49 | .hljs-selector-id, 50 | .hljs-quote { 51 | color: #00ffff; 52 | } 53 | 54 | .hljs-template-variable, 55 | .hljs-variable, 56 | .hljs-title { 57 | color: #00ffff; 58 | font-weight: bold; 59 | } 60 | 61 | .hljs-selector-class, 62 | .hljs-keyword, 63 | .hljs-symbol { 64 | color: #fff000; 65 | } 66 | 67 | .hljs-string, 68 | .hljs-bullet { 69 | color: #00ff00; 70 | } 71 | 72 | .hljs-tag, 73 | .hljs-section { 74 | color: #000fff; 75 | } 76 | 77 | .hljs-selector-tag { 78 | color: #000fff; 79 | font-weight: bold; 80 | } 81 | 82 | .hljs-attribute, 83 | .hljs-built_in, 84 | .hljs-regexp, 85 | .hljs-link { 86 | color: #ff00ff; 87 | } 88 | 89 | .hljs-meta { 90 | color: #fff; 91 | font-weight: bolder; 92 | } 93 | -------------------------------------------------------------------------------- /CodeReader/Themes/zenburn.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Zenburn style from voldmar.ru (c) Vladimir Epifanov 4 | based on dark.css by Ivan Sagalaev 5 | 6 | */ 7 | 8 | .hljs { 9 | display: block; 10 | overflow-x: auto; 11 | padding: 0.5em; 12 | background: #3f3f3f; 13 | color: #dcdcdc; 14 | } 15 | 16 | .hljs-keyword, 17 | .hljs-selector-tag, 18 | .hljs-tag { 19 | color: #e3ceab; 20 | } 21 | 22 | .hljs-template-tag { 23 | color: #dcdcdc; 24 | } 25 | 26 | .hljs-number { 27 | color: #8cd0d3; 28 | } 29 | 30 | .hljs-variable, 31 | .hljs-template-variable, 32 | .hljs-attribute { 33 | color: #efdcbc; 34 | } 35 | 36 | .hljs-literal { 37 | color: #efefaf; 38 | } 39 | 40 | .hljs-subst { 41 | color: #8f8f8f; 42 | } 43 | 44 | .hljs-title, 45 | .hljs-name, 46 | .hljs-selector-id, 47 | .hljs-selector-class, 48 | .hljs-section, 49 | .hljs-type { 50 | color: #efef8f; 51 | } 52 | 53 | .hljs-symbol, 54 | .hljs-bullet, 55 | .hljs-link { 56 | color: #dca3a3; 57 | } 58 | 59 | .hljs-deletion, 60 | .hljs-string, 61 | .hljs-built_in, 62 | .hljs-builtin-name { 63 | color: #cc9393; 64 | } 65 | 66 | .hljs-addition, 67 | .hljs-comment, 68 | .hljs-quote, 69 | .hljs-meta { 70 | color: #7f9f7f; 71 | } 72 | 73 | 74 | .hljs-emphasis { 75 | font-style: italic; 76 | } 77 | 78 | .hljs-strong { 79 | font-weight: bold; 80 | } 81 | -------------------------------------------------------------------------------- /CodeReader/View/AboutViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AboutViewController.swift 3 | // CodeReader 4 | // 5 | // Created by vulgur on 16/6/17. 6 | // Copyright © 2016年 MAD. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import StoreKit 11 | import EZLoadingActivity 12 | 13 | class AboutViewController: UIViewController { 14 | 15 | @IBOutlet var titleLabel: UILabel! 16 | @IBOutlet var donateImageView: UIImageView! 17 | @IBOutlet var restoreButton: UIButton! 18 | var products = [SKProduct]() 19 | 20 | override func viewDidLoad() { 21 | super.viewDidLoad() 22 | 23 | NotificationCenter.default.addObserver(self, selector: #selector(AboutViewController.handlePurchasedNotification(_:)), name: NSNotification.Name(rawValue: IAPHelper.IAPHelperPurchaseNotification), object: nil) 24 | } 25 | 26 | override func viewDidAppear(_ animated: Bool) { 27 | super.viewDidAppear(animated) 28 | if DonationProduct.store.isProductPurchased(DonationProduct.BuyMeACoffee) { 29 | changeStateToPurchased() 30 | } else { 31 | _ = EZLoadingActivity.show("loading...", disableUI: true) 32 | DonationProduct.store.requestProducts { (success, products) in 33 | if success { 34 | _ = EZLoadingActivity.hide() 35 | self.products = products! 36 | if let buyMeACoffee = self.products.first { 37 | if DonationProduct.store.isProductPurchased(buyMeACoffee.productIdentifier) { 38 | self.changeStateToPurchased() 39 | } else { 40 | let tap = UITapGestureRecognizer(target: self, action: #selector(AboutViewController.tapToDonate)) 41 | self.donateImageView.isUserInteractionEnabled = true 42 | self.donateImageView.addGestureRecognizer(tap) 43 | } 44 | } 45 | } 46 | } 47 | } 48 | } 49 | 50 | override func didReceiveMemoryWarning() { 51 | super.didReceiveMemoryWarning() 52 | // Dispose of any resources that can be recreated. 53 | } 54 | 55 | 56 | @objc fileprivate func handlePurchasedNotification(_ notification: Notification) { 57 | guard let identifier = notification.object as? String else { return } 58 | 59 | for product in products { 60 | guard product.productIdentifier == identifier else { continue } 61 | changeStateToPurchased() 62 | } 63 | } 64 | 65 | fileprivate func changeStateToPurchased() { 66 | UIView.transition(with: donateImageView, duration: 0.5, options: [.transitionCrossDissolve], animations: { 67 | self.donateImageView.image = UIImage(named: "purchased_coffee") 68 | self.titleLabel.text = "You've unlocked all features" 69 | }, completion: nil) 70 | donateImageView.isUserInteractionEnabled = false 71 | restoreButton.isHidden = true 72 | } 73 | 74 | @objc fileprivate func tapToDonate() { 75 | if let buyMeACoffee = self.products.first { 76 | DonationProduct.store.buyProduct(buyMeACoffee) 77 | } 78 | } 79 | 80 | @IBAction func restoreTapped(_ sender: UIButton) { 81 | DonationProduct.store.restorePurchases() 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /CodeReader/View/BaseTableViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BaseTableViewController.swift 3 | // CodeReader 4 | // 5 | // Created by vulgur on 2016/10/17. 6 | // Copyright © 2016年 MAD. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import RxSwift 11 | 12 | class BaseTableViewController: UITableViewController { 13 | 14 | let disposeBag = DisposeBag() 15 | 16 | override func viewDidLoad() { 17 | super.viewDidLoad() 18 | 19 | // Uncomment the following line to preserve selection between presentations 20 | // self.clearsSelectionOnViewWillAppear = false 21 | 22 | // Uncomment the following line to display an Edit button in the navigation bar for this view controller. 23 | // self.navigationItem.rightBarButtonItem = self.editButtonItem() 24 | } 25 | 26 | override func didReceiveMemoryWarning() { 27 | super.didReceiveMemoryWarning() 28 | // Dispose of any resources that can be recreated. 29 | } 30 | 31 | // MARK: - Table view data source 32 | 33 | override func numberOfSections(in tableView: UITableView) -> Int { 34 | // #warning Incomplete implementation, return the number of sections 35 | return 0 36 | } 37 | 38 | override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 39 | // #warning Incomplete implementation, return the number of rows 40 | return 0 41 | } 42 | 43 | /* 44 | override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 45 | let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath) 46 | 47 | // Configure the cell... 48 | 49 | return cell 50 | } 51 | */ 52 | 53 | /* 54 | // Override to support conditional editing of the table view. 55 | override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { 56 | // Return false if you do not want the specified item to be editable. 57 | return true 58 | } 59 | */ 60 | 61 | /* 62 | // Override to support editing the table view. 63 | override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 64 | if editingStyle == .delete { 65 | // Delete the row from the data source 66 | tableView.deleteRows(at: [indexPath], with: .fade) 67 | } else if editingStyle == .insert { 68 | // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view 69 | } 70 | } 71 | */ 72 | 73 | /* 74 | // Override to support rearranging the table view. 75 | override func tableView(_ tableView: UITableView, moveRowAt fromIndexPath: IndexPath, to: IndexPath) { 76 | 77 | } 78 | */ 79 | 80 | /* 81 | // Override to support conditional rearranging of the table view. 82 | override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool { 83 | // Return false if you do not want the item to be re-orderable. 84 | return true 85 | } 86 | */ 87 | 88 | /* 89 | // MARK: - Navigation 90 | 91 | // In a storyboard-based application, you will often want to do a little preparation before navigation 92 | override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 93 | // Get the new view controller using segue.destinationViewController. 94 | // Pass the selected object to the new view controller. 95 | } 96 | */ 97 | 98 | } 99 | -------------------------------------------------------------------------------- /CodeReader/View/BaseViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BaseViewController.swift 3 | // CodeReader 4 | // 5 | // Created by vulgur on 2016/9/27. 6 | // Copyright © 2016年 MAD. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import RxSwift 11 | 12 | class BaseViewController: UIViewController { 13 | 14 | let disposeBag = DisposeBag() 15 | 16 | override func viewDidLoad() { 17 | super.viewDidLoad() 18 | 19 | // Do any additional setup after loading the view. 20 | } 21 | 22 | override func didReceiveMemoryWarning() { 23 | super.didReceiveMemoryWarning() 24 | // Dispose of any resources that can be recreated. 25 | } 26 | 27 | 28 | /* 29 | // MARK: - Navigation 30 | 31 | // In a storyboard-based application, you will often want to do a little preparation before navigation 32 | override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 33 | // Get the new view controller using segue.destinationViewController. 34 | // Pass the selected object to the new view controller. 35 | } 36 | */ 37 | 38 | } 39 | -------------------------------------------------------------------------------- /CodeReader/View/BranchCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BranchCell.swift 3 | // CodeReader 4 | // 5 | // Created by vulgur on 16/9/12. 6 | // Copyright © 2016年 MAD. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class BranchCell: UITableViewCell { 12 | 13 | @IBOutlet var branchLabel: InsetsLabel! 14 | @IBOutlet var messageLabel: UILabel! 15 | @IBOutlet var updateInfoLabel: UILabel! 16 | override func awakeFromNib() { 17 | super.awakeFromNib() 18 | // Initialization code 19 | } 20 | 21 | override func setSelected(_ selected: Bool, animated: Bool) { 22 | super.setSelected(selected, animated: animated) 23 | 24 | // Configure the view for the selected state 25 | } 26 | 27 | } 28 | 29 | -------------------------------------------------------------------------------- /CodeReader/View/BranchListViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BranchListViewController.swift 3 | // CodeReader 4 | // 5 | // Created by vulgur on 16/9/6. 6 | // Copyright © 2016年 MAD. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import SwiftDate 11 | import RxSwift 12 | import RxCocoa 13 | 14 | class BranchListViewController: BaseTableViewController { 15 | var viewModel: BranchListViewModel! 16 | var ownerName: String! 17 | var repoName: String! 18 | 19 | let BranchCellIdentifier = "BranchCell" 20 | 21 | override func viewDidLoad() { 22 | super.viewDidLoad() 23 | 24 | navigationItem.title = "Branches" 25 | 26 | tableView.register(UINib.init(nibName: "BranchCell", bundle: nil), forCellReuseIdentifier: BranchCellIdentifier) 27 | tableView.rowHeight = 70 28 | 29 | bindViewModel() 30 | } 31 | 32 | override func didReceiveMemoryWarning() { 33 | super.didReceiveMemoryWarning() 34 | // Dispose of any resources that can be recreated. 35 | } 36 | 37 | func bindViewModel() { 38 | viewModel = BranchListViewModel(ownerName: ownerName, repoName: repoName) 39 | viewModel.dataSource.configureCell = { [unowned self] dataSource, tableView, indexPath, branch in 40 | let cell = tableView.dequeueReusableCell(withIdentifier: self.BranchCellIdentifier, for: indexPath) as! BranchCell 41 | cell.branchLabel.text = branch.name 42 | cell.branchLabel.layer.cornerRadius = 3 43 | cell.branchLabel.layer.masksToBounds = true 44 | cell.branchLabel.insets = UIEdgeInsetsMake(0, 5, 0, 5) 45 | cell.updateInfoLabel.alpha = 0 46 | cell.messageLabel.alpha = 0 47 | self.viewModel.loadLatestCommit(urlString: branch.latestCommitURLString!).subscribe(onNext: { (commit) in 48 | 49 | if let dateString = commit.commitInfo?.committer?.dateString { 50 | let date = try! DateInRegion(string: dateString, format: .iso8601(options: .withInternetDateTime)) 51 | let (colloquial, _) = try! date.colloquialSinceNow() 52 | cell.updateInfoLabel.text = colloquial 53 | cell.messageLabel.text = commit.commitInfo?.message 54 | UIView.animate(withDuration: 0.3, animations: { 55 | cell.updateInfoLabel.alpha = 1 56 | cell.messageLabel.alpha = 1 57 | }) 58 | } 59 | }).addDisposableTo(self.disposeBag) 60 | return cell 61 | } 62 | 63 | viewModel.loadBranches().map { (branches) -> [BranchSection] in 64 | return branches.map { 65 | BranchSection(items: [$0]) 66 | } 67 | }.bindTo(tableView.rx.items(dataSource: viewModel.dataSource)) 68 | .addDisposableTo(disposeBag) 69 | } 70 | 71 | override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { 72 | return 20 73 | } 74 | 75 | override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { 76 | return CGFloat.leastNormalMagnitude 77 | } 78 | 79 | override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 80 | log.info("Select index path:\(indexPath.section, indexPath.row)") 81 | if let branch = try! viewModel.dataSource.model(at: indexPath) as? Branch { 82 | performSegue(withIdentifier: "ShowCommitList", sender: branch.name) 83 | } 84 | } 85 | // MARK: - Navigation 86 | 87 | // In a storyboard-based application, you will often want to do a little preparation before navigation 88 | override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 89 | if segue.identifier == "ShowCommitList" { 90 | 91 | if let branchName = sender as? String, 92 | let commitListVC = segue.destination as? CommitListViewController{ 93 | let url = "https://api.github.com/repos/\(viewModel.ownerName!)/\(viewModel.repoName!)/commits?sha=\(branchName)" 94 | let commitListViewModel = CommitListViewModel(apiURLString: url) 95 | commitListVC.viewModel = commitListViewModel 96 | } 97 | } 98 | } 99 | 100 | } 101 | -------------------------------------------------------------------------------- /CodeReader/View/CommitCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CommitCell.swift 3 | // CodeReader 4 | // 5 | // Created by vulgur on 16/9/3. 6 | // Copyright © 2016年 MAD. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class CommitCell: UITableViewCell { 12 | 13 | @IBOutlet var avatarImageView: UIImageView! 14 | @IBOutlet var messageLabel: UILabel! 15 | @IBOutlet var shaLabel: UILabel! 16 | @IBOutlet var committerLabel: UILabel! 17 | 18 | override func awakeFromNib() { 19 | super.awakeFromNib() 20 | // Initialization code 21 | } 22 | 23 | override func setSelected(_ selected: Bool, animated: Bool) { 24 | super.setSelected(selected, animated: animated) 25 | 26 | // Configure the view for the selected state 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /CodeReader/View/CommitFileCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CommitFileCell.swift 3 | // CodeReader 4 | // 5 | // Created by vulgur on 2016/10/19. 6 | // Copyright © 2016年 MAD. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class CommitFileCell: UITableViewCell { 12 | 13 | enum FileChangeType { 14 | case Addition 15 | case Deletion 16 | case Default 17 | 18 | func backgroundColor() -> UIColor { 19 | switch self { 20 | case .Addition: 21 | return UIColor("#55A532") 22 | case .Deletion: 23 | return UIColor("#BD2D00") 24 | default: 25 | return UIColor("#DDDDDD") 26 | } 27 | } 28 | } 29 | 30 | @IBOutlet var statusImageView: UIImageView! 31 | @IBOutlet var filenameLabel: UILabel! 32 | @IBOutlet var deletionsLabel: InsetsLabel! 33 | @IBOutlet var additionsLabel: InsetsLabel! 34 | override func awakeFromNib() { 35 | super.awakeFromNib() 36 | // Initialization code 37 | self.additionsLabel.layer.cornerRadius = 3 38 | self.deletionsLabel.layer.cornerRadius = 3 39 | 40 | self.additionsLabel.layer.masksToBounds = true 41 | self.additionsLabel.insets = UIEdgeInsetsMake(0, 5, 0, 5) 42 | self.deletionsLabel.layer.masksToBounds = true 43 | self.deletionsLabel.insets = UIEdgeInsetsMake(0, 5, 0, 5) 44 | } 45 | 46 | override func setSelected(_ selected: Bool, animated: Bool) { 47 | super.setSelected(selected, animated: animated) 48 | 49 | // Configure the view for the selected state 50 | } 51 | 52 | } 53 | -------------------------------------------------------------------------------- /CodeReader/View/CommitFileListViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CommitFileListViewController.swift 3 | // CodeReader 4 | // 5 | // Created by vulgur on 2016/10/19. 6 | // Copyright © 2016年 MAD. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import Crashlytics 11 | 12 | class CommitFileListViewController: BaseTableViewController { 13 | 14 | var viewModel: CommitFileListViewModel! 15 | let CommitFileCellIdentifier = "CommitFileCell" 16 | 17 | override func viewDidLoad() { 18 | super.viewDidLoad() 19 | 20 | self.navigationItem.title = "Commit Files" 21 | self.tableView.hideEmptyCells() 22 | Answers.logCustomEvent(withName: "Show Commit File List", customAttributes: nil) 23 | } 24 | 25 | override func viewWillAppear(_ animated: Bool) { 26 | super.viewWillAppear(animated) 27 | bindViewModel() 28 | } 29 | 30 | override func didReceiveMemoryWarning() { 31 | super.didReceiveMemoryWarning() 32 | // Dispose of any resources that can be recreated. 33 | } 34 | 35 | // MARK: Private methods 36 | private func bindViewModel() { 37 | viewModel.commitFiles.asDriver() 38 | .drive(tableView.rx.items(cellIdentifier: CommitFileCellIdentifier, cellType: CommitFileCell.self)) { (row, commitFile, cell) in 39 | if let filename = commitFile.filename { 40 | cell.filenameLabel.text = self.shortenFilename(filename: filename) 41 | } 42 | if let additions = commitFile.additions { 43 | cell.additionsLabel.text = "+\(additions)" 44 | } 45 | if let deletions = commitFile.deletions { 46 | cell.deletionsLabel.text = "-\(deletions)" 47 | } 48 | 49 | switch commitFile.status! { 50 | case "added": cell.statusImageView.image = #imageLiteral(resourceName: "file_addition") 51 | case "modified": cell.statusImageView.image = #imageLiteral(resourceName: "file_modification") 52 | case "deleted": cell.statusImageView.image = #imageLiteral(resourceName: "file_deletion") 53 | default: cell.statusImageView.image = #imageLiteral(resourceName: "file_addition") 54 | } 55 | 56 | }.addDisposableTo(disposeBag) 57 | 58 | viewModel.loadCommitFileList().subscribe(onNext: { [unowned self] (commitFiles) in 59 | self.viewModel.commitFiles.value = commitFiles 60 | }).addDisposableTo(disposeBag) 61 | } 62 | 63 | // MARK: - Table view data source 64 | 65 | override func numberOfSections(in tableView: UITableView) -> Int { 66 | // #warning Incomplete implementation, return the number of sections 67 | return 1 68 | } 69 | 70 | override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 71 | // #warning Incomplete implementation, return the number of rows 72 | return viewModel.commitFiles.value.count 73 | } 74 | 75 | 76 | private func shortenFilename(filename: String) -> String { 77 | let paths = filename.components(separatedBy: "/") 78 | if paths.count > 2 { 79 | return ".../".appending(paths[paths.count-2]).appending("/").appending(paths.last!) 80 | } 81 | return filename 82 | } 83 | 84 | override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 85 | // performSegue(withIdentifier: "ShowFileChange", sender: indexPath) 86 | } 87 | 88 | // MARK: - Navigation 89 | 90 | override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 91 | if segue.identifier == "ShowFileChange" { 92 | if let destinationVC = segue.destination as? FileChangeViewController, 93 | let indexPath = self.tableView.indexPathForSelectedRow { 94 | let file = viewModel.commitFiles.value[indexPath.row] 95 | destinationVC.patchString = file.patch 96 | destinationVC.navigationItem.title = file.filename?.fileBaseName 97 | } 98 | } 99 | } 100 | 101 | 102 | } 103 | -------------------------------------------------------------------------------- /CodeReader/View/FileCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FileCell.swift 3 | // CodeReader 4 | // 5 | // Created by vulgur on 16/5/27. 6 | // Copyright © 2016年 MAD. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class FileCell: UITableViewCell { 12 | 13 | @IBOutlet var fileIconImageView: UIImageView! 14 | @IBOutlet var filenameLabel: UILabel! 15 | override func awakeFromNib() { 16 | super.awakeFromNib() 17 | // Initialization code 18 | } 19 | 20 | override func setSelected(_ selected: Bool, animated: Bool) { 21 | super.setSelected(selected, animated: animated) 22 | 23 | // Configure the view for the selected state 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /CodeReader/View/FileChangeViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FileChangeViewController.swift 3 | // CodeReader 4 | // 5 | // Created by vulgur on 2016/11/15. 6 | // Copyright © 2016年 MAD. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import Crashlytics 11 | 12 | class FileChangeViewController: UIViewController { 13 | 14 | 15 | @IBOutlet var textView: UITextView! 16 | 17 | var patchString: String? 18 | 19 | override func viewDidLoad() { 20 | super.viewDidLoad() 21 | Answers.logCustomEvent(withName: "Show File Change", customAttributes: nil) 22 | } 23 | 24 | override func viewDidAppear(_ animated: Bool) { 25 | super.viewDidAppear(animated) 26 | 27 | if let patchString = self.patchString { 28 | self.textView.text = patchString 29 | } 30 | } 31 | 32 | override func didReceiveMemoryWarning() { 33 | super.didReceiveMemoryWarning() 34 | // Dispose of any resources that can be recreated. 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /CodeReader/View/HistoryViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HistoryViewController.swift 3 | // CodeReader 4 | // 5 | // Created by vulgur on 16/6/23. 6 | // Copyright © 2016年 MAD. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import Crashlytics 11 | 12 | class HistoryViewController: UIViewController { 13 | 14 | let CellIdentifier = "RecentFileCell" 15 | var recentList = [Recent]() 16 | 17 | @IBOutlet var tableView: UITableView! 18 | @IBOutlet var segmentedControl: UISegmentedControl! 19 | 20 | override func viewDidLoad() { 21 | super.viewDidLoad() 22 | 23 | self.navigationItem.title = "History" 24 | 25 | self.tableView.register(UINib.init(nibName: "RecentFileCell", bundle: nil), forCellReuseIdentifier: CellIdentifier) 26 | self.tableView.rowHeight = 70 27 | configSegmentedControl() 28 | } 29 | 30 | override func viewWillAppear(_ animated: Bool) { 31 | super.viewWillAppear(animated) 32 | self.tableView.reloadData() 33 | } 34 | 35 | override func didReceiveMemoryWarning() { 36 | super.didReceiveMemoryWarning() 37 | // Dispose of any resources that can be recreated. 38 | } 39 | 40 | fileprivate func configSegmentedControl() { 41 | self.segmentedControl.addTarget(self, action: #selector(HistoryViewController.segmentChanged(_:)), for: .valueChanged) 42 | self.segmentedControl.selectedSegmentIndex = 0 43 | self.recentList = RecentsManager.sharedManager.recents 44 | } 45 | 46 | @objc fileprivate func segmentChanged(_ sender: UISegmentedControl) { 47 | switch sender.selectedSegmentIndex { 48 | case 0: 49 | recentList = RecentsManager.sharedManager.recents 50 | Answers.logCustomEvent(withName: "Show Recents", customAttributes: nil) 51 | case 1: 52 | if DonationProduct.store.isProductPurchased(DonationProduct.BuyMeACoffee) { 53 | recentList = RecentsManager.sharedManager.favorites 54 | } else { 55 | let alertController = UIAlertController(title: "", message: "Buy me a coffee to unlock favorites", preferredStyle: .alert) 56 | let alertAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil) 57 | alertController.addAction(alertAction) 58 | self.present(alertController, animated: true, completion: { 59 | self.segmentedControl.selectedSegmentIndex = 0 60 | self.segmentedControl.didChangeValue(forKey: "selectedSegmentIndex") 61 | }) 62 | } 63 | Answers.logCustomEvent(withName: "Show Favorites", customAttributes: nil) 64 | default: 65 | recentList = RecentsManager.sharedManager.recents 66 | } 67 | self.tableView.reloadData() 68 | } 69 | } 70 | 71 | extension HistoryViewController: UITableViewDelegate { 72 | func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 73 | let recent = recentList[(indexPath as NSIndexPath).row] 74 | let file = recent.file 75 | 76 | let codeVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "CodeViewController") as! CodeViewController 77 | codeVC.file = file 78 | codeVC.hidesBottomBarWhenPushed = true 79 | navigationController?.pushViewController(codeVC, animated: true) 80 | } 81 | } 82 | 83 | extension HistoryViewController: UITableViewDataSource { 84 | func numberOfSections(in tableView: UITableView) -> Int { 85 | return 1 86 | } 87 | 88 | func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 89 | return recentList.count 90 | } 91 | 92 | 93 | func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 94 | let cell = tableView.dequeueReusableCell(withIdentifier: CellIdentifier, for: indexPath) as! RecentFileCell 95 | 96 | let recent = recentList[(indexPath as NSIndexPath).row] 97 | cell.fileNameLabel.text = recent.file.name 98 | cell.ownerRepoLabel.text = recent.ownerName + " / " + recent.repoName 99 | 100 | return cell 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /CodeReader/View/InsetsLabel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // InsetsLabel.swift 3 | // CodeReader 4 | // 5 | // Created by vulgur on 2016/10/20. 6 | // Copyright © 2016年 MAD. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @IBDesignable class InsetsLabel: UILabel { 12 | @IBInspectable var topInsets: CGFloat = 0.0 13 | @IBInspectable var bottomInsets: CGFloat = 0.0 14 | @IBInspectable var leftInsets: CGFloat = 5.0 15 | @IBInspectable var rightInsets: CGFloat = 5.0 16 | 17 | var insets: UIEdgeInsets { 18 | get { 19 | return UIEdgeInsetsMake(topInsets, leftInsets, bottomInsets, rightInsets) 20 | } 21 | set { 22 | topInsets = newValue.top 23 | bottomInsets = newValue.bottom 24 | leftInsets = newValue.left 25 | rightInsets = newValue.right 26 | } 27 | } 28 | 29 | override func drawText(in rect: CGRect) { 30 | let insects = UIEdgeInsets.init(top:topInsets, left: leftInsets, bottom: bottomInsets, right: rightInsets) 31 | super.drawText(in: UIEdgeInsetsInsetRect(rect, insects)) 32 | } 33 | 34 | override func sizeThatFits(_ size: CGSize) -> CGSize { 35 | var newSize = super.sizeThatFits(size) 36 | newSize.width += leftInsets + rightInsets 37 | newSize.height += topInsets + bottomInsets 38 | return newSize 39 | } 40 | 41 | override var intrinsicContentSize : CGSize { 42 | var contentSize = super.intrinsicContentSize 43 | contentSize.width += leftInsets + rightInsets 44 | contentSize.height += topInsets + bottomInsets 45 | return contentSize 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /CodeReader/View/RecentFileCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RecentFileCell.swift 3 | // CodeReader 4 | // 5 | // Created by vulgur on 16/6/23. 6 | // Copyright © 2016年 MAD. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class RecentFileCell: UITableViewCell { 12 | 13 | @IBOutlet var fileNameLabel: UILabel! 14 | @IBOutlet var ownerRepoLabel: UILabel! 15 | 16 | override func awakeFromNib() { 17 | super.awakeFromNib() 18 | // Initialization code 19 | } 20 | 21 | override func setSelected(_ selected: Bool, animated: Bool) { 22 | super.setSelected(selected, animated: animated) 23 | 24 | // Configure the view for the selected state 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /CodeReader/View/RecentFileCell.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 22 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /CodeReader/View/SearchRepoCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SearchRepoCell.swift 3 | // CodeReader 4 | // 5 | // Created by vulgur on 16/5/10. 6 | // Copyright © 2016年 MAD. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class SearchRepoCell: UITableViewCell { 12 | 13 | @IBOutlet var ownerAvatarImageView: UIImageView! 14 | @IBOutlet var repoNameLabel: UILabel! 15 | @IBOutlet var repoDescriptionLabel: UILabel! 16 | @IBOutlet var repoStarsLabel: UILabel! 17 | @IBOutlet var repoForksLabel: UILabel! 18 | 19 | override func awakeFromNib() { 20 | super.awakeFromNib() 21 | // Initialization code 22 | ownerAvatarImageView.layer.masksToBounds = true 23 | ownerAvatarImageView.layer.cornerRadius = 20 24 | // ownerAvatarImageView.layer.borderColor = UIColor.blackColor().CGColor 25 | // ownerAvatarImageView.layer.borderWidth = 1 26 | repoNameLabel.textColor = UIColor.black 27 | } 28 | 29 | override func setSelected(_ selected: Bool, animated: Bool) { 30 | super.setSelected(selected, animated: animated) 31 | 32 | // Configure the view for the selected state 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /CodeReader/View/ThemeCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ThemeCell.swift 3 | // CodeReader 4 | // 5 | // Created by vulgur on 16/6/11. 6 | // Copyright © 2016年 MAD. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class ThemeCell: UITableViewCell { 12 | 13 | @IBOutlet var lockImageView: UIImageView! 14 | @IBOutlet var nameLabel: UILabel! 15 | @IBOutlet var colorView1: UIView! 16 | @IBOutlet var colorView2: UIView! 17 | @IBOutlet var colorView3: UIView! 18 | @IBOutlet var colorView4: UIView! 19 | 20 | override func awakeFromNib() { 21 | super.awakeFromNib() 22 | // Initialization code 23 | } 24 | 25 | override func setSelected(_ selected: Bool, animated: Bool) { 26 | super.setSelected(selected, animated: animated) 27 | 28 | // Configure the view for the selected state 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /CodeReader/View/ThemeListViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ThemeListViewController.swift 3 | // CodeReader 4 | // 5 | // Created by vulgur on 16/6/11. 6 | // Copyright © 2016年 MAD. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import Crashlytics 11 | 12 | class ThemeListViewController: UITableViewController { 13 | let viewModel = ThemeViewModel() 14 | var selectedTheme: Theme? 15 | 16 | override func viewDidLoad() { 17 | super.viewDidLoad() 18 | 19 | tableView.register(UINib.init(nibName: "ThemeCell", bundle: nil), forCellReuseIdentifier: "Theme") 20 | tableView.reloadData() 21 | Answers.logCustomEvent(withName: "Show Theme List", customAttributes: nil) 22 | } 23 | 24 | override func didReceiveMemoryWarning() { 25 | super.didReceiveMemoryWarning() 26 | // Dispose of any resources that can be recreated. 27 | } 28 | 29 | // MARK: - Table view data source 30 | 31 | override func numberOfSections(in tableView: UITableView) -> Int { 32 | return viewModel.themes.count 33 | } 34 | 35 | override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 36 | return 1 37 | } 38 | 39 | override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 40 | let cell = tableView.dequeueReusableCell(withIdentifier: "Theme", for: indexPath) as! ThemeCell 41 | let theme = viewModel.themes[(indexPath as NSIndexPath).section] 42 | if theme.isPurchased || DonationProduct.store.isProductPurchased(DonationProduct.BuyMeACoffee) { 43 | cell.lockImageView.isHidden = true 44 | } else { 45 | cell.lockImageView.isHidden = false 46 | } 47 | cell.contentView.backgroundColor = theme.colors[0] 48 | cell.nameLabel.text = theme.name 49 | cell.nameLabel.textColor = theme.colors[1] 50 | cell.colorView1.backgroundColor = theme.colors[2] 51 | cell.colorView2.backgroundColor = theme.colors[3] 52 | cell.colorView3.backgroundColor = theme.colors[4] 53 | cell.colorView4.backgroundColor = theme.colors[5] 54 | return cell 55 | } 56 | 57 | override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 58 | let theme = viewModel.themes[(indexPath as NSIndexPath).section] 59 | if theme.isPurchased || DonationProduct.store.isProductPurchased(DonationProduct.BuyMeACoffee) { 60 | performSegue(withIdentifier: "ChangeTheme", sender: indexPath) 61 | } else { 62 | let alertController = UIAlertController(title: "", message: "Please buy me a coffee to unlock all themes", preferredStyle: .alert) 63 | let alertAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: { (_) in 64 | _ = self.navigationController?.popViewController(animated: true) 65 | }) 66 | alertController.addAction(alertAction) 67 | self.present(alertController, animated: true, completion: nil) 68 | tableView.deselectRow(at: indexPath, animated: true) 69 | } 70 | } 71 | override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 72 | if segue.identifier == "ChangeTheme" { 73 | if let indexPath = sender as? IndexPath{ 74 | selectedTheme = viewModel.themes[(indexPath as NSIndexPath).section] 75 | UserDefaults.standard.set(selectedTheme?.name, forKey: "default_theme") 76 | Answers.logCustomEvent(withName: "Change Theme", customAttributes: ["theme": selectedTheme?.name ?? "error"]) 77 | } 78 | } 79 | } 80 | 81 | } 82 | -------------------------------------------------------------------------------- /CodeReader/ViewModel/BranchListViewModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BranchListViewModel.swift 3 | // CodeReader 4 | // 5 | // Created by vulgur on 16/9/6. 6 | // Copyright © 2016年 MAD. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import Alamofire 11 | import ObjectMapper 12 | import AlamofireObjectMapper 13 | import RxSwift 14 | import RxCocoa 15 | import RxDataSources 16 | 17 | struct BranchSection { 18 | var items: [Branch] 19 | } 20 | 21 | extension BranchSection: SectionModelType { 22 | typealias Item = Branch 23 | init(original: BranchSection, items: [Item]) { 24 | self = original 25 | self.items = items 26 | } 27 | } 28 | 29 | class BranchListViewModel { 30 | 31 | let dataSource = RxTableViewSectionedReloadDataSource() 32 | 33 | // var branches = Variable<[Branch]>([]) 34 | var ownerName: String! 35 | var repoName: String! 36 | let disposeBag = DisposeBag() 37 | 38 | init(ownerName: String, repoName: String) { 39 | 40 | self.ownerName = ownerName 41 | self.repoName = repoName 42 | 43 | // loadBranches().subscribe(onNext: { (branches) in 44 | // self.branches.value = branches 45 | // }, onError: { error in 46 | // log.error("Error in loading branches: \(error)") 47 | // }) 48 | // .addDisposableTo(disposeBag) 49 | } 50 | 51 | 52 | func loadLatestCommit(urlString: String) -> Observable { 53 | return Observable.create({ (observer) -> Disposable in 54 | let request = Alamofire.request(urlString).responseObject { (response: DataResponse) in 55 | if let commit = response.result.value { 56 | observer.onNext(commit) 57 | observer.onCompleted() 58 | } else if let error = response.result.error { 59 | observer.onError(error) 60 | } 61 | } 62 | return Disposables.create { 63 | log.info("dipose request: \(request)") 64 | } 65 | }) 66 | } 67 | 68 | func loadBranches() -> Observable<[Branch]> { 69 | let url = "https://api.github.com/repos/\(ownerName!)/\(repoName!)/branches" 70 | 71 | return Observable.create({ (observer) -> Disposable in 72 | let request = Alamofire.request(url) 73 | .responseArray(completionHandler: { (response: DataResponse<[Branch]>) in 74 | if let branches = response.result.value { 75 | observer.onNext(branches) 76 | observer.onCompleted() 77 | } else if let error = response.result.error{ 78 | observer.onError(error) 79 | } 80 | 81 | }) 82 | return Disposables.create { 83 | log.info("dispose request: \(request)") 84 | } 85 | }) 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /CodeReader/ViewModel/CommitFileListViewModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CommitFileListViewModel.swift 3 | // CodeReader 4 | // 5 | // Created by vulgur on 2016/11/14. 6 | // Copyright © 2016年 MAD. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Alamofire 11 | import ObjectMapper 12 | import RxSwift 13 | import RxCocoa 14 | 15 | class CommitFileListViewModel { 16 | 17 | var commitFiles = Variable<[CommitFile]>([]) 18 | 19 | var apiURLString: String? 20 | 21 | init(apiURLString: String) { 22 | self.apiURLString = apiURLString 23 | } 24 | 25 | func loadCommitFileList() -> Observable<[CommitFile]> { 26 | return Observable.create({ (observer) -> Disposable in 27 | guard let url = self.apiURLString else { 28 | return Disposables.create { 29 | log.error("invalid url string") 30 | } 31 | } 32 | let request = Alamofire.request(url) 33 | .responseObject(completionHandler: { (response: DataResponse) in 34 | if let commit = response.result.value { 35 | // self.commitFiles.value.append(contentsOf: commit.files) 36 | observer.onNext(commit.files) 37 | observer.onCompleted() 38 | } else if let error = response.result.error { 39 | observer.onError(error) 40 | } 41 | }) 42 | 43 | return Disposables.create { 44 | log.info("dispose request: \(request)") 45 | } 46 | }) 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /CodeReader/ViewModel/CommitListViewModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CommitListViewModel.swift 3 | // CodeReader 4 | // 5 | // Created by vulgur on 16/9/5. 6 | // Copyright © 2016年 MAD. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Alamofire 11 | import ObjectMapper 12 | import RxSwift 13 | import RxCocoa 14 | 15 | class CommitListViewModel { 16 | 17 | var commits = Variable<[CommitItem]>([]) 18 | let apiURLString: String? 19 | 20 | var page = 1 21 | 22 | init(apiURLString: String) { 23 | self.apiURLString = apiURLString 24 | self.page = 1 25 | } 26 | 27 | func loadCommitList() -> Observable<[CommitItem]> { 28 | return Observable.create({ (observer) -> Disposable in 29 | guard let url = self.apiURLString else { 30 | return Disposables.create { 31 | log.error("wrong url") 32 | } 33 | } 34 | let apiURL = url + "&page=" + "\(self.page)" 35 | let request = Alamofire.request(apiURL) 36 | .responseArray(completionHandler: { (response: DataResponse<[CommitItem]>) in 37 | if let items = response.result.value { 38 | observer.onNext(items) 39 | observer.onCompleted() 40 | self.page += 1 41 | } else if let error = response.result.error { 42 | observer.onError(error) 43 | } 44 | }) 45 | return Disposables.create { 46 | log.info("dispose request: \(request)") 47 | } 48 | }) 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /CodeReader/ViewModel/RepoViewModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RepoViewModel.swift 3 | // CodeReader 4 | // 5 | // Created by vulgur on 16/5/18. 6 | // Copyright © 2016年 MAD. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Alamofire 11 | import RxSwift 12 | //import RxCocoa 13 | 14 | class RepoViewModel { 15 | let avatarImageURLString = Variable("") 16 | let name = Variable("") 17 | let description = Variable("") 18 | let stars = Variable(0) 19 | let watchers = Variable(0) 20 | let forks = Variable(0) 21 | let owner = Variable(User()) 22 | let createdDate = Variable("") 23 | let updatedDate = Variable("") 24 | let language = Variable("") 25 | let ownerName = Variable("") 26 | let fullName = Variable("") 27 | let size = Variable(0) 28 | 29 | init(repo: Repo) { 30 | avatarImageURLString.value = (repo.owner?.avatarURLString)! 31 | name.value = repo.name ?? "" 32 | description.value = repo.description ?? "" 33 | stars.value = repo.starsCount ?? 0 34 | watchers.value = repo.watchersCount ?? 0 35 | forks.value = repo.forksCount ?? 0 36 | owner.value = repo.owner! 37 | createdDate.value = repo.createdDate ?? "" 38 | updatedDate.value = repo.pushedDate ?? "" 39 | language.value = repo.language ?? "Unknown" 40 | ownerName.value = repo.owner!.loginName ?? "" 41 | size.value = repo.size ?? 0 42 | fullName.value = repo.fullName ?? "" 43 | } 44 | 45 | 46 | func fetchWatchers() { 47 | let url = String(format: "https://api.github.com/repos/%@/%@/subscribers", 48 | owner.value.loginName!, name.value) 49 | Alamofire.request(url).responseJSON { (response) in 50 | if let watchers = response.result.value as? NSArray { 51 | self.watchers.value = watchers.count 52 | } 53 | } 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /CodeReader/ViewModel/ThemeViewModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ThemeViewModel.swift 3 | // CodeReader 4 | // 5 | // Created by vulgur on 16/6/11. 6 | // Copyright © 2016年 MAD. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class ThemeViewModel { 12 | var themes = [Theme]() 13 | init() { 14 | themes = ThemeFactory.themes() 15 | } 16 | // let name = Observable("") 17 | // let keywordColor = Observable(UIColor.blackColor()) // colors[0] 18 | // let backgroundColor = Observable(UIColor.whiteColor()) // colors[1] 19 | // let color1 = Observable(UIColor.whiteColor()) // colors[2] 20 | // let color2 = Observable(UIColor.whiteColor()) // colors[3] 21 | // let color3 = Observable(UIColor.whiteColor()) // colors[4] 22 | // let color4 = Observable(UIColor.whiteColor()) // colors[5] 23 | // 24 | // init(theme: Theme) { 25 | // name.value = theme.name 26 | // keywordColor.value = theme.colors[0] ?? UIColor.blackColor() 27 | // backgroundColor.value = theme.colors[1] ?? UIColor.blackColor() 28 | // color1.value = theme.colors[2] ?? UIColor.blackColor() 29 | // color2.value = theme.colors[3] ?? UIColor.blackColor() 30 | // color3.value = theme.colors[4] ?? UIColor.blackColor() 31 | // color4.value = theme.colors[5] ?? UIColor.blackColor() 32 | // } 33 | } 34 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Wang Shudao 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Sources 2 | 3 | ![Logo](logo.png) 4 | 5 | App Store: [http://itunes.apple.com/app/id1125732186](http://itunes.apple.com/app/id1125732186) 6 | ### What's New in version 1.2.1 7 | 1. Support viewing commits(branches, file changes, patches) 8 | 2. Use RxSwift 9 | 3. Bugfix and UI improvement 10 | 11 | ### What's New in Version 1.1 12 | 1. New icon 13 | 2. Complexion reduction UI style 14 | 3. Add files to favorites 15 | 4. Add Tomorrow themes 16 | 5. Support screen rotation 17 | 18 | ### Description 19 | 20 | Sources is a simplified github client for reading the source code easily and comfortably. 21 | 22 | Repos can be searched and sorted by stars, forks, latest updated time or just best matched. Sources presents the README in front of you along with other important metrics of the repo. 23 | 24 | Aim for reading and studying the source code with ease, Sources provides you whole code file with plenty of colorful syntax highlight themes and a recent list for reviewing the code, just like you view the code in any IDE or editor on your computer. 25 | 26 | Plus, Sources offers several paid features, such as saving the recent items when app enters into background, storing more recent items and unlocking more wonderful themes. 27 | 28 | In addition to the paid feature mentioned, you can unlock all the paid features in the future versions which will include: 29 | 30 | - change fonts 31 | - download repos or single files 32 | - show line numbers 33 | - and more stunning features 34 | 35 | All of above will available after you buy me a coffee! 36 | 37 | If you have advices and suggestions or want more features, please let me know about what you think: 38 | - Sina Weibo: iVulgur 39 | - Twitter: iVulgur 40 | - Email: shudao.wang@me.com 41 | -------------------------------------------------------------------------------- /fix_carthage.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | for plist in ./Carthage/Build/iOS/*/*.plist ; do 4 | if [ -e "$plist" ] ; then # Check whether file exists. 5 | plutil -replace 'CFBundleShortVersionString' -string $1 $plist 6 | fi 7 | done 8 | -------------------------------------------------------------------------------- /logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vulgur/Sources/5b99855d8cb09ac2e68f8ca617c8045130d9648b/logo.png -------------------------------------------------------------------------------- /scripts/set_build_number.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | git=$(sh /etc/profile; which git) 4 | number_of_commits=$("$git" rev-list HEAD --count) 5 | git_release_version=$("$git" describe --tags --always --abbrev=0) 6 | 7 | target_plist="$TARGET_BUILD_DIR/$INFOPLIST_PATH" 8 | dsym_plist="$DWARF_DSYM_FOLDER_PATH/$DWARF_DSYM_FILE_NAME/Contents/Info.plist" 9 | 10 | for plist in "$target_plist" "$dsym_plist"; do 11 | if [ -f "$plist" ]; then 12 | /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $number_of_commits" "$plist" 13 | /usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString ${git_release_version#*v}" "$plist" 14 | fi 15 | done 16 | --------------------------------------------------------------------------------