[
  {
    "path": ".gitignore",
    "content": "#########################\n# .gitignore file for Xcode4 / OS X Source projects\n#\n# Version 2.1\n# For latest version, see: http://stackoverflow.com/questions/49478/git-ignore-file-for-xcode-projects\n#\n# 2013 updates:\n# - fixed the broken \"save personal Schemes\"\n# - added line-by-line explanations for EVERYTHING (some were missing)\n#\n# NB: if you are storing \"built\" products, this WILL NOT WORK,\n# and you should use a different .gitignore (or none at all)\n# This file is for SOURCE projects, where there are many extra\n# files that we want to exclude\n#\n#########################\n\n#####\n# OS X temporary files that should never be committed\n#\n# c.f. http://www.westwind.com/reference/os-x/invisibles.html\n\n.DS_Store\n\n# c.f. http://www.westwind.com/reference/os-x/invisibles.html\n\n.Trashes\n\n# c.f. http://www.westwind.com/reference/os-x/invisibles.html\n\n*.swp\n\n# *.lock - this is used and abused by many editors for many different things.\n#    For the main ones I use (e.g. Eclipse), it should be excluded \n#    from source-control, but YMMV\n\n*.lock\n\n#\n# profile - REMOVED temporarily (on double-checking, this seems incorrect; I can't find it in OS X docs?)\n#profile\n\n\n####\n# Xcode temporary files that should never be committed\n# \n# NB: NIB/XIB files still exist even on Storyboard projects, so we want this...\n\n*~.nib\n\n\n####\n# Xcode build files -\n#\n# NB: slash on the end, so we only remove the FOLDER, not any files that were badly named \"DerivedData\"\n\nDerivedData/\n\n# NB: slash on the end, so we only remove the FOLDER, not any files that were badly named \"build\"\n\nbuild/\n\n\n#####\n# Xcode private settings (window sizes, bookmarks, breakpoints, custom executables, smart groups)\n#\n# This is complicated:\n#\n# SOMETIMES you need to put this file in version control.\n# Apple designed it poorly - if you use \"custom executables\", they are\n#  saved in this file.\n# 99% of projects do NOT use those, so they do NOT want to version control this file.\n#  ..but if you're in the 1%, comment out the line \"*.pbxuser\"\n\n# .pbxuser: http://lists.apple.com/archives/xcode-users/2004/Jan/msg00193.html\n\n*.pbxuser\n\n# .mode1v3: http://lists.apple.com/archives/xcode-users/2007/Oct/msg00465.html\n\n*.mode1v3\n\n# .mode2v3: http://lists.apple.com/archives/xcode-users/2007/Oct/msg00465.html\n\n*.mode2v3\n\n# .perspectivev3: http://stackoverflow.com/questions/5223297/xcode-projects-what-is-a-perspectivev3-file\n\n*.perspectivev3\n\n#    NB: also, whitelist the default ones, some projects need to use these\n!default.pbxuser\n!default.mode1v3\n!default.mode2v3\n!default.perspectivev3\n\n\n####\n# Xcode 4 - semi-personal settings\n#\n#\n# OPTION 1: ---------------------------------\n#     throw away ALL personal settings (including custom schemes!\n#     - unless they are \"shared\")\n#\n# NB: this is exclusive with OPTION 2 below\nxcuserdata\n\n# OPTION 2: ---------------------------------\n#     get rid of ALL personal settings, but KEEP SOME OF THEM\n#     - NB: you must manually uncomment the bits you want to keep\n#\n# NB: this *requires* git v1.8.2 or above; you may need to upgrade to latest OS X,\n#    or manually install git over the top of the OS X version\n# NB: this is exclusive with OPTION 1 above\n#\n#xcuserdata/**/*\n\n#     (requires option 2 above): Personal Schemes\n#\n#!xcuserdata/**/xcschemes/*\n\n####\n# XCode 4 workspaces - more detailed\n#\n# Workspaces are important! They are a core feature of Xcode - don't exclude them :)\n#\n# Workspace layout is quite spammy. For reference:\n#\n# /(root)/\n#   /(project-name).xcodeproj/\n#     project.pbxproj\n#     /project.xcworkspace/\n#       contents.xcworkspacedata\n#       /xcuserdata/\n#         /(your name)/xcuserdatad/\n#           UserInterfaceState.xcuserstate\n#     /xcsshareddata/\n#       /xcschemes/\n#         (shared scheme name).xcscheme\n#     /xcuserdata/\n#       /(your name)/xcuserdatad/\n#         (private scheme).xcscheme\n#         xcschememanagement.plist\n#\n#\n\n####\n# Xcode 4 - Deprecated classes\n#\n# Allegedly, if you manually \"deprecate\" your classes, they get moved here.\n#\n# We're using source-control, so this is a \"feature\" that we do not want!\n\n*.moved-aside\n\n####\n# UNKNOWN: recommended by others, but I can't discover what these files are\n#\n# ...none. Everything is now explained.\n\n/VVDocumenter-Xcode.xcodeproj/project.xcworkspace/xcshareddata/\n.idea\n"
  },
  {
    "path": ".travis.yml",
    "content": "language: objective-c\nxcode_project: VVDocumenter-Xcode.xcodeproj\nxcode_scheme: VVDocumenter-Xcode\n"
  },
  {
    "path": "LICENSE",
    "content": "Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# VVDocumenter-Xcode [![Build Status](https://api.travis-ci.org/onevcat/VVDocumenter-Xcode.svg)](https://travis-ci.org/onevcat/VVDocumenter-Xcode) <a href=\"https://flattr.com/submit/auto?user_id=onevcat&url=https%3A%2F%2Fgithub.com%2Fonevcat%2FVVDocumenter-Xcode\" target=\"_blank\"><img src=\"http://api.flattr.com/button/flattr-badge-large.png\" alt=\"Flattr this\" title=\"Flattr this\" border=\"0\"></a>\n---\n\n# Goodbye World\n\nIn Xcode 8, Apple integrated a comment documentation generator plugin, which is built on top of VVDocumenter. Now this project is proud to be a part of Apple. It means you could just use the shortcut (⌥ Option + ⌘ Command + /) to add a documentation comment to your code if you are using Xcode 8 or above!\n\nVVDocumenter is one of my hobby projects [from 2013](https://github.com/onevcat/VVDocumenter-Xcode/commit/6a2b604713c9fb573e229daece8286dac68ac24a), back to the age of Xcode 4. It serves well for these years and I am so glad that it helps a lot of developers to improve their productivity. Since there is no need to install this plugin anymore, the development of VVDocumenter will not continue. Yes, it's time to say goodbye, with a happy ending.\n\nThank you all for your selfless support to this project. Let's build more great things and make the world better in future!\n\n## What is this?\n\nWriting documentation is so important for developing, but it is really painful with Xcode. Think about how much time you are wasting in pressing '*' or '/', and typing the parameters again and again. Now, you can find the method (or any code) you want to document to, and type in `///`, the document will be generated for you and all params and return will be extracted into a Javadoc style, which is compatible with [appledoc](https://github.com/tomaz/appledoc), [Doxygen](http://www.stack.nl/~dimitri/doxygen/) and [HeaderDoc](https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/HeaderDoc/intro/intro.html). You can just fill the inline placeholder tokens to finish your document.\n\nHere is an image which can show what it exactly does. \n\n![Screenshot](https://raw.github.com/onevcat/VVDocumenter-Xcode/master/ScreenShot.gif)\n\n> By the way, it also supports [Swift](https://developer.apple.com/swift/) now. Cheers!\n\n![Screenshot](https://raw.github.com/onevcat/VVDocumenter-Xcode/master/vvdocumenter-swift.gif)\n\n## How to install and use?\n\nThe best way of installing is by [Alcatraz](http://alcatraz.io). Install Alcatraz followed by the instruction, restart your Xcode and press `⇧⌘9`. You can find `VVDocumenter-Xcode` in the list and click the icon on left to install.\n\nIf you do not like the Alcatraz way, you can also clone the repo. Then build the `VVDocumenter-Xcode` target in the Xcode project and the plug-in will automatically be installed in `~/Library/Application Support/Developer/Shared/Xcode/Plug-ins`. Relaunch Xcode and type in `///` above any code you want to write a document to.\n\nIf you want to use other text beside of `///` to trigger the document insertion, you can find a setting panel by clicking `VVDocument` in the Window menu of Xcode. You can also find some other useful options there, including setting using spaces instead of tab in the panel or changing the format of generated documentation.\n\n## Xcode version?\n\nThis plug-in is supported in Xcode 5, 6 and 7. From Xcode 5, Apple added a UUID-verification to all plugins to ensure the stability when Xcode gets updated. The value of `DVTPlugInCompatibilityUUIDs` in project plist should contains current UUID of Xcode version, or the plugin does not work. And from Xcode 6.3, you will be prompt to \"Load third party bundle\" if you are using a plugin. You should always select \"Load bundles\" to enable this plugin.\n\nAll plugins will be disabled once you update your Xcode, since the supported UUIDs in the plugins do not contain the one. You should try to clean your plugins folder (`~/Library/Application Support/Developer/Shared/Xcode/Plug-ins` by default) and clone/build the latest version from master branch. If you happened to skip the bundle loading, you can use this to reset the prompt:\n\n```bash\ndefaults delete com.apple.dt.Xcode DVTPlugInManagerNonApplePlugIns-Xcode-{your_xcode_version}\n```\n\n**Please do not open an issue if this plugin not work in your newly updated Xcode.** Pull request for new `DVTPlugInCompatibilityUUIDs` is welcome, and if UUID of your Xcode version is already there, please try to reinstall the plugin from a clean state.\n\nThe default deployment target is 10.8. If you want to use it in a earlier OS version, you should change OS X Deployment Target (in project info setting) to your system version.\n\n## Swift Support\n\nYes, this plugin supports documentation for Swift 2 now. Check [this post](http://ericasadun.com/2015/06/14/swift-header-documentation-in-xcode-7/) to see how to write the documentation for swift. By using `VVDocumenter-Xcode`, you can just type `///` to make the magic happen.\n\nThe documentation format changed from Swift 1.x to 2. If you are using Swift 1.x, you could build from branch [Xcode6](https://github.com/onevcat/VVDocumenter-Xcode/tree/Xcode6) to get the support for the earlier format.\n\n## Limitations and Future\n\nThe plugin is using simulation of keyboard event to insert the doc comments for you. So it is depending the keyboard shortcut of Xcode. These two kinds of operation are being used:\n\n* Delete to Beginning of the Line (⌘⌫)\n* Paste (⌘V)\n\nIf you have modified these two shortcuts in your Xcode, the newset version of the plugin would not work correctly. Instead, you can use a earlier version such as [this one(commit 03c4169ff7)](https://github.com/onevcat/VVDocumenter-Xcode/tree/03c4169ff79b618b9fd3db93dd96652a522ad3e0). Be causion you may suffer an [undo and redo issue ](https://github.com/onevcat/VVDocumenter-Xcode/issues/3).\n\n`VVDocumenter-Xcode` is now using regular expression to extract things needed, which is not the best way to do such thing. A better approach could be using the AST, and I also have a plan to do it later if I have some more time :)\n\n## License\n\nVVDocumenter is published under MIT License. See the LICENSE file for more.\n\n\n"
  },
  {
    "path": "VVDocumenter-Xcode/Commenter/VVArgument.h",
    "content": "//\n//  Argument.h\n//  VVDocumenter-Xcode\n\n//\n//  Created by 王 巍 on 13-7-19.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import <Foundation/Foundation.h>\n\n@interface VVArgument : NSObject\n@property (nonatomic, copy) NSString *type;\n@property (nonatomic, copy) NSString *name;\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/Commenter/VVArgument.m",
    "content": "//\n//  Argument.m\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 13-7-19.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import \"VVArgument.h\"\n\n@implementation VVArgument\n\n-(void)setType:(NSString *)type\n{\n    if (type != _type) {\n       _type = [[[type vv_stringByReplacingRegexPattern:@\"&$\" withString:@\"\"]\n                       vv_stringByReplacingRegexPattern:@\"\\\\s*\\\\*$\" withString:@\"\"]\n                     stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];\n    }\n}\n\n-(void)setName:(NSString *)name\n{\n    if (name != _name) {\n        _name = [[[[[[[name vv_stringByReplacingRegexPattern:@\"\\\\(|\\\\)\" withString:@\"\"]\n                            vv_stringByReplacingRegexPattern:@\"^&\" withString:@\"\"]\n                            vv_stringByReplacingRegexPattern:@\"^\\\\*+\" withString:@\"\"]\n                            vv_stringByReplacingRegexPattern:@\"\\\\[.*$\" withString:@\"\"]\n                            vv_stringByReplacingRegexPattern:@\",$\" withString:@\"\"]\n                            vv_stringByReplacingRegexPattern:@\";$\" withString:@\"\"]\n                          stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];\n    }\n}\n\n- (NSString *)description {\n    return [NSString stringWithFormat:@\"%@< type: %@, name: %@>\", self.class, self.type, self.name];\n}\n\n- (BOOL)isEqual:(id)other {\n    if (other == self) {\n        return YES;\n    }\n    if ([other isKindOfClass:self.class]) {\n        return [((VVArgument *)other).type isEqualToString:self.type]\n            && [((VVArgument *)other).name isEqualToString:self.name];\n    }\n    return NO;\n}\n\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/Commenter/VVBaseCommenter.h",
    "content": "//\n//  VVBaseCommenter.h\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 13-7-17.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import <Foundation/Foundation.h>\n\n@interface VVBaseCommenter : NSObject\n\n@property (nonatomic, copy) NSString *indent;\n@property (nonatomic, copy) NSString *code;\n@property (nonatomic, strong) NSMutableArray *arguments;\n@property (nonatomic, assign) BOOL hasReturn;\n@property (nonatomic, assign) BOOL hasThrows;\n\n-(instancetype) initWithIndentString:(NSString *)indent codeString:(NSString *)code;\n\n-(NSString *) document;\n\n-(NSString *) documentForC;\n-(NSString *) documentForSwift;\n-(NSString *) documentForSwiftEnum;\n\n-(void) parseArgumentsInputArgs:(NSString *)rawArgsCode;\n\n-(BOOL) shouldComment;\n\n// Comment methods\n-(NSString *) startComment;\n-(NSString *) startCommentWithDescriptionTag:(NSString *)tag;\n-(NSString *) argumentsComment;\n-(NSString *) endComment;\n-(NSString *) returnComment;\n-(NSString *) sinceComment;\n\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/Commenter/VVBaseCommenter.m",
    "content": "//\n//  VVBaseCommenter.m\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 13-7-17.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import \"VVBaseCommenter.h\"\n#import \"VVArgument.h\"\n#import \"VVDocumenterSetting.h\"\n#import \"NSString+VVSyntax.h\"\n#import \"VVProject.h\"\n\n@interface VVBaseCommenter()\n@property (nonatomic, copy) NSString *space;\n@property (nonatomic, assign) BOOL forSwift;\n@property (nonatomic, assign) BOOL forSwiftEnum;\n@end\n\n@implementation VVBaseCommenter\n-(instancetype) initWithIndentString:(NSString *)indent codeString:(NSString *)code\n{\n    self = [super init];\n    if (self) {\n        _indent = indent;\n        _code = code;\n        _arguments = [NSMutableArray array];\n        _space = [[VVDocumenterSetting defaultSetting] spacesString];\n        _forSwift = NO;\n        _forSwiftEnum = NO;\n    }\n    return self;\n}\n\n-(NSString *) paramSymbol {\n    return self.forSwift ? @\"- parameter\" : @\"@param\";\n}\n\n-(NSString *) returnSymbol {\n    return self.forSwift ? @\"- returns:\" : @\"@return\";\n}\n\n-(NSString *) throwsSymbol {\n    return @\"- throws:\";\n}\n\n\n-(NSString *) startCommentWithDescriptionTag:(NSString *)tag {\n    NSString *authorInfo = @\"\";\n    NSString *dateInfo = @\"\";\n    \n    if ([[VVDocumenterSetting defaultSetting] useAuthorInformation]) {\n        NSMutableString *authorCotent = @\"\".mutableCopy;\n        \n        if ([[VVDocumenterSetting defaultSetting] authorInformation].length > 0) {\n            [authorCotent appendString:[[VVDocumenterSetting defaultSetting] authorInformation]];\n        }\n        \n        if ([[VVDocumenterSetting defaultSetting] useDateInformation]) {\n            NSString *formatString = [[VVDocumenterSetting defaultSetting] dateInformationFormat];\n            if ([formatString length] <= 0) {\n                formatString = @\"MM-dd-YYYY HH:MM:ss\";\n            }\n            NSDateFormatter *formatter = [[NSDateFormatter alloc] init];\n            [formatter setDateFormat:formatString];\n            \n            dateInfo = [formatter stringFromDate:[NSDate date]];\n            \n            if (self.forSwift) {\n                [authorCotent appendString: [NSString stringWithFormat:@\"\\n%@- date: %@\", self.prefixString, dateInfo]];\n            } else {\n                \n                if (authorCotent.length > 0) {\n                    [authorCotent appendString:@\", \"];\n                }\n                \n                [authorCotent appendString: dateInfo];\n            }\n            \n        }\n        \n        if (self.forSwift) {\n            authorInfo = [NSString stringWithFormat:@\"\\n%@- author: %@\\n\", self.prefixString, authorCotent];\n        } else {\n            authorInfo = [NSString stringWithFormat:@\"%@@author %@\\n%@\\n\", self.prefixString, authorCotent, self.prefixString];\n        }\n        \n    }\n    \n    if ([[VVDocumenterSetting defaultSetting] useHeaderDoc]) {\n        return [NSString stringWithFormat:@\"%@/*!\\n%@%@%@<#Description#>\\n\", self.indent, authorInfo, self.prefixString, tag];\n    } else if ([[VVDocumenterSetting defaultSetting] prefixWithSlashes]) {\n        return [NSString stringWithFormat:@\"%@%@%@<#Description#>\\n\", self.prefixString, authorInfo, tag];\n    } else {\n        \n        if (self.forSwift){\n            return [NSString stringWithFormat:@\"%@/**\\n%@%@<#Description#>\\n%@\", self.indent, self.prefixString, tag, authorInfo];\n        } else {\n            return [NSString stringWithFormat:@\"%@/**\\n%@%@%@<#Description#>\\n\", self.indent, authorInfo, self.prefixString, tag];\n        }\n        \n    }\n}\n\n-(NSString *) startComment\n{\n    NSString *descriptionTag =\n    [[VVDocumenterSetting defaultSetting] briefDescription] && !self.forSwift ? @\"@brief \" : @\"\";\n    return [self startCommentWithDescriptionTag:descriptionTag];\n}\n\n-(NSString *) argumentsComment\n{\n    if (self.arguments.count == 0)\n        return @\"\";\n\n    // start off with an empty line\n    NSMutableString *result = [NSMutableString stringWithFormat:@\"%@\", self.emptyLine];\n\n    int longestNameLength = [[self.arguments valueForKeyPath:@\"@max.name.length\"] intValue];\n    BOOL useSpace = [[VVDocumenterSetting defaultSetting] useSpaces];\n    \n    for (VVArgument *arg in self.arguments) {\n        NSString *name = arg.name;\n\n        if ([[VVDocumenterSetting defaultSetting] alignArgumentComments]) {\n            if (self.forSwiftEnum) {\n                if (useSpace) {\n                    name = [[name stringByAppendingString:@\":\"] stringByPaddingToLength:longestNameLength + 1 withString:@\" \" startingAtIndex:0];\n                } else {\n                    NSInteger tabSpaceRateCount = [[VVDocumenterSetting defaultSetting] spaceCount];\n                    NSInteger neededTabCount = (longestNameLength + tabSpaceRateCount - name.length) / tabSpaceRateCount - 1;\n                    name = [[name stringByAppendingString:@\":\"] stringByPaddingToLength:(name.length + 1 + neededTabCount) withString:@\"\\t\" startingAtIndex:0];\n                }\n            } else {\n                if (self.forSwift) {\n                    name = [name stringByAppendingString:@\":\"];\n                    if (useSpace) {\n                        name = [name stringByPaddingToLength:longestNameLength + 1 withString:@\" \" startingAtIndex:0];\n                    } else {\n                        NSInteger tabSpaceRateCount = [[VVDocumenterSetting defaultSetting] spaceCount];\n                        NSInteger neededTabCount = (longestNameLength + 1 + tabSpaceRateCount - name.length) / tabSpaceRateCount - 1;\n                        name = [name stringByPaddingToLength:(name.length + neededTabCount) withString:@\"\\t\" startingAtIndex:0];\n                    }\n                } else {\n                    if (useSpace) {\n                        name = [name stringByPaddingToLength:longestNameLength withString:@\" \" startingAtIndex:0];\n                    } else {\n                        NSInteger tabSpaceRateCount = [[VVDocumenterSetting defaultSetting] spaceCount];\n                        NSInteger neededTabCount = (longestNameLength + tabSpaceRateCount - name.length) / tabSpaceRateCount - 1;\n                        name = [name stringByPaddingToLength:(name.length + neededTabCount) withString:@\"\\t\" startingAtIndex:0];\n                    }\n                }\n            }\n        }\n        else {\n            if (self.forSwiftEnum || self.forSwift) {\n                name = [name stringByAppendingString:@\":\"];\n            }\n        }\n\n        NSString *indentString = useSpace ? @\" \" : @\"\\t\";\n        if (self.forSwiftEnum) {\n            [result appendFormat:@\"%@- %@%@<#%@ description#>\\n\", self.prefixString, name, indentString, arg.name];\n        } else {\n            [result appendFormat:@\"%@%@ %@%@<#%@ description#>\\n\", self.prefixString, [self paramSymbol], name, indentString, arg.name];\n        }\n\n    }\n    return result;\n}\n\n-(NSString *) returnComment\n{\n    if (!self.hasReturn) {\n        return @\"\";\n    } else {\n        return [NSString stringWithFormat:@\"%@%@%@ <#return value description#>\\n\", self.emptyLine, self.prefixString, [self returnSymbol]];\n    }\n}\n\n-(NSString *) throwsComment\n{\n    if (!self.hasThrows) {\n        return @\"\";\n    } else {\n        return [NSString stringWithFormat:@\"%@%@%@ <#throws value description#>\\n\", self.emptyLine, self.prefixString, [self throwsSymbol]];\n    }\n}\n\n-(NSString *) sinceComment\n{\n    //It seems no since attribute for swift? Maybe I am wrong.\n    VVProject *project = [VVProject projectForKeyWindow];\n    \n    if (!self.forSwift && [[VVDocumenterSetting defaultSetting] addSinceToComments]) {\n\n        VVDSinceOption sinceOption = [[VVDocumenterSetting defaultSetting] sinceOption];\n\n        switch (sinceOption) {\n            case VVDSinceOptionPlaceholder: {\n\n                return [NSString stringWithFormat:@\"%@%@@since <#version number#>\\n\", self.emptyLine, self.prefixString];\n                break;\n            }\n            case VVDSinceOptionProjectVersion: {\n\n                if (project.projectVersion && project.projectVersion.length>0) {\n\n                    return [NSString stringWithFormat:@\"%@%@@since <#%@#>\\n\", self.emptyLine, self.prefixString,project.projectVersion];\n                }else{\n                    // Fall back onto default placeholder if no project version can be obtained.\n                    return [NSString stringWithFormat:@\"%@%@@since <#version number#>\\n\", self.emptyLine, self.prefixString];\n                }\n\n                break;\n            }\n            case VVDSinceOptionSpecificVersion: {\n\n                NSString *version = [[VVDocumenterSetting defaultSetting] sinceVersion];\n                if (version && version.length>0) {\n\n                    return [NSString stringWithFormat:@\"%@%@@since <#%@#>\\n\", self.emptyLine, self.prefixString, version];\n                }else{\n                    // Fall back onto default placeholder if no version can be obtained.\n                    return [NSString stringWithFormat:@\"%@%@@since <#version number#>\\n\", self.emptyLine, self.prefixString];\n                }\n                break;\n            }\n        }\n    } else {\n        return @\"\";\n    }\n}\n\n-(NSString *) endComment\n{\n    if ([[VVDocumenterSetting defaultSetting] prefixWithSlashes]) {\n        return @\"\";\n    } else {\n        return [NSString stringWithFormat:@\"%@ */\",self.indent];\n    }\n}\n\n-(NSString *) documentForSwift\n{\n    self.forSwift = YES;\n    return [self __document];\n}\n\n-(NSString *) documentForSwiftEnum\n{\n    self.forSwiftEnum = YES;\n    self.forSwift = YES;\n    return [self __document];\n}\n\n-(NSString *) documentForC\n{\n    self.forSwift = NO;\n    return [self __document];\n}\n\n-(NSString *) __document\n{\n    NSString * comment = [NSString stringWithFormat:@\"%@%@%@%@%@%@\",\n                          [self startComment],\n                          [self argumentsComment],\n                          [self throwsComment],\n                          [self returnComment],\n                          [self sinceComment],\n                          [self endComment]];\n    \n    // The last line of the comment should be adjacent to the next line of code,\n    // back off the newline from the last comment component.\n    if ([[VVDocumenterSetting defaultSetting] prefixWithSlashes]) {\n        return [comment stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];\n    } else {\n        return comment;\n    }\n}\n\n-(NSString *) document\n{\n    //This is the default action\n    return [self documentForC];\n}\n\n-(NSString *) emptyLine\n{\n    if ([[VVDocumenterSetting defaultSetting] blankLinesBetweenSections]) {\n        return [[NSString stringWithFormat:@\"%@\\n\", self.prefixString] vv_stringByTrimEndSpaces];\n    } else {\n        return @\"\";\n    }\n}\n\n-(NSString *) prefixString\n{\n    if ([[VVDocumenterSetting defaultSetting] prefixWithStar] && !self.forSwift) {\n        return [NSString stringWithFormat:@\"%@ *%@\", self.indent, self.space];\n    } else if ([[VVDocumenterSetting defaultSetting] prefixWithSlashes]) {\n        return [NSString stringWithFormat:@\"%@///%@\", self.indent, self.space];\n    } else {\n        return [NSString stringWithFormat:@\"%@ \", self.indent];\n    }\n}\n\n-(void) parseArgumentsInputArgs:(NSString *)rawArgsCode\n{\n    [self.arguments removeAllObjects];\n    if (rawArgsCode.length == 0) {\n        return;\n    }\n\n    NSArray *argumentStrings = [rawArgsCode componentsSeparatedByString:@\",\"];\n    for (__strong NSString *argumentString in argumentStrings) {\n        VVArgument *arg = [[VVArgument alloc] init];\n        argumentString = [argumentString vv_stringByReplacingRegexPattern:@\"=\\\\s*\\\\w*\" withString:@\"\"];\n        argumentString = [argumentString vv_stringByReplacingRegexPattern:@\"\\\\(\" withString:@\" \"];\n        argumentString = [argumentString vv_stringByReplacingRegexPattern:@\"\\\\*\" withString:@\" \"];\n        argumentString = [argumentString vv_stringByReplacingRegexPattern:@\"\\\\s+$\" withString:@\"\"];\n        argumentString = [argumentString vv_stringByReplacingRegexPattern:@\"\\\\s+\" withString:@\" \"];\n        NSMutableArray *tempArgs = [[argumentString componentsSeparatedByString:@\" \"] mutableCopy];\n        while ([[tempArgs lastObject] isEqualToString:@\" \"]) {\n            [tempArgs removeLastObject];\n        }\n\n        arg.name = [tempArgs lastObject];\n\n        [tempArgs removeLastObject];\n        arg.type = [tempArgs componentsJoinedByString:@\" \"];\n\n        VVLog(@\"arg type: %@\", arg.type);\n        VVLog(@\"arg name: %@\", arg.name);\n\n        [self.arguments addObject:arg];\n    }\n}\n\n-(BOOL) shouldComment\n{\n    return YES;\n}\n\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/Commenter/VVCommenter.h",
    "content": "//\n//  VVCommenter.h\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 13-7-18.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#ifndef CommentTest_Commenter_h\n#define CommentTest_Commenter_h\n\n#import \"VVBaseCommenter.h\"\n#import \"VVMethodCommenter.h\"\n#import \"VVPropertyCommenter.h\"\n#import \"VVFunctionCommenter.h\"\n#import \"VVMacroCommenter.h\"\n#import \"VVEnumCommenter.h\"\n#import \"VVStructCommenter.h\"\n#import \"VVVariableCommenter.h\"\n#import \"VVArgument.h\"\n#import \"VVSwiftFunctionCommenter.h\"\n#import \"VVSwiftEnumCommenter.h\"\n#import \"VVSwiftPropertyCommenter.h\"\n#import \"VVSwiftExtensionCommenter.h\"\n\n#endif\n"
  },
  {
    "path": "VVDocumenter-Xcode/Commenter/VVEnumCommenter.h",
    "content": "//\n//  VVEnumCommenter.h\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 13-7-17.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import \"VVBaseCommenter.h\"\n\n@interface VVEnumCommenter : VVBaseCommenter\n\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/Commenter/VVEnumCommenter.m",
    "content": "//\n//  VVEnumCommenter.m\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 13-7-17.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import \"VVEnumCommenter.h\"\n\n@implementation VVEnumCommenter\n\n- (NSString *)document {\n    //Regular comment documentation\n    NSString *finalString = [NSString stringWithFormat:@\"%@%@%@\", [self startComment],\n                                                                  [self sinceComment],\n                                                                  [self endComment]];\n\n    if (![finalString hasSuffix:@\"\\n\"]) {\n        finalString = [finalString stringByAppendingString:@\"\\n\"];\n    }\n\n    // Grab everything from the start of the line to the opening brace, which\n    // may be on a different line.\n    NSString *enumDefinePattern = @\"^\\\\s*(\\\\w+\\\\s+)?NS_(ENUM|OPTIONS)[\\\\s\\\\S]*?\\\\{\";\n    \n    NSRegularExpression *enumDefineExpression = [NSRegularExpression regularExpressionWithPattern:enumDefinePattern options:0 error:nil];\n    NSTextCheckingResult *enumDefineResult = [enumDefineExpression firstMatchInString:self.code options:0 range:NSMakeRange(0, self.code.length)];\n    \n    finalString = [finalString stringByAppendingString:[self.code substringWithRange:[enumDefineResult rangeAtIndex:0]]];\n    finalString = [finalString substringToIndex:finalString.length - 1];\n    finalString = [finalString stringByAppendingString:@\" {\\n\"];\n    \n    NSString *endPattern = @\"\\\\}\\\\s*;\";\n    NSString *enumPartsString = [[self.code vv_stringByReplacingRegexPattern:enumDefinePattern withString:@\"\"]\n                                            vv_stringByReplacingRegexPattern:endPattern        withString:@\"\"];\n    NSArray *enumParts = [enumPartsString componentsSeparatedByString:@\",\"];\n    \n    for (NSString *part in enumParts) {\n        NSString *trimmedPart = [part stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];\n        //Only append when there is a enum define. (In case of the last comma, followed no define)\n        if (trimmedPart.length != 0) {\n            NSString *temp = [NSString stringWithFormat:@\"%@%@%@\", [self startCommentWithDescriptionTag:@\"\"],\n                              [self sinceComment],\n                              [self endComment]];\n\n            if ([temp hasSuffix:@\"\\n\"]) {\n                // comment has a newline suffix, so trimmedPart will go on\n                // the next line\n                temp = [temp stringByAppendingString:trimmedPart];\n            } else {\n                // comment does not have a newline suffix, so trimmedPart\n                // needs to be moved to the next line\n                temp = [temp stringByAppendingFormat:@\"\\n%@\", trimmedPart];\n            }\n\n            if (part != [enumParts lastObject]) {\n                temp = [temp stringByAppendingString:@\",\\n\"];\n            } else {\n                // since trimmedPart was used there is no trailing newline\n                temp = [temp stringByAppendingString:@\"\\n\"];\n            }\n            finalString = [finalString stringByAppendingString:temp];\n        }\n    }\n\n    return [finalString stringByAppendingString:@\"};\"];\n}\n\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/Commenter/VVFunctionCommenter.h",
    "content": "//\n//  VVFunctionCommenter.h\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 13-7-17.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import \"VVBaseCommenter.h\"\n\n@interface VVFunctionCommenter : VVBaseCommenter\n\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/Commenter/VVFunctionCommenter.m",
    "content": "//\n//  VVFunctionCommenter.m\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 13-7-17.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import \"VVFunctionCommenter.h\"\n#import \"VVArgument.h\"\n\n@implementation VVFunctionCommenter\n\n-(void) captureReturnType\n{\n    NSArray *arr = [self.code componentsSeparatedByString:@\"(\"];\n    if (arr.count > 0 && (![arr[0] vv_matchesPatternRegexPattern:@\"^\\\\s*void\\\\s*[^*]*\\\\s*\\\\w+$\"] &&\n                          ![arr[0] vv_matchesPatternRegexPattern:@\"^\\\\w+\\\\svoid\"])) {\n        self.hasReturn = YES;\n    }\n}\n\n-(void) captureParameters\n{\n    NSArray * braceGroups = [self.code vv_stringsByExtractingGroupsUsingRegexPattern:@\"\\\\(([^\\\\^].*?)\\\\)(?:__attribute__\\\\(\\\\(.*\\\\)\\\\))?\"];\n    if (braceGroups.count > 0) {\n        [self parseArgumentsInputArgs:braceGroups[0]];\n    }\n    \n    //Remove void arg in block\n    NSArray *tempArray = [NSArray arrayWithArray:self.arguments];\n    [tempArray enumerateObjectsUsingBlock:^(VVArgument *arg, NSUInteger idx, BOOL *stop) {\n        if ([arg.type isEqualToString:@\"\"] && [arg.name isEqualToString:@\"void\"]) {\n            [self.arguments removeObject:arg];\n        }\n    }];\n}\n\n-(NSString *) document\n{\n    [self captureReturnType];\n    [self captureParameters];\n    \n    return [super documentForC];\n}\n\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/Commenter/VVMacroCommenter.h",
    "content": "//\n//  VVMacroCommenter.h\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 13-7-17.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import \"VVBaseCommenter.h\"\n\n@interface VVMacroCommenter : VVBaseCommenter\n\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/Commenter/VVMacroCommenter.m",
    "content": "//\n//  VVMacroCommenter.m\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 13-7-17.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import \"VVMacroCommenter.h\"\n\n@implementation VVMacroCommenter\n\n-(void) captureReturnType\n{\n    self.hasReturn = YES;\n}\n\n-(void) captureParameters\n{\n    NSArray * braceGroups = [self.code vv_stringsByExtractingGroupsUsingRegexPattern:@\"\\\\(([^\\\\^][^\\\\(\\\\)]*)\\\\)\"];\n    if (braceGroups.count > 0) {\n        [self parseArgumentsInputArgs:braceGroups[0]];\n    }\n}\n\n-(NSString *) document\n{\n    [self captureReturnType];\n    [self captureParameters];\n    \n    return [super documentForC];\n}\n\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/Commenter/VVMethodCommenter.h",
    "content": "//\n//  VVMethodCommenter.h\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 13-7-17.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import \"VVBaseCommenter.h\"\n\n@interface VVMethodCommenter : VVBaseCommenter\n\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/Commenter/VVMethodCommenter.m",
    "content": "//\n//  VVMethodCommenter.m\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 13-7-17.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import \"VVMethodCommenter.h\"\n#import \"VVArgument.h\"\n\n@implementation VVMethodCommenter\n\n-(void) captureReturnType\n{\n    NSArray * matchedTypes = [self.code vv_stringsByExtractingGroupsUsingRegexPattern:@\"^\\\\s*[+-]\\\\s*\\\\(([^\\\\(\\\\)]*)\\\\)\"];\n\n    if (matchedTypes.count == 1) {\n        if (![matchedTypes[0] vv_matchesPatternRegexPattern:@\"^\\\\s*void\\\\s*[^*]*\\\\s*$\"] &&\n            ![matchedTypes[0] vv_matchesPatternRegexPattern:@\"^\\\\s*IBAction\\\\s*$\"]) {\n            self.hasReturn = YES;\n        }\n    }\n}\n\n-(void) captureParameters\n{\n    NSArray * matchedParams = [self.code vv_stringsByExtractingGroupsUsingRegexPattern:@\"\\\\:\\\\(([^:]+)\\\\)(\\\\w+)\"];\n    VVLog(@\"matchedParams: %@\",matchedParams);\n    for (int i = 0; i < (int)matchedParams.count - 1; i = i + 2) {\n        VVArgument *arg = [[VVArgument alloc] init];\n        arg.type = [matchedParams[i] vv_stringByReplacingRegexPattern:@\"[\\\\s*;.*]\" withString:@\"\"];\n        arg.name = [matchedParams[i + 1] vv_stringByReplacingRegexPattern:@\"[\\\\s*;.*]\" withString:@\"\"];\n        [self.arguments addObject:arg];\n    }\n}\n\n-(NSString *) document\n{\n    [self captureReturnType];\n    [self captureParameters];\n    \n    return [super documentForC];\n}\n\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/Commenter/VVPropertyCommenter.h",
    "content": "//\n//  VVPropertyCommenter.h\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 13-7-17.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import \"VVBaseCommenter.h\"\n\n@interface VVPropertyCommenter : VVBaseCommenter\n\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/Commenter/VVPropertyCommenter.m",
    "content": "//\n//  VVPropertyCommenter.m\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 13-7-17.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import \"VVPropertyCommenter.h\"\n\n@implementation VVPropertyCommenter\n\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/Commenter/VVStructCommenter.h",
    "content": "//\n//  VVStructCommenter.h\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 13-7-17.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import \"VVBaseCommenter.h\"\n\n@interface VVStructCommenter : VVBaseCommenter\n\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/Commenter/VVStructCommenter.m",
    "content": "//\n//  VVStructCommenter.m\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 13-7-17.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import \"VVStructCommenter.h\"\n\n@implementation VVStructCommenter\n\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/Commenter/VVSwiftEnumCommenter.h",
    "content": "//\n//  VVSwiftEnumCommenter.h\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 14-7-30.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import \"VVBaseCommenter.h\"\n\n@interface VVSwiftEnumCommenter : VVBaseCommenter\n\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/Commenter/VVSwiftEnumCommenter.m",
    "content": "//\n//  VVSwiftEnumCommenter.m\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 14-7-30.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import \"VVSwiftEnumCommenter.h\"\n#import \"VVArgument.h\"\n\n@implementation VVSwiftEnumCommenter\n\n-(void) captureParameters\n{\n    NSString *normalizedCode = [self.code vv_stringByReplacingRegexPattern:@\"\\\\s*\\\\n\\\\s*\" withString:@\"\\n\"];\n    NSArray *lines = [normalizedCode componentsSeparatedByString:@\"\\n\"];\n    [lines enumerateObjectsUsingBlock:^(NSString *line, NSUInteger idx, BOOL *stop) {\n        if ([line vv_matchesPatternRegexPattern:@\"^case\\\\s+\"]) {\n            NSString * plainCase = [line vv_stringByReplacingRegexPattern:@\"\\\\(.*?\\\\)\" withString:@\"\"];\n            plainCase = [[plainCase vv_stringByReplacingRegexPattern:@\"^case\\\\s+\" withString:@\"\"] vv_stringByReplacingRegexPattern:@\"\\\\s+\" withString:@\"\"];\n            NSArray *cases = [plainCase componentsSeparatedByString:@\",\"];\n            [cases enumerateObjectsUsingBlock:^(NSString *name, NSUInteger idx, BOOL *stop) {\n                NSString *plainName = [name vv_stringByReplacingRegexPattern:@\"=\\\\s*.*$\" withString:@\"\"];\n                if ([plainName hasPrefix:@\".\"]) {\n                    return;\n                }\n                VVArgument *arg = [[VVArgument alloc] init];\n                arg.name = plainName;\n                [self.arguments addObject:arg];\n            }];\n        }\n    }];\n}\n\n-(NSString *) document\n{\n    [self captureParameters];\n    return [super documentForSwiftEnum];\n}\n\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/Commenter/VVSwiftExtensionCommenter.h",
    "content": "//\n//  VVSwiftExtensionCommenter.h\n//  VVDocumenter-Xcode\n//\n//  Created by WANG WEI on 2015/06/17.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import \"VVBaseCommenter.h\"\n\n@interface VVSwiftExtensionCommenter : VVBaseCommenter\n\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/Commenter/VVSwiftExtensionCommenter.m",
    "content": "//\n//  VVSwiftExtensionCommenter.m\n//  VVDocumenter-Xcode\n//\n//  Created by WANG WEI on 2015/06/17.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import \"VVSwiftExtensionCommenter.h\"\n\n@implementation VVSwiftExtensionCommenter\n-(NSString *) document\n{\n    NSArray *component = [[self.code stringByReplacingOccurrencesOfString:@\"{\" withString:@\"\"] componentsSeparatedByString:@\":\"];\n    NSString *description = @\"Description\";\n    if (component.count == 2) {\n        description = [component.lastObject stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];\n    }\n    \n    return [NSString stringWithFormat:@\"// MARK: - <#%@#>\", description];\n}\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/Commenter/VVSwiftFunctionCommenter.h",
    "content": "//\n//  VVSwiftFunctionCommenter.h\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 14-7-30.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import \"VVBaseCommenter.h\"\n\n@interface VVSwiftFunctionCommenter : VVBaseCommenter\n\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/Commenter/VVSwiftFunctionCommenter.m",
    "content": "//\n//  VVSwiftFunctionCommenter.m\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 14-7-30.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import \"VVSwiftFunctionCommenter.h\"\n#import \"VVArgument.h\"\n#import \"NSString+VVTextGetter.h\"\n#import \"VVTextResult.h\"\n\n@implementation VVSwiftFunctionCommenter\n-(void) captureReturnType\n{\n    VVTextResult *funcParenthesesResult = [self.code vv_textResultMatchPartWithPairOpenString:@\"(\" closeString:@\")\" currentLocation:0];\n    NSString * funcSignatureWithoutParams = [self.code stringByReplacingCharactersInRange:funcParenthesesResult.range withString:@\" \"];\n    \n    if ([funcSignatureWithoutParams vv_matchesPatternRegexPattern:@\"\\\\s+(throws|rethrows)\\\\s+\"]) {\n        self.hasThrows = YES;\n    }\n    \n    if ([funcSignatureWithoutParams vv_matchesPatternRegexPattern:@\"\\\\s*->\\\\s*\\\\(?(\\\\Void?|\\\\(\\\\s*\\\\))\\\\)?\\\\s*[{]\"]) {\n        self.hasReturn = NO;\n    } else if ([funcSignatureWithoutParams vv_matchesPatternRegexPattern:@\"s*->\\\\s*\"]) {\n        self.hasReturn = YES;\n    } else if ([funcSignatureWithoutParams vv_matchesPatternRegexPattern:@\"^\\\\s*(.*\\\\s+)?(init|subscript)\\\\s*\"]) {\n        self.hasReturn = YES;\n    } else {\n        self.hasReturn = NO;\n    }\n}\n\n-(void) captureParameters\n{\n    VVTextResult *funcParenthesesResult = [self.code vv_textResultMatchPartWithPairOpenString:@\"(\" closeString:@\")\" currentLocation:0];\n    NSArray * braceGroups = [funcParenthesesResult.string vv_stringsByExtractingGroupsUsingRegexPattern:@\"\\\\((.*)\\\\)\"];\n    if (braceGroups.count > 0) {\n        NSString *content = braceGroups[0];\n        NSString *trimmed = [content stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];\n        if (trimmed.length != 0) {\n            [self parseSwiftArgumentsInputArgs:trimmed];\n        }\n    }\n}\n\n-(void) parseSwiftArgumentsInputArgs:(NSString *)rawArgsCode\n{\n    [self.arguments removeAllObjects];\n    if (rawArgsCode.length == 0) {\n        return;\n    }\n    \n    NSString *removedUnwantComma = [rawArgsCode vv_stringByReplacingRegexPattern:@\"[{].*?[^}],.*?[)}]\" withString:@\"\"];\n    NSString *removedUnwantParentheses = [removedUnwantComma copy];\n    \n    VVTextResult *parenthesesInParam = [removedUnwantComma vv_textResultMatchPartWithPairOpenString:@\"(\" closeString:@\")\" currentLocation:0];\n    while (parenthesesInParam.string) {\n        removedUnwantParentheses = [removedUnwantParentheses stringByReplacingOccurrencesOfString:parenthesesInParam.string withString:@\"\"];\n        parenthesesInParam = [removedUnwantParentheses vv_textResultMatchPartWithPairOpenString:@\"(\" closeString:@\")\" currentLocation:0];\n    }\n    \n    NSArray *argumentStrings = [removedUnwantParentheses componentsSeparatedByString:@\",\"];\n    for (__strong NSString *argumentString in argumentStrings) {\n        VVArgument *arg = [[VVArgument alloc] init];\n        argumentString = [argumentString vv_stringByReplacingRegexPattern:@\"=\\\\s*\\\\w*\" withString:@\"\"];\n        argumentString = [argumentString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];\n        argumentString = [argumentString vv_stringByReplacingRegexPattern:@\"\\\\s+\" withString:@\" \"];\n        NSMutableArray *tempArgs = [[argumentString componentsSeparatedByString:@\":\"] mutableCopy];\n        if (tempArgs.count == 1) { //There is no \":\", it is not a arg\n            continue;\n        }\n        \n        NSString *firstPart = [[tempArgs firstObject] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];\n        if ([firstPart rangeOfString:@\" \"].location != NSNotFound) {\n            arg.name = [[[firstPart componentsSeparatedByString:@\" \"] lastObject] vv_stringByReplacingRegexPattern:@\"#\" withString:@\"\"];\n        } else {\n            arg.name = [firstPart vv_stringByReplacingRegexPattern:@\"#\" withString:@\"\"];\n        }\n        \n        VVLog(@\"arg name: %@\", arg.name);\n        \n        [self.arguments addObject:arg];\n    }\n}\n\n-(NSString *) document\n{\n    [self captureReturnType];\n    [self captureParameters];\n    \n    return [super documentForSwift];\n}\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/Commenter/VVSwiftPropertyCommenter.h",
    "content": "//\n//  VVSwiftPropertyCommenter.h\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 14-7-31.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import \"VVBaseCommenter.h\"\n\n@interface VVSwiftPropertyCommenter : VVBaseCommenter\n\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/Commenter/VVSwiftPropertyCommenter.m",
    "content": "//\n//  VVSwiftPropertyCommenter.m\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 14-7-31.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import \"VVSwiftPropertyCommenter.h\"\n\n@implementation VVSwiftPropertyCommenter\n\n-(NSString *) document\n{\n    return [NSString stringWithFormat:@\"/// <#Description#>\"];\n}\n\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/Commenter/VVVariableCommenter.h",
    "content": "//\n//  VVVariableCommenter.h\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 13-7-17.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import \"VVBaseCommenter.h\"\n\n@interface VVVariableCommenter : VVBaseCommenter\n\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/Commenter/VVVariableCommenter.m",
    "content": "//\n//  VVVariableCommenter.m\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 13-7-17.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE./\n\n#import \"VVVariableCommenter.h\"\n\n@implementation VVVariableCommenter\n\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/KeyboardHelper/VVKeyboardEventSender.h",
    "content": "//\n//  VVKeyboardEventSender.h\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 13-7-26.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import <Foundation/Foundation.h>\n#import <Carbon/Carbon.h>\n\n\n@interface VVKeyboardEventSender : NSObject\n-(void) beginKeyBoradEvents;\n-(void) sendKeyCode:(NSInteger)keyCode;\n-(void) sendKeyCode:(NSInteger)keyCode withModifierCommand:(BOOL)command\n                                                       alt:(BOOL)alt\n                                                     shift:(BOOL)shift\n                                                   control:(BOOL)control;\n-(void) sendKeyCode:(NSInteger)keyCode withModifier:(NSInteger)modifierMask;\n-(void) endKeyBoradEvents;\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/KeyboardHelper/VVKeyboardEventSender.m",
    "content": "//\n//  VVKeyboardEventSender.m\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 13-7-26.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import \"VVKeyboardEventSender.h\"\n\n@interface VVKeyboardEventSender()\n{\n    CGEventSourceRef _source;\n    CGEventTapLocation _location;\n}\n@end\n\n@implementation VVKeyboardEventSender\n-(void) beginKeyBoradEvents\n{\n    _source = CGEventSourceCreate(kCGEventSourceStateCombinedSessionState);\n    _location = kCGHIDEventTap;\n}\n\n-(void) sendKeyCode:(NSInteger)keyCode\n{\n    [self sendKeyCode:keyCode withModifier:0];\n}\n\n-(void) sendKeyCode:(NSInteger)keyCode withModifierCommand:(BOOL)command\n                alt:(BOOL)alt\n              shift:(BOOL)shift\n            control:(BOOL)control\n{\n    NSInteger modifier = 0;\n    if (command) {\n        modifier = modifier ^ kCGEventFlagMaskCommand;\n    }\n    if (alt) {\n        modifier = modifier ^ kCGEventFlagMaskAlternate;\n    }\n    if (shift) {\n        modifier = modifier ^ kCGEventFlagMaskShift;\n    }\n    if (control) {\n        modifier = modifier ^ kCGEventFlagMaskControl;\n    }\n\n    [self sendKeyCode:keyCode withModifier:modifier];\n}\n\n-(void) sendKeyCode:(NSInteger)keyCode withModifier:(NSInteger)modifierMask\n{\n    NSAssert(_source != NULL, @\"You should call -beginKeyBoradEvents before sending a key event\");\n    CGEventRef event;\n    event = CGEventCreateKeyboardEvent(_source, keyCode, true);\n    CGEventSetFlags(event, modifierMask);\n    CGEventPost(_location, event);\n    CFRelease(event);\n    \n    event = CGEventCreateKeyboardEvent(_source, keyCode, false);\n    CGEventSetFlags(event, modifierMask);\n    CGEventPost(_location, event);\n    CFRelease(event);\n}\n\n-(void) endKeyBoradEvents\n{\n    NSAssert(_source != NULL, @\"You should call -beginKeyBoradEvents before end current keyborad event\");\n    CFRelease(_source);\n    _source = nil;\n}\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/OCCategory/NSString+PDRegex/NSString+PDRegex.h",
    "content": "//\n//  NSString+PDRegex.h\n//  RegexOnNSString\n//\n//  Created by Carl Brown on 10/3/11.\n//  Copyright 2011 PDAgent, LLC. Released under MIT License.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSString (PDRegex)\n\n-(NSString *) vv_stringByReplacingRegexPattern:(NSString *)regex withString:(NSString *) replacement;\n-(NSString *) vv_stringByReplacingRegexPattern:(NSString *)regex withString:(NSString *) replacement caseInsensitive:(BOOL) ignoreCase;\n-(NSString *) vv_stringByReplacingRegexPattern:(NSString *)regex withString:(NSString *) replacement caseInsensitive:(BOOL) ignoreCase treatAsOneLine:(BOOL) assumeMultiLine;\n-(NSArray *) vv_stringsByExtractingGroupsUsingRegexPattern:(NSString *)regex;\n-(NSArray *) vv_stringsByExtractingGroupsUsingRegexPattern:(NSString *)regex caseInsensitive:(BOOL) ignoreCase treatAsOneLine:(BOOL) assumeMultiLine;\n-(BOOL) vv_matchesPatternRegexPattern:(NSString *)regex;\n-(BOOL) vv_matchesPatternRegexPattern:(NSString *)regex caseInsensitive:(BOOL) ignoreCase treatAsOneLine:(BOOL) assumeMultiLine;\n\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/OCCategory/NSString+PDRegex/NSString+PDRegex.m",
    "content": "//\n//  NSString+PDRegex.m\n//  RegexOnNSString\n//\n//  Created by Carl Brown on 10/3/11.\n//  Copyright 2011 PDAgent, LLC. Released under MIT License.\n//\n\n#import \"NSString+PDRegex.h\"\n\n@implementation NSString (PDRegex)\n\n-(NSString *) vv_stringByReplacingRegexPattern:(NSString *)regex withString:(NSString *) replacement caseInsensitive:(BOOL)ignoreCase {\n    return [self vv_stringByReplacingRegexPattern:regex withString:replacement caseInsensitive:ignoreCase treatAsOneLine:NO];\n}\n\n-(NSString *) vv_stringByReplacingRegexPattern:(NSString *)regex withString:(NSString *) replacement caseInsensitive:(BOOL) ignoreCase treatAsOneLine:(BOOL) assumeMultiLine {\n    \n    NSUInteger options=0;\n    if (ignoreCase) {\n        options = options | NSRegularExpressionCaseInsensitive;\n    }\n    if (assumeMultiLine) {\n        options = options | NSRegularExpressionDotMatchesLineSeparators;\n    }\n\n    NSError *error=nil;\n    NSRegularExpression *pattern = [NSRegularExpression regularExpressionWithPattern:regex options:options error:&error];\n    if (error) {\n        NSLog(@\"Error creating Regex: %@\",[error description]);\n        return nil;\n    }\n    \n    NSString *retVal= [pattern stringByReplacingMatchesInString:self options:0 range:NSMakeRange(0, [self length]) withTemplate:replacement];\n    return retVal;\n}\n\n-(NSString *) vv_stringByReplacingRegexPattern:(NSString *)regex withString:(NSString *) replacement {\n    return [self vv_stringByReplacingRegexPattern:regex withString:replacement caseInsensitive:NO treatAsOneLine:NO];\n}\n\n-(NSArray *) vv_stringsByExtractingGroupsUsingRegexPattern:(NSString *)regex caseInsensitive:(BOOL) ignoreCase treatAsOneLine:(BOOL) assumeMultiLine {\n    NSUInteger options=0;\n    if (ignoreCase) {\n        options = options | NSRegularExpressionCaseInsensitive;\n    }\n    if (assumeMultiLine) {\n        options = options | NSRegularExpressionDotMatchesLineSeparators;\n    }\n    \n    NSError *error=nil;\n    NSRegularExpression *pattern = [NSRegularExpression regularExpressionWithPattern:regex options:options error:&error];\n    if (error) {\n        NSLog(@\"Error creating Regex: %@\",[error description]);\n        return nil;\n    }\n\n    __block NSMutableArray *retVal = [NSMutableArray array];\n    [pattern enumerateMatchesInString:self options:0 range:NSMakeRange(0, [self length]) usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {\n        //Note, we only want to return the things in parens, so we're skipping index 0 intentionally\n        for (int i=1; i<[result numberOfRanges]; i++) {\n            NSString *matchedString=[self substringWithRange:[result rangeAtIndex:i]];\n            [retVal addObject:matchedString];\n        }\n    }];\n    return retVal;\n}\n\n-(NSArray *) vv_stringsByExtractingGroupsUsingRegexPattern:(NSString *)regex {\n    return [self vv_stringsByExtractingGroupsUsingRegexPattern:regex caseInsensitive:NO treatAsOneLine:NO];\n}\n\n-(BOOL) vv_matchesPatternRegexPattern:(NSString *)regex caseInsensitive:(BOOL) ignoreCase treatAsOneLine:(BOOL) assumeMultiLine {\n    NSUInteger options=0;\n    if (ignoreCase) {\n        options = options | NSRegularExpressionCaseInsensitive;\n    }\n    if (assumeMultiLine) {\n        options = options | NSRegularExpressionDotMatchesLineSeparators;\n    }\n    \n    NSError *error=nil;\n    NSRegularExpression *pattern = [NSRegularExpression regularExpressionWithPattern:regex options:options error:&error];\n    if (error) {\n        NSLog(@\"Error creating Regex: %@\",[error description]);\n        return NO;  //Can't possibly match an invalid Regex\n    }\n\n    return ([pattern numberOfMatchesInString:self options:0 range:NSMakeRange(0, [self length])] > 0);\n}\n\n-(BOOL) vv_matchesPatternRegexPattern:(NSString *)regex {\n    return [self vv_matchesPatternRegexPattern:regex caseInsensitive:NO treatAsOneLine:NO];\n}\n\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/OCCategory/NSString+VVSyntax/NSString+VVSyntax.h",
    "content": "//\n//  NSString+VVSyntax.h\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 13-7-18.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import <Foundation/Foundation.h>\n\n@interface NSString (VVSyntax)\n-(NSString *) vv_stringByConvertingToUniform;\n-(NSString *) vv_stringByTrimEndSpaces;\n\n-(BOOL) vv_isObjCMethod;\n-(BOOL) vv_isProperty;\n-(BOOL) vv_isCFunction;\n-(BOOL) vv_isMacro;\n-(BOOL) vv_isEnum;\n-(BOOL) vv_isStruct;\n-(BOOL) vv_isUnion;\n-(BOOL) vv_isComplieKeyword;\n-(BOOL) vv_isSwiftFunction;\n-(BOOL) vv_isSwiftEnum;\n-(BOOL) vv_isSwiftProperty;\n-(BOOL) vv_isSwiftExtension;\n\n@end"
  },
  {
    "path": "VVDocumenter-Xcode/OCCategory/NSString+VVSyntax/NSString+VVSyntax.m",
    "content": "//\n//  NSString+VVSyntax.m\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 13-7-18.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import \"NSString+VVSyntax.h\"\n\n@implementation NSString (VVSyntax)\n-(NSString *) vv_stringByConvertingToUniform\n{\n    return [[[self vv_stringByReplacingRegexPattern:@\"\\\\s*\\\\(\"    withString:@\"(\"]\n                   vv_stringByReplacingRegexPattern:@\"\\\\)\\\\s*\"    withString:@\")\"]\n                   vv_stringByReplacingRegexPattern:@\"\\\\s*\\n\\\\s*\" withString:@\" \"];\n}\n\n-(NSString *) vv_stringByTrimEndSpaces\n{\n    return [self vv_stringByReplacingRegexPattern:@\"\\\\s*\\n\" withString:@\"\\n\"];\n}\n\n-(BOOL) vv_isObjCMethod\n{\n    return [self vv_matchesPatternRegexPattern:@\"^\\\\s*[+-]\"];\n}\n\n-(BOOL) vv_isCFunction\n{\n    return ![self vv_isEnum] &&\n           ![self vv_isMacro] &&\n           ![self vv_isObjCMethod] &&\n           ![self vv_isProperty] &&\n           ![self vv_isComplieKeyword] &&\n           ![self vv_isSwiftFunction] &&\n           ![self vv_isSwiftEnum] &&\n           ![self vv_isSwiftProperty] &&\n           [self vv_matchesPatternRegexPattern:@\".+\\\\s+.+\\\\(\"];\n}\n\n-(BOOL) vv_isProperty\n{\n\treturn [self vv_matchesPatternRegexPattern:@\"^\\\\s*\\\\@property\"];\n}\n\n-(BOOL) vv_isMacro\n{\n    return [self vv_matchesPatternRegexPattern:@\"^\\\\s*\\\\#define\"];\n}\n\n-(BOOL) vv_isStruct\n{\n    return [self vv_matchesPatternRegexPattern:@\"^\\\\s*(\\\\w+\\\\s)?struct.*\\\\{\"];\n}\n\n-(BOOL) vv_isEnum\n{\n    return [self vv_matchesPatternRegexPattern:@\"^\\\\s*(\\\\w+\\\\s+)?NS_(ENUM|OPTIONS)\\\\b\"];\n}\n\n-(BOOL) vv_isUnion\n{\n    return [self vv_matchesPatternRegexPattern:@\"^\\\\s*(\\\\w+\\\\s)?union.*\\\\{\"];\n}\n\n-(BOOL) vv_isComplieKeyword\n{\n    return ![self vv_isProperty] && [self vv_matchesPatternRegexPattern:@\"^\\\\s*\\\\@\"];\n}\n\n-(BOOL) vv_isSwiftFunction\n{\n    return ![self vv_isObjCMethod] && ![self vv_isSwiftProperty] && [self vv_matchesPatternRegexPattern:@\"^\\\\s*(.*\\\\s+)?(func\\\\s+)|(init|deinit|subscript)\"];\n}\n\n-(BOOL) vv_isSwiftEnum\n{\n    return ![self vv_isSwiftProperty] && [self vv_matchesPatternRegexPattern:@\"^\\\\s*(.*\\\\s+)?enum\\\\s+\"];\n}\n\n-(BOOL) vv_isSwiftProperty\n{\n    // Opt out the situation of `class func`\n    if ([self vv_matchesPatternRegexPattern:@\"class func\"]) {\n        return NO;\n    }\n    \n    // `let`/`var` can be in swift func, but `(` appear before `let`/`var` only\n    // happens when `private(set)` or `internal(set)` is used\n    // typealias is considered to share the same comment as property.\n    return [self vv_matchesPatternRegexPattern:@\"^\\\\s*([^(]*?)(((\\\\s*let|var|typealias|class\\\\s*)\\\\s+)|(\\\\(\\\\s*set\\\\s*\\\\)))\"];\n}\n\n-(BOOL) vv_isSwiftExtension\n{\n    return [self vv_matchesPatternRegexPattern:@\"^\\\\s*(.*\\\\s+)?extension\\\\s+\"];\n}\n\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/OCCategory/NSString+VVTextGetter/NSString+VVTextGetter.h",
    "content": "//\n//  NSString+VVTextGetter.h\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 14-7-31.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import <Foundation/Foundation.h>\n\n@class VVTextResult;\n\n@interface NSString (VVTextGetter)\n\n-(VVTextResult *) vv_textResultOfCurrentLineCurrentLocation:(NSInteger)location;\n\n-(VVTextResult *) vv_textResultOfPreviousLineCurrentLocation:(NSInteger)location;\n\n-(VVTextResult *) vv_textResultOfNextLineCurrentLocation:(NSInteger)location;\n\n-(VVTextResult *) vv_textResultUntilNextString:(NSString *)findString currentLocation:(NSInteger)location;\n\n-(VVTextResult *) vv_textResultWithPairOpenString:(NSString *)open\n                                      closeString:(NSString *)close\n                                  currentLocation:(NSInteger)location;\n\n-(VVTextResult *) vv_textResultMatchPartWithPairOpenString:(NSString *)open\n                                            closeString:(NSString *)close\n                                        currentLocation:(NSInteger)location;\n\n-(VVTextResult *) vv_textResultToEndOfFileCurrentLocation:(NSInteger)location;\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/OCCategory/NSString+VVTextGetter/NSString+VVTextGetter.m",
    "content": "//\n//  NSString+VVTextGetter.m\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 14-7-31.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import \"NSString+VVTextGetter.h\"\n#import \"VVTextResult.h\"\n\n@implementation NSString (VVTextGetter)\n\n-(VVTextResult *) vv_textResultOfCurrentLineCurrentLocation:(NSInteger)location\n{\n    NSInteger curseLocation = location;\n    NSRange range = NSMakeRange(0, curseLocation);\n    NSRange thisLineRange = [self rangeOfCharacterFromSet:[NSCharacterSet newlineCharacterSet] options:NSBackwardsSearch range:range];\n    \n    NSString *line = nil;\n    if (thisLineRange.location != NSNotFound) {\n        NSRange lineRange = NSMakeRange(thisLineRange.location + 1, curseLocation - thisLineRange.location - 1);\n        if (lineRange.location < [self length] && NSMaxRange(lineRange) < [self length]) {\n            line = [self substringWithRange:lineRange];\n            return [[VVTextResult alloc] initWithRange:lineRange string:line];\n        } else {\n            return nil;\n        }\n    } else {\n        return nil;\n    }\n}\n\n\n-(VVTextResult *) vv_textResultOfPreviousLineCurrentLocation:(NSInteger)location\n{\n    NSInteger curseLocation = location;\n    NSRange range = NSMakeRange(0, curseLocation);\n    NSRange thisLineRange = [self rangeOfCharacterFromSet:[NSCharacterSet newlineCharacterSet] options:NSBackwardsSearch range:range];\n    \n    NSString *line = nil;\n    if (thisLineRange.location != NSNotFound) {\n        range = NSMakeRange(0, thisLineRange.location);\n        NSRange previousLineRange = [self rangeOfCharacterFromSet:[NSCharacterSet newlineCharacterSet] options:NSBackwardsSearch range:range];\n        \n        if (previousLineRange.location != NSNotFound) {\n            NSRange lineRange = NSMakeRange(previousLineRange.location + 1, thisLineRange.location - previousLineRange.location);\n            if (lineRange.location < [self length] && NSMaxRange(lineRange) < [self length]) {\n                line = [self substringWithRange:lineRange];\n                return [[VVTextResult alloc] initWithRange:lineRange string:line];\n            } else {\n                return nil;\n            }\n        } else {\n            return nil;\n        }\n    } else {\n        return nil;\n    }\n}\n\n-(VVTextResult *) vv_textResultOfNextLineCurrentLocation:(NSInteger)location\n{\n    NSInteger curseLocation = location;\n    NSRange range = NSMakeRange(curseLocation, self.length - curseLocation);\n    NSRange thisLineRange = [self rangeOfCharacterFromSet:[NSCharacterSet newlineCharacterSet] options:0 range:range];\n    \n    NSString *line = nil;\n    if (thisLineRange.location != NSNotFound) {\n        range = NSMakeRange(thisLineRange.location + 1, self.length - thisLineRange.location - 1);\n        NSRange nextLineRange = [self rangeOfCharacterFromSet:[NSCharacterSet newlineCharacterSet] options:0 range:range];\n        \n        if (nextLineRange.location != NSNotFound) {\n            NSRange lineRange = NSMakeRange(thisLineRange.location + 1, NSMaxRange(nextLineRange) - NSMaxRange(thisLineRange));\n            if (lineRange.location < [self length] && NSMaxRange(lineRange) < [self length]) {\n                line = [self substringWithRange:lineRange];\n                return [[VVTextResult alloc] initWithRange:lineRange string:line];\n            } else {\n                return nil;\n            }\n        } else {\n            return nil;\n        }\n    } else {\n        return nil;\n    }\n}\n\n-(VVTextResult *) vv_textResultUntilNextString:(NSString *)findString currentLocation:(NSInteger)location\n{\n    NSInteger curseLocation = location;\n    \n    NSRange range = NSMakeRange(curseLocation, self.length - curseLocation);\n    NSRange nextLineRange = [self rangeOfCharacterFromSet:[NSCharacterSet newlineCharacterSet] options:0 range:range];\n    NSRange rangeToString = [self rangeOfString:findString options:0 range:range];\n    \n    NSString *line = nil;\n    if (nextLineRange.location != NSNotFound && rangeToString.location != NSNotFound && nextLineRange.location <= rangeToString.location) {\n        NSRange lineRange = NSMakeRange(nextLineRange.location + 1, rangeToString.location - nextLineRange.location);\n        if (lineRange.location < [self length] && NSMaxRange(lineRange) <= [self length]) {\n            line = [self substringWithRange:lineRange];\n            return [[VVTextResult alloc] initWithRange:lineRange string:line];\n        } else {\n            return nil;\n        }\n    } else {\n        return nil;\n    }\n}\n\n-(VVTextResult *) vv_textResultMatchPartWithPairOpenString:(NSString *)open\n                                            closeString:(NSString *)close\n                                        currentLocation:(NSInteger)location\n{\n    return [self textResultWithPairOpenString:open closeString:close currentLocation:location extractMatch:YES];\n}\n\n-(VVTextResult *) vv_textResultWithPairOpenString:(NSString *)open\n                                   closeString:(NSString *)close\n                               currentLocation:(NSInteger)location\n{\n    return [self textResultWithPairOpenString:open closeString:close currentLocation:location extractMatch:NO];\n}\n\n-(VVTextResult *) vv_textResultToEndOfFileCurrentLocation:(NSInteger)location\n{\n    NSRange range = NSMakeRange(location, self.length - location);\n    VVTextResult *result = [[VVTextResult alloc] initWithRange:range string:[self substringWithRange:range]];\n    return result;\n}\n\n-(VVTextResult *) textResultWithPairOpenString:(NSString *)open\n                                   closeString:(NSString *)close\n                               currentLocation:(NSInteger)location\n                                  extractMatch:(BOOL)extract\n{\n    // Find all content from current positon to the last paired scope. Useful when pairing `{}` or `()`\n    NSInteger curseLocation = location;\n    \n    NSRange range = NSMakeRange(curseLocation, self.length - curseLocation);\n    \n    // searchRange will be updated to new range later, for search the next open/close token.\n    NSRange searchRange = range;\n    VVLog(@\"Begin Search Range: %lu, %lu\", (unsigned long)searchRange.location, (unsigned long)searchRange.length);\n    \n    NSInteger openCount = 0;\n    NSInteger closeCount = 0;\n    \n    NSRange nextOpenRange = [self rangeOfString:open options:0 range:searchRange];\n    NSRange nextCloseRange = [self rangeOfString:close options:0 range:searchRange];\n    \n    NSRange firstOpenRange = nextOpenRange;\n    \n    // Not even open. Early return\n    if (nextOpenRange.location == NSNotFound || nextCloseRange.location == NSNotFound || nextCloseRange.location < nextOpenRange.location) {\n        return nil;\n    }\n    \n    openCount++;\n    \n    // Update the search range: from current token to the end.\n    searchRange = NSMakeRange(nextOpenRange.location + 1, self.length - nextOpenRange.location - 1);\n    VVLog(@\"Update Search Range: %lu, %lu\", (unsigned long)searchRange.location, (unsigned long)searchRange.length);\n    \n    // Try to find the scope by pairing open and close count\n    NSRange targetRange = NSMakeRange(0,0);\n    while (openCount != closeCount) {\n        // Get next open and close token location\n        nextOpenRange = [self rangeOfString:open options:0 range:searchRange];\n        nextCloseRange = [self rangeOfString:close options:0 range:searchRange];\n        \n        // No new close token. This scope will not close.\n        if (nextCloseRange.location == NSNotFound) {\n            return nil;\n        }\n        \n        if (nextOpenRange.location < nextCloseRange.location) {\n            targetRange = nextOpenRange;\n            openCount++;\n        } else {\n            targetRange = nextCloseRange;\n            closeCount++;\n        }\n        \n        VVLog(@\"Open:%ld, Close:%ld\",(long)openCount,(long)closeCount);\n        // Update the search range: from current token to the end.\n        searchRange = NSMakeRange(targetRange.location + 1, self.length - targetRange.location - 1);\n        VVLog(@\"Target Range: %lu, %lu\",targetRange.location,targetRange.length);\n        VVLog(@\"Update Search Range: %lu, %lu\", (unsigned long)searchRange.location, (unsigned long)searchRange.length);\n    }\n    \n    NSRange resultRange;\n    if (extract) {\n        resultRange = NSMakeRange(firstOpenRange.location, targetRange.location - firstOpenRange.location + 1);\n    } else {\n        // Extract the code need to be documented. From next line to the matched scope end.\n        NSRange nextLineRange = [self rangeOfCharacterFromSet:[NSCharacterSet newlineCharacterSet] options:0 range:range];\n        resultRange = NSMakeRange(nextLineRange.location + 1, targetRange.location - nextLineRange.location);\n    }\n    \n    if (resultRange.location < [self length] && NSMaxRange(resultRange) <= [self length]) {\n        NSString *result = [self substringWithRange:resultRange];\n        return [[VVTextResult alloc] initWithRange:resultRange string:result];\n    } else {\n        return nil;\n    }\n    \n}\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/OCCategory/NSTextView+VVTextGetter/NSTextView+VVTextGetter.h",
    "content": "//\n//  NSTextView+VVTextGetter.h\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 13-7-17.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import <Cocoa/Cocoa.h>\n\n@class VVTextResult;\n\n@interface NSTextView (VVTextGetter)\n-(NSInteger) vv_currentCurseLocation;\n\n-(VVTextResult *) vv_textResultOfCurrentLine;\n\n-(VVTextResult *) vv_textResultOfPreviousLine;\n\n-(VVTextResult *) vv_textResultOfNextLine;\n\n-(VVTextResult *) vv_textResultUntilNextString:(NSString *)findString;\n\n-(VVTextResult *) vv_textResultWithPairOpenString:(NSString *)open closeString:(NSString *)close;\n\n-(VVTextResult *) vv_textResultToEndOfFile;\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/OCCategory/NSTextView+VVTextGetter/NSTextView+VVTextGetter.m",
    "content": "//\n//  NSTextView+VVTextGetter.m\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 13-7-17.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import \"NSTextView+VVTextGetter.h\"\n#import \"VVTextResult.h\"\n#import \"NSString+VVTextGetter.h\"\n\n@implementation NSTextView (VVTextGetter)\n-(NSInteger) vv_currentCurseLocation\n{\n    return [[[self selectedRanges] objectAtIndex:0] rangeValue].location;\n}\n\n-(VVTextResult *) vv_textResultOfCurrentLine\n{\n    return [self.textStorage.string vv_textResultOfCurrentLineCurrentLocation:[self vv_currentCurseLocation]];\n}\n\n-(VVTextResult *) vv_textResultOfPreviousLine\n{\n    return [self.textStorage.string vv_textResultOfPreviousLineCurrentLocation:[self vv_currentCurseLocation]];\n}\n\n-(VVTextResult *) vv_textResultOfNextLine\n{\n    return [self.textStorage.string vv_textResultOfNextLineCurrentLocation:[self vv_currentCurseLocation]];\n}\n\n-(VVTextResult *) vv_textResultUntilNextString:(NSString *)findString\n{\n    return [self.textStorage.string vv_textResultUntilNextString:findString currentLocation:[self vv_currentCurseLocation]];\n}\n\n-(VVTextResult *) vv_textResultWithPairOpenString:(NSString *)open closeString:(NSString *)close\n{\n    return [self.textStorage.string vv_textResultWithPairOpenString:open closeString:close currentLocation:[self vv_currentCurseLocation]];\n}\n\n-(VVTextResult *) vv_textResultToEndOfFile\n{\n    return [self.textStorage.string vv_textResultToEndOfFileCurrentLocation:[self vv_currentCurseLocation]];\n}\n\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/OCCategory/VVTextResult.h",
    "content": "//\n//  VVTextResult.h\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 14-7-31.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import <Foundation/Foundation.h>\n\n@interface VVTextResult : NSObject\n\n@property (nonatomic, assign) NSRange range;\n@property (nonatomic, copy) NSString *string;\n\n-(instancetype) initWithRange:(NSRange)aRange string:(NSString *)aString;\n\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/OCCategory/VVTextResult.m",
    "content": "//\n//  VVTextResult.m\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 14-7-31.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import \"VVTextResult.h\"\n\n@implementation VVTextResult\n\n-(instancetype) initWithRange:(NSRange)aRange string:(NSString *)aString\n\n{\n    self = [super init];\n    if (self) {\n        _range = aRange;\n        _string = aString;\n    }\n    return self;\n}\n\n-(NSString *)description\n{\n    return [NSString stringWithFormat:@\"Location:%ld, Length:%ld, String:%@\",self.range.location,self.range.length,self.string];\n}\n\n@end"
  },
  {
    "path": "VVDocumenter-Xcode/ProjectHelper/VVProject.h",
    "content": "//\n//  VVProject.h\n//  VVDocumenter-Xcode\n//\n//  Created by 夏天味道 on 15/6/25.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import <Foundation/Foundation.h>\n\n@interface VVProject : NSObject\n\n@property (nonatomic, copy) NSString     *directoryPath;\n\n@property (nonatomic,copy,readonly) NSString     *workspacePath;\n\n@property (nonatomic, copy) NSString     *projectName;\n\n@property (nonatomic, copy) NSDictionary *infoDictionary;\n\n@property (nonatomic, copy) NSString     *projectVersion;\n\n@property (nonatomic,copy) NSDictionary *pbxprojDictionary;\n\n@property (nonatomic,copy) NSString     *organizeationName;\n\n\n+ (instancetype)projectForKeyWindow;\n\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/ProjectHelper/VVProject.m",
    "content": "//\n//  VVProject.m\n//  VVDocumenter-Xcode\n//\n//  Created by 夏天味道 on 15/6/25.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import \"VVProject.h\"\n#import \"VVWorkspaceManager.h\"\n\n@implementation VVProject\n\n+ (instancetype)projectForKeyWindow\n{\n    id workspace = [VVWorkspaceManager workspaceForKeyWindow];\n    \n    id contextManager = [workspace valueForKey:@\"_runContextManager\"];\n    \n    for (id scheme in[contextManager valueForKey:@\"runContexts\"]) {\n        NSString *schemeName = [scheme valueForKey:@\"name\"];\n        if (![schemeName hasPrefix:@\"Pods-\"]) {\n            NSString *path = [VVWorkspaceManager directoryPathForWorkspace:workspace];\n            return [[VVProject alloc] initWithName:schemeName path:path];\n        }\n    }\n    \n    return nil;\n}\n\n- (id)initWithName:(NSString *)name\n              path:(NSString *)path\n{\n    if (self = [self init]) {\n        _projectName = name;\n        _directoryPath = path;\n        \n        \n        NSString *pbxprojPath = [path stringByAppendingPathComponent:[NSString stringWithFormat:@\"%@.xcodeproj/project.pbxproj\",name]];\n        _pbxprojDictionary = [NSDictionary dictionaryWithContentsOfFile:pbxprojPath];\n        \n        \n        \n        _organizeationName = [self getOrganizeationName];\n        NSString *infoplistName = [self infoplistNameWithAtScheme:name];\n        \n        NSString *infoPath = [path stringByAppendingPathComponent:[NSString stringWithFormat:@\"%@\", infoplistName]];\n        \n        \n        _infoDictionary = [NSDictionary dictionaryWithContentsOfFile:infoPath];\n        \n        _projectVersion = self.infoDictionary[@\"CFBundleShortVersionString\"];\n    }\n    \n    return self;\n}\n\n-(NSString *)getOrganizeationName{\n    NSDictionary *objects = [_pbxprojDictionary objectForKey:@\"objects\"];\n    NSString *rootObjectId = [_pbxprojDictionary objectForKey:@\"rootObject\"];\n    \n    NSDictionary *pbxProjectDic = [objects objectForKey:rootObjectId];\n    NSDictionary *attributes = [pbxProjectDic objectForKey:@\"attributes\"];\n    NSString *organizeationName = [attributes objectForKey:@\"ORGANIZATIONNAME\"];\n    return organizeationName;\n}\n\n-(NSString *)infoplistNameWithAtScheme:(NSString *)currentSchemeName{\n    NSDictionary *objects = [_pbxprojDictionary objectForKey:@\"objects\"];\n    NSString *rootObjectId = [_pbxprojDictionary objectForKey:@\"rootObject\"];\n    \n    NSDictionary *pbxProjectDic = [objects objectForKey:rootObjectId];\n    NSArray *targetIds = [pbxProjectDic objectForKey:@\"targets\"];\n    NSString *currentTargetId;\n    for (NSString *targetId in targetIds) {\n        NSDictionary *targetDic = [objects objectForKey:targetId];\n        NSString *targetName = [targetDic objectForKey:@\"name\"];\n        if ([targetName isEqualToString:currentSchemeName]) {\n            currentTargetId = targetId;\n            break;\n        }\n    }\n    if (!currentTargetId) {\n        currentTargetId = [targetIds firstObject];\n    }\n    \n    NSDictionary *targetDic = [objects objectForKey:currentTargetId];\n    NSString *buildConfigurationListId = [targetDic objectForKey:@\"buildConfigurationList\"];\n    \n    NSDictionary *buildConfigurationListDic = [objects objectForKey:buildConfigurationListId];\n    NSArray *buildConfigurationIds = [buildConfigurationListDic objectForKey:@\"buildConfigurations\"];\n    \n    NSString *debugBuildConfigurationId;\n    for (NSString *buildConfigurationId in buildConfigurationIds) {\n        NSDictionary *buildConfigurationDic = [objects objectForKey:buildConfigurationId];\n        NSString *name = [buildConfigurationDic objectForKey:@\"name\"];\n        if ([name isEqualToString:@\"Debug\"]) {\n            debugBuildConfigurationId = buildConfigurationId;\n            break;\n        }\n    }\n    if (!debugBuildConfigurationId) {\n        debugBuildConfigurationId = [buildConfigurationIds firstObject];\n    }\n    \n    NSDictionary *buildConfigurationDic = [objects objectForKey:debugBuildConfigurationId];\n    NSDictionary *buildSettings = [buildConfigurationDic objectForKey:@\"buildSettings\"];\n    NSString *infoplistName = [buildSettings objectForKey:@\"INFOPLIST_FILE\"];\n    return infoplistName;\n}\n\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/ProjectHelper/VVWorkspaceManager.h",
    "content": "//\n//  VVWorkspaceManager.h\n//  VVDocumenter-Xcode\n//\n//  Created by 夏天味道 on 15/6/25.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import <Foundation/Foundation.h>\n\n@interface VVWorkspaceManager : NSObject\n\n+ (id)workspaceForKeyWindow;\n\n+ (NSString *)currentWorkspaceDirectoryPath;\n+ (NSString *)directoryPathForWorkspace:(id)workspace;\n\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/ProjectHelper/VVWorkspaceManager.m",
    "content": "//\n//  VVWorkspaceManager.m\n//  VVDocumenter-Xcode\n//\n//  Created by 夏天味道 on 15/6/25.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import \"VVWorkspaceManager.h\"\n\n@implementation VVWorkspaceManager\n\n+ (NSString *)currentWorkspaceDirectoryPath\n{\n    return [self directoryPathForWorkspace:[self workspaceForKeyWindow]];\n}\n\n+ (NSString *)directoryPathForWorkspace:(id)workspace\n{\n    NSString *workspacePath = [[workspace valueForKey:@\"representingFilePath\"] valueForKey:@\"_pathString\"];\n    return [workspacePath stringByDeletingLastPathComponent];\n}\n\n#pragma mark - Private\n\n+ (id)workspaceForKeyWindow\n{\n    return [self workspaceForWindow:[NSApp keyWindow]];\n}\n\n+ (id)workspaceForWindow:(NSWindow *)window\n{\n    NSArray *workspaceWindowControllers = [NSClassFromString(@\"IDEWorkspaceWindowController\") valueForKey:@\"workspaceWindowControllers\"];\n    \n    for (id controller in workspaceWindowControllers) {\n        if ([[controller valueForKey:@\"window\"] isEqual:window]) {\n            return [controller valueForKey:@\"_workspace\"];\n        }\n    }\n    return nil;\n}\n\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/Setting/VVDSettingPanelWindowController.h",
    "content": "//\n//  VVDSettingPanelWindowController.h\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 13-8-3.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import <Cocoa/Cocoa.h>\n\n@interface VVDSettingPanelWindowController : NSWindowController\n\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/Setting/VVDSettingPanelWindowController.m",
    "content": "//\n//  VVDSettingPanelWindowController.m\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 13-8-3.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import \"VVDSettingPanelWindowController.h\"\n#import \"VVDocumenterSetting.h\"\n\n@interface VVDSettingPanelWindowController ()<NSTextFieldDelegate>\n@property (weak) IBOutlet NSTextField *tfTrigger;\n@property (weak) IBOutlet NSButton *btnUseSpaces;\n@property (weak) IBOutlet NSTextField *tfSpaceCount;\n@property (weak) IBOutlet NSTextField *tfSpaceLabel;\n\n@property (weak) IBOutlet NSStepper *stepperCount;\n\n@property (weak) IBOutlet NSMatrix *mtxSinceOptions;\n@property (weak) IBOutlet NSMatrix *mtxPrefixOptions;\n@property (weak) IBOutlet NSButtonCell *btnPrefixWithWhitespace;\n@property (weak) IBOutlet NSButtonCell *btnPrefixWithStar;\n@property (weak) IBOutlet NSButtonCell *btnPrefixWithSlashes;\n@property (weak) IBOutlet NSButton *btnAddSinceToComment;\n@property (weak) IBOutlet NSButton *btnBriefDescription;\n@property (weak) IBOutlet NSButton *btnUseHeaderDoc;\n@property (weak) IBOutlet NSButton *btnBlankLinesBetweenSections;\n@property (weak) IBOutlet NSButton *btnAlightArgumentComments;\n@property (weak) IBOutlet NSButton *btnUseAuthorInformation;\n@property (weak) IBOutlet NSButton *btnUseDateInformation;\n@property (weak) IBOutlet NSTextField *tfAuthoInformation;\n@property (weak) IBOutlet NSTextField *tfDateInformaitonFormat;\n@property (weak) IBOutlet NSTextField *tfSinceVersion;\n\n@end\n\n@implementation VVDSettingPanelWindowController\n\n- (instancetype)initWithWindow:(NSWindow *)window\n{\n    self = [super initWithWindow:window];\n    if (self) {\n        // Initialization code here.\n    }\n\n    return self;\n}\n\n- (void)windowDidLoad\n{\n    [super windowDidLoad];\n\n    // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.\n    [self.tfTrigger setStringValue:[[VVDocumenterSetting defaultSetting] triggerString]];\n    self.btnUseSpaces.state = (NSCellStateValue)[[VVDocumenterSetting defaultSetting] useSpaces];\n\n    self.btnAddSinceToComment.state = (NSCellStateValue)[[VVDocumenterSetting defaultSetting] addSinceToComments];\n    self.mtxSinceOptions.enabled = [[VVDocumenterSetting defaultSetting] addSinceToComments];\n    [self.mtxSinceOptions selectCellAtRow:(NSInteger)[[VVDocumenterSetting defaultSetting] sinceOption] column:0];\n    self.tfSinceVersion.enabled = [[VVDocumenterSetting defaultSetting] addSinceToComments];\n    self.tfSinceVersion.stringValue = [[VVDocumenterSetting defaultSetting] sinceVersion];\n\n    self.btnBriefDescription.state = (NSCellStateValue)[[VVDocumenterSetting defaultSetting] briefDescription];\n    self.btnUseHeaderDoc.state = (NSCellStateValue)[[VVDocumenterSetting defaultSetting] useHeaderDoc];\n    self.btnBlankLinesBetweenSections.state = (NSCellStateValue)[[VVDocumenterSetting defaultSetting] blankLinesBetweenSections];\n    self.btnAlightArgumentComments.state = (NSCellStateValue)[[VVDocumenterSetting defaultSetting] alignArgumentComments];\n    self.btnUseAuthorInformation.state = (NSCellStateValue)[[VVDocumenterSetting defaultSetting] useAuthorInformation];\n    self.tfAuthoInformation.stringValue = [[VVDocumenterSetting defaultSetting] authorInformation];\n    self.btnUseDateInformation.state = (NSCellStateValue)[[VVDocumenterSetting defaultSetting] useDateInformation];\n    self.tfDateInformaitonFormat.stringValue = [[VVDocumenterSetting defaultSetting] dateInformationFormat];\n    \n    if ([[VVDocumenterSetting defaultSetting] prefixWithStar]) {\n        [self.mtxPrefixOptions selectCell:self.btnPrefixWithStar];\n    } else if ([[VVDocumenterSetting defaultSetting] prefixWithSlashes]) {\n        [self.mtxPrefixOptions selectCell:self.btnPrefixWithSlashes];\n    } else {\n        [self.mtxPrefixOptions selectCell:self.btnPrefixWithWhitespace];\n    }\n\n    // Disable the slashes prefix option for HeaderDoc comments\n    if (self.btnUseHeaderDoc.state == NSOnState) {\n        self.btnPrefixWithSlashes.enabled = NO;\n    }\n\n    [self updateUseSpace:self.btnUseSpaces.state];\n    [self syncSpaceCount];\n\n    self.tfTrigger.delegate = self;\n    self.tfDateInformaitonFormat.delegate = self;\n    self.tfAuthoInformation.delegate = self;\n    self.tfSinceVersion.delegate = self;\n}\n\n- (IBAction)stepperPressed:(id)sender {\n    [[VVDocumenterSetting defaultSetting] setSpaceCount:self.stepperCount.integerValue];\n    [self syncSpaceCount];\n}\n\n- (IBAction)btnResetPressed:(id)sender {\n    [[VVDocumenterSetting defaultSetting] setUseSpaces:YES];\n    [[VVDocumenterSetting defaultSetting] setTriggerString:VVDDefaultTriggerString];\n    [[VVDocumenterSetting defaultSetting] setSpaceCount:2];\n    [[VVDocumenterSetting defaultSetting] setPrefixWithStar:YES];\n    [[VVDocumenterSetting defaultSetting] setPrefixWithSlashes:NO];\n    [[VVDocumenterSetting defaultSetting] setAddSinceToComments:NO];\n    [[VVDocumenterSetting defaultSetting] setSinceVersion:@\"\"];\n    [[VVDocumenterSetting defaultSetting] setBriefDescription:NO];\n    [[VVDocumenterSetting defaultSetting] setUseHeaderDoc:NO];\n    [[VVDocumenterSetting defaultSetting] setBlankLinesBetweenSections:YES];\n    [[VVDocumenterSetting defaultSetting] setAlignArgumentComments:YES];\n    [[VVDocumenterSetting defaultSetting] setUseAuthorInformation:NO];\n    [[VVDocumenterSetting defaultSetting] setAuthorInformation:VVDDefaultAuthorString];\n    [[VVDocumenterSetting defaultSetting] setUseDateInformation:NO];\n    [[VVDocumenterSetting defaultSetting] setDateInformationFormat:VVDDefaultDateInfomationFormat];\n    \n    self.btnUseSpaces.state = NSOnState;\n    [self updateUseSpace:self.btnUseSpaces.state];\n    self.btnPrefixWithWhitespace.state = NSOffState;\n    self.btnPrefixWithStar.state = NSOnState;\n    self.btnPrefixWithSlashes.state = NSOffState;\n    self.btnAddSinceToComment.state = NSOffState;\n    self.tfSinceVersion.enabled = NO;\n    self.mtxSinceOptions.enabled = NO;\n    self.btnBriefDescription.state = NSOffState;\n    [self.tfTrigger setStringValue:VVDDefaultTriggerString];\n    self.btnUseHeaderDoc.state = NSOffState;\n    self.btnBlankLinesBetweenSections.state = NSOnState;\n    self.btnAlightArgumentComments.state = NSOnState;\n    self.btnUseAuthorInformation.state = NSOffState;\n    self.tfAuthoInformation.stringValue = VVDDefaultAuthorString;\n    self.btnUseDateInformation.state = NSOffState;\n    self.tfDateInformaitonFormat.stringValue = VVDDefaultDateInfomationFormat;\n    \n    self.btnPrefixWithSlashes.enabled = YES;\n\n    [self syncSpaceCount];\n\n}\n\n- (IBAction)mtxSinceOptionPressed:(id)sender {\n    VVDSinceOption option = self.mtxSinceOptions.selectedRow;\n    [[VVDocumenterSetting defaultSetting] setSinceOption:option];\n}\n\n- (IBAction)btnUseSpacesPressed:(id)sender {\n    [[VVDocumenterSetting defaultSetting] setUseSpaces:self.btnUseSpaces.state];\n    [self updateUseSpace:self.btnUseSpaces.state];\n}\n\n- (IBAction)mtxPrefixSettingPressed:(id)sender {\n    id selectedCell = self.mtxPrefixOptions.selectedCell;\n\n    [[VVDocumenterSetting defaultSetting] setPrefixWithStar:[selectedCell isEqual:self.btnPrefixWithStar]];\n    [[VVDocumenterSetting defaultSetting] setPrefixWithSlashes:[selectedCell isEqual:self.btnPrefixWithSlashes]];\n}\n\n- (IBAction)btnAddSinceToCommentsPressed:(id)sender {\n    BOOL enableSince = self.btnAddSinceToComment.state;\n    [[VVDocumenterSetting defaultSetting] setAddSinceToComments:enableSince];\n    self.tfSinceVersion.enabled = enableSince;\n    self.mtxSinceOptions.enabled = enableSince;\n}\n\n- (IBAction)btnBriefDescriptionPressed:(id)sender {\n    [[VVDocumenterSetting defaultSetting] setBriefDescription:self.btnBriefDescription.state];\n}\n\n- (IBAction)btnUseAuthorInformationPressed:(id)sender {\n    [[VVDocumenterSetting defaultSetting] setUseAuthorInformation:self.btnUseAuthorInformation.state];\n}\n\n- (IBAction)btnUseDateInformationPressed:(id)sender {\n    [[VVDocumenterSetting defaultSetting] setUseDateInformation:self.btnUseDateInformation.state];\n}\n\n-(void) syncSpaceCount\n{\n    NSInteger spaceCount = [[VVDocumenterSetting defaultSetting] spaceCount];\n    [self.tfSpaceCount setIntegerValue:spaceCount];\n    [self.stepperCount setIntegerValue:spaceCount];\n}\n\n-(void) updateUseSpace:(BOOL)useSpace\n{\n    [self.tfSpaceCount setEnabled:useSpace];\n    [self.stepperCount setEnabled:useSpace];\n    self.tfSpaceLabel.textColor = useSpace ? [NSColor blackColor] : [NSColor grayColor];\n}\n\n- (void)controlTextDidChange:(NSNotification *)notification\n{\n    if([notification object] == self.tfTrigger) {\n        [[VVDocumenterSetting defaultSetting] setTriggerString:self.tfTrigger.stringValue];\n    }\n    if([notification object] == self.tfAuthoInformation) {\n        [[VVDocumenterSetting defaultSetting] setAuthorInformation:self.tfAuthoInformation.stringValue];\n    }\n    if([notification object] == self.tfDateInformaitonFormat) {\n        [[VVDocumenterSetting defaultSetting] setDateInformationFormat:self.tfDateInformaitonFormat.stringValue];\n    }\n    if ([notification object] == self.tfSinceVersion) {\n        [[VVDocumenterSetting defaultSetting] setSinceVersion:self.tfSinceVersion.stringValue];\n    }\n}\n\n- (BOOL)control:(NSControl *)control textShouldEndEditing:(NSText *)fieldEditor\n{\n    if (control == self.tfTrigger) {\n        if (self.tfTrigger.stringValue.length == 0) {\n            [self.tfTrigger setStringValue:VVDDefaultTriggerString];\n        }\n    }\n    return YES;\n}\n\n- (IBAction)useHeaderDoc:(id)sender {\n    [[VVDocumenterSetting defaultSetting] setUseHeaderDoc:self.btnUseHeaderDoc.state];\n\n    if (self.btnUseHeaderDoc.state == NSOnState) {\n        self.btnPrefixWithSlashes.enabled = NO;\n\n        // If the slashes option was selected, change to the default stars\n        if ([self.mtxPrefixOptions.selectedCell isEqual:self.btnPrefixWithSlashes]) {\n            [self.mtxPrefixOptions selectCell:self.btnPrefixWithStar];\n\n            // Update the settings in addition to the display\n            [self.mtxPrefixOptions sendAction];\n        }\n    } else {\n        self.btnPrefixWithSlashes.enabled = YES;\n    }\n}\n- (IBAction)blankLinesBetweenSections:(id)sender {\n    [[VVDocumenterSetting defaultSetting] setBlankLinesBetweenSections:self.btnBlankLinesBetweenSections.state];\n}\n\n- (IBAction)alignArgumentComments:(id)sender {\n    [[VVDocumenterSetting defaultSetting] setAlignArgumentComments:self.btnAlightArgumentComments.state];\n}\n\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/Setting/VVDSettingPanelWindowController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"10117\" systemVersion=\"15F34\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"10117\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\" customClass=\"VVDSettingPanelWindowController\">\n            <connections>\n                <outlet property=\"btnAddSinceToComment\" destination=\"ERW-1g-i3X\" id=\"1ef-Mr-TVa\"/>\n                <outlet property=\"btnAlightArgumentComments\" destination=\"g3M-cK-u5v\" id=\"l9g-ge-CwY\"/>\n                <outlet property=\"btnBlankLinesBetweenSections\" destination=\"6ax-Nw-Bq5\" id=\"vCY-7n-Xqh\"/>\n                <outlet property=\"btnBriefDescription\" destination=\"gfy-6Z-t8f\" id=\"oHc-uk-ERk\"/>\n                <outlet property=\"btnDefaultPlaceholder\" destination=\"3Uj-1c-BzU\" id=\"TeO-Jj-IsJ\"/>\n                <outlet property=\"btnPrefixWithSlashes\" destination=\"IVu-o3-DBW\" id=\"GJD-9u-PLJ\"/>\n                <outlet property=\"btnPrefixWithStar\" destination=\"vMT-lx-3Ep\" id=\"JBV-hz-QfR\"/>\n                <outlet property=\"btnPrefixWithWhitespace\" destination=\"mxJ-X3-ycD\" id=\"oIB-Va-SeQ\"/>\n                <outlet property=\"btnProjectVersion\" destination=\"pSZ-Vj-hkT\" id=\"OIF-HV-I6g\"/>\n                <outlet property=\"btnSpecificVersion\" destination=\"PbN-ts-AYz\" id=\"21F-j3-SGO\"/>\n                <outlet property=\"btnUseAuthorInformation\" destination=\"yp5-mf-NgJ\" id=\"Pqf-GX-Avo\"/>\n                <outlet property=\"btnUseDateInformation\" destination=\"b6P-6I-DiH\" id=\"s02-Tx-jGJ\"/>\n                <outlet property=\"btnUseHeaderDoc\" destination=\"bgb-aQ-BAa\" id=\"wor-rz-Ijg\"/>\n                <outlet property=\"btnUseSpaces\" destination=\"9\" id=\"37\"/>\n                <outlet property=\"mtxPrefixOptions\" destination=\"9MP-VX-rsW\" id=\"pMl-hs-b8d\"/>\n                <outlet property=\"mtxSinceOptions\" destination=\"F04-TF-nUJ\" id=\"uSS-BQ-O3Z\"/>\n                <outlet property=\"stepperCount\" destination=\"54\" id=\"57\"/>\n                <outlet property=\"tfAuthoInformation\" destination=\"zua-Qs-tG6\" id=\"as9-qR-Eq1\"/>\n                <outlet property=\"tfDateInformaitonFormat\" destination=\"L0g-BX-Fh0\" id=\"df2-hk-v5B\"/>\n                <outlet property=\"tfSinceVersion\" destination=\"lQp-YM-3hX\" id=\"Xj0-Zg-bCx\"/>\n                <outlet property=\"tfSpaceCount\" destination=\"30\" id=\"38\"/>\n                <outlet property=\"tfSpaceLabel\" destination=\"16\" id=\"53\"/>\n                <outlet property=\"tfTrigger\" destination=\"26\" id=\"36\"/>\n                <outlet property=\"window\" destination=\"1\" id=\"3\"/>\n            </connections>\n        </customObject>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\"/>\n        <window title=\"VVDocumenter Setting\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" oneShot=\"NO\" animationBehavior=\"default\" id=\"1\">\n            <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\"/>\n            <rect key=\"contentRect\" x=\"20\" y=\"40\" width=\"463\" height=\"586\"/>\n            <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"2560\" height=\"1417\"/>\n            <view key=\"contentView\" id=\"2\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"463\" height=\"586\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <button id=\"9\">\n                        <rect key=\"frame\" x=\"67\" y=\"460\" width=\"212\" height=\"35\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <buttonCell key=\"cell\" type=\"check\" title=\"Use spaces instead of tabs\" bezelStyle=\"regularSquare\" imagePosition=\"left\" state=\"on\" inset=\"2\" id=\"10\">\n                            <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                        </buttonCell>\n                        <connections>\n                            <action selector=\"btnUseSpacesPressed:\" target=\"-2\" id=\"51\"/>\n                        </connections>\n                    </button>\n                    <textField verticalHuggingPriority=\"750\" id=\"16\">\n                        <rect key=\"frame\" x=\"329\" y=\"469\" width=\"60\" height=\"17\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" title=\"spaces\" id=\"17\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <textField verticalHuggingPriority=\"750\" id=\"30\">\n                        <rect key=\"frame\" x=\"279\" y=\"466\" width=\"37\" height=\"22\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" allowsUndo=\"NO\" sendsActionOnEndEditing=\"YES\" state=\"on\" borderStyle=\"bezel\" alignment=\"center\" title=\"123\" drawsBackground=\"YES\" id=\"31\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"textColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <button verticalHuggingPriority=\"750\" id=\"22\">\n                        <rect key=\"frame\" x=\"11\" y=\"13\" width=\"113\" height=\"32\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <buttonCell key=\"cell\" type=\"push\" title=\"Reset Default\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"23\">\n                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                        </buttonCell>\n                        <connections>\n                            <action selector=\"btnResetPressed:\" target=\"-2\" id=\"33\"/>\n                        </connections>\n                    </button>\n                    <textField verticalHuggingPriority=\"750\" id=\"24\">\n                        <rect key=\"frame\" x=\"66\" y=\"547\" width=\"107\" height=\"17\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" title=\"Trigger Input\" id=\"25\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <textField verticalHuggingPriority=\"750\" id=\"26\">\n                        <rect key=\"frame\" x=\"279\" y=\"544\" width=\"96\" height=\"22\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" state=\"on\" borderStyle=\"bezel\" alignment=\"right\" drawsBackground=\"YES\" id=\"27\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"textColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <textField verticalHuggingPriority=\"750\" id=\"zua-Qs-tG6\">\n                        <rect key=\"frame\" x=\"149\" y=\"192\" width=\"241\" height=\"22\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" state=\"on\" borderStyle=\"bezel\" alignment=\"right\" drawsBackground=\"YES\" id=\"3w5-ev-VuS\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"textColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <textField verticalHuggingPriority=\"750\" id=\"28\">\n                        <rect key=\"frame\" x=\"78\" y=\"501\" width=\"295\" height=\"38\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" sendsActionOnEndEditing=\"YES\" title=\"VVDocumenter will inspect the input and insert document comment when it matches this.\" id=\"29\">\n                            <font key=\"font\" metaFont=\"titleBar\" size=\"12\"/>\n                            <color key=\"textColor\" name=\"controlShadowColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <stepper horizontalHuggingPriority=\"750\" verticalHuggingPriority=\"750\" id=\"54\">\n                        <rect key=\"frame\" x=\"312\" y=\"463\" width=\"19\" height=\"27\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <stepperCell key=\"cell\" continuous=\"YES\" alignment=\"left\" maxValue=\"100\" id=\"55\"/>\n                        <connections>\n                            <action selector=\"stepperPressed:\" target=\"-2\" id=\"58\"/>\n                        </connections>\n                    </stepper>\n                    <button id=\"ERW-1g-i3X\">\n                        <rect key=\"frame\" x=\"67\" y=\"439\" width=\"201\" height=\"18\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <buttonCell key=\"cell\" type=\"check\" title=\"Use @since to all comments\" bezelStyle=\"regularSquare\" imagePosition=\"left\" inset=\"2\" id=\"eH9-9F-VR9\">\n                            <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                        </buttonCell>\n                        <connections>\n                            <action selector=\"btnAddSinceToCommentsPressed:\" target=\"-2\" id=\"mx1-gQ-vXj\"/>\n                        </connections>\n                    </button>\n                    <button id=\"gfy-6Z-t8f\">\n                        <rect key=\"frame\" x=\"67\" y=\"342\" width=\"187\" height=\"18\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <buttonCell key=\"cell\" type=\"check\" title=\"Use @brief for description\" bezelStyle=\"regularSquare\" imagePosition=\"left\" inset=\"2\" id=\"wKY-lg-WfF\">\n                            <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                        </buttonCell>\n                        <connections>\n                            <action selector=\"btnBriefDescriptionPressed:\" target=\"-2\" id=\"UE3-ix-FCS\"/>\n                        </connections>\n                    </button>\n                    <button id=\"bgb-aQ-BAa\">\n                        <rect key=\"frame\" x=\"67\" y=\"312\" width=\"272\" height=\"18\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <buttonCell key=\"cell\" type=\"check\" title=\"Use /*! (HeaderDoc style) instead of /**\" bezelStyle=\"regularSquare\" imagePosition=\"left\" inset=\"2\" id=\"C3y-LS-75k\">\n                            <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                        </buttonCell>\n                        <connections>\n                            <action selector=\"useHeaderDoc:\" target=\"-2\" id=\"1Wy-E1-jLv\"/>\n                        </connections>\n                    </button>\n                    <button id=\"6ax-Nw-Bq5\">\n                        <rect key=\"frame\" x=\"67\" y=\"284\" width=\"272\" height=\"18\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <buttonCell key=\"cell\" type=\"check\" title=\"Add blank lines between sections\" bezelStyle=\"regularSquare\" imagePosition=\"left\" state=\"on\" inset=\"2\" id=\"YoT-Nd-Bhd\">\n                            <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                        </buttonCell>\n                        <connections>\n                            <action selector=\"blankLinesBetweenSections:\" target=\"-2\" id=\"Ut9-U7-XdV\"/>\n                        </connections>\n                    </button>\n                    <matrix verticalHuggingPriority=\"750\" allowsEmptySelection=\"NO\" autosizesCells=\"NO\" id=\"9MP-VX-rsW\">\n                        <rect key=\"frame\" x=\"65\" y=\"61\" width=\"325\" height=\"85\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        <size key=\"cellSize\" width=\"325\" height=\"28\"/>\n                        <size key=\"intercellSpacing\" width=\"4\" height=\"2\"/>\n                        <buttonCell key=\"prototype\" type=\"radio\" title=\"Prefix each comment line with three slashes\" bezelStyle=\"regularSquare\" imagePosition=\"left\" alignment=\"left\" inset=\"2\" id=\"wZv-eZ-WK7\">\n                            <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                        </buttonCell>\n                        <cells>\n                            <column>\n                                <buttonCell type=\"radio\" title=\"Prefix each comment line with whitespace only\" imagePosition=\"left\" alignment=\"left\" tag=\"1\" inset=\"2\" id=\"mxJ-X3-ycD\">\n                                    <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                </buttonCell>\n                                <buttonCell type=\"radio\" title=\"Prefix each comment line with a star (objc only)\" imagePosition=\"left\" alignment=\"left\" state=\"on\" tag=\"2\" inset=\"2\" id=\"vMT-lx-3Ep\">\n                                    <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                </buttonCell>\n                                <buttonCell type=\"radio\" title=\"Prefix each comment line with three slashes\" bezelStyle=\"regularSquare\" imagePosition=\"left\" alignment=\"left\" tag=\"3\" inset=\"2\" id=\"IVu-o3-DBW\">\n                                    <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                </buttonCell>\n                            </column>\n                        </cells>\n                        <connections>\n                            <action selector=\"mtxPrefixSettingPressed:\" target=\"-2\" id=\"lCp-Ch-TTG\"/>\n                        </connections>\n                    </matrix>\n                    <box verticalHuggingPriority=\"750\" title=\"Box\" boxType=\"separator\" titlePosition=\"noTitle\" id=\"Qwl-tK-TKG\">\n                        <rect key=\"frame\" x=\"67\" y=\"152\" width=\"323\" height=\"5\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <color key=\"borderColor\" white=\"0.0\" alpha=\"0.41999999999999998\" colorSpace=\"calibratedWhite\"/>\n                        <color key=\"fillColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"calibratedWhite\"/>\n                        <font key=\"titleFont\" metaFont=\"system\"/>\n                    </box>\n                    <button id=\"g3M-cK-u5v\">\n                        <rect key=\"frame\" x=\"67\" y=\"252\" width=\"272\" height=\"18\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <buttonCell key=\"cell\" type=\"check\" title=\"Align argument comments\" bezelStyle=\"regularSquare\" imagePosition=\"left\" state=\"on\" inset=\"2\" id=\"5tp-ni-55q\">\n                            <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                        </buttonCell>\n                        <connections>\n                            <action selector=\"alignArgumentComments:\" target=\"-2\" id=\"o62-1G-Tta\"/>\n                        </connections>\n                    </button>\n                    <button id=\"yp5-mf-NgJ\">\n                        <rect key=\"frame\" x=\"66\" y=\"217\" width=\"326\" height=\"24\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <buttonCell key=\"cell\" type=\"check\" title=\"Add Default User Information\" bezelStyle=\"regularSquare\" imagePosition=\"left\" state=\"on\" inset=\"2\" id=\"7e3-kk-v20\">\n                            <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                        </buttonCell>\n                        <connections>\n                            <action selector=\"btnUseAuthorInformationPressed:\" target=\"-2\" id=\"cAF-1d-3Wh\"/>\n                        </connections>\n                    </button>\n                    <textField verticalHuggingPriority=\"750\" id=\"Haw-5R-IXR\">\n                        <rect key=\"frame\" x=\"83\" y=\"194\" width=\"60\" height=\"17\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" title=\"Author:\" id=\"s2i-JB-wgP\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <textField verticalHuggingPriority=\"750\" id=\"L0g-BX-Fh0\">\n                        <rect key=\"frame\" x=\"225\" y=\"167\" width=\"165\" height=\"22\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" state=\"on\" borderStyle=\"bezel\" alignment=\"left\" title=\"MM-dd-YYYY, HH:MM:ss\" drawsBackground=\"YES\" id=\"Krc-dg-Cog\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"textColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <button id=\"b6P-6I-DiH\">\n                        <rect key=\"frame\" x=\"83\" y=\"168\" width=\"90\" height=\"18\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <buttonCell key=\"cell\" type=\"check\" title=\"Add Date\" bezelStyle=\"regularSquare\" imagePosition=\"left\" state=\"on\" inset=\"2\" id=\"y0w-1Y-908\">\n                            <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                        </buttonCell>\n                        <connections>\n                            <action selector=\"btnUseDateInformationPressed:\" target=\"-2\" id=\"bKa-IH-b3m\"/>\n                        </connections>\n                    </button>\n                    <textField verticalHuggingPriority=\"750\" id=\"whT-H5-Xdo\">\n                        <rect key=\"frame\" x=\"172\" y=\"169\" width=\"59\" height=\"17\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" title=\"Format:\" id=\"To6-Zf-QbE\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                    <matrix verticalHuggingPriority=\"750\" allowsEmptySelection=\"NO\" autorecalculatesCellSize=\"YES\" id=\"F04-TF-nUJ\">\n                        <rect key=\"frame\" x=\"85\" y=\"366\" width=\"167\" height=\"67\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        <size key=\"cellSize\" width=\"167\" height=\"18\"/>\n                        <size key=\"intercellSpacing\" width=\"4\" height=\"2\"/>\n                        <buttonCell key=\"prototype\" type=\"radio\" title=\"Radio\" imagePosition=\"left\" alignment=\"left\" inset=\"2\" id=\"SMy-aZ-Tel\">\n                            <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                            <font key=\"font\" metaFont=\"system\"/>\n                        </buttonCell>\n                        <cells>\n                            <column>\n                                <buttonCell type=\"radio\" title=\"Use default placeholder\" imagePosition=\"left\" alignment=\"left\" state=\"on\" tag=\"1\" inset=\"2\" id=\"3Uj-1c-BzU\">\n                                    <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                </buttonCell>\n                                <buttonCell type=\"radio\" title=\"Use project version\" imagePosition=\"left\" alignment=\"left\" inset=\"2\" id=\"pSZ-Vj-hkT\">\n                                    <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                </buttonCell>\n                                <buttonCell type=\"radio\" title=\"Use specific version\" imagePosition=\"left\" alignment=\"left\" inset=\"2\" id=\"PbN-ts-AYz\">\n                                    <behavior key=\"behavior\" changeContents=\"YES\" doesNotDimImage=\"YES\" lightByContents=\"YES\"/>\n                                    <font key=\"font\" metaFont=\"system\"/>\n                                </buttonCell>\n                            </column>\n                        </cells>\n                        <connections>\n                            <action selector=\"mtxSinceOptionPressed:\" target=\"-2\" id=\"fFz-uM-7g0\"/>\n                        </connections>\n                    </matrix>\n                    <textField verticalHuggingPriority=\"750\" id=\"lQp-YM-3hX\">\n                        <rect key=\"frame\" x=\"279\" y=\"373\" width=\"96\" height=\"22\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                        <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" sendsActionOnEndEditing=\"YES\" state=\"on\" borderStyle=\"bezel\" placeholderString=\"Version\" drawsBackground=\"YES\" id=\"OAk-cF-UEV\">\n                            <font key=\"font\" metaFont=\"system\"/>\n                            <color key=\"textColor\" name=\"textColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                        </textFieldCell>\n                    </textField>\n                </subviews>\n            </view>\n            <connections>\n                <outlet property=\"delegate\" destination=\"-2\" id=\"4\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"424.5\" y=\"496\"/>\n        </window>\n    </objects>\n</document>\n"
  },
  {
    "path": "VVDocumenter-Xcode/Setting/VVDocumenterSetting.h",
    "content": "//\n//  VVDocumenterSetting.h\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 13-8-3.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import <Foundation/Foundation.h>\n\ntypedef NS_ENUM(NSInteger, VVDSinceOption) {\n    VVDSinceOptionPlaceholder,\n    VVDSinceOptionProjectVersion,\n    VVDSinceOptionSpecificVersion,\n};\n\nextern NSString *const VVDDefaultTriggerString;\nextern NSString *const VVDDefaultAuthorString;\nextern NSString *const VVDDefaultDateInfomationFormat;\n\n@interface VVDocumenterSetting : NSObject\n+ (VVDocumenterSetting *)defaultSetting;\n\n@property (readonly) NSInteger keyVCode;\n@property BOOL useSpaces;\n@property NSInteger spaceCount;\n@property NSString *triggerString;\n@property VVDSinceOption sinceOption;\n@property BOOL prefixWithStar;\n@property BOOL prefixWithSlashes;\n@property BOOL addSinceToComments;\n@property NSString *sinceVersion;\n@property BOOL briefDescription;\n@property BOOL useHeaderDoc;\n@property BOOL blankLinesBetweenSections;\n@property BOOL alignArgumentComments;\n@property BOOL useAuthorInformation;\n@property NSString *authorInformation;\n@property BOOL useDateInformation;\n@property NSString *dateInformationFormat;\n@property (readonly) NSString *spacesString;\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/Setting/VVDocumenterSetting.m",
    "content": "//\n//  VVDocumenterSetting.m\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 13-8-3.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import \"VVDocumenterSetting.h\"\n#import <Carbon/Carbon.h>\n#import \"VVProject.h\"\n\nNSString *const VVDDefaultTriggerString = @\"///\";\nNSString *const VVDDefaultAuthorString = @\"\";\nNSString *const VVDDefaultDateInfomationFormat = @\"YY-MM-dd HH:MM:ss\";\n\nNSString *const kVVDUseSpaces = @\"com.onevcat.VVDocumenter.useSpaces\";\nNSString *const kVVDSpaceCount = @\"com.onevcat.VVDocumenter.spaceCount\";\nNSString *const kVVDTriggerString = @\"com.onevcat.VVDocumenter.triggerString\";\nNSString *const kVVDPrefixWithStar = @\"com.onevcat.VVDocumenter.prefixWithStar\";\nNSString *const kVVDPrefixWithSlashes = @\"com.onevcat.VVDocumenter.prefixWithSlashes\";\nNSString *const kVVDAddSinceToComments = @\"com.onevcat.VVDocumenter.addSinceToComments\";\nNSString *const kVVDSinceVersion = @\"com.onevcat.VVDocumenter.sinceVersion\";\nNSString *const kVVDSinceOption = @\"com.onevcat.VVDocumenter.sinceOption\";\nNSString *const kVVDBriefDescription = @\"com.onevcat.VVDocumenter.briefDescription\";\nNSString *const kVVDUserHeaderDoc = @\"com.onevcat.VVDocumenter.useHeaderDoc\";\nNSString *const kVVDNoBlankLinesBetweenFields = @\"com.onevcat.VVDocumenter.noBlankLinesBetweenFields\";\nNSString *const kVVDNoArgumentPadding = @\"com.onevcat.VVDocumenter.noArgumentPadding\";\nNSString *const kVVDUseAuthorInformation = @\"com.onevcat.VVDocumenter.useAuthorInformation\";\nNSString *const kVVDAuthorInfomation = @\"com.onevcat.VVDocumenter.authorInfomation\";\nNSString *const kVVDUseDateInformation = @\"com.onevcat.VVDocumenter.useDateInformation\";\nNSString *const kVVDDateInformationFormat = @\"com.onevcat.VVDocumenter.dateInformationFomat\";\n@implementation VVDocumenterSetting\n\n+ (VVDocumenterSetting *)defaultSetting\n{\n    static dispatch_once_t once;\n    static VVDocumenterSetting *defaultSetting;\n    dispatch_once(&once, ^ {\n        defaultSetting = [[VVDocumenterSetting alloc] init];\n        \n        NSDictionary *defaults = @{kVVDPrefixWithStar: @YES,\n                                   kVVDUseSpaces: @YES};\n        [[NSUserDefaults standardUserDefaults] registerDefaults:defaults];\n    });\n    return defaultSetting;\n}\n\n-(BOOL) useSpaces\n{\n    return [[NSUserDefaults standardUserDefaults] boolForKey:kVVDUseSpaces];\n}\n\n-(void) setUseSpaces:(BOOL)useSpace\n{\n    [[NSUserDefaults standardUserDefaults] setBool:useSpace forKey:kVVDUseSpaces];\n    [[NSUserDefaults standardUserDefaults] synchronize];\n}\n\n-(NSInteger) keyVCode\n{\n    TISInputSourceRef inputSource = TISCopyCurrentKeyboardLayoutInputSource();\n    NSString *layoutID = (__bridge NSString *)TISGetInputSourceProperty(inputSource, kTISPropertyInputSourceID);\n    CFRelease(inputSource);\n\n    // Possible dvorak layout SourceIDs:\n    //    com.apple.keylayout.Dvorak (System Qwerty)\n    // But exclude:\n    //    com.apple.keylayout.DVORAK-QWERTYCMD (System Qwerty ⌘)\n    //    org.unknown.keylayout.DvorakImproved-Qwerty⌘ (http://www.macupdate.com/app/mac/24137/dvorak-improved-keyboard-layout)\n    if ([layoutID localizedCaseInsensitiveContainsString:@\"dvorak\"] && ![layoutID localizedCaseInsensitiveContainsString: @\"qwerty\"]) {\n        return kVK_ANSI_Period;\n    }\n\n    // Possible workman layout SourceIDs (https://github.com/ojbucao/Workman):\n    //    org.sil.ukelele.keyboardlayout.workman.workman\n    //    org.sil.ukelele.keyboardlayout.workman.workmanextended\n    //    org.sil.ukelele.keyboardlayout.workman.workman-io\n    //    org.sil.ukelele.keyboardlayout.workman.workman-p\n    //    org.sil.ukelele.keyboardlayout.workman.workman-pextended\n    //    org.sil.ukelele.keyboardlayout.workman.workman-dead\n    if ([layoutID localizedCaseInsensitiveContainsString:@\"workman\"]) {\n        return kVK_ANSI_B;\n    }\n\n    return kVK_ANSI_V;\n}\n\n\n-(NSInteger) spaceCount\n{\n    NSInteger count = [[NSUserDefaults standardUserDefaults] integerForKey:kVVDSpaceCount];\n    return (count <= 0) ? 2 : count;\n}\n\n-(void) setSpaceCount:(NSInteger)spaceCount\n{\n    if (spaceCount < 1) {\n        spaceCount = 1;\n    } else if (spaceCount > 10) {\n        spaceCount = 10;\n    }\n    \n    [[NSUserDefaults standardUserDefaults] setInteger:spaceCount forKey:kVVDSpaceCount];\n    [[NSUserDefaults standardUserDefaults] synchronize];\n}\n\n-(NSString *) triggerString\n{\n    NSString *s = [[NSUserDefaults standardUserDefaults] stringForKey:kVVDTriggerString];\n    if (s.length == 0) {\n        s = VVDDefaultTriggerString;\n    }\n    return s;\n}\n\n-(void) setTriggerString:(NSString *)triggerString\n{\n    if (triggerString.length == 0) {\n        [[NSUserDefaults standardUserDefaults] setObject:VVDDefaultTriggerString forKey:kVVDTriggerString];\n    } else {\n        [[NSUserDefaults standardUserDefaults] setObject:triggerString forKey:kVVDTriggerString];\n    }\n\n    [[NSUserDefaults standardUserDefaults] synchronize];\n}\n\n-(VVDSinceOption) sinceOption\n{\n    return (VVDSinceOption)[[NSUserDefaults standardUserDefaults] integerForKey:kVVDSinceOption];\n}\n\n- (void)setSinceOption:(VVDSinceOption)sinceOption\n{\n    [[NSUserDefaults standardUserDefaults] setInteger:sinceOption forKey:kVVDSinceOption];\n    [[NSUserDefaults standardUserDefaults] synchronize];\n}\n\n-(BOOL) prefixWithStar\n{\n    return [[NSUserDefaults standardUserDefaults] boolForKey:kVVDPrefixWithStar];\n}\n\n-(void) setPrefixWithStar:(BOOL)prefix\n{\n    [[NSUserDefaults standardUserDefaults] setBool:prefix forKey:kVVDPrefixWithStar];\n    [[NSUserDefaults standardUserDefaults] synchronize];\n}\n\n-(BOOL) prefixWithSlashes\n{\n    return [[NSUserDefaults standardUserDefaults] boolForKey:kVVDPrefixWithSlashes];\n}\n\n-(void) setPrefixWithSlashes:(BOOL)prefix\n{\n    [[NSUserDefaults standardUserDefaults] setBool:prefix forKey:kVVDPrefixWithSlashes];\n    [[NSUserDefaults standardUserDefaults] synchronize];\n}\n\n-(BOOL) addSinceToComments\n{\n    return [[NSUserDefaults standardUserDefaults] boolForKey:kVVDAddSinceToComments];\n}\n\n-(void) setAddSinceToComments:(BOOL)add\n{\n    [[NSUserDefaults standardUserDefaults] setBool:add forKey:kVVDAddSinceToComments];\n    [[NSUserDefaults standardUserDefaults] synchronize];\n}\n\n- (NSString *)sinceVersion\n{\n    NSString *sinceVersion = [[NSUserDefaults standardUserDefaults] objectForKey:kVVDSinceVersion];\n\n    if ( ! sinceVersion ) {\n        sinceVersion = @\"\";\n    }\n\n    return sinceVersion;\n}\n\n- (void)setSinceVersion:(NSString *)sinceVersion\n{\n    [[NSUserDefaults standardUserDefaults] setObject:sinceVersion forKey:kVVDSinceVersion];\n    [[NSUserDefaults standardUserDefaults] synchronize];\n}\n\n-(BOOL) briefDescription\n{\n    return [[NSUserDefaults standardUserDefaults] boolForKey:kVVDBriefDescription];\n}\n\n-(void) setBriefDescription:(BOOL)brief\n{\n    [[NSUserDefaults standardUserDefaults] setBool:brief forKey:kVVDBriefDescription];\n    [[NSUserDefaults standardUserDefaults] synchronize];\n}\n\n-(BOOL) useHeaderDoc\n{\n    return [[NSUserDefaults standardUserDefaults] boolForKey:kVVDUserHeaderDoc];\n}\n-(void) setUseHeaderDoc:(BOOL)use\n{\n    [[NSUserDefaults standardUserDefaults] setBool:use forKey:kVVDUserHeaderDoc];\n    [[NSUserDefaults standardUserDefaults] synchronize];\n}\n\n-(BOOL) blankLinesBetweenSections\n{\n    return ![[NSUserDefaults standardUserDefaults] boolForKey:kVVDNoBlankLinesBetweenFields];\n}\n-(void) setBlankLinesBetweenSections:(BOOL)blankLinesBetweenFields\n{\n    [[NSUserDefaults standardUserDefaults] setBool:!blankLinesBetweenFields forKey:kVVDNoBlankLinesBetweenFields];\n    [[NSUserDefaults standardUserDefaults] synchronize];\n}\n\n-(BOOL) alignArgumentComments\n{\n    return ![[NSUserDefaults standardUserDefaults] boolForKey:kVVDNoArgumentPadding];\n}\n-(void) setAlignArgumentComments:(BOOL)alignArgumentComments\n{\n    [[NSUserDefaults standardUserDefaults] setBool:!alignArgumentComments forKey:kVVDNoArgumentPadding];\n    [[NSUserDefaults standardUserDefaults] synchronize];\n}\n\n-(BOOL)useAuthorInformation\n{\n    return [[NSUserDefaults standardUserDefaults] boolForKey:kVVDUseAuthorInformation];\n}\n-(void) setUseAuthorInformation:(BOOL)useAuthorInformation\n{\n    [[NSUserDefaults standardUserDefaults] setBool:useAuthorInformation forKey:kVVDUseAuthorInformation];\n    [[NSUserDefaults standardUserDefaults] synchronize];\n}\n\n-(NSString *)authorInformation {\n    NSString *authorInformation = [[NSUserDefaults standardUserDefaults] objectForKey:kVVDAuthorInfomation];\n    if (authorInformation.length <= 0 ) {\n        NSString *name = [[VVProject projectForKeyWindow] organizeationName];\n        if (name.length <= 0) {\n            NSDictionary *environment = [[NSProcessInfo processInfo] environment];\n            name = [environment objectForKey:@\"LOGNAME\"];\n        }\n        \n        if (name.length > 0) {\n            authorInformation = name;\n        }else{\n            authorInformation = VVDDefaultAuthorString;\n        }\n    }\n    return authorInformation;\n}\n-(void)setAuthorInformation:(NSString *)authorInformation {\n    [[NSUserDefaults standardUserDefaults] setObject:authorInformation forKey:kVVDAuthorInfomation];\n    [[NSUserDefaults standardUserDefaults] synchronize];\n}\n\n-(BOOL)useDateInformation\n{\n    return [[NSUserDefaults standardUserDefaults] boolForKey:kVVDUseDateInformation];\n}\n-(void) setUseDateInformation:(BOOL)useDateInformation\n{\n    [[NSUserDefaults standardUserDefaults] setBool:useDateInformation forKey:kVVDUseDateInformation];\n    [[NSUserDefaults standardUserDefaults] synchronize];\n}\n\n-(NSString *)dateInformationFormat {\n    NSString *formatString = [[NSUserDefaults standardUserDefaults] objectForKey:kVVDDateInformationFormat];\n    if (formatString == nil || formatString.length <= 0) {\n        formatString = VVDDefaultDateInfomationFormat;\n    }\n    return formatString;\n}\n-(void)setDateInformationFormat:(NSString *)dateInformationFormat {\n    [[NSUserDefaults standardUserDefaults] setObject:dateInformationFormat forKey:kVVDDateInformationFormat];\n    [[NSUserDefaults standardUserDefaults] synchronize];\n}\n\n-(NSString *) spacesString\n{\n    if ([self useSpaces]) {\n        return [@\"\" stringByPaddingToLength:[self spaceCount] withString:@\" \" startingAtIndex:0];\n    } else {\n        return @\"\\t\";\n    }\n}\n\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/VVDocumenter-Xcode-Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>English</string>\n\t<key>CFBundleExecutable</key>\n\t<string>${EXECUTABLE_NAME}</string>\n\t<key>CFBundleIconFile</key>\n\t<string></string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>${PRODUCT_NAME}</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>DVTPlugInCompatibilityUUIDs</key>\n\t<array>\n\t\t<string>9AFF134A-08DC-4096-8CEE-62A4BB123046</string>\n\t\t<string>63FC1C47-140D-42B0-BB4D-A10B2D225574</string>\n\t\t<string>37B30044-3B14-46BA-ABAA-F01000C27B63</string>\n\t\t<string>640F884E-CE55-4B40-87C0-8869546CAB7A</string>\n\t\t<string>A2E4D43F-41F4-4FB9-BB94-7177011C9AED</string>\n\t\t<string>AD68E85B-441B-4301-B564-A45E4919A6AD</string>\n\t\t<string>C4A681B0-4A26-480E-93EC-1218098B9AA0</string>\n\t\t<string>FEC992CC-CA4A-4CFD-8881-77300FCB848A</string>\n\t\t<string>992275C1-432A-4CF7-B659-D84ED6D42D3F</string>\n\t\t<string>A16FF353-8441-459E-A50C-B071F53F51B7</string>\n\t\t<string>9F75337B-21B4-4ADC-B558-F9CADF7073A7</string>\n\t\t<string>992275C1-432A-4CF7-B659-D84ED6D42D3F</string>\n\t\t<string>8DC44374-2B35-4C57-A6FE-2AD66A36AAD9</string>\n\t\t<string>E969541F-E6F9-4D25-8158-72DC3545A6C6</string>\n\t\t<string>AABB7188-E14E-4433-AD3B-5CD791EAD9A3</string>\n\t\t<string>7FDF5C7A-131F-4ABB-9EDC-8C5F8F0B8A90</string>\n\t\t<string>0420B86A-AA43-4792-9ED0-6FE0F2B16A13</string>\n\t\t<string>CC0D0F4F-05B3-431A-8F33-F84AFCB2C651</string>\n\t\t<string>7265231C-39B4-402C-89E1-16167C4CC990</string>\n\t\t<string>F41BD31E-2683-44B8-AE7F-5F09E919790E</string>\n\t\t<string>E71C2CFE-BFD8-4044-8F06-00AE685A406C</string>\n\t\t<string>ACA8656B-FEA8-4B6D-8E4A-93F4C95C362C</string>\n\t\t<string>E0A62D1F-3C18-4D74-BFE5-A4167D643966</string>\n\t</array>\n\t<key>NSHumanReadableCopyright</key>\n\t<string>Copyright © 2013年 OneV's Den. All rights reserved.</string>\n\t<key>NSPrincipalClass</key>\n\t<string></string>\n\t<key>XC4Compatible</key>\n\t<true/>\n\t<key>XC5Compatible</key>\n\t<true/>\n\t<key>XCGCReady</key>\n\t<true/>\n\t<key>XCPluginHasUI</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "VVDocumenter-Xcode/VVDocumenter-Xcode-Prefix.pch",
    "content": "//\n// Prefix header for all source files of the 'VVDocumenter-Xcode' target in the 'VVDocumenter-Xcode' project\n//\n\n#ifdef __OBJC__\n    #import <Cocoa/Cocoa.h>\n    #import \"NSString+PDRegex.h\"\n#endif\n\n//#define __DEBUG__ 1\n#ifdef __DEBUG__\n#define VVLog(...) NSLog(__VA_ARGS__)\n#else\n#define VVLog(...) do{} while(0)\n#endif"
  },
  {
    "path": "VVDocumenter-Xcode/VVDocumenter.h",
    "content": "//\n//  VVDocumenter.h\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 13-7-17.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import <Foundation/Foundation.h>\n\n@interface VVDocumenter : NSObject\n-(instancetype) initWithCode:(NSString *)code;\n-(NSString *) baseIndentation;\n-(NSString *) document;\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/VVDocumenter.m",
    "content": "//\n//  VVDocumenter.m\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 13-7-17.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import \"VVDocumenter.h\"\n#import \"NSString+VVSyntax.h\"\n#import \"VVCommenter.h\"\n\n@interface VVDocumenter()\n\n@property (nonatomic, copy) NSString *code;\n@property (nonatomic, assign) BOOL isEnum;\n@property (nonatomic, assign) BOOL isSwiftEnum;\n\n@end\n\n@implementation VVDocumenter\n\n-(instancetype) initWithCode:(NSString *)code\n{\n    self = [super init];\n    if (self) {\n        NSString *trimmed = [[code vv_stringByReplacingRegexPattern:@\"\\\\s*(\\\\(.*\\?\\\\))\\\\s*\" withString:@\"$1\"]\n                             vv_stringByReplacingRegexPattern:@\"\\\\s*\\n\\\\s*\"           withString:@\" \"];\n        _isEnum = [trimmed vv_isEnum];\n        _isSwiftEnum = [trimmed vv_isSwiftEnum];\n        if (_isEnum || _isSwiftEnum) {\n            _code = code;\n        } else {\n            //Trim the space around the braces\n            //Then trim the new line character\n            _code = trimmed;\n        }\n    }\n    return self;\n}\n\n-(NSString *) baseIndentation\n{\n    NSArray *matchedSpaces = [self.code vv_stringsByExtractingGroupsUsingRegexPattern:@\"^(\\\\s*)\"];\n    if (matchedSpaces.count > 0) {\n        return matchedSpaces[0];\n    } else {\n        return @\"\";\n    }\n}\n\n-(NSString *) document\n{\n    NSString *trimCode = [self.code stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];\n    NSString *baseIndent = [self baseIndentation];\n    \n    VVBaseCommenter *commenter = nil;\n    \n    if (self.isEnum) {    \n        commenter = [[VVEnumCommenter alloc] initWithIndentString:baseIndent codeString:trimCode];\n    } else if (self.isSwiftEnum) {\n        commenter = [[VVSwiftEnumCommenter alloc] initWithIndentString:baseIndent codeString:trimCode];\n    } else if ([trimCode vv_isProperty]) {\n        commenter = [[VVPropertyCommenter alloc] initWithIndentString:baseIndent codeString:trimCode];\n    } else if ([trimCode vv_isCFunction]) {\n        commenter = [[VVFunctionCommenter alloc] initWithIndentString:baseIndent codeString:trimCode];\n    } else if ([trimCode vv_isMacro]) {\n        commenter = [[VVMacroCommenter alloc] initWithIndentString:baseIndent codeString:trimCode];\n    } else if ([trimCode vv_isStruct]) {\n        commenter = [[VVStructCommenter alloc] initWithIndentString:baseIndent codeString:trimCode];\n    } else if ([trimCode vv_isUnion]) {\n        commenter = [[VVStructCommenter alloc] initWithIndentString:baseIndent codeString:trimCode];\n    } else if ([trimCode vv_isObjCMethod]) {\n        commenter = [[VVMethodCommenter alloc] initWithIndentString:baseIndent codeString:trimCode];\n    } else if ([trimCode vv_isSwiftFunction]) {\n        commenter = [[VVSwiftFunctionCommenter alloc] initWithIndentString:baseIndent codeString:trimCode];\n    } else if ([trimCode vv_isSwiftProperty]) {\n        commenter = [[VVSwiftPropertyCommenter alloc] initWithIndentString:baseIndent codeString:trimCode];\n    } else if ([trimCode vv_isSwiftExtension]) {\n        commenter = [[VVSwiftExtensionCommenter alloc] initWithIndentString:baseIndent codeString:trimCode];\n    } else {\n        commenter = [[VVVariableCommenter alloc] initWithIndentString:baseIndent codeString:trimCode];\n    }\n\n    if ([commenter shouldComment]) {\n        return [commenter document];\n    } else {\n        return nil;\n    }\n}\n\n\n\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/VVDocumenterManager.h",
    "content": "//\n//  VVDocumenterManager.h\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 13-7-16.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import <Foundation/Foundation.h>\n\n@interface VVDocumenterManager : NSObject\n\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/VVDocumenterManager.m",
    "content": "//\n//  VVDocumenterManager.m\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 13-7-16.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import \"VVDocumenterManager.h\"\n#import \"NSTextView+VVTextGetter.h\"\n#import \"NSString+VVSyntax.h\"\n#import \"VVDocumenter.h\"\n#import \"VVKeyboardEventSender.h\"\n#import \"VVDSettingPanelWindowController.h\"\n#import \"VVDocumenterSetting.h\"\n#import \"VVTextResult.h\"\n\n@interface VVDocumenterManager()\n@property (nonatomic, strong) id eventMonitor;\n@property (nonatomic, assign) BOOL prefixTyped;\n@property (nonatomic, strong) VVDSettingPanelWindowController *settingPanel;\n@end\n\n@implementation VVDocumenterManager\n+(void)pluginDidLoad:(NSBundle *)plugin {\n    VVLog(@\"VVDocumenter: Plugin loaded successfully\");\n    [self shared];\n}\n\n+(instancetype) shared {\n    static dispatch_once_t once;\n    static id instance = nil;\n    dispatch_once(&once, ^{\n        instance = [[self alloc] init];\n    });\n    return instance;\n}\n\n- (instancetype)init {\n    if (self = [super init]) {\n        [[NSNotificationCenter defaultCenter] addObserver:self\n                                                 selector:@selector(applicationDidFinishLaunching:)\n                                                     name:NSApplicationDidFinishLaunchingNotification\n                                                   object:nil];\n    }\n    return self;\n}\n\n- (void) applicationDidFinishLaunching: (NSNotification*) noti {\n    [[NSNotificationCenter defaultCenter] addObserver:self\n                                             selector:@selector(textStorageDidChange:)\n                                                 name:NSTextDidChangeNotification\n                                               object:nil];\n    [self addSettingMenu];\n}\n\n-(void) addSettingMenu\n{\n    NSMenuItem *editMenuItem = [[NSApp mainMenu] itemWithTitle:@\"Window\"];\n    if (editMenuItem) {\n        [[editMenuItem submenu] addItem:[NSMenuItem separatorItem]];\n        \n        NSMenuItem *newMenuItem = [[NSMenuItem alloc] initWithTitle:@\"VVDocumenter\" action:@selector(showSettingPanel:) keyEquivalent:@\"\"];\n        \n        [newMenuItem setTarget:self];\n        [[editMenuItem submenu] addItem:newMenuItem];\n    }\n}\n\n-(void) showSettingPanel:(NSNotification *)noti {\n    self.settingPanel = [[VVDSettingPanelWindowController alloc] initWithWindowNibName:@\"VVDSettingPanelWindowController\"];\n    [self.settingPanel showWindow:self.settingPanel];\n}\n\n- (void) textStorageDidChange:(NSNotification *)noti {\n\n    if ([[noti object] isKindOfClass:[NSTextView class]]) {\n        NSTextView *textView = (NSTextView *)[noti object];\n        VVTextResult *currentLineResult = [textView vv_textResultOfCurrentLine];\n        if (currentLineResult) {\n\n            //Check if there is a \"//\" already typed in. We do this to solve the undo issue\n            //Otherwise when you press Cmd+Z, \"///\" will be recognized and trigger the doc inserting, so you can not perform an undo.\n            NSString *triggerString = [[VVDocumenterSetting defaultSetting] triggerString];\n            \n            if (triggerString.length > 1) {\n                NSString *preTypeString = [triggerString substringToIndex:triggerString.length - 2];\n                self.prefixTyped = [currentLineResult.string vv_matchesPatternRegexPattern:[NSString stringWithFormat:@\"^\\\\s*%@$\",[NSRegularExpression escapedPatternForString:preTypeString]]] | self.prefixTyped;\n            } else {\n                self.prefixTyped = YES;\n            }\n            \n            if ([currentLineResult.string vv_matchesPatternRegexPattern:[NSString stringWithFormat:@\"^\\\\s*%@$\",[NSRegularExpression escapedPatternForString:triggerString]]] && self.prefixTyped) {\n                VVTextResult *previousLineResult = [textView vv_textResultOfPreviousLine];\n\n                // Previous line is a documentation comment, so ignore this\n                if ([previousLineResult.string vv_matchesPatternRegexPattern:@\"^\\\\s*///\"]) {\n                    return;\n                }\n\n                VVTextResult *nextLineResult = [textView vv_textResultOfNextLine];\n\n                // Next line is a documentation comment, so ignore this\n                if ([nextLineResult.string vv_matchesPatternRegexPattern:@\"^\\\\s*///\"]) {\n                    return;\n                }\n                \n                //Get a @\"///\" (triggerString) typed in by user. Do work!\n                self.prefixTyped = NO;\n\n                __block BOOL shouldReplace = NO;\n                \n                //Decide which is closer to the cursor. A semicolon or a half brace.\n                //We just want to document the next valid line.\n                VVTextResult *resultUntilSemiColon = [textView vv_textResultUntilNextString:@\";\"];\n                VVTextResult *resultUntilBrace = [textView vv_textResultUntilNextString:@\"{\"];\n                VVTextResult *resultUntilFileEnd = [textView vv_textResultToEndOfFile];\n                \n                VVTextResult *resultToDocument = nil;\n                \n                if (resultUntilSemiColon && resultUntilBrace) {\n                    resultToDocument = (resultUntilSemiColon.range.length < resultUntilBrace.range.length) ? resultUntilSemiColon : resultUntilBrace;\n                } else if (resultUntilBrace) {\n                    resultToDocument = resultUntilBrace;\n                } else if (resultUntilSemiColon) {\n                    resultToDocument = resultUntilSemiColon;\n                } else {\n                    resultToDocument = resultUntilFileEnd;\n                }\n                \n                //We always write document until semicolon for enum. (Maybe struct later)\n                if ([resultToDocument.string vv_isEnum]) {\n                    resultToDocument = resultUntilSemiColon;\n                    shouldReplace = YES;\n                }\n                \n                NSString *inputCode = nil;\n                if ([resultToDocument.string vv_isSwiftEnum]) {\n                    inputCode = [textView vv_textResultWithPairOpenString:@\"{\" closeString:@\"}\"].string;\n                } else {\n                    inputCode = [resultToDocument.string vv_stringByConvertingToUniform];\n                }\n                \n                VVDocumenter *doc = [[VVDocumenter alloc] initWithCode:inputCode];\n                NSString *documentationString = [doc document];\n                \n                if (!documentationString) {\n                    //Leave the user's input there.\n                    //It might be no need to parse doc or something wrong.\n                    return;\n                }\n                \n                //Now we are using a simulation of keyboard event to insert the docs, instead of using the IDE's private method.\n                //See more at https://github.com/onevcat/VVDocumenter-Xcode/issues/3\n\n                //Save current content in paste board\n                NSPasteboard *pasteBoard = [NSPasteboard generalPasteboard];\n                NSString *originPBString = [pasteBoard stringForType:NSPasteboardTypeString];\n\n                //Set the doc comments in it\n                [pasteBoard declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:nil];\n                [pasteBoard setString:documentationString forType:NSStringPboardType];\n                \n                //Begin to simulate keyborad pressing\n                VVKeyboardEventSender *kes = [[VVKeyboardEventSender alloc] init];\n                [kes beginKeyBoradEvents];\n                //Cmd+delete Delete current line\n                [kes sendKeyCode:kVK_Delete withModifierCommand:YES alt:NO shift:NO control:NO];\n                //if (shouldReplace) [textView setSelectedRange:resultToDocument.range];\n                //Cmd+V, paste (which key to actually use is based on the current keyboard layout)\n                NSInteger kKeyVCode = [[VVDocumenterSetting defaultSetting] keyVCode];\n                [kes sendKeyCode:kKeyVCode withModifierCommand:YES alt:NO shift:NO control:NO];\n                \n                //The key down is just a defined finish signal by me. When we receive this key, we know operation above is finished.\n                [kes sendKeyCode:kVK_F20];\n\n                self.eventMonitor = [NSEvent addLocalMonitorForEventsMatchingMask:NSKeyDownMask handler:^NSEvent *(NSEvent *incomingEvent) {\n                    if ([incomingEvent type] == NSKeyDown && [incomingEvent keyCode] == kVK_F20) {\n                        //Finish signal arrived, no need to observe the event\n                        [NSEvent removeMonitor:self.eventMonitor];\n                        self.eventMonitor = nil;\n                        \n                        //Restore previois patse board content\n                        [pasteBoard setString:originPBString forType:NSStringPboardType];\n                        \n                        //Set cursor before the inserted documentation. So we can use tab to begin edit.\n                        int baseIndentationLength = (int)[doc baseIndentation].length;\n                        [textView setSelectedRange:NSMakeRange(currentLineResult.range.location + baseIndentationLength, 0)];\n                        \n                        //Send a 'tab' after insert the doc. For our lazy programmers. :)\n                        [kes sendKeyCode:kVK_Tab];\n                        [kes endKeyBoradEvents];\n                        \n                        shouldReplace = NO;\n                        \n                        //Invalidate the finish signal, in case you set it to do some other thing.\n                        return nil;\n                    } else if ([incomingEvent type] == NSKeyDown && [incomingEvent keyCode] == kKeyVCode && shouldReplace == YES) {\n                        //Select input line and the define code block.\n                        NSRange r = [textView vv_textResultUntilNextString:@\";\"].range;\n                        \n                        //NSRange r begins from the starting of enum(struct) line. Select 1 character before to include the trigger input line.\n                        [textView setSelectedRange:NSMakeRange(r.location - 1, r.length + 1)];\n                        return incomingEvent;\n                    } else {\n                        return incomingEvent;\n                    }\n                }];\n            }\n        }\n    }\n}\n\n@end\n"
  },
  {
    "path": "VVDocumenter-Xcode/en.lproj/InfoPlist.strings",
    "content": "/* Localized versions of Info.plist keys */\n\n"
  },
  {
    "path": "VVDocumenter-Xcode.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t4B06DF741B315E9D007D69BE /* VVSwiftExtensionCommenter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B50A26F1B315CF3008A4400 /* VVSwiftExtensionCommenter.m */; };\n\t\t4B50A2701B315CF3008A4400 /* VVSwiftExtensionCommenter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B50A26F1B315CF3008A4400 /* VVSwiftExtensionCommenter.m */; };\n\t\t53C67935184501030030C553 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 893D8F7F18262EF500E8A00C /* Carbon.framework */; };\n\t\t893D8F8018262EF500E8A00C /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 893D8F7F18262EF500E8A00C /* Carbon.framework */; };\n\t\tC4052CFA1B3BB10700ED0CF0 /* VVProject.m in Sources */ = {isa = PBXBuildFile; fileRef = C4052CF71B3BB10700ED0CF0 /* VVProject.m */; };\n\t\tC4052CFB1B3BB10700ED0CF0 /* VVWorkspaceManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C4052CF91B3BB10700ED0CF0 /* VVWorkspaceManager.m */; };\n\t\tC4052CFC1B3BB2C200ED0CF0 /* VVProject.m in Sources */ = {isa = PBXBuildFile; fileRef = C4052CF71B3BB10700ED0CF0 /* VVProject.m */; };\n\t\tC4052CFD1B3BB2C200ED0CF0 /* VVWorkspaceManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C4052CF91B3BB10700ED0CF0 /* VVWorkspaceManager.m */; };\n\t\tD114BEE0179644D00043FA65 /* NSString+PDRegex.m in Sources */ = {isa = PBXBuildFile; fileRef = D114BEDE179644D00043FA65 /* NSString+PDRegex.m */; };\n\t\tD114BEE3179644FA0043FA65 /* NSTextView+VVTextGetter.m in Sources */ = {isa = PBXBuildFile; fileRef = D114BEE2179644FA0043FA65 /* NSTextView+VVTextGetter.m */; };\n\t\tD11C542D17999D9000D3DE38 /* VVArgument.m in Sources */ = {isa = PBXBuildFile; fileRef = D11C542B17999D9000D3DE38 /* VVArgument.m */; };\n\t\tD124614717AC16820095F9D6 /* VVDocumenterSetting.m in Sources */ = {isa = PBXBuildFile; fileRef = D124614317AC16820095F9D6 /* VVDocumenterSetting.m */; };\n\t\tD124614817AC16820095F9D6 /* VVDSettingPanelWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = D124614517AC16820095F9D6 /* VVDSettingPanelWindowController.m */; };\n\t\tD124614917AC16820095F9D6 /* VVDSettingPanelWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = D124614617AC16820095F9D6 /* VVDSettingPanelWindowController.xib */; };\n\t\tD13EDDD91987F34C0029A555 /* VVSwiftFunctionCommenter.m in Sources */ = {isa = PBXBuildFile; fileRef = D13EDDD81987F34C0029A555 /* VVSwiftFunctionCommenter.m */; };\n\t\tD14070C418CE8819009B0EED /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D14070C318CE8819009B0EED /* XCTest.framework */; };\n\t\tD14110A61988C07E00A7083F /* VVTestHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = D1C462EC17999C9A00EB7B23 /* VVTestHelper.m */; };\n\t\tD14110A71988C08700A7083F /* VVDocumenterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = D1C462E517999C2000EB7B23 /* VVDocumenterTests.m */; };\n\t\tD14110A81988C12000A7083F /* VVArgument.m in Sources */ = {isa = PBXBuildFile; fileRef = D11C542B17999D9000D3DE38 /* VVArgument.m */; };\n\t\tD14110A91988C12000A7083F /* VVBaseCommenter.m in Sources */ = {isa = PBXBuildFile; fileRef = D16AFCD31796E088006719AA /* VVBaseCommenter.m */; };\n\t\tD14110AA1988C12000A7083F /* VVPropertyCommenter.m in Sources */ = {isa = PBXBuildFile; fileRef = D16AFCD61796E09E006719AA /* VVPropertyCommenter.m */; };\n\t\tD14110AB1988C12000A7083F /* VVMethodCommenter.m in Sources */ = {isa = PBXBuildFile; fileRef = D16AFCD91796E0AC006719AA /* VVMethodCommenter.m */; };\n\t\tD14110AC1988C12000A7083F /* VVFunctionCommenter.m in Sources */ = {isa = PBXBuildFile; fileRef = D16AFCDC1796E0B9006719AA /* VVFunctionCommenter.m */; };\n\t\tD14110AD1988C12000A7083F /* VVSwiftFunctionCommenter.m in Sources */ = {isa = PBXBuildFile; fileRef = D13EDDD81987F34C0029A555 /* VVSwiftFunctionCommenter.m */; };\n\t\tD14110AE1988C12000A7083F /* VVMacroCommenter.m in Sources */ = {isa = PBXBuildFile; fileRef = D16AFCDF1796E0C0006719AA /* VVMacroCommenter.m */; };\n\t\tD14110AF1988C12000A7083F /* VVStructCommenter.m in Sources */ = {isa = PBXBuildFile; fileRef = D16AFCE21796E0C9006719AA /* VVStructCommenter.m */; };\n\t\tD14110B01988C12000A7083F /* VVEnumCommenter.m in Sources */ = {isa = PBXBuildFile; fileRef = D16AFCE51796E0D0006719AA /* VVEnumCommenter.m */; };\n\t\tD14110B11988C12000A7083F /* VVVariableCommenter.m in Sources */ = {isa = PBXBuildFile; fileRef = D16AFCE81796E0D6006719AA /* VVVariableCommenter.m */; };\n\t\tD14110B21988C12F00A7083F /* VVKeyboardEventSender.m in Sources */ = {isa = PBXBuildFile; fileRef = D1D66CA717A2AEF000E62F99 /* VVKeyboardEventSender.m */; };\n\t\tD14110B31988C12F00A7083F /* NSString+VVSyntax.m in Sources */ = {isa = PBXBuildFile; fileRef = D1C462F417999CEC00EB7B23 /* NSString+VVSyntax.m */; };\n\t\tD14110B41988C12F00A7083F /* NSString+PDRegex.m in Sources */ = {isa = PBXBuildFile; fileRef = D114BEDE179644D00043FA65 /* NSString+PDRegex.m */; };\n\t\tD14110B51988C12F00A7083F /* NSTextView+VVTextGetter.m in Sources */ = {isa = PBXBuildFile; fileRef = D114BEE2179644FA0043FA65 /* NSTextView+VVTextGetter.m */; };\n\t\tD14110B61988C12F00A7083F /* VVDocumenterManager.m in Sources */ = {isa = PBXBuildFile; fileRef = D16917DE17955C8D0036C06B /* VVDocumenterManager.m */; };\n\t\tD14110B71988C12F00A7083F /* VVDocumenter.m in Sources */ = {isa = PBXBuildFile; fileRef = D1AC3B8E1796DB070063A484 /* VVDocumenter.m */; };\n\t\tD14110B81988C14500A7083F /* VVDocumenterSetting.m in Sources */ = {isa = PBXBuildFile; fileRef = D124614317AC16820095F9D6 /* VVDocumenterSetting.m */; };\n\t\tD14110B91988C14500A7083F /* VVDSettingPanelWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = D124614517AC16820095F9D6 /* VVDSettingPanelWindowController.m */; };\n\t\tD14380F7179551B900C829CE /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D14380F6179551B900C829CE /* Cocoa.framework */; };\n\t\tD1438101179551B900C829CE /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = D14380FF179551B900C829CE /* InfoPlist.strings */; };\n\t\tD16AFCD41796E088006719AA /* VVBaseCommenter.m in Sources */ = {isa = PBXBuildFile; fileRef = D16AFCD31796E088006719AA /* VVBaseCommenter.m */; };\n\t\tD16AFCD71796E09E006719AA /* VVPropertyCommenter.m in Sources */ = {isa = PBXBuildFile; fileRef = D16AFCD61796E09E006719AA /* VVPropertyCommenter.m */; };\n\t\tD16AFCDA1796E0AC006719AA /* VVMethodCommenter.m in Sources */ = {isa = PBXBuildFile; fileRef = D16AFCD91796E0AC006719AA /* VVMethodCommenter.m */; };\n\t\tD16AFCDD1796E0B9006719AA /* VVFunctionCommenter.m in Sources */ = {isa = PBXBuildFile; fileRef = D16AFCDC1796E0B9006719AA /* VVFunctionCommenter.m */; };\n\t\tD16AFCE01796E0C0006719AA /* VVMacroCommenter.m in Sources */ = {isa = PBXBuildFile; fileRef = D16AFCDF1796E0C0006719AA /* VVMacroCommenter.m */; };\n\t\tD16AFCE31796E0C9006719AA /* VVStructCommenter.m in Sources */ = {isa = PBXBuildFile; fileRef = D16AFCE21796E0C9006719AA /* VVStructCommenter.m */; };\n\t\tD16AFCE61796E0D0006719AA /* VVEnumCommenter.m in Sources */ = {isa = PBXBuildFile; fileRef = D16AFCE51796E0D0006719AA /* VVEnumCommenter.m */; };\n\t\tD16AFCE91796E0D6006719AA /* VVVariableCommenter.m in Sources */ = {isa = PBXBuildFile; fileRef = D16AFCE81796E0D6006719AA /* VVVariableCommenter.m */; };\n\t\tD1737637198A4C8A00FE2355 /* NSString+VVTextGetter.m in Sources */ = {isa = PBXBuildFile; fileRef = D1737636198A4C8A00FE2355 /* NSString+VVTextGetter.m */; };\n\t\tD173763A198A4CF700FE2355 /* VVTextResult.m in Sources */ = {isa = PBXBuildFile; fileRef = D1737639198A4CF700FE2355 /* VVTextResult.m */; };\n\t\tD173763B198A53C000FE2355 /* NSString+VVTextGetter.m in Sources */ = {isa = PBXBuildFile; fileRef = D1737636198A4C8A00FE2355 /* NSString+VVTextGetter.m */; };\n\t\tD173763C198A53C000FE2355 /* VVTextResult.m in Sources */ = {isa = PBXBuildFile; fileRef = D1737639198A4CF700FE2355 /* VVTextResult.m */; };\n\t\tD18224DC17956290001A5E8A /* VVDocumenterManager.m in Sources */ = {isa = PBXBuildFile; fileRef = D16917DE17955C8D0036C06B /* VVDocumenterManager.m */; };\n\t\tD1986F74179A12BD00EA6643 /* CommenterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = D1986F73179A12BD00EA6643 /* CommenterTests.m */; };\n\t\tD1A6B1D0198A0D8600BCED83 /* VVSwiftPropertyCommenter.m in Sources */ = {isa = PBXBuildFile; fileRef = D1A6B1CF198A0D8600BCED83 /* VVSwiftPropertyCommenter.m */; };\n\t\tD1A6B1D1198A0D8600BCED83 /* VVSwiftPropertyCommenter.m in Sources */ = {isa = PBXBuildFile; fileRef = D1A6B1CF198A0D8600BCED83 /* VVSwiftPropertyCommenter.m */; };\n\t\tD1AC3B8F1796DB070063A484 /* VVDocumenter.m in Sources */ = {isa = PBXBuildFile; fileRef = D1AC3B8E1796DB070063A484 /* VVDocumenter.m */; };\n\t\tD1B316D6189A2AA700420A6E /* VVMethodTestsCode.plist in Resources */ = {isa = PBXBuildFile; fileRef = D1B316D5189A2AA700420A6E /* VVMethodTestsCode.plist */; };\n\t\tD1C462DD17999C2000EB7B23 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D14380F6179551B900C829CE /* Cocoa.framework */; };\n\t\tD1C462E317999C2000EB7B23 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = D1C462E117999C2000EB7B23 /* InfoPlist.strings */; };\n\t\tD1C462F117999CA200EB7B23 /* SyntaxTests.m in Sources */ = {isa = PBXBuildFile; fileRef = D1C462F017999CA200EB7B23 /* SyntaxTests.m */; };\n\t\tD1C462F517999CEC00EB7B23 /* NSString+VVSyntax.m in Sources */ = {isa = PBXBuildFile; fileRef = D1C462F417999CEC00EB7B23 /* NSString+VVSyntax.m */; };\n\t\tD1C6124819891B3700FDB554 /* VVSwiftEnumCommenter.m in Sources */ = {isa = PBXBuildFile; fileRef = D1C6124719891B3700FDB554 /* VVSwiftEnumCommenter.m */; };\n\t\tD1C6124919891B3700FDB554 /* VVSwiftEnumCommenter.m in Sources */ = {isa = PBXBuildFile; fileRef = D1C6124719891B3700FDB554 /* VVSwiftEnumCommenter.m */; };\n\t\tD1D66CA817A2AEF000E62F99 /* VVKeyboardEventSender.m in Sources */ = {isa = PBXBuildFile; fileRef = D1D66CA717A2AEF000E62F99 /* VVKeyboardEventSender.m */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t4B50A26E1B315CF3008A4400 /* VVSwiftExtensionCommenter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VVSwiftExtensionCommenter.h; sourceTree = \"<group>\"; };\n\t\t4B50A26F1B315CF3008A4400 /* VVSwiftExtensionCommenter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VVSwiftExtensionCommenter.m; sourceTree = \"<group>\"; };\n\t\t893D8F7F18262EF500E8A00C /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; };\n\t\tC4052CF61B3BB10700ED0CF0 /* VVProject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VVProject.h; sourceTree = \"<group>\"; };\n\t\tC4052CF71B3BB10700ED0CF0 /* VVProject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VVProject.m; sourceTree = \"<group>\"; };\n\t\tC4052CF81B3BB10700ED0CF0 /* VVWorkspaceManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VVWorkspaceManager.h; sourceTree = \"<group>\"; };\n\t\tC4052CF91B3BB10700ED0CF0 /* VVWorkspaceManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VVWorkspaceManager.m; sourceTree = \"<group>\"; };\n\t\tD114BEDD179644D00043FA65 /* NSString+PDRegex.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NSString+PDRegex.h\"; sourceTree = \"<group>\"; };\n\t\tD114BEDE179644D00043FA65 /* NSString+PDRegex.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"NSString+PDRegex.m\"; sourceTree = \"<group>\"; };\n\t\tD114BEE1179644FA0043FA65 /* NSTextView+VVTextGetter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NSTextView+VVTextGetter.h\"; sourceTree = \"<group>\"; };\n\t\tD114BEE2179644FA0043FA65 /* NSTextView+VVTextGetter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"NSTextView+VVTextGetter.m\"; sourceTree = \"<group>\"; };\n\t\tD11C542A17999D9000D3DE38 /* VVArgument.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VVArgument.h; sourceTree = \"<group>\"; };\n\t\tD11C542B17999D9000D3DE38 /* VVArgument.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VVArgument.m; sourceTree = \"<group>\"; };\n\t\tD11C542C17999D9000D3DE38 /* VVCommenter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VVCommenter.h; sourceTree = \"<group>\"; };\n\t\tD124614217AC16820095F9D6 /* VVDocumenterSetting.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VVDocumenterSetting.h; path = \"VVDocumenter-Xcode/Setting/VVDocumenterSetting.h\"; sourceTree = SOURCE_ROOT; };\n\t\tD124614317AC16820095F9D6 /* VVDocumenterSetting.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VVDocumenterSetting.m; path = \"VVDocumenter-Xcode/Setting/VVDocumenterSetting.m\"; sourceTree = SOURCE_ROOT; };\n\t\tD124614417AC16820095F9D6 /* VVDSettingPanelWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VVDSettingPanelWindowController.h; path = \"VVDocumenter-Xcode/Setting/VVDSettingPanelWindowController.h\"; sourceTree = SOURCE_ROOT; };\n\t\tD124614517AC16820095F9D6 /* VVDSettingPanelWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VVDSettingPanelWindowController.m; path = \"VVDocumenter-Xcode/Setting/VVDSettingPanelWindowController.m\"; sourceTree = SOURCE_ROOT; };\n\t\tD124614617AC16820095F9D6 /* VVDSettingPanelWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = VVDSettingPanelWindowController.xib; path = \"VVDocumenter-Xcode/Setting/VVDSettingPanelWindowController.xib\"; sourceTree = SOURCE_ROOT; };\n\t\tD13EDDD71987F34C0029A555 /* VVSwiftFunctionCommenter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VVSwiftFunctionCommenter.h; sourceTree = \"<group>\"; };\n\t\tD13EDDD81987F34C0029A555 /* VVSwiftFunctionCommenter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VVSwiftFunctionCommenter.m; sourceTree = \"<group>\"; };\n\t\tD14070C318CE8819009B0EED /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; };\n\t\tD14380F3179551B900C829CE /* VVDocumenter-Xcode.xcplugin */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = \"VVDocumenter-Xcode.xcplugin\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tD14380F6179551B900C829CE /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };\n\t\tD14380F9179551B900C829CE /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; };\n\t\tD14380FA179551B900C829CE /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; };\n\t\tD14380FB179551B900C829CE /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };\n\t\tD14380FE179551B900C829CE /* VVDocumenter-Xcode-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = \"VVDocumenter-Xcode-Info.plist\"; sourceTree = \"<group>\"; };\n\t\tD1438100179551B900C829CE /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\tD1438102179551B900C829CE /* VVDocumenter-Xcode-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"VVDocumenter-Xcode-Prefix.pch\"; sourceTree = \"<group>\"; };\n\t\tD16917DD17955C8D0036C06B /* VVDocumenterManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VVDocumenterManager.h; sourceTree = \"<group>\"; };\n\t\tD16917DE17955C8D0036C06B /* VVDocumenterManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VVDocumenterManager.m; sourceTree = \"<group>\"; };\n\t\tD16AFCD21796E088006719AA /* VVBaseCommenter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VVBaseCommenter.h; sourceTree = \"<group>\"; };\n\t\tD16AFCD31796E088006719AA /* VVBaseCommenter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VVBaseCommenter.m; sourceTree = \"<group>\"; };\n\t\tD16AFCD51796E09E006719AA /* VVPropertyCommenter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VVPropertyCommenter.h; sourceTree = \"<group>\"; };\n\t\tD16AFCD61796E09E006719AA /* VVPropertyCommenter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VVPropertyCommenter.m; sourceTree = \"<group>\"; };\n\t\tD16AFCD81796E0AC006719AA /* VVMethodCommenter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VVMethodCommenter.h; sourceTree = \"<group>\"; };\n\t\tD16AFCD91796E0AC006719AA /* VVMethodCommenter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VVMethodCommenter.m; sourceTree = \"<group>\"; };\n\t\tD16AFCDB1796E0B9006719AA /* VVFunctionCommenter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VVFunctionCommenter.h; sourceTree = \"<group>\"; };\n\t\tD16AFCDC1796E0B9006719AA /* VVFunctionCommenter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VVFunctionCommenter.m; sourceTree = \"<group>\"; };\n\t\tD16AFCDE1796E0C0006719AA /* VVMacroCommenter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VVMacroCommenter.h; sourceTree = \"<group>\"; };\n\t\tD16AFCDF1796E0C0006719AA /* VVMacroCommenter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VVMacroCommenter.m; sourceTree = \"<group>\"; };\n\t\tD16AFCE11796E0C9006719AA /* VVStructCommenter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VVStructCommenter.h; sourceTree = \"<group>\"; };\n\t\tD16AFCE21796E0C9006719AA /* VVStructCommenter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VVStructCommenter.m; sourceTree = \"<group>\"; };\n\t\tD16AFCE41796E0D0006719AA /* VVEnumCommenter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VVEnumCommenter.h; sourceTree = \"<group>\"; };\n\t\tD16AFCE51796E0D0006719AA /* VVEnumCommenter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VVEnumCommenter.m; sourceTree = \"<group>\"; };\n\t\tD16AFCE71796E0D6006719AA /* VVVariableCommenter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VVVariableCommenter.h; sourceTree = \"<group>\"; };\n\t\tD16AFCE81796E0D6006719AA /* VVVariableCommenter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VVVariableCommenter.m; sourceTree = \"<group>\"; };\n\t\tD1737635198A4C8A00FE2355 /* NSString+VVTextGetter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NSString+VVTextGetter.h\"; sourceTree = \"<group>\"; };\n\t\tD1737636198A4C8A00FE2355 /* NSString+VVTextGetter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"NSString+VVTextGetter.m\"; sourceTree = \"<group>\"; };\n\t\tD1737638198A4CF700FE2355 /* VVTextResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VVTextResult.h; sourceTree = \"<group>\"; };\n\t\tD1737639198A4CF700FE2355 /* VVTextResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VVTextResult.m; sourceTree = \"<group>\"; };\n\t\tD1986F73179A12BD00EA6643 /* CommenterTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CommenterTests.m; sourceTree = \"<group>\"; };\n\t\tD1A6B1CE198A0D8600BCED83 /* VVSwiftPropertyCommenter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VVSwiftPropertyCommenter.h; sourceTree = \"<group>\"; };\n\t\tD1A6B1CF198A0D8600BCED83 /* VVSwiftPropertyCommenter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VVSwiftPropertyCommenter.m; sourceTree = \"<group>\"; };\n\t\tD1AC3B8D1796DB070063A484 /* VVDocumenter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VVDocumenter.h; sourceTree = \"<group>\"; };\n\t\tD1AC3B8E1796DB070063A484 /* VVDocumenter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VVDocumenter.m; sourceTree = \"<group>\"; };\n\t\tD1B316D5189A2AA700420A6E /* VVMethodTestsCode.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = VVMethodTestsCode.plist; sourceTree = \"<group>\"; };\n\t\tD1C462DA17999C2000EB7B23 /* VVDocumenterTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = VVDocumenterTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tD1C462E017999C2000EB7B23 /* VVDocumenterTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = \"VVDocumenterTests-Info.plist\"; sourceTree = \"<group>\"; };\n\t\tD1C462E217999C2000EB7B23 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\tD1C462E517999C2000EB7B23 /* VVDocumenterTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VVDocumenterTests.m; sourceTree = \"<group>\"; };\n\t\tD1C462E717999C2000EB7B23 /* VVDocumenterTests-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"VVDocumenterTests-Prefix.pch\"; sourceTree = \"<group>\"; };\n\t\tD1C462EB17999C9A00EB7B23 /* VVTestHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VVTestHelper.h; sourceTree = \"<group>\"; };\n\t\tD1C462EC17999C9A00EB7B23 /* VVTestHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VVTestHelper.m; sourceTree = \"<group>\"; };\n\t\tD1C462F017999CA200EB7B23 /* SyntaxTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SyntaxTests.m; sourceTree = \"<group>\"; };\n\t\tD1C462F317999CEC00EB7B23 /* NSString+VVSyntax.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NSString+VVSyntax.h\"; sourceTree = \"<group>\"; };\n\t\tD1C462F417999CEC00EB7B23 /* NSString+VVSyntax.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"NSString+VVSyntax.m\"; sourceTree = \"<group>\"; };\n\t\tD1C6124619891B3700FDB554 /* VVSwiftEnumCommenter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VVSwiftEnumCommenter.h; sourceTree = \"<group>\"; };\n\t\tD1C6124719891B3700FDB554 /* VVSwiftEnumCommenter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VVSwiftEnumCommenter.m; sourceTree = \"<group>\"; };\n\t\tD1D66CA617A2AEF000E62F99 /* VVKeyboardEventSender.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VVKeyboardEventSender.h; sourceTree = \"<group>\"; };\n\t\tD1D66CA717A2AEF000E62F99 /* VVKeyboardEventSender.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VVKeyboardEventSender.m; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\tD14380F0179551B900C829CE /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t893D8F8018262EF500E8A00C /* Carbon.framework in Frameworks */,\n\t\t\t\tD14380F7179551B900C829CE /* Cocoa.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tD1C462D617999C2000EB7B23 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD14070C418CE8819009B0EED /* XCTest.framework in Frameworks */,\n\t\t\t\t53C67935184501030030C553 /* Carbon.framework in Frameworks */,\n\t\t\t\tD1C462DD17999C2000EB7B23 /* Cocoa.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\tC4052CF51B3BB10700ED0CF0 /* ProjectHelper */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tC4052CF61B3BB10700ED0CF0 /* VVProject.h */,\n\t\t\t\tC4052CF71B3BB10700ED0CF0 /* VVProject.m */,\n\t\t\t\tC4052CF81B3BB10700ED0CF0 /* VVWorkspaceManager.h */,\n\t\t\t\tC4052CF91B3BB10700ED0CF0 /* VVWorkspaceManager.m */,\n\t\t\t);\n\t\t\tpath = ProjectHelper;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD114BEDB179644D00043FA65 /* OCCategory */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD1737634198A4C5400FE2355 /* NSString+VVTextGetter */,\n\t\t\t\tD1C462F217999CEC00EB7B23 /* NSString+VVSyntax */,\n\t\t\t\tD114BEDC179644D00043FA65 /* NSString+PDRegex */,\n\t\t\t\tD114BEDF179644D00043FA65 /* NSTextView+VVTextGetter */,\n\t\t\t\tD1737638198A4CF700FE2355 /* VVTextResult.h */,\n\t\t\t\tD1737639198A4CF700FE2355 /* VVTextResult.m */,\n\t\t\t);\n\t\t\tpath = OCCategory;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD114BEDC179644D00043FA65 /* NSString+PDRegex */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD114BEDD179644D00043FA65 /* NSString+PDRegex.h */,\n\t\t\t\tD114BEDE179644D00043FA65 /* NSString+PDRegex.m */,\n\t\t\t);\n\t\t\tpath = \"NSString+PDRegex\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD114BEDF179644D00043FA65 /* NSTextView+VVTextGetter */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD114BEE1179644FA0043FA65 /* NSTextView+VVTextGetter.h */,\n\t\t\t\tD114BEE2179644FA0043FA65 /* NSTextView+VVTextGetter.m */,\n\t\t\t);\n\t\t\tpath = \"NSTextView+VVTextGetter\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD14380EA179551B900C829CE = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD14380FC179551B900C829CE /* VVDocumenter-Xcode */,\n\t\t\t\tD1C462DE17999C2000EB7B23 /* VVDocumenterTests */,\n\t\t\t\tD14380F5179551B900C829CE /* Frameworks */,\n\t\t\t\tD14380F4179551B900C829CE /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD14380F4179551B900C829CE /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD14380F3179551B900C829CE /* VVDocumenter-Xcode.xcplugin */,\n\t\t\t\tD1C462DA17999C2000EB7B23 /* VVDocumenterTests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD14380F5179551B900C829CE /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD14070C318CE8819009B0EED /* XCTest.framework */,\n\t\t\t\t893D8F7F18262EF500E8A00C /* Carbon.framework */,\n\t\t\t\tD14380F6179551B900C829CE /* Cocoa.framework */,\n\t\t\t\tD14380F8179551B900C829CE /* Other Frameworks */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD14380F8179551B900C829CE /* Other Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD14380F9179551B900C829CE /* AppKit.framework */,\n\t\t\t\tD14380FA179551B900C829CE /* CoreData.framework */,\n\t\t\t\tD14380FB179551B900C829CE /* Foundation.framework */,\n\t\t\t);\n\t\t\tname = \"Other Frameworks\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD14380FC179551B900C829CE /* VVDocumenter-Xcode */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tC4052CF51B3BB10700ED0CF0 /* ProjectHelper */,\n\t\t\t\tD193B8C917AC0C2400D2D76A /* Setting */,\n\t\t\t\tD1D66CA517A2AED700E62F99 /* KeyboardHelper */,\n\t\t\t\tD16AFCD11796E068006719AA /* Commenter */,\n\t\t\t\tD114BEDB179644D00043FA65 /* OCCategory */,\n\t\t\t\tD14380FD179551B900C829CE /* Supporting Files */,\n\t\t\t\tD16917DD17955C8D0036C06B /* VVDocumenterManager.h */,\n\t\t\t\tD16917DE17955C8D0036C06B /* VVDocumenterManager.m */,\n\t\t\t\tD1AC3B8D1796DB070063A484 /* VVDocumenter.h */,\n\t\t\t\tD1AC3B8E1796DB070063A484 /* VVDocumenter.m */,\n\t\t\t);\n\t\t\tpath = \"VVDocumenter-Xcode\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD14380FD179551B900C829CE /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD14380FE179551B900C829CE /* VVDocumenter-Xcode-Info.plist */,\n\t\t\t\tD1438102179551B900C829CE /* VVDocumenter-Xcode-Prefix.pch */,\n\t\t\t\tD14380FF179551B900C829CE /* InfoPlist.strings */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD16AFCD11796E068006719AA /* Commenter */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD11C542C17999D9000D3DE38 /* VVCommenter.h */,\n\t\t\t\tD11C542A17999D9000D3DE38 /* VVArgument.h */,\n\t\t\t\tD11C542B17999D9000D3DE38 /* VVArgument.m */,\n\t\t\t\tD16AFCD21796E088006719AA /* VVBaseCommenter.h */,\n\t\t\t\tD16AFCD31796E088006719AA /* VVBaseCommenter.m */,\n\t\t\t\tD16AFCD51796E09E006719AA /* VVPropertyCommenter.h */,\n\t\t\t\tD16AFCD61796E09E006719AA /* VVPropertyCommenter.m */,\n\t\t\t\tD16AFCD81796E0AC006719AA /* VVMethodCommenter.h */,\n\t\t\t\tD16AFCD91796E0AC006719AA /* VVMethodCommenter.m */,\n\t\t\t\tD16AFCDB1796E0B9006719AA /* VVFunctionCommenter.h */,\n\t\t\t\tD16AFCDC1796E0B9006719AA /* VVFunctionCommenter.m */,\n\t\t\t\tD13EDDD71987F34C0029A555 /* VVSwiftFunctionCommenter.h */,\n\t\t\t\tD13EDDD81987F34C0029A555 /* VVSwiftFunctionCommenter.m */,\n\t\t\t\tD1C6124619891B3700FDB554 /* VVSwiftEnumCommenter.h */,\n\t\t\t\tD1C6124719891B3700FDB554 /* VVSwiftEnumCommenter.m */,\n\t\t\t\tD1A6B1CE198A0D8600BCED83 /* VVSwiftPropertyCommenter.h */,\n\t\t\t\tD1A6B1CF198A0D8600BCED83 /* VVSwiftPropertyCommenter.m */,\n\t\t\t\tD16AFCDE1796E0C0006719AA /* VVMacroCommenter.h */,\n\t\t\t\tD16AFCDF1796E0C0006719AA /* VVMacroCommenter.m */,\n\t\t\t\tD16AFCE11796E0C9006719AA /* VVStructCommenter.h */,\n\t\t\t\tD16AFCE21796E0C9006719AA /* VVStructCommenter.m */,\n\t\t\t\tD16AFCE41796E0D0006719AA /* VVEnumCommenter.h */,\n\t\t\t\tD16AFCE51796E0D0006719AA /* VVEnumCommenter.m */,\n\t\t\t\tD16AFCE71796E0D6006719AA /* VVVariableCommenter.h */,\n\t\t\t\tD16AFCE81796E0D6006719AA /* VVVariableCommenter.m */,\n\t\t\t\t4B50A26E1B315CF3008A4400 /* VVSwiftExtensionCommenter.h */,\n\t\t\t\t4B50A26F1B315CF3008A4400 /* VVSwiftExtensionCommenter.m */,\n\t\t\t);\n\t\t\tpath = Commenter;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD1737634198A4C5400FE2355 /* NSString+VVTextGetter */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD1737635198A4C8A00FE2355 /* NSString+VVTextGetter.h */,\n\t\t\t\tD1737636198A4C8A00FE2355 /* NSString+VVTextGetter.m */,\n\t\t\t);\n\t\t\tpath = \"NSString+VVTextGetter\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD193B8C917AC0C2400D2D76A /* Setting */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD124614217AC16820095F9D6 /* VVDocumenterSetting.h */,\n\t\t\t\tD124614317AC16820095F9D6 /* VVDocumenterSetting.m */,\n\t\t\t\tD124614417AC16820095F9D6 /* VVDSettingPanelWindowController.h */,\n\t\t\t\tD124614517AC16820095F9D6 /* VVDSettingPanelWindowController.m */,\n\t\t\t\tD124614617AC16820095F9D6 /* VVDSettingPanelWindowController.xib */,\n\t\t\t);\n\t\t\tname = Setting;\n\t\t\tpath = SettingPanel;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD1986F71179A12BD00EA6643 /* CommenterTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD1986F73179A12BD00EA6643 /* CommenterTests.m */,\n\t\t\t);\n\t\t\tpath = CommenterTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD1B316D2189A2A5900420A6E /* DocumenterTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD1B316D5189A2AA700420A6E /* VVMethodTestsCode.plist */,\n\t\t\t);\n\t\t\tpath = DocumenterTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD1C462DE17999C2000EB7B23 /* VVDocumenterTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD1B316D2189A2A5900420A6E /* DocumenterTests */,\n\t\t\t\tD1986F71179A12BD00EA6643 /* CommenterTests */,\n\t\t\t\tD1C462EE17999CA200EB7B23 /* SyntaxTests */,\n\t\t\t\tD1C462EB17999C9A00EB7B23 /* VVTestHelper.h */,\n\t\t\t\tD1C462EC17999C9A00EB7B23 /* VVTestHelper.m */,\n\t\t\t\tD1C462E517999C2000EB7B23 /* VVDocumenterTests.m */,\n\t\t\t\tD1C462DF17999C2000EB7B23 /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = VVDocumenterTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD1C462DF17999C2000EB7B23 /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD1C462E017999C2000EB7B23 /* VVDocumenterTests-Info.plist */,\n\t\t\t\tD1C462E117999C2000EB7B23 /* InfoPlist.strings */,\n\t\t\t\tD1C462E717999C2000EB7B23 /* VVDocumenterTests-Prefix.pch */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD1C462EE17999CA200EB7B23 /* SyntaxTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD1C462F017999CA200EB7B23 /* SyntaxTests.m */,\n\t\t\t);\n\t\t\tpath = SyntaxTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD1C462F217999CEC00EB7B23 /* NSString+VVSyntax */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD1C462F317999CEC00EB7B23 /* NSString+VVSyntax.h */,\n\t\t\t\tD1C462F417999CEC00EB7B23 /* NSString+VVSyntax.m */,\n\t\t\t);\n\t\t\tpath = \"NSString+VVSyntax\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD1D66CA517A2AED700E62F99 /* KeyboardHelper */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD1D66CA617A2AEF000E62F99 /* VVKeyboardEventSender.h */,\n\t\t\t\tD1D66CA717A2AEF000E62F99 /* VVKeyboardEventSender.m */,\n\t\t\t);\n\t\t\tpath = KeyboardHelper;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\tD14380F2179551B900C829CE /* VVDocumenter-Xcode */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = D1438105179551B900C829CE /* Build configuration list for PBXNativeTarget \"VVDocumenter-Xcode\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tD14380EF179551B900C829CE /* Sources */,\n\t\t\t\tD14380F0179551B900C829CE /* Frameworks */,\n\t\t\t\tD14380F1179551B900C829CE /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"VVDocumenter-Xcode\";\n\t\t\tproductName = \"VVDocumenter-Xcode\";\n\t\t\tproductReference = D14380F3179551B900C829CE /* VVDocumenter-Xcode.xcplugin */;\n\t\t\tproductType = \"com.apple.product-type.bundle\";\n\t\t};\n\t\tD1C462D917999C2000EB7B23 /* VVDocumenterTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = D1C462EA17999C2000EB7B23 /* Build configuration list for PBXNativeTarget \"VVDocumenterTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tD1C462D517999C2000EB7B23 /* Sources */,\n\t\t\t\tD1C462D617999C2000EB7B23 /* Frameworks */,\n\t\t\t\tD1C462D717999C2000EB7B23 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = VVDocumenterTests;\n\t\t\tproductName = VVDocumenterTests;\n\t\t\tproductReference = D1C462DA17999C2000EB7B23 /* VVDocumenterTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\tD14380EB179551B900C829CE /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastTestingUpgradeCheck = 0510;\n\t\t\t\tLastUpgradeCheck = 0700;\n\t\t\t\tORGANIZATIONNAME = \"OneV's Den\";\n\t\t\t};\n\t\t\tbuildConfigurationList = D14380EE179551B900C829CE /* Build configuration list for PBXProject \"VVDocumenter-Xcode\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t);\n\t\t\tmainGroup = D14380EA179551B900C829CE;\n\t\t\tproductRefGroup = D14380F4179551B900C829CE /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\tD14380F2179551B900C829CE /* VVDocumenter-Xcode */,\n\t\t\t\tD1C462D917999C2000EB7B23 /* VVDocumenterTests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\tD14380F1179551B900C829CE /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD1438101179551B900C829CE /* InfoPlist.strings in Resources */,\n\t\t\t\tD124614917AC16820095F9D6 /* VVDSettingPanelWindowController.xib in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tD1C462D717999C2000EB7B23 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD1B316D6189A2AA700420A6E /* VVMethodTestsCode.plist in Resources */,\n\t\t\t\tD1C462E317999C2000EB7B23 /* InfoPlist.strings in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\tD14380EF179551B900C829CE /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD18224DC17956290001A5E8A /* VVDocumenterManager.m in Sources */,\n\t\t\t\tD114BEE0179644D00043FA65 /* NSString+PDRegex.m in Sources */,\n\t\t\t\tD114BEE3179644FA0043FA65 /* NSTextView+VVTextGetter.m in Sources */,\n\t\t\t\tD1AC3B8F1796DB070063A484 /* VVDocumenter.m in Sources */,\n\t\t\t\tD16AFCD41796E088006719AA /* VVBaseCommenter.m in Sources */,\n\t\t\t\t4B50A2701B315CF3008A4400 /* VVSwiftExtensionCommenter.m in Sources */,\n\t\t\t\tD1A6B1D0198A0D8600BCED83 /* VVSwiftPropertyCommenter.m in Sources */,\n\t\t\t\tD16AFCD71796E09E006719AA /* VVPropertyCommenter.m in Sources */,\n\t\t\t\tD16AFCDA1796E0AC006719AA /* VVMethodCommenter.m in Sources */,\n\t\t\t\tD16AFCDD1796E0B9006719AA /* VVFunctionCommenter.m in Sources */,\n\t\t\t\tD13EDDD91987F34C0029A555 /* VVSwiftFunctionCommenter.m in Sources */,\n\t\t\t\tD16AFCE01796E0C0006719AA /* VVMacroCommenter.m in Sources */,\n\t\t\t\tD16AFCE31796E0C9006719AA /* VVStructCommenter.m in Sources */,\n\t\t\t\tD16AFCE61796E0D0006719AA /* VVEnumCommenter.m in Sources */,\n\t\t\t\tD16AFCE91796E0D6006719AA /* VVVariableCommenter.m in Sources */,\n\t\t\t\tD1C462F517999CEC00EB7B23 /* NSString+VVSyntax.m in Sources */,\n\t\t\t\tD1737637198A4C8A00FE2355 /* NSString+VVTextGetter.m in Sources */,\n\t\t\t\tC4052CFA1B3BB10700ED0CF0 /* VVProject.m in Sources */,\n\t\t\t\tD1C6124819891B3700FDB554 /* VVSwiftEnumCommenter.m in Sources */,\n\t\t\t\tD11C542D17999D9000D3DE38 /* VVArgument.m in Sources */,\n\t\t\t\tD1D66CA817A2AEF000E62F99 /* VVKeyboardEventSender.m in Sources */,\n\t\t\t\tD173763A198A4CF700FE2355 /* VVTextResult.m in Sources */,\n\t\t\t\tD124614717AC16820095F9D6 /* VVDocumenterSetting.m in Sources */,\n\t\t\t\tC4052CFB1B3BB10700ED0CF0 /* VVWorkspaceManager.m in Sources */,\n\t\t\t\tD124614817AC16820095F9D6 /* VVDSettingPanelWindowController.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tD1C462D517999C2000EB7B23 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tC4052CFC1B3BB2C200ED0CF0 /* VVProject.m in Sources */,\n\t\t\t\tC4052CFD1B3BB2C200ED0CF0 /* VVWorkspaceManager.m in Sources */,\n\t\t\t\t4B06DF741B315E9D007D69BE /* VVSwiftExtensionCommenter.m in Sources */,\n\t\t\t\tD173763B198A53C000FE2355 /* NSString+VVTextGetter.m in Sources */,\n\t\t\t\tD173763C198A53C000FE2355 /* VVTextResult.m in Sources */,\n\t\t\t\tD14110B81988C14500A7083F /* VVDocumenterSetting.m in Sources */,\n\t\t\t\tD14110B91988C14500A7083F /* VVDSettingPanelWindowController.m in Sources */,\n\t\t\t\tD14110B21988C12F00A7083F /* VVKeyboardEventSender.m in Sources */,\n\t\t\t\tD14110B31988C12F00A7083F /* NSString+VVSyntax.m in Sources */,\n\t\t\t\tD14110B41988C12F00A7083F /* NSString+PDRegex.m in Sources */,\n\t\t\t\tD1A6B1D1198A0D8600BCED83 /* VVSwiftPropertyCommenter.m in Sources */,\n\t\t\t\tD14110B51988C12F00A7083F /* NSTextView+VVTextGetter.m in Sources */,\n\t\t\t\tD14110B61988C12F00A7083F /* VVDocumenterManager.m in Sources */,\n\t\t\t\tD14110B71988C12F00A7083F /* VVDocumenter.m in Sources */,\n\t\t\t\tD14110A81988C12000A7083F /* VVArgument.m in Sources */,\n\t\t\t\tD1C6124919891B3700FDB554 /* VVSwiftEnumCommenter.m in Sources */,\n\t\t\t\tD14110A91988C12000A7083F /* VVBaseCommenter.m in Sources */,\n\t\t\t\tD14110AA1988C12000A7083F /* VVPropertyCommenter.m in Sources */,\n\t\t\t\tD14110AB1988C12000A7083F /* VVMethodCommenter.m in Sources */,\n\t\t\t\tD14110AC1988C12000A7083F /* VVFunctionCommenter.m in Sources */,\n\t\t\t\tD14110AD1988C12000A7083F /* VVSwiftFunctionCommenter.m in Sources */,\n\t\t\t\tD14110AE1988C12000A7083F /* VVMacroCommenter.m in Sources */,\n\t\t\t\tD14110AF1988C12000A7083F /* VVStructCommenter.m in Sources */,\n\t\t\t\tD14110B01988C12000A7083F /* VVEnumCommenter.m in Sources */,\n\t\t\t\tD14110B11988C12000A7083F /* VVVariableCommenter.m in Sources */,\n\t\t\t\tD14110A71988C08700A7083F /* VVDocumenterTests.m in Sources */,\n\t\t\t\tD14110A61988C07E00A7083F /* VVTestHelper.m in Sources */,\n\t\t\t\tD1C462F117999CA200EB7B23 /* SyntaxTests.m in Sources */,\n\t\t\t\tD1986F74179A12BD00EA6643 /* CommenterTests.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\tD14380FF179551B900C829CE /* InfoPlist.strings */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\tD1438100179551B900C829CE /* en */,\n\t\t\t);\n\t\t\tname = InfoPlist.strings;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD1C462E117999C2000EB7B23 /* InfoPlist.strings */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\tD1C462E217999C2000EB7B23 /* en */,\n\t\t\t);\n\t\t\tname = InfoPlist.strings;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\tD1438103179551B900C829CE /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_ENABLE_OBJC_EXCEPTIONS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.8;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tD1438104179551B900C829CE /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_ENABLE_OBJC_EXCEPTIONS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.8;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tD1438106179551B900C829CE /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tDEPLOYMENT_LOCATION = YES;\n\t\t\t\tDSTROOT = \"${HOME}\";\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"$(inherited)\";\n\t\t\t\tGCC_ENABLE_OBJC_GC = unsupported;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"VVDocumenter-Xcode/VVDocumenter-Xcode-Prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"VVDocumenter-Xcode/VVDocumenter-Xcode-Info.plist\";\n\t\t\t\tINSTALL_PATH = \"/Library/Application Support/Developer/Shared/Xcode/Plug-ins\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.onevcat.${PRODUCT_NAME:rfc1034identifier}\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tWRAPPER_EXTENSION = xcplugin;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tD1438107179551B900C829CE /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tDEPLOYMENT_LOCATION = YES;\n\t\t\t\tDSTROOT = \"${HOME}\";\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"$(inherited)\";\n\t\t\t\tGCC_ENABLE_OBJC_GC = unsupported;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"VVDocumenter-Xcode/VVDocumenter-Xcode-Prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"VVDocumenter-Xcode/VVDocumenter-Xcode-Info.plist\";\n\t\t\t\tINSTALL_PATH = \"/Library/Application Support/Developer/Shared/Xcode/Plug-ins\";\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.onevcat.${PRODUCT_NAME:rfc1034identifier}\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tWRAPPER_EXTENSION = xcplugin;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tD1C462E817999C2000EB7B23 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(DEVELOPER_DIR)/../SharedFrameworks\",\n\t\t\t\t\t\"$(DEVELOPER_LIBRARY_DIR)/Frameworks\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(DEVELOPER_FRAMEWORKS_DIR)\",\n\t\t\t\t);\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"VVDocumenterTests/VVDocumenterTests-Prefix.pch\";\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = \"VVDocumenterTests/VVDocumenterTests-Info.plist\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.onevcat.${PRODUCT_NAME:rfc1034identifier}\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tD1C462E917999C2000EB7B23 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(DEVELOPER_DIR)/../SharedFrameworks\",\n\t\t\t\t\t\"$(DEVELOPER_LIBRARY_DIR)/Frameworks\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(DEVELOPER_FRAMEWORKS_DIR)\",\n\t\t\t\t);\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"VVDocumenterTests/VVDocumenterTests-Prefix.pch\";\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = \"VVDocumenterTests/VVDocumenterTests-Info.plist\";\n\t\t\t\tONLY_ACTIVE_ARCH = NO;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.onevcat.${PRODUCT_NAME:rfc1034identifier}\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\tD14380EE179551B900C829CE /* Build configuration list for PBXProject \"VVDocumenter-Xcode\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tD1438103179551B900C829CE /* Debug */,\n\t\t\t\tD1438104179551B900C829CE /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tD1438105179551B900C829CE /* Build configuration list for PBXNativeTarget \"VVDocumenter-Xcode\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tD1438106179551B900C829CE /* Debug */,\n\t\t\t\tD1438107179551B900C829CE /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tD1C462EA17999C2000EB7B23 /* Build configuration list for PBXNativeTarget \"VVDocumenterTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tD1C462E817999C2000EB7B23 /* Debug */,\n\t\t\t\tD1C462E917999C2000EB7B23 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = D14380EB179551B900C829CE /* Project object */;\n}\n"
  },
  {
    "path": "VVDocumenter-Xcode.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:VVDocumenter-Xcode.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "VVDocumenter-Xcode.xcodeproj/xcshareddata/xcschemes/VVDocumenter-Xcode.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0700\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"D14380F2179551B900C829CE\"\n               BuildableName = \"VVDocumenter-Xcode.xcplugin\"\n               BlueprintName = \"VVDocumenter-Xcode\"\n               ReferencedContainer = \"container:VVDocumenter-Xcode.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"NO\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"D1C462D917999C2000EB7B23\"\n               BuildableName = \"VVDocumenterTests.xctest\"\n               BlueprintName = \"VVDocumenterTests\"\n               ReferencedContainer = \"container:VVDocumenter-Xcode.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"D1C462D917999C2000EB7B23\"\n               BuildableName = \"VVDocumenterTests.xctest\"\n               BlueprintName = \"VVDocumenterTests\"\n               ReferencedContainer = \"container:VVDocumenter-Xcode.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"D14380F2179551B900C829CE\"\n            BuildableName = \"VVDocumenter-Xcode.xcplugin\"\n            BlueprintName = \"VVDocumenter-Xcode\"\n            ReferencedContainer = \"container:VVDocumenter-Xcode.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\"\n      viewDebuggingEnabled = \"No\">\n      <PathRunnable\n         runnableDebuggingMode = \"0\"\n         BundleIdentifier = \"com.apple.dt.Xcode\"\n         FilePath = \"/Applications/Xcode.app\">\n      </PathRunnable>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"D14380F2179551B900C829CE\"\n            BuildableName = \"VVDocumenter-Xcode.xcplugin\"\n            BlueprintName = \"VVDocumenter-Xcode\"\n            ReferencedContainer = \"container:VVDocumenter-Xcode.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"D14380F2179551B900C829CE\"\n            BuildableName = \"VVDocumenter-Xcode.xcplugin\"\n            BlueprintName = \"VVDocumenter-Xcode\"\n            ReferencedContainer = \"container:VVDocumenter-Xcode.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "VVDocumenter-Xcode.xcodeproj/xcshareddata/xcschemes/VVDocumenterTests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0700\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"D1C462D917999C2000EB7B23\"\n               BuildableName = \"VVDocumenterTests.xctest\"\n               BlueprintName = \"VVDocumenterTests\"\n               ReferencedContainer = \"container:VVDocumenter-Xcode.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"D1C462D917999C2000EB7B23\"\n               BuildableName = \"VVDocumenterTests.xctest\"\n               BlueprintName = \"VVDocumenterTests\"\n               ReferencedContainer = \"container:VVDocumenter-Xcode.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"D1C462D917999C2000EB7B23\"\n            BuildableName = \"VVDocumenterTests.xctest\"\n            BlueprintName = \"VVDocumenterTests\"\n            ReferencedContainer = \"container:VVDocumenter-Xcode.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "VVDocumenterTests/CommenterTests/CommenterTests.m",
    "content": "//\n//  CommenterTests.m\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 13-7-20.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import <XCTest/XCTest.h>\n#import \"VVCommenter.h\"\n\n@interface CommenterTests : XCTestCase\n\n@end\n\n@implementation CommenterTests\n\n- (void)setUp\n{\n    [super setUp];\n    \n    // Set-up code here.\n    \n}\n\n- (void)tearDown\n{\n    // Tear-down code here.\n    \n    [super tearDown];\n}\n\n- (void) testArgumentType\n{\n    VVArgument *arg = [[VVArgument alloc] init];\n    \n    arg.type = @\" int \";\n    XCTAssertEqualObjects(arg.type, @\"int\", @\"%@\",arg.type);\n    \n    arg.type = @\"char *\";\n    XCTAssertEqualObjects(arg.type, @\"char\", @\"%@\",arg.type);\n    \n    arg.type = @\"NSString *\";\n    XCTAssertEqualObjects(arg.type, @\"NSString\", @\"%@\",arg.type);\n}\n\n- (void) testArgumentName\n{\n    VVArgument *arg = [[VVArgument alloc] init];\n    \n    arg.name = @\"*argv[]\";\n    XCTAssertEqualObjects(arg.name, @\"argv\", @\"%@\",arg.name);\n    \n    arg.name = @\"**a\";\n    XCTAssertEqualObjects(arg.name, @\"a\", @\"%@\",arg.name);\n    \n}\n\n- (void) testArgumentEquals\n{\n    VVArgument *argA = [[VVArgument alloc] init];\n    argA.name = @\"a\";\n    argA.type = @\"NSString\";\n    \n    VVArgument *argB = [[VVArgument alloc] init];\n    argB.name = @\"b\";\n    argB.type = @\"NSString\";\n    \n    VVArgument *argC = [[VVArgument alloc] init];\n    argC.name = @\"a\";\n    argC.type = @\"NSString\";\n    \n    XCTAssertEqualObjects(argA, argA);\n    XCTAssertNotEqualObjects(argA, argB);\n    XCTAssertEqualObjects(argA, argC);\n}\n\n-(void) testParseArguments\n{\n    VVBaseCommenter *baseCommenter = [[VVFunctionCommenter alloc] initWithIndentString:@\"\" codeString:@\"\"];\n    baseCommenter.code = @\"void dosomething( int x, int  y  );\";\n    [baseCommenter document];\n\n    VVArgument *arg0 = [[VVArgument alloc] init];\n    arg0.type = @\"int\";\n    arg0.name = @\"x\";\n    \n    VVArgument *arg1 = [[VVArgument alloc] init];\n    arg1.type = @\"int\";\n    arg1.name = @\"y\";\n    \n    NSUInteger count = baseCommenter.arguments.count;\n    XCTAssertEqual(count, (NSUInteger)2, @\"There should be 2 args, %@\", baseCommenter.arguments);\n    XCTAssertEqualObjects(arg0, baseCommenter.arguments[0]);\n    XCTAssertEqualObjects(arg1, baseCommenter.arguments[1]);\n}\n\n- (void) testParseVarArguments\n{\n    VVBaseCommenter *baseCommenter = [[VVFunctionCommenter alloc] initWithIndentString:@\"\" codeString:@\"\"];\n    baseCommenter.code = @\"int main(int argc, char *argv[]) \\n {\";\n    [baseCommenter document];\n\n    VVArgument *arg0 = [[VVArgument alloc] init];\n    arg0.type = @\"int\";\n    arg0.name = @\"argc\";\n    \n    VVArgument *arg1 = [[VVArgument alloc] init];\n    arg1.type = @\"char\";\n    arg1.name = @\"argv\";\n    \n    NSUInteger count = baseCommenter.arguments.count;\n    XCTAssertEqual(count, (NSUInteger)2, @\"There should be 2 args, %@\", baseCommenter.arguments);\n    XCTAssertEqualObjects(arg0, baseCommenter.arguments[0]);\n    XCTAssertEqualObjects(arg1, baseCommenter.arguments[1]);\n}\n\n- (void) testParseAttributedFunction\n{\n    VVBaseCommenter *baseCommenter = [[VVFunctionCommenter alloc] initWithIndentString:@\"\" codeString:@\"\"];\n    baseCommenter.code = @\"void dosomething( int x ) __attribute__((const));\";\n    [baseCommenter document];\n    \n    VVArgument *arg0 = [[VVArgument alloc] init];\n    arg0.type = @\"int\";\n    arg0.name = @\"x\";\n    \n    NSUInteger count = baseCommenter.arguments.count;\n    XCTAssertEqual(count, (NSUInteger)1, @\"There should be one arg, %@\", baseCommenter.arguments);\n    XCTAssertEqualObjects(arg0, baseCommenter.arguments[0]);\n}\n\n@end\n"
  },
  {
    "path": "VVDocumenterTests/DocumenterTests/VVMethodTestsCode.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>vv_isObjCMethod</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>- (id)initWithDuration:(CFTimeInterval)duration sourceRect:(CGRect)sourceRect {</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>-(id)initWithDuration:(CFTimeInterval)duration sourceRect:(CGRect)sourceRect {</string>\n\t\t\t<key>result</key>\n\t\t\t<string>/**\n *  &lt;#Description#&gt;\n *\n *  @param duration   &lt;#duration description#&gt;\n *  @param sourceRect &lt;#sourceRect description#&gt;\n *\n *  @return &lt;#return value description#&gt;\n */</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>   -    (BOOL) application: (UIApplication *) application\n didFinishLaunchingWithOptions: (NSDictionary *) launchOptions;</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>   -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;</string>\n\t\t\t<key>result</key>\n\t\t\t<string>   /**\n    *  &lt;#Description#&gt;\n    *\n    *  @param application   &lt;#application description#&gt;\n    *  @param launchOptions &lt;#launchOptions description#&gt;\n    *\n    *  @return &lt;#return value description#&gt;\n    */</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>+ (ADTransition *)nullTransition;</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>+(ADTransition *)nullTransition;</string>\n\t\t\t<key>result</key>\n\t\t\t<string>/**\n *  &lt;#Description#&gt;\n *\n *  @return &lt;#return value description#&gt;\n */</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>-(void)whenLinked:(void (^)(void))actionHandler</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>-(void)whenLinked:(void(^)(void))actionHandler</string>\n\t\t\t<key>result</key>\n\t\t\t<string>/**\n *  &lt;#Description#&gt;\n *\n *  @param actionHandler &lt;#actionHandler description#&gt;\n */</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>-(void) writeMediasetJSON: (void (^)(void)) uploadCompletionBlock{}</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>-(void)writeMediasetJSON:(void(^)(void))uploadCompletionBlock{}</string>\n\t\t\t<key>result</key>\n\t\t\t<string>/**\n *  &lt;#Description#&gt;\n *\n *  @param uploadCompletionBlock &lt;#uploadCompletionBlock description#&gt;\n */</string>\n\t\t</dict>\n        <dict>\n            <key>source</key>\n            <string>-(void) createNewMediaset:(NSString *) collectionName withCompletionBlock: (void (^)(void)) completionBlock;</string>\n            <key>uniform</key>\n            <string>-(void)createNewMediaset:(NSString *)collectionName withCompletionBlock:(void(^)(void))completionBlock;</string>\n            <key>result</key>\n            <string>/**\n *  &lt;#Description#&gt;\n *\n *  @param collectionName  &lt;#collectionName description#&gt;\n *  @param completionBlock &lt;#completionBlock description#&gt;\n */</string>\n        </dict>\n\t</array>\n\t<key>vv_isCFunction</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>int square(int n) __attribute__((const));</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>int square(int n)__attribute__((const));</string>\n\t\t\t<key>result</key>\n\t\t\t<string>/**\n *  &lt;#Description#&gt;\n *\n *  @param n &lt;#n description#&gt;\n *\n *  @return &lt;#return value description#&gt;\n */</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>void dosomething ( int x, int  y );</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>void dosomething( int x, int  y );</string>\n\t\t\t<key>result</key>\n\t\t\t<string>/**\n *  &lt;#Description#&gt;\n *\n *  @param x &lt;#x description#&gt;\n *  @param y &lt;#y description#&gt;\n */</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>int main(int argc, char *argv[]) \n {</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>int main(int argc, char *argv[]){</string>\n\t\t\t<key>result</key>\n\t\t\t<string>/**\n *  &lt;#Description#&gt;\n *\n *  @param argc &lt;#argc description#&gt;\n *  @param argv &lt;#argv description#&gt;\n *\n *  @return &lt;#return value description#&gt;\n */</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>void  NoParamFunc();</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>void  NoParamFunc();</string>\n\t\t\t<key>result</key>\n\t\t\t<string>/**\n *  &lt;#Description#&gt;\n */</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>typedef void(^IBLShareSuccessBlock)(ShareType type, SSPublishContentState state, id&lt;ISSStatusInfo&gt; statusInfo, BOOL end);</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>typedef void(^IBLShareSuccessBlock)(ShareType type, SSPublishContentState state, id&lt;ISSStatusInfo&gt; statusInfo, BOOL end);</string>\n\t\t\t<key>result</key>\n\t\t\t<string>/**\n *  &lt;#Description#&gt;\n *\n *  @param type       &lt;#type description#&gt;\n *  @param state      &lt;#state description#&gt;\n *  @param statusInfo &lt;#statusInfo description#&gt;\n *  @param end        &lt;#end description#&gt;\n */</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>typedef NSURL * (^AFURLSessionDownloadTaskDidFinishDownloadingBlock)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, NSURL *location);</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>typedef NSURL *(^AFURLSessionDownloadTaskDidFinishDownloadingBlock)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, NSURL *location);</string>\n\t\t\t<key>result</key>\n\t\t\t<string>/**\n *  &lt;#Description#&gt;\n *\n *  @param session      &lt;#session description#&gt;\n *  @param downloadTask &lt;#downloadTask description#&gt;\n *  @param location     &lt;#location description#&gt;\n *\n *  @return &lt;#return value description#&gt;\n */</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>typedef void (^AFURLSessionDownloadTaskDidResumeBlock)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t fileOffset, int64_t expectedTotalBytes);</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>typedef void(^AFURLSessionDownloadTaskDidResumeBlock)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t fileOffset, int64_t expectedTotalBytes);</string>\n\t\t\t<key>result</key>\n\t\t\t<string>/**\n *  &lt;#Description#&gt;\n *\n *  @param session            &lt;#session description#&gt;\n *  @param downloadTask       &lt;#downloadTask description#&gt;\n *  @param fileOffset         &lt;#fileOffset description#&gt;\n *  @param expectedTotalBytes &lt;#expectedTotalBytes description#&gt;\n */</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>typedef void (^HelloBlock)(void);</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>typedef void(^HelloBlock)(void);</string>\n\t\t\t<key>result</key>\n\t\t\t<string>/**\n *  &lt;#Description#&gt;\n */</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>virtual void run(RegridMethod method, int timeLevel, const RLLVelocityField &amp;f, const SpaceCoord &amp;x, SphereVelocity &amp;y, RLLMeshIndex *idx = NULL);</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>virtual void run(RegridMethod method, int timeLevel, const RLLVelocityField &amp;f, const SpaceCoord &amp;x, SphereVelocity &amp;y, RLLMeshIndex *idx = NULL);</string>\n\t\t\t<key>result</key>\n\t\t\t<string>/**\n *  &lt;#Description#&gt;\n *\n *  @param method    &lt;#method description#&gt;\n *  @param timeLevel &lt;#timeLevel description#&gt;\n *  @param f         &lt;#f description#&gt;\n *  @param x         &lt;#x description#&gt;\n *  @param y         &lt;#y description#&gt;\n *  @param idx       &lt;#idx description#&gt;\n */</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>void print2DList(int rowCount, int (*p)[10]);</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>void print2DList(int rowCount, int(*p)[10]);</string>\n\t\t\t<key>result</key>\n\t\t\t<string>/**\n *  &lt;#Description#&gt;\n *\n *  @param rowCount &lt;#rowCount description#&gt;\n *  @param p        &lt;#p description#&gt;\n */</string>\n\t\t</dict>\n\t</array>\n\t<key>vv_isProperty</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>@property (nonatomic, copy ) NSString *code;</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>@property(nonatomic, copy )NSString *code;</string>\n\t\t\t<key>result</key>\n\t\t\t<string>/**\n *  &lt;#Description#&gt;\n */</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>    @property ( nonatomic, strong ) Miao* test;</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>    @property( nonatomic, strong )Miao* test;</string>\n\t\t\t<key>result</key>\n\t\t\t<string>    /**\n     *  &lt;#Description#&gt;\n     */</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>@property ( assign, strong ) int test;</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>@property( assign, strong )int test;</string>\n\t\t\t<key>result</key>\n\t\t\t<string>/**\n *  &lt;#Description#&gt;\n */</string>\n\t\t</dict>\n\t</array>\n\t<key>vv_isMacro</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>#define MAX(A,B)\t({</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>#define MAX(A,B)({</string>\n\t\t\t<key>result</key>\n\t\t\t<string>/**\n *  &lt;#Description#&gt;\n *\n *  @param A &lt;#A description#&gt;\n *  @param B &lt;#B description#&gt;\n *\n *  @return &lt;#return value description#&gt;\n */</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>#define MIN(A,B)\t((A) &lt; (B) ? (A) : (B))</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>#define MIN(A,B)((A)&lt;(B)?(A):(B))</string>\n\t\t\t<key>result</key>\n\t\t\t<string>/**\n *  &lt;#Description#&gt;\n *\n *  @param A &lt;#A description#&gt;\n *  @param B &lt;#B description#&gt;\n *\n *  @return &lt;#return value description#&gt;\n */</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>#define ABS(A)\t((A) &lt; 0 ? (-(A)) : (A))</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>#define ABS(A)((A)&lt; 0 ?(-(A)):(A))</string>\n\t\t\t<key>result</key>\n\t\t\t<string>/**\n *  &lt;#Description#&gt;\n *\n *  @param A &lt;#A description#&gt;\n *\n *  @return &lt;#return value description#&gt;\n */</string>\n\t\t</dict>\n\t</array>\n\t<key>vv_isStruct</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>struct Foo \n {</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>struct Foo {</string>\n\t\t\t<key>result</key>\n\t\t\t<string>/**\n *  &lt;#Description#&gt;\n */</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>   struct node {</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>   struct node {</string>\n\t\t\t<key>result</key>\n\t\t\t<string>   /**\n    *  &lt;#Description#&gt;\n    */</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>struct objc_object {</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>struct objc_object {</string>\n\t\t\t<key>result</key>\n\t\t\t<string>/**\n *  &lt;#Description#&gt;\n */</string>\n\t\t</dict>\n\t</array>\n\t<key>vv_isEnum</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>typedef NS_ENUM(NSInteger, SIAlertViewBackgroundStyle) {\n    SIAlertViewBackgroundStyleGradient = 0,\n    SIAlertViewBackgroundStyleSolid,\n};</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>typedef NS_ENUM(NSInteger, SIAlertViewBackgroundStyle){ SIAlertViewBackgroundStyleGradient = 0, SIAlertViewBackgroundStyleSolid, };</string>\n\t\t\t<key>result</key>\n\t\t\t<string>/**\n *  &lt;#Description#&gt;\n */\ntypedef NS_ENUM(NSInteger, SIAlertViewBackgroundStyle) {\n/**\n *  &lt;#Description#&gt;\n */\nSIAlertViewBackgroundStyleGradient = 0,\n/**\n *  &lt;#Description#&gt;\n */\nSIAlertViewBackgroundStyleSolid,\n};</string>\n\t\t</dict>\n\t</array>\n\t<key>vv_isComplieKeyword</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>@interface VVDocumenter : NSObject \n {</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>@interface VVDocumenter : NSObject {</string>\n\t\t\t<key>result</key>\n\t\t\t<string>/**\n *  &lt;#Description#&gt;\n */</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>@interface VVDocumenter : NSObject \n {</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>@interface VVDocumenter : NSObject {</string>\n\t\t\t<key>result</key>\n\t\t\t<string>/**\n *  &lt;#Description#&gt;\n */</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>@interface SyntaxTests()\n@property (nonatomic, retain) NSArray* inputs;</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>@interface SyntaxTests()@property(nonatomic, retain)NSArray* inputs;</string>\n\t\t\t<key>result</key>\n\t\t\t<string>/**\n *  &lt;#Description#&gt;\n */</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>@implementation SyntaxTests\n\n- (void)setUp\n{</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>@implementation SyntaxTests -(void)setUp {</string>\n\t\t\t<key>result</key>\n\t\t\t<string>/**\n *  &lt;#Description#&gt;\n */</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>@interface A (a)\n- (id) foo;</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>@interface A(a)-(id)foo;</string>\n\t\t\t<key>result</key>\n\t\t\t<string>/**\n *  &lt;#Description#&gt;\n */</string>\n\t\t</dict>\n\t</array>\n\t<key>vv_isSwiftFunction</key>\n\t<array>\n        <dict>\n            <key>source</key>\n            <string>func testParasType(var a: Int, let b: Int, inout c: Int, d: Int) {</string>\n            <key>uniform</key>\n            <string>func testParasType(var a: Int, let b: Int, inout c: Int, d: Int){</string>\n            <key>result</key>\n            <string>/**\n &lt;#Description#&gt;\n\n - parameter a: &lt;#a description#&gt;\n - parameter b: &lt;#b description#&gt;\n - parameter c: &lt;#c description#&gt;\n - parameter d: &lt;#d description#&gt;\n */</string>\n        </dict>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>func sayHello(personName: String) -&gt; String  {</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>func sayHello(personName: String)-&gt; String  {</string>\n\t\t\t<key>result</key>\n\t\t\t<string>/**\n &lt;#Description#&gt;\n\n - parameter personName: &lt;#personName description#&gt;\n\n - returns: &lt;#return value description#&gt;\n */</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>func go(para: Int -&gt; String) -&gt; (String -&gt; String) {</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>func go(para: Int -&gt; String)-&gt;(String -&gt; String){</string>\n\t\t\t<key>result</key>\n\t\t\t<string>/**\n &lt;#Description#&gt;\n\n - parameter para: &lt;#para description#&gt;\n\n - returns: &lt;#return value description#&gt;\n */</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>public func go (miao: Int, wu: String) -&gt; Void {</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>public func go(miao: Int, wu: String)-&gt; Void {</string>\n\t\t\t<key>result</key>\n\t\t\t<string>/**\n &lt;#Description#&gt;\n\n - parameter miao: &lt;#miao description#&gt;\n - parameter wu:   &lt;#wu description#&gt;\n */</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>init(style: Style, _ gearing: Gearing, #handlebar: Handlebar, frameSize centimeters: Int = 1) {</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>init(style: Style, _ gearing: Gearing, #handlebar: Handlebar, frameSize centimeters: Int = 1){</string>\n\t\t\t<key>result</key>\n\t\t\t<string>/**\n &lt;#Description#&gt;\n\n - parameter style:       &lt;#style description#&gt;\n - parameter gearing:     &lt;#gearing description#&gt;\n - parameter handlebar:   &lt;#handlebar description#&gt;\n - parameter centimeters: &lt;#centimeters description#&gt;\n\n - returns: &lt;#return value description#&gt;\n */</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>func Test(input : Int, condition : (Int, String) -&gt; Bool = {(t: Int,k: String) in return true}) -&gt; (Int,Int) {</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>func Test(input : Int, condition :(Int, String)-&gt; Bool = {(t: Int,k: String)in return true})-&gt;(Int,Int){</string>\n\t\t\t<key>result</key>\n\t\t\t<string>/**\n &lt;#Description#&gt;\n\n - parameter input:     &lt;#input description#&gt;\n - parameter condition: &lt;#condition description#&gt;\n\n - returns: &lt;#return value description#&gt;\n */</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>func URLSession(session: NSURLSession!, task: NSURLSessionTask!, didReceiveChallenge challenge: NSURLAuthenticationChallenge!, completionHandler: ((NSURLSessionAuthChallengeDisposition, NSURLCredential!) -&gt; Void)!) {</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>func URLSession(session: NSURLSession!, task: NSURLSessionTask!, didReceiveChallenge challenge: NSURLAuthenticationChallenge!, completionHandler:((NSURLSessionAuthChallengeDisposition, NSURLCredential!)-&gt; Void)!){</string>\n\t\t\t<key>result</key>\n\t\t\t<string>/**\n &lt;#Description#&gt;\n\n - parameter session:           &lt;#session description#&gt;\n - parameter task:              &lt;#task description#&gt;\n - parameter challenge:         &lt;#challenge description#&gt;\n - parameter completionHandler: &lt;#completionHandler description#&gt;\n */</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>func makeTuple(a:Int, b:Int, c:Int) -&gt; (sum:Int, product:Int, max:Int) {</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>func makeTuple(a:Int, b:Int, c:Int)-&gt;(sum:Int, product:Int, max:Int){</string>\n\t\t\t<key>result</key>\n\t\t\t<string>/**\n &lt;#Description#&gt;\n\n - parameter a: &lt;#a description#&gt;\n - parameter b: &lt;#b description#&gt;\n - parameter c: &lt;#c description#&gt;\n\n - returns: &lt;#return value description#&gt;\n */</string>\n\t\t</dict>\n        <dict>\n            <key>source</key>\n            <string>public subscript (key: KeyType) -> ValueType? {</string>\n            <key>uniform</key>\n            <string>public subscript(key: KeyType)-> ValueType? {</string>\n            <key>result</key>\n            <string>/**\n &lt;#Description#&gt;\n\n - parameter key: &lt;#key description#&gt;\n\n - returns: &lt;#return value description#&gt;\n */</string>\n        </dict>\n        <dict>\n            <key>source</key>\n            <string>func getSomething(input:String?, success: (Int) -> Void, failure: (NSHTTPURLResponse?, AnyObject?, NSError?) -> Void) {</string>\n            <key>uniform</key>\n            <string>func getSomething(input:String?, success:(Int)-> Void, failure:(NSHTTPURLResponse?, AnyObject?, NSError?)-> Void){</string>\n            <key>result</key>\n            <string>/**\n &lt;#Description#&gt;\n\n - parameter input:   &lt;#input description#&gt;\n - parameter success: &lt;#success description#&gt;\n - parameter failure: &lt;#failure description#&gt;\n */</string>\n        </dict>\n        <dict>\n            <key>source</key>\n            <string>func methodCouldThrows(count: Int) throws -> Int {</string>\n            <key>uniform</key>\n            <string>func methodCouldThrows(count: Int)throws -> Int {</string>\n            <key>result</key>\n            <string>/**\n &lt;#Description#&gt;\n\n - parameter count: &lt;#count description#&gt;\n\n - throws: &lt;#throws value description#&gt;\n\n - returns: &lt;#return value description#&gt;\n */</string>\n        </dict>\n        <dict>\n            <key>source</key>\n            <string>func methodCouldThrows() throws {</string>\n            <key>uniform</key>\n            <string>func methodCouldThrows()throws {</string>\n            <key>result</key>\n            <string>/**\n &lt;#Description#&gt;\n\n - throws: &lt;#throws value description#&gt;\n */</string>\n        </dict>\n        <dict>\n            <key>source</key>\n            <string>func methodCouldThrows(count: Int, name: String, f: (Int, String) throws -> Void) rethrows -> Int {</string>\n            <key>uniform</key>\n            <string>func methodCouldThrows(count: Int, name: String, f:(Int, String)throws -> Void)rethrows -> Int {</string>\n            <key>result</key>\n            <string>/**\n &lt;#Description#&gt;\n\n - parameter count: &lt;#count description#&gt;\n - parameter name:  &lt;#name description#&gt;\n - parameter f:     &lt;#f description#&gt;\n\n - throws: &lt;#throws value description#&gt;\n\n - returns: &lt;#return value description#&gt;\n */</string>\n        </dict>\n        <dict>\n            <key>source</key>\n            <string>public class func amethod(count: Int) -> Int? {</string>\n            <key>uniform</key>\n            <string>public class func amethod(count: Int)-> Int? {</string>\n            <key>result</key>\n            <string>/**\n &lt;#Description#&gt;\n\n - parameter count: &lt;#count description#&gt;\n\n - returns: &lt;#return value description#&gt;\n */</string>\n        </dict>\n        <dict>\n            <key>source</key>\n            <string>func testTuple(aTuple: (first: String, second: String, third: String)) -> (first: String, second: String, third: String)? {</string>\n            <key>uniform</key>\n            <string>func testTuple(aTuple:(first: String, second: String, third: String))->(first: String, second: String, third: String)? {</string>\n            <key>result</key>\n            <string>/**\n &lt;#Description#&gt;\n\n - parameter aTuple: &lt;#aTuple description#&gt;\n\n - returns: &lt;#return value description#&gt;\n */</string>\n        </dict>\n\t</array>\n\t<key>vv_isSwiftEnum</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>enum Handlebar {\n    case Riser, Café, Drop, Bullhorn\n}</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>enum Handlebar { case Riser, Café, Drop, Bullhorn }</string>\n\t\t\t<key>result</key>\n\t\t\t<string>/**\n &lt;#Description#&gt;\n\n - Riser:    &lt;#Riser description#&gt;\n - Café:     &lt;#Café description#&gt;\n - Drop:     &lt;#Drop description#&gt;\n - Bullhorn: &lt;#Bullhorn description#&gt;\n */</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>public enum Gearing {\n    case Fixed\n    case Freewheel(speeds: Int)\n}</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>public enum Gearing { case Fixed case Freewheel(speeds: Int)}</string>\n\t\t\t<key>result</key>\n\t\t\t<string>/**\n &lt;#Description#&gt;\n\n - Fixed:     &lt;#Fixed description#&gt;\n - Freewheel: &lt;#Freewheel description#&gt;\n */</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>enum ASCIIControlCharacter: Character {\n    case Tab = &quot;\\t&quot;\n    case LineFeed = &quot;\\n&quot;\n    case CarriageReturn = &quot;\\r&quot;\n}</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>enum ASCIIControlCharacter: Character { case Tab = &quot;\\t&quot; case LineFeed = &quot;\\n&quot; case CarriageReturn = &quot;\\r&quot; }</string>\n\t\t\t<key>result</key>\n\t\t\t<string>/**\n &lt;#Description#&gt;\n\n - Tab:            &lt;#Tab description#&gt;\n - LineFeed:       &lt;#LineFeed description#&gt;\n - CarriageReturn: &lt;#CarriageReturn description#&gt;\n */</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>enum Planet: Int {\n    case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune\n}</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>enum Planet: Int { case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune }</string>\n\t\t\t<key>result</key>\n\t\t\t<string>/**\n &lt;#Description#&gt;\n\n - Mercury: &lt;#Mercury description#&gt;\n - Venus:   &lt;#Venus description#&gt;\n - Earth:   &lt;#Earth description#&gt;\n - Mars:    &lt;#Mars description#&gt;\n - Jupiter: &lt;#Jupiter description#&gt;\n - Saturn:  &lt;#Saturn description#&gt;\n - Uranus:  &lt;#Uranus description#&gt;\n - Neptune: &lt;#Neptune description#&gt;\n */</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>enum Barcode {\n    case UPCA(Int, Int, Int, Int)\n    case QRCode(String)\n}</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>enum Barcode { case UPCA(Int, Int, Int, Int)case QRCode(String)}</string>\n\t\t\t<key>result</key>\n\t\t\t<string>/**\n &lt;#Description#&gt;\n\n - UPCA:   &lt;#UPCA description#&gt;\n - QRCode: &lt;#QRCode description#&gt;\n */</string>\n\t\t</dict>\n\t</array>\n\t<key>vv_isSwiftProperty</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>let handlebar: Handlebar</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>let handlebar: Handlebar</string>\n\t\t\t<key>result</key>\n\t\t\t<string>/// &lt;#Description#&gt;</string>\n\t\t</dict>\n\t</array>\n\t<key>vv_isSwiftExtension</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>source</key>\n\t\t\t<string>extension MyClass: SomeDelegate {</string>\n\t\t\t<key>uniform</key>\n\t\t\t<string>extension MyClass: SomeDelegate {</string>\n\t\t\t<key>result</key>\n\t\t\t<string>// MARK: - &lt;#SomeDelegate#&gt;</string>\n\t\t</dict>\n        <dict>\n            <key>source</key>\n            <string>private extension MyClass\\n {</string>\n            <key>uniform</key>\n            <string>private extension MyClass\\n {</string>\n            <key>result</key>\n            <string>// MARK: - &lt;#Description#&gt;</string>\n        </dict>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "VVDocumenterTests/SyntaxTests/SyntaxTests.m",
    "content": "//\n//  SyntaxTests.m\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 13-7-19.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import <XCTest/XCTest.h>\n#import \"VVTestHelper.h\"\n#import \"NSString+VVSyntax.h\"\n\n@interface SyntaxTests : XCTestCase\n\n@property (nonatomic, strong) NSArray* inputs;\n@property (nonatomic, strong) NSArray* corrects;\n\n@end\n\n@implementation SyntaxTests\n\n- (void)setUp\n{\n    [super setUp];\n\n    // Set-up code here.\n    self.inputs = [VVTestHelper testCodes];\n    self.corrects = [VVTestHelper uniformCodes];\n    \n}\n\n- (void)tearDown\n{\n    // Tear-down code here.\n    self.inputs = nil;\n    self.corrects = nil;\n    \n    [super tearDown];\n}\n\n\n-(void) testStringByConvertingToUniform {\n    for (int i = 0; i < (int)[self.inputs count]; i++) {\n        for (int j = 0; j < [self.inputs[i] count]; j++) {\n            NSString *converted = [self.inputs[i][j] vv_stringByConvertingToUniform];\n            NSString *result = self.corrects[i][j];\n            XCTAssertTrue([result isEqualToString:converted], @\"%@ should be the same as %@\", converted, result);\n        }\n    }\n}\n\n-(void) testIsObjCMethod {\n    NSArray *boolResult = @[@YES,@NO,@NO,@NO,@NO,@NO,@NO,@NO,@NO,@NO,@NO,@NO,@NO];\n    \n    for (int i = 0; i < (int)[self.inputs count]; i++) {\n        for (int j = 0; j < [self.inputs[i] count]; j++) {\n            NSString *result = self.corrects[i][j];\n            XCTAssertTrue([result vv_isObjCMethod] == [boolResult[i] boolValue], @\"%@ should %@ be a ObjC method\", result, [boolResult[i] boolValue] ? @\"\" : @\"not\");\n        }\n    }\n}\n\n-(void) testIsCFunction {\n    NSArray *boolResult = @[@NO,@YES,@NO,@NO,@NO,@NO,@NO,@NO,@NO,@NO,@NO,@NO,@NO];\n    \n    for (int i = 0; i < (int)[self.inputs count]; i++) {\n        for (int j = 0; j < [self.inputs[i] count]; j++) {\n            NSString *result = self.corrects[i][j];\n            XCTAssertTrue([result vv_isCFunction] == [boolResult[i] boolValue], @\"%@ should %@ be a C function\", result, [boolResult[i] boolValue] ? @\"\" : @\"not\");\n        }\n    }\n}\n\n-(void) testIsProperty {\n    NSArray *boolResult = @[@NO,@NO,@YES,@NO,@NO,@NO,@NO,@NO,@NO,@NO,@NO,@NO,@NO];\n    \n    for (int i = 0; i < (int)[self.inputs count]; i++) {\n        for (int j = 0; j < [self.inputs[i] count]; j++) {\n            NSString *result = self.corrects[i][j];\n            XCTAssertTrue([result vv_isProperty] == [boolResult[i] boolValue], @\"%@ should %@ be a property\", result, [boolResult[i] boolValue] ? @\"\" : @\"not\");\n        }\n    }\n}\n\n-(void) testIsMacro {\n    NSArray *boolResult = @[@NO,@NO,@NO,@YES,@NO,@NO,@NO,@NO,@NO,@NO,@NO,@NO,@NO];\n    \n    for (int i = 0; i < (int)[self.inputs count]; i++) {\n        for (int j = 0; j < [self.inputs[i] count]; j++) {\n            NSString *result = self.corrects[i][j];\n            XCTAssertTrue([result vv_isMacro] == [boolResult[i] boolValue], @\"%@ should %@ be a macro\", result, [boolResult[i] boolValue] ? @\"\" : @\"not\");\n        }\n    }\n}\n\n-(void) testIsStruct {\n    NSArray *boolResult = @[@NO,@NO,@NO,@NO,@YES,@NO,@NO,@NO,@NO,@NO,@NO,@NO,@NO];\n    \n    for (int i = 0; i < (int)[self.inputs count]; i++) {\n        for (int j = 0; j < [self.inputs[i] count]; j++) {\n            NSString *result = self.corrects[i][j];\n            XCTAssertTrue([result vv_isStruct] == [boolResult[i] boolValue], @\"%@ should %@ be a struct\", result, [boolResult[i] boolValue] ? @\"\" : @\"not\");\n        }\n    }\n}\n\n-(void) testIsEnum {\n    NSArray *boolResult = @[@NO,@NO,@NO,@NO,@NO,@YES,@NO,@NO,@NO,@NO,@NO,@NO,@NO];\n    \n    for (int i = 0; i < (int)[self.inputs count]; i++) {\n        for (int j = 0; j < [self.inputs[i] count]; j++) {\n            NSString *result = self.corrects[i][j];\n            XCTAssertTrue([result vv_isEnum] == [boolResult[i] boolValue], @\"%@ should %@ be a enum\", result, [boolResult[i] boolValue] ? @\"\" : @\"not\");\n        }\n    }\n}\n\n-(void) testIsUnion {\n    NSArray *boolResult = @[@NO,@NO,@NO,@NO,@NO,@NO,@YES,@NO,@NO,@NO,@NO,@NO,@NO];\n    \n    for (int i = 0; i < (int)[self.inputs count]; i++) {\n        for (int j = 0; j < [self.inputs[i] count]; j++) {\n            NSString *result = self.corrects[i][j];\n            XCTAssertTrue([result vv_isUnion] == [boolResult[i] boolValue], @\"%@ should %@ be a union\", result, [boolResult[i] boolValue] ? @\"\" : @\"not\");\n        }\n    }\n}\n\n-(void) testIsCompileKeyword {\n    NSArray *boolResult = @[@NO,@NO,@NO,@NO,@NO,@NO,@NO,@NO,@YES,@NO,@NO,@NO,@NO];\n    \n    for (int i = 0; i < (int)[self.inputs count]; i++) {\n        for (int j = 0; j < [self.inputs[i] count]; j++) {\n            NSString *result = self.corrects[i][j];\n            XCTAssertTrue([result vv_isComplieKeyword] == [boolResult[i] boolValue], @\"%@ should %@ be a complie keyword\", result, [boolResult[i] boolValue] ? @\"\" : @\"not\");\n        }\n    }\n}\n\n-(void) testIsSwiftFunction {\n    NSArray *boolResult = @[@NO,@NO,@NO,@NO,@NO,@NO,@NO,@NO,@NO,@YES,@NO,@NO,@NO];\n    \n    for (int i = 0; i < (int)[self.inputs count]; i++) {\n        for (int j = 0; j < [self.inputs[i] count]; j++) {\n            NSString *result = self.corrects[i][j];\n            XCTAssertTrue([result vv_isSwiftFunction] == [boolResult[i] boolValue], @\"%@ should %@ be a swift function\", result, [boolResult[i] boolValue] ? @\"\" : @\"not\");\n        }\n    }\n}\n\n-(void) testIsSwiftEnum {\n    NSArray *boolResult = @[@NO,@NO,@NO,@NO,@NO,@NO,@NO,@NO,@NO,@NO,@YES,@NO,@NO];\n    \n    for (int i = 0; i < (int)[self.inputs count]; i++) {\n        for (int j = 0; j < [self.inputs[i] count]; j++) {\n            NSString *result = self.corrects[i][j];\n            XCTAssertTrue([result vv_isSwiftEnum] == [boolResult[i] boolValue], @\"%@ should %@ be a swift enum\", result, [boolResult[i] boolValue] ? @\"\" : @\"not\");\n        }\n    }\n}\n\n-(void) testIsSwiftProperty {\n    NSArray *boolResult = @[@NO,@NO,@NO,@NO,@NO,@NO,@NO,@NO,@NO,@NO,@NO,@YES,@NO];\n    \n    for (int i = 0; i < (int)[self.inputs count]; i++) {\n        for (int j = 0; j < [self.inputs[i] count]; j++) {\n            NSString *result = self.corrects[i][j];\n            XCTAssertTrue([result vv_isSwiftProperty] == [boolResult[i] boolValue], @\"%@ should %@ be a swift property\", result, [boolResult[i] boolValue] ? @\"\" : @\"not\");\n        }\n    }\n}\n\n-(void) testIsSwiftExtension {\n    NSArray *boolResult = @[@NO,@NO,@NO,@NO,@NO,@NO,@NO,@NO,@NO,@NO,@NO,@NO,@YES];\n    \n    for (int i = 0; i < (int)[self.inputs count]; i++) {\n        for (int j = 0; j < [self.inputs[i] count]; j++) {\n            NSString *result = self.corrects[i][j];\n            XCTAssertTrue([result vv_isSwiftExtension] == [boolResult[i] boolValue], @\"%@ should %@ be a swift extension\", result, [boolResult[i] boolValue] ? @\"\" : @\"not\");\n        }\n    }\n}\n\n@end\n"
  },
  {
    "path": "VVDocumenterTests/VVDocumenterTests-Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>${EXECUTABLE_NAME}</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "VVDocumenterTests/VVDocumenterTests-Prefix.pch",
    "content": "//\n// Prefix header for all source files of the 'VVDocumenterTests' target in the 'VVDocumenterTests' project\n//\n\n#ifdef __OBJC__\n    #import <Cocoa/Cocoa.h>\n    #import \"NSString+PDRegex.h\"\n#endif\n\n#define __DEBUG__ 1\n#ifdef __DEBUG__\n#define VVLog(...) NSLog(__VA_ARGS__)\n#else\n#define VVLog(...) do{} while(0)\n#endif"
  },
  {
    "path": "VVDocumenterTests/VVDocumenterTests.m",
    "content": "//\n//  VVDocumenterTests.m\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 13-7-19.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import <XCTest/XCTest.h>\n#import \"VVDocumenter.h\"\n#import \"NSString+VVSyntax.h\"\n#import \"VVTestHelper.h\"\n\n#import \"NSTextView+VVTextGetter.h\"\n\n@interface VVDocumenterTests : XCTestCase\n@property NSDictionary *testCaseDic;\n@end\n\n@implementation VVDocumenterTests\n\n- (void)setUp\n{\n    [super setUp];\n    // Put setup code here; it will be run once, before the first test case.\n    NSString *path = [[NSBundle bundleForClass:[self class]] pathForResource:@\"VVMethodTestsCode\" ofType:@\"plist\"];\n    self.testCaseDic = [NSDictionary dictionaryWithContentsOfFile:path];\n}\n\n- (void)tearDown\n{\n    // Put teardown code here; it will be run once, after the last test case.\n    self.testCaseDic = nil;\n    [super tearDown];\n}\n\n-(void) testDocument\n{\n    [self.testCaseDic enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSArray *cases, BOOL *stop) {\n        [cases enumerateObjectsUsingBlock:^(NSDictionary *testDic, NSUInteger idx, BOOL *stop) {\n            NSString *source = testDic[@\"source\"];\n            NSString *uniform = testDic[@\"uniform\"];\n            NSString *result = testDic[@\"result\"];\n            \n            XCTAssertNotNil(source, @\"Test source code should exist.\");\n            XCTAssertNotNil(uniform, @\"Test uniform code should exist.\");\n            XCTAssertNotNil(result, @\"Test result code should exist.\");\n            \n            XCTAssertEqualObjects([source vv_stringByConvertingToUniform], uniform, @\"Source should be converted to uniform format corrctly.\");\n            \n            XCTAssertTrue([VVTestHelper performSyntaxMethod:key onString:uniform], @\"This uniform code should be %@\",key);\n            \n            NSArray *otherTypeStrings = [VVTestHelper arrayOfExceptCodeType:key];\n            for (NSString *type in otherTypeStrings) {\n                XCTAssertFalse([VVTestHelper performSyntaxMethod:type onString:uniform], @\"This uniform code should not be %@\",type);\n            }\n            \n            VVDocumenter *documenter = nil;\n            if ([key isEqualToString:@\"vv_isSwiftEnum\"]) {\n                documenter = [[VVDocumenter alloc] initWithCode:source];\n            } else {\n                documenter = [[VVDocumenter alloc] initWithCode:uniform];\n            }\n\n            XCTAssertEqualObjects([documenter document], result, @\"Result should be correct\");\n            \n        }];\n    }];\n}\n\n@end\n"
  },
  {
    "path": "VVDocumenterTests/VVTestHelper.h",
    "content": "//\n//  VVTestHelper.h\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 13-7-19.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import <Foundation/Foundation.h>\n\n@interface VVTestHelper : NSObject\n+(NSArray *) testCodes;\n+(NSArray *) uniformCodes;\n\n+(NSArray *) arrayOfExceptCodeType:(NSString *)type;\n+(BOOL) performSyntaxMethod:(NSString *)selectorString onString:(NSString *)codestring;\n@end\n"
  },
  {
    "path": "VVDocumenterTests/VVTestHelper.m",
    "content": "//\n//  VVTestHelper.m\n//  VVDocumenter-Xcode\n//\n//  Created by 王 巍 on 13-7-19.\n//\n//  Copyright (c) 2015 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import \"VVTestHelper.h\"\n\n@interface NSArray(vv_Removing)\n-(NSArray*)arrayByRemovingObject:(id)obj;\n@end\n\n@implementation NSArray (vv_Removing)\n-(NSArray*)arrayByRemovingObject:(id)obj\n{\n    NSArray* newArray = [NSArray array];\n    NSUInteger indexOfObj = [self indexOfObject:obj];\n    newArray = [self subarrayWithRange:NSMakeRange(0, indexOfObj)];\n    newArray = [newArray arrayByAddingObjectsFromArray:[self subarrayWithRange:NSMakeRange(indexOfObj+1, self.count - indexOfObj-1)]];\n    return newArray;\n}\n@end\n\nstatic NSArray *_typeStrings;\n\n@implementation VVTestHelper\n+(NSArray *) testCodes\n{\n    NSArray *methods = @[@\"+ (ADTransition *)nullTransition;\",\n                         @\"   -    (BOOL) application: (UIApplication *) application  \\n didFinishLaunchingWithOptions: (NSDictionary *) launchOptions;\",\n                         @\"- (id)initWithDuration:(CFTimeInterval)duration sourceRect:(CGRect)sourceRect {\",\n                         @\"-(void)whenLinked:(void (^)(void))actionHandler;\"];\n    \n    NSArray *functions = @[@\"void dosomething ( int x, int  y );\",\n                           @\"int main(int argc, char *argv[]) \\n {\",\n                           @\"void  NoParamFunc();\",\n                           @\"typeof void(^IBLShareSuccessBlock)(ShareType type, SSPublishContentState state, id<ISSStatusInfo> statusInfo, BOOL end);\"];\n    \n    NSArray *properties = @[@\"@property (nonatomic, copy ) NSString *code;\",\n                            @\"    @property ( nonatomic, strong ) Miao* test;\",\n                            @\"@property ( assign, strong ) int test;\"];\n    \n    NSArray *macros = @[@\"#define MAX(A,B)\t({\",\n                        @\"#define MIN(A,B)\t((A) < (B) ? (A) : (B))\",\n                        @\"#define ABS(A)\t((A) < 0 ? (-(A)) : (A))\"];\n    \n    NSArray *structs = @[@\"struct Foo \\n {\",\n                         @\"   struct node {\",\n                         @\"struct objc_object {\"];\n    \n    NSArray *enums = @[@\"typedef NS_ENUM {\",\n                       @\"typedef NS_ENUM \\n {\",\n                       @\"  typedef   NS_ENUM{\"];\n    \n    NSArray *unions = @[@\"union {\",\n                        @\" union \\n {\",\n                        @\" union{\"];\n    \n    NSArray *others = @[@\"options = options | NSRegularExpressionDotMatchesLineSeparators;\",\n                        @\"if (resultUntilSemiColon && resultUntilBrace) {\",\n                        @\"static dispatch_once_t once;\"];\n\n    NSArray *compileKeywords = @[@\"@interface VVDocumenter : NSObject \\n {\",\n                                 @\"@interface SyntaxTests()\\n@property (nonatomic, retain) NSArray* inputs;\",\n                                 @\"@implementation SyntaxTests\\n\\n- (void)setUp\\n{\",\n                                 @\"@interface A (a)\\n- (id) foo;\"];\n\n    NSArray *swiftFunctions = @[@\"func sayHello(personName: String) -> String  {\",\n                                @\"func halfOpenRangeLength(start: Int, end: Int) -> Int\\n  {\",\n                                @\"func sayHelloWorld() ->String\",\n                                @\"func testParamsType(var a: Int) {\",\n                                @\"init(style: Style, gearing: Gearing, handlebar: Handlebar, frameSize centimeters: Int) {\",\n                                @\"public subscript(key: KeyType)-> ValueType? {\",\n                                @\"func methodCouldThrows(count: Int) throws -> Int {\",\n                                @\"func methodCouldThrows() throws {\",\n                                @\"func methodCouldThrows(count: Int, name: String, f: (Int, String) throws -> Void) rethrows -> Int {\"];\n    \n    /*\n    //Now there is no difference between Objective-C (C) struct and Swift struct. Ignore this.\n    NSArray *swiftStructs = @[@\"struct FixedLengthRange {\",\n                              @\"public struct SomeStructure \\n {\",\n                              @\"public struct SomeStructure \\n {\",];\n    */\n    \n    NSArray *swiftEnum = @[@\"enum CompassPoint {\",\n                           @\"enum SomeEnumeration \\n {\",\n                           @\"enum Planet {   \"];\n    \n    NSArray *swiftProperties = @[@\"let gearing : Gearing\",\n                                 @\"var size = Size()\",\n                                 @\"lazy var importer = DataImporter()\",\n                                 @\"private ( set ) var distanceTravelled:Double\"];\n    \n    NSArray *swiftExtension = @[@\"extension SomeViewController: UITableViewDelegate {\",\n                                @\"extension MyClass \\n {\",\n                                @\"private extension PP : DelegateA, DelegateB {\"];\n    \n    return @[methods,functions,properties,macros,structs,enums,unions,others,compileKeywords,swiftFunctions,swiftEnum,swiftProperties, swiftExtension];\n}\n\n+(NSArray *) uniformCodes\n{\n    NSArray *methods = @[@\"+(ADTransition *)nullTransition;\",\n                         @\"   -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;\",\n                         @\"-(id)initWithDuration:(CFTimeInterval)duration sourceRect:(CGRect)sourceRect {\",\n                         @\"-(void)whenLinked:(void(^)(void))actionHandler;\"];\n    \n    NSArray *functions = @[@\"void dosomething( int x, int  y );\",\n                           @\"int main(int argc, char *argv[]){\",\n                           @\"void  NoParamFunc();\",\n                           @\"typeof void(^IBLShareSuccessBlock)(ShareType type, SSPublishContentState state, id<ISSStatusInfo> statusInfo, BOOL end);\"];\n    \n    NSArray *properties = @[@\"@property(nonatomic, copy )NSString *code;\",\n                            @\"    @property( nonatomic, strong )Miao* test;\",\n                            @\"@property( assign, strong )int test;\"];\n\n    NSArray *macros = @[@\"#define MAX(A,B)({\",\n                        @\"#define MIN(A,B)((A)<(B)?(A):(B))\",\n                        @\"#define ABS(A)((A)< 0 ?(-(A)):(A))\"];\n\n    NSArray *structs = @[@\"struct Foo {\",\n                         @\"   struct node {\",\n                         @\"struct objc_object {\"];\n    \n    NSArray *enums = @[@\"typedef NS_ENUM {\",\n                       @\"typedef NS_ENUM {\",\n                       @\"  typedef   NS_ENUM{\"];\n    \n    NSArray *unions = @[@\"union {\",\n                        @\" union {\",\n                        @\" union{\"];\n    \n    NSArray *others = @[@\"options = options | NSRegularExpressionDotMatchesLineSeparators;\",\n                        @\"if(resultUntilSemiColon && resultUntilBrace){\",\n                        @\"static dispatch_once_t once;\"];\n\n    NSArray *compileKeywords = @[@\"@interface VVDocumenter : NSObject {\",\n                                 @\"@interface SyntaxTests()@property(nonatomic, retain)NSArray* inputs;\",\n                                 @\"@implementation SyntaxTests -(void)setUp {\",\n                                 @\"@interface A(a)-(id)foo;\"];\n    \n    NSArray *swiftFunctions = @[@\"func sayHello(personName: String)-> String  {\",\n                                @\"func halfOpenRangeLength(start: Int, end: Int)-> Int {\",\n                                @\"func sayHelloWorld()->String\",\n                                @\"func testParamsType(var a: Int){\",\n                                @\"init(style: Style, gearing: Gearing, handlebar: Handlebar, frameSize centimeters: Int){\",\n                                @\"public subscript(key: KeyType)-> ValueType? {\",\n                                @\"func methodCouldThrows(count: Int)throws -> Int {\",\n                                @\"func methodCouldThrows()throws {\",\n                                @\"func methodCouldThrows(count: Int, name: String, f:(Int, String)throws -> Void)rethrows -> Int {\"];\n    \n    /*\n     //Now there is no difference between Objective-C (C) struct and Swift struct. Ignore this.\n     NSArray *swiftStructs = @[@\"struct FixedLengthRange {\",\n     @\"public struct SomeStructure \\n {\",\n     @\"public struct SomeStructure \\n {\",];\n     */\n    \n    NSArray *swiftEnum = @[@\"enum CompassPoint {\",\n                           @\"enum SomeEnumeration {\",\n                           @\"enum Planet {   \"];\n    \n    NSArray *swiftProperties = @[@\"let gearing : Gearing\",\n                                 @\"var size = Size()\",\n                                 @\"lazy var importer = DataImporter()\",\n                                 @\"private( set )var distanceTravelled:Double\"];\n    \n    NSArray *swiftExtension = @[@\"extension SomeViewController: UITableViewDelegate {\",\n                                @\"extension MyClass {\",\n                                @\"private extension PP : DelegateA, DelegateB {\"];\n    \n    return @[methods,functions,properties,macros,structs,enums,unions,others,compileKeywords,swiftFunctions,swiftEnum,swiftProperties, swiftExtension];\n}\n\n+(NSArray *) arrayOfExceptCodeType:(NSString *)type\n{\n    if (!_typeStrings) {\n        //Save all type specify method names in NSString+VVSyntax\n        _typeStrings = @[@\"vv_isObjCMethod\",\n                         @\"vv_isCFunction\",\n                         @\"vv_isProperty\",\n                         @\"vv_isMacro\",\n                         @\"vv_isStruct\",\n                         @\"vv_isEnum\",\n                         @\"vv_isUnion\",\n                         @\"vv_isComplieKeyword\",\n                         @\"vv_isSwiftFunction\",\n                         @\"vv_isSwiftEnum\",\n                         @\"vv_isSwiftProperty\",\n                         @\"vv_isSwiftExtension\"];\n    }\n    \n    return [_typeStrings arrayByRemovingObject:type];\n}\n\n+(BOOL) performSyntaxMethod:(NSString *)selectorString onString:(NSString *)codestring {\n    SEL selector =NSSelectorFromString(selectorString);\n    BOOL returnValue = NO;\n    if ([codestring respondsToSelector:selector]) {\n        NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:\n                                    [[codestring class] instanceMethodSignatureForSelector:selector]];\n        [invocation setSelector:selector];\n        [invocation setTarget:codestring];\n        [invocation invoke];\n\n        [invocation getReturnValue:&returnValue];\n    }\n    return returnValue;\n}\n\n@end\n"
  },
  {
    "path": "VVDocumenterTests/en.lproj/InfoPlist.strings",
    "content": "/* Localized versions of Info.plist keys */\n\n"
  }
]