Skip to content

Commit

Permalink
Initial commmit
Browse files Browse the repository at this point in the history
  • Loading branch information
Sonja Broda committed Mar 2, 2019
0 parents commit 46f8fbb
Show file tree
Hide file tree
Showing 8 changed files with 412 additions and 0 deletions.
20 changes: 20 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# This file is for unifying the coding style for different editors and IDEs
# editorconfig.org

[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true

[*.php]
indent_size = 4

[*.md,*.txt]
trim_trailing_whitespace = false
insert_final_newline = false

[composer.json]
indent_size = 4
8 changes: 8 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# OS files
.DS_Store

# npm modules
/node_modules

# Composer files
/vendor
152 changes: 152 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
![GitHub release](https://img.shields.io/github/release/texnixe/kirby3-similar.svg?maxAge=1800) ![License](https://img.shields.io/github/license/mashape/apistatus.svg) ![Kirby 3 Pluginkit](https://img.shields.io/badge/Pluginkit-YES-cca000.svg)

# Kirby Similar

Kirby 3 Similar is a [Kirby CMS](https://getkirby.com) plugin that lets you find items related to the current item based on similarity between fields. For each given field, the plugin calculates the Jaccard Index and then weighs all indices based on the factor for each field.

Example use case:
The current page has a tags field with three values (red, green, blue). You want to find all sibling pages with a minimum Jaccard Index of 0.3.

## Commercial Usage

This plugin is free but if you use it in a commercial project please consider

- [making a donation](https://www.paypal.me/texnixe/10) or
- [buying a Kirby license using this affiliate link](https://a.paddle.com/v2/click/1129/38380?link=1170)

## How is it different from the Kirby 3 Related plugin

- It allows you to pass multiple fields as an array with a factor for each field, depending on the importance of this field for determining the similarity.
- The similarity is calculated according to the Jaccard Index, rather than by the number of matches as in the Kirby 3 Related plugin.

A quick example that describes the difference:

**Example 1:**

Page A: blue, green
Page B: blue, green

Matches: 2
Jaccard Index: 2/2 = 1

**Example 2:**

Page A: blue, green, yellow
Page B: blue, green

Matches: 2
Jaccard Index: 2/3 = 0.66666

While both pages have the same number of matches, the Jaccard Index is lower in the second example, because the number of unique tags is taken into account as well.


## Installation

### Download

[Download the files](https://github.com/texnixe/kirby3-related/archive/master.zip) and place them inside `site/plugins/kirby-similar`.

### Git Submodule
You can add the plugin as a Git submodule.

$ cd your/project/root
$ git submodule add https://github.com/texnixe/kirby3-similar.git site/plugins/kirby-similar
$ git submodule update --init --recursive
$ git commit -am "Add Kirby Similar plugin"

Run these commands to update the plugin:

$ cd your/project/root
$ git submodule foreach git checkout master
$ git submodule foreach git pull
$ git commit -am "Update submodules"
$ git submodule update --init --recursive


## Usage

### Similar pages
```
<?php
$similarPages = $page->similar($options);
foreach($similarPages as $p) {
echo $p->title();
}
```

### Similar files

```
<?php
$similarImages = $image->similar($options);
foreach($similarImages as $image) {
echo $image->filename();
}
```

### Options

You can pass an array of options:

```
<?php
$similarPages = $page->similar([
'index' => $page->siblings(false)->visible(),
'fields' => 'tags',
'threshold' => 0.2,
'delimiter' => ',',
'languageFilter' => false
]);
?>
```
#### index

The collection to search in.
Default: `$item->siblings()`

#### fields

The name of the field to search in.
Default: tags

You can pass either a single field as string, or an array of fields with a factor that serves as multiplier:

```
fields => ['tags' => 1, 'size' => 1.5, 'category' => 3]
```

You can change the factor to get better results when filtering collections. For example, if the above is your standard field setting, you might want to change it when a filter paramter is set to size:

```
fields => ['tags' => 0.5, 'size' => 2, 'category' => 3]
```

**Note that the factor is required when using multiple fields, even if you want to set the factor to the same value for each field. You can't set a simple array of fields.**

#### delimiter

The delimiter that you use to separate values in a field
Default: ,

#### threshold

The minimum Jaccard Index, i.e. a value between 0 (no similarity) and 1 (full similarity)
Default: 0.1

#### languageFilter

Filter similar items by language in a multi-language installation.
Default: false


## License

Kirby 3 Similar is open-sourced software licensed under the MIT license.

Copyright © 2019 Sonja Broda [email protected] https://sonjabroda.com
21 changes: 21 additions & 0 deletions composer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"name": "texnixe/similar",
"description": "Find similar pages or files based on similarities between fields",
"version": "0.9.0",
"type": "kirby-plugin",
"license": "MIT",
"authors": [
{
"name": "Sonja Broda",
"email": "[email protected]"
}
],
"keywords": [
"kirby3",
"kirby3-cms",
"kirby3-plugin"
],
"require": {
"getkirby/composer-installer": "^1.1"
}
}
18 changes: 18 additions & 0 deletions config/hooks.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php

namespace texnixe\Similar;

return [
'page.update:after' => function() {
Similar::flush();
},
'page.create:after' => function() {
Similar::flush();
},
'file.create:after' => function() {
Similar::flush();
},
'page.update:after' => function() {
Similar::flush();
}
];
43 changes: 43 additions & 0 deletions index.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<?php

namespace texnixe\Similar;
/**
* Kirby 3 Similar Plugin
*
* @version 0.9.0
* @author Sonja Broda <[email protected]>
* @copyright Sonja Broda <[email protected]>
* @link https://github.com/texnixe/kirby3-similar
* @license MIT
*/

load([
'texnixe\\similar\\similar' => 'src/Similar.php'
], __DIR__);

\Kirby::plugin('texnixe/similar', [
'options' => [
'cache' => true,
'expires' => (60*24*7), // minutes
'defaults' => [
'fields' => 'tags',
'threshold' => 0.1,
'delimiter' => ',',
'languageFilter' => false,
]
],
'pageMethods' => [
'similar' => function (array $options = []) {
return Similar::getSimilar($this, $options);
}
],
'fileMethods' => [
'similar' => function (array $options = []) {
return Similar::getSimilar($this, $options);
}
],
'hooks' => require 'config/hooks.php'
]);



12 changes: 12 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"name": "kirby-similar",
"description": "Kirby 3 Similar plugin",
"author": "Sonja Broda <[email protected]>",
"license": "MIT",
"version": "0.9.0",
"repository": {
"type": "git",
"url": "https://github.com/texnixe/kirby3-similar"
},
"type": "kirby-plugin"
}
Loading

0 comments on commit 46f8fbb

Please sign in to comment.