preのなかを引っこ抜いて新規Windowごときが大変で

今回もpygmentize関係のネタ。

コード引用で「Ctrl-ダブルクリック」で新規ウィンドウで目一杯、を実現させてみたの。横に長すぎてストレスが溜まる以下で実際にやってみて:

 1 import math
 2 
 3 # calculate Julius year (year from 2000/1/1, for variable "t")
 4 def jy(yy, mm, dd, h, m, s, i): # yy/mm/dd h:m:s, i: time difference
 5     #yy -= 2000
 6     #if (mm <= 2):
 7     #    mm += 12
 8     #    yy -= 1
 9     #
10     #k = 365 * yy + 30 * mm + dd - 33.5 - i / 24.0 + math.floor(3 * (mm + 1) / 5.0) 
11     #    + math.floor(yy / 4.0) - math.floor(yy / 100.0) + math.floor(yy / 400.0)
12     #k += ((s / 60.0 + m) / 60 + h) / 24.0 # plus time
13     #k += (65 + yy) / 86400.0 # plus delta T
14     #return k / 365.25
15     a_ = (14 - mm) / 12
16     y_ = yy + 4800 - a_
17     m_ = mm + 12 * a_ - 3
18     JDN_ = dd + (153 * m_ + 2) / 5 + 365 * y_ + y_ / 4 - y_ / 100 + y_ / 400 - 32045
19     JD_ = JDN_ + (h - 12 - i) / 24. + m / 1440. + s / 86400.
20     return JD_
21 
22 jy_ = jy(2013, 4, 2, 0, 0, 0, 9)
23 lw_ = -139.7909446414986
24 le_ = -lw_
25 phi_ = 35.54131474808071
26 height_ = 0.
27 
28 naster_ = jy_ - 2451545.0009 - lw_ / 360.
29 #naster_ = jy_ - 2451545.0009 + le_ / 360.
30 n_ = round(naster_) #
31 jaster_ = 2451545.0009 + lw_ / 360. + n_
32 #jaster_ = 2451545.0009 - le_ / 360. + n_
33 M_ = (357.5291 + 0.98560028 * (jaster_ - 2451545)) % 360 #
34 C_ = 1.9148 * math.sin(math.radians(M_)) + 0.0200 * math.sin(math.radians(2 * M_)) + 0.0003 * math.sin(math.radians(3 * M_))
35 lambda_ = (M_ + 102.9372 + C_ + 180.) % 360
36 jtransit_ = jaster_ + 0.0053 * math.sin(math.radians(M_)) - 0.0069 * math.sin(math.radians(2 * lambda_))
37 sin_delta_ = math.sin(math.radians(lambda_)) * math.sin(math.radians(23.45))
38 delta_ = math.degrees(math.asin(sin_delta_))
39 
40 w0_ = math.degrees(
41     math.acos((math.sin(math.radians(-0.83 - 2.076 * math.sqrt(height_) / 60.)) - math.sin(math.radians(phi_)) * sin_delta_) /
42               (math.cos(math.radians(phi_)) * math.cos(math.radians(delta_))))
43     )
44 
45 #jset_ = 2451545.0009 + (w0_ + lw_) / 360. + n_ + 0.0053 * math.sin(math.radians(M_)) - 0.0069 * math.sin(math.radians(2 * lambda_))
46 jset_ = 2451545.0009 + (w0_ - le_) / 360. + n_ + 0.0053 * math.sin(math.radians(M_)) - 0.0069 * math.sin(math.radians(2 * lambda_))
47 jrise_ = jtransit_ - (jset_ - jtransit_)
48 #print(jrise_, jset_)
49 
50 jrise_h_ = int((jrise_ - jy_) * 24)
51 print(jrise_h_, ((jrise_ - jy_) * 1440) % 60)
52 jtransit_h_ = int((jtransit_ - jy_) * 24)
53 print(jtransit_h_, ((jtransit_ - jy_) * 1440) % 60)
54 jset_h_ = int((jset_ - jy_) * 24)
55 print(jset_h_, ((jset_ - jy_) * 1440) % 60)
56 
57 #print(__timefromdecimalday(jrise_*(1e11)), __timefromdecimalday(jset_*(1e11)))

パーフェクトに満足いくものでないことは、多分わかってもらえると思う。せっかくの行番号表示非表示・プロンプトと結果の表示非表示は引き継げていない。

これね、難しいのなぁ…。

 1 jQuery(function($) {
 2   // ...snip...
 3   $(document).ready(function() {
 4     // ...snip...
 5     var div = $('.pygments .highlight');
 6     var pre = div.find('pre');
 7 
 8     pre.each(function (i) {
 9       /* double-click to select all, mainly for chrome...*/
10       $(this).on('dblclick', function(e) {
11         if (e.ctrlKey) {
12           var head = $('head').html();
13           var contents =
14             '<div class="pygments"><div class="highlight"><pre title="Ctrl-A to select all">' +
15             $(this).html() +
16             '</pre></div></div>';
17           var nw = window.open();
18           nw.document.head.innerHTML = head;
19           $(nw.document.body).html(contents);
20         } else {
21           // ...snip...
22         }
23       });
24       this.title = 'double-click to select all.\n\nctrl-double-click to new window.';
25       // ...snip...

元の head をそのまんま新しいウィンドウの head に引き継いでるのはわかると思う。のに、なんで pre の外の highlight div、pygments div を捨ててるのか。これは script が効かないから。新しいウィンドウの方のロードに割り込めればイケそうな気もするし、この情報をみるに、それでもイケなそうな気もするし、よくわからない。

パーフェクトとは言えなくてもこれ、実用十分とは言えると思う。そもそもなにゆえに新しいウィンドウで読みたいかといえば、「せせこましいウィンドウサイズで苦痛を感じながら読むのがイヤ、コードだけに集中させろや」というのと、あとはいわゆる印刷フレンドリ、なわけでしょ。新規ウィンドウ側ではあんまり細かい制御、出来なくても良い…と思う。