<!DOCTYPE html> <style> #break-test { word-break:break-all; font:50px/1 Ahem; width:3em; } #result { font:15px/1 monospace; white-space:pre; } </style> <div id="result"></div> <div id="break-test"></div> <script> var beginChar = 33; var endChar = 127; var breakTest = document.getElementById("break-test"); var breakTestFontsize = parseFloat(getComputedStyle(breakTest).fontSize); var nbsp = String.fromCharCode(0xA0); nbsp = nbsp + nbsp; var matrix = getLineBreakMatrix(); var header = []; for (var i = 0; i < matrix.length; i++) header.push(String.fromCharCode(beginChar + i)); var rows = [" " + header.join("")]; for (var i = 0; i < matrix.length; i++) { rows.push(String.fromCharCode(beginChar + i) + " " + matrix[i].map(function (canBreak) { return canBreak ? "/" : "X"; }).join("")); } result.textContent = rows.join("\n"); function getLineBreakMatrix() { var matrix = []; for (var last = beginChar; last < endChar; last++) { var canBreakBefore = []; for (var current = beginChar; current < endChar; current++) canBreakBefore.push(canBreakBetween(last, current)); matrix.push(canBreakBefore); } return matrix; } function canBreakBetween(last, current) { breakTest.textContent = nbsp + String.fromCharCode(last) + String.fromCharCode(current); return breakTest.offsetHeight / breakTestFontsize > 1.9; } breakTest.textContent = ""; if (window.testRunner) testRunner.dumpAsText(); </script>