yab_review_rating - A comment based rating system for Textpattern

This is (star) rating plugin for Textpattern. It’s a useful partner for yab_shop. It extends the comment system with a rating scala, so it can be used as reviews for products.

Download compiled and source: yab_review_rating_v0.6
Demo: yab_shop demo

yab_review_rating

A comment based rating system for articles.

Version: 0.6

Table of contents

  1. Plugin requirements
  2. Configuration
  3. Tags
  4. Examples
  5. Changelog
  6. License
  7. Author contact

Plugin requirements

yab_review_rating’s minimum requirements:

  • Textpattern 4.x

Configuration

Open the plugin code. the first function contains the configuration values. There is a min and a max values for the rating. Valid values are 0-255.

Tags

yab_review_rating

Place this in your comment form. It will show the rating of the current comment.
Can be used elsewhere. If not used in comment context as comments_form or recent_comments you have to fill the id attribute.

id: integer (comment id)
Default: no set
Show the rating of a comment with this ID. Useful in a non comment context.

char: a valid string
Default: no set
If empty (default) the output will be the rating number. If a char (e.g. a asterisk *) is set the output will be the n-times repeated char, where n is the rating.

yab_review_rating_input

The form element for the rating. Should be placed in the comment_form form.

type: input type (text, select, radio, number, range)
Default: text
The type of the form element for the rating. Valid value are text, select, radio, number and range.

html_id: HTML id name
Default: not set
The HTML id attribute applied to the element.

class: HTML class name
Default: not set
The HTML/CSS class attribute applied to the element.

reverse: integer|string (a non-null value)
Default: 0
If reverse is given the output of the select or radio type is displayed in reverse order.

break: breakpoint (br, empty)
Default: ‚br‘
Breakpoints für radio intputs. Can be empty or br.

default: integer
Default: not set
Preselected rating value (Could be any number between your min and max values).

yab_review_rating_average

Display the average rating for a given article.

id: integer (article id)
Default: no set
The ID of an article. If not set it must be placed in an article form (article context).

only_visible: integer|bool (1|0)
Default: 1
If set to 0 all comments (spam and moderated comments too) will be calculated.

exclude: string (a comma separated list of ratings)
Default: null
Exclude these ratings from the average rating calculation. So you can exclude ‚0‘ values for not rated articles, due 0 is the default value. Depending on your rating system setting.

default: string (Text)
Default: ‚not yet rated‘
The default text on articles without a rating.

decimals: integer
Default: 1
Define the decimal precision of the calculation and the output.

separator: string (string|empty)
Default: . (perdiod)
Choose your decimal separator. Can be empty (separator will be omitted) for HTML class friendly output.

round_to_half: string (up|down|)
Default: no net
Round to first half integer up or down or not at all. If not set the last decimal is automatically rounded up.

Examples

Example 1

Example of yab_review_rating_input in a comment_form form.

<txp:comments_error wraptag="ul" break="li" />
	<div class="message">
		<p><label for="name">Name:</label><br /><txp:comment_name_input /></p>
		<p><label for="email">Mail (not required, not visible):</label><br />
			<txp:comment_email_input /></p>
		<p><label for="yab-rr-rating">Rating</label><br />
			<txp:yab_review_rating_input html_id="yab-rr-rating" type="select" default="3" /></p>
		<p><label for="message">Review:</label><br />
			<txp:comment_message_input /></p>
		<p class="submit"><txp:comments_help /><txp:comment_preview /><txp:comment_submit /></p>
</div>

Will produce a comment form for article reviews (e.g. with yab_shop) select dropdown menu and the preselected rating value 3.

Example 2

Example of yab_review_rating in a comments form.

<h3 class="commenthead"><txp:comment_permlink>#</txp:comment_permlink> - <txp:comment_name /> wrote at <txp:comment_time />:</h3>
<span class="rating">Rating: <txp:yab_review_rating char="*" /></span>
<txp:comment_message />

Will produce a comment/review with the name, text and time of the comment and the rating with asterisks *.

Example 3

Example of yab_review_rating in a comments form.

<h3 class="commenthead"><txp:comment_permlink>#</txp:comment_permlink> - <txp:comment_name /> wrote at <txp:comment_time />:</h3>
<span class="rating rating-value-<txp:yab_review_rating />">Rating:</span>
<txp:comment_message />

Will produce a the a comment/review with the name, text and time of the comment and the rating as HTML/CSS class.

Example 4

Example yab_review_rating_average.

<txp:yab_review_rating_average id="12" exclude="0" decimals="2" separator="" round_to_half="down" />

Say the article with the ID 12 do have 3 reviews: One with a rating of 0 and two with a rating of 4 each. The output will exclude the 0 from the calculation. So only the two 4-ratings will be used 4+4 = 8÷2 = 4. Average rating is 4. But we have decimals precision of 2, so it will be 4.00. No rounding required but the separator will be ommitted: 400 will be displayed.
exclude=„0“ decimals=„2“ separator=“„ round_to_half=„down“ />

<txp:yab_review_rating_average id="12" decimals="2" separator="" round_to_half="down" />

Here we calculate an average from all reviews/ratings. Like above we have two 4 and 0-rating. So the rating is 0+4+4 = 8÷3 = 2.6666666667. Now we round to half down: 2.500000000 and use the decimal precision of 2: 2.50 and ommit the separator: 250.

Changelog

  • v0.1: 2013-12-24
    • initial release
  • v0.2: 2014-01-08
    • new: added a the tag <txp:yab_review_rating_average />
  • v0.3: 2014-01-12
    • new: added the id attribute to <txp:yab_review_rating />
    • modify: <txp:yab_review_rating /> can now be used in <txp:recent_comments />
  • v0.4: 2014-01-16
    • new: added reverse attribute to <txp:yab_review_rating_input />
    • new: added only_visible attribute to <txp:yab_review_rating_average />
    • modify: id attribute of <txp:yab_review_rating_average /> can now contain list of article ids
  • v0.5: 2017-02-10
    • TXP 4.6-ready
  • v0.6: 2017-03-09
    • bugfix: handle comment UI correctly, prevent rating resets to 0 if comment status is changed

Licence

This plugin is released under the GNU General Public License Version 2 and above

Author contact

Diceware Passwörter mit der Shell generieren

Ich hab mir ein kleines Shellskript geschrieben, dass mir sichere Diceware-Passwörter generiert. Wer nicht weiß, was Diceware ist und warum die relativ sicher sind, dem seien folgende Links ans Herz gelegt:

Das ist natürlich ein typischer Fall von NIH, weil es für die Bash/Shell oder auch online wahrscheinlich hundert andere und gut funktionierende Tools dafür gibt, aber selber programmieren und grübeln macht einfach deutlich mehr Spaß.

Die Benutzung ist relativ einfach:

$ ./roll_password.sh

gibt ein Passwort mit fünf Wörtern (english) aus. Folgende Argumente können mit übergeben werden:

  • -c bestimmt die Anzahl der Wörter, die das Passwort haben soll (standard: 5)
  • -l die minimale Zeichenanzahl des gesamten Passwortes (standard: 14)
  • -w Wortlistendatei aus denen sich das Passwort generieren soll (standard diceware_wordlist_en)

Für Schlüssel-Signierungen und Kryptographie würde ich die generierten Passwörter nicht benutzen, dafür ist die $RANDOM-Umgebungsvariable nicht zufällig genug, aber als Passwörter für typische Online-Dienste sind sie sehr gut geeignet.

Das Skript kann man hier herunterladen. Im Download enthalden sind das Shellskript, die englische und die deutsche Diceware-Wortlistendatei.

roll_password.tar.gz

Und hier noch ein bisschen Skript, für die, die nur daran interessiert sein sollten.

#!/bin/bash
#
# Name: roll_password.sh
# Description: This script rolls a random passphrase based of a wordlist (Diceware).
# Author: Tommy Schmucker
# Created: 2012-06-08
# Modified: 2012-09-25
# Version: 0.2
#

usage()
{
	cat << EOF

This script rolls a random pass phrase based of a wordlist (Diceware).

usage: $0 [-h] [-c number] [-l number] [-w file]

-h Show this message
-c Count of words in the pass phrase
-l Minimun length of the pass phrase
-w Wordlist file

EOF
}

count=5
wordlist=diceware_wordlist_en
min_length=14
phrase=

while getopts "hc:l:w:" option; do
	case $option in
		h)
			usage
			exit 1
			;;
		c)
			count="$OPTARG"
			;;
		l)
			min_length="$OPTARG"
			;;
		w)
			wordlist="$OPTARG"
			;;
		?)
			usage
			exit
			;;
	esac
done

[ -e "$wordlist" ] || { echo "$wordlist does not exists, exiting"; exit 1; }

roll_number()
{
	number=
	for i in `seq 5`; do
		roll=`expr $RANDOM % 6`
		digit[i]=`expr $roll + 1`
		number=$number${digit[i]}
	done
}

get_word()
{
	word=
	roll_number
	word=`cat $wordlist | grep $number | awk '{print $2}'`
}

get_phrase()
{
	for j in `seq $count`; do
		get_word
		if [ $j == 1 ]; then
			phrase="$word"
		else
			phrase="$phrase $word"
		fi
	done
}

get_phrase
length=`echo -e "$phrase\c" | wc -m`

if [ $length -lt $min_length ]; then
	echo $'\n'"Phrase \"$phrase\" is too short ($length chars)."$'\n'"You should run the command again!"$'\n'
else
	echo $'\n'"$phrase"$'\n'
fi

JavaScript-Funktion mit Objekt als Argument

Mann kennst es ja aus verschiedenen jQuery-Plugins. Argumente werden als Objekt in entsprechender Notation an eine Funktion übergeben und überschreiben dabei Default-Werte. Das ist schick und hat einige Vorteile:

  • jedes Argument bekommt einen Namen und ist damit selbsterklärend
  • die Reihenfolge ist dabei vollkommen egal genauso wie, das Auslassen von Argumenten
  • sieht schick aus und ist einfach zu pflegen

Wie macht man das nun für eigene framework-unabhängige Funktionen. Ungefähr so:

var welcome = function(options) {
	// default settings
	var defaults = {
		'name'     : 'World',
		'greeting' : 'Hello'
	};
	// set options
	var o = {};
	if (typeof options !== 'undefined') {
		o = options;
	}
	for (var i in defaults) {
		if (typeof o[i] === 'undefined') {
			o[i] = defaults[i];
		}
	}
	// your function logic
	var text = o.greeting + ', ' + o.name + '!';
	console.log(text);
}

welcome({'name': 'Tommy'}); // Hello, Tommy!

welcome({
	'name': 'Tommy',
	'greeting': 'Hi'
} // Hi, Tommy! 

Ich führe hier noch eine zusätzliche Variable o ein und kopiere das options-Objekt hinein. Das braucht es normalerweise nicht. Ich finde es nur schick, wenn man sieht, was in der Funktion namentlich übergeben wird (nämlich Optionen options) und im Nachhinein kürze ich das nur zu o ab. So muss ich nicht jedes mal options ausschreiben.

Der Internet Explorer und die indexOf()-Methode

Die Methode indexOf() für das Array-Objekt ist erst seit Ende 2009 standardisiert. Bis dahin war die Methode auch noch nicht im Internet Explorer (hier IE 8) implementiert; in fast allen anderen Browsern schon. Die Methode kann man jedoch nachträglich selbst in sein Script einfügen um, die Funktionalität auch für den Internet Explorer <= 8 zu gewährleisten.

if (!Array.prototype.indexOf) {
	Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) {
		"use strict";
		if (this == null) {
			throw new TypeError();
		}
		var t = Object(this);
		var len = t.length >>> 0;
		if (len === 0) {
			return -1;
		}
		var n = 0;
		if (arguments.length > 0) {
			n = Number(arguments[1]);
			if (n != n) { // shortcut for verifying if it's NaN
				n = 0;
			} else if (n != 0 && n != Infinity && n != -Infinity) {
				n = (n > 0 || -1) * Math.floor(Math.abs(n));
			}
		}
		if (n >= len) {
			return -1;
		}
		var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);
		for (; k < len; k++) {
			if (k in t && t[k] === searchElement) {
				return k;
			}
		}
	return -1;
	}
}

(via)

Quick & Dirty: Shellscript »batchzip«

Für den täglichen Bedarf an wiederholenden Aufgaben schreibt man sich ja oft kleine Shellscripte. Hier hab ich ein eines, welches Dateien gleichen Namens aber unterschiedlicher Dateiendung zusammen in ein Zipfile packt.

Kann man unter anderem gut gebrauchen, wenn man Projektdateien hat. die ja oft projekt.txt, projekt.docx, projekt.psd, projekt.pdf etc. heißen.

Das Script sollte auf jedem System mit Standard-Shell und zip und rm funktionieren.

Herunterladen kann man sich das auch hier: batchzip

#!/bin/sh
#
# Name: batchzip
# Description: This script zips files with same basename (ignoring the extension).
# Author: Tommy Schmucker
# Created: 2012-05-13
# Modified: 2012-05-16
# Version: 0.3
#

usage()
{
	cat << EOF

This script zips files with same basename (ignoring the extension).

usage: $0 [-h] [-r] [-d directory]

-h Show this message
-d Input directory
-r Remove original files
EOF
}

dir=`pwd`
rm_orig=0
me=`basename $0`

zip=/usr/bin/zip
rm=/bin/rm

[ -x $zip ] || { echo "No such executable: $zip"; exit 1; }
[ -x $rm ] || { echo "No such executable: $rm"; exit 1; }

while getopts "hrd:" option; do
	case $option in
		h)
			usage
			exit 1
			;;
		r)
			rm_orig=1
			;;
		d)
			dir="$OPTARG"
			;;
		?)
			usage
			exit
			;;
	esac
done

[ -d "$dir" ] || { echo "$in_dir is not a directory, exiting"; exit 1; }
dir="${dir%/}"

for this_file in "$dir"/*; do
	basename=$(basename "$this_file")
	name=${basename%.*}
	if [ ! -h "$this_file" ] && [ "$basename" != "$me" ]; then
		$zip -j "$dir"/"$name".zip $this_file
		if [ "$rm_orig" == 1 ]; then
			$rm "$this_file"; echo "$basename removed."
		fi
	fi
done

Mit JavaScript prüfen, ob ein CSS media query ausgeführt wurde

CSS:

@media (min-width: 45em) {
	body:after {
		content: 'widescreen';
		display: none;
	}
}

JavaScript:

var size = window.getComputedStyle(document.body,':after').getPropertyValue('content');
if (size == 'widescreen') {
	// go nuts
}

(via: bricss.net)

Die genialsten Lösungen sind immer die einfachen. Auf die kommt man aber nie selbst.

Edit: Funktioniert wohl derzeit nur im Chrome/Chromium (Version 18 und 19 getestet). Siehe auch Kommentare.

Workaround Firefox/Iceweasel fontface issue

Due a very restrictiv »file uri origin«-policy Firefox/Iceweasel won’t load custom fonts.
Try to set a specific header for each font file (TTF, OTF, EOT) in your .htaccess:

<FilesMatch "\.(ttf|otf|eot)$">
    <IfModule mod_headers.c>
        Header set Access-Control-Allow-Origin "*"
    </IfModule>
</FilesMatch>

(via)

neuere Einträge | ältere Einträge