1<?php 2// (c) Copyright by authors of the Tiki Wiki CMS Groupware Project 3// 4// All Rights Reserved. See copyright.txt for details and a complete list of authors. 5// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details. 6// $Id$ 7 8require_once 'lib/diff.php'; 9 10class QuantifyLib extends TikiLib 11{ 12 13 function recordChangeSize($pageId, $version, $oldData, $newData) 14 { 15 global $prefs; 16 17 if ($prefs['quantify_changes'] != 'y' || $prefs['feature_multilingual'] != 'y') { 18 return; 19 } 20 21 list($added, $removed, $complete) = $this->calculateChangeSize($oldData, $newData); 22 23 $this->query( 24 'INSERT INTO tiki_pages_changes' . 25 ' (page_id, version, segments_added, segments_removed, segments_total)' . 26 ' VALUES(?,?,?,?,?)' . 27 ' ON DUPLICATE KEY update segments_added = ?, segments_removed = ?, segments_total = ?', 28 [ $pageId, $version, $added, $removed, $complete, $added, $removed, $complete ] 29 ); 30 } 31 32 function calculateChangeSize($oldData, $newData) 33 { 34 $oldData = $this->segmentData($oldData); 35 $newData = $this->segmentData($newData); 36 37 $engine = new _WikiDiffEngine($oldData, $newData); 38 39 $added = 0; 40 $removed = 0; 41 42 foreach ($engine->edits as $key => $modif) { 43 if (is_array($modif)) { 44 $added += count($modif); 45 } elseif (is_int($modif) && $modif < 0) { 46 $removed -= $modif; 47 } 48 } 49 50 return [ $added, $removed, count($newData) ]; 51 } 52 53 function segmentData($data) 54 { 55 $data = preg_replace('/\.\s/', "\n", $data); 56 $segments = explode("\n", $data); 57 $segments = array_map('trim', $segments); 58 59 $final = []; 60 foreach ($segments as $seg) { 61 if (! empty($seg)) { 62 $final[] = $seg; 63 } 64 } 65 66 return $final; 67 } 68 69 function getCompleteness($pageId) 70 { 71 $value = $this->getOne( 72 "SELECT" . 73 " tpc.segments_total / ( tpc.segments_total + IFNULL(SUM(valid.segments_added), 0) + IFNULL(SUM(valid.segments_removed),0)/10 )" . 74 " FROM" . 75 " tiki_pages tp" . 76 " INNER JOIN tiki_pages_changes tpc ON tp.page_id = tpc.page_id AND tp.version = tpc.version" . 77 " INNER JOIN tiki_translated_objects a ON a.objId = tpc.page_id AND a.type = 'wiki page'" . 78 " INNER JOIN tiki_translated_objects b ON b.traId = a.traId AND b.type = 'wiki page' AND b.objId <> a.objId" . 79 " LEFT JOIN (" . 80 " SELECT DISTINCT" . 81 " b1.page_id, b1.version, segments_added, segments_removed" . 82 " FROM" . 83 " tiki_pages_changes tpc2" . 84 " INNER JOIN tiki_pages_translation_bits b1 ON tpc2.page_id = b1.page_id AND tpc2.version = b1.version" . 85 " LEFT JOIN tiki_pages_translation_bits b2 ON b1.translation_bit_id = IFNULL(b2.original_translation_bit, b2.translation_bit_id) AND b2.page_id = ?" . 86 " WHERE" . 87 " b1.original_translation_bit IS NULL" . 88 " AND b2.translation_bit_id IS NULL" . 89 " ) valid ON b.objId = valid.page_id" . 90 " WHERE" . 91 " tpc.page_id = ?" . 92 " GROUP BY tpc.page_id, tpc.segments_total, tpc.version", 93 [ $pageId, $pageId ] 94 ); 95 96 return floor($value * 100); 97 } 98 99 function wiki_update($arguments) 100 { 101 $tikilib = TikiLib::lib('tiki'); 102 $this->recordChangeSize($arguments['page_id'], $arguments['version'], $arguments['old_data'], $arguments['data']); 103 } 104} 105