commit
c536c98ae1
7 changed files with 1384 additions and 0 deletions
1215
plugins/qrcode/qr-1.1.3.js
Normal file
1215
plugins/qrcode/qr-1.1.3.js
Normal file
File diff suppressed because it is too large
Load diff
BIN
plugins/qrcode/qr-1.1.3.min.js
vendored
Normal file
BIN
plugins/qrcode/qr-1.1.3.min.js
vendored
Normal file
Binary file not shown.
5
plugins/qrcode/qrcode.html
Normal file
5
plugins/qrcode/qrcode.html
Normal file
|
@ -0,0 +1,5 @@
|
|||
<div class="linkqrcode">
|
||||
<a href="http://qrfree.kaywa.com/?l=1&s=8&d=%s" onclick="showQrCode(this); return false;" class="qrcode" data-permalink="%s">
|
||||
<img src="%s/qrcode/qrcode.png" width="13" height="13" title="QR-Code">
|
||||
</a>
|
||||
</div>
|
41
plugins/qrcode/qrcode.php
Normal file
41
plugins/qrcode/qrcode.php
Normal file
|
@ -0,0 +1,41 @@
|
|||
<?php
|
||||
/**
|
||||
* Plugin qrcode
|
||||
* Add QRCode containing URL for each links.
|
||||
* Display a QRCode icon in link list.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Add qrcode icon to link_plugin when rendering linklist.
|
||||
*
|
||||
* @param array $data - linklist data.
|
||||
*
|
||||
* @return mixed - linklist data with qrcode plugin.
|
||||
*/
|
||||
function hook_qrcode_render_linklist($data)
|
||||
{
|
||||
$qrcode_html = file_get_contents(PluginManager::$PLUGINS_PATH . '/qrcode/qrcode.html');
|
||||
|
||||
foreach ($data['links'] as &$value) {
|
||||
$qrcode = sprintf($qrcode_html, $value['url'], $value['url'], PluginManager::$PLUGINS_PATH);
|
||||
$value['link_plugin'][] = $qrcode;
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* When linklist is displayed, include qrcode JS files.
|
||||
*
|
||||
* @param array $data - footer data.
|
||||
*
|
||||
* @return mixed - footer data with qrcode JS files added.
|
||||
*/
|
||||
function hook_qrcode_render_footer($data)
|
||||
{
|
||||
if ($data['_PAGE_'] == Router::$PAGE_LINKLIST) {
|
||||
$data['js_files'][] = PluginManager::$PLUGINS_PATH . '/qrcode/shaarli-qrcode.js';
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
BIN
plugins/qrcode/qrcode.png
Normal file
BIN
plugins/qrcode/qrcode.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 321 B |
56
plugins/qrcode/shaarli-qrcode.js
Normal file
56
plugins/qrcode/shaarli-qrcode.js
Normal file
|
@ -0,0 +1,56 @@
|
|||
// Show the QR-Code of a permalink (when the QR-Code icon is clicked).
|
||||
function showQrCode(caller,loading)
|
||||
{
|
||||
// Dynamic javascript lib loading: We only load qr.js if the QR code icon is clicked:
|
||||
if (typeof(qr) == 'undefined') // Load qr.js only if not present.
|
||||
{
|
||||
if (!loading) // If javascript lib is still loading, do not append script to body.
|
||||
{
|
||||
var element = document.createElement("script");
|
||||
element.src = "plugins/qrcode/qr-1.1.3.min.js";
|
||||
document.body.appendChild(element);
|
||||
}
|
||||
setTimeout(function() { showQrCode(caller,true);}, 200); // Retry in 200 milliseconds.
|
||||
return false;
|
||||
}
|
||||
|
||||
// Remove previous qrcode if present.
|
||||
removeQrcode();
|
||||
|
||||
// Build the div which contains the QR-Code:
|
||||
var element = document.createElement('div');
|
||||
element.id="permalinkQrcode";
|
||||
|
||||
// Make QR-Code div commit sepuku when clicked:
|
||||
if ( element.attachEvent ){
|
||||
element.attachEvent('onclick', 'this.parentNode.removeChild(this);' );
|
||||
|
||||
} else {
|
||||
// Damn IE
|
||||
element.setAttribute('onclick', 'this.parentNode.removeChild(this);' );
|
||||
}
|
||||
|
||||
// Build the QR-Code:
|
||||
var image = qr.image({size: 8,value: caller.dataset.permalink});
|
||||
if (image)
|
||||
{
|
||||
element.appendChild(image);
|
||||
element.innerHTML += "<br>Click to close";
|
||||
caller.parentNode.appendChild(element);
|
||||
}
|
||||
else
|
||||
{
|
||||
element.innerHTML = "Your browser does not seem to be HTML5 compatible.";
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// Remove any displayed QR-Code
|
||||
function removeQrcode()
|
||||
{
|
||||
var elem = document.getElementById("permalinkQrcode");
|
||||
if (elem) {
|
||||
elem.parentNode.removeChild(elem);
|
||||
}
|
||||
return false;
|
||||
}
|
67
tests/plugins/PlugQrcodeTest.php
Normal file
67
tests/plugins/PlugQrcodeTest.php
Normal file
|
@ -0,0 +1,67 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* PlugQrcodeTest.php
|
||||
*/
|
||||
|
||||
require_once 'plugins/qrcode/qrcode.php';
|
||||
require_once 'application/Router.php';
|
||||
|
||||
/**
|
||||
* Class PlugQrcodeTest
|
||||
* Unit test for the QR-Code plugin
|
||||
*/
|
||||
class PlugQrcodeTest extends PHPUnit_Framework_TestCase
|
||||
{
|
||||
/**
|
||||
* Reset plugin path
|
||||
*/
|
||||
function setUp() {
|
||||
PluginManager::$PLUGINS_PATH = 'plugins';
|
||||
}
|
||||
|
||||
/**
|
||||
* Test render_linklist hook.
|
||||
*/
|
||||
function testQrcodeLinklist()
|
||||
{
|
||||
$str = 'http://randomstr.com/test';
|
||||
$data = array(
|
||||
'title' => $str,
|
||||
'links' => array(
|
||||
array(
|
||||
'url' => $str,
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
$data = hook_qrcode_render_linklist($data);
|
||||
$link = $data['links'][0];
|
||||
// data shouldn't be altered
|
||||
$this->assertEquals($str, $data['title']);
|
||||
$this->assertEquals($str, $link['url']);
|
||||
|
||||
// plugin data
|
||||
$this->assertEquals(1, count($link['link_plugin']));
|
||||
$this->assertNotFalse(strpos($link['link_plugin'][0], $str));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test render_footer hook.
|
||||
*/
|
||||
function testQrcodeFooter()
|
||||
{
|
||||
$str = 'stuff';
|
||||
$data = array($str => $str);
|
||||
$data['_PAGE_'] = Router::$PAGE_LINKLIST;
|
||||
|
||||
$data = hook_qrcode_render_footer($data);
|
||||
$this->assertEquals($str, $data[$str]);
|
||||
$this->assertEquals(1, count($data['js_files']));
|
||||
|
||||
$data = array($str => $str);
|
||||
$data['_PAGE_'] = $str;
|
||||
$this->assertEquals($str, $data[$str]);
|
||||
$this->assertArrayNotHasKey('js_files', $data);
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue