summaryrefslogtreecommitdiff
path: root/index.html
blob: 0626b4bda001ed0edf4279984a00f9088dd8c45d (plain)
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
<style type="text/css">
#canvas { white-space: pre; font-family: Menlo, monospace; cursor: crosshair; }
.b { background: black; color: transparent }
</style>

<div id="canvas"></div>

<select id="color">
<option value="15" selected>light gray</option>
<option value="1">black</option>
<option value="2">blue</option>
<option value="3">green</option>
<option value="5">red</option>
<option value="6">magenta</option>
<option value="7">orange</option>
<option value="10">cyan</option>
</select>

<script>
var contentType = 'text/plain;charset=utf-8'

var fg = "15", bg = "0"
var cols = 80
var rows = 24
var dragging = false
var erasing = false

function init () {
  build()
  bind()
}
function build () {
  var body = ""
  for (var i = 0; i < rows; i++) {
    for (var j = 0; j < cols; j++) {
      body += "<span y='" + i + "' x='" + j + "'> </span>"
    }
    body += "<br>"
  }
  canvas.innerHTML = body
}
function bind () {
  aa(document.querySelectorAll("span")).forEach(function(span){
    span.addEventListener('mousedown', function(e){
      e.preventDefault()
      dragging = true
      erasing = !! (span.className == "b")
      span.className = erasing ? "" : "b"
      span.innerHTML = erasing ? " " : "b"
    })
    span.addEventListener("mousemove", function(){
      if (dragging) {
        span.className = erasing ? "" : "b"
        span.innerHTML = erasing ? " " : "b"
      }
    })
  })
  window.addEventListener('mouseup', function(){
    dragging = erasing = false
  })
  color.addEventListener('change', function(){
    fg = bg = color.value
    var c = document.querySelector("option:checked").innerHTML
    cssRule(".b", "background: " + c)
  })
}
function aa (alike) {
  return Array.prototype.slice.call(alike)
}

function ascii () {
  var lines = []
  canvas.innerText.split("\n").forEach(function(row){
    if (row.indexOf("b") == -1) return
    var last_c = " "
    var line = ""
    row.replace(/\s+$/,"").split("").forEach(function(c){
      if (c == last_c) {
        line += c
      }
      else {
        if (c == "b") {
          line += "\\x03" + fg + "," + bg + c
        }
        else {
          line += "\\x03" + c
        }
        last_c = c
      }
    })
    if (last_c == "b") {
      line += "\\x03"
    }
    lines.push(line)
  })
  var txt = '/exec -out printf "' + lines.join("\\n") + '"\n'
  return txt
}

document.body.addEventListener('copy', function (e) {
  if (e.clipboardData) {
    e.preventDefault();
    e.clipboardData.setData(contentType, ascii());
  }
  if (window.clipboardData) {
    e.returnValue = false;
    window.clipboardData.setData(contentType, ascii());
  }
}, false);

window.cssRule = function (selector, declaration) {
  var x = document.styleSheets,y=x.length-1;
  x[y].insertRule(selector+"{"+declaration+"}",x[y].cssRules.length);
};

init()
</script>