Adding custom commands to SCEditor

For instructions on setting up SCEditor, see here. Custom command support requires SCEditor version 1.2.4+.

Adding Custom Command

SCEditor has a function called setCommand which updates a command if it already exists or adds it if it doesn’t. setCommand must be called before the editor is initialised otherwise the command may not show in the editors toolbar.

setCommand parameters:
Name (string): The name of the command, should be lower-case and not contain any spaces.
Exec (string or function): Should be a function which will be called when the command is clicked or a string which will be passed to the browsers built-in execCommand function.
Tooltip (string): The commands tooltip text
Keypress: Unless the command needs to handle keypress events, omit this parameter. For an example of keypress handler see the emoticon command.

Continue reading

SBBCodeParser – PHP BBCode parser class

SBBCodeParser is a simple PHP BBCode parser class which makes it easy to add your own BBCodes.

SBBCodeParser is licensed under the LGPL and the source code is available on GitHub.

Example usage:

$parser = new SBBCodeParser_Document();
$parser->add_emoticons(array(
	':)' => 'http://localhost/Classes/SCEditor-punbb/punbb-1.3.5/img/smilies/smile.png',
	'=)' => 'http://localhost/Classes/SCEditor-punbb/punbb-1.3.5/img/smilies/smile.png'
));
echo $parser->parse('This should be [b]bold[/b] and this should be [i]italic[/i]')
	->detect_links()
	->detect_emails()
	->detect_emoticons()
	->get_html();

Example of adding a custom BBCode:

$bbcode = new SBBCodeParser_BBCode('youtube', function($content, $attribs)
{
    if(substr($content, 0, 23) === 'http://www.youtube.com/')
        $uri = $content;
    else
        $uri = 'http://www.youtube.com/v/' . $content;
    return '<iframe width="480" height="390" src="' . $uri . '" frameborder="0"></iframe>';
}, SBBCodeParser_BBCode::BLOCK_TAG, false, array(), array('text_node'), SBBCodeParser_BBCode::AUTO_DETECT_EXCLUDE_ALL);
$parser->add_bbcode($bbcode);

Continue reading

SCEditor – A WYSIWYG HTML & BBCode editor

SCEditor is a lightweight jQuery based WYSIWYG HTML and BBCode editor.

The aim of SCEditor is to be lightweight while still having all the features that would ever be wanted and being a good BBCode WYSIWYG editor. A demo is available here.

Features

  • Bold, underline, italic, superscript and subscript
  • Left, center, right and justify text
  • Text size, color and font
  • As You Type emoticon conversion
  • Tables
  • Lists
  • Code and quote tags
  • Images and links
  • I18n support

Continue reading

Akismet CodeIgniter Library

Very simple PHP library for CodeIgniter which lets you use Akismet to check messages for spam.

Example code:

<?php
$this->load->library('Akismet');
if($this->akismet->is_key_valid(array('key' => 'API-KEY-HERE')))
	$this->akismet->set_key('API-KEY-HERE');
// the comment to check, see is_spam for full list
$comment = array(
		'comment_author'       => 'Auther',
		'comment_author_email' => 'nobody@example.com',
		'comment_author_url'   => 'http://www.example.com/',
		'comment_content'      => 'This is an example comment.'
	);
// check the comment
if($this->akismet->is_spam($comment))
	echo 'The comment is spam.';
// mark it as spam
$this->akismet->mark_spam($comment);
// mark it as ham
$this->akismet->mark_ham($comment);
?>

Continue reading

PHP IPv6 to 128bit int

Two functions to convert IPv6 & IPv4 addresses into 128bit ints and back again. They will use BCMath if installed otherwise will use the pure PHP Math_BigInteger class (included in the ZIP).

/**
 * Converts human readable representation to a 128bit int
 * which can be stored in MySQL using DECIMAL(39,0).
 *
 * Requires PHP to be compiled with IPv6 support.
 * This could be made to work without IPv6 support but
 * I don't think there would be much use for it if PHP
 * doesn't support IPv6.
 *
 * @param string $ip IPv4 or IPv6 address to convert
 * @return string 128bit string that can be used with DECIMNAL(39,0) or false
 */
if(!function_exists('inet_ptoi'))
{
	function inet_ptoi($ip)
	{
		// make sure it is an ip
		if (filter_var($ip, FILTER_VALIDATE_IP) === false)
			return false;
		$parts = unpack('N*', inet_pton($ip));
		// fix IPv4
		if (strpos($ip, '.') !== false)
			$parts = array(1=>0, 2=>0, 3=>0, 4=>$parts[1]);
		foreach ($parts as &$part)
		{
			// convert any unsigned ints to signed from unpack.
			// this should be OK as it will be a PHP float not an int
			if ($part < 0)
				$part += 4294967296;
		}
		// use BCMath if the extension exists
		if (function_exists('bcadd'))
		{
			$decimal = $parts[4];
			$decimal = bcadd($decimal, bcmul($parts[3], '4294967296'));
			$decimal = bcadd($decimal, bcmul($parts[2], '18446744073709551616'));
			$decimal = bcadd($decimal, bcmul($parts[1], '79228162514264337593543950336'));
		}
		// otherwise use the pure PHP BigInteger
		else
		{
			$decimal = new Math_BigInteger($parts[4]);
			$part3   = new Math_BigInteger($parts[3]);
			$part2   = new Math_BigInteger($parts[2]);
			$part1   = new Math_BigInteger($parts[1]);
			$decimal = $decimal->add($part3->multiply(new Math_BigInteger('4294967296')));
			$decimal = $decimal->add($part2->multiply(new Math_BigInteger('18446744073709551616')));
			$decimal = $decimal->add($part1->multiply(new Math_BigInteger('79228162514264337593543950336')));
			$decimal = $decimal->toString();
		}
		return $decimal;
	}
}
/**
 * Converts a 128bit int to a human readable representation.
 *
 * Requires PHP to be compiled with IPv6 support.
 * This could be made to work without IPv6 support but
 * I don't think there would be much use for it if PHP
 * doesn't support IPv6.
 *
 * @param string $decimal 128bit int
 * @return string IPv4 or IPv6
 */
if(!function_exists('inet_ptoi'))
{
	function inet_itop($decimal)
	{
		$parts = array();
		// use BCMath if the extension exists
		if (function_exists('bcadd'))
		{
			$parts[1] = bcdiv($decimal, '79228162514264337593543950336', 0);
			$decimal  = bcsub($decimal, bcmul($parts[1], '79228162514264337593543950336'));
			$parts[2] = bcdiv($decimal, '18446744073709551616', 0);
			$decimal  = bcsub($decimal, bcmul($parts[2], '18446744073709551616'));
			$parts[3] = bcdiv($decimal, '4294967296', 0);
			$decimal  = bcsub($decimal, bcmul($parts[3], '4294967296'));
			$parts[4] = $decimal;
		}
		// otherwise use the pure PHP BigInteger
		else
		{
			$decimal = new Math_BigInteger($decimal);
			list($parts[1],) = $decimal->divide(new Math_BigInteger('79228162514264337593543950336'));
			$decimal = $decimal->subtract($parts[1]->multiply(new Math_BigInteger('79228162514264337593543950336')));
			list($parts[2],) = $decimal->divide(new Math_BigInteger('18446744073709551616'));
			$decimal = $decimal->subtract($parts[2]->multiply(new Math_BigInteger('18446744073709551616')));
			list($parts[3],) = $decimal->divide(new Math_BigInteger('4294967296'));
			$decimal = $decimal->subtract($parts[3]->multiply(new Math_BigInteger('4294967296')));
			$parts[4] = $decimal;
			$parts[1] = $parts[1]->toString();
			$parts[2] = $parts[2]->toString();
			$parts[3] = $parts[3]->toString();
			$parts[4] = $parts[4]->toString();
		}
		foreach ($parts as &$part)
		{
			// convert any signed ints to unsigned for pack
			// this should be fine as it will be treated as a float
			if ($part > 2147483647)
				$part -= 4294967296;
		}
		$ip = inet_ntop(pack('N4', $parts[1], $parts[2], $parts[3], $parts[4]));
		// fix IPv4 by removing :: from the beginning
		if (strpos($ip, '.') !== false)
			return substr($ip, 2);
		return $ip;
	}
}

Continue reading