GitHub PullRequestReviewCommentEvent at 2014-11-26 10:43:43
Repository: ezpublish-kernel
Actor: lolautruche
Payload: {"action":"created","comment":{"url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/pulls/comments/20927522","id":20927522,"diff_hunk":"@@ -186,39 +182,153 @@ function ( Repository $repository ) use ( $locationId )\n \n             if ( $embedContent === null )\n             {\n-                // Remove tmp paragraph\n-                if ( $embed->parentNode->lookupNamespaceUri( 'tmp' ) !== null )\n-                {\n-                    $embed->parentNode->parentNode->removeChild( $embed->parentNode );\n-                }\n-                // Remove empty link\n-                else if ( $embed->parentNode->localName === \"link\" && $embed->parentNode->childNodes->length === 1 )\n-                {\n-                    // Remove paragraph with empty link\n-                    if (\n-                        $embed->parentNode->parentNode->localName === \"paragraph\" &&\n-                        $embed->parentNode->parentNode->childNodes->length === 1\n-                    )\n-                    {\n-                        $embed->parentNode->parentNode->parentNode->removeChild( $embed->parentNode->parentNode );\n-                    }\n-                    // Remove empty link\n-                    else\n-                    {\n-                        $embed->parentNode->parentNode->removeChild( $embed->parentNode );\n-                    }\n-                }\n                 // Remove empty embed\n-                else\n+                $embed->parentNode->removeChild( $embed );\n+            }\n+            else\n+            {\n+                $embed->appendChild( $xmlDoc->createCDATASection( $embedContent ) );\n+            }\n+        }\n+    }\n+\n+    /**\n+     * Returns embed's parameters.\n+     *\n+     * @param \\DOMElement $embed\n+     *\n+     * @return array\n+     */\n+    protected function getParameters( DOMElement $embed )\n+    {\n+        $parameters = array(\n+            \"noLayout\" => true,\n+            \"objectParameters\" => array(),\n+        );\n+\n+        $linkParameters = $this->getLinkParameters( $embed );\n+\n+        if ( $linkParameters !== null )\n+        {\n+            $parameters[\"linkParameters\"] = $linkParameters;\n+        }\n+\n+        foreach ( $embed->attributes as $attribute )\n+        {\n+            // We only consider tags in the custom namespace, and skip disallowed names\n+            if (\n+                !isset( $this->excludedAttributes[$attribute->localName] )\n+                && $attribute->localName !== 'url'\n+                && strpos( $attribute->localName, 'ezlegacytmp-embed-link-' ) !== 0\n+            )\n+            {\n+                $parameters[\"objectParameters\"][$attribute->localName] = $attribute->nodeValue;\n+            }\n+        }\n+\n+        return $parameters;\n+    }\n+\n+    /**\n+     * Returns embed's link parameters, or null if embed is not linked.\n+     *\n+     * @param \\DOMElement $embed\n+     *\n+     * @return array|null\n+     */\n+    protected function getLinkParameters( DOMElement $embed )\n+    {\n+        if ( !$embed->hasAttribute( \"url\" ) )\n+        {\n+            return null;\n+        }\n+\n+        $tmpPrefix = $this->tmpPrefix;\n+\n+        $target = $embed->getAttribute( \"{$tmpPrefix}target\" );\n+        $title = $embed->getAttribute( \"{$tmpPrefix}title\" );\n+        $id = $embed->getAttribute( \"{$tmpPrefix}id\" );\n+        $class = $embed->getAttribute( \"{$tmpPrefix}class\" );\n+        $resourceType = null;\n+        $resourceId = null;\n+\n+        if ( $embed->hasAttribute( \"{$tmpPrefix}object_id\" ) )\n+        {\n+            $resourceType = \"CONTENT\";\n+            $resourceId = $embed->getAttribute( \"{$tmpPrefix}object_id\" );\n+        }\n+        else if ( $embed->hasAttribute( \"{$tmpPrefix}node_id\" ) )\n+        {\n+            $resourceType = \"LOCATION\";\n+            $resourceId = $embed->getAttribute( \"{$tmpPrefix}node_id\" );\n+        }\n+        else if ( $embed->hasAttribute( \"{$tmpPrefix}url_id\" ) )\n+        {\n+            $resourceType = \"URL\";\n+            $resourceId = $embed->getAttribute( \"{$tmpPrefix}url_id\" );\n+        }\n+        else\n+        {\n+            $this->logger->error(\n+                \"Could not resolve XmlText embed link resource type and ID\"\n+            );\n+        }\n+\n+        $parameters = array(\n+            \"href\" => $embed->getAttribute( \"url\" ),\n+            \"target\" => $target ?: null,\n+            \"title\" => $title ?: null,\n+            \"id\" => $id ?: null,\n+            \"class\" => $class ?: null,\n+            \"resourceType\" => $resourceType,\n+            \"resourceId\" => $resourceId,\n+            \"wrapped\" => $this->isLinkWrapped( $embed ),\n+        );\n+\n+        return $parameters;\n+    }\n+\n+    /**\n+     * Returns boolean signifying if the embed is contained in a link element of not.\n+     *\n+     * After EmbedLinking converter pass this should be possible only for inline level embeds.\n+     *\n+     * @param \\DOMElement $element\n+     *\n+     * @return boolean\n+     */\n+    protected function isLinkWrapped( DOMElement $element )\n+    {\n+        $parentNode = $element->parentNode;\n+\n+        if ( $parentNode instanceof DOMDocument )\n+        {\n+            return false;\n+        }\n+        else if ( $parentNode->localName === \"link\" )\n+        {\n+            $childCount = 0;\n+\n+            /** @var \\DOMText|\\DOMElement $node */\n+            foreach ( $parentNode->childNodes as $node )\n+            {\n+                if ( !( $node->nodeType === XML_TEXT_NODE && $node->isWhitespaceInElementContent() ) )\n                 {\n-                    $embed->parentNode->removeChild( $embed );\n+                    $childCount += 1;\n                 }\n             }\n+\n+            if ( $childCount === 1 )\n+            {\n+                return false;\n+            }\n             else\n             {\n-                $embed->appendChild( $xmlDoc->createCDATASection( $embedContent ) );\n+                return true;\n             }","path":"eZ/Publish/Core/FieldType/XmlText/Converter/EmbedToHtml5.php","position":null,"original_position":215,"commit_id":"cbd5bff3c443ef851eb4eb9a2674a74158f25075","original_commit_id":"e767e6cf07294309c9bb22a0ef784a0cedf56153","user":{"login":"lolautruche","id":313528,"avatar_url":"https://avatars.githubusercontent.com/u/313528?v=3","gravatar_id":"","url":"https://api.github.com/users/lolautruche","html_url":"https://github.com/lolautruche","followers_url":"https://api.github.com/users/lolautruche/followers","following_url":"https://api.github.com/users/lolautruche/following{/other_user}","gists_url":"https://api.github.com/users/lolautruche/gists{/gist_id}","starred_url":"https://api.github.com/users/lolautruche/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lolautruche/subscriptions","organizations_url":"https://api.github.com/users/lolautruche/orgs","repos_url":"https://api.github.com/users/lolautruche/repos","events_url":"https://api.github.com/users/lolautruche/events{/privacy}","received_events_url":"https://api.github.com/users/lolautruche/received_events","type":"User","site_admin":false},"body":"I was checking if you were following :stuck_out_tongue_winking_eye: ","created_at":"2014-11-26T10:43:43Z","updated_at":"2014-11-26T10:43:43Z","html_url":"https://github.com/ezsystems/ezpublish-kernel/pull/1087#discussion_r20927522","pull_request_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/pulls/1087","_links":{"self":{"href":"https://api.github.com/repos/ezsystems/ezpublish-kernel/pulls/comments/20927522"},"html":{"href":"https://github.com/ezsystems/ezpublish-kernel/pull/1087#discussion_r20927522"},"pull_request":{"href":"https://api.github.com/repos/ezsystems/ezpublish-kernel/pulls/1087"}}},"pull_request":{"url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/pulls/1087","id":24298289,"html_url":"https://github.com/ezsystems/ezpublish-kernel/pull/1087","diff_url":"https://github.com/ezsystems/ezpublish-kernel/pull/1087.diff","patch_url":"https://github.com/ezsystems/ezpublish-kernel/pull/1087.patch","issue_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/issues/1087","number":1087,"state":"open","locked":false,"title":"Fix EZP-23513: embed rendering (XmlText)","user":{"login":"pspanja","id":1135425,"avatar_url":"https://avatars.githubusercontent.com/u/1135425?v=3","gravatar_id":"","url":"https://api.github.com/users/pspanja","html_url":"https://github.com/pspanja","followers_url":"https://api.github.com/users/pspanja/followers","following_url":"https://api.github.com/users/pspanja/following{/other_user}","gists_url":"https://api.github.com/users/pspanja/gists{/gist_id}","starred_url":"https://api.github.com/users/pspanja/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pspanja/subscriptions","organizations_url":"https://api.github.com/users/pspanja/orgs","repos_url":"https://api.github.com/users/pspanja/repos","events_url":"https://api.github.com/users/pspanja/events{/privacy}","received_events_url":"https://api.github.com/users/pspanja/received_events","type":"User","site_admin":false},"body":"This PR resolves https://jira.ez.no/browse/EZP-23513\r\n\r\nPart 1 of 2, second PR will handle RichText field type.\r\nPart 2 of 2 handling RichText is available here: https://github.com/ezsystems/ezpublish-kernel/pull/1091\r\n\r\nReported issue is about paragraph being rendered around embedded Content. However, fixing this revealed a number of other problems with embed rendering.\r\n\r\n**First** one is _expansion_ of paragraphs containing block level embeds. In legacy `ezxml` this is allowed, and XML like this one:\r\n\r\n```xml\r\n<paragraph>\r\n    Some text\r\n    <embed/>\r\n    Other text\r\n</paragraph>\r\n```\r\n\r\nwill be rendered like:\r\n\r\n```xml\r\n<paragraph>Some text</paragraph>\r\n<embed/>\r\n<paragraph>Other text</paragraph>\r\n```\r\n\r\n**Second** one is about linked embeds. In legacy `ezxml` embed is not a link by itself. This is done through wrapping the embed element inside a link. Aside from embed element, link can also contain other content. This is best explained by example, XML like this one:\r\n\r\n```xml\r\n<paragraph>\r\n    Some <link>linked <embed/>text</link> and something else\r\n</paragraph>\r\n```\r\n\r\nwill be rendered like:\r\n\r\n```xml\r\n<paragraph>\r\n    Some <link>linked</link>\r\n</paragraph>\r\n<link>\r\n    <embed/>\r\n</link>\r\n<paragraph>\r\n    <link>text</link>and something else\r\n</paragraph>\r\n```\r\n\r\nOther inline elements can enter the picture here, and all are correctly handled by Legacy Stack, but this kind of _expansion_ was not handled by new stack at all.\r\n\r\nThat is the cause of originally reported issue.\r\n\r\n**Third** problem is that link that wrapping the embed is actually interpreted as a property of embed itself, although it is represented by a separate element. Legacy Stack handles this by passing `link_parameters` to the embed template. This was also not handled by new stack, not XmlText nor RichText (which implements conversion to and from legacy `ezxml` format). In RichText this use case was not recognized, and will be fixed in the following PR together with `ezxml` conversion.\r\n\r\n**Fourth** problem is usage of temporary paragraphs to wrap block level elements. These are the paragraphs defining local `tmp` namespace. Such namespace definition is inherited by all descendant elements, which really means that in case of nesting, they are unusable in XPath (and therefore in XSL transformation). This was therefore handled imperfectly in XSL transformation. Partial fix for this problem was implemented in `CustomTags` converter, which uses PHP's DOM API to recognise local `tmp` namespace definition on a paragraph, through checking for it as an attribute. `CustomTags` pre-converter is here removed as new `Expanding` pre-converter took over its function.\r\n\r\nDescribed problems are here fixed as follows:\r\n\r\n1. Paragraph expansion is handled by new `Expanding` pre-converter.\r\n2. Linked embeds inside a paragraph are handled by new `Expanding` pre-converter, which will keep the link around the embed element while expanding the paragraph into multiple paragraphs and extracting the embed element out of it.\r\n3. Interpreting embed's link as a property of the embed itself is handled first by new `EmbedLinking` pre-converter, which will add link properties to the embed, and also unwrap it from the link if required. After this the problem is handled by `Link` and `Embed` pre-converters. First one will resolve the link that is added to the embed element, and second one will extract link data and pass it to the rendering process. The template will receive this data in form of `linkParameters` variable, which will be converted to the Legacy Stack format in the case of fallback.\r\n4. Handling temporary paragraphs is done in `Expanding` pre-converter, which will through PHP's DOM API check for the local namespace as an attribute and add an attribute so that it can be sanely handled in XSL transformation. This also led to some simplification of the XSL transformation.\r\n\r\nInline level embeds receive the same treatment like block level embeds, aside that they are not unwrapped from the link if the link contains other content as well. In this case (new stack only) `linkParameters` contain `wrapping` boolean parameter, which signifies wrapping status and enables correct handling of the context.\r\n\r\nWith this changes embedding logic introduced in #1059 was also simplified as announced.\r\n\r\n`linkParameters` variable passed to the template looks like this:\r\n\r\n```\r\n'linkParameters' => array(\r\n    'href' => 'http://ez.no',\r\n    'target' => 'target',\r\n    'title' => 'title',\r\n    'id' => 'id',\r\n    'class' => 'class',\r\n    'resourceType' => 'LOCATION',\r\n    'resourceId' => '111',\r\n    'wrapped' => false,\r\n)\r\n```\r\n\r\nThis structure is intended to be kept for RichText as well, so it is here to stay.\r\nTherefore you might want to give it special attention in review.\r\n\r\nTesting: unit tests and manual integration tests.","created_at":"2014-11-12T15:07:47Z","updated_at":"2014-11-26T10:43:43Z","closed_at":null,"merged_at":null,"merge_commit_sha":"2781aa9ea773b2c01eeb3aed5c41d1d25f8341c0","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/pulls/1087/commits","review_comments_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/pulls/1087/comments","review_comment_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/pulls/comments/{number}","comments_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/issues/1087/comments","statuses_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/statuses/cbd5bff3c443ef851eb4eb9a2674a74158f25075","head":{"label":"ezsystems:fix-EZP-23513-xmltext-paragraphs","ref":"fix-EZP-23513-xmltext-paragraphs","sha":"cbd5bff3c443ef851eb4eb9a2674a74158f25075","user":{"login":"ezsystems","id":295311,"avatar_url":"https://avatars.githubusercontent.com/u/295311?v=3","gravatar_id":"","url":"https://api.github.com/users/ezsystems","html_url":"https://github.com/ezsystems","followers_url":"https://api.github.com/users/ezsystems/followers","following_url":"https://api.github.com/users/ezsystems/following{/other_user}","gists_url":"https://api.github.com/users/ezsystems/gists{/gist_id}","starred_url":"https://api.github.com/users/ezsystems/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ezsystems/subscriptions","organizations_url":"https://api.github.com/users/ezsystems/orgs","repos_url":"https://api.github.com/users/ezsystems/repos","events_url":"https://api.github.com/users/ezsystems/events{/privacy}","received_events_url":"https://api.github.com/users/ezsystems/received_events","type":"Organization","site_admin":false},"repo":{"id":1663890,"name":"ezpublish-kernel","full_name":"ezsystems/ezpublish-kernel","owner":{"login":"ezsystems","id":295311,"avatar_url":"https://avatars.githubusercontent.com/u/295311?v=3","gravatar_id":"","url":"https://api.github.com/users/ezsystems","html_url":"https://github.com/ezsystems","followers_url":"https://api.github.com/users/ezsystems/followers","following_url":"https://api.github.com/users/ezsystems/following{/other_user}","gists_url":"https://api.github.com/users/ezsystems/gists{/gist_id}","starred_url":"https://api.github.com/users/ezsystems/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ezsystems/subscriptions","organizations_url":"https://api.github.com/users/ezsystems/orgs","repos_url":"https://api.github.com/users/ezsystems/repos","events_url":"https://api.github.com/users/ezsystems/events{/privacy}","received_events_url":"https://api.github.com/users/ezsystems/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ezsystems/ezpublish-kernel","description":"eZ Publish 5 kernel","fork":false,"url":"https://api.github.com/repos/ezsystems/ezpublish-kernel","forks_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/forks","keys_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/teams","hooks_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/hooks","issue_events_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/issues/events{/number}","events_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/events","assignees_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/assignees{/user}","branches_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/branches{/branch}","tags_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/tags","blobs_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/git/refs{/sha}","trees_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/statuses/{sha}","languages_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/languages","stargazers_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/stargazers","contributors_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/contributors","subscribers_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/subscribers","subscription_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/subscription","commits_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/commits{/sha}","git_commits_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/git/commits{/sha}","comments_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/comments{/number}","issue_comment_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/issues/comments/{number}","contents_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/contents/{+path}","compare_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/merges","archive_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/downloads","issues_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/issues{/number}","pulls_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/pulls{/number}","milestones_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/milestones{/number}","notifications_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/labels{/name}","releases_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/releases{/id}","created_at":"2011-04-26T08:54:24Z","updated_at":"2014-11-25T14:20:16Z","pushed_at":"2014-11-26T10:17:08Z","git_url":"git://github.com/ezsystems/ezpublish-kernel.git","ssh_url":"git@github.com:ezsystems/ezpublish-kernel.git","clone_url":"https://github.com/ezsystems/ezpublish-kernel.git","svn_url":"https://github.com/ezsystems/ezpublish-kernel","homepage":"http://ez.no","size":68656,"stargazers_count":94,"watchers_count":94,"language":"PHP","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":106,"mirror_url":null,"open_issues_count":38,"forks":106,"open_issues":38,"watchers":94,"default_branch":"master"}},"base":{"label":"ezsystems:master","ref":"master","sha":"f28fb1bfc032c89dc8284cf51b39ca57ebb400c8","user":{"login":"ezsystems","id":295311,"avatar_url":"https://avatars.githubusercontent.com/u/295311?v=3","gravatar_id":"","url":"https://api.github.com/users/ezsystems","html_url":"https://github.com/ezsystems","followers_url":"https://api.github.com/users/ezsystems/followers","following_url":"https://api.github.com/users/ezsystems/following{/other_user}","gists_url":"https://api.github.com/users/ezsystems/gists{/gist_id}","starred_url":"https://api.github.com/users/ezsystems/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ezsystems/subscriptions","organizations_url":"https://api.github.com/users/ezsystems/orgs","repos_url":"https://api.github.com/users/ezsystems/repos","events_url":"https://api.github.com/users/ezsystems/events{/privacy}","received_events_url":"https://api.github.com/users/ezsystems/received_events","type":"Organization","site_admin":false},"repo":{"id":1663890,"name":"ezpublish-kernel","full_name":"ezsystems/ezpublish-kernel","owner":{"login":"ezsystems","id":295311,"avatar_url":"https://avatars.githubusercontent.com/u/295311?v=3","gravatar_id":"","url":"https://api.github.com/users/ezsystems","html_url":"https://github.com/ezsystems","followers_url":"https://api.github.com/users/ezsystems/followers","following_url":"https://api.github.com/users/ezsystems/following{/other_user}","gists_url":"https://api.github.com/users/ezsystems/gists{/gist_id}","starred_url":"https://api.github.com/users/ezsystems/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ezsystems/subscriptions","organizations_url":"https://api.github.com/users/ezsystems/orgs","repos_url":"https://api.github.com/users/ezsystems/repos","events_url":"https://api.github.com/users/ezsystems/events{/privacy}","received_events_url":"https://api.github.com/users/ezsystems/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ezsystems/ezpublish-kernel","description":"eZ Publish 5 kernel","fork":false,"url":"https://api.github.com/repos/ezsystems/ezpublish-kernel","forks_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/forks","keys_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/teams","hooks_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/hooks","issue_events_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/issues/events{/number}","events_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/events","assignees_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/assignees{/user}","branches_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/branches{/branch}","tags_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/tags","blobs_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/git/refs{/sha}","trees_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/statuses/{sha}","languages_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/languages","stargazers_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/stargazers","contributors_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/contributors","subscribers_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/subscribers","subscription_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/subscription","commits_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/commits{/sha}","git_commits_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/git/commits{/sha}","comments_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/comments{/number}","issue_comment_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/issues/comments/{number}","contents_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/contents/{+path}","compare_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/merges","archive_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/downloads","issues_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/issues{/number}","pulls_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/pulls{/number}","milestones_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/milestones{/number}","notifications_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/labels{/name}","releases_url":"https://api.github.com/repos/ezsystems/ezpublish-kernel/releases{/id}","created_at":"2011-04-26T08:54:24Z","updated_at":"2014-11-25T14:20:16Z","pushed_at":"2014-11-26T10:17:08Z","git_url":"git://github.com/ezsystems/ezpublish-kernel.git","ssh_url":"git@github.com:ezsystems/ezpublish-kernel.git","clone_url":"https://github.com/ezsystems/ezpublish-kernel.git","svn_url":"https://github.com/ezsystems/ezpublish-kernel","homepage":"http://ez.no","size":68656,"stargazers_count":94,"watchers_count":94,"language":"PHP","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":106,"mirror_url":null,"open_issues_count":38,"forks":106,"open_issues":38,"watchers":94,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/ezsystems/ezpublish-kernel/pulls/1087"},"html":{"href":"https://github.com/ezsystems/ezpublish-kernel/pull/1087"},"issue":{"href":"https://api.github.com/repos/ezsystems/ezpublish-kernel/issues/1087"},"comments":{"href":"https://api.github.com/repos/ezsystems/ezpublish-kernel/issues/1087/comments"},"review_comments":{"href":"https://api.github.com/repos/ezsystems/ezpublish-kernel/pulls/1087/comments"},"review_comment":{"href":"https://api.github.com/repos/ezsystems/ezpublish-kernel/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/ezsystems/ezpublish-kernel/pulls/1087/commits"},"statuses":{"href":"https://api.github.com/repos/ezsystems/ezpublish-kernel/statuses/cbd5bff3c443ef851eb4eb9a2674a74158f25075"}}}}