File: notes.js

package info (click to toggle)
golang-golang-x-tools 1%3A0.25.0%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 22,724 kB
  • sloc: javascript: 2,027; asm: 1,645; sh: 166; yacc: 155; makefile: 49; ansic: 8
file content (175 lines) | stat: -rw-r--r-- 5,107 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
// Copyright 2016 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Store child window object which will display slides with notes
var notesWindow = null;

var isParentWindow = window.parent == window;

// When parent window closes, clear storage and close child window
if (isParentWindow) {
  window.onbeforeunload = function() {
    localStorage.clear();
    if (notesWindow) notesWindow.close();
  };
}

function toggleNotesWindow() {
  if (!isParentWindow) return;
  if (notesWindow) {
    notesWindow.close();
    notesWindow = null;
    return;
  }

  initNotes();
}

// Create a unique key for the local storage so we don't mix the
// destSlide of different presentations. For golang.org/issue/24688.
function destSlideKey() {
  var key = '';
  if (notesWindow) {
    var slides = notesWindow.document.getElementById('presenter-slides');
    key = slides.src.split('#')[0];
  } else {
    key = window.location.href.split('#')[0];
  }
  return 'destSlide:' + key;
}

function initNotes() {
  notesWindow = window.open('', '', 'width=1000,height=700');
  var w = notesWindow;
  var slidesUrl = window.location.href;

  // Hack to apply css. Requires existing html on notesWindow.
  w.document.write("<div style='display:none;'></div>");

  w.document.title = window.document.title;

  var slides = w.document.createElement('iframe');
  slides.id = 'presenter-slides';
  slides.src = slidesUrl;
  w.document.body.appendChild(slides);

  var curSlide = parseInt(localStorage.getItem(destSlideKey()), 10);
  var formattedNotes = '';
  var section = sections[curSlide - 1];
  // curSlide is 0 when initialized from the first page of slides.
  // Check if section is valid before retrieving Notes.
  if (section) {
    formattedNotes = formatNotes(section.Notes);
  } else if (curSlide == 0) {
    formattedNotes = formatNotes(titleNotes);
  }

  // setTimeout needed for Firefox
  setTimeout(function() {
    slides.focus();
  }, 100);

  var notes = w.document.createElement('div');
  notes.id = 'presenter-notes';
  notes.innerHTML = formattedNotes;
  w.document.body.appendChild(notes);

  w.document.close();

  function addPresenterNotesStyle() {
    var el = w.document.createElement('link');
    el.rel = 'stylesheet';
    el.type = 'text/css';
    el.href = PERMANENT_URL_PREFIX + 'notes.css';
    w.document.body.appendChild(el);
    w.document.querySelector('head').appendChild(el);
  }

  addPresenterNotesStyle();

  // Add listener on notesWindow to update notes when triggered from
  // parent window
  w.addEventListener('storage', updateNotes, false);
}

function formatNotes(notes) {
  var formattedNotes = '';
  if (notes) {
    for (var i = 0; i < notes.length; i++) {
      formattedNotes = formattedNotes + '<p>' + notes[i] + '</p>';
    }
  }
  return formattedNotes;
}

function updateNotes() {
  // When triggered from parent window, notesWindow is null
  // The storage event listener on notesWindow will update notes
  if (!notesWindow) return;
  var destSlide = parseInt(localStorage.getItem(destSlideKey()), 10);
  var section = sections[destSlide - 1];
  var el = notesWindow.document.getElementById('presenter-notes');

  if (!el) return;

  if (section && section.Notes) {
    el.innerHTML = formatNotes(section.Notes);
  } else if (destSlide == 0) {
    el.innerHTML = formatNotes(titleNotes);
  } else {
    el.innerHTML = '';
  }
}

/* Playground syncing */

// When presenter notes are enabled, playground click handlers are
// stored here to sync click events on the correct playground
var playgroundHandlers = { onRun: [], onKill: [], onClose: [] };

function updatePlay(e) {
  var i = localStorage.getItem('play-index');

  switch (e.key) {
    case 'play-index':
      return;
    case 'play-action':
      // Sync 'run', 'kill', 'close' actions
      var action = localStorage.getItem('play-action');
      playgroundHandlers[action][i](e);
      return;
    case 'play-code':
      // Sync code editing
      var play = document.querySelectorAll('div.playground')[i];
      play.innerHTML = localStorage.getItem('play-code');
      return;
    case 'output-style':
      // Sync resizing of playground output
      var out = document.querySelectorAll('.output')[i];
      out.style = localStorage.getItem('output-style');
      return;
  }
}

// Reset 'run', 'kill', 'close' storage items when synced
// so that successive actions can be synced correctly
function updatePlayStorage(action, index, e) {
  localStorage.setItem('play-index', index);

  if (localStorage.getItem('play-action') === action) {
    // We're the receiving window, and the message has been received
    localStorage.removeItem('play-action');
  } else {
    // We're the triggering window, send the message
    localStorage.setItem('play-action', action);
  }

  if (action === 'onRun') {
    if (localStorage.getItem('play-shiftKey') === 'true') {
      localStorage.removeItem('play-shiftKey');
    } else if (e.shiftKey) {
      localStorage.setItem('play-shiftKey', e.shiftKey);
    }
  }
}