Youtubeでも活動中

チャンネル登録してくれたら喜びます。

このボタンで簡単にチャンネル登録!

信号機のプラモデルにLEDを仕込んでArduinoで制御した話

installing-leds-in-trafic-signal-with-an-arduino-nanoArduino(マイコンボード)

今回は電子工作というよりもDIYに近いような内容です。

具体的には、題名の通り、信号機を作りました。

信号機のベースはプラモデルなのでさすがに信号機本体は買い物です。

こんな感じで信号機もプラモデルが販売されているので、こちらを購入しました。

もちろん当たり前ですがプラモデルなのでLEDなんかついてきません。

LEDを仕込んだり、配線用の穴をあけたりするのは

すべて自分でやらないといけません。

使用した道具なんかも参考のために紹介しますのでご安心を。

まずは動きがどんな感じになったのかについて動画を上げているのでご覧ください。

信号機のプラモデルをArduinoで制御して最近購入した撮影機材で撮影した様子

どうでしょうか?なかなかうまくできていると思いませんか?

コメント欄にあった横に光が漏れるのがちょっと対策不足でしたが、

おおむね思い通りに作成できたかな?というのが正直な感想です。

実はこの工作に至った経緯としては、

わたしの職場の同僚のお子さんが最近信号機を見てテン上げになるらしく、

ジオラマチックに信号機があったらいいなあ。

とのことで製作することになりました。

その話があって、その日のうちにAmazonで信号機のプラモデルをぽちってました…

それでは本題の製作過程についてご紹介していきます。

自己紹介

東証一部上場企業でサラリーマンしてます。

主に工場(生産現場)で使用する検査装置のアプリケーション開発してます。

ヒトの作業を自動化して簡略化するアプリケーションを日々開発中。

転職に成功して現在は超大手企業でシステム系の開発をしています。

Youtubeチャンネルにさまざまな動画を上げています

↓↓↓こちらからYoutubeチャンネルにアクセス!! ↓↓↓

今回使用した道具たち

それでは早速今回使用した道具をご紹介します。

本体・加工用のツール・電装関係・制御関係に分けてご紹介していきます。

本体編

信号機本体

本体はこちら、フジミ模型の1/24 No.35 EX-1 交通信号機セットです。

↓クリックでAmazonの商品ページに飛ぶことができます。

お値段は大体3,000円弱で購入可能です。

青・黄色・赤のシールが付属しているため、

改造しない場合は普通にシールを貼って信号機の再現が可能です。

今回は使用しませんでした。

ディスプレイ用のケース

ほかに、そのままの状態でプレゼントすることも考えたのですが、

小さいお子さんに向けてのモノだったので囲いが必要と考え、

フィギアのディスプレイなんかに使うケースも購入しました。

↓クリックでAmazonの商品ページに飛ぶことができます。

歩行者用・車両用の2セットを直角に並べてちょうどいいサイズでした。

高さも十分でしたのでディスプレイしたい場合は購入しておいたほうが良いでしょう。

ホコリもブロックできますしね。

ディスプレイを持ち上げる足

これは、文字通りディスプレイ、つまりケースをかさ上げする足です。

なぜ足が必要なのか?というと、配線を出せるのが底面だけだったからですね。

側面はきれいなアクリル板ですから、そこに穴あけして配線を通すのは

美しくないという個人的な判断です。

四隅に足を立てて、浮かせることで土台の下に配線を這わせる構想にしました。

使用したのは六角支柱というものです。

よくマイコンボードの裏側をショートさせないようにするためにかさ上げするためのあれです。

基板スタッドとか、六角スペーサーとか呼ばれることもあるようです。

わたしはマイコンボードを多数所有していて、実際ArduinoUNOの裏側を

保護するために使用していましたので在庫がありました。

実際に以前使った時の記事も上げておきますね。

ArduinoUNOの底面を六角支柱とアクリル板で保護した記事

樹脂製ですが強度的には特に問題なさそうでしたね。

↓クリックでAmazonの商品ページに飛ぶことができます。

注意点としては、先ほど紹介したディスプレイケースを使用する場合は、

底板が10mmの厚さになっています。

そのため10mmを貫通させられるようにしておかないといけません。

ですから、ねじ山が最低でも10mm以上ないといけないわけです。

わたしの場合は、両方メスのねじの六角支柱に、

10mm以上のねじを信号機側から入れて締結しました。

加工用のツール編

さて、加工するために使用したツールです。

これらはもともと所有していたものだったので新規購入はしていません。

今回のようにプラモデルを改造するときなんかは、

一通りあるといざというときに役に立つかもしれないです。

穴あけ工具

穴あけ工具は多数ありますが、ハンドツールとなると種類が限られます。

この工作をするためだけに電動ドリルなんて買わないほうが良いです。

もちろんすでに所有されている場合はそのまま使用したほうが効率が良いです。

わたしの場合は、ピンバイスを使用しました。

↓クリックでAmazonの商品ページに飛ぶことができます。

手作業なので時間はかかりますが、失敗が少なく確実です。

リューターを使ったほうが良かったなと後で思いましたが、

まあそこそこ音も出るし、カスが飛び散るしということで

今回はピンバイスで穴あけしました。

一応リューターも所有しています。主に削るときに使えます。穴あけも一応できます。

↓クリックでAmazonの商品ページに飛ぶことができます。

デザインナイフ

デザインナイフは、信号機の右折矢印のシールをきれいに切ったり、

この後出てくる制御ボックスからUSBを挿せるように四角い穴をあけるのに使用しました。

↓クリックでAmazonの商品ページに飛ぶことができます。

カッターでもいいんですが、カッターだと強い力で切っていると刃が戻ってしまうことや、

デザインナイフのほうが刃の角度が鋭角なので細かいところを切りやすいなどいろいろと

メリットがあります。値段も大したことないので、1本持っておくと便利ですよ。

接着材

接着剤については2つ使用しました。

プラモデルを作るための接着剤

これは純粋にプラモデルの部品同士を接着するための接着剤です。

↓クリックでAmazonの商品ページに飛ぶことができます。

ガンプラなんか作っていると接着剤不要で部品同士をはめ込むことで

きっちりと固定されますが、この手のプラモデルは接着剤が無いと

ポロっと分解します。車のプラモデルなんかも接着剤が必要ですよね。

amazonだと最低注文数が3個からとなっていて、そんなにいらないんだよな…

なんて思ったり。

固定するためのホットメルト(グルーガン)

こちらは完成した信号機をケースの土台に固定したり、

配線が配線ボックスから抜けないように固定するのに使用しました。

熱で樹脂を液体にすることによって、接着したい部分にくっつき、

冷えるとカチカチに固まって固定できるという代物です。

↓クリックでAmazonの商品ページに飛ぶことができます。

DIYやっていると自然と購入するド定番のツールですね。

最近では100円ショップなんかでも購入できるようですね。

電装関係編

続きまして電装関係で使用したものです。

小さいLED

今回は言ってしまえば、ちょっと光らせるものが多いLチカみたいなものです。

ですから必要となる電装関係もLEDが中心になります。

ただし、注意として普通のサイズの5mmのLEDは信号機に収まりません。

電子工作しているとLEDは複数持っていたりすると思いますが、

普通このサイズですよね?

5mmLED
電子工作でよく登場するLED

このサイズはどう頑張っても入りません。

ですから、これくらい小さいLEDを使用します。

tiny-led
小さいLED

このLEDは、表面実装用と言って、基本は基板にはんだ付けして

基板上で光らせるLEDです。

このLEDに導線をつけて販売してくれているので、ありがたく

これを使用します。

↓クリックでAmazonの商品ページに飛ぶことができます。

外形的に先ほどのLEDの大きさと大差ないように見えますが、

ポイントは発光面です。

このLEDは写真でいうと側面が発光します。

さきほどの5mmのLEDは頂点が発光面となっていて、

もし信号内部に仕込むとすると信号機のレンズにぶつかります。

小さい方のLEDなら寝かせて設置できるので収まるという理屈ですね。

ちなみにここら辺の紹介は、別記事で投稿済みですので、

興味がありましたらご覧ください。

配線延長

↑で紹介したLEDですが、最初から導線が付いていて便利ではあるのですが、

今回は信号機のランプのところから配線ボックスのところまで引き回す時、

どうしても長さが足りなかったので延長しています。

ただ、延長すればいいかというとそういうわけでもなく、

今回LEDが大量につくことになるので、配線の本数がそれなりにあります。

つまり、その配線をすべてこんな感じの被覆付きの導線にしてしまうと、

ぶっ太いケーブルになってしまうわけです。

↓クリックでAmazonの商品ページに飛ぶことができます。

そうなると一気に美しくなくなりますよね。

というわけで、これも以前購入したエナメル線を使用しました。

細い銅線
0.2mm直径の導線

↓クリックでAmazonの商品ページに飛ぶことができます。

この導線に関しては、動画にしていますのでご覧ください。

使い方と注意点についてもお話しています。

0.2mm直径の導線の解説動画

配線隠し

最後に配線隠しです。

配線が細くなったからと言って隠さないとむき出しで美しくないです。

ですからまとめて隠します。

今回は熱収縮チューブを使用しました。

↓クリックでAmazonの商品ページに飛ぶことができます。

5mもいらないだろ。と思ったそこのあなた。

意外と配線の長さは足していくと結構長いです。

5mも今回でほぼ使い切りました。

長いほうが失敗したときも安心ですから長めのものを購入するのを強くオススメします。

制御関係編

さて、制御関係で必要なものですが、

主に基板関係ですね。次のようなものを使用しました。

ArduinoNano

今回は手持ちのArduinoNanoを使用しました。

この後、制御用のソースコードも公開しているのですが、

これはArduinoNanoのピン配置に合わせて実装しています。

STM32でもArduinoUNOでもRaspberryPiPicoでもESP32でも何でもいいのですが、

手っ取り早く作りたいのであれば、Arduino Nanoをオススメします。

とはいえ、ただのLチカですから、他のお気に入りの

マイコンボードなんかがあればそれで充分です。

使い慣れたマイコンボードのほうがスムーズに作成できますよね。

↓クリックでAmazonの商品ページに飛ぶことができます。

ユニバーサル基板

今回はブレッドボードではなく、ユニバーサル基板を使用しています。

理由は簡単で、サイズと安定性です。

ブレッドボードは簡単に接続できて便利なのですが、

サイズが大きく、そのために制御用のボックスが大きくなるのがちょっと…

というのと、ジャンパーワイヤーで接続するので抜けやすい。

という判断です。

ユニバーサル基板であればしっかりとはんだ付けすることになるので、

省スペースかつ抜けの心配もありません。

↓クリックでAmazonの商品ページに飛ぶことができます。

↑で紹介しているのは、実際にわたしが購入したキットなのですが、

この記事執筆時点で在庫切れになっています。9月ごろから欠品しているようで

再入荷はしないようですので、別のキットを探さないといけません。

このキットのポイントは、さまざまなサイズのユニバーサル基板が含まれていること、

それから専用のスタッド(足)、配線用のターミナルブロックが付いてきたりと、

使うものがセットになっていて便利だったんですよね。

ターミナルブロックは使わなくても直接配線をはんだ付けするから必要ない場合も

あるかと思いますが、ねじ止めで配線を止められるのはたまにやりたくなるので、

あっても無駄にはならないですね。

↓この記事執筆時点で購入できる代替品はこんな感じですかね。

↓クリックでAmazonの商品ページに飛ぶことができます。

スタッド(足)が付いてきませんから、それは別で購入する必要があります。

四隅の穴の大きさの記載がないのでM3なのかM2なのかわからないのがちょっと不親切ですね…

もしM3だったら上のほうで紹介したスタッドが使えます。

万が一M2だった場合はこのM2Ver.を購入すれば対応できるはずです。

↓クリックでAmazonの商品ページに飛ぶことができます。

ただ、本体を持ち上げるためにM3の六角支柱を使用していますが、

この六角支柱までM2にしてしまうと強度的にちょっと怪しくなるので、

すべてをM2の六角支柱にするのは避けたほうが良いと思います。

あくまでディスプレイケースを持ち上げる支柱はM3にしたほうが無難です。

トグルスイッチ

これは無くても動きます。

用途としては、電源が入っていても、

トグルスイッチでON/OFFが手元でできるようにです。

電源を入れた瞬間からArduinoのプログラムが走るわけですが、

このスイッチがないと、電源のON/OFFがケーブルの抜き差しになってしまうわけです。

常につなぎっぱなしだよ、なのかそんなに登場機会が無い場合は

ケーブルの抜き差しで対応するのも全然ありだと思います。

ただ、今回は人にプレゼントするものでしたし、

どのように運用するかはお任せですから、スイッチはつけることにしました。

↓クリックでAmazonの商品ページに飛ぶことができます。

基板ボックス

これはArduinoとユニバーサル基板、トグルスイッチをつけるための箱です。

安定のタカチのケースでちょうどいいものがあったので、

これを加工して使用しました。

↓クリックでAmazonの商品ページに飛ぶことができます。

ユニバーサル基板や配線の類は基本的に触れるようになっているのはNGです。

自分しか触らない場合であれば、なにがどこにつながっていて、

ここを触ったら何V流れて…なんてわかりますが、

作成者以外はわからないと思っておくべきです。

ですから、危険性に関わらず電気が流れる基板や配線関係は

触れないようにカバーしておきます。

そのときによく使うのがタカチの基板ボックスですね。

加工性もそこそこ良いので、手加工で専用のボックスが作れます。

この基板ボックスも大きさのバリエーションも結構あるので、

その時その時でベストな大きさのボックスを選択できるのは

とても強いです。3Dプリンターで作ることも可能なのですが、

見た目的にもやはり成形品のほうがキレイですからね…

基板用の足

再度登場です。基板の裏側がショートしないようにするための足です。

ショートしないようにという用途もありますが、

さらに、今回はユニバーサル基板ですから、

これを箱にしっかり固定しておかないと、中でカタカタ動きます。

カタカタ動くと配線にダメージが入って最悪断線します。

なんとなく想像できますよね…

ですから今回はショート防止というよりも固定がメインの使い道になります。

先ほど紹介したユニバーサル基板で、

わたしが使っているキットには含まれているが、在庫切れ。

というお話をしたと思います。

ユニバーサル基板を購入して、実際に四隅の穴がM3用なのかM2用なのか

しっかり調べてから足(スタッド)を購入するようにしましょう。

基板上で配線を取りまわす線

今回はユニバーサル基板で実装しますので、

ブレッドボードのようにいろんなところが導通しているわけではありません。

ですから、イメージとしては、Arduinoの出力ピンを

基板上で伸ばして、そこにLEDの±をはんだ付けする感じです。

ですから、このようなスズメッキ線というものを使用して、

基板上に線を引きます。

↓クリックでAmazonの商品ページに飛ぶことができます。

この線は、エナメル線の時の動画でも登場しましたが、

どこでも導通する針金のようなものです。

ユニバーサル基板上にはんだで固定するわけですが、

意図しないところにちょこっとつくだけでショートの原因になりますから、

しっかりと折り目をつけて他のパターンに接触しないように気をつけましょう。

もちろんArduinoの出力ピンに直接LEDの±線をはんだすることも

可能ではありますが、美しくないので却下です。

はんだ

ここまでではんだというワードが結構出てきましたが、

ユニバーサル基板を使用する以上、はんだは必須です。

最近ではAmazonではんだキットが売っていますので、

持っていない場合は買ってみるといいと思います。

↓クリックでAmazonの商品ページに飛ぶことができます。

↑クリックして値段チェックしてもらえればわかりますが、

テスターやはんだの一通りのキットを同梱してこの値段です。

日本製の一流のはんだごての値段と比較してもらうといかに安いかわかってもらえるはずです。

↓クリックでAmazonの商品ページに飛ぶことができます。

Arduino Nanoに書き込むプログラムについて

それでは、制御の具体的な方法について紹介していきましょう。
今回はArduino Nanoの互換機を使用します。

互換機と言っても、しっかりArduino Nanoと同じ動作が可能ですのでご安心を。

ピン配置も純正のArduino Nanoとまったく同じです。

プログラムの流れについてまずは説明しておきましょう。

極端な話

今回はピン数がとても多いLチカです。

Lチカについては以前から記事を作成しておりますので、
Lチカの復習をしたい場合はこちらを参考にしてみてください。

Lチカを紹介した直近の記事

要はLEDをチカチカさせるということですね。

タイミングだけ取ってあげればただのON/OFFだけ。

今回はLチカだと言いましたが、
基本的に使用するコマンドは、

  • pinMode
  • digitalWrite
  • delay

極端な話上記3つだけあれば完成することができます。

永遠に繰り返しますが、これは初めからArduinoのloop関数の中に入れておけば
ループしてくれますから、forすらいりません。

digitalWriteは、各接点ピンのON/OFFのコマンドで、
delayは何もしない、いわゆるウェイトと呼ばれるものですね。

void setup(){
//XXには接続したpin番号を入力。LEDの個数ぶんpinModeの設定が必要。
pinMode(XX,OUTPUT); 
:
:

}
void loop(){
// 順番にLEDを点灯・消灯させて所望の点滅にします。
digitalWrite(XX,HIGH);
}

信号機の動きを再現するために、
どんなふうにLEDのON/OFFをしてあげればいいのか、
実機で確認してみながら試行錯誤してみてください。

今回のまとめ

これで信号機にLEDを仕込んで実物さながらの
ミニチュア信号機がだれでもつくれますね!!

今回は、Fさんにプレゼントしましたが、
後日お子さんがこのプレゼントした信号機で興奮している動画を送っていただきました。

時間こそかかったものの、その動画を見て完成しきってよかったな!!と思えました。

やっぱり人にあげる用で作ると熱が入りますね!

コメント

'}},vars:{discoveredBrushes:null,highlighters:{}},brushes:{},regexLib:{multiLineCComments:XRegExp("/\\*.*?\\*/","gs"),singleLineCComments:/\/\/.*$/gm,singleLinePerlComments:/#.*$/gm,doubleQuotedString:/"([^\\"\n]|\\.)*"/g,singleQuotedString:/'([^\\'\n]|\\.)*'/g,multiLineDoubleQuotedString:XRegExp('"([^\\\\"]|\\\\.)*"',"gs"),multiLineSingleQuotedString:XRegExp("'([^\\\\']|\\\\.)*'","gs"),xmlComments:XRegExp("(<|<)!--.*?--(>|>)","gs"),url:/https?:\/\/[\w-.\/?%&=:@;#]*/g,phpScriptTags:{left:/(<|<)\?(?:=|php)?/g,right:/\?(>|>)/g,eof:!0},aspScriptTags:{left:/(<|<)%=?/g,right:/%(>|>)/g},scriptScriptTags:{left:/(<|<)\s*script.*?(>|>)/gi,right:/(<|<)\/\s*script\s*(>|>)/gi}},toolbar:{getHtml:function(e){function t(e,t){return B.toolbar.getButtonHtml(e,t,B.config.strings[t])}for(var n='
',r=B.toolbar.items,i=r.list,a=0,l=i.length;l>a;a++)n+=(r[i[a]].getHtml||t)(e,i[a]);return n+=""},getButtonHtml:function(t,n,r){return n=e(n),''+e(r)+""},handler:function(e){function t(e){var t=RegExp(e+"_(\\w+)"),n=t.exec(r);return n?n[1]:null}var n=e.target,r=n.className||"",i=s(g(n,".syntaxhighlighter").id),a=t("command");i&&a&&B.toolbar.items[a].execute(i),e.preventDefault()},items:{list:["expandSource","help"],expandSource:{getHtml:function(e){if(1!=e.getParam("collapse"))return"";var t=e.getParam("title");return B.toolbar.getButtonHtml(e,"expandSource",t?t:B.config.strings.expandSource)},execute:function(e){var t=o(e.id);r(t,"collapsed")}},help:{execute:function(){var e=x("","_blank",500,250,"scrollbars=0"),t=e.document;t.write(B.config.strings.aboutDialog),t.close(),e.focus()}}}},findElements:function(e,t){var n=t?[t]:i(document.getElementsByTagName(B.config.tagName)),r=B.config,a=[];if(r.useScriptTags&&(n=n.concat(A())),0===n.length)return a;for(var l=0,s=n.length;s>l;l++){var o={target:n[l],params:p(e,E(n[l].className))};null!=o.params.brush&&a.push(o)}return a},highlight:function(e,t){var n=this.findElements(e,t),r="innerHTML",i=null,a=B.config;if(0!==n.length)for(var l=0,s=n.length;s>l;l++){var o,t=n[l],u=t.target,c=t.params,g=c.brush;if(null!=g){if("true"==c["html-script"]||1==B.defaults["html-script"])i=new B.HtmlScript(g),g="htmlscript";else{var h=b(g);if(!h)continue;i=new h}o=u[r],a.useScriptTags&&(o=M(o)),""!=(u.title||"")&&(c.title=u.title),c.brush=g,i.init(c),t=i.getDiv(o),""!=(u.id||"")&&(t.id=u.id),u.parentNode.replaceChild(t,u)}}},all:function(e){m(window,"load",function(){B.highlight(e)})}};return B.Match=function(e,t,n){this.value=e,this.index=t,this.length=e.length,this.css=n,this.brushName=null},B.Match.prototype.toString=function(){return this.value},B.HtmlScript=function(e){function t(e,t){for(var n=0,r=e.length;r>n;n++)e[n].index+=t}function n(e){for(var n,a=e.code,l=[],s=r.regexList,o=e.index+e.left.length,u=r.htmlScript,c=0,g=s.length;g>c;c++)n=L(a,s[c]),t(n,o),l=l.concat(n);null!=u.left&&null!=e.left&&(n=L(e.left,u.left),t(n,e.index),l=l.concat(n)),null!=u.right&&null!=e.right&&(n=L(e.right,u.right),t(n,e.index+e[0].lastIndexOf(e.right)),l=l.concat(n));for(var h=0,g=l.length;g>h;h++)l[h].brushName=i.brushName;return l}var r,i=b(e),a=new B.brushes.Xml,l=this,s="getDiv getHtml init".split(" ");if(null!=i){r=new i;for(var o=0,u=s.length;u>o;o++)(function(){var e=s[o];l[e]=function(){return a[e].apply(a,arguments)}})();return null==r.htmlScript?(v(B.config.strings.brushNotHtmlScript+e),void 0):(a.regexList.push({regex:r.htmlScript.code,func:n}),void 0)}},B.Highlighter=function(){},B.Highlighter.prototype={getParam:function(e,t){var n=this.params[e];return d(null==n?t:n)},create:function(e){return document.createElement(e)},findMatches:function(e,t){var n=[];if(null!=e)for(var r=0,i=e.length;i>r;r++)"object"==typeof e[r]&&(n=n.concat(L(t,e[r])));return this.removeNestedMatches(n.sort(k))},removeNestedMatches:function(e){for(var t=0,n=e.length;n>t;t++)if(null!==e[t])for(var r=e[t],i=r.index+r.length,a=t+1,n=e.length;n>a&&null!==e[t];a++){var l=e[a];if(null!==l){if(l.index>i)break;l.index==r.index&&l.length>r.length?e[t]=null:l.index>=r.index&&i>l.index&&(e[a]=null)}}return e},figureOutLineNumbers:function(e){var t=[],n=parseInt(this.getParam("first-line"));return y(e,function(e,r){t.push(r+n)}),t},isLineHighlighted:function(e){var t=this.getParam("highlight",[]);return"object"!=typeof t&&null==t.push&&(t=[t]),-1!=h(t,""+e)},getLineHtml:function(e,t,n){var r=["line","number"+t,"index"+e,"alt"+(""+(0==t%2?1:2))];return this.isLineHighlighted(t)&&r.push("highlighted"),0==t&&r.push("break"),'
'+n+""},getLineNumbersHtml:function(e,t){var n="",r=a(e).length,i=parseInt(this.getParam("first-line")),l=this.getParam("pad-line-numbers");1==l?l=(""+(i+r-1)).length:1==isNaN(l)&&(l=0);for(var s=0;r>s;s++){var o=t?t[s]:i+s,e=0==o?B.config.space:S(o,l);n+=this.getLineHtml(s,o,e)}return n},getCodeLinesHtml:function(e,t){e=C(e);for(var n=a(e),r=(this.getParam("pad-line-numbers"),parseInt(this.getParam("first-line"))),e="",i=this.getParam("brush"),l=0,s=n.length;s>l;l++){var o=n[l],u=/^( |\s)+/.exec(o),c=null,g=t?t[l]:r+l;null!=u&&(c=""+u[0],o=o.substr(c.length),c=c.replace(" ",B.config.space)),o=C(o),0==o.length&&(o=B.config.space),e+=this.getLineHtml(l,g,(null!=c?''+c+"":"")+o)}return e},getTitleHtml:function(t){return t?""+e(t)+"":""},getMatchesHtml:function(e,t){function n(e){var t=e?e.brushName||a:a;return t?t+" ":""}for(var r=0,i="",a=this.getParam("brush",""),l=0,s=t.length;s>l;l++){var o,u=t[l];null!==u&&0!==u.length&&(o=n(u),i+=N(e.substr(r,u.index-r),o+"plain")+N(u.value,o+u.css),r=u.index+u.length+(u.offset||0))}return i+=N(e.substr(r),n()+"plain")},getHtml:function(t){var n,r,i,a="",s=["syntaxhighlighter"];return 1==this.getParam("light")&&(this.params.toolbar=this.params.gutter=!1),className="syntaxhighlighter",1==this.getParam("collapse")&&s.push("collapsed"),0==(gutter=this.getParam("gutter"))&&s.push("nogutter"),s.push(this.getParam("class-name")),s.push(this.getParam("brush")),t=w(t).replace(/\r/g," "),n=this.getParam("tab-size"),t=1==this.getParam("smart-tabs")?R(t,n):H(t,n),this.getParam("unindent")&&(t=P(t)),gutter&&(i=this.figureOutLineNumbers(t)),r=this.findMatches(this.regexList,t),a=this.getMatchesHtml(t,r),a=this.getCodeLinesHtml(a,i),this.getParam("auto-links")&&(a=I(a)),"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.match(/MSIE/)&&s.push("ie"),a='
'+(this.getParam("toolbar")?B.toolbar.getHtml(this):"")+''+this.getTitleHtml(this.getParam("title"))+""+""+(gutter?'
'+this.getLineNumbersHtml(t)+"":"")+''+'
'+a+""+""+""+""+""+""},getDiv:function(e){null===e&&(e=""),this.code=e;var t=this.create("div");return t.innerHTML=this.getHtml(e),this.getParam("toolbar")&&m(c(t,".toolbar"),"click",B.toolbar.handler),this.getParam("quick-code")&&m(c(t,".code"),"dblclick",X),t},init:function(e){this.id=f(),u(this),this.params=p(B.defaults,e||{}),1==this.getParam("light")&&(this.params.toolbar=this.params.gutter=!1)},getKeywords:function(e){return e=e.replace(/^\s+|\s+$/g,"").replace(/\s+/g,"|"),"\\b(?:"+e+")\\b"},forHtmlScript:function(e){var t={end:e.right.source};e.eof&&(t.end="(?:(?:"+t.end+")|$)"),this.htmlScript={left:{regex:e.left,css:"script"},right:{regex:e.right,css:"script"},code:XRegExp("(?"+e.left.source+")"+"(?.*?)"+"(?"+t.end+")","sgi")}}},B}();"undefined"!=typeof exports?exports.SyntaxHighlighter=SyntaxHighlighter:null;
タイトルとURLをコピーしました