Rabu, 28 Maret 2012

Tip: Membuat Halaman Muka Blog Tersendiri (Tanpa Posting)

Tip: Membuat Halaman Muka Blog Tersendiri, Tanpa Posting

Sebuah impian mungkin, bagi kalian untuk memiliki halaman muka blog tersendiri yang terbebas dari daftar posting yang telah diterbitkan. Dulu Saya juga begitu, sampai Saya mempelajari tag kondisional Blogger lebih jauh. Kali ini Saya akan membagikannya kepada kalian tentang bagaimana cara menghilangkan semua posting dan menambahkan pesan selamat datang di halaman muka. Yang kita butuhkan pada dasarnya hanya satu jenis tag kondisional, yaitu tag kondisional halaman muka seperti ini:

<b:if cond='data:blog.url == data:blog.homepageUrl'>

Pertama-tama masuklah ke menu Template kemudian klik Edit HTML dan klik Lanjutkan:

Edit HTML Blogger
Mengedit HTML

Temukan kode yang kurang lebih tampak seperti ini:

<b:section class='main' id='main' showaddelement='no'>
<b:widget id='Blog1' locked='true' title='Posting Blog' type='Blog'/>
</b:section>

Tepat di atas kode tersebut, letakkan kode ini:

<b:if cond='data:blog.url == data:blog.homepageUrl'>
<b:section class='main' id='homepage'></b:section>
<b:else/>

dan tepat di bawahnya, letakkan kode ini:

</b:if>

sehingga hasilnya akan menjadi seperti ini:

<b:if cond='data:blog.url == data:blog.homepageUrl'>
<b:section class='main' id='homepage'></b:section>
<b:else/>
<b:section class='main' id='main' showaddelement='no'>
<b:widget id='Blog1' locked='true' title='Posting Blog' type='Blog'/>
</b:section>

</b:if>

Seperti yang kalian lihat bahwa apa yang kalian lakukan sebenarnya hanyalah menggandakan elemen <b:section> dimana salah satu hanya akan tampil di halaman muka, sedangkan satunya lagi hanya akan tampil selain di halaman muka.

Klik Simpan Template. Sekarang masuklah ke halaman Tata Letak. Jika berhasil, seharusnya widget posting akan menghilang, digantikan oleh sebuah navigasi untuk menambahkan widget baru seperti ini:

Widget posting menghilang, dan sebuah elemen untuk menambahkan widget baru akan tampil seperti halnya pada sidebar blog.
Widget posting akan menghilang, dan sebuah elemen untuk menambahkan widget baru akan tampil seperti halnya pada sidebar blog.

Dari elemen itu Anda bisa menambahkan widget yang hanya akan ditampilkan pada halaman muka. Widget bisa berupa apa saja. Misalnya seperti teks ucapan selamat datang seperti gambar di atas, widget daftar isi, slideshow otomatis, atau yang lainnya.

Catatan: Menerapkan manipulasi ini akan membuat fitur pratinjau pada editor posting tidak berfungsi. Sebenarnya bukannya tidak berfungsi, hanya saja saat Anda mengeklik tombol Pratinjau, yang akan Anda lihat selalu berupa widget yang Anda tambahkan, sedangkan posting yang seharusnya ingin Anda lihat tidak akan tampil.

Selasa, 27 Maret 2012

Penanganan JavaScript pada Peramban yang Menonaktifkan JavaScript

Ini adalah tentang bagaimana cara kita menangani masalah-masalah umum yang akan timbul pada situs-situs yang membutuhkan pengaktifan JavaScript. Katakanlah kita memiliki sebuah menu navigasi bertingkat dengan efek JavaScript. Namun biasanya syarat yang harus kita penuhi agar efek animasi berjalan dengan baik adalah dengan menghilangkan setiap item yang akan ditampilkan/disembunyikan dengan efek JavaScript:

nav ul ul {
display:none;
}

Anda bisa mempelajari maksud dari kode di atas pada artikel ini.

Tidak masalah (bahkan sebuah keharusan) jika kita menghilangkan elemen dengan deklarasi display:none karena JavaScript selalu bisa menampilkannya dengan efek yang baik. Tapi bagaimana jika JavaScript dinonaktifkan?

Opsi pada peramban Firefox: Menonaktifkan JavaScript
Menonaktifkan JavaScript


Kita tidak membicarakan tentang mengapa mereka melakukan itu, tapi katakanlah jika itu dilakukan, apa yang akan terjadi?
Yang terjadi adalah sub-sub menu navigasi yang seharusnya muncul saat induk menu disorot akan mati karena tidak ada mesin yang bisa membuat mereka muncul kecuali JavaScript. Dan sekarang JavaScript telah dinonaktifkan.

Hal yang biasanya kita lakukan adalah menuliskan sebuah pesan yang akan muncul hanya jika JavaScript dinonaktifkan. Itu bisa dilakukan dengan <noscript>:

<noscript>
<div id="js-message">Anda harus mengaktifkan JavaScript untuk melihat halaman ini!</div>
</noscript>

Dan mungkin sedikit kode CSS untuk membuatnya tampak sebagai tabir yang akan menutupi seluruh layar:

#js-message {
position:fixed !important;
position:absolute;
top:0px;
right:0px;
bottom:0px;
left:0px;
z-index:999;
background-color:black;
padding-top:120px;
font:bold 100px Arial,Sans-Serif;
color:red;
text-align:center;
}

Tapi Saya rasa cara itu tidak sepenuhnya keren jika setiap kali kita menonaktifkan JavaScript, sebuah tabir/overlay besar akan muncul menutupi seluruh layar. Kita harap kita bisa memberikan fallback yang baik tanpa harus menghilangkan apa yang seharusnya bisa kita lihat. Kita mencoba untuk melihat kepada CSS.
Kita harap, jika JavaScript dinonaktifkan, maka CSS bisa menggantikannya untuk menampilkan/menyembunyikan elemen dengan baik, meski dengan efek yang sangat terbatas.
Berikut ini adalah sebuah kerangka menu navigasi bertingkat sederhana. Terdiri dari empat menu utama dan dua level submenu:

<nav>
<ul>
<li><a href="#">Beranda</a></li>
<li><a href="#">Profil</a>
<ul class="fallback">
<li><a href="#">Dropdown 1</a></li>
<li><a href="#">Dropdown 2</a></li>
<li><a href="#">Dropdown 3</a>
<ul class="fallback">
<li><a href="#">Dropdown 1</a></li>
<li><a href="#">Dropdown 2</a></li>
<li><a href="#">Dropdown 3</a></li>
<li><a href="#">Dropdown 4</a></li>
</ul>
</li>
<li><a href="#">Dropdown 4</a></li>
</ul>
</li>
<li><a href="#">Jurnal</a></li>
<li><a href="#">Komentar</a></li>
</ul>
</nav>

Seperti yang Anda lihat bahwa Saya menambahkan kelas/class fallback pada masing-masing anak menu (tidak harus bernama fallback. Itu hanya contoh).
Kelas tersebut akan kita gunakan pada kode CSS hanya jika JavaScript dinonaktifkan. Dalam artian: Kita akan menghilangkan kelas tersebut dengan JavaScript saat JavaScript diakifkan. Dan ini bisa dilakukan dengan cara yang sangat sederhana:

$('nav ul.fallback').removeClass('fallback');

Pada dasarnya inilah yang akan kita lakukan: Saat JavaScript dinonaktifkan, kita harap kita bisa mengakses elemen yang menghilang untuk ditampilkan dan disembunyikan dengan CSS tanpa harus mengganggu animasi JavaScript saat JavaScript diaktifkan. Itu bisa dilakukan dengan cara bergiliran. Saat JavaScript diaktifkan, kita harap kita bisa memberikan efek animasi yang baik saat sub-sub menu ditampilkan dan disembunyikan:

$('nav li').hover(function() {
$(this).children('ul').sliedDown('fast');
}, function() {
$(this).children('ul').slideUp('fast');
});

Namun saat JavaScript dinonaktifkan, kita tetap bisa memastikan bahwa sub-sub menu tersebut bisa tampil dan hilang dengan baik:

nav li ul {
display:none;
}

nav li:hover > ul.fallback {
display:block;
}


Gambaran Selengkapnya

Ini adalah gambaran selengkapnya. Saat JavaScript diaktifkan, maka kita akan menghilangkan kelas fallback pada semua elemen <ul>:

$('nav ul.fallback').removeClass('fallback');

Dengan begitu kode CSS pada bagian ini tidak akan bisa menampilkan dan menyembunyikan sub-sub menu, karena kelas fallback pada elemen submenu sudah menghilang:

nav li ul {
/* ... */
display:none;
}

nav li:hover > ul.fallback {
display:block; /* Ini sudah tidak berlaku lagi, karena class="fallback" telah dihilangkan */
}

Namun itu tidak mengapa, karena saat ini JavaScript sedang diaktifkan, maka efek animasi JavaScript bisa kita dijalankan:

$('nav li').hover(function() {
$(this).children('ul').slideDown('fast');
}, function() {
$(this).children('ul').slideUp('fast');
});

Dan saat JavaScript dinonaktifkan, maka fungsi-fungsi animasi dalam JavaScript tidak akan bekerja. Diutamakan pada bagian ini, sebagai perhatian utama kita:

$('nav ul.fallback').removeClass('fallback');

Oleh karena itu kelas fallback akan tetap berada pada tempatnya. Sehingga kode CSS pada bagian ini akan bekerja:

nav li:hover > ul.fallback {
display:block;
}

Coba Anda buka halaman ini kemudian perhatikan bahwa saat ini efek animasi .slideDown() dan .slideUp() masih bisa bekerja. Setelah itu nonaktifkan JavaScript pada peramban Anda dan segarkan halaman tersebut. Anda akan melihat bahwa sub-sub menu masih bisa ditampilkan dan disembunyikan meski dengan efek yang sangat terbatas:



Kode Selengkapnya

HTML

<nav>
<ul>
<li><a href="#">Beranda</a></li>
<li><a href="#">Profil</a>
<ul class="fallback">
<li><a href="#">Dropdown 1</a></li>
<li><a href="#">Dropdown 2</a></li>
<li><a href="#">Dropdown 3</a>
<ul class="fallback">
<li><a href="#">Dropdown 1</a></li>
<li><a href="#">Dropdown 2</a></li>
<li><a href="#">Dropdown 3</a></li>
<li><a href="#">Dropdown 4</a></li>
</ul>
</li>
<li><a href="#">Dropdown 4</a></li>
</ul>
</li>
<li><a href="#">Jurnal</a></li>
<li><a href="#">Komentar</a></li>
</ul>
</nav>

CSS

nav {
font:bold 12px Arial,Sans-Serif;
background-color:black;
margin:0px 0px;
padding:0px 0px;
}

nav ul {
margin:0px 0px;
padding:0px 0px;
display:block;
position:relative;
height:30px;
}

nav li {
margin:0px 0px;
padding:0px 0px;
float:left;
display:inline;
list-style:none;
position:relative;
}

nav li a {
display:block;
margin:0px 0px;
padding:0px 14px;
color:white;
text-decoration:none;
line-height:30px;
height:30px;
}

nav a:hover {
background-color:#456;
}

nav ul ul {
width:120px;
height:auto;
position:absolute;
top:100%;
left:0px;
z-ndex:10;
background-color:black;
display:none;
}

nav ul ul li {
float:none;
display:block;
}

nav ul ul ul {
top:0px;
left:100%;
}

/* CSS Fallback */
nav li:hover > ul.fallback {
display:block;
}

JQuery

$(function() {
// Singkirkan class "fallback" pada anak <ul>
// sehingga kode nav li:hover > ul.fallback {display:block;} tidak akan bekerja.
$('ul.fallback').removeClass('fallback');

// Lakukan seperti biasa mulai dari sini...
$('nav#nav li').hover(function() {
$(this).children('ul').slideDown('fast');
}, function() {
$(this).children('ul').slideUp('fast');
});
});


Lainnya

Selain itu, beberapa elemen seperti panel juga lebih banyak mengutamakan .hide() atau .css('display', 'none') untuk menyembunyikannya dibandingkan dengan menuliskan display:none secara langsung dengan CSS. Ini akan membuat panel tertutup saat JavaScript diaktifkan dan bisa terbuka saat sebuah pemicu (misalnya tombol) diklik. Tapi saat JavaScript dinonaktifkan, tombol-tombol tersebut tidak lagi berfungsi untuk membuka/menutup panel, sementara panel yang tadinya tertutup kini akan tetap terbuka. Kelihatannya memang jelek, tapi setidaknya kita masih tetap bisa melihat isinya.

Minggu, 25 Maret 2012

Blogger JSON - Content List Base

<!DOCTYPE html>
<html>
<head>
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
<title>Blogger Table of Contents</title>
<script type="text/javascript">
/**
* CONTENT LIST
*
* Created by : Copycat91 On July 30th 2009
* Website : http://infotentangblog.blogspot.com/
* Original post : http://infotentangblog.blogspot.com/2009/08/membuat-daftar-isi-blog.html
*
* Special thanks to :
* *) http://www.blogger.com for the free blog hosting
* *) http://buzz.blogger.com for the tutorial to convert feed->json
* *) NetBeans IDE 6.5 for the free IDE
* *) And other tutorials about HTML, javascript, json, etc I have read
*/

var all_entries, entries, all_labels = [], json;
function createEntries(json) {
var entries_obj_list = [];
var entries = json.feed.entry;
for (var i = 0; i < entries.length; i++) {
var entry = entries[i];
var entry_obj = new Object;
entry_obj.id = entry.id.$t;
entry_obj.title = entry.title.$t;
entry_obj.href = getEntryHref(entry);
entry_obj.content = getEntryContent(entry);
entry_obj.labels = getEntryLabels(entry);
entry_obj.published = entry.published.$t.substr(0, 10);
entries_obj_list.push(entry_obj);
}
return entries_obj_list;
}

function getEntryById(id) {
for (var i = 0; i < all_entries.length; i++) {
if (all_entries[i].id == id) {
return all_entries[i];
}
}
return null;
}

function getEntryContent(entry) {
return entry.content ? entry.content.$t : entry.summary.$t;
}

function getEntryHref(entry) {
var links = entry.link;
for (var i = 0; i < links.length; i++) {
if (links[i].rel == "alternate") {
return links[i].href;
}
}
return null;
}

function getEntryLabels(entry) {
var labels = [];
var categories = entry.category;
if (!categories) {
return labels;
}
for (var i = 0; i < categories.length; i++) {
var label = categories[i].term;
if (!isExists(all_labels, label)) {
all_labels.push(label);
} // while collecting all labels
labels.push(label);
}
return labels;
}

function getSomeEntries(cmp) {
entries = [];
for (var i = 0; i < all_entries.length; i++) {
var entry = all_entries[i];
if (cmp(entry)) {
entries.push(entry);
}
}
return entries;
}

function isExists(array, val) {
for (var i = 0; i < array.length; i++) {
if (array[i] == val) {
return true;
}
}
return false;
}

function onLoadFeed(json_arg) {
json = json_arg;
setTimeout("onLoadFeedTimeout()", 100);
}

function onLoadFeedTimeout() {
entries = createEntries(json);
all_entries = entries;
showHeaderOption();
showEntries(entries);
}

function showEntries(entries) {
var s = "";
for (var i = 0; i < entries.length; i++) {
var entry = entries[i];
s += "<p>";
s += titleCode(entry);
s += "<span style='font-size:80%;'>" + footlabel + " " + labelsCode(entry);
s += " " + footon + " " + publishedDateCode(entry) + "</span>";
s += "</p>";
}
document.getElementById("cl_content_list").innerHTML = s;
}

function showHeaderOption() {
var s = "";
s += "<table border='0' cellpadding='3'>";
s += "<tr>";
s += "<td style='text-align:right;'>" + sortby;
s += "<td><select onchange='sortBy(this.value.substr(1), this.value.substr(0,1))' style='width:100%;'>";
s += "<option value='0published'>" + timepub + "</option>";
s += "<option value='1title'>" + ptitle + "</option>";
s += "</select>";
s += "<tr>";
s += "<td style='text-align:right'>" + labelsort;
s += "<td><select onchange='showPostsWLabel(this.value)' id='cl_labels' style='width:100%;'>";
s += "<option value='*'>" + showall + "</option>";
for (var i = 0; i < all_labels.length; i++) {
var label = all_labels[i];
s += "<option value='" + label + "'>" + label + "</option>";
}
s += "</select>";
s += "<tr>";
s += "<td><td><button onclick='showPostsWLabel(\"*\");'>" + showall + "</button>";
s += "</table>";
document.getElementById("cl_option").innerHTML = s;
}

function shortenContent(entry) {
var content = entry.content;
content = stripHTML(content);
if (content.length > cl_summlen) {
content = content.substr(0, cl_summlen);
if (content.charAt(content.length - 1) != " ") {
content = content.substr(0, content.lastIndexOf(" ") + 1);
}
content += "...";
}
entry.content = content;
return content;
}

function showHideSummary(obj) {
var p = obj.nextSibling;
while (p.className != "cl_content") {
p = p.nextSibling;
}
var id = p.id;
var entry = getEntryById(id);
var content = shortenContent(entry);
if (p.innerHTML == "") {
p.innerHTML = content + "<br/>";
obj.innerHTML = "&#9660;";
obj.title = hidesum;
} else {
p.innerHTML = "";
obj.innerHTML = "&#9658;";
obj.title = showsum;
}
}

function sortBy(attribute, asc) {
var cmp = function(entry1, entry2) {
if (entry1[attribute] == entry2[attribute]) {
return 0;
}
else if (asc == '1') {
return entry1[attribute].toLowerCase() > entry2[attribute].toLowerCase();
}
else {
return entry1[attribute].toLowerCase() < entry2[attribute].toLowerCase();
}
}
entries.sort(cmp);
showEntries(entries);
}

function stripHTML(s) {
var c;
var intag = false;
var newstr = "";
for (var i = 0; i < s.length; i++) {
c = s.charAt(i);
if (c == "<") {
intag = true;
}
else if (c == ">") {
intag = false;
}
if (c == ">") {
newstr += " ";
}
else if (!intag) {
newstr += c;
}
}
return newstr;
}

// Functions Returning HTML Code
function labelsCode(entry) {
var s = "";
if (entry.labels.length == 0) {
return " (tidak berlabel) ";
}
for (var j = 0; j < entry.labels.length; j++) {
var label = entry.labels[j];
s += "<a href='javascript:showPostsWLabel(\"" + label + "\")' ";
s += "title='" + showlabel + " " + label + "'>" + label + "</a>";
s += (j != entry.labels.length - 1) ? ", " : "";
}
return s;
}

function publishedDateCode(entry) {
var y = entry.published.substr(0, 4);
var m = entry.published.substr(5, 2);
var d = entry.published.substr(8, 2);
var s = "<a href='javascript:showPostsInDate(\"" + y + "\")' title='" + y + "'>" + y + "</a>/";
s += "<a href='javascript:showPostsInDate(\"" + y + "-" + m + "\")' title='" + y + "/" + m + "'>" + m + "</a>/";
s += "<a href='javascript:showPostsInDate(\"" + y + "-" + m + "-" + d + "\")'title='" + y + "/" + m + "/" + d + "'>" + d + "</a>";
return s;
}

function titleCode(entry) {
var s = "<span title='" + showsum + "' onclick='showHideSummary(this)' style='cursor:pointer'>&#9658;</span> ";
s += "<b><a href='" + entry.href + "'>" + entry.title + "</a></b><br/>";
s += "<span class='cl_content' id='" + entry.id + "'></span>";
return s;
}

// Selection Functions
function showPostsInDate(date) {
var cmp = function(entry) {
return entry.published.indexOf(date) == 0;
}
var entries = getSomeEntries(cmp);
showEntries(entries);
}

function showPostsWLabel(label) {
var cmp = function(entry) {
if (label == "*") {
return true;
}
for (var i = 0; i < entry.labels.length; i++) {
if (entry.labels[i] == label) {
return true;
}
}
return false;
}
var entries = getSomeEntries(cmp);
showEntries(entries);
document.getElementById("cl_labels").value = label;
}

</script>
</head>
<body>
<div id="cl_option">Loading...</div>
<div id="cl_content_list"></div>
<script type="text/javascript">
var cl_summlen = 500,
timepub = "Tanggal Publikasi",
ptitle = "Judul Artikel",
sortby = "Urut berdasarkan:",
labelsort = "Filter artikel dengan label:",
showall = "Lihat Semua",
hidesum = "Sembunyikan Rangkuman...",
showsum = "Tampilkan Rangkuman...",
footlabel = "Kategori:",
footon = "di",
showlabel = "Lihat posing dengan label";
</script>
<script src="http://hompimpaalaihumgambreng.blogspot.com/feeds/posts/default?alt=json-in-script&callback=onLoadFeed&max-results=9999"></script>
</body>
</html>

CSS Only, Zebra Striped PRE Tag

CSS Only, Zebra Striped PRE Tag

pre {
display:block;
font:normal 12px/22px Monaco,Monospace !important;
color:#CFDBEC;
background-color:#2f2f2f;
background-image:-webkit-repeating-linear-gradient(top, #444 0px, #444 22px, #2f2f2f 22px, #2f2f2f 44px);
background-image:-moz-repeating-linear-gradient(top, #444 0px, #444 22px, #2f2f2f 22px, #2f2f2f 44px);
background-image:-ms-repeating-linear-gradient(top, #444 0px, #444 22px, #2f2f2f 22px, #2f2f2f 44px);
background-image:-o-repeating-linear-gradient(top, #444 0px, #444 22px, #2f2f2f 22px, #2f2f2f 44px);
background-image:repeating-linear-gradient(top, #444 0px, #444 22px, #2f2f2f 22px, #2f2f2f 44px);
padding:0em 1em;
overflow:auto;
}

Membatasi Jumlah Posting pada Halaman Label

Gambar Address Bar

Masuklah ke menu Template kemudian klik Edit HTML dan klik Lanjutkan. Cek Expand Template Widget agar seluruh elemen pembangun posting tampil:

Edit HTML Blogger
Mengedit HTML


Temukan kode apa saja yang tampak kurang lebih seperti ini (fokuslah pada atribut expr:href, beberapa atribut lain mungkin juga ditemukan di dalam tag yang sama misalnya expr:dir):

<a expr:href='data:label.url'>

TIP: Tekan CTRL + F kemudian ketik expr:href='data:label.url untuk mempermudah pencarian.

Ubah nilai expr:href menjadi seperti ini:

<a expr:href='data:label.url + &quot;?max-results=5&quot;'>

5 adalah batasan maksimal posting yang akan ditampilkan.

Blogger JSON - Table of Content Base

<!DOCTYPE html>
<html>
<head>
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type"/>
<title>Blogger Table of Content</title>
<script type="text/javascript">
// ----------------------------------------------------------------------------
// Author: Abu Farhan - http://www.abu-farhan.com
// Optimized by Taufik Nurrohman - http://hompimpaalaihumgambreng.blogspot.com
// ----------------------------------------------------------------------------
var postTitle = new Array(),
postUrl = new Array(),
postDate = new Array(),
postLabels = new Array(),
postNew = new Array(),
newText = " - <strong><em style='color:red;'>Baru!!</em></strong>",
tocLoaded = false,
postFilter = "",
numberfeed = 0;

function loadtoc(a) {
function b() {
if ("entry" in a.feed) {
var d = a.feed.entry.length;
numberfeed = d;
ii = 0;
for (var h = 0; h < d; h++) {
var n = a.feed.entry[h],
e = n.title.$t,
m = n.published.$t.substring(0, 10),
j;
for (var g = 0; g < n.link.length; g++) {
if (n.link[g].rel == "alternate") {
j = n.link[g].href;
break
}
}
var o = "";
for (var g = 0; g < n.link.length; g++) {
if (n.link[g].rel == "enclosure") {
o = n.link[g].href;
break
}
}
var c = "";
if ("category" in n) {
for (var g = 0; g < n.category.length; g++) {
c = n.category[g].term;
var f = c.lastIndexOf(";");
if (f != -1) {
c = c.substring(0, f)
}
postLabels[ii] = c;
postTitle[ii] = e;
postDate[ii] = m;
postUrl[ii] = j;
if (h < 10) {
postNew[ii] = true
} else {
postNew[ii] = false
}
ii = ii + 1
}
}
}
}
}
b();
sortBy = "titleasc";
sortPosts(sortBy);
sortlabel();
tocLoaded = true;
displayToc2()
}
function filterPosts(a) {
scroll(0, 0);
postFilter = a;
displayToc(postFilter)
}
function allPosts() {
sortlabel();
postFilter = "";
displayToc(postFilter)
}
function sortPosts(d) {
function c(e, g) {
var f = postTitle[e];
postTitle[e] = postTitle[g];
postTitle[g] = f;
var f = postDate[e];
postDate[e] = postDate[g];
postDate[g] = f;
var f = postUrl[e];
postUrl[e] = postUrl[g];
postUrl[g] = f;
var f = postLabels[e];
postLabels[e] = postLabels[g];
postLabels[g] = f;
var f = postNew[e];
postNew[e] = postNew[g];
postNew[g] = f
}
for (var b = 0; b < postTitle.length - 1; b++) {
for (var a = b + 1; a < postTitle.length; a++) {
if (d == "titleasc") {
if (postTitle[b] > postTitle[a]) {
c(b, a)
}
}
if (d == "titledesc") {
if (postTitle[b] < postTitle[a]) {
c(b, a)
}
}
if (d == "dateoldest") {
if (postDate[b] > postDate[a]) {
c(b, a)
}
}
if (d == "datenewest") {
if (postDate[b] < postDate[a]) {
c(b, a)
}
}
if (d == "orderlabel") {
if (postLabels[b] > postLabels[a]) {
c(b, a)
}
}
}
}
}
function sortlabel() {
sortBy = "orderlabel";
sortPosts(sortBy);
var a = 0, b = 0;
while (b < postTitle.length) {
temp1 = postLabels[b];
firsti = a;
do {
a = a + 1
} while (postLabels[a] == temp1);
b = a;
sortPosts2(firsti, a);
if (b > postTitle.length) {
break
}
}
}
function sortPosts2(d, c) {
function e(f, h) {
var g = postTitle[f];
postTitle[f] = postTitle[h];
postTitle[h] = g;
var g = postDate[f];
postDate[f] = postDate[h];
postDate[h] = g;
var g = postUrl[f];
postUrl[f] = postUrl[h];
postUrl[h] = g;
var g = postLabels[f];
postLabels[f] = postLabels[h];
postLabels[h] = g;
var g = postNew[f];
postNew[f] = postNew[h];
postNew[h] = g
}
for (var b = d; b < c - 1; b++) {
for (var a = b + 1; a < c; a++) {
if (postTitle[b] > postTitle[a]) {
e(b, a)
}
}
}
}
function displayToc2() {
var a = 0, b = 0;
document.write("<ol>");
while (b < postTitle.length) {
temp1 = postLabels[b];
document.write('<li><b><a href="/search/label/' + temp1 + '">' + temp1 + "</a></b><ol>");
firsti = a;
do {
document.write("<li>");
document.write('<a href="' + postUrl[a] + '">' + postTitle[a] + "</a>");
if (postNew[a] == true) {
document.write(newText)
}
document.write("</li>");
a = a + 1
} while (postLabels[a] == temp1);
b = a;
document.write("</ol></li>");
sortPosts2(firsti, a);
if (b > postTitle.length) {
break
}
}
document.write("</ol>");
}
</script>
</head>
<body>
<script src="http://hompimpaalaihumgambreng.blogspot.com/feeds/posts/default/?max-results=9999&alt=json-in-script&callback=loadtoc"></script>
</body>
</html>

Sabtu, 24 Maret 2012

Menciptakan Halaman Error 404 dengan Benar

Error Page

Seperti yang pernah Saya tuliskan bahwa tag kondisional bisa menahan pemanggilan elemen (baca di sini), maka jika Anda hanya memanfaatkan tag kondisional error_page untuk menampilkan tabir, itu hanya akan membuang-buang waktu saja terutama jika dilihat dari segi komunikasi, tentang bagaimana cara kita memberitahukan bahwa halaman yang sedang mereka akses itu tidak ada. Kabar buruk jika Anda memiliki halaman blog yang lambat diakses. Jika itu terjadi, maka pesan kesalahan yang ingin Anda sampaikan tidak akan pernah tersampaikan dengan benar.

Pernyataan Saya di atas tidak akan berlaku lagi jika Anda bisa membuat akses halaman kesalahan menjadi lebih cepat. Dan cara terbaik untuk melakukan itu adalah dengan menerapkan logika pengingkaran pada tag kondisional halaman kesalahan/error page. Berikut ini adalah cara paling sederhana untuk melakukan itu:

<body>
<b:if cond='data:blog.pageType != &quot;error_page&quot;'>
...
...
Daerah ini berisi bagian-bagian utama dalam sebuah blog seperti posting, widget, sidebar dan yang lainnya.
Daerah ini akan diabaikan karena kita berada di dalam kondisi pengingkaran.
...
...
</b:if>
<b:if cond='data:blog.pageType == &quot;error_page&quot;'>
<div id='error-page'>
<h1>Tuliskan sesuatu di sini. Bagian ini hanya akan tampil saat halaman tidak ditemukan.</h1>
</div>
</b:if>
</body>

Sisanya, mungkin Anda ingin menambahkan beberapa kode CSS:

#error-page {
text-align:center;
background-color:#900;
position:fixed !important;
position:absolute; /* IE6 Fallback */
top:0px;
right:0px;
bottom:0px;
left:0px;
padding-top:100px;
z-index:99999;
}


Jumat, 23 Maret 2012

Kumpulan Blogger Thread Comment Hack

Berikut ini adalah beberapa tutorial Blogger Thread Comment Hack yang berhasil Saya kumpulkan dari hasil penelusuran. Jika Anda tidak bisa mengaktifkan fitur thread comment pada template Blogger Anda, tutorial-tutorial berikut ini mungkin bisa menjadi alternatif:

Shams’ Blog

Blogger Thread Comment System Hack

Saya tidak begitu familiar dengan ini, tapi sepertinya ini adalah versi pertama dari sekian banyak versi tutorial modifikasi komentar Blogger. Sangat jelas jika Anda melihat dari tanggal penerbitan postingnya:

Artisteer Tutorials

Blogger Thread Comment System Hack

Ini adalah versi yang Saya pakai, karena beberapa kali Saya mencoba metode lainnya, ternyata tetap tidak berhasil. Beberapa alasan yang paling masuk akal mungkin karena di sini Anda harus mengedit keseluruhan kerangka daftar komentar pada template sehingga masalah ID, kelas dan susunan kerangka komentar tidak akan mempengaruhi:

bX-NicoNico

Blogger Thread Comment System Hack

Versi paling aman diantara sekian banyak tutorial, karena beliau menggunakan metode yang sama dengan cara kerja fitur thread comment dari Blogger. Pastikan saja Anda tidak salah paham dengan bagian ini. Mohon dibaca dengan teliti:

 ... here comes the current code 
... that is in the template
... that generates the comments
... and what we won't touch

Yet Another Blogger Tips Blog

Blogger Thread Comment System Hack

Versi ini adalah versi termudah dalam hal instalasi, hanya saja tutorial ini memiliki satu keterbatasan. Saya sempat memeriksa kode dalam tutorialnya dan Saya bisa memutuskan bahwa modifikasi ini hanya bekerja untuk template blogspot dengan kerangka komentar seperti ini:

<dl class='avatar-comment-indent' id='comments-block'>
<dt class='comment-author'>
<div class="avatar-image-container vcard"> ... </div>
</dt>
<dd class='comment-body'> ... </dd>
<dd class='comment-footer'> ... </dd>
</dl>

Selain itu tidak bisa. Kecuali jika Anda bisa mengedit selektor-selektor dalam script tersebut:

VNBlogspot

Blogger Thread Comment System Hack

Ini adalah versi tutorial yang Saya ketahui sebagai dasar dari pengembangan dalam beberapa tutorial pada blog Artisteer Tutorials (beliau sempat membicarakan blog tersebut dalam salah satu tutorialnya):

VinaLuv

Ini adalah hasil karya baru dari VNBlogspot. Saya bisa mengatakan bahwa ini adalah sistem thread commenting terbaik meskipun masih dalam tahap pengembangan, karena saat kita mengeklik tombol Balas, kita tidak akan melihat pop-up window lagi seperti versi sebelumnya. Jika Anda tidak suka dengan pop-up window yang tapil pada sistem thread commenting versi sebelumnya, Anda bisa menggunakan ini:

Uncompressed Blogger Thread Comment Hack

Threaded Commenting System

Cukup lama Saya mencari kode asli ini karena sebagian besar memang sudah dikompres total. Pada awalnya Saya mencoba mencari dua kata kunci ini:

  • .cm_head
  • var _0x7bf4=["\x32\x20\x78\x3D\x31\x72\x2E\

… dan berharap Saya bisa menemukan situs tutorial sejenis sebanyak-banyaknya. Namun Saya tetap tidak menemukan versi uncompressed dari kode ini:

&lt;script type='text/javascript'&gt;&lt;!--
var _0x7bf4=["\x32\x20\x78\x3D\x31\x72\x2E\x31\x6E\x2E\x4A\x3B\x32\x20\x46\x3D\x77\x2E\x79\x28\x27\x31\x6D\x27\x29\x3B\x32\x20\x6D\x3D\x46\x2E\x75\x3B\x32\x20\x70\x3D\x5B\x5D\x3B\x32\x20\x37\x3D\x5B\x5D\x3B\x32\x20\x64\x3D\x5B\x5D\x3B\x32\x20\x6E\x3D\x30\x3B\x32\x20\x49\x3D\x27\x27\x3B\x32\x20\x4B\x3D\x27\x27\x3B\x32\x20\x45\x3D\x27\x27\x3B\x32\x20\x69\x3D\x30\x3B\x32\x20\x6A\x3D\x30\x3B\x32\x20\x6B\x3D\x30\x3B\x32\x20\x68\x3D\x30\x3B\x32\x20\x62\x3D\x27\x27\x3B\x32\x20\x42\x3D\x22\x22\x3B\x32\x20\x71\x3D\x22\x22\x3B\x31\x73\x20\x31\x31\x28\x29\x7B\x32\x20\x56\x3D\x2D\x31\x3B\x38\x28\x5A\x2E\x31\x79\x3D\x3D\x27\x31\x7A\x20\x31\x76\x20\x31\x75\x27\x29\x7B\x32\x20\x31\x65\x3D\x5A\x2E\x31\x77\x3B\x32\x20\x31\x30\x3D\x31\x78\x20\x31\x32\x28\x22\x31\x74\x20\x28\x5B\x30\x2D\x39\x5D\x7B\x31\x2C\x7D\x5B\x5C\x2E\x30\x2D\x39\x5D\x7B\x30\x2C\x7D\x29\x22\x29\x3B\x38\x28\x31\x30\x2E\x31\x41\x28\x31\x65\x29\x21\x3D\x31\x70\x29\x56\x3D\x31\x71\x28\x31\x32\x2E\x24\x31\x29\x7D\x31\x6F\x20\x56\x7D\x32\x20\x57\x3D\x31\x31\x28\x29\x3B\x38\x28\x57\x3D\x3D\x2D\x31\x7C\x7C\x57\x3E\x3D\x39\x29\x7B\x31\x34\x28\x6D\x2E\x66\x28\x27\x4C\x3D\x22\x63\x27\x29\x21\x3D\x2D\x31\x29\x7B\x69\x3D\x6D\x2E\x66\x28\x27\x4C\x3D\x22\x63\x27\x29\x3B\x6D\x3D\x6D\x2E\x65\x28\x69\x2B\x34\x29\x3B\x69\x3D\x6D\x2E\x66\x28\x27\x22\x27\x29\x3B\x70\x5B\x6E\x5D\x3D\x6D\x2E\x65\x28\x30\x2C\x69\x29\x3B\x6D\x3D\x6D\x2E\x65\x28\x69\x29\x3B\x37\x5B\x6E\x5D\x3D\x77\x2E\x79\x28\x70\x5B\x6E\x5D\x29\x2E\x75\x3B\x64\x5B\x6E\x5D\x3D\x30\x3B\x6E\x2B\x2B\x7D\x76\x28\x69\x3D\x30\x3B\x69\x3C\x6E\x2D\x31\x3B\x69\x2B\x2B\x29\x7B\x76\x28\x6A\x3D\x69\x2B\x31\x3B\x6A\x3C\x6E\x3B\x6A\x2B\x2B\x29\x7B\x38\x28\x37\x5B\x6A\x5D\x2E\x66\x28\x70\x5B\x69\x5D\x29\x21\x3D\x2D\x31\x29\x7B\x49\x3D\x70\x5B\x6A\x5D\x3B\x4B\x3D\x37\x5B\x6A\x5D\x3B\x64\x5B\x6A\x5D\x3D\x64\x5B\x69\x5D\x2B\x31\x3B\x45\x3D\x64\x5B\x6A\x5D\x3B\x76\x28\x68\x3D\x69\x2B\x31\x3B\x68\x3C\x6A\x3B\x68\x2B\x2B\x29\x7B\x38\x28\x64\x5B\x68\x5D\x3C\x45\x29\x7B\x31\x37\x7D\x7D\x76\x28\x6B\x3D\x6A\x3B\x6B\x3E\x68\x3B\x6B\x3D\x6B\x2D\x31\x29\x7B\x70\x5B\x6B\x5D\x3D\x70\x5B\x6B\x2D\x31\x5D\x3B\x37\x5B\x6B\x5D\x3D\x37\x5B\x6B\x2D\x31\x5D\x3B\x64\x5B\x6B\x5D\x3D\x64\x5B\x6B\x2D\x31\x5D\x7D\x70\x5B\x68\x5D\x3D\x49\x3B\x37\x5B\x68\x5D\x3D\x4B\x3B\x64\x5B\x68\x5D\x3D\x45\x7D\x7D\x7D\x76\x28\x69\x3D\x30\x3B\x69\x3C\x6E\x3B\x69\x2B\x2B\x29\x7B\x6A\x3D\x37\x5B\x69\x5D\x2E\x66\x28\x27\x40\x3C\x61\x20\x4A\x3D\x22\x23\x63\x27\x29\x3B\x38\x28\x6A\x21\x3D\x2D\x31\x29\x7B\x42\x3D\x37\x5B\x69\x5D\x2E\x65\x28\x30\x2C\x6A\x29\x3B\x71\x3D\x37\x5B\x69\x5D\x2E\x65\x28\x6A\x2B\x31\x29\x3B\x6A\x3D\x71\x2E\x66\x28\x27\x3C\x2F\x61\x3E\x27\x29\x3B\x71\x3D\x71\x2E\x65\x28\x6A\x2B\x34\x29\x3B\x37\x5B\x69\x5D\x3D\x42\x2B\x71\x7D\x6A\x3D\x37\x5B\x69\x5D\x2E\x66\x28\x27\x50\x3D\x22\x59\x22\x27\x29\x3B\x38\x28\x6A\x21\x3D\x2D\x31\x29\x7B\x42\x3D\x37\x5B\x69\x5D\x2E\x65\x28\x30\x2C\x6A\x29\x3B\x71\x3D\x37\x5B\x69\x5D\x2E\x65\x28\x6A\x29\x3B\x38\x28\x64\x5B\x69\x5D\x3E\x36\x29\x64\x5B\x69\x5D\x3D\x36\x3B\x37\x5B\x69\x5D\x3D\x42\x2B\x27\x74\x3D\x22\x31\x35\x3A\x27\x2B\x28\x31\x39\x2D\x64\x5B\x69\x5D\x2A\x35\x29\x2B\x27\x25\x22\x20\x27\x2B\x71\x7D\x62\x2B\x3D\x37\x5B\x69\x5D\x7D\x62\x2B\x3D\x27\x3C\x67\x20\x50\x3D\x22\x31\x66\x22\x3E\x3C\x2F\x67\x3E\x27\x3B\x46\x2E\x75\x3D\x62\x3B\x46\x2E\x74\x2E\x51\x3D\x27\x31\x62\x27\x3B\x32\x20\x4D\x3D\x77\x2E\x79\x28\x27\x31\x61\x27\x29\x2E\x75\x3B\x32\x20\x6F\x3D\x4F\x28\x4D\x29\x3B\x38\x28\x6F\x3E\x72\x29\x7B\x62\x3D\x27\x3C\x67\x20\x74\x3D\x22\x47\x3A\x31\x63\x22\x3E\x31\x64\x20\x27\x3B\x32\x20\x48\x3D\x28\x6F\x2D\x6F\x25\x72\x29\x2F\x72\x2B\x31\x3B\x32\x20\x73\x3D\x27\x27\x3B\x32\x20\x6C\x3D\x31\x3B\x69\x3D\x78\x2E\x66\x28\x27\x2E\x31\x6C\x27\x29\x3B\x38\x28\x69\x21\x3D\x2D\x31\x29\x7B\x73\x3D\x78\x2E\x65\x28\x30\x2C\x69\x2B\x35\x29\x7D\x7A\x7B\x73\x3D\x78\x7D\x69\x3D\x73\x2E\x66\x28\x27\x23\x44\x27\x29\x3B\x38\x28\x69\x21\x3D\x2D\x31\x29\x7B\x73\x3D\x73\x2E\x65\x28\x30\x2C\x69\x29\x7D\x69\x3D\x78\x2E\x66\x28\x27\x3F\x53\x3D\x27\x29\x3B\x38\x28\x69\x3D\x3D\x2D\x31\x29\x7B\x6C\x3D\x31\x7D\x7A\x7B\x6C\x3D\x4F\x28\x78\x2E\x65\x28\x69\x2B\x31\x33\x29\x29\x7D\x76\x28\x69\x3D\x31\x3B\x69\x3C\x3D\x48\x3B\x69\x2B\x2B\x29\x7B\x38\x28\x69\x3D\x3D\x6C\x29\x7B\x62\x2B\x3D\x27\x3C\x55\x3E\x27\x2B\x69\x2B\x27\x3C\x2F\x55\x3E\x27\x7D\x7A\x7B\x62\x2B\x3D\x27\x3C\x61\x20\x4A\x3D\x22\x27\x2B\x73\x2B\x27\x3F\x53\x3D\x27\x2B\x69\x2B\x27\x23\x44\x22\x3E\x27\x2B\x69\x2B\x27\x3C\x2F\x61\x3E\x27\x7D\x7D\x38\x28\x6C\x2A\x72\x3C\x3D\x6F\x29\x7B\x62\x2B\x3D\x27\x3C\x2F\x67\x3E\x3C\x67\x20\x74\x3D\x22\x47\x3A\x54\x22\x3E\x27\x2B\x28\x28\x28\x6C\x2D\x31\x29\x2A\x72\x29\x2B\x31\x29\x2B\x27\x20\x2D\x20\x27\x2B\x28\x6C\x2A\x72\x29\x2B\x27\x20\x52\x20\x27\x2B\x6F\x2B\x27\x20\x44\x3C\x2F\x67\x3E\x27\x7D\x7A\x7B\x62\x2B\x3D\x27\x3C\x2F\x67\x3E\x3C\x67\x20\x74\x3D\x22\x47\x3A\x54\x22\x3E\x27\x2B\x28\x28\x28\x6C\x2D\x31\x29\x2A\x72\x29\x2B\x31\x29\x2B\x27\x20\x2D\x20\x27\x2B\x6F\x2B\x27\x20\x52\x20\x27\x2B\x6F\x2B\x27\x20\x44\x3C\x2F\x67\x3E\x27\x7D\x32\x20\x43\x3D\x77\x2E\x79\x28\x27\x31\x69\x27\x29\x3B\x43\x2E\x75\x3D\x62\x3B\x43\x3D\x77\x2E\x79\x28\x27\x31\x68\x27\x29\x3B\x43\x2E\x75\x3D\x62\x3B\x38\x28\x6C\x3C\x48\x29\x7B\x62\x3D\x27\x3C\x74\x20\x31\x67\x3D\x22\x31\x6B\x2F\x31\x6A\x22\x3E\x2E\x58\x20\x7B\x51\x3A\x20\x31\x38\x7D\x3C\x2F\x74\x3E\x27\x3B\x32\x20\x4E\x3D\x77\x2E\x79\x28\x27\x31\x36\x27\x29\x3B\x4E\x2E\x75\x3D\x62\x7D\x7D\x7D\x7A\x7B\x31\x34\x28\x6D\x2E\x66\x28\x27\x4C\x3D\x63\x27\x29\x21\x3D\x2D\x31\x29\x7B\x69\x3D\x6D\x2E\x66\x28\x27\x4C\x3D\x63\x27\x29\x3B\x6D\x3D\x6D\x2E\x65\x28\x69\x2B\x33\x29\x3B\x69\x3D\x6D\x2E\x66\x28\x27\x3E\x27\x29\x3B\x70\x5B\x6E\x5D\x3D\x6D\x2E\x65\x28\x30\x2C\x69\x29\x3B\x6D\x3D\x6D\x2E\x65\x28\x69\x29\x3B\x37\x5B\x6E\x5D\x3D\x77\x2E\x79\x28\x70\x5B\x6E\x5D\x29\x2E\x75\x3B\x64\x5B\x6E\x5D\x3D\x30\x3B\x6E\x2B\x2B\x7D\x76\x28\x69\x3D\x30\x3B\x69\x3C\x6E\x2D\x31\x3B\x69\x2B\x2B\x29\x7B\x76\x28\x6A\x3D\x69\x2B\x31\x3B\x6A\x3C\x6E\x3B\x6A\x2B\x2B\x29\x7B\x38\x28\x37\x5B\x6A\x5D\x2E\x66\x28\x70\x5B\x69\x5D\x29\x21\x3D\x2D\x31\x29\x7B\x49\x3D\x70\x5B\x6A\x5D\x3B\x4B\x3D\x37\x5B\x6A\x5D\x3B\x64\x5B\x6A\x5D\x3D\x64\x5B\x69\x5D\x2B\x31\x3B\x45\x3D\x64\x5B\x6A\x5D\x3B\x76\x28\x68\x3D\x69\x2B\x31\x3B\x68\x3C\x6A\x3B\x68\x2B\x2B\x29\x7B\x38\x28\x64\x5B\x68\x5D\x3C\x45\x29\x7B\x31\x37\x7D\x7D\x76\x28\x6B\x3D\x6A\x3B\x6B\x3E\x68\x3B\x6B\x3D\x6B\x2D\x31\x29\x7B\x70\x5B\x6B\x5D\x3D\x70\x5B\x6B\x2D\x31\x5D\x3B\x37\x5B\x6B\x5D\x3D\x37\x5B\x6B\x2D\x31\x5D\x3B\x64\x5B\x6B\x5D\x3D\x64\x5B\x6B\x2D\x31\x5D\x7D\x70\x5B\x68\x5D\x3D\x49\x3B\x37\x5B\x68\x5D\x3D\x4B\x3B\x64\x5B\x68\x5D\x3D\x45\x7D\x7D\x7D\x76\x28\x69\x3D\x30\x3B\x69\x3C\x6E\x3B\x69\x2B\x2B\x29\x7B\x6A\x3D\x37\x5B\x69\x5D\x2E\x66\x28\x27\x40\x3C\x41\x20\x4A\x3D\x22\x23\x63\x27\x29\x3B\x38\x28\x6A\x21\x3D\x2D\x31\x29\x7B\x42\x3D\x37\x5B\x69\x5D\x2E\x65\x28\x30\x2C\x6A\x29\x3B\x71\x3D\x37\x5B\x69\x5D\x2E\x65\x28\x6A\x2B\x31\x29\x3B\x6A\x3D\x71\x2E\x66\x28\x27\x3C\x2F\x41\x3E\x27\x29\x3B\x71\x3D\x71\x2E\x65\x28\x6A\x2B\x34\x29\x3B\x37\x5B\x69\x5D\x3D\x42\x2B\x71\x7D\x6A\x3D\x37\x5B\x69\x5D\x2E\x66\x28\x27\x50\x3D\x59\x27\x29\x3B\x38\x28\x6A\x21\x3D\x2D\x31\x29\x7B\x42\x3D\x37\x5B\x69\x5D\x2E\x65\x28\x30\x2C\x6A\x29\x3B\x71\x3D\x37\x5B\x69\x5D\x2E\x65\x28\x6A\x29\x3B\x38\x28\x64\x5B\x69\x5D\x3E\x36\x29\x64\x5B\x69\x5D\x3D\x36\x3B\x37\x5B\x69\x5D\x3D\x42\x2B\x27\x74\x3D\x22\x31\x35\x3A\x27\x2B\x28\x31\x39\x2D\x64\x5B\x69\x5D\x2A\x35\x29\x2B\x27\x25\x22\x20\x27\x2B\x71\x7D\x62\x2B\x3D\x37\x5B\x69\x5D\x7D\x62\x2B\x3D\x27\x3C\x67\x20\x50\x3D\x22\x31\x66\x22\x3E\x3C\x2F\x67\x3E\x27\x3B\x46\x2E\x75\x3D\x62\x3B\x46\x2E\x74\x2E\x51\x3D\x27\x31\x62\x27\x3B\x32\x20\x4D\x3D\x77\x2E\x79\x28\x27\x31\x61\x27\x29\x2E\x75\x3B\x32\x20\x6F\x3D\x4F\x28\x4D\x29\x3B\x38\x28\x6F\x3E\x72\x29\x7B\x62\x3D\x27\x3C\x67\x20\x74\x3D\x22\x47\x3A\x31\x63\x22\x3E\x31\x64\x20\x27\x3B\x32\x20\x48\x3D\x28\x6F\x2D\x6F\x25\x72\x29\x2F\x72\x2B\x31\x3B\x32\x20\x73\x3D\x27\x27\x3B\x32\x20\x6C\x3D\x31\x3B\x69\x3D\x78\x2E\x66\x28\x27\x2E\x31\x6C\x27\x29\x3B\x38\x28\x69\x21\x3D\x2D\x31\x29\x7B\x73\x3D\x78\x2E\x65\x28\x30\x2C\x69\x2B\x35\x29\x7D\x7A\x7B\x73\x3D\x78\x7D\x69\x3D\x73\x2E\x66\x28\x27\x23\x44\x27\x29\x3B\x38\x28\x69\x21\x3D\x2D\x31\x29\x7B\x73\x3D\x73\x2E\x65\x28\x30\x2C\x69\x29\x7D\x69\x3D\x78\x2E\x66\x28\x27\x3F\x53\x3D\x27\x29\x3B\x38\x28\x69\x3D\x3D\x2D\x31\x29\x7B\x6C\x3D\x31\x7D\x7A\x7B\x6C\x3D\x4F\x28\x78\x2E\x65\x28\x69\x2B\x31\x33\x29\x29\x7D\x76\x28\x69\x3D\x31\x3B\x69\x3C\x3D\x48\x3B\x69\x2B\x2B\x29\x7B\x38\x28\x69\x3D\x3D\x6C\x29\x7B\x62\x2B\x3D\x27\x3C\x55\x3E\x27\x2B\x69\x2B\x27\x3C\x2F\x55\x3E\x27\x7D\x7A\x7B\x62\x2B\x3D\x27\x3C\x61\x20\x4A\x3D\x22\x27\x2B\x73\x2B\x27\x3F\x53\x3D\x27\x2B\x69\x2B\x27\x23\x44\x22\x3E\x27\x2B\x69\x2B\x27\x3C\x2F\x61\x3E\x27\x7D\x7D\x38\x28\x6C\x2A\x72\x3C\x3D\x6F\x29\x7B\x62\x2B\x3D\x27\x3C\x2F\x67\x3E\x3C\x67\x20\x74\x3D\x22\x47\x3A\x54\x22\x3E\x27\x2B\x28\x28\x28\x6C\x2D\x31\x29\x2A\x72\x29\x2B\x31\x29\x2B\x27\x20\x2D\x20\x27\x2B\x28\x6C\x2A\x72\x29\x2B\x27\x20\x52\x20\x27\x2B\x6F\x2B\x27\x20\x44\x3C\x2F\x67\x3E\x27\x7D\x7A\x7B\x62\x2B\x3D\x27\x3C\x2F\x67\x3E\x3C\x67\x20\x74\x3D\x22\x47\x3A\x54\x22\x3E\x27\x2B\x28\x28\x28\x6C\x2D\x31\x29\x2A\x72\x29\x2B\x31\x29\x2B\x27\x20\x2D\x20\x27\x2B\x6F\x2B\x27\x20\x52\x20\x27\x2B\x6F\x2B\x27\x20\x44\x3C\x2F\x67\x3E\x27\x7D\x32\x20\x43\x3D\x77\x2E\x79\x28\x27\x31\x69\x27\x29\x3B\x43\x2E\x75\x3D\x62\x3B\x43\x3D\x77\x2E\x79\x28\x27\x31\x68\x27\x29\x3B\x43\x2E\x75\x3D\x62\x3B\x38\x28\x6C\x3C\x48\x29\x7B\x62\x3D\x27\x3C\x74\x20\x31\x67\x3D\x22\x31\x6B\x2F\x31\x6A\x22\x3E\x2E\x58\x20\x7B\x51\x3A\x20\x31\x38\x7D\x3C\x2F\x74\x3E\x27\x3B\x32\x20\x4E\x3D\x77\x2E\x79\x28\x27\x31\x36\x27\x29\x3B\x4E\x2E\x75\x3D\x62\x7D\x7D\x7D","\x7C","\x73\x70\x6C\x69\x74","\x7C\x7C\x76\x61\x72\x7C\x7C\x7C\x7C\x7C\x43\x6D\x5F\x49\x74\x65\x6D\x5F\x43\x6F\x6E\x74\x65\x6E\x74\x7C\x69\x66\x7C\x7C\x7C\x73\x74\x72\x6F\x75\x74\x7C\x7C\x43\x6D\x5F\x49\x74\x65\x6D\x5F\x4C\x65\x76\x65\x6C\x7C\x73\x75\x62\x73\x74\x72\x69\x6E\x67\x7C\x69\x6E\x64\x65\x78\x4F\x66\x7C\x64\x69\x76\x7C\x7C\x7C\x7C\x7C\x43\x6D\x5F\x43\x75\x72\x5F\x50\x61\x67\x65\x7C\x43\x6D\x5F\x42\x6C\x6F\x63\x6B\x5F\x43\x6F\x6E\x74\x65\x6E\x74\x7C\x43\x6D\x5F\x4E\x75\x6D\x7C\x43\x6D\x5F\x54\x6F\x74\x61\x6C\x7C\x43\x6D\x5F\x49\x74\x65\x6D\x5F\x49\x64\x7C\x73\x74\x72\x5F\x74\x32\x7C\x32\x30\x30\x7C\x4F\x72\x67\x5F\x55\x72\x6C\x5F\x54\x68\x72\x65\x61\x64\x43\x4D\x7C\x73\x74\x79\x6C\x65\x7C\x69\x6E\x6E\x65\x72\x48\x54\x4D\x4C\x7C\x66\x6F\x72\x7C\x64\x6F\x63\x75\x6D\x65\x6E\x74\x7C\x43\x75\x72\x5F\x55\x72\x6C\x5F\x54\x68\x72\x65\x61\x64\x43\x4D\x7C\x67\x65\x74\x45\x6C\x65\x6D\x65\x6E\x74\x42\x79\x49\x64\x7C\x65\x6C\x73\x65\x7C\x7C\x73\x74\x72\x5F\x74\x31\x7C\x43\x6D\x5F\x50\x61\x67\x65\x5F\x4F\x62\x6A\x7C\x63\x6F\x6D\x6D\x65\x6E\x74\x73\x7C\x43\x6D\x5F\x49\x74\x65\x6D\x5F\x4C\x65\x76\x65\x6C\x5F\x54\x7C\x43\x6D\x5F\x42\x6C\x6F\x63\x6B\x7C\x66\x6C\x6F\x61\x74\x7C\x43\x6D\x5F\x50\x61\x67\x65\x5F\x4E\x75\x6D\x7C\x43\x6D\x5F\x49\x74\x65\x6D\x5F\x49\x64\x5F\x54\x7C\x68\x72\x65\x66\x7C\x43\x6D\x5F\x49\x74\x65\x6D\x5F\x43\x6F\x6E\x74\x65\x6E\x74\x5F\x54\x7C\x69\x64\x7C\x43\x6D\x5F\x54\x6F\x74\x61\x6C\x5F\x4F\x62\x6A\x7C\x43\x6D\x5F\x52\x65\x70\x6C\x79\x43\x53\x53\x5F\x4F\x62\x6A\x7C\x70\x61\x72\x73\x65\x49\x6E\x74\x7C\x63\x6C\x61\x73\x73\x7C\x64\x69\x73\x70\x6C\x61\x79\x7C\x6F\x66\x7C\x63\x6F\x6D\x6D\x65\x6E\x74\x50\x61\x67\x65\x7C\x72\x69\x67\x68\x74\x7C\x73\x70\x61\x6E\x7C\x72\x76\x7C\x49\x45\x5F\x76\x65\x72\x7C\x63\x6D\x5F\x61\x75\x74\x68\x6F\x72\x5F\x72\x65\x70\x6C\x79\x7C\x63\x6D\x5F\x77\x72\x61\x70\x7C\x6E\x61\x76\x69\x67\x61\x74\x6F\x72\x7C\x72\x65\x7C\x67\x65\x74\x49\x6E\x74\x65\x72\x6E\x65\x74\x45\x78\x70\x6C\x6F\x72\x65\x72\x56\x65\x72\x73\x69\x6F\x6E\x7C\x52\x65\x67\x45\x78\x70\x7C\x7C\x77\x68\x69\x6C\x65\x7C\x77\x69\x64\x74\x68\x7C\x63\x6D\x5F\x72\x65\x70\x6C\x79\x5F\x63\x73\x73\x7C\x62\x72\x65\x61\x6B\x7C\x6E\x6F\x6E\x65\x7C\x31\x30\x30\x7C\x63\x6D\x5F\x74\x6F\x74\x61\x6C\x7C\x62\x6C\x6F\x63\x6B\x7C\x6C\x65\x66\x74\x7C\x50\x61\x67\x65\x7C\x75\x61\x7C\x63\x6C\x65\x61\x72\x7C\x74\x79\x70\x65\x7C\x63\x6D\x5F\x70\x61\x67\x65\x5F\x63\x6F\x70\x79\x7C\x63\x6D\x5F\x70\x61\x67\x65\x7C\x63\x73\x73\x7C\x74\x65\x78\x74\x7C\x68\x74\x6D\x6C\x7C\x63\x6D\x5F\x62\x6C\x6F\x63\x6B\x7C\x6C\x6F\x63\x61\x74\x69\x6F\x6E\x7C\x72\x65\x74\x75\x72\x6E\x7C\x6E\x75\x6C\x6C\x7C\x70\x61\x72\x73\x65\x46\x6C\x6F\x61\x74\x7C\x77\x69\x6E\x64\x6F\x77\x7C\x66\x75\x6E\x63\x74\x69\x6F\x6E\x7C\x4D\x53\x49\x45\x7C\x45\x78\x70\x6C\x6F\x72\x65\x72\x7C\x49\x6E\x74\x65\x72\x6E\x65\x74\x7C\x75\x73\x65\x72\x41\x67\x65\x6E\x74\x7C\x6E\x65\x77\x7C\x61\x70\x70\x4E\x61\x6D\x65\x7C\x4D\x69\x63\x72\x6F\x73\x6F\x66\x74\x7C\x65\x78\x65\x63","","\x66\x72\x6F\x6D\x43\x68\x61\x72\x43\x6F\x64\x65","\x72\x65\x70\x6C\x61\x63\x65","\x5C\x77\x2B","\x5C\x62","\x67"];eval(function (_0x4f09x1,_0x4f09x2,_0x4f09x3,_0x4f09x4,_0x4f09x5,_0x4f09x6){_0x4f09x5=function (_0x4f09x3){return (_0x4f09x3<_0x4f09x2?_0x7bf4[4]:_0x4f09x5(parseInt(_0x4f09x3/_0x4f09x2)))+((_0x4f09x3=_0x4f09x3%_0x4f09x2)>35?String[_0x7bf4[5]](_0x4f09x3+29):_0x4f09x3.toString(36));} ;if(!_0x7bf4[4][_0x7bf4[6]](/^/,String)){while(_0x4f09x3--){_0x4f09x6[_0x4f09x5(_0x4f09x3)]=_0x4f09x4[_0x4f09x3]||_0x4f09x5(_0x4f09x3);} ;_0x4f09x4=[function (_0x4f09x5){return _0x4f09x6[_0x4f09x5];} ];_0x4f09x5=function (){return _0x7bf4[7];} ;_0x4f09x3=1;} ;while(_0x4f09x3--){if(_0x4f09x4[_0x4f09x3]){_0x4f09x1=_0x4f09x1[_0x7bf4[6]]( new RegExp(_0x7bf4[8]+_0x4f09x5(_0x4f09x3)+_0x7bf4[8],_0x7bf4[9]),_0x4f09x4[_0x4f09x3]);} ;} ;return _0x4f09x1;} (_0x7bf4[0],62,99,_0x7bf4[3][_0x7bf4[2]](_0x7bf4[1]),0,{}));
--&gt;&lt;/script&gt;

Sampai pada akhirnya Saya menemukan JSUnpack yang luar biasa namun tidak begitu terkenal dan masih dirahasiakan/dalam tahap pengembangan (ini cuma dugaan Saya, karena selama ini Saya tidak pernah menemukan forum yang bisa memecahkan masalah Saya mengenai kompresi JavaScript model ini).

Saya menggunakan alat itu dan kemudian mencoba menerapkan script itu kembali tapi justru tidak memberikan hasil kerja yang sama karena kode yang tergenerasi tidak lengkap. Jadi Saya mencoba untuk menelusuri kata kunci dengan script yang tidak lengkap tersebut hingga Saya menemukan ini ⇒ http://pastebin.de/22000.

Sungguh di luar dugaan bahwa Saya bisa menemukan apa yang sangat ingin Saya cari dan Saya cari tahu cara kerjanya belakangan ini. Saya akan menyimpannya di sini! Mungkin beberapa di antara kalian ada yang ingin tahu cara kerja Blogger Thread Comment Hack ini:

// No attribution. Who created this???
// Strongest possible source: http://www.vnblogspot.com/2011/12/comment-phan-cap-cho-blogger.html
var Cur_Url_ThreadCM = window.location.href;
var Cm_Block = document.getElementById('cm_block');
var Cm_Block_Content = Cm_Block.innerHTML;
var Cm_Item_Id = [];
var Cm_Item_Content = [];
var Cm_Item_Level = [];
var Cm_Num = 0;
var Cm_Item_Id_T = '';
var Cm_Item_Content_T = '';
var Cm_Item_Level_T = '';
var i = 0;
var j = 0;
var k = 0;
var h = 0;
var strout = '';
var str_t1 = "";
var str_t2 = "";

function getInternetExplorerVersion() {
var rv = -1;
if (navigator.appName == 'Microsoft Internet Explorer') {
var ua = navigator.userAgent;
var re = new RegExp("MSIE ([0-9]{1,}[.0-9]{0,})");
if (re.exec(ua) != null) rv = parseFloat(RegExp.$1);
}
return rv;
}
var IE_ver = getInternetExplorerVersion();
if (IE_ver == -1 || IE_ver >= 9) {
while (Cm_Block_Content.indexOf('id="c') != -1) {
i = Cm_Block_Content.indexOf('id="c');
Cm_Block_Content = Cm_Block_Content.substring(i + 4);
i = Cm_Block_Content.indexOf('"');
Cm_Item_Id[Cm_Num] = Cm_Block_Content.substring(0, i);
Cm_Block_Content = Cm_Block_Content.substring(i);
Cm_Item_Content[Cm_Num] = document.getElementById(Cm_Item_Id[Cm_Num]).innerHTML;
Cm_Item_Level[Cm_Num] = 0;
Cm_Num++;
}
for (i = 0; i < Cm_Num - 1; i++) {
for (j = i + 1; j < Cm_Num; j++) {
if (Cm_Item_Content[j].indexOf(Cm_Item_Id[i]) != -1) {
Cm_Item_Id_T = Cm_Item_Id[j];
Cm_Item_Content_T = Cm_Item_Content[j];
Cm_Item_Level[j] = Cm_Item_Level[i] + 1;
Cm_Item_Level_T = Cm_Item_Level[j];
for (h = i + 1; h < j; h++) {
if (Cm_Item_Level[h] < Cm_Item_Level_T) {
break;
}
}
for (k = j; k > h; k = k - 1) {
Cm_Item_Id[k] = Cm_Item_Id[k - 1];
Cm_Item_Content[k] = Cm_Item_Content[k - 1];
Cm_Item_Level[k] = Cm_Item_Level[k - 1];
}
Cm_Item_Id[h] = Cm_Item_Id_T;
Cm_Item_Content[h] = Cm_Item_Content_T;
Cm_Item_Level[h] = Cm_Item_Level_T;
}
}
}
for (i = 0; i < Cm_Num; i++) {
j = Cm_Item_Content[i].indexOf('@<a href="#c');
if (j != -1) {
str_t1 = Cm_Item_Content[i].substring(0, j);
str_t2 = Cm_Item_Content[i].substring(j + 1);
j = str_t2.indexOf('</a>');
str_t2 = str_t2.substring(j + 4);
Cm_Item_Content[i] = str_t1 + str_t2;
}
j = Cm_Item_Content[i].indexOf('class="cm_wrap"');
if (j != -1) {
str_t1 = Cm_Item_Content[i].substring(0, j);
str_t2 = Cm_Item_Content[i].substring(j);
if (Cm_Item_Level[i] > 6) Cm_Item_Level[i] = 6;
Cm_Item_Content[i] = str_t1 + 'style="width:' + (100 - Cm_Item_Level[i] * 5) + '%" ' + str_t2;
}
strout += Cm_Item_Content[i];
}
strout += '<div class="clear"></div>';
Cm_Block.innerHTML = strout;
Cm_Block.style.display = 'block';
var Cm_Total_Obj = document.getElementById('cm_total').innerHTML;
var Cm_Total = parseInt(Cm_Total_Obj);
if (Cm_Total > 200) {
strout = '<div style="float:left">Page ';
var Cm_Page_Num = (Cm_Total - Cm_Total % 200) / 200 + 1;
var Org_Url_ThreadCM = '';
var Cm_Cur_Page = 1;
i = Cur_Url_ThreadCM.indexOf('.html');
if (i != -1) {
Org_Url_ThreadCM = Cur_Url_ThreadCM.substring(0, i + 5);
} else {
Org_Url_ThreadCM = Cur_Url_ThreadCM;
}
i = Org_Url_ThreadCM.indexOf('#comments');
if (i != -1) {
Org_Url_ThreadCM = Org_Url_ThreadCM.substring(0, i);
}
i = Cur_Url_ThreadCM.indexOf('?commentPage=');
if (i == -1) {
Cm_Cur_Page = 1;
} else {
Cm_Cur_Page = parseInt(Cur_Url_ThreadCM.substring(i + 13));
}
for (i = 1; i <= Cm_Page_Num; i++) {
if (i == Cm_Cur_Page) {
strout += '<span>' + i + '</span>';
} else {
strout += '<a href="' + Org_Url_ThreadCM + '?commentPage=' + i + '#comments">' + i + '</a>';
}
}
if (Cm_Cur_Page * 200 <= Cm_Total) {
strout += '</div><div style="float:right">' + (((Cm_Cur_Page - 1) * 200) + 1) + ' - ' + (Cm_Cur_Page * 200) + ' of ' + Cm_Total + ' comments</div>';
} else {
strout += '</div><div style="float:right">' + (((Cm_Cur_Page - 1) * 200) + 1) + ' - ' + Cm_Total + ' of ' + Cm_Total + ' comments</div>';
}
var Cm_Page_Obj = document.getElementById('cm_page');
Cm_Page_Obj.innerHTML = strout;
Cm_Page_Obj = document.getElementById('cm_page_copy');
Cm_Page_Obj.innerHTML = strout;
if (Cm_Cur_Page < Cm_Page_Num) {
strout = '<style type="text/css">.cm_author_reply {display: none}</style>';
var Cm_ReplyCSS_Obj = document.getElementById('cm_reply_css');
Cm_ReplyCSS_Obj.innerHTML = strout;
}
}
} else {
while (Cm_Block_Content.indexOf('id=c') != -1) {
i = Cm_Block_Content.indexOf('id=c');
Cm_Block_Content = Cm_Block_Content.substring(i + 3);
i = Cm_Block_Content.indexOf('>');
Cm_Item_Id[Cm_Num] = Cm_Block_Content.substring(0, i);
Cm_Block_Content = Cm_Block_Content.substring(i);
Cm_Item_Content[Cm_Num] = document.getElementById(Cm_Item_Id[Cm_Num]).innerHTML;
Cm_Item_Level[Cm_Num] = 0;
Cm_Num++;
}
for (i = 0; i < Cm_Num - 1; i++) {
for (j = i + 1; j < Cm_Num; j++) {
if (Cm_Item_Content[j].indexOf(Cm_Item_Id[i]) != -1) {
Cm_Item_Id_T = Cm_Item_Id[j];
Cm_Item_Content_T = Cm_Item_Content[j];
Cm_Item_Level[j] = Cm_Item_Level[i] + 1;
Cm_Item_Level_T = Cm_Item_Level[j];
for (h = i + 1; h < j; h++) {
if (Cm_Item_Level[h] < Cm_Item_Level_T) {
break;
}
}
for (k = j; k > h; k = k - 1) {
Cm_Item_Id[k] = Cm_Item_Id[k - 1];
Cm_Item_Content[k] = Cm_Item_Content[k - 1];
Cm_Item_Level[k] = Cm_Item_Level[k - 1];
}
Cm_Item_Id[h] = Cm_Item_Id_T;
Cm_Item_Content[h] = Cm_Item_Content_T;
Cm_Item_Level[h] = Cm_Item_Level_T;
}
}
}
for (i = 0; i < Cm_Num; i++) {
j = Cm_Item_Content[i].indexOf('@<A href="#c');
if (j != -1) {
str_t1 = Cm_Item_Content[i].substring(0, j);
str_t2 = Cm_Item_Content[i].substring(j + 1);
j = str_t2.indexOf('</A>');
str_t2 = str_t2.substring(j + 4);
Cm_Item_Content[i] = str_t1 + str_t2;
}
j = Cm_Item_Content[i].indexOf('class=cm_wrap');
if (j != -1) {
str_t1 = Cm_Item_Content[i].substring(0, j);
str_t2 = Cm_Item_Content[i].substring(j);
if (Cm_Item_Level[i] > 6) Cm_Item_Level[i] = 6;
Cm_Item_Content[i] = str_t1 + 'style="width:' + (100 - Cm_Item_Level[i] * 5) + '%" ' + str_t2;
}
strout += Cm_Item_Content[i];
}
strout += '<div class="clear"></div>';
Cm_Block.innerHTML = strout;
Cm_Block.style.display = 'block';
var Cm_Total_Obj = document.getElementById('cm_total').innerHTML;
var Cm_Total = parseInt(Cm_Total_Obj);
if (Cm_Total > 200) {
strout = '<div style="float:left">Page ';
var Cm_Page_Num = (Cm_Total - Cm_Total % 200) / 200 + 1;
var Org_Url_ThreadCM = '';
var Cm_Cur_Page = 1;
i = Cur_Url_ThreadCM.indexOf('.html');
if (i != -1) {
Org_Url_ThreadCM = Cur_Url_ThreadCM.substring(0, i + 5);
} else {
Org_Url_ThreadCM = Cur_Url_ThreadCM;
}
i = Org_Url_ThreadCM.indexOf('#comments');
if (i != -1) {
Org_Url_ThreadCM = Org_Url_ThreadCM.substring(0, i);
}
i = Cur_Url_ThreadCM.indexOf('?commentPage=');
if (i == -1) {
Cm_Cur_Page = 1;
} else {
Cm_Cur_Page = parseInt(Cur_Url_ThreadCM.substring(i + 13));
}
for (i = 1; i <= Cm_Page_Num; i++) {
if (i == Cm_Cur_Page) {
strout += '<span>' + i + '</span>';
} else {
strout += '<a href="' + Org_Url_ThreadCM + '?commentPage=' + i + '#comments">' + i + '</a>';
}
}
if (Cm_Cur_Page * 200 <= Cm_Total) {
strout += '</div><div style="float:right">' + (((Cm_Cur_Page - 1) * 200) + 1) + ' - ' + (Cm_Cur_Page * 200) + ' of ' + Cm_Total + ' comments</div>';
} else {
strout += '</div><div style="float:right">' + (((Cm_Cur_Page - 1) * 200) + 1) + ' - ' + Cm_Total + ' of ' + Cm_Total + ' comments</div>';
}
var Cm_Page_Obj = document.getElementById('cm_page');
Cm_Page_Obj.innerHTML = strout;
Cm_Page_Obj = document.getElementById('cm_page_copy');
Cm_Page_Obj.innerHTML = strout;
if (Cm_Cur_Page < Cm_Page_Num) {
strout = '<style type="text/css">.cm_author_reply {display: none}</style>';
var Cm_ReplyCSS_Obj = document.getElementById('cm_reply_css');
Cm_ReplyCSS_Obj.innerHTML = strout;
}
}
}

Format Formulir Komentar di Atas Daftar Komentar

Posting ini sudah kadaluarsa

Format Formulir Komentar di Atas Daftar Komentar
Membuat formulir komentar blog terletak di bagian atas dimana semua daftar komentar berada di bawahnya.

Saya sudah mencoba ini pada salah satu template Blogger standar dan berhasil melakukanya dengan lancar.

Pertama-tama masuklah ke menu Template kemudian klik Edit HTML dan klik Lanjutkan. Cek Expand Template Widget agar seluruh elemen pembangun posting tampil:

Edit HTML Blogger
Mengedit HTML

Temukan kode yang kurang lebih tampak seperti ini:

<p class='comment-footer'>
<b:if cond='data:post.allowNewComments'>
<b:include data='post' name='threaded-comment-form'/>
<b:else/>
<data:post.noNewCommentsText/>
</b:if>
</p>

Potong semua kode itu lalu gulung editor HTML template Anda ke atas perlahan-lahan sampai Anda menemukan kode ini:

<div class='comments' id='comments'>

Letakkan kode yang baru saja Anda potong tepat di bawahnya dan simpan perubahan yang Anda lakukan.

Jika tidak berhasil atau tidak menemukan kode yang terlihat di atas, mungkin itu karena Anda sedang memakai template versi lama. Untuk template versi lama, kodenya akan tampak kurang lebih seperti ini:

<p class='comment-footer'>
<b:if cond='data:post.embedCommentForm'>
<b:if cond='data:post.allowNewComments'>
<b:include data='post' name='comment-form'/>
<b:else/>
<data:post.noNewCommentsText/>
</b:if>
<b:else/>
<b:if cond='data:post.allowComments'>
<a expr:href='data:post.addCommentUrl' expr:onclick='data:post.addCommentOnclick'><data:postCommentMsg/></a>
</b:if>
</b:if>
</p>

Potong semua kode itu lalu gulung editor HTML template Anda ke atas perlahan-lahan sampai Anda menemukan kode ini:

<div class='comments' id='comments'>

Letakkan kode yang baru saja Anda potong tepat di bawahnya dan simpan perubahan yang Anda lakukan.

Seharusnya ini berhasil.

Kamis, 22 Maret 2012

Emoticon Blogger Otomatis dengan JQuery

JQuery Auto Emoticons for Blogger
Emoticon otomatis untuk komentar Blogger

Saya baru memutuskan bahwa eksperimen ini telah berhasil sekitar satu hari yang lalu (sepertinya begitu). Ini adalah fasilitas emoticon otomatis yang akan mengubah simbol-simbol seperti :), :(, dan yang lainnya menjadi gambar tertentu yang telah ditentukan. Saya menggunakan JQuery karena mungkin konsep emoticon dengan JQuery belum ada. Dan juga, lagipula Saya belum begitu berbakat untuk menuliskan kode dengan JavaScript metah. Meskipun di luar sana sudah ada beberapa tutorial sejenis misalnya Add Yahoo Smiley Emoticons on Blogger Comment, tapi Saya hanya ingin memberikan sesuatu yang sedikit berbeda dan dengan proses instalasi yang sangat mudah.

Untuk membuatnya, pertama-tama masuklah ke menu Template kemudian klik Edit HTML dan klik Lanjutkan:

Edit HTML Blogger
Mengedit HTML

Temukan kode ini:

</body>

Salin kode di bawah ini dan letakkan di atasnya:

<style type='text/css'>
.emoWrap {
background-color:#EEDE86;
border:2px solid #D3BA59;
padding:10px 14px;
color:black;
font:normal bold 12px/normal Tahoma,Verdana,Arial,Sans-Serif;
text-align:center;
}

.emo,
.emoKey {
display:inline-block; /* Penting! */
*display:inline;
vertical-align:middle;
}

.emoKey {
border:1px solid #ccc;
background-color:white;
font:normal bold 11px/normal Arial,Sans-Serif;
padding:1px 2px;
margin:0 0 0 2px;
color:black;
}
</style>
<script src='http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js' type='text/javascript'></script>
<script type='text/javascript'>
//<![CDATA[
var emoRange = "#comments p, div.emoWrap",
putEmoAbove = "#comment-editor",
emoMessage = "Untuk menyisipkan emoticon setidaknya Anda harus menambahkan satu spasi di awal simbol.";
//]]>
</script>
<script src='http://reader-download.googlecode.com/svn/trunk/jquery.autoemoticons.js' type='text/javascript'></script>

Klik Simpan Template dan lihat hasilnya.

Kode yang Saya beri garis bawah adalah JQuery. Jika template Anda sudah dilengkapi dengan JQuery, singkirkan kode tersebut!


Lebih Jauh Lagi

Di situ terdapat setidaknya tiga variabel untuk pengaturan lanjutan:

  • emoRange digunakan untuk menentukan daerah mana saja yang akan dikenai manipulasi ini. Pada opsi di atas Saya menargetkan manipulasi pada elemen p yang berada di dalam elemen #comments dan juga pada elemen baris emoticon utama. Anda juga bisa menargetkannya pada elemen lain, misalnya pada posting. Untuk memberlakukan manipulasi ini pada posting, cukup tambahkan selektor .post-body pada variabel tersebut dengan memisahkannya menggunakan tanda koma.
  • putEmoAbove digunakan untuk menentukan di mana (di atas elemen apa) JQuery harus meletakkan daftar emoticon. Di sini Saya menuliskan nilainya pada #comment-editor untuk meletakkannya tepat di atas formulir komentar. Terkadang mungkin ini tidak berhasil. Anda harus mencoba untuk mengubahnya dengan div.comment-replybox-thread atau yang lainnya sebagai elemen sasaran. Intinya adalah, carilah elemen formulir komentar pada blog Anda dan temukan ID atau kelasnya sebagai petunjuk peletakkan daftar emoticon.
  • emoMessage digunakan untuk menentukan pesan yang akan muncul saat pertama kali pengunjung mengeklik salah satu emoticon. Anda bisa mengubah pesan itu sesuka hati.

Bagaimana Manipulasi ini Bekerja?

Pada dasarnya Saya hanya menggunakan regex sederhana untuk mencari format teks tertentu. Dan dengan menggunakan fungsi .replace() Saya mengubah setiap susunan karakter yang cocok dengan elemen <img> dengan alamat gambar tertentu.

Sebagai contoh, Saya akan mengubah teks :) menjadi <img src='smile.gif'>. Maka yang Saya butuhkan hanyalah dua buah fungsi JQuery yaitu .html() untuk menyalin dokumen dan .replace() untuk mengubah teks/karakter tertentu di dalam dokumen:

$('body').html($('body').html().replace(/\s:\)/g, " <img src='smile.gif' />"));

Kode di atas akan mengubah semua karakter dengan format “satu spasi di depan + simbol :)” menjadi elemen <img src='smile.gif'>.

Dalam regular expression, karakter spasi diwakili dengan simbol \s. Dan juga, karena simbol ) merupakan salah satu karakter khusus dalam regex, oleh karena itu kita harus menonaktifkan karakter tersebut dengan cara menuliskan karakter \ di depannya, dengan begitu komputer tidak akan membaca karakter tersebut sebagai fungsi, melainkan sebagai teks biasa.

g adalah global, artinya bahwa fungsi ini akan mencari semua karakter yang cocok tanpa terkecuali kemudian dia akan mengubahnya menjadi elemen gambar.

Dalam forum-forum tertentu mungkin Anda juga akan melihat peraturan yang berbeda untuk menyisipkan gambar, misalnya seperti ini:

[img]emoticon.gif[/img]

Tidak ada perbedaan dengan semua itu. Pada dasarnya kita lah yang membuat peraturan. Dalam metode penyisipan emoticon yang ke dua, Anda harus mengubah baris karakter tersebut menjadi elemen <img> dengan nilai src berupa teks yang berada di antara simbol [img]...[/img].

Dalam JQuery kita bisa menuliskannya seperti ini:

$('body').html(
$('body').html()
.replace(/\[img\]/g, "<img src='")
.replace(/\[\/img\]/g, "' />")
);

Rabu, 21 Maret 2012

Slideshow Otomatis Blogger dengan TinyCarousel (Custom)

Custom TinyCarousel for Blogger

Menjawab permintaan dari It's a Hardlife, Saya mencoba untuk memodifikasi JQuery Carousel yang sederhana karena slideshow versi Agile Carousel itu terlalu rumit. Saya mengambil TinyCarousel sebagai bahan utama, yang pada awalnya hanya berupa slideshow gambar biasa untuk dimodifikasi lagi sesuai dengan tipografi slideshow Agile Carousel sehingga setiap slide menjadi lebih kaya akan konten:


Tahap 1: Mengedit Template

Untuk membuatnya, pertama-tama masuklah ke menu Template kemudian klik Edit HTML dan klik Lanjutkan:

Edit HTML Blogger
Mengedit HTML

Temukan kode ini:

]]></b:skin>

Salin kode di bawah ini, kemudian letakkan di atasnya:

/**
* Custom TinyCarousel by Taufik Nurrohman
* Visit:http://hompimpaalaihumgambreng.blogspot.com
*/

#tinycarousel {
width:532px; /* Lebar Slideshow */
height:1%;
overflow:hidden;
font:normal 10px/12px Arial,Sans-Serif;
color:#666;
margin:30px auto;
}

#tinycarousel .viewport {
height:336px;
overflow:hidden;
position:relative;
background-color:#eee;
border:1px solid #ccc;
}

#tinycarousel ul.overview {
list-style:none !important;
position:absolute;
padding:0 0 !important;
margin:0 0 !important;
width:240px;
left:0;
top:0;
}

#tinycarousel ul.overview li {
list-style:none !important;
float:left;
margin:5px 0 5px 5px !important;
padding:0 0 !important;
height:auto !important;
width:168px; /* Lebar satu unit slide */
background-color:white;
color:#666;
border:1px solid #ccc;
}

#tinycarousel .inner {
margin:10px;
height:260px;
overflow:hidden;
}

#tinycarousel img {
width:auto;
height:170px;
border:none;
outline:none;
padding:0 0;
margin:0 0;
-webkit-box-shadow:none;
-moz-box-shadow:none;
box-shadow:none;
}

#tinycarousel h6 {
border-top:1px solid #ddd;
font:normal bold 11px/12px Verdana,Tahoma,Arial,Sans-Serif;
color:#39f;
margin:9px 0 5px;
padding:10px 0 0;
background:none;
overflow:hidden;
}

#tinycarousel h6 a {
color:inherit;
text-decoration:none;
border:none;
}

#tinycarousel p {
margin:0 0;
padding:0 0;
overflow:hidden;
}

#tinycarousel em {
font-style:normal;
color:#aaa;
background-color:#333;
background-image:-webkit-linear-gradient(top,#555,#333);
background-image:-moz-linear-gradient(top,#555,#333);
background-image:-ms-linear-gradient(top,#555,#333);
background-image:-o-linear-gradient(top,#555,#333);
background-image:linear-gradient(top,#555,#333);
display:block;
padding:5px 10px;
margin:0 0;
}

#tinyarrow {
display:block;
background-color:white;
border:1px solid #ccc;
padding:5px;
margin:2px 0 0;
overflow:hidden;
}

#tinyarrow .buttons {
background-color:#666;
border:none;
outline:none;
display:block;
padding:2px 5px;
overflow:hidden;
position:relative;
float:left;
margin:0 1px;
color:white;
text-decoration:none;
font-weight:bold;
}

#tinyarrow .disable {display:none}

#tinyarrow .buttons:active {
background-color:#900;
position:relative;
top:1px;
}

#tinyarrow span {
float:right;
font:normal bold 11px/12px Tahoma,Verdana,Arial,Sans-Serif;
margin:2px 5px 0 0;
}

/*
* Orientasi Vertikal
* CSS diatur secara manual pada versi aslinya
* tapi di sini semuanya sudah cukup teratur
*/
#tinycarousel.vertical {width:242px}
#tinycarousel.vertical ul.overview li {
float:none;
display:block;
width:228px;
margin:5px auto 10px !important;
}

#tinycarousel.vertical img {
width:100%;
height:auto;
}

Kemudian temukan kode ini:

</head>

Salin kode di bawah ini kemudian letakkan di atasnya:

<script src='http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js' type='text/javascript'></script>
<script type='text/javascript'>
//<![CDATA[
$(document).ready(function(){
$('#tinycarousel').tinycarousel({
start : 1,
display : 1,
axis : 'x',
interval : false,
intervaltime: 3000,
animation : true,
duration : 1000,
callback : null
});
});
//]]>
</script>
<script src='http://reader-download.googlecode.com/svn/trunk/jquery.tinycarousel-custom.js' type='text/javascript'></script>

Kode yang Saya beri garis bawah adalah JQuery. Jika template Anda sudah dilengkapi dengan JQuery, singkirkan kode tersebut!

Tahap 2: Meletakkan Slideshow

Masuklah ke menu Tata Letak kemudian tambahkan sebuah elemen halaman HTML/JavaScript yang terletak di bagian atas posting:

Menambahkan Widget
Menambahkan widget

Salin kode di bawah ini kemudian letakkan di dalam formulirnya:

<script type="text/javascript">
var showPostDate_g = true,
showComm_g = true,
slideOpenNewTab = true,
idMode = true,
slidebyLabels = false,
slideLabelName = "Mengenai",
pBlank = "http://2.bp.blogspot.com/-11FkySHGB5Y/TpZ6SSbsF2I/AAAAAAAAA94/zK10UaL7jgo/s1600/images.jpeg",
text = "Komentar",
numposts_g = 7,
numchars_g = 100,
showText = "Menampilkan",
postText = "Posting",
tinyprevNav = "&lt;",
tinynextNav = "&gt;",
home_page = "http://nama_blog.blogspot.com";
</script>
<script src="http://reader-download.googlecode.com/svn/trunk/autoContent4TinyCarousel.js" type="text/javascript"></script>

Ganti URL http://nama_blog.blogspot.com dengan alamat blog Anda lalu klik Simpan Template.


Konfigurasi Slideshow - JSON & Custom TinyCarousel

Pengaturan JSON - Auto Content Slider

OpsiKeterangan
showPostDate_gJika bernilai true, bulan terbit artikel akan ditampilkan. Jika bernilai false, bulan terbit artikel akan disembunyikan.
slideOpenNewTabJika bernilai true, setiap tautan akan terbuka di tab/jendela baru. Jika bernilai false, setiap tautan akan terbuka di tab/jendela yang sama.
idModeJika bernilai true, sistem penanggalan akan berubah menjadi berbahasa Indonesia. Jika bernilai false, sistem penanggalan akan berubah menjadi berbahasa Inggris.
slidebyLabelsUbah nilainya menjadi true jika ingin menampilkan daftar slide artikel dengan label yang spesifik. Setelah itu tentukan nama label pada variabel slideLabelName.
slideLabelNameDigunakan untuk menentukan nama label yang spesifik setelah mengubah nilai slidebyLabels menjadi true.
pBlankAdalah gambar cadangan yang akan ditampilkan jika artikel tidak memiliki gambar.
textDigunakan untuk menentukan label jumlah komentar (contoh: 7 Komentar).
numposts_gDigunakan untuk menentukan jumlah slide.
numchars_gDigunakan untuk menentukan jumlah karakter ringkasan artikel.
showText & postTextDigunakan untuk mengubah teks "Menampilkan" N "Posting".
tinyprevNavDigunakan untuk menentukan simbol navigasi mundur pada slideshow.
tinynextNavDigunakan untuk menentukan simbol navigasi maju pada slideshow.
home_pageURL blog Anda.

Konfigurasi Slideshow

Terdapat beberapa konfigurasi standar yang sangat umum dijumpai pada plugin animasi JQuery. Yaitu kecepatan, delay, opsi animasi otomatis dan hal-hal umum lainnya:


OpsiNilaiKeterangan
start1, 2, 3, ... (urutan)Digunakan untuk menentukan slide nomor ke berapa yang akan tampil terlebih dulu saat halaman dikunjungi.
display1, 2, 3, ... (jumlah)Digunakan untuk menentukan berapa banyak slide yang akan bergeser dalam sekali klik navigasi/sekali animasi.
axis'x'Nilai 'x' akan membuat orientasi slideshow menjadi horizontal, nilai 'y' akan membuat orientasi slideshow menjadi vertikal.
'y'
intervaltrueNilai true akan membuat slideshow bergerak secara otomatis, nilai false akan membuat slideshow mati dan hanya bisa bergerak jika Anda mengeklik tombol navigasi.
false
intervaltime500, 3000, ... (kecepatan)Digunakan untuk menentukan lama waktu slide berhenti diantara animasi (hanya berlaku untuk animasi otomatis).
animationtrueNilai true akan membuat slideshow bergerak dengan efek animasi, nilai false akan membuat slideshow bergerak kaku dan tampak meloncat.
false
duration500, 3000, ... (kecepatan)Digunakan untuk menentukan kecepatan animasi perpindahan slide.
callbacknullDigunakan untuk menerapkan fungsi tambahan yang akan dieksekusi setiap kali slide berpindah.
function() { ... }

Contoh Konfigurasi Animasi Otomatis

$('#tinycarousel').tinycarousel({
start : 1,
display : 1,
axis : 'x',
interval : true,
intervaltime: 3000,
animation : true,
duration : 1000,
callback : null
});

Contoh Konfigurasi Orientasi Vertikal

$('#tinycarousel').tinycarousel({
start : 1,
display : 1,
axis : 'y',
interval : true,
intervaltime: 3000,
animation : true,
duration : 1000,
callback : null
});

Contoh Konfigurasi Menggeser Slide 3 Buah/Klik Navigasi

$('#tinycarousel').tinycarousel({
start : 1,
display : 3,
axis : 'x',
interval : false,
intervaltime: 3000,
animation : true,
duration : 1000,
callback : null
});