changed git call from https to git readonly
[atutor.git] / mods / wiki / plugins / linking / plural.php
1 <?php
2
3 /*
4    This plugin makes virtual page aliases from and to plural and non-plural
5    page names. Then "WikiWord" and "WikiWords" link to the same page.
6
7    (Best practice, btw, is to always give page names only in singular.)
8 */
9
10 #-- config
11 $ewiki_config["plural"] = array("s", "en", "n");
12 # (one may want to add "e" and others)
13
14 #-- plugin registration
15 $ewiki_plugins["format_prepare_linking"][] = "ewiki_plural_linking_patch";
16 $ewiki_plugins["handler"][] = "ewiki_handler_plural";
17
18
19 /*  this function tries to cross-convert from singular to plural, and
20     returns possible permutations as array() result;
21     you will wish to rewrite this function for better results
22 */
23 function ewiki_plural_variants($id) {
24
25    global $ewiki_config;
26
27    #-- built base id
28    $n_id = strlen($id);
29    $base_id = $id;
30    foreach ($ewiki_config["plural"] as $app) {
31       if (substr($id, $n_id - strlen($app)) == $app) {
32          $base_id = substr($id, 0, $n_id - strlen($app));
33          break;
34       }
35    }
36
37    #-- make array of variants
38    $r = array($id);
39    if ($id != $base_id) {
40       $r[] = $base_id;
41    }
42    foreach ($ewiki_config["plural"] as $app) {
43       $r[] = $id.$app;
44       if ($id != $base_id) {
45          $r[] = $base_id.$app;
46       }
47    }
48    
49    return($r);
50 }
51
52
53 /*  returns the first (plural/singular permutation) alternative for $id
54     found in the database
55 */
56 function ewiki_plural_alternative($id) {
57    #-- make possible plural/singular $id versions
58    $variants = ewiki_plural_variants($id);
59    array_shift($variants);   # skip original
60
61    #-- search in DB
62    $variants = ewiki_db::FIND($variants);
63    foreach ($variants as $new_id=>$exists) {
64
65       if ($new_id && $exists) {
66          return($new_id);
67       }
68    }
69
70    #-- none found
71    return(false);
72 }
73
74
75 /*  searches for and loads another page, if requested $id not found
76 */
77 function ewiki_handler_plural(&$id, &$data, &$action) {
78
79    #-- current page not found, but an alternative exists in DB
80    if (!$data["version"] && ($new_id = ewiki_plural_alternative($id))) {
81
82       #-- restart ewiki
83       return(ewiki_page($id = $new_id));
84    }
85 }
86
87
88 /*  fakes existing pages by creating ["page"] plugin entries
89 */
90 function ewiki_plural_linking_patch(&$src) {
91
92    global $ewiki_links, $ewiki_plugins;
93
94
95    #-- search for not-found entries
96    foreach ($ewiki_links as $missing_id=>$exists) {
97
98       if (!$exists && ewiki_plural_alternative($missing_id)) {
99          $ewiki_plugins["page"][$missing_id] = "ewiki_page";
100       }
101
102    }
103 }
104
105
106 ?>