{"action":"created","comment":{"url":"https://api.github.com/repos/universal-ctags/ctags/pulls/comments/75012651","id":75012651,"diff_hunk":"@@ -8,35 +8,434 @@\n *   files.\n */\n \n-/*\n-*   INCLUDE FILES\n-*/\n-#include \"general.h\"  /* must always come first */\n+#include \"general.h\"\n+\n+#include <string.h>\n+#include <ctype.h>\n+\n+#include \"entry.h\"\n #include \"parse.h\"\n+#include \"read.h\"\n #include \"routines.h\"\n+#include \"keyword.h\"\n+\n \n-static tagRegexTable htmlTagRegexTable [] = {\n-#define POSSIBLE_ATTRIBUTES \"([ \\t]+[a-z]+=\\\"?[^>\\\"]*\\\"?)*\"\n-\t{\"<a\"\n-\t POSSIBLE_ATTRIBUTES \"[ \\t]+name=\\\"?([^>\\\"]+)\\\"?\" POSSIBLE_ATTRIBUTES\n-\t \"[ \\t]*>\", \"\\\\2\",\n-\t \"a,anchor,named anchors\", \"i\"},\n-\t{\"^[ \\t]*function[ \\t]*([A-Za-z0-9_]+)[ \\t]*\\\\(\", \"\\\\1\",\n-\t \"f,function,JavaScript functions\", NULL},\n+typedef enum {\n+\tK_ANCHOR,\n+\tK_FUNCTION,\n+\tK_HEADING1,\n+\tK_HEADING2,\n+\tK_HEADING3\n+} htmlKind;\n+\n+static kindOption HtmlKinds [] = {\n+\t{ TRUE, 'a', \"anchor\",\t\t\"named anchors\" },\n+\t{ TRUE, 'f', \"function\",\t\"JavaScript functions\" },\n+\t{ TRUE, 'h', \"heading1\",\t\"H1 heading\" },\n+\t{ TRUE, 'i', \"heading2\",\t\"H2 heading\" },\n+\t{ TRUE, 'j', \"heading3\",\t\"H3 heading\" }\n };\n \n+typedef enum {\n+\tKEYWORD_h1,\n+\tKEYWORD_h2,\n+\tKEYWORD_h3,\n+\tKEYWORD_a,\n+\tKEYWORD_script,\n+\tKEYWORD_name\n+} keywordId;\n+\n+static const keywordTable HtmlKeywordTable[] = {\n+\t{\"h1\", KEYWORD_h1},\n+\t{\"h2\", KEYWORD_h2},\n+\t{\"h3\", KEYWORD_h3},\n+\t{\"a\", KEYWORD_a},\n+\t{\"script\", KEYWORD_script},\n+\t{\"name\", KEYWORD_name},\n+};\n+\n+typedef enum {\n+\tTOKEN_EOF,\n+\tTOKEN_NAME,\t\t\t/* tag and attribute names */\n+\tTOKEN_STRING,\t\t/* single- or double-quoted attribute value */\n+\tTOKEN_TEXT,\n+\tTOKEN_TAG_START,\t/* <  */\n+\tTOKEN_TAG_START2,\t/* </ */\n+\tTOKEN_TAG_END,\t\t/* >  */\n+\tTOKEN_TAG_END2,\t\t/* /> */\n+\tTOKEN_EQUAL,\n+\tTOKEN_COMMENT,\n+\tTOKEN_OTHER\n+} tokenType;\n+\n+typedef struct {\n+\ttokenType type;\n+\tvString *string;\n+} tokenInfo;\n+\n+\n+static int Lang_html;\n+\n+\n+static void readTag (tokenInfo *token, vString *text);\n+\n+\n /*\n-*   FUNCTION DEFINITIONS\n-*/\n+ * Perform the following regular expression matching to find the function name\n+ * ^[ ]*function[ ]+([A-Za-z0-9_]+)[ ]*\\\\(\n+ */\n+static void findFunctionDecl (const vString *line)\n+{\n+\tvString *fname;\n+\tconst char *str = vStringValue (line);\n+\n+\tif (vStringLength (line) < 11) /* strlen(\"function a(\") */\n+\t\treturn;\n+\n+\twhile (*str == ' ')\n+\t\tstr++;\n+\n+\tif (strncmp (str, \"function\", 8) != 0)\n+\t\treturn;\n+\tstr += 8;\n+\n+\tif (*str != ' ')\n+\t\treturn;\n+\n+\twhile (*str == ' ')\n+\t\tstr++;\n+\n+\tfname = vStringNew ();\n+\n+\twhile (isalnum (*str) || *str == '_')\n+\t{\n+\t\tvStringPut (fname, *str);\n+\t\tstr++;\n+\t}\n+\n+\tif (vStringLength (fname) > 0)\n+\t{\n+\t\twhile (*str == ' ')\n+\t\t\tstr++;\n+\n+\t\tif (*str == '(')\n+\t\t\tmakeSimpleTag (fname, HtmlKinds, K_FUNCTION);\n+\t}\n+\n+\tvStringDelete (fname);\n+}\n+\n+static void readTokenText (tokenInfo *const token, boolean collectText, boolean isScript)\n+{\n+\tint c;\n+\tint lastC = 'X';  /* whatever, non-space character */\n+\tvString *line = NULL;\n+\n+\tif (isScript)\n+\t\tline = vStringNew ();\n+\n+\tvStringClear (token->string);\n+\n+getNextChar:\n+\n+\tc = getcFromInputFile ();\n+\n+\tswitch (c)\n+\t{\n+\t\tcase EOF:\n+\t\t\ttoken->type = TOKEN_EOF;\n+\t\t\tbreak;\n+\n+\t\tcase '<':\n+\t\t{\n+\t\t\tungetcToInputFile (c);\n+\t\t\ttoken->type = TOKEN_TEXT;\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\tdefault:\n+\t\t\tif (collectText || isScript)\n+\t\t\t{\n+\t\t\t\tif (isScript && (c == '\\r' || c == '\\n'))\n+\t\t\t\t{\n+\t\t\t\t\t/* to get correct line number in findFunctionDecl() */\n+\t\t\t\t\tungetcToInputFile (c);\n+\t\t\t\t\tfindFunctionDecl (line);\n+\t\t\t\t\tgetcFromInputFile ();\n+\t\t\t\t\tvStringClear (line);\n+\t\t\t\t}\n+\t\t\t\telse\n+\t\t\t\t{\n+\t\t\t\t\tif (c == '\\r' || c == '\\n' || c == '\\t')\n+\t\t\t\t\t\tc = ' ';\n+\t\t\t\t\tif (c != ' ' || (c == ' ' && lastC != ' '))\n+\t\t\t\t\t{\n+\t\t\t\t\t\tif (collectText)\n+\t\t\t\t\t\t\tvStringPut (token->string, c);\n+\t\t\t\t\t\tif (isScript)\n+\t\t\t\t\t\t\tvStringPut (line, c);\n+\t\t\t\t\t\tlastC = c;\n+\t\t\t\t\t}\n+\t\t\t\t}\n+\t\t\t}\n+\n+\t\t\tgoto getNextChar;\n+\t}\n+\n+\tif (isScript)\n+\t{\n+\t\tfindFunctionDecl (line);\n+\t\tvStringDelete (line);\n+\t}\n+}\n+\n+static void readToken (tokenInfo *const token, boolean skipComments)\n+{\n+\tint c;\n+\n+\tvStringClear (token->string);\n+\n+getNextChar:\n+\n+\tc = getcFromInputFile ();\n+\twhile (isspace (c))\n+\t\tc = getcFromInputFile ();\n+\n+\tswitch (c)\n+\t{\n+\t\tcase EOF:\n+\t\t\ttoken->type = TOKEN_EOF;\n+\t\t\tbreak;\n+\n+\t\tcase '<':\n+\t\t{\n+\t\t\tint d = getcFromInputFile ();\n+\n+\t\t\tif (d == '!')\n+\t\t\t{\n+\t\t\t\td = getcFromInputFile ();\n+\t\t\t\tif (d == '-')\n+\t\t\t\t{\n+\t\t\t\t\td = getcFromInputFile ();\n+\t\t\t\t\tif (d == '-')\n+\t\t\t\t\t{\n+\t\t\t\t\t\tint e = ' ';\n+\t\t\t\t\t\tint f = ' ';\n+\t\t\t\t\t\tdo\n+\t\t\t\t\t\t{\n+\t\t\t\t\t\t\td = e;\n+\t\t\t\t\t\t\te = f;\n+\t\t\t\t\t\t\tf = getcFromInputFile ();\n+\t\t\t\t\t\t}\n+\t\t\t\t\t\twhile (f != EOF && ! (d == '-' && e == '-' && f == '>'));\n+\n+\t\t\t\t\t\tif (skipComments || f == EOF)\n+\t\t\t\t\t\t\tgoto getNextChar;\n+\t\t\t\t\t\telse\n+\t\t\t\t\t\t{\n+\t\t\t\t\t\t\ttoken->type = TOKEN_COMMENT;\n+\t\t\t\t\t\t\tbreak;\n+\t\t\t\t\t\t}\n+\t\t\t\t\t}\n+\t\t\t\t}\n+\t\t\t\tungetcToInputFile (d);\n+\t\t\t\ttoken->type = TOKEN_OTHER;\n+\t\t\t}\n+\t\t\telse if (d == '?')\n+\t\t\t\ttoken->type = TOKEN_OTHER;\n+\t\t\telse if (d == '/')\n+\t\t\t\ttoken->type = TOKEN_TAG_START2;\n+\t\t\telse\n+\t\t\t{\n+\t\t\t\tungetcToInputFile (d);\n+\t\t\t\ttoken->type = TOKEN_TAG_START;\n+\t\t\t}\n+\t\t\tbreak;\n+\t\t}\n+\t\tcase '/':\n+\t\t{\n+\t\t\tint d = getcFromInputFile ();\n+\t\t\tif (d == '>')\n+\t\t\t\ttoken->type = TOKEN_TAG_END2;\n+\t\t\telse\n+\t\t\t{\n+\t\t\t\tungetcToInputFile (d);\n+\t\t\t\ttoken->type = TOKEN_OTHER;\n+\t\t\t}\n+\t\t\tbreak;\n+\t\t}\n+\t\tcase '>':\n+\t\t{\n+\t\t\ttoken->type = TOKEN_TAG_END;\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\tcase '=':\n+\t\t\ttoken->type = TOKEN_EQUAL;\n+\t\t\tbreak;\n+\n+\t\tcase '\"':\n+\t\tcase '\\'':\n+\t\t{\n+\t\t\tconst int delimiter = c;\n+\t\t\tc = getcFromInputFile ();\n+\t\t\twhile (c != EOF && c != delimiter)\n+\t\t\t{\n+\t\t\t\tvStringPut (token->string, c);\n+\t\t\t\tc = getcFromInputFile ();\n+\t\t\t}\n+\t\t\ttoken->type = TOKEN_STRING;\n+\t\t\tbreak;\n+\t\t}\n+\n+\t\tdefault:\n+\t\t{\n+\t\t\tdo\n+\t\t\t{\n+\t\t\t\tvStringPut (token->string, tolower (c));\n+\t\t\t\tc = getcFromInputFile ();\n+\t\t\t}\n+\t\t\twhile (c != EOF && c != ' ' && c != '\\t' && c != '<' && c != '/' &&\n+\t\t\t\t   c != '=' && c != '>' && c != '\\'' && c != '\"');\n+\t\t\tif (c != EOF)\n+\t\t\t\tungetcToInputFile (c);\n+\t\t\ttoken->type = TOKEN_NAME;\n+\t\t\tbreak;\n+\t\t}\n+\t}\n+}\n+\n+static void readTagContent (tokenInfo *token, vString *text, boolean isScript)\n+{\n+\ttokenType type;\n+\n+\treadTokenText (token, text != NULL, isScript);\n+\tif (text != NULL)\n+\t\tvStringCat (text, token->string);\n+\n+\tdo\n+\t{\n+\t\treadToken (token, FALSE);\n+\t\ttype = token->type;\n+\t\tif (type == TOKEN_COMMENT)\n+\t\t{\n+\t\t\treadTokenText (token, text != NULL, isScript);\n+\t\t\tif (text != NULL)\n+\t\t\t\tvStringCat (text, token->string);\n+\t\t}\n+\t\telse if (type == TOKEN_TAG_START)\n+\t\t{\n+\t\t\treadTag (token, text);\n+\t\t\treadTokenText (token, text != NULL, isScript);\n+\t\t\tif (text != NULL)\n+\t\t\t\tvStringCat (text, token->string);\n+\t\t}\n+\t}\n+\twhile (type == TOKEN_COMMENT || type == TOKEN_TAG_START);\n+}\n+\n+static void readTag (tokenInfo *token, vString *text)\n+{\n+\tboolean textCreated = FALSE;\n+\treadToken (token, TRUE);\n+\tif (token->type == TOKEN_NAME)\n+\t{\n+\t\tkeywordId startTag;\n+\n+\t\tstartTag = lookupKeyword (vStringValue (token->string), Lang_html);\n+\t\tif (text == NULL &&\n+\t\t\t(startTag == KEYWORD_h1 || startTag == KEYWORD_h2 || startTag == KEYWORD_h3))\n+\t\t{\n+\t\t\ttext = vStringNew ();\n+\t\t\ttextCreated = TRUE;\n+\t\t}\n+\n+\t\tdo\n+\t\t{\n+\t\t\treadToken (token, TRUE);\n+\t\t\tif (startTag == KEYWORD_a && token->type == TOKEN_NAME)\n+\t\t\t{\n+\t\t\t\tkeywordId attribute = lookupKeyword (vStringValue (token->string), Lang_html);\n+\n+\t\t\t\tif (attribute == KEYWORD_name)\n+\t\t\t\t{\n+\t\t\t\t\treadToken (token, TRUE);\n+\t\t\t\t\tif (token->type == TOKEN_EQUAL)\n+\t\t\t\t\t{\n+\t\t\t\t\t\treadToken (token, TRUE);\n+\t\t\t\t\t\tif (token->type == TOKEN_STRING || token->type == TOKEN_NAME)\n+\t\t\t\t\t\t\tmakeSimpleTag (token->string, HtmlKinds, K_ANCHOR);\n+\t\t\t\t\t}\n+\t\t\t\t}\n+\t\t\t}\n+\t\t}\n+\t\twhile (token->type != TOKEN_TAG_END && token->type != TOKEN_TAG_END2 &&\n+\t\t\t   token->type != TOKEN_EOF);\n+\n+\t\tif (token->type == TOKEN_TAG_END)\n+\t\t{\n+\t\t\treadTagContent (token, text, startTag == KEYWORD_script);\n+\n+\t\t\treadToken (token, TRUE);\n+\t\t\tif (textCreated && text != NULL)","path":"parsers/html.c","position":394,"original_position":394,"commit_id":"9e7b0032be49b41aa2a3b6052705879df6e1c2f2","original_commit_id":"3048c15bf2917579a3e81e0cfff8d1ca3ad52ea7","user":{"login":"techee","id":713965,"avatar_url":"https://avatars.githubusercontent.com/u/713965?v=3","gravatar_id":"","url":"https://api.github.com/users/techee","html_url":"https://github.com/techee","followers_url":"https://api.github.com/users/techee/followers","following_url":"https://api.github.com/users/techee/following{/other_user}","gists_url":"https://api.github.com/users/techee/gists{/gist_id}","starred_url":"https://api.github.com/users/techee/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/techee/subscriptions","organizations_url":"https://api.github.com/users/techee/orgs","repos_url":"https://api.github.com/users/techee/repos","events_url":"https://api.github.com/users/techee/events{/privacy}","received_events_url":"https://api.github.com/users/techee/received_events","type":"User","site_admin":false},"body":"It means something a little different - it tells whether it's the right heading tag end. In this case it's related to an invalid html like\r\n\r\n```\r\n<h1>something<h1>is</h1>here</h1>\r\n```\r\n\r\nThe check makes sure the tag gets generated at the second </h1>, i.e. the collected text will contain \"something is here\" instead of \"something is\". Maybe too paranoid but I just wanted to make sure we know where we get tag generated.","created_at":"2016-08-16T20:25:32Z","updated_at":"2016-08-16T20:25:32Z","html_url":"https://github.com/universal-ctags/ctags/pull/1079#discussion_r75012651","pull_request_url":"https://api.github.com/repos/universal-ctags/ctags/pulls/1079","_links":{"self":{"href":"https://api.github.com/repos/universal-ctags/ctags/pulls/comments/75012651"},"html":{"href":"https://github.com/universal-ctags/ctags/pull/1079#discussion_r75012651"},"pull_request":{"href":"https://api.github.com/repos/universal-ctags/ctags/pulls/1079"}}},"pull_request":{"url":"https://api.github.com/repos/universal-ctags/ctags/pulls/1079","id":81532351,"html_url":"https://github.com/universal-ctags/ctags/pull/1079","diff_url":"https://github.com/universal-ctags/ctags/pull/1079.diff","patch_url":"https://github.com/universal-ctags/ctags/pull/1079.patch","issue_url":"https://api.github.com/repos/universal-ctags/ctags/issues/1079","number":1079,"state":"open","locked":false,"title":"Token-based HTML parser","user":{"login":"techee","id":713965,"avatar_url":"https://avatars.githubusercontent.com/u/713965?v=3","gravatar_id":"","url":"https://api.github.com/users/techee","html_url":"https://github.com/techee","followers_url":"https://api.github.com/users/techee/followers","following_url":"https://api.github.com/users/techee/following{/other_user}","gists_url":"https://api.github.com/users/techee/gists{/gist_id}","starred_url":"https://api.github.com/users/techee/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/techee/subscriptions","organizations_url":"https://api.github.com/users/techee/orgs","repos_url":"https://api.github.com/users/techee/repos","events_url":"https://api.github.com/users/techee/events{/privacy}","received_events_url":"https://api.github.com/users/techee/received_events","type":"User","site_admin":false},"body":"This is a new token-based HTML parser. Apart from the usual advantages like comment detection and EOL independence the main goals of creating it were:\r\n\r\n- support of additional tags we have in Geany (h1, h2, h3) \r\n- speed - for universal-ctags it brings the parsing speed of the boost library html documentation from 5.5s to 3.2s (in Geany the speed difference is even bigger because for h1, h2, h3 tags we have additional 3 regexes which make the parsing speed about 2x slow in the original regex-based parser)\r\n- good error recovery when run on invalid input - this is important for Geany where using real XML parser would be probably too strict during typing and would end with an error so the symbol list would be probably empty most of the time\r\n\r\nI didn't really want to spend much time on parsing embedded javascript code so the parser just simulates the original regex for the javascript functions with all its limitations.\r\n\r\nIt should be quite easy to further extend the parser and detect additional tags and attributes.\r\n\r\ncc @b4n ","created_at":"2016-08-16T19:45:26Z","updated_at":"2016-08-16T20:25:32Z","closed_at":null,"merged_at":null,"merge_commit_sha":"99c062a365953fea747afb4ed081be429da4eb1b","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/universal-ctags/ctags/pulls/1079/commits","review_comments_url":"https://api.github.com/repos/universal-ctags/ctags/pulls/1079/comments","review_comment_url":"https://api.github.com/repos/universal-ctags/ctags/pulls/comments{/number}","comments_url":"https://api.github.com/repos/universal-ctags/ctags/issues/1079/comments","statuses_url":"https://api.github.com/repos/universal-ctags/ctags/statuses/9e7b0032be49b41aa2a3b6052705879df6e1c2f2","head":{"label":"techee:html_parser","ref":"html_parser","sha":"9e7b0032be49b41aa2a3b6052705879df6e1c2f2","user":{"login":"techee","id":713965,"avatar_url":"https://avatars.githubusercontent.com/u/713965?v=3","gravatar_id":"","url":"https://api.github.com/users/techee","html_url":"https://github.com/techee","followers_url":"https://api.github.com/users/techee/followers","following_url":"https://api.github.com/users/techee/following{/other_user}","gists_url":"https://api.github.com/users/techee/gists{/gist_id}","starred_url":"https://api.github.com/users/techee/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/techee/subscriptions","organizations_url":"https://api.github.com/users/techee/orgs","repos_url":"https://api.github.com/users/techee/repos","events_url":"https://api.github.com/users/techee/events{/privacy}","received_events_url":"https://api.github.com/users/techee/received_events","type":"User","site_admin":false},"repo":{"id":27652831,"name":"ctags","full_name":"techee/ctags","owner":{"login":"techee","id":713965,"avatar_url":"https://avatars.githubusercontent.com/u/713965?v=3","gravatar_id":"","url":"https://api.github.com/users/techee","html_url":"https://github.com/techee","followers_url":"https://api.github.com/users/techee/followers","following_url":"https://api.github.com/users/techee/following{/other_user}","gists_url":"https://api.github.com/users/techee/gists{/gist_id}","starred_url":"https://api.github.com/users/techee/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/techee/subscriptions","organizations_url":"https://api.github.com/users/techee/orgs","repos_url":"https://api.github.com/users/techee/repos","events_url":"https://api.github.com/users/techee/events{/privacy}","received_events_url":"https://api.github.com/users/techee/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/techee/ctags","description":"clone of official ctags repo with obj-c and css patches added","fork":true,"url":"https://api.github.com/repos/techee/ctags","forks_url":"https://api.github.com/repos/techee/ctags/forks","keys_url":"https://api.github.com/repos/techee/ctags/keys{/key_id}","collaborators_url":"https://api.github.com/repos/techee/ctags/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/techee/ctags/teams","hooks_url":"https://api.github.com/repos/techee/ctags/hooks","issue_events_url":"https://api.github.com/repos/techee/ctags/issues/events{/number}","events_url":"https://api.github.com/repos/techee/ctags/events","assignees_url":"https://api.github.com/repos/techee/ctags/assignees{/user}","branches_url":"https://api.github.com/repos/techee/ctags/branches{/branch}","tags_url":"https://api.github.com/repos/techee/ctags/tags","blobs_url":"https://api.github.com/repos/techee/ctags/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/techee/ctags/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/techee/ctags/git/refs{/sha}","trees_url":"https://api.github.com/repos/techee/ctags/git/trees{/sha}","statuses_url":"https://api.github.com/repos/techee/ctags/statuses/{sha}","languages_url":"https://api.github.com/repos/techee/ctags/languages","stargazers_url":"https://api.github.com/repos/techee/ctags/stargazers","contributors_url":"https://api.github.com/repos/techee/ctags/contributors","subscribers_url":"https://api.github.com/repos/techee/ctags/subscribers","subscription_url":"https://api.github.com/repos/techee/ctags/subscription","commits_url":"https://api.github.com/repos/techee/ctags/commits{/sha}","git_commits_url":"https://api.github.com/repos/techee/ctags/git/commits{/sha}","comments_url":"https://api.github.com/repos/techee/ctags/comments{/number}","issue_comment_url":"https://api.github.com/repos/techee/ctags/issues/comments{/number}","contents_url":"https://api.github.com/repos/techee/ctags/contents/{+path}","compare_url":"https://api.github.com/repos/techee/ctags/compare/{base}...{head}","merges_url":"https://api.github.com/repos/techee/ctags/merges","archive_url":"https://api.github.com/repos/techee/ctags/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/techee/ctags/downloads","issues_url":"https://api.github.com/repos/techee/ctags/issues{/number}","pulls_url":"https://api.github.com/repos/techee/ctags/pulls{/number}","milestones_url":"https://api.github.com/repos/techee/ctags/milestones{/number}","notifications_url":"https://api.github.com/repos/techee/ctags/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/techee/ctags/labels{/name}","releases_url":"https://api.github.com/repos/techee/ctags/releases{/id}","deployments_url":"https://api.github.com/repos/techee/ctags/deployments","created_at":"2014-12-06T23:29:21Z","updated_at":"2014-12-06T23:29:24Z","pushed_at":"2016-08-16T20:05:00Z","git_url":"git://github.com/techee/ctags.git","ssh_url":"git@github.com:techee/ctags.git","clone_url":"https://github.com/techee/ctags.git","svn_url":"https://github.com/techee/ctags","homepage":"","size":7853,"stargazers_count":0,"watchers_count":0,"language":"C","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"universal-ctags:master","ref":"master","sha":"2ca6b9e5418f2359d809414d6546ddc4deddde81","user":{"login":"universal-ctags","id":9616766,"avatar_url":"https://avatars.githubusercontent.com/u/9616766?v=3","gravatar_id":"","url":"https://api.github.com/users/universal-ctags","html_url":"https://github.com/universal-ctags","followers_url":"https://api.github.com/users/universal-ctags/followers","following_url":"https://api.github.com/users/universal-ctags/following{/other_user}","gists_url":"https://api.github.com/users/universal-ctags/gists{/gist_id}","starred_url":"https://api.github.com/users/universal-ctags/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/universal-ctags/subscriptions","organizations_url":"https://api.github.com/users/universal-ctags/orgs","repos_url":"https://api.github.com/users/universal-ctags/repos","events_url":"https://api.github.com/users/universal-ctags/events{/privacy}","received_events_url":"https://api.github.com/users/universal-ctags/received_events","type":"Organization","site_admin":false},"repo":{"id":578839,"name":"ctags","full_name":"universal-ctags/ctags","owner":{"login":"universal-ctags","id":9616766,"avatar_url":"https://avatars.githubusercontent.com/u/9616766?v=3","gravatar_id":"","url":"https://api.github.com/users/universal-ctags","html_url":"https://github.com/universal-ctags","followers_url":"https://api.github.com/users/universal-ctags/followers","following_url":"https://api.github.com/users/universal-ctags/following{/other_user}","gists_url":"https://api.github.com/users/universal-ctags/gists{/gist_id}","starred_url":"https://api.github.com/users/universal-ctags/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/universal-ctags/subscriptions","organizations_url":"https://api.github.com/users/universal-ctags/orgs","repos_url":"https://api.github.com/users/universal-ctags/repos","events_url":"https://api.github.com/users/universal-ctags/events{/privacy}","received_events_url":"https://api.github.com/users/universal-ctags/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/universal-ctags/ctags","description":"A maintained ctags implementation","fork":false,"url":"https://api.github.com/repos/universal-ctags/ctags","forks_url":"https://api.github.com/repos/universal-ctags/ctags/forks","keys_url":"https://api.github.com/repos/universal-ctags/ctags/keys{/key_id}","collaborators_url":"https://api.github.com/repos/universal-ctags/ctags/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/universal-ctags/ctags/teams","hooks_url":"https://api.github.com/repos/universal-ctags/ctags/hooks","issue_events_url":"https://api.github.com/repos/universal-ctags/ctags/issues/events{/number}","events_url":"https://api.github.com/repos/universal-ctags/ctags/events","assignees_url":"https://api.github.com/repos/universal-ctags/ctags/assignees{/user}","branches_url":"https://api.github.com/repos/universal-ctags/ctags/branches{/branch}","tags_url":"https://api.github.com/repos/universal-ctags/ctags/tags","blobs_url":"https://api.github.com/repos/universal-ctags/ctags/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/universal-ctags/ctags/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/universal-ctags/ctags/git/refs{/sha}","trees_url":"https://api.github.com/repos/universal-ctags/ctags/git/trees{/sha}","statuses_url":"https://api.github.com/repos/universal-ctags/ctags/statuses/{sha}","languages_url":"https://api.github.com/repos/universal-ctags/ctags/languages","stargazers_url":"https://api.github.com/repos/universal-ctags/ctags/stargazers","contributors_url":"https://api.github.com/repos/universal-ctags/ctags/contributors","subscribers_url":"https://api.github.com/repos/universal-ctags/ctags/subscribers","subscription_url":"https://api.github.com/repos/universal-ctags/ctags/subscription","commits_url":"https://api.github.com/repos/universal-ctags/ctags/commits{/sha}","git_commits_url":"https://api.github.com/repos/universal-ctags/ctags/git/commits{/sha}","comments_url":"https://api.github.com/repos/universal-ctags/ctags/comments{/number}","issue_comment_url":"https://api.github.com/repos/universal-ctags/ctags/issues/comments{/number}","contents_url":"https://api.github.com/repos/universal-ctags/ctags/contents/{+path}","compare_url":"https://api.github.com/repos/universal-ctags/ctags/compare/{base}...{head}","merges_url":"https://api.github.com/repos/universal-ctags/ctags/merges","archive_url":"https://api.github.com/repos/universal-ctags/ctags/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/universal-ctags/ctags/downloads","issues_url":"https://api.github.com/repos/universal-ctags/ctags/issues{/number}","pulls_url":"https://api.github.com/repos/universal-ctags/ctags/pulls{/number}","milestones_url":"https://api.github.com/repos/universal-ctags/ctags/milestones{/number}","notifications_url":"https://api.github.com/repos/universal-ctags/ctags/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/universal-ctags/ctags/labels{/name}","releases_url":"https://api.github.com/repos/universal-ctags/ctags/releases{/id}","deployments_url":"https://api.github.com/repos/universal-ctags/ctags/deployments","created_at":"2010-03-25T10:43:13Z","updated_at":"2016-08-16T09:22:58Z","pushed_at":"2016-08-16T20:05:00Z","git_url":"git://github.com/universal-ctags/ctags.git","ssh_url":"git@github.com:universal-ctags/ctags.git","clone_url":"https://github.com/universal-ctags/ctags.git","svn_url":"https://github.com/universal-ctags/ctags","homepage":"https://ctags.io","size":10546,"stargazers_count":798,"watchers_count":798,"language":"C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":153,"mirror_url":null,"open_issues_count":108,"forks":153,"open_issues":108,"watchers":798,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/universal-ctags/ctags/pulls/1079"},"html":{"href":"https://github.com/universal-ctags/ctags/pull/1079"},"issue":{"href":"https://api.github.com/repos/universal-ctags/ctags/issues/1079"},"comments":{"href":"https://api.github.com/repos/universal-ctags/ctags/issues/1079/comments"},"review_comments":{"href":"https://api.github.com/repos/universal-ctags/ctags/pulls/1079/comments"},"review_comment":{"href":"https://api.github.com/repos/universal-ctags/ctags/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/universal-ctags/ctags/pulls/1079/commits"},"statuses":{"href":"https://api.github.com/repos/universal-ctags/ctags/statuses/9e7b0032be49b41aa2a3b6052705879df6e1c2f2"}}}}
{"actor":{"display_login":"techee"}}