質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Markdown

Markdownは、文書の構造、修飾情報を記述するための軽量マークアップ言語です。

Ghost

Ghost はNode.jsで動作するCMS"Ghost"はWordPressから独立したシンプルなCMSです。

Q&A

解決済

1回答

2615閲覧

Ghost での Markdown表記方法(テーブル表現)について。

EzrealTrueshot

総合スコア388

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Markdown

Markdownは、文書の構造、修飾情報を記述するための軽量マークアップ言語です。

Ghost

Ghost はNode.jsで動作するCMS"Ghost"はWordPressから独立したシンプルなCMSです。

0グッド

0クリップ

投稿2015/10/28 17:50

編集2015/10/28 17:51

###前提・実現したいこと
ghost blog の中でmarkdown表記ができるのですが
どうやら、markdownでテーブルを表現することができないようなのです。(有名な話?)

###発生している問題・エラーメッセージ

| Left align | Right align | Center align | |:-----------|------------:|:------------:| | This | This | This | | column | column | column | | will | will | will | | be | be | be | | left | right | center | | aligned | aligned | aligned |

テーブル表記ができないのです。

http://multix.jp/addon-markdown-table/

上記URLを参考にしてみたのですがいまいち内容が理解できていないせいか、テーブル表記が再現できません。
お手数おかけしてすみませんが、テーブル表記させる方法をご存知の方いらっしゃいましたら教えて頂けないでしょうか?

上記サイトの下記2つのスクリプトをどのように呼び出したらいいのかわからず、困っております。

jquery.ex-mark-table.js

// // jquery.ex-mark-table.js // // $Id: mark-table.js 143 2015-05-08 09:31:06Z askn $ // (function ($) { $.fn.markTable = function (config) { var defaults = { className: 'mark-table' } var options = $.extend(defaults, config); return this.each( function (i) { var title = $(this).attr("title"); var $exported = $("<table/>"); var $body = $("<tbody/>"); var table = [], align = [], header = []; var imported = $(this).html().split(/([^\n]*\n)/); while (imported.length) { var line = imported.shift(); if (line) { if (line.length == 0) continue; var column = line.match(/([^\|]*\|)/g); if (column && column.length > 0) { column.shift(); table.push($.map(column, function (val, index) { return val.replace(/\|$/, ""); })); } } } if (title != undefined) { $("<caption/>").text(title).appendTo($exported); } if (table.length && table[0].length && !table[0][0].match(/(^\:-|-\:$)/)) { header = table.shift(); } if (table.length && table[0].length && table[0][0].match(/(^\:-|-\:$)/)) { align = $.map(table.shift(), function (val, index) { if (val.match(/^\:\-*\:$/)) { return "center"; } else if (val.match(/^\-*\:$/)) { return "right"; } else { return "left"; } }); } if (header.length) { var $head = $("<tr/>"); $.each(header, function (key, val) { var $column = $("<th/>").html(val); if (align[key]) { $column.addClass(align[key]); } $head.append($column); }); $("<thead/>").append($head).appendTo($exported); } if (table.length) { while (table.length) { var $line = $("<tr/>"); $.each(table.shift(), function (key, val) { var $column = $("<td/>").html(val); if (align[key]) { $column.addClass(align[key]); } $line.append($column); }); $line.appendTo($body); } $body.appendTo($exported); } $(this).replaceWith($("<div/>").addClass(options.className).append($exported)); }); }; })(jQuery); // End of Script

index.js

(function pageInit () { $('code[class^="language-"]').each(function () { var $this = $(this); var attr = $this.attr('class').replace(/^language-?/, ''); var match = attr.match(/title:(.*)/); if (match) { $this.parent().attr('title', match[1]); attr = attr.replace(/title:.*/, ''); } if (attr != null && attr.match(/^table/)) { // マークダウンテーブル $this.parent().html($this.html()).markTable(); } }); })();

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

結論から言えば、ghost/content/themes/casper/default.hbsにjqueryの<script>要素があるので、その下に、新しく、script要素を2つ追記すれば動作します。これは自己責任のコード改変になります

まず、ghostの記事中は以下のような状態で保存されていなければなりません。

イメージ説明

この状態で記事を投稿すると、フロントには下記のようなHTMLが生成されます。

イメージ説明

jquery.ex-mark-table.jsで行うのは、この生成されたcode要素の改変です。
ghost/content/themes/casper/default.hbsに、下記<script>を2つ挿入します。

html

1<script> 2// 3// jquery.ex-mark-table.js 4// 5// $Id: mark-table.js 143 2015-05-08 09:31:06Z askn $ 6// 7(function ($) { 8 $.fn.markTable = function (config) { 9 var defaults = { 10 className: 'mark-table' 11 } 12 var options = $.extend(defaults, config); 13 return this.each( function (i) { 14 var title = $(this).attr("title"); 15 var $exported = $("<table/>"); 16 var $body = $("<tbody/>"); 17 var table = [], align = [], header = []; 18 var imported = $(this).html().split(/([^\n]*\n)/); 19 while (imported.length) { 20 var line = imported.shift(); 21 if (line) { 22 if (line.length == 0) continue; 23 var column = line.match(/([^\|]*\|)/g); 24 if (column && column.length > 0) { 25 column.shift(); 26 table.push($.map(column, function (val, index) { 27 return val.replace(/\|$/, ""); 28 })); 29 } 30 } 31 } 32 if (title != undefined) { 33 $("<caption/>").text(title).appendTo($exported); 34 } 35 if (table.length && table[0].length && !table[0][0].match(/(^\:-|-\:$)/)) { 36 header = table.shift(); 37 } 38 if (table.length && table[0].length && table[0][0].match(/(^\:-|-\:$)/)) { 39 align = $.map(table.shift(), function (val, index) { 40 if (val.match(/^\:\-*\:$/)) { 41 return "center"; 42 } 43 else if (val.match(/^\-*\:$/)) { 44 return "right"; 45 } 46 else { 47 return "left"; 48 } 49 }); 50 } 51 if (header.length) { 52 var $head = $("<tr/>"); 53 $.each(header, function (key, val) { 54 var $column = $("<th/>").html(val); 55 if (align[key]) { 56 $column.addClass(align[key]); 57 } 58 $head.append($column); 59 }); 60 $("<thead/>").append($head).appendTo($exported); 61 } 62 if (table.length) { 63 while (table.length) { 64 var $line = $("<tr/>"); 65 $.each(table.shift(), function (key, val) { 66 var $column = $("<td/>").html(val); 67 if (align[key]) { 68 $column.addClass(align[key]); 69 } 70 $line.append($column); 71 }); 72 $line.appendTo($body); 73 } 74 $body.appendTo($exported); 75 } 76 $(this).replaceWith($("<div/>").addClass(options.className).append($exported)); 77 }); 78 }; 79})(jQuery); 80 81// End of Script 82</script> 83<script> 84 // 呼び出しサンプル 85$(function() { 86 $('code[class^="language-"]').each(function () { 87 var $this = $(this); 88 var attr = $this.attr('class').replace(/^language-?/, ''); 89 var match = attr.match(/title:(.*)/); 90 if (match) { 91 $this.parent().attr('title', match[1]); 92 attr = attr.replace(/title:.*/, ''); 93 } 94 if (attr != null && attr.match(/^table/)) { 95 // マークダウンテーブル 96 $this.parent().html($this.html()).markTable(); 97 } 98 }); 99}); 100</script>

競合を避けるためにも、挿入位置は<script>の最後、46行目あたりが好ましいです。
ghostを再起動してください。適用されない場合、htmlのキャッシュが残っているので、npm i express-hbsなどでキャッシュを削除してください。

イメージ説明

記事本文では、code要素が先ほど見せたとおり生成されていますので、jqueryで正しく処理できたことが確認できます。

イメージ説明

code要素が生成されない、ドメイン直下で正しく動作しないことに注意してください。

イメージ説明

投稿2015/10/28 22:01

編集2015/10/28 22:05
horse_n_deer

総合スコア452

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

EzrealTrueshot

2015/10/29 02:15

とても丁寧で、非常にわかりやすい説明誠にありがとうございます! ただ・・・ https://twitter.com/EzrealTrueshot/status/659553599219896320 このように表示されてしまいまして、horse_n_deer様のように表示されません。 この他に何か特別ことをしなければいけないのでしょうか?
horse_n_deer

2015/10/29 10:25 編集

僕はデフォルトのスタイルで確認して、スクリーンショットの結果になったので、恐らくですが、後から追加したプラグインやcssなどが影響しているのではないでしょうか? https://teratail.com/uploads/contributed_images/741ce38f2d2481ab10cb002351a73978.png GoogleChromeであれば、生成された要素を右クリックして、「要素の検証」を行うと、jsによって変更された要素や、現在適用されているcssが確認できます。 適用されたcssが原因であれば、スクリーンショット画面右下、Stylesタブ内で、ファイルの場所、コードの行数が確認できます。 これを修正するには、強い指定(css 詳細度で検索してください)でcssを上書きするか、影響しているcssを削除する。など方法があります。 jsが原因であれば特定は難しいです。ghostをもう一つ作成して、何が原因でデザインが崩れ始めたのか検証する必要があります。
EzrealTrueshot

2015/10/29 13:09

ありがとうございます! やってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問