Dynamic Template で ブログカードをつくる
前回、とっても高機能な Dynamic Template を入れましたので、このプラグインでブログカードを実装しようと思います。まずは、完成品の作業状態をGIFにしたのでみてください。
①リンク先のURLをコピペで貼り付け、②選択してテンプレートを呼び出すと、③リンク先のOGP情報が読み取られて、ブログカードのHTMLに置き換わる、という簡単なステップでブログカードが追加できます。
なお、 Dynamic Template をまだインストールできていない方は、この記事で確認ください。
実装方法
Dynamic Templateで新しく作ったテンプレートに、以下のコードをコピペして貼り付けしてください。
<%
System.Net.WebClient wclnt = new System.Net.WebClient();
wclnt.Encoding = System.Text.Encoding.UTF8;
string html = wclnt.DownloadString(%><%_selection%><%);
string s_title = "";
string s_img = "";
string s_url = "";
string s_site_name = "";
string s_description = "";
string outhtml = "";
System.Text.RegularExpressions.RegexOptions cond = System.Text.RegularExpressions.RegexOptions.IgnoreCase | System.Text.RegularExpressions.RegexOptions.Singleline;
// Search Meta-tag
System.Text.RegularExpressions.Regex r = new System.Text.RegularExpressions.Regex("<meta(.*?)>", cond);
System.Text.RegularExpressions.MatchCollection mc = r.Matches(html);
foreach (System.Text.RegularExpressions.Match m in mc)
{
// title
System.Text.RegularExpressions.Regex r_title = new System.Text.RegularExpressions.Regex("property=[\"']og:title[\"']", cond);
System.Text.RegularExpressions.Match m_title = r_title.Match(m.Value);
if (m_title.Success)
{
System.Text.RegularExpressions.Regex r_cont = new System.Text.RegularExpressions.Regex("content=[\"'](?<cont>.*?)[\"']", cond);
System.Text.RegularExpressions.Match m_cont = r_cont.Match(m.Value);
s_title = m_cont.Groups["cont"].Value;
}
// img
System.Text.RegularExpressions.Regex r_img = new System.Text.RegularExpressions.Regex("property=[\"']og:image[\"']", cond);
System.Text.RegularExpressions.Match m_img = r_img.Match(m.Value);
if (m_img.Success)
{
System.Text.RegularExpressions.Regex r_cont = new System.Text.RegularExpressions.Regex("content=[\"'](?<cont>.*?)[\"']", cond);
System.Text.RegularExpressions.Match m_cont = r_cont.Match(m.Value);
s_img = m_cont.Groups["cont"].Value;
}
// url
System.Text.RegularExpressions.Regex r_url = new System.Text.RegularExpressions.Regex("property=[\"']og:url[\"']", cond);
System.Text.RegularExpressions.Match m_url = r_url.Match(m.Value);
if (m_url.Success)
{
System.Text.RegularExpressions.Regex r_cont = new System.Text.RegularExpressions.Regex("content=[\"'](?<cont>.*?)[\"']", cond);
System.Text.RegularExpressions.Match m_cont = r_cont.Match(m.Value);
s_url = m_cont.Groups["cont"].Value;
}
// site_name
System.Text.RegularExpressions.Regex r_site_name = new System.Text.RegularExpressions.Regex("property=[\"']og:site_name[\"']", cond);
System.Text.RegularExpressions.Match m_site_name = r_site_name.Match(m.Value);
if (m_site_name.Success)
{
System.Text.RegularExpressions.Regex r_cont = new System.Text.RegularExpressions.Regex("content=[\"'](?<cont>.*?)[\"']", cond);
System.Text.RegularExpressions.Match m_cont = r_cont.Match(m.Value);
s_site_name = m_cont.Groups["cont"].Value;
}
// description
System.Text.RegularExpressions.Regex r_description = new System.Text.RegularExpressions.Regex("property=[\"']og:description[\"']", cond);
System.Text.RegularExpressions.Match m_description = r_description.Match(m.Value);
if (m_description.Success)
{
System.Text.RegularExpressions.Regex r_cont = new System.Text.RegularExpressions.Regex("content=[\"'](?<cont>.*?)[\"']", cond);
System.Text.RegularExpressions.Match m_cont = r_cont.Match(m.Value);
s_description = m_cont.Groups["cont"].Value;
}
}
outhtml += "<div class=\"bcard-wrapper\">";
outhtml += "<span class=\"bcard-main withogimg\">";
outhtml += "<span class=\"bcard-header withgfav\">";
outhtml += "<div class=\"bcard-favicon\" style=\"background-image: url("";
outhtml += "https://www.google.com/s2/favicons?domain=" + s_url + "");\"></div>";
outhtml += "<div class=\"bcard-site\">"+ s_site_name + "</div>";
outhtml += "</span>";
outhtml += "<div class=\"bcard-title\">" + s_title + "</div>";
outhtml += "<div class=\"bcard-description\">" + s_description + "</div>";
outhtml += "<div class=\"bcard-img\" style=\"background-image:url("";
outhtml += s_img + "");\"></div>";
outhtml += "</span>";
outhtml += "<a href=\"" + s_url + "\">dummy</a></div>";
%>
<%= outhtml %>
追記(2021/03/05)
OpenLiveWriterでダウンロードしてから編集する場合、ダウンロード後のHTML整形時に innertext がない a タグが消されてしまう現象がありました。この対策のため、a タグに ”dummy” とテキストを挿入しています。
別タブで開くリンクにするには、outhtml へ書き出している最終行を以下に変更してください。私は二つのテンプレートを使い分けるようにしました。
outhtml += "<a href=\"" + s_url + "\" target=\"_blank\" rel=\"noopener noreferrer\">dummy</a></div>";
CSSは、次のように設定しています。お好みで弄っちゃってください。なお、記事一覧で採用した、カード全体でリンクする方式を使ってます。
/****************************************
ブログカードジェネレータCSS
*****************************************/
.bcard-wrapper{
display: block;
width: 100%;
max-width: 640px;
margin: 0 auto;
margin-top: 1.5em;
margin-bottom: 1.5em;
border-radius: 7px;
padding: 6px 9px 6px 9px;
border: 2px solid var(--background-base-color);
box-shadow: 10px 10px 15px -10px var(--font-color);
background-color: ghostwhite;
position:relative;
z-index:1;
}
.bcard-wrapper:hover {
box-shadow: 10px 10px 15px -10px darkred;
background: powderblue;
transform: translate(-0.1em,-0.1em);
}
.bcard-wrapper >a{
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
text-indent: -999px;
z-index: 2;
}
.bcard-site,.bcard-url{
font-size: 12px;
line-height: 1.3;
overflow: hidden;
max-height: 15px;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 1;
}
.bcard-header {
position: relative;
height: 16px;
display: block;
}
.withgfav{
margin: 0.1em 0.1em 0.3em 0.1em;
padding: 2px 23px 2px 23px;
}
.bcard-favicon {position: absolute;
top: 0px; left:0px; width:16px; height:16px;}
.bcard-main{
overflow: hidden;
position: relative;
display: block;
}
.withogimg{
padding-right: 170px;
height: 134px;
}
.bcard-img {
width: 165px;
height: 134px;
position: absolute;
top: 0;
right: 0;
background-size:cover;
background-position:center center;
}
.bcard-title{
font-size: 20px;
margin: 0 0 2px;
line-height: 1.4;
overflow: hidden;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
font-weight: bold;
}
.bcard-description {
line-height: 1.5;
font-size: 12px;
max-height: 72px;
overflow: hidden;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
}
.bcard-title a{
color:#424242!important;
text-decoration:none!important;
}
.bcard-url a{color:#9e9e9e;}
.bcard-title a:hover,.bcard-url a:hover,.bcard-site a:hover{text-decoration:underline;}
使用上の注意点
Sourceタブ上のほうが使いやすいです
参考GIFでは、わかりやすいようにSourceタブ上で変換しましたが、Editタブ上だとリンク先コピペ時にリンクがくっついてきます。リンクがくっついたままだと、上手く動作しません。タグごと引き渡してしまうため、リンク先からOGP情報をひっぱってこられずエラーになります。コード側で分離するとかは、めんどくさいので実装しませんでした。Editタブ上で使う場合は、貼り付け後に、リンクを切るひと手間が必要です。なお、リンクを右クリックして [Remove hyperlink] でリンクを切ることができます。
OGP情報のないリンク先では使えない
もちろんですが、OGP情報がないリンク先は真っ白な箱だけリンクになってしまいます。
自動更新とかはされない
このテンプレ動作させた時にOGP情報を取りに行ってるので、後々にリンク先が変わっても更新されたりはしません。
遅かったり、危なかったり、するかも
リンク先を全読み取りして、OGP情報を検索しているだけなので、リンク先が重たかったりすると重いし、危険なスクリプトとかに弱かったりするかもしれません。そういうところは自己責任でお願いします。
コメント
6 件のコメント :
カードがリンクになってないですね。ソースコード見たら a タグが入ってない(^^;
あれれ?
82行目のとこに a タグいれてあるんですけど、うまくいきませんかね?
いや、実際試してないのでわかりませんけど、このブログに貼ってあるカードがそういう状態なので(^^;
確かにここのカードは、aタグ入ってないですね。
もう一回やり直したら入りました。
編集時に誤って消してしまったかもしれないです。ちょっと他のページも確認してみます。 ありがとうございます。
とんでもないことが判明しました。
Dynamic Templateの実行では、aタグ入ります。Publish します。これは、OK。
編集するために、再度、ダウンロードして開きます。ここでHTML確認。aタグいます。まだOK。全体のHTMLは詰まった状態。
この後、EditやPreviewタブでチェックした後、Sourceに戻ると、ある程度整形された状態になってます。
Bloggerの編集画面でいうところの、"HTMLの書式を設定”を押したみたいな状態です。
この時に、aタグ無くなっちゃいます。
この場所のaタグって、innertext ないからかなぁ。ちょっと小細工しないと危険すぎるwww
テストしたら、aタグの中身にdummyと文字を入れておくと消えなかったです。ここは、どうせ見えないので、これ入れた状態でごまかしておきます。しかし、整形の時に消されちゃうとは思ってなかったです。
ということで、本文中のコードも修正しました。
コメントを投稿