由於Youtube近年陸續有幾個小更動
雖然網址大致上沒有變,但一些小地方會影響正規表達式的判斷
並且近年來自適應網頁太重要了,網頁中的Youtube如果沒有RWD就會破版,
然後Flash也太糟糕了,所以全面使用HTML5更是當務之急
而xoops應用在newbb裡的DHTML編輯器,內建的Youtube語法基本上是Flash專用,並且是固定長寬,
已經不符合現代使用,故hack了新的寫法,讓編輯器符合以下幾項要求
內建Youtube編輯程式
\class\textsanitizer\youtube\youtube.php
語系檔英文
\language\english\formdhtmltextarea.php
語系檔中文
\language\tchinese_utf8\formdhtmltextarea.php
step1. 修改\class\textsanitizer\youtube\youtube.php 共4個地方
var text2 = prompt(enterFlashWidthPhrase, "425"); var text3 = prompt(enterFlashHeightPhrase, "350");
var text2 = prompt(enterFlashWidthPhrase, "16"); var text3 = prompt(enterFlashHeightPhrase, "9");
. htmlspecialchars(_XOOPS_FORM_ALT_ENTERHEIGHT, ENT_QUOTES) . "\",\"" . htmlspecialchars(_XOOPS_FORM_ALT_ENTERWIDTH, ENT_QUOTES)
. htmlspecialchars(_XOOPS_FORM_ALT_YOUTUBEHEIGHT, ENT_QUOTES) . "\",\"" . htmlspecialchars(_XOOPS_FORM_ALT_YOUTUBEWIDTH, ENT_QUOTES)
if (!preg_match("/^http:\/\/(www\.)?youtube\.com\/watch\?v=(.*)/i", $url, $matches)) { trigger_error("Not matched: {$url} {$width} {$height}", E_USER_WARNING); return ""; } $src = "http://www.youtube.com/v/" . $matches[2];
if (preg_match("/^http[s]?:\/\/(www\.)?youtu\.be\/(.*)/i", $url, $matches) ) { } elseif (preg_match("/^http[s]?:\/\/(www\.)?youtube\.com\/watch\?v=(.*)/i", $url, $matches)) { } else{ trigger_error("Not matched: {$url} {$width} {$height}", E_USER_WARNING); return ""; } $src = "https://www.youtube.com/embed/" . $matches[2];
$code = "<object width='{$width}' height='{$height}'><param name='movie' value='{$src}'></param>" . "<param name='wmode' value='transparent'></param>" . "<embed src='{$src}' type='application/x-shockwave-flash' wmode='transparent' width='425' height='350'></embed>" . "</object>";
$code = "<div class='embed-responsive embed-responsive-{$width}by{$height}'>" . "<iframe frameborder='0' class='embed-responsive-item' src='{$src}?controls=1&showinfo=0&rel=0&disablekb=1' allowfullscreen></iframe></div>";
step2. Insert language插入新增語系檔 共2個地方
define('_XOOPS_FORM_ALT_YOUTUBEHEIGHT','(Video 16:9 or 4:3) input Height 9 or 3 :'); define('_XOOPS_FORM_ALT_YOUTUBEWIDTH','(Video 16:9 or 4:3) input Width 16 or 4 :');
define("_XOOPS_FORM_ALT_YOUTUBEHEIGHT", "(影片比例16:9與4:3) 請輸入高 9 或 3 :"); define("_XOOPS_FORM_ALT_YOUTUBEWIDTH", "(影片比例16:9與4:3) 請輸入寬 16 或 4 :");
打完收工,如果其他模組用的不是內建的編輯器,就沒有用了,因為這是內建專用的~
希望xoops下一版內建的Youtube程式碼是更好用的 XDD
若網站裡已經有許多文章用了舊的code,不想一篇一篇修改的話,
可以再加上幾個判斷,就可向下相容舊語法~
找到此行
$src = "http://www.youtube.com/embed/" . $matches[2];
並在底下增加內容
if (empty($width) || empty($height)) {$width = 16;$height = 9;} if (($width) > 16 ||($width) > 9) {if (($width / $height) > 1.5) {$width = 16;$height = 9;} else {$width = 4;$height = 3;} }
邏輯是,判斷若為空值,則自動填上16:9
若寬大於16,高大於9(也就是原本的pixel)
則計算比例,寬除以高,大於1.5的則是16:9,小於1.5的,則為4:3
(正常16:9為1.7,4:3為1.3)
以上,新舊相容完美寫法 done !
同步發表於xoops.org官方網站論壇 hack版~
http://xoops.org/modules/newbb/viewtopic.php?topic_id=77063