From e115875801c2e32399079c4ef92bb11ceb4f2c1d Mon Sep 17 00:00:00 2001 From: vincent-peugnet Date: Wed, 12 Feb 2020 21:05:46 +0100 Subject: generate cytoscape datas --- app/class/Modelhome.php | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) (limited to 'app/class/Modelhome.php') diff --git a/app/class/Modelhome.php b/app/class/Modelhome.php index 6352282..37eb549 100644 --- a/app/class/Modelhome.php +++ b/app/class/Modelhome.php @@ -130,7 +130,46 @@ class Modelhome extends Modelpage } } return $pageselected; - } + } + + /** + * Transform list of page into list of nodes and edges + */ + public function mapdata(array $pagelist) + { + $nodes = []; + $edges = []; + foreach ($pagelist as $page) { + $node['group'] = 'nodes'; + $node['data']['id'] = $page->id(); + $node['classes'] = [$page->secure('string')]; + $nodes[] = $node; + + + foreach ($page->linkto() as $linkto) { + $edge['group'] = 'edges'; + $edge['data']['id'] = $page->id() . '>' . $linkto; + $edge['data']['source'] = $page->id(); + $edge['data']['target'] = $linkto; + $edges[] = $edge; + } + } + $datas['elements'] = array_merge($nodes, $edges); + + $datas['layout']['name'] = 'preset'; + $datas['style'] = [ + 'selector' => 'node', + 'style' => [ + 'label' => 'data(id)' + ] + ]; + return $datas; + } + + public function cytodata(array $mapdata) + { + + } /** -- cgit v1.2.3 From 87f75ea2869629fedf893942b767765eff40c597 Mon Sep 17 00:00:00 2001 From: n-peugnet Date: Sun, 22 Mar 2020 16:30:35 +0100 Subject: very first graph displayed using cytoscape --- app/class/Modelhome.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/class/Modelhome.php') diff --git a/app/class/Modelhome.php b/app/class/Modelhome.php index 37eb549..2aedae3 100644 --- a/app/class/Modelhome.php +++ b/app/class/Modelhome.php @@ -156,7 +156,7 @@ class Modelhome extends Modelpage } $datas['elements'] = array_merge($nodes, $edges); - $datas['layout']['name'] = 'preset'; + $datas['layout']['name'] = 'random'; $datas['style'] = [ 'selector' => 'node', 'style' => [ -- cgit v1.2.3 From 3962156bc8187d3752bbbdbaa06f7a23db38d354 Mon Sep 17 00:00:00 2001 From: n-peugnet Date: Sun, 22 Mar 2020 17:49:30 +0100 Subject: first style tests --- app/class/Modelhome.php | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) (limited to 'app/class/Modelhome.php') diff --git a/app/class/Modelhome.php b/app/class/Modelhome.php index 2aedae3..f4b4a56 100644 --- a/app/class/Modelhome.php +++ b/app/class/Modelhome.php @@ -158,11 +158,20 @@ class Modelhome extends Modelpage $datas['layout']['name'] = 'random'; $datas['style'] = [ - 'selector' => 'node', - 'style' => [ - 'label' => 'data(id)' - ] - ]; + [ + 'selector' => 'node', + 'style' => [ + 'label' => 'data(id)', + ], + ], + [ + 'selector' => 'edge', + 'style' => [ + 'curve-style' => 'bezier', + 'target-arrow-shape' => 'triangle', + ], + ], + ]; return $datas; } -- cgit v1.2.3 From 86d0185d570dbc896f9f438c12e133e8cdd83940 Mon Sep 17 00:00:00 2001 From: n-peugnet Date: Mon, 23 Mar 2020 15:13:09 +0100 Subject: feat(graph): better layout with cose-bilkent --- app/class/Modelhome.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/class/Modelhome.php') diff --git a/app/class/Modelhome.php b/app/class/Modelhome.php index f4b4a56..343a879 100644 --- a/app/class/Modelhome.php +++ b/app/class/Modelhome.php @@ -156,7 +156,7 @@ class Modelhome extends Modelpage } $datas['elements'] = array_merge($nodes, $edges); - $datas['layout']['name'] = 'random'; + $datas['layout']['name'] = 'cose-bilkent'; $datas['style'] = [ [ 'selector' => 'node', -- cgit v1.2.3 From 7d1b16dce7e435caefd39975ca68a08c4f79fc03 Mon Sep 17 00:00:00 2001 From: vincent-peugnet Date: Mon, 23 Mar 2020 16:19:48 +0100 Subject: map integration in home --- app/class/Modelhome.php | 43 +++++++++++++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 12 deletions(-) (limited to 'app/class/Modelhome.php') diff --git a/app/class/Modelhome.php b/app/class/Modelhome.php index 343a879..18ae1a5 100644 --- a/app/class/Modelhome.php +++ b/app/class/Modelhome.php @@ -45,8 +45,10 @@ class Modelhome extends Modelpage * @param array $table * @param Opt $opt * @param string $regex + * + * @return array of `Page` object */ - public function table2(array $table, Opt $opt, string $regex = "", array $searchopt = []) + public function table2(array $table, Opt $opt, string $regex = "", array $searchopt = []) : array { @@ -135,17 +137,11 @@ class Modelhome extends Modelpage /** * Transform list of page into list of nodes and edges */ - public function mapdata(array $pagelist) + public function cytodata(array $pagelist, string $layout = 'random') { - $nodes = []; - $edges = []; - foreach ($pagelist as $page) { - $node['group'] = 'nodes'; - $node['data']['id'] = $page->id(); - $node['classes'] = [$page->secure('string')]; - $nodes[] = $node; - + $datas['elements'] = $this->mapdata($pagelist); +<<<<<<< HEAD foreach ($page->linkto() as $linkto) { $edge['group'] = 'edges'; $edge['data']['id'] = $page->id() . '>' . $linkto; @@ -157,6 +153,11 @@ class Modelhome extends Modelpage $datas['elements'] = array_merge($nodes, $edges); $datas['layout']['name'] = 'cose-bilkent'; +======= + $datas['layout'] = [ + 'name' => $layout, + ]; +>>>>>>> map integration in home $datas['style'] = [ [ 'selector' => 'node', @@ -175,9 +176,27 @@ class Modelhome extends Modelpage return $datas; } - public function cytodata(array $mapdata) + public function mapdata(array $pagelist) { - + $nodes = []; + $edges = []; + foreach ($pagelist as $page) { + $node['group'] = 'nodes'; + $node['data']['id'] = $page->id(); + $node['classes'] = [$page->secure('string')]; + $nodes[] = $node; + + + foreach ($page->linkto() as $linkto) { + $edge['group'] = 'edges'; + $edge['data']['id'] = $page->id() . '>' . $linkto; + $edge['data']['source'] = $page->id(); + $edge['data']['target'] = $linkto; + $edges[] = $edge; + } + } + return array_merge($nodes, $edges); + } -- cgit v1.2.3 From 21569fcabfdcedbdd7f0185d9a7c5518f52f880c Mon Sep 17 00:00:00 2001 From: vincent-peugnet Date: Mon, 23 Mar 2020 16:31:56 +0100 Subject: resolve conflicts --- app/class/Modelhome.php | 14 -------------- 1 file changed, 14 deletions(-) (limited to 'app/class/Modelhome.php') diff --git a/app/class/Modelhome.php b/app/class/Modelhome.php index 18ae1a5..9aab4f2 100644 --- a/app/class/Modelhome.php +++ b/app/class/Modelhome.php @@ -141,23 +141,9 @@ class Modelhome extends Modelpage { $datas['elements'] = $this->mapdata($pagelist); -<<<<<<< HEAD - foreach ($page->linkto() as $linkto) { - $edge['group'] = 'edges'; - $edge['data']['id'] = $page->id() . '>' . $linkto; - $edge['data']['source'] = $page->id(); - $edge['data']['target'] = $linkto; - $edges[] = $edge; - } - } - $datas['elements'] = array_merge($nodes, $edges); - - $datas['layout']['name'] = 'cose-bilkent'; -======= $datas['layout'] = [ 'name' => $layout, ]; ->>>>>>> map integration in home $datas['style'] = [ [ 'selector' => 'node', -- cgit v1.2.3 From 1a93d70c938f3ae2b050f3a102c961cf1cc3cefc Mon Sep 17 00:00:00 2001 From: vincent-peugnet Date: Mon, 23 Mar 2020 21:04:15 +0100 Subject: filter map and orphans hide --- app/class/Modelhome.php | 157 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 111 insertions(+), 46 deletions(-) (limited to 'app/class/Modelhome.php') diff --git a/app/class/Modelhome.php b/app/class/Modelhome.php index 9aab4f2..ede9179 100644 --- a/app/class/Modelhome.php +++ b/app/class/Modelhome.php @@ -40,65 +40,84 @@ class Modelhome extends Modelpage + /** - * @param array $table + * Filter the pages list acording to the options and invert + * + * @param array $pagelist of `Page` objects * @param Opt $opt - * @param string $regex * - * @return array of `Page` object + * @return array of `string` pages id */ - public function table2(array $table, Opt $opt, string $regex = "", array $searchopt = []) : array - { + public function filter(array $pagelist, Opt $opt) : array + { - $filtertagfilter = $this->filtertagfilter($table, $opt->tagfilter(), $opt->tagcompare()); - $filterauthorfilter = $this->filterauthorfilter($table, $opt->authorfilter(), $opt->authorcompare()); - $filtersecure = $this->filtersecure($table, $opt->secure()); - $filterlinkto = $this->filterlinkto($table, $opt->linkto()); + $filtertagfilter = $this->filtertagfilter($pagelist, $opt->tagfilter(), $opt->tagcompare()); + $filterauthorfilter = $this->filterauthorfilter($pagelist, $opt->authorfilter(), $opt->authorcompare()); + $filtersecure = $this->filtersecure($pagelist, $opt->secure()); + $filterlinkto = $this->filterlinkto($pagelist, $opt->linkto()); $filter = array_intersect($filtertagfilter, $filtersecure, $filterauthorfilter, $filterlinkto); - $table2 = []; - $table2invert = []; - foreach ($table as $page) { - if (in_array($page->id(), $filter)) { - $table2[] = $page; - } else { - $table2invert[] = $page; - } - + if($opt->invert()) { + $idlist = array_keys($pagelist); + $filter = array_diff($idlist, $filter); } - if (!empty($opt->invert())) { - $table2 = $table2invert; - } + return $filter; + } - if(!empty($regex)) { - $table2 = $this->deepsearch($regex, $searchopt, $table2); - } - $this->pagelistsort($table2, $opt->sortby(), $opt->order()); + + /** + * Convert list of id into a list of Page objects + * + * @param array $pagelist + * @param array $idlist + * + * @return array Filtered list of `Page` objects + */ + public function pagelistfilter(array $pagelist, array $fiter) : array + { + return array_intersect_key($pagelist, array_flip($fiter)); + } + + + + + + /** + * Sort and limit an array of Pages + * + * @param array $pagelist of `Page` objects + * @param Opt $opt + * + * @return array associative array of `Page` objects + */ + public function sort(array $pagelist, Opt $opt) : array + { + $this->pagelistsort($pagelist, $opt->sortby(), $opt->order()); if($opt->limit() !== 0) { - $table2 = array_slice($table2, 0, $opt->limit()); + $pagelist = array_slice($pagelist, 0, $opt->limit()); } - - return $table2; + return $pagelist; } /** * Search for regex and count occurences * + * @param array $page list Array of Pages. * @param string $regex Regex to match. * @param array $options Option search, could be `content` `title` `description`. - * @param array $page list Array of Pages. * - * @return array associative array of Pages + * @return array associative array of `Page` objects */ - public function deepsearch(string $regex, array $options, array $pagelist) : array + public function deepsearch(array $pagelist, string $regex, array $options) : array { if($options['casesensitive']) { $case = ''; @@ -128,21 +147,38 @@ class Modelhome extends Modelpage $count += preg_match($regex, $page->description()); } if ($count !== 0) { - $pageselected[] = $page; + $pageselected[$page->id()] = $page; } } return $pageselected; } + + /** * Transform list of page into list of nodes and edges + * + * @param array $pagelist associative array of pages as `id => Page` + * @param string $layout + * @param bool $hideorphans if `true`, remove orphans pages + * + * */ - public function cytodata(array $pagelist, string $layout = 'random') + public function cytodata(array $pagelist, string $layout = 'random', bool $hideorphans = false) { - $datas['elements'] = $this->mapdata($pagelist); + $datas['elements'] = $this->mapdata($pagelist, $hideorphans); $datas['layout'] = [ 'name' => $layout, + 'quality' => 'proof', + 'fit' => true, + 'randomize' => true, + 'nodeDimensionsIncludeLabels' => true, + 'tile' => false, + 'edgeElasticity' => 0.75, + 'gravity' => 0.25, + 'idealEdgeLength' => 60, + 'numIter' => 10000 ]; $datas['style'] = [ [ @@ -162,25 +198,54 @@ class Modelhome extends Modelpage return $datas; } - public function mapdata(array $pagelist) + /** + * Transform list of Pages into cytoscape nodes and edge datas + * + * @param array $pagelist associative array of pages as `id => Page` + * @param bool $hideorphans if `true`, remove orphans pages + * + * @return array of cytoscape datas + */ + public function mapdata(array $pagelist, bool $hideorphans = false) : array { - $nodes = []; + $idlist = array_keys($pagelist); + $edges = []; foreach ($pagelist as $page) { - $node['group'] = 'nodes'; - $node['data']['id'] = $page->id(); - $node['classes'] = [$page->secure('string')]; - $nodes[] = $node; + foreach ($page->linkto() as $linkto) { + if(in_array($linkto, $idlist)) { + $edge['group'] = 'edges'; + $edge['data']['id'] = $page->id() . '>' . $linkto; + $edge['data']['source'] = $page->id(); + $edge['data']['target'] = $linkto; + $edges[] = $edge; + $notorphans[] = $linkto; + } + } + if(!empty($page->linkto())) { + $notorphans[] = $page->id(); + } + } + $notorphans = array_unique($notorphans); - foreach ($page->linkto() as $linkto) { - $edge['group'] = 'edges'; - $edge['data']['id'] = $page->id() . '>' . $linkto; - $edge['data']['source'] = $page->id(); - $edge['data']['target'] = $linkto; - $edges[] = $edge; + $nodes = []; + foreach ($pagelist as $id => $page) { + if($hideorphans) { + if(in_array($id, $notorphans)) { + $node['group'] = 'nodes'; + $node['data']['id'] = $page->id(); + $node['classes'] = [$page->secure('string')]; + $nodes[] = $node; + } + } else { + $node['group'] = 'nodes'; + $node['data']['id'] = $page->id(); + $node['classes'] = [$page->secure('string')]; + $nodes[] = $node; } } + return array_merge($nodes, $edges); } -- cgit v1.2.3 From d17713051ca2fef29de8025fe876d417838cea7f Mon Sep 17 00:00:00 2001 From: vincent-peugnet Date: Wed, 25 Mar 2020 19:53:38 +0100 Subject: graph look, add redirections, close #50 --- app/class/Modelhome.php | 106 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 71 insertions(+), 35 deletions(-) (limited to 'app/class/Modelhome.php') diff --git a/app/class/Modelhome.php b/app/class/Modelhome.php index ede9179..949c4f7 100644 --- a/app/class/Modelhome.php +++ b/app/class/Modelhome.php @@ -39,6 +39,25 @@ class Modelhome extends Modelpage } + /** + * @param array $pagelist of Pages objects as `id => Page` + * @param Opt $opt + * + * @param string $regex Regex to match. + * @param array $options Option search, could be `content` `title` `description`. + * + * @return array associative array of `Page` objects * + */ + public function pagetable(array $pagelist, Opt $opt, $regex = '', $searchopt = []) : array + { + $pagelist = $this->filter($pagelist, $opt); + if(!empty($regex)) { + $pagelist = $this->deepsearch($pagelist, $regex , $searchopt); + } + $pagelist = $this->sort($pagelist, $opt); + + return $pagelist; + } @@ -66,28 +85,11 @@ class Modelhome extends Modelpage $filter = array_diff($idlist, $filter); } - return $filter; + return array_intersect_key($pagelist, array_flip($filter)); } - /** - * Convert list of id into a list of Page objects - * - * @param array $pagelist - * @param array $idlist - * - * @return array Filtered list of `Page` objects - */ - public function pagelistfilter(array $pagelist, array $fiter) : array - { - return array_intersect_key($pagelist, array_flip($fiter)); - } - - - - - /** * Sort and limit an array of Pages * @@ -160,13 +162,14 @@ class Modelhome extends Modelpage * * @param array $pagelist associative array of pages as `id => Page` * @param string $layout - * @param bool $hideorphans if `true`, remove orphans pages - * + * @param bool $showorphans if `false`, remove orphans pages + * @param bool $showredirection if `true`, add redirections * + * @return array */ - public function cytodata(array $pagelist, string $layout = 'random', bool $hideorphans = false) + public function cytodata(array $pagelist, string $layout = 'random', bool $showorphans = false, bool $showredirection = false) : array { - $datas['elements'] = $this->mapdata($pagelist, $hideorphans); + $datas['elements'] = $this->mapdata($pagelist, $showorphans, $showredirection); $datas['layout'] = [ 'name' => $layout, @@ -175,7 +178,7 @@ class Modelhome extends Modelpage 'randomize' => true, 'nodeDimensionsIncludeLabels' => true, 'tile' => false, - 'edgeElasticity' => 0.75, + 'edgeElasticity' => 0.45, 'gravity' => 0.25, 'idealEdgeLength' => 60, 'numIter' => 10000 @@ -185,6 +188,24 @@ class Modelhome extends Modelpage 'selector' => 'node', 'style' => [ 'label' => 'data(id)', + 'background-image' => 'data(favicon)', + 'background-fit' => 'contain', + 'border-width' => 3, + 'border-color' => '#80b97b' + ], + ], + [ + 'selector' => 'node.not_published', + 'style' => [ + 'shape' => 'round-hexagon', + 'border-color' => '#b97b7b' + ], + ], + [ + 'selector' => 'node.private', + 'style' => [ + 'shape' => 'round-triangle', + 'border-color' => '#b9b67b' ], ], [ @@ -192,6 +213,14 @@ class Modelhome extends Modelpage 'style' => [ 'curve-style' => 'bezier', 'target-arrow-shape' => 'triangle', + 'arrow-scale' => 1.5 + ], + ], + [ + 'selector' => 'edge.redirect', + 'style' => [ + 'line-style' => 'dashed', + 'label' => 'data(refresh)' ], ], ]; @@ -202,15 +231,17 @@ class Modelhome extends Modelpage * Transform list of Pages into cytoscape nodes and edge datas * * @param array $pagelist associative array of pages as `id => Page` - * @param bool $hideorphans if `true`, remove orphans pages - * + * @param bool $showorphans if `false`, remove orphans pages + * @param bool $showredirection if `true`, add redirections + * * @return array of cytoscape datas */ - public function mapdata(array $pagelist, bool $hideorphans = false) : array + public function mapdata(array $pagelist, bool $showorphans = true, bool $showredirection = false) : array { $idlist = array_keys($pagelist); $edges = []; + $notorphans = []; foreach ($pagelist as $page) { foreach ($page->linkto() as $linkto) { if(in_array($linkto, $idlist)) { @@ -220,9 +251,19 @@ class Modelhome extends Modelpage $edge['data']['target'] = $linkto; $edges[] = $edge; $notorphans[] = $linkto; + $notorphans[] = $page->id(); } } - if(!empty($page->linkto())) { + // add redirection edge + if($showredirection && key_exists($page->redirection(), $pagelist)) { + $edger['group'] = 'edges'; + $edger['data']['id'] = $page->id() . '>' . $page->redirection(); + $edger['data']['refresh'] = $page->refresh(); + $edger['data']['source'] = $page->id(); + $edger['data']['target'] = $page->redirection(); + $edger['classes'] = 'redirect'; + $edges[] = $edger; + $notorphans[] = $page->redirection(); $notorphans[] = $page->id(); } } @@ -231,16 +272,11 @@ class Modelhome extends Modelpage $nodes = []; foreach ($pagelist as $id => $page) { - if($hideorphans) { - if(in_array($id, $notorphans)) { - $node['group'] = 'nodes'; - $node['data']['id'] = $page->id(); - $node['classes'] = [$page->secure('string')]; - $nodes[] = $node; - } - } else { + if($showorphans || (!$showorphans && in_array($id, $notorphans))) { $node['group'] = 'nodes'; $node['data']['id'] = $page->id(); + $node['data']['edit'] = $page->id() . DIRECTORY_SEPARATOR . 'edit'; + $node['data']['favicon'] = Model::faviconpath() . $page->favicon(); $node['classes'] = [$page->secure('string')]; $nodes[] = $node; } -- cgit v1.2.3