顯示具有 myBlogWidget 標籤的文章。 顯示所有文章
顯示具有 myBlogWidget 標籤的文章。 顯示所有文章

2009年4月23日 星期四

HSL 色彩空間的視覺效果

接下來的『相關度』和『標籤雲』都會加上 HSL 的方式來處理顏色。在改版發表之前, 可以到我的『HSL 測試頁』先體驗一下。

image 
一般的作法 線性內差 得到的『色彩漸層』中間的部分常常是 灰色
image
但是, 在 HSL 色彩空間 得到的卻是彩虹般的『紅橙黃綠藍』

.

HSL 色彩空間的注意事項

  • 設定的 minColor, maxColor 還是以 RGB 表示的
  • 直接從 .colorHSL = 0, 1, 2 選一個滿意的『視覺效果』就可以了

簡單吧 !!

.

.

好奇寶寶分隔線

是的, 使用者只需要以 RGB 來設定顏色, 程式內部會自動換算 RGB 到 HSL,

如果你還是好奇, 希望以下這些『應用面的觀念』可以幫助進一步了解 ……

  • HSL 和 RGB 色彩空間 (色座標) 有何不同?
  • HSL 和 RGB 色彩空間 為何會影響『視覺效果』?
  • HSL 色彩空間的其他細節

.

最後, 才是給程式設計者的參考資料:

  • HSL 的程式設計參考資料

.

HSL 和 RGB 色彩空間的不同

RGB 色彩空間

  • R : Red = 紅色
  • G : Green = 綠色
  • B : Blue = 藍色

image

類似『直角座標』的方式 

HSL 色彩空間

  • H : hue= 色相
  • S : saturation = 飽和度
  • L : lightness = 亮度

 image

類似『極座標』的方式

此外, 還有和 HSL 類似的 HSV (色相 hue, 飽和度 saturation, 明度 value), 詳情請看  :

096_K書

.

HSL 和 RGB 色彩空間的視覺效果

image 
一般的作法從 青色 RGB=#00FFFF 線性內差到 紅色 #FF0000, 得到的『色彩漸層』中間的部分是 灰色 #808080
image
但是, 在 HSL 色彩空間 得到的卻是彩虹般的『紅橙黃綠藍』

下面的圖示可以幫助理解,

  • 路徑 0 : 一般 RGB 的作法, 兩個顏色的內差路徑常常會經過中間灰色的部份

 

  • 路徑 1 : HSL 色彩空間, 使用角度來表示 hue (色相), 所以內差路徑會呈現『弧線』或 『螺旋線』, 而經過比較多的顏色
  • 路徑 2 : HSL 採用 極座標系統, 所以同樣兩個顏色之間的內差路徑可以有兩個方向

 

image 099_鞭

HSL 色彩空間, 使用角度來表示 hue (色相)

  • R : Red = 紅色 (0度)
  • G : Green = 綠色 (120度)
  • B : Blue = 藍色 (240度)
  • Y:Yellow = 黃色 (60度)
  • C:Cyan = 青色 /青綠色 (180度)
  • M:Magenta = 洋紅色 / 品紅色 (300度)

.

把對應的 RGB 變化也一起畫出來 (在 HSL 測試頁 可以自己輸入顏色)

image
0: 傳統 RGB 運算方式

(左圖)
在簡單的線性內差之下, RGB 一起變化, 產生的視覺效果並不理想


(下左, 下圖)
經過 HSL 的換算之後, RGB 依序變化, 就變得非常精彩 
image
1: HSL不跨過0度
image
2: HSL 經過0度 (紅/紫色)

.

HSL 色彩空間的其他細節

還有一些細節, 不見得每個人都會遇到, 下面先簡單帶過, 建議到我的『HSL 測試頁』去『實際體驗』一下, 會更有感覺, 或是隨時提出來討論

擔心被搞混的人, 就不一定要往下看囉~~

項目

測試參數

  • HSL 採用 極座標系統, 所以同樣兩個顏色之間的內差路徑可以有兩個方向, 目前的定義是
    • 1: HSL 內差路徑不跨過0度
    • 2: HSL 內差路徑經過0度 (紅/紫色)
    • 0: 傳統 RGB 運算方式

任意兩個顏色, 觀察 0, 1, 2 的不同
  • 紅色 (0度) 附近的 紅偏橙 #FFxx00 和 紅偏紫 #FF00xx, 可以產生出不一樣的效果
  • maxColor = (255, 1, 0) 或 (255, 0, 1), 搭配任意的 minColor
  • maxColor = (255, 1, 0), minColor = (255, 0, 1), 或對調
  • 非常接近的灰色 (或黑色), 可以因為 hue (色相) 的不同, 而有不同的效果
  • 任意顏色, 搭配 (33, 32, 32), (32, 33, 32), (32, 32, 33), (33, 33, 32) 或其他不同的灰/黑色

.

HSL 的程式設計參考資料


之前在處理『相關度』和『標籤雲』的顏色時, 就在思考如何呈現出 更理想的『色彩漸層』

當時所使用的方法, 效果雖然還不錯, 但設定上比較麻煩, 也不容易理解。

所以, 除了 依相關度排序的『相關文章』功能 提到 optionRGB = […] 之外, 並沒有做太多的介紹。

這些程式, 都還沒有使用 HSL 色彩空間 來處理顏色

.

後來, 有機會和『標籤文章選台器』的作者 LVCHEN 討論到這方面的問題, 提到或許可以將 色座標改用 HSL (色調,飽和度,亮度), 又不約而同找到類似的 RGB <=> HSL 轉換程式 ……

現在, 在我的程式裡看到的是『改寫的 RGB <=> HSL 轉換函數』, 產生的 HSL 只適合程式內部使用。如果要用作其他用途, 建議還是參考下面的『原出處』:

.

另外, HSL 測試頁 還用到了 JavaScript Vectorgraphics Library 來繪圖

.


(...繼續閱讀.../...CONTINUE...)

2008年12月15日 星期一

Eucaly61 的 新版型 ---- 究竟『換湯』還是『換藥』?

每個人換新模版的狀況都不盡相同, 有人換得很順, 有人卻需要 砍掉重練 ....

至於我, 換模版不到兩天, 就發現有些功能的相容性太難追溯, 不如回復成原來的模版, 再設法把外觀換掉, 來個『換湯不換藥』(只改外觀) 還比較有把握

前一篇介紹了『更換模版的參考資料』, 接下來說明改版的特色和過程

『換湯不換藥』的改版特色 :

  • TicTac 只改外觀, 變得和 Gadget 2.0 幾乎一樣
  • 色塊 來區隔標題, 並且不使用外部圖形, (參考 羊男 Gadget 2.0, )
  • 拿掉標題圖片, 縮小標題的總高度
  • 增加內文副標題 (h3, h4, h5) 的辨識度
  • 暫時維持兩欄式的自動欄寬
  • 自動隱藏 NaviBar, (同樣參考 羊男 Gadget 2.0)
  • 在最左邊加了『導覽列』的新功能

.

改版的過程 :

  • 原本打算從 Blogger 內建的 DenimRounders 選一個, 或者是綜合它們的特點
  • 真的嘗試的則是 羊男 Gadget 2.0 和 我的配色
  • 接下來陷入了『換湯兼換藥』v.s.『換湯不換藥』的抉擇
  • 另一個傷腦筋的問題是『側邊欄的寬度』和元件的排列方式
  • 最後還是決定 回復成原來的模版, 來個『換湯不換藥』(只改外觀)
  • 暫時維持兩欄式的自動欄寬, 稍後再決定要不要變成跨欄三欄式
  • 在最左邊加了『導覽列』的新功能

.

Blogger 內建的 DenimRounders

幾個月前, 很想效法某網友的版型, 但一直沒付諸行動, 這一拖居然連網址都忘了記錄在哪裡, (果然,『排好的事就要去做』), 所以只好另起爐灶。

這次, 原本打算從 Blogger 內建的 DenimRounders 選一個, 或者是綜合它們的特點 ---- Denim 用『色塊』來區隔標題, 而 Roundes 則是用『虛線』來區隔, (至於圓角倒不是我要的重點)。

不過, 這兩個模版都沒有真的拿來套用。

Denim

Rounders

2008-12-14_235945
2008-12-15_000607
2008-12-15_000135
 
2008-12-15_000839

.

羊男的 Gadget 2.0 和 我的配色

接著, 看到了羊男『進階三欄式』的 Gadget 2.0, 因為底下的特點, 就決定要使用了。

  • 兩欄/三欄互通
  • 不需使用外部圖形, (除了 Blogger 內定的 郵件/鉛筆 等)
  • 用『色塊』來區隔標題
  • 內建自動隱藏 NaviBar,
  • 內建繼續閱讀 <span class="fullpost">
  • 在 Archive 頁面與 Label 頁面當中,文章會自動收合成到剩下標題的模樣

其中『進階三欄式』指的是側邊欄的最上方有『橫欄』可以擺放寬度較寬的物件, 分成兩個側邊欄之後, 最後再收為一個欄位

如果不在跨欄內放入任何網頁元素, 就會變成單純的『三欄式』。或是只使用跨欄而成為『二欄式』, 這就達到了『兩欄/三欄互通』。
2-3

 

再來是修改配色和字體, 在 colorschemer (http://www.colorschemer.com/online.html) 配出右邊的 16 色,

字體則盡量改為原本習慣的大小 ....

2008-12-11_223851

.

換湯兼換藥』v.s.『換湯不換藥』的抉擇

換了 Gadget 2.0 之後, 兩天下來, 完成了配色, 和大部份字體大小的調整, 卻發現有些功能的相容性太難追溯, 例如: 內嵌式的留言功能。既使把程式碼從舊模版複製到新模版, 內嵌式的留言功能還是無法使用。於是, 在繼續投入時間除錯之前, 我開始思考『新模版的風險與必要性』。

所以, 就陷入了『換湯兼換藥』v.s.『換湯不換藥』的抉擇。

Gadget 2.0 調整字體及配色之後 原本的 Gadget 2.0
2008-12-15_002056-25
2008-12-15_002439
2008-12-15_002949-25

.

側邊欄的寬度和元件的排列方式

另外還有一個讓我猶豫不決的理由, 原本版型的『自動寬度』, 是不是變成三欄之後也還要使用自動寛度呢?

  總寬度 主欄 側邊欄
原本的二欄式 750~950 73% (547~693) 27% (202~256)
轉換成三欄 950~1200 58% (550~696) 21% 兩個(200~252)
羊男三欄式   550 125 + 175

實際使用三欄式之後, 發現羊男設定的 550 + 125 + 175 不大符合我的習慣, 但一時又調不出適當的三欄寬度。

  • 希望的主欄寬度是 600~650px 左右,
  • 側邊欄則是 200~250px 比較理想,
  • 加起來至少有 600 + 200 + 200 = 1000px, 再考慮瀏覽器的邊框和捲軸, 1024 的螢幕剛好有點不夠。再打開瀏覽器的側邊欄, 或是使用 800 的螢幕, 就會變得更不方便 ....
  • 如果兩個側邊欄都是 200 左右, 跨欄 400px 的感覺似乎又太寛,
  • 如果要縮減其中一個側邊欄到 150 左右, 似乎只有『關於我』,『搜尋』,『追蹤者』, 『計數器』適合放在較窄的這一欄, 這又和另一個側邊欄的份量不是那麼平衡, 元件的排列順序也不是那麼容易處理 ....。

.

『換湯不換藥』(只改外觀)

最後還是決定 回復成原來的模版, 來個『換湯不換藥』---- 只改外觀

事後證明, 可以把原本的 TicTac 版型『外觀』, 改成和 Gadget 2.0 幾乎一樣, 就只差『進階三欄式』還沒有加進來。因為有 Firebug『神器』的幫忙, 大約只花了一個上午的時間。

2008-12-14_215129

新版型

舊版型

.

還有, 增加內文副標題 (h3, h4, h5) 的辨識度

h3 副標題

h4 章節

h5 小段落
2008-12-16_210423

.

加上『導覽列』

思考『側邊欄元件排列方式』的同時, 我也在想如果能 快速找到想看的側邊欄區塊, 那排列方式就不會有那麼大的影響 ---- 於是就去找了『導覽列』!!

參考 挖哩勒~胡說八道lamueno, 加了『導覽列』的新功能。不過, 我改用文字式的按鈕, 再加上收合選單的功能, 目前還在小修之中。

2008-12-14_124026    
2008-12-14_124005
平時透明 滑鼠接近時顯現出來 也可以收合

.

需要的人請先參考 挖哩勒~胡說八道 的說明, 或是參考我的原始碼 

CSS 設定
.fixed_menu
* html .fixed_menu {position:absolute;}
<div class='fixed_menu' id='nav_menu'>
....
<h2><a href='#連結名稱' title='說明'>按鈕名稱</a></h2> </div></div>

這一段 (放在 <div id='content-wrapper'> 之前)
適當的地方加上 <a name='連結名稱'></a>

.

我還想要讓『導覽列』在螢幕寬度不夠時, 自動縮到側邊 (而不會遮住文章), 但還沒有成功。(嘗試寫程式在 <body> 的 onresize時, 判斷文章欄位的 offsetLeft, offsetWidth, ....)

接著, 或許在『導覽列』加上按鈕來跳到上/下篇文章, ....

.


(...繼續閱讀.../...CONTINUE...)

2008年12月14日 星期日

更換版型的參考資料分享

20081214_215448_thumb4

雖然有人說『為什麼改版一定要發文?』(muki)。

不過, 我還是覺得該 記錄一下到底改了什麼, 以及 分享其中的經驗, 而且說不定有的朋友只是看 RSS, 也該通知大家來看一下。

原本, 比較了幾個版型, 打算『換湯兼換藥』(外觀+功能) 之後, 再把功能逐一加上。

換湯兼換藥』的 改版步驟 :

  • 找到理想的範本 (功能, 模版, 配色)
  • 備份舊模版及側邊欄小工具
  • 測試新模版
  • 更換模版 (側邊欄小工具可以保留哦!!)
  • 加上需要的功能

但是, 換模版不到兩天, 就發現有些功能的相容性太難追溯, 不如回復成原來的模版, 再設法把外觀換掉, 來個『換湯不換藥』(只改外觀) 還比較有把握

至於『換湯不換藥』的步驟也大同小異, 同樣還是要備份以防萬一。

就這樣, 最後改版的結果有一大半沒有在當初的想像之中, 其中還包括一個新功能, 你看出來了嗎 ?

底下先簡介更換模版的參考資料, 下一篇再來說明這次改版的內容。

.

找到理想的範本 (功能, 版, 配色)

功能

關於『Blogger 的功能擴充』, 可以參考底下幾個站 : (依字母筆劃排序)

.

再來是『模版』, 可以請教 Google 大神, 或是套用 Blogger 內建的模版

.

配色

我選了 http://www.colorschemer.com/online.html, 指定一個基色, 可以配出 16 個相關色。
或者還可以參考下面的網頁 :

.

備份舊模版及側邊欄小工具

『備份舊模版』 就是在 Blogger 後台的 :

  • 版面配置 => 修改 HTML => 下載完整範本

至於, 『備份側邊欄小工具』就比較麻煩一些,

  • 逐一叫出 HTML 小工具, 再將內容全選轉貼到文字檔

放形浪High 介紹的『保住側邊欄(sidebar), 少花重覆工!』確實可以在更換模版時保留側邊欄小工具, 不過我覺得還是先手動備份一下比較保險。

.

測試新模版 / 更換新模版

除非很有把握, 否則會 建議先到 Blogger 後台另外開一個『測試的部落格』來測試新模版, 像我的 JavaScript Lab 02Ticker Lab 01。此外, 這些『測試的部落格』也可以拿來練習小工具, 測試程式, 或是展示之用。

再提醒一次, 換上新模版的同時, 依照 放形浪High 介紹的『保住側邊欄(sidebar), 少花重覆工!』可以在更換模版時保留側邊欄小工具哦!!

修改模版的過程, 搭配 Firebug ---- 部落客『玩網頁』的『神器』可以增進效率。

『即時』編輯, 除錯, 觀察 網頁的 CSS, HTML, JavaScript

和之前不斷的『修改 => 存檔 => 更新頁面 => 試誤 => 修改 => 存檔 => 更新頁面 => 再試誤 =>  ... 』, 比起來, 真的『快了不只十倍速』

.

調整側邊欄欄寛

經過測試, 有些側邊欄小工具可以自動調整欄寛

  • 不需特別調整 :
    • Blogger 內建的小工具 (關於我, 追蹤者, ...)
    • Google Reader 的分享項目
  • witdh 或 ww 可以設定為 auto : 
    • Google Friend Connect
    • FEEDJIT
  • 無法自動調整寛度:
    • MyBlogLog (ww 只能設為數字, 無法設為 auto)

.

導覽列



這次暫時只加了『導覽列』這個新功能, 參考 挖哩勒~胡說八道lamueno 之後, 改成文字式的按鈕, 再加上收合選單的功能, 還需要再小修。

後續再來介紹細節。
2008-12-14_123552-corp_thumb[1]

.


(...繼續閱讀.../...CONTINUE...)

2008年9月15日 星期一

觀察 Blogger 版型 CSS 式樣 -- 實例說明

以下起源於和某網友討論到『相關文章點播台 -- RPS 1.0 beta』裡面有關 Blogger 版型的設定, 或者也可以當作『觀察 Blogger 版型 CSS 式樣』的 實例說明

底下的例子, 不見得能適用到每種版型的變化, 但希望能達到一些『給他魚吃, 不如給他釣竿, 教他釣魚』的目的。

使用的工具, 就是 網頁的原始碼, 或是 Firebug ---- 部落客『玩網頁』的『神器』

.

相關文章點播台 -- RPS 1.0 beta』裡面, 提到以下兩個參數, 都和 Blogger 的版型有關 :

  • rpsOpt.LocateBoard -- 相關文章點播台的『顯示位置』
  • rpsOpt.LocateLabels -- 定位標籤資料

.

  • post-footer 實例說明

我的單篇文章內文之後的 'post-footer' 版型是 :

<div class='post-footer'>
<p class='post-footer-line post-footer-line-1'>
image
</p>
<p class='post-footer-line post-footer-line-2'>
<span class="post-labels">
image 
</span></p>
<p class='post-footer-line post-footer-line-3'>

image
</p>
</div>

所以, 下面的參數會設定『相關文章點播台的顯示位置』在 class='post-footer' 『內部的最後面 』:

  • rpsOpt.LocateBoard = ['append', '.post-footer'];
prepend 『內部』的最前面
append 『內部』的最後面
before 『外部』的前面
after 『外部』的後面

除此 CSS (Cascading Style Sheets) 位置表示語法, 還有『.』,『#』, 和 html tag

『.』句號 class
『#』井號 id
開頭都沒加 html tag

.

以下圖示 append, prepend ... 等的位置。一般情況下 before 和 prepend 的結果會很像, append 和 after 的結果會很像。但是在 class='post-footer' 之內的 prependappend 的位置, 會繼承 'post-footer' 的式樣。

[before]
<div class='post-footer'>
[prepend]
image
[append]
</div>
[after]

.

  • 標籤格式 實例說明

我的『標籤』的版型是 :

<div class='post-footer'>
...
<p class='post-footer-line post-footer-line-2'>
<span class='post-labels'>
標籤:
<a href='http://網址/search/label/標籤1' rel='tag'>標籤1</a>,
<a href='http://網址/search/label/標籤2' rel='tag'>標籤2</a>,
<a href='http://網址/search/label/標籤3' rel='tag'>標籤3</a>,
...
</span>
</p>
...
</div>

定位標籤資料 (告訴程式『每一個標籤的 a href』) 就要寫成 :

  • rpsOpt.LocateLabels = ['.post-footer', '.post-labels', 'a'];

不見得每一層都要寫出來, 因為 <div class='post-footer'> 裡面只包了一個 <span class='post-labels'> , 不會有誤解, 不一定要特別去指定 class='post-footer-line post-footer-line-2', 所以就被我省略了。

.

  • 不一樣的版型

某個版型並沒有 'post-footer' , 而是

Posted in 標籤1, 標籤2 by 作者名

<div class="post">
... 內文 ...
<p class="postmetadata">
Posted in
<a rel="tag" href="http://網址/search/label/標籤1">標籤1</a> ,
<a rel="tag" href="http://網址/search/label/標籤2">標籤2</a> ,
by 作者名
</p>
...
</div>
<div id="comments" class="comments">
...
</div>

我會建議將參數改為

  • rpsOpt.LocateBoard = ['append', '.post'];
  • rpsOpt.LocateLabels = ['.post', '.postmetadata', 'a'];

或是

  • rpsOpt.LocateBoard = ['after', '.post', '.postmetadata'];
  • rpsOpt.LocateLabels = ['.post', '.postmetadata', 'a'];

.

先這樣, 以後再補充


(...繼續閱讀.../...CONTINUE...)

2008年7月21日 星期一

Advanced Label Cloud - 內建『標籤雲』的『標籤文章選台器』

2008-07-21_132103一時興起, 把 LVCHEN 的『標籤文章選台器』改寫成內建『標籤雲』的功能, 底下就來介紹怎麼使用。

 

適用對象 : 使用 LVCHEN 的『標籤文章選台器』, 但不清楚如何加上『標籤雲』功能的人。

因為沿用 LVCHEN 的架構, 所以請參考下面的文章, 先安裝 LVCHEN 的『標籤文章選台器』。

完成之後, 再稍作修改, 就能變成內建『標籤雲』的功能。

.

  • 第一步, 在 模版 或 側邊欄 加入底下的 style

<style>
#labelCloud {text-align:center;font-family:arial,sans-serif;}
#labelCloud .label-cloud li{display:inline;background-image:none !important;padding:0 1px;margin:0;vertical-align:baseline !important;border:0 !important;}
#labelCloud ul{list-style-type:none;margin:0 0 0 -2px;padding:0 0 0 0;}
#labelCloud a img{border:0;margin:0 0 0 0;padding:0 0 0 0;}
#labelCloud a{text-decoration:none}
#labelCloud a:hover{text-decoration:underline}
#labelCloud li a{}
#labelCloud .label-cloud {}
</style>

這邊的 style 設定是從『黑輪的版本』修改來的, 紅色的部份看起來是必要的, 不過, 我沒有仔細研究。或者, 也可以直接使用原始的『黑輪的版本』style。

.

  • 第二步, 修改基本設定

找到安裝程式碼的地方, 將 LVCHEN 的 JavaScript 替換成 內建『標籤雲』功能的版本, 再修改設定,

LVCHEN 的 JavaScript

<script src="http://lvchen-recentcomments.googlecode.com/svn/trunk/Advanced_Label/adv_Label1.2/adv_label_v1.2_pack.js" type="text/javascript"></script>

.

替換成 內建『標籤雲』功能的 JavaScript

<script src=
"http://eucaly61-java.googlecode.com/svn/trunk/alc_12_pack.js" type="text/javascript"></script>

修改設定,

tagListSetting.dropDown = false;    /* 下拉式功能表 和 標籤雲 只能擇一使用 */
tagListSetting.tagsShow = true;    /* 其實 false 也可以, 但就要按『選擇標籤』才會看到標籤雲 */

=> 順利的話, 就會出現『標籤雲』囉 !!

2008-07-21_091118

如果對顯示效果不滿意, 再調整下面的設定

.


  • 第三步, 『標籤雲』的進階設定

tagListSetting.cloudConv = 將 Blogger 的標籤元素轉為『標籤雲』, 預設 true
=> 如果改成 false, 功能會回到 LVCHEN 的原始版本
tagListSetting.cloudFontSize = 標籤雲 [最小字型,最大字型,文章數最小字型,文章數最大字型], 分別控制『標籤字體』和『文章數字體』大小, 預設 [10,20,10,15]
tagListSetting.cloudShowNum = 標籤雲『文章數』是否顯示, 預設 false
因為游標停在上面, 會提示『標籤』和『文章數』, 所以預設不顯示文章數, 好讓標籤雲更清爽
tagListSetting.cloudRGB = 標籤雲顏色, P 須從 100 遞減到 0, 組數不限,
預設 [ {P:100, R:208, G:0, B:0}, {P:50, R:255, G:204, B:0}, {P:0, R:0, G:64, B:128} ], 或者也可以使用我目前的設定
[ {P:100, R:208, G:0, B: 0}, {P:60, R:192, G:192, B: 0}, {P:30, R:0, G:128, B:0}, {P:0, R:0, G:64, B:128} ]
tagListSetting.lineHeight = 設定標籤雲字間的高度,免得字大的時候疊在一起

.

  • 已知的問題

  • 要新增『一大串 STYLE』 , 如果有更好的建議, 還請告訴我
  • 無法設定不顯示小於某個文章數目的標籤 ---- 黑輪的版本有這個功能,
  • 沒有無腦安裝 ---- 因為我不會寫
  • Firefox 3 和 IE7 行距不同

Firefox 3

IE7

2008-07-21_103750 2008-07-21_130911
.
  • 參考資料

LVCHEN 的『標籤文章選台器』。

黑輪的版本, 使用『修改模版』及『一大串程式』產生『標籤雲』

.

對原始程式有興趣的, 請見 alc_12_src.js 
(http://code.google.com/p/eucaly61-java/source/browse/trunk/alc_12_src.js)

.


(...繼續閱讀.../...CONTINUE...)

2008年7月20日 星期日

To jQuery or Not To, 『非 jQuery 習作』- 隨機文章跑馬燈

暫且不討論用 jQuery 來寫程式到底好不好, 因為我大概也沒有足夠的 JavaScript 資歷來討論這件事。不過, 倒是把前一陣子的『 jQuery 習作 - 隨機文章跑馬燈』改寫成不用 jQuery 的方式, 以下和大家分享。

.

最近, 自己寫的『相關文章點播台』外掛和其他功能暫告一段落, 轉而開始注意我的 Blogger 部落格的載入速度, 除了將大部分 JavaScript 加了 defer="defer" 屬性 (IE7似乎有問題), 也拿掉一些少用的 外部 JavaScript, 詳情可以參考以下的說明 :

.

再來, 把前一陣子的『 jQuery 習作 - 隨機文章跑馬燈』改寫成不用 jQuery 的方式。雖然原先 jQuery 的方式沒什麼問題, 但有了 LVCHEN 的提醒, 總是多一分準備會好一些。

...試著不用 jQuery 寫,其實對於學習 js 的幫助也不小,而且 jQuery 其實也有些 bug,太過依賴反而不好,碰到 bug 反而會花上更多時間。

=> LVCHEN 回應 『 jQuery 習作 - 隨機文章跑馬燈 』

.

模版修改方式、其他說明 以及 限制, 請見『 jQuery 習作 - 隨機文章跑馬燈』, 下面只列出 放在 HTML/JavaScript 網頁元素裡的 JavaScript

變數類別 :

  • DOM 物件 : eArch
  • DOM 物件陣列 : aPost, aHref, aTemp
  • 字串 : sTemp

其他注意事項 :

  • 紅色部分, 要搭配模版的架構, 還有 跑馬燈 的命名
  • 藍色部分 : i<20 可以改成其他的文章篇數,
  • 藍色部分 : /*/> */ 是因為輸入 HTML/JavaScript 網頁元素時, < > 必需成對, 用 &lt; 又無效, 所以只好用 JavaScript 註解的方式補成 i<20; /*/> */
  • 整段程式也可以放在模版, 但是 藍色部分 要改成
    for (var i=0; i &lt; 20; i++)

jQuery 的方式

不使用 jQuery 的方式

(IE7 不適用, 最後面有另一版本)

<!-- 記得先載入 jQuery -->

<script type="text/javascript">
function myScroller() {
var shortspc = ' ';
var longspc = ' ';
var p_lnk = $('#BlogArchive1').find('.posts').find('a');
var ll = p_lnk.length;
var j = Math.floor((ll) * Math.random());
$('#U002').html('').append('[' + j + '/' + ll + ']' + longspc);
for (var i=0; i<20; /*/> */ i++){
j = j+1;
j = j % p_lnk.length;
var d0=p_lnk.eq(j).attr("href");
d0 = d0.match(/\d{4}\/\d{2}/);
$('#U002').append(d0+shortspc);
p_lnk.eq(j).clone().appendTo('#U002');
$('#U002').append(longspc);
};
}

$(document).ready(function(e){
myScroller()
});
</script>

<script type="text/javascript">
function myScroller() {
var shortspc = ' ';
var longspc = ' ';
var eArch = document.getElementById('BlogArchive1');
var aPost = eArch.getElementsByClassName('posts');
var aHref = [];
var aTemp = [];
var sTemp = '';
var i,j;
for (i=0; i</*/>*/ aPost.length; i++) {
aTemp = aPost[i].getElementsByTagName('a');
for (j=0; j</*/>*/ aTemp.length; j++) {
aHref.push(aTemp[j]);
}}
var ll = aHref.length;
j = Math.floor((ll) * Math.random());
sTemp = sTemp.concat('[' + j + '/' + ll + ']' + longspc);
for (var i=0; i<20; /*/> */ i++){
j = j+1;
j = j % ll;
var d0=aHref[j].href;
d0 = d0.match(/\d{4}\/\d{2}/);
sTemp = sTemp.concat(d0+shortspc);
sTemp = sTemp.concat(aHref[j].parentNode.innerHTML+longspc);
};
document.getElementById('U002').innerHTML=sTemp;
}
myScroller();
</script>

.

IE7 不適用 getElementsByClassName 改寫如下 (綠色部份) :

<script type="text/javascript">
function myScroller() {
var shortspc = ' ';
var longspc = ' ';
var eArch = document.getElementById('BlogArchive1');
var aTemp = eArch.getElementsByTagName('a');
var aHref = [];
var sTemp = '';
var i,j;
for (i=0; i</*>*/ aTemp.length; i++) {
if (aTemp[i].href.match(/\d{4}\/\d{2}/))
if (!aTemp[i].href.match(/Id=BlogArchive1/i))
{ aHref.push(aTemp[i]); }
}

var ll = aHref.length;
var j = Math.floor((ll) * Math.random());
sTemp = sTemp.concat('[' + j + '/' + ll + ']' + longspc);
for (var i=0; i<20; /*/> */ i++){
j = j+1;
j = j % ll;
var d0=aHref[j].href;
d0 = d0.match(/\d{4}\/\d{2}/);
sTemp = sTemp.concat(d0+shortspc);
sTemp = sTemp.concat(aHref[j].parentNode.innerHTML+longspc);
};
document.getElementById('U002').innerHTML=sTemp;
}
myScroller();
</script>


(...繼續閱讀.../...CONTINUE...)

2008年7月17日 星期四

相關文章點播台 -- RPS 1.0 beta 測試

前一陣子開始改良『依相關度排序的相關文章』, 現在已經進入beta 測試。

目前取的名字叫『相關文章點播台』-- RPS 1.0 (Related Posts Surf), 相較於 之前從 Abin's Tech Note 那邊修改過來的版本, 主要的不同為 :

  • 以外掛的形式執行, 完全不用改模版, 只要一行就可以安裝
  • 增加換頁功能
  • 增加自訂設定

.

  • 安裝

真的只要一行, 就像底下這樣, 只要在載入 jQuery 之後再執行就可以。程式會找到預設的位置顯示相關文章

<script src="http://eucaly61-java.googlecode.com/svn/trunk/rps-10-mini.js" type="text/javascript"/>

然後, 如果一切順利的話, 就會看到類似底下的畫面

 2008-07-17_214909

.

  • 基本設定

如果沒有順利顯示, 或是位置不如預期, 可以加入以下的參數 :

<script type="text/javascript">

rpsOpt.LocateBoard = ['append', '.post-footer'];
rpsOpt.LocateLabels = ['.post-footer', '.post-labels', 'a'];

</script>

如果你的部落格網址太特別, 或是你想『顯示另一個 Blogger 部落格的相關文章』 , 或是調整每一頁的文章篇數:

<script type="text/javascript">

rpsOpt.blogRoot = 'http://eucaly61.blogspot.com/';
rpsOpt.Lines = 10;

</script>

.

其中 'append', '.post-footer' 表示『顯示位置』的 CSS 設定,

  • 'append', 也可以改成 'prepend''after''before', ---- 和 '.post-footer' 的關係如下所示,
  • 第一個參數如果不是上述四個, 則會視為 CSS 位置表示語法, 並預設為 'append'
  • 再來是 CSS (Cascading Style Sheets) 位置表示語法, 簡單的說, 『.』句號代表 class, 『#』井號代表 id, 開頭都沒加代表 html tag,
  • 可以設定多個 CSS 位置表示語法, 會讓定位更精準, 記得都要加上引號
  • 目前預設『必須剛好』找到一個位置, 才會顯示, 這是為了區別『單篇文章』,『首頁』和『瀏覽日期/標籤』。

如果改為 rpsOpt.LocateBoard = ['.post-footer', '.post-footer-line-1']; 則會顯示在 [B] 的位置。

[before]
<div class='post-footer'>
[prepend]
<p class='post-footer-line post-footer-line-1'>
... 張貼者: XXXX 位於 ... </p> [B]
<p class='post-footer-line post-footer-line-2'> ... 標籤:... </p>
<p class='post-footer-line post-footer-line-3'>
... 這裡不一定每個人都有內容 ... </p>
[append]
</div>
[after]

.

如果上面對了, 至少會顯示『載入中』

2008-07-17_215300

再來是定位標籤資料, rpsOpt.LocateLabels = ['.post-footer', '.post-labels', 'a']; 如果你的模版和下面不一樣, 請自行修改

  • 如果你的『標籤名稱』不是用 <a href="..."> 超連結包住,
    .... 目前暫時無解, 請期待 下一版
<div class='post-footer'>
<p class='post-footer-line post-footer-line-1'>
... 張貼者: XXXX 位於 ... </p> <p class='post-footer-line post-footer-line-2'>
<span class="post-labels">標籤:
<a href="..." rel="tag">標籤名稱1</a>,... </p>
<a href="..." rel="tag">標籤名稱2</a>,... </p>
</span>

.

  • 進階設定

<script type="text/javascript">

rpsDisp.Loading = '相關文章載入中 ...';
rpsDisp.ListHead = '約有 %PostNum% 篇相關文章,以下是第 %PostNumFrom% 至 %PostNumTo% 篇';
rpsDisp.ListLine = '%PostRank% %PostTitle% - %PostDate%';

</script>

可以任意調換順序, 或者如果不想看到日期或相關度, 也可將 %PostRank% %PostDate% 等 拿掉。

<style>
#rpsBoard {
background: #F0F0F0;
border:2px dotted #ccc;
padding: 0px 5px 5px 15px;        /*上 右 下 左*/
margin: 10px 10px 5px 0px;        /*上 右 下 左*/
}
</style>

替相關文章區塊上色 ...., 或 padding, margin 請依版面自行調整。

.

  • 除錯

有問題的話, 可以試試以下的版本, 會有除錯訊息
[+/-] show/hide debug message

<script src="http://eucaly61-java.googlecode.com/svn/trunk/rps-10-debug.js" type="text/javascript"/>

<script type="text/javascript">

rpsDebug.mode = '%blog%label%jsOK%jsOK-full%';

</script>

.

  • To Do

可能的問題, 或預計增加的功能

  • 不同模版的相容性
  • 不同瀏覽器的相容性 (FF3, IE6, IE7, ...)
  • 載成更多 json Feed, 目前每個標籤只載入 20 篇
  • 調整 相關度計算方式
  • 顯示/隱藏文章摘要

想到但不一定會做的

  • 抓取同一網頁的其他資料, e.g. feedjit "Visitors to this page also liked"
  • 顯示每篇文章的標籤
  • 選擇哪些標籤的優先權較高

.


(...繼續閱讀.../...CONTINUE...)

2008年7月10日 星期四

jQuery 習作 - 隨機文章跑馬燈

請看視窗底下的『隨機文章跑馬燈』, 這個算是我自己的 jQuery 習作, 不過也成功取代了載入速度不穩定的 ai-Ticker-J

.

  • 文章資料來源 (1)

一般的作法都是以 RSS Feed 提供『文章資料』, 寫在程式裡則以 JSON Feed 較方便。不過, 我要用不一樣的方法, 因為『文章資料』其實很多人的頁面都有 (就在某個網頁元素/widget 裡), 可以省去抓 Feed 的時間 (估計 0.5 ~ 2 秒)。

答案在更後面, 請耐心看下去。

.

  • 跑馬燈語法

跑馬燈語法 Scrolling Text - Marquee HTML Code (英文), 簡單的說, 就是包在 <marquee> ... </marquee> 裡面, 再加上 滑鼠移到上面時會暫停。其他的設定 (速度, 方向, ...) 該處也有說明。

<marquee onmouseover="this.stop()" onmouseout="this.start()">
要顯示的跑馬燈文字 </marquee>

.

  • 固定在視窗底下的語法

固定在視窗底下的語法, 沒有專文介紹, 但是在『挖哩勒~胡說八道』那裡, 找『頁面原始碼』的 #finalfooter2 就知道囉 -- (或者看後面, 我的程式碼 <span style=... 那一長串)

這是另外一個Hack喔,跟這個無關
因為有點複雜,所以我沒有寫
(最新文章跑馬燈, 挖哩勒~胡說八道)

.

  • jQuery 概念

可以先看 jQuery 教學 - 基礎篇 (wmh, jsGears)

我是 jQuery 新手, 所以只簡單列出曾在 LVCHEN 那裡看過的問題

... jQuery 必須先被執行,所以不管你放在哪裡一定要放在 jQuery 之後執行 ... (標籤文章選台器 1.2 版介紹與安裝, LVCHEN)

... 阿土伯的外掛是使用 jQuery 1.1.4,問題就發生在 jQuery 1.1.4 與 1.2 版以上是部份不相容的,如果同時安裝會導致留言開關不正常,... (最新回應 2.0 來囉!, LVCHEN)

... 記得jQuery 不要裝兩次 (加強型最新回應 for blogger ..., LVCHEN)

.

  • 文章資料來源 (2)

你答對了嗎?

.

2008-07-09_225128 

就是這個, 只要使用『階層式』的『網誌存檔 / BlogArchive', 文章資料就是現成的, ....


『階層式』『網誌存檔』的 HTML 原始碼  摘錄如下,
紅色部分 就是 jQuery 抓取資料的 HTML 標記, 還有我們需要的文章資料,
<div class="widget BlogArchive" id="BlogArchive1">
...
<a class="post-count-link" href="http://eucaly61.blogspot.com/2008_07_01_archive.html">七月</a>
<span class="post-count" dir="ltr">(2)</span>
<ul class="posts">
<li><a href="http://eucaly61.blogspot.com/2008/07/blog-post.html">[轉貼] 送愛心到泰北</a></li>
<li><a href="http://eucaly61.blogspot.com/2008/07/related-posts-with-correlation.html">依相關度排序 ---- 更有看頭的『相關文章』功能</a></li>
</ul>
...

不過, 雖然省掉了 JSON callback, 但還是有限制

  • 要使用『階層式』網誌存檔 / BlogArchive'
  • 只有『年, 月』, 而沒有『日』, 無法顯示文章的完整日期
  • 只會先載入較新的文章資訊 (約50篇), 除非 手動 或 自動 點開 摺疊的資料

.

當然, jQuery 也有自己的 方式來執行 JSON callback, 這部份留待日後再來嘗試, 有興趣的人可以參考 :

http://docs.jquery.com/Ajax

jQuery.getJSON( url, data, callback )    Returns: XMLHttpRequest

Load JSON data using an HTTP GET request.

jQuery.getScript( url, callback )    Returns: XMLHttpRequest

Loads, and executes, a local JavaScript file using an HTTP GET request.

.

  • 程式碼

先將底下的 HTML 加到 模版, 這麼做可以先『佔位置』, 讓 瀏覽器 讀入頁面時, 能正確排版。 至於位置其實沒那麼重要, 只要在 <body>...</body> 裡面即可, 例如 content-wrapper 之前。還有, 藍色部份的顏色, 請自行調整。

...
</div>
加在這裡
<div id='content-wrapper'>
...

<span style="position:fixed; border-top:1px solid #F0FFF0; border-bottom:1px solid #A8CEA8; background-color:#C0FFC0; width:100%; left:0; text-align:left; color:#000; font-size:12px; z-index:10000; opacity:0.8px; filter:alpha(opacity: 80); _position:absolute; bottom:0; _top:expression(document.body.scrollTop+document.body.clientHeight-this.clientHeight); padding-top:2px; padding-left:10px; padding-bottom:0; vertical-align:bottom; line-height:1.0; margin:0;">
<marquee id="U002" onmouseover="this.stop()" onmouseout="this.start()">
跑馬燈載入中 ... / Loading Marquee ...
</marquee> </span>

.

再將底下的 JavaScript 放到 HTML/JavaScript 網頁元素裡,

  • $() 是 jQuery() 的別名,
  • $(document).ready, 會在整個文章載入之後才執行, 所以網頁元素位置不是那麼重要, 只要在載入 jQuery 之後,
  • 紅色部分, 要搭配模版的架構, 還有 跑馬燈 的命名
  • 藍色部分 : i<20 可以改成其他的文章篇數,
  • 藍色部分 : /*/> */ 是因為輸入 HTML/JavaScript 網頁元素時, < > 必需成對, 用 &lt; 又無效, 所以只好用 JavaScript 註解的方式補成 i<20; /*/> */
  • 整段程式也可以放在模版, 但是 藍色部分 要改成
    for (var i=0; i &lt; 20; i++)

<!-- 記得先載入 jQuery -->

<script type="text/javascript">
function myScroller() {
  var shortspc = ' ';
  var longspc = ' ';
  var p_lnk = $('#BlogArchive1').find('.posts').find('a');
  var ll = p_lnk.length;
  var j = Math.floor((ll) * Math.random());
  $('#U002').html('').append('[' + j + '/' + ll + ']' + longspc);
for (var i=0; i<20; /*/> */ i++){
    j = j+1;
    j = j % p_lnk.length;
    var d0=p_lnk.eq(j).attr("href");
    d0 = d0.match(/\d{4}\/\d{2}/);
    $('#U002').append(d0+shortspc);
    p_lnk.eq(j).clone().appendTo('#U002');
    $('#U002').append(longspc);
  };
}

$(document).ready(function(e){
  myScroller()
});
</script>

.

其實也試過不修改模版, 而是將 綠色部分 也加在 程式中, 再用 $('body').prepend 的方式加上去, 但是只有 Firefox 可以正確顯示, IE7 則不行。

...
function myScroller() {
  var shortspc = ' ';
  var longspc = ' ';
  $('body')
  .prepend('<span style="..."><marquee id="U002" onmouseover="this.stop()" onmouseout="this.start()">
跑馬燈載入中 ... / Loading Marquee ... </marquee> </span>');
  var p_lnk = $('#BlogArchive1').find('.posts').find('a');
...

.

小結 -- 我的收穫

  • 寫了第一個 jQuery 程式
  • 不用再呼叫 ai-Ticker-J
  • 知道在 模版 和 網頁元素 要用不同方式處理 < >

.


(...繼續閱讀.../...CONTINUE...)

2008年7月9日 星期三

Blogger, JavaScript, JSON, jQuery 說明 及 教學 彙整

以下列出最近研究中的 Blogger, JavaScript, JSON, jQuery ... 的 說明 及 教學文件, 有需求的人可以從中參考。

.

Blogger 官方說明文件

Blogger Help > 自訂您的網誌 > 版面配置 > 瞭解更多資訊
Blogger Help > Customize Your Blog > Classic Templates > Advanced Use

.

Blogger 自訂/改造 教學

每一個出處都有許多 Blogger 自訂/改造 的相關文章, 以下僅列出『較具代表性』的, 其他造訪各站連結。

BLOGGER HACK (Abin's Tech Note)
經典的說明都從 Abin Tech Note 開始 ...

Blogger改造之旅 (白花花)
有人開路在先, 你也可以跟著改造你的 Blogger

部落格工具箱 (iPlay99)

Blogger (挖哩勒~胡說八道, 或使用該站右側欄的『文章選台器』)

.

JavaScript 教學

Java, JavaScript 說明文件

.

JSON Feed 說明文件

  • JSON Feeds (Beautiful Beta)
    ... 原來 JSON feeds 裡頭有每篇文章的標籤 ...
    json.feed.entry[i].category[j].term

.

jQuery 教學

jQuery 說明文件


http://docs.jquery.com/Core

- jQurey 說明文件
2008-07-09_093658

http://visualjquery.com/1.1.2.html
- jQuery 指令語法及範例 (階層式查詢)

2008-07-09_091550

.


(...繼續閱讀.../...CONTINUE...)

2008年7月2日 星期三

依相關度排序 ---- 更有看頭的『相關文章』功能

.

Correlation 前幾天, 成功實作出『Grazr格中格』的『相關文章』功能, 原本還要繼續嚐試 Google Ajax Search API 或 Google Ajax Feed API ...。不過, 最後還是決定回到『json 加 java script』, 再加上『依相關度排序』---- 希望可以就這麼定案 ----。

不過我猜, 說不定還得請大家投票來決定。

.

下面將介紹 :

  • 遺珠的『相關文章』功能
  • 原始版本的『相關文章』功能 -- Abin's Tech Note
  • 依相關度排序---- 讓『相關文章』更有看頭
  • 補充 ----『隨機文章』

另外寫了一個『不用寫程式, 不用改模版的方法』, 要先掛 jQuery, 再依文章所述安裝。目前的設計, 是要單篇文章才會顯示相關文章。對程式不熟的人, 建議使用 相關文章點播台 -- RPS 1.0 beta

有興趣『寫程式/改模版』的人, 再看下文。

.

  • 遺珠的『相關文章』功能

之所以沒使用下面這些, 來呈現『相關文章』, 有幾個原因 :

  • 無法呈現文章的相關性, 也無法處理重複文章
  • Google Ajax Search API 處理的是『關鍵字』, 而非『標籤』
  • 另外兩個某種程度上比較像『標籤文章選台器』, 而不是『相關文章』

.

不過, 還是列出它們的效果, 說不定你用得上。

Grazr-Related

『Grazr格中格』的『相關文章』功能

2008-07-01_140908
Google Ajax Feed API (Meme -- 教學與反省,
.阿欣部落.)

.

Ajax-Search
Google Ajax Search API

.

建議大家先看一下原始版本的『相關文章』做法 (加入相關文章功能, Abin's Tech Note 2007-03-05), 或者是 替Blogger加入相關文章功能(二)(挖哩勒~胡說八道, 2008-06-30)

裡面, 詳細介紹了『相關文章』的做法, 還有程式碼要安裝在模版的什麼地方。

簡單的說, ABIN 的做法如下 :

  • 集合A = 目前文章的標籤 * (每個標籤取出10 篇最新的文章, 並且不包含目前文章)
  • 集合B = 集合A 的 不重複文章
  • 相關文章 = 從 集合B 隨機取出 5 篇文章

.

  • 依相關度排序 ---- 讓『相關文章』更有看頭

再來看看我的做法, 不同之處以紅色標示 :

  • 集合A = 目前文章的標籤 * (每個標籤取出10 篇最新的文章, 並且不包含目前文章), 並記錄目前的文章有幾個標籤 (labelNum)
  • 集合B = 集合A 的 不重複文章, 並順便統計 每篇文章 在 集合A 出現的次數 (relatedStar),
  • 集合C = 將 集合B 依 文章次數 排序
  • 相關文章 = 集合C 依 文章次數, 由多到少列出, 相關度以 relatedStar / labelNum 表示

.

另外, 我還朝減少記憶體 (陣列) 使用量, 和減少迴圈次數的方向改寫, 所以直接就產生 集合B, 而且 集合C 也只是一個『索引』而已。這樣,『理論上』會跑快一點, 只是不知如何測試。

假設你已經安裝完成原始版本的『相關文章』([1][2]), 只要將 </head> 之前的程式碼整個換成我的版本, 就會有『依相關度排序』的效果。

.

其中的 optionRGB, 請改成適合的顏色設定

var optionRGB = [ {P: 100, R :208, G: 0, B: 0}, {P: 50, R: 255, G: 204, B: 0}, {P: 0, R: 0, G: 64, B: 128} ];

P = 百分比, (R, G, B) = 該百分比的顏色設定。如果介於兩個百分比之間, 則會使用中間色。也可以 增加 或 減少 顏色的組別, 但要維持 P (百分比) 由大到小排列, 還有注意語法即可。

P

R

G

B

100

208

0

0

50

255

204

0

0

0

64

128

.

如果不想使用顏色, 則將以下紅色部分刪去, 並注意 myRBG (內含 <span>) 和 </span> 是成對的。

myRBG = spanRGB(myP, optionRGB);
document.write('<h4>' + myRBG);
document.write('相關度 ' + myStars + ' ' + myP + '% 的文章 :</span></h4> <ul>' );

.

如果想用『分數』(例: 3/5 ) 來表示, 可以將灰色部份與前一行替換,

// document.write('相關度 ' + myStars + ' (' + relatedStar[r] + '/' + labelNum + ') 的文章 :</span> </h4> <ul>' );

.

再來是列出的文章總數, 目前是 20 則, 如藍色部分, 可以自行修改

for (var j=0; j<u_IdxNum && j<20 ; j++)

.

尚待努力之處

  • 看能不能再增進執行效率
  • 將程式主體搬到側邊欄, 縮短文章載入的時間, 之後再插入相關文章的結果

.

</head> 之前的程式碼如下 :

<script type='text/javascript'>
//<![CDATA[
<!-- Script functions for Related Posts: RelatedLabels(), RemoveDuplicatedPosts(), contains(), ShowRelatedPosts()-->
var relatedPostsNum = 0;
var labelNum = 0;
var maxStar = 1;
var relatedStar = new Array();
var relatedTitles = new Array();
var relatedUrls = new Array();
var relatedDates = new Array();
var u_Idx = new Array();
var u_IdxNum = 0;

function RelatedLabels(json) {
var regex1=/</g, regex2=/>/g;
var entryURL = "";
labelNum += 1;
for (var i = 0; i < json.feed.entry.length; i++) {
var entry = json.feed.entry[i];
entryURL = "";
for (var j = 0; j < entry.link.length; j++) {
if (entry.link[j].rel == 'alternate') {
entryURL = entry.link[j].href;
break;
}
}
if (entryURL != "") {
for (var j = 0; j <= relatedPostsNum; j++) {
if (relatedUrls[j] == entryURL) {
relatedStar[j]++;
if (relatedStar[j]>maxStar)
maxStar=relatedStar[j];
entryURL = "";
break;
}
}
}
if (entryURL != "") {
relatedPostsNum++;
relatedTitles[relatedPostsNum] = (entry.title.$t.replace(regex1, '&lt;')).replace(regex2, '&gt;');
relatedDates[relatedPostsNum] = entry.published.$t.substr(0,10);
relatedUrls[relatedPostsNum] = entryURL;
relatedStar[relatedPostsNum] = 1;
}
}
}

function SortRelatedPosts(PostUrl) {
for (var j = maxStar; j > 0 ; j--) {
for(var i = 0; i < relatedUrls.length; i++) {
if (relatedStar[i]==j && PostUrl != relatedUrls[i]) {
u_Idx[u_IdxNum] = i;
u_IdxNum++;
}
}
}
}

function spanRGB(myP, PRGB) {
var myR, myG, myB;
for (var i=0; i< PRGB.length; i++) {
if (myP >= PRGB[i].P) {
if (i==0) {
myR = PRGB[i].R;
myG = PRGB[i].G;
myB = PRGB[i].B;
} else {
var P0 = myP - PRGB[i].P;
var P1 = PRGB[i-1].P - myP;
var deltaP = PRGB[i-1].P - PRGB[i].P;
myR = Math.floor( (PRGB[i-1].R*P0 + PRGB[i].R*P1) / deltaP );
myG = Math.floor( (PRGB[i-1].G*P0 + PRGB[i].G*P1) / deltaP );
myB = Math.floor( (PRGB[i-1].B*P0 + PRGB[i].B*P1) / deltaP );
}
return('<span >');
break;
}
}
return('<span>');
}

function ShowRelatedPosts(PostUrl) {

var r = 0;
var i = 0;
var currStar = 0;
var myStars = "";
var myRBG;
var optionRGB = [ {P: 100, R :208, G: 0, B: 0}, {P: 50, R: 255, G: 204, B: 0}, {P: 0, R: 0, G: 64, B: 128} ];

SortRelatedPosts(PostUrl);
if (relatedTitles.length > 0) {
for (var j=0; j<u_IdxNum && j<20 ; j++) {
r = u_Idx[j];
if (currStar!=relatedStar[r]){
if (currStar != 0)
document.write('</ul>');
currStar = relatedStar[r];
myStars = "";
for (i=0; i<currStar; i++)
myStars = myStars + '★';
var myP = Math.floor(100*relatedStar[r]/labelNum);
myRBG = spanRGB(myP, optionRGB);
document.write('<h4>' + myRBG);
document.write('相關度 ' + myStars + ' ' + myP + '% 的文章 :</span></h4> <ul>' );
// document.write('相關度 ' + myStars + ' (' + relatedStar[r] + '/' + labelNum + ') 的文章 :</span> </h4> <ul>' );
}
document.write('<li><a href="' + relatedUrls[r] + '">' + relatedTitles[r] + '</a> - ' + relatedDates[r] + '</li>');
}
if (currStar != 0)
document.write('</ul>');
document.write('== 以上 ' + j + ' 則 ==, <a href="http://eucaly61.blogspot.com/2008/07/related-posts-with-correlation.html" target="_blank">相關文章及相關度說明</a>');
}
}
//]]>
</script>

.

另外寫了一個『不用寫程式, 不用改模版的方法』, 要先掛 jQuery, 再依文章所述安裝。對程式不熟的人, 建議使用 相關文章點播台 -- RPS 1.0 beta

.

  • 補充 ----『隨機文章』

至於『隨機文章』, 可以參考底下的做法, 將它的精神改寫到 ABIN 的程式裡面。

Blogger Feeling Lucky Widget (Random Post)

  • 按鈕呼叫 feelingLucky()
  • feelingLucky()

/feeds/posts/summary?max-results=0&alt=json-in-script 傳給 readLucky()

  • readLucky()

取得 文章總數, parseInt(feed.openSearch$totalResults.$t,10)
產生 亂數
將 亂數 傳給 fetchLuck()

  • fetchLuck()

/feeds/posts/summary?start-index=+亂數+&max-results=1&alt=json-in-script 傳給 showLucky()

  • showLucky

秀出文章

.


(...繼續閱讀.../...CONTINUE...)