Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on May 5th, 2012  |  syntax: None  |  size: 6.79 KB  |  hits: 14  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. <!doctype html>
  2. <html>
  3.     <head>
  4.         <title>HTML Typeset Test</title>
  5.     </head>
  6.     <body>
  7.         <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
  8.         <script type="text/javascript">
  9.             var AuroraContext = function(doc)
  10.             {
  11.                 this._doc = doc;
  12.                 this._style = doc.style;
  13.                 this._content = doc.content;
  14.  
  15.                 // create a temporary node for calculating metrics
  16.                 this._metricsRoot = $("<div></div>")
  17.                     .css("position", "absolute")
  18.                     .css("top", "-10000px")
  19.                     .css("left", "-10000px");
  20.  
  21.                 $(document.body).append(this._metricsRoot);
  22.             };
  23.  
  24.             AuroraContext.prototype = {
  25.                 render : function(scale)
  26.                 {
  27.                     this._scale = scale;
  28.  
  29.                     var docRoot = $("<div></div>");
  30.  
  31.                     docRoot
  32.                         .css("white-space", "normal")
  33.                         .css("font-size", Math.round(this._scale * this._style.fontSize) + "px");
  34.  
  35.                     // render content
  36.                     var content = this._doc.content;
  37.  
  38.                     for(var i = 0; i < content.length; ++i)
  39.                     {
  40.                         docRoot.append(this._layoutPage(i, content[i], this._scale));
  41.                     }
  42.  
  43.                     this._metricsRoot.remove();
  44.                     delete this._scale;
  45.  
  46.                     return docRoot;
  47.                 },
  48.  
  49.                 _layoutPage : function(pageNum, page)
  50.                 {
  51.                     var pageRoot = $("<div></div>");
  52.                     var rightMargin, leftMargin;
  53.  
  54.                     if(pageNum % 1 == 1)
  55.                     {
  56.                         leftMargin = this._style.margin.inner;
  57.                         rightMargin = this._style.margin.outer;
  58.                     } else {
  59.                         leftMargin = this._style.margin.outer;
  60.                         rightMargin = this._style.margin.inner;
  61.                     }
  62.  
  63.                     pageRoot
  64.                         .css("padding", (this._scale * this._style.margin.top) + "px " +
  65.                                         (this._scale * rightMargin) + "px " +
  66.                                         (this._scale * this._style.margin.bottom) + "px " +
  67.                                         (this._scale * leftMargin) + "px")
  68.                         .css("width", Math.round(this._scale * (this._style.width - leftMargin - rightMargin)) + "px")
  69.                         .css("height", Math.round(this._scale * (this._style.height - leftMargin - rightMargin)) + "px");
  70.  
  71.                     for(var i = 0; i < page.data.length; ++i)
  72.                     {
  73.                         pageRoot.append(this._layoutBlock(page.data[i]));
  74.                     }
  75.                     return pageRoot;
  76.                 },
  77.  
  78.                 _layoutBlock : function(block)
  79.                 {
  80.                     var blockRoot = $("<div></div>");
  81.  
  82.                     switch(block.type)
  83.                     {
  84.                         case "heading":
  85.                             break;
  86.  
  87.                         default:
  88.                             console || console.warn("Bad block node type");
  89.                             break;
  90.                     }
  91.  
  92.                     var data = block.data;
  93.                     for(var i = 0; i < data.length; ++i)
  94.                     {
  95.                         var line = data[i];
  96.                         var lineElem = $("<div></div>")
  97.                             .css("white-space", "nowrap");
  98.  
  99.                         for(var j = 0; j < line.length; ++j)
  100.                         {
  101.                             lineElem.append(this._layoutSpan(line[j]));
  102.                         }
  103.  
  104.                         // calculate line width for spacing
  105.                         if(i != data.length - 1)
  106.                         {
  107.                             this._metricsRoot.append(lineElem);
  108.                             lineElem.css("word-spacing", "0");
  109.                             var baseLineWidth = lineElem.width();
  110.                             lineElem.css("word-spacing", (this._style.width - baseLineWidth) / 3 + "px");
  111.                             lineElem.remove();
  112.                         }
  113.  
  114.                         blockRoot.append(lineElem);
  115.                     }
  116.  
  117.                     return blockRoot;
  118.                 },
  119.  
  120.                 _layoutSpan : function(span)
  121.                 {
  122.                     var spanBlock = $("<span></span>");
  123.                     if(!span.type) spanBlock.text(span);
  124.  
  125.                     switch(span.type)
  126.                     {
  127.                         case "emph":
  128.                             break;
  129.  
  130.                         default:
  131.                             console || console.warn("Bad span node type");
  132.                             break;
  133.                     }
  134.  
  135.                     return spanBlock;
  136.                 }
  137.             };
  138.  
  139.             var page = {
  140.                 style : {
  141.                     width       : 8.5 * 72/*pt*/,
  142.                     height      : 11 * 72/*pt*/,
  143.                     fontSize    : 12/*pt*/,
  144.                     margin      : {
  145.                         top     : 50,
  146.                         bottom  : 50,
  147.                         inner   : 50,
  148.                         outer   : 100
  149.                     }
  150.                 },
  151.                 content : [
  152.                     {
  153.                         data : [
  154.                             {
  155.                                 type  : "heading",
  156.                                 data : [
  157.                                     [ "Hello, world!" ]
  158.                                 ]
  159.                             },
  160.                             {
  161.                                 type  : "paragraph",
  162.                                 data : [
  163.                                     [ "This is a paragraph," ],
  164.                                     [ "with some stuff." ]
  165.                                 ]
  166.                             }
  167.                         ]
  168.                     },
  169.                     {
  170.                         data : [
  171.                             {
  172.                                 type  : "heading",
  173.                                 data : [
  174.                                     [ "Hello, world!" ]
  175.                                 ]
  176.                             },
  177.                             {
  178.                                 type  : "paragraph",
  179.                                 data : [
  180.                                     [ "This is a paragraph," ],
  181.                                     [ "with some stuff." ]
  182.                                 ]
  183.                             }
  184.                         ]
  185.                     }
  186.                 ]
  187.             };
  188.  
  189.             $(document.body).append(new AuroraContext(page).render(1));
  190.         </script>
  191.     </body>
  192. </html>