Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 22 additions & 3 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,11 @@
<option value="middle">Middle</option>
<option value="bottom">Bottom</option>
</select>
<select id="pageview">
<option value="">None</option>
<option value="portrait">Portrait</option>
<option value="landscape">Landscape</option>
</select>
</div>

<div id="exampleEditor"></div>
Expand Down Expand Up @@ -302,6 +307,11 @@ <h1>How to use it</h1>
var elem = document.querySelector('#exampleEditor');
var exampleEditor = carota.editor.create(elem);

var pageview = document.querySelector('#pageview')
carota.dom.handleEvent(pageview, 'change', function () {
exampleEditor.changePageLayout(pageview.value);
});

// Set up our custom inline - a smiley emoji
var smiley = document.querySelector('#smiley img');

Expand Down Expand Up @@ -443,15 +453,24 @@ <h1>How to use it</h1>

load('#welcome');
/*exampleEditor.load([
{ text: 'A' },
{ text: 'A'},
{ text: { $: 'listStart' }, color: 'blue' },
{ text: 'B' },
{ text: { $: 'listNext' }, color: 'red' },
{ text: 'C' },
{ text: { $: 'listEnd' } },
{ text: 'D' }
]);
*/
]);*/

/*exampleEditor.load([{
"text": "Lorem ipsum",
"bold": true,
"size": "18",
"align": "center"
},
{"text": "\n\n\nLorem ipsum dolor sit amet enim. Etiam ullamcorper. Suspendisse a pellentesque dui, non felis. Maecenas malesuada elit lectus felis, malesuada ultricies. Curabitur et ligula. Ut molestie a, ultricies porta urna. Vestibulum commodo volutpat a, convallis ac, laoreet enim. Phasellus fermentum in, dolor. Pellentesque facilisis. Nulla imperdiet sit amet magna. Vestibulum dapibus, mauris nec malesuada fames ac turpis velit, rhoncus eu, luctus et interdum adipiscing wisi. Aliquam erat ac ipsum. Integer aliquam purus. Quisque lorem tortor fringilla sed, vestibulum id, eleifend justo vel bibendum sapien massa ac turpis faucibus orci luctus non, consectetuer lobortis quis, varius in, purus. Integer ultrices posuere cubilia Curae, Nulla ipsum dolor lacus, suscipit adipiscing. Cum sociis natoque penatibus et ultrices volutpat. Nullam wisi ultricies a, gravida vitae, dapibus risus ante sodales lectus blandit eu, tempor diam pede cursus vitae, ultricies eu, faucibus quis, porttitor eros cursus lectus, pellentesque eget, bibendum a, gravida ullamcorper quam. Nullam viverra consectetuer. Quisque cursus et, porttitor risus. Aliquam sem. In hendrerit nulla quam nunc, accumsan congue. Lorem ipsum primis in nibh vel risus. Sed vel lectus. Ut sagittis, ipsum dolor quam.Lorem ipsum dolor sit amet enim. Etiam ullamcorper. Suspendisse a pellentesque dui, non felis. Maecenas malesuada elit lectus felis, malesuada ultricies. Curabitur et ligula. Ut molestie a, ultricies porta urna. Vestibulum commodo volutpat a, convallis ac, laoreet enim. Phasellus fermentum in, dolor. Pellentesque facilisis. Nulla imperdiet sit amet magna. Vestibulum dapibus, mauris nec malesuada fames ac turpis velit, rhoncus eu, luctus et interdum adipiscing wisi. Aliquam erat ac ipsum. Integer aliquam purus. Quisque lorem tortor fringilla sed, vestibulum id, eleifend justo vel bibendum sapien massa ac turpis faucibus orci luctus non, consectetuer lobortis quis, varius in, purus. Integer ultrices posuere cubilia Curae, Nulla ipsum dolor lacus, suscipit adipiscing. Cum sociis natoque penatibus et ultrices volutpat. Nullam wisi ultricies a, gravida vitae, dapibus risus ante sodales lectus blandit eu, tempor diam pede cursus vitae, ultricies eu, faucibus quis, porttitor eros cursus lectus, pellentesque eget, bibendum a, gravida ullamcorper quam. Nullam viverra consectetuer. Quisque cursus et, porttitor risus. Aliquam sem. In hendrerit nulla quam nunc, accumsan congue. Lorem ipsum primis in nibh vel risus. Sed vel lectus. Ut sagittis, ipsum dolor quam.Lorem ipsum dolor sit amet enim. Etiam ullamcorper. Suspendisse a pellentesque dui, non felis. Maecenas malesuada elit lectus felis, malesuada ultricies. Curabitur et ligula. Ut molestie a, ultricies porta urna. Vestibulum commodo volutpat a, convallis ac, laoreet enim. Phasellus fermentum in, dolor. Pellentesque facilisis. Nulla imperdiet sit amet magna. Vestibulum dapibus, mauris nec malesuada fames ac turpis velit, rhoncus eu, luctus et interdum adipiscing wisi. Aliquam erat ac ipsum. Integer aliquam purus. Quisque lorem tortor fringilla sed, vestibulum id, eleifend justo vel bibendum sapien massa ac turpis faucibus orci luctus non, consectetuer lobortis quis, varius in, purus. Integer ultrices posuere cubilia Curae, Nulla ipsum dolor lacus, suscipit adipiscing. Cum sociis natoque penatibus et ultrices volutpat. Nullam wisi ultricies a, gravida vitae, dapibus risus ante sodales lectus blandit eu, tempor diam pede cursus vitae, ultricies eu, faucibus quis, porttitor eros cursus lectus, pellentesque eget, bibendum a, gravida ullamcorper quam. Nullam viverra consectetuer. Quisque cursus et, porttitor risus. Aliquam sem. In hendrerit nulla quam nunc, accumsan congue. Lorem ipsum primis in nibh vel risus. Sed vel lectus. Ut sagittis, ipsum dolor quam.Lorem ipsum dolor sit amet enim. Etiam ullamcorper. Suspendisse a pellentesque dui, non felis. Maecenas malesuada elit lectus felis, malesuada ultricies. Curabitur et ligula. Ut molestie a, ultricies porta urna. Vestibulum commodo volutpat a, convallis ac, laoreet enim. Phasellus fermentum in, dolor. Pellentesque facilisis. Nulla imperdiet sit amet magna. Vestibulum dapibus, mauris nec malesuada fames ac turpis velit, rhoncus eu, luctus et interdum adipiscing wisi. Aliquam erat ac ipsum. Integer aliquam purus. Quisque lorem tortor fringilla sed, vestibulum id, eleifend justo vel bibendum sapien massa ac turpis faucibus orci luctus non, consectetuer lobortis quis, varius in, purus. Integer ultrices posuere cubilia Curae, Nulla ipsum dolor lacus, suscipit adipiscing. Cum sociis natoque penatibus et ultrices volutpat. Nullam wisi ultricies a, gravida vitae, dapibus risus ante sodales lectus blandit eu, tempor diam pede cursus vitae, ultricies eu, faucibus quis, porttitor eros cursus lectus, pellentesque eget, bibendum a, gravida ullamcorper quam. Nullam viverra consectetuer. Quisque cursus et, porttitor risus. Aliquam sem. In hendrerit nulla quam nunc, accumsan congue. Lorem ipsum primis in nibh vel risus. Sed vel lectus. Ut sagittis, ipsum dolor quam.Lorem ipsum dolor sit amet enim. Etiam ullamcorper. Suspendisse a pellentesque dui, non felis. Maecenas malesuada elit lectus felis, malesuada ultricies. Curabitur et ligula. Ut molestie a, ultricies porta urna. Vestibulum commodo volutpat a, convallis ac, laoreet enim. Phasellus fermentum in, dolor. Pellentesque facilisis. Nulla imperdiet sit amet magna. Vestibulum dapibus, mauris nec malesuada fames ac turpis velit, rhoncus eu, luctus et interdum adipiscing wisi. Aliquam erat ac ipsum. Integer aliquam purus. Quisque lorem tortor fringilla sed, vestibulum id, eleifend justo vel bibendum sapien massa ac turpis faucibus orci luctus non, consectetuer lobortis quis, varius in, purus. Integer ultrices posuere cubilia Curae, Nulla ipsum dolor lacus, suscipit adipiscing. Cum sociis natoque penatibus et ultrices volutpat. Nullam wisi ultricies a, gravida vitae, dapibus risus ante sodales lectus blandit eu, tempor diam pede cursus vitae, ultricies eu, faucibus quis, porttitor eros cursus lectus, pellentesque eget, bibendum a, gravida ullamcorper quam. Nullam viverra consectetuer. Quisque cursus et, porttitor risus. Aliquam sem. In hendrerit nulla quam nunc, accumsan congue. Lorem ipsum primis in nibh vel risus. Sed vel lectus. Ut sagittis, ipsum dolor quam.Lorem ipsum dolor sit amet enim. Etiam ullamcorper. Suspendisse a pellentesque dui, non felis. Maecenas malesuada elit lectus felis, malesuada ultricies. Curabitur et ligula. Ut molestie a, ultricies porta urna. Vestibulum commodo volutpat a, convallis ac, laoreet enim. Phasellus fermentum in, dolor. Pellentesque facilisis. Nulla imperdiet sit amet magna. Vestibulum dapibus, mauris nec malesuada fames ac turpis velit, rhoncus eu, luctus et interdum adipiscing wisi. Aliquam erat ac ipsum. Integer aliquam purus. Quisque lorem tortor fringilla sed, vestibulum id, eleifend justo vel bibendum sapien massa ac turpis faucibus orci luctus non, consectetuer lobortis quis, varius in, purus. Integer ultrices posuere cubilia Curae, Nulla ipsum dolor lacus, suscipit adipiscing. Cum sociis natoque penatibus et ultrices volutpat. Nullam wisi ultricies a, gravida vitae, dapibus risus ante sodales lectus blandit eu, tempor diam pede cursus vitae, ultricies eu, faucibus quis, porttitor eros cursus lectus, pellentesque eget, bibendum a, gravida ullamcorper quam. Nullam viverra consectetuer. Quisque cursus et, porttitor risus. Aliquam sem. In hendrerit nulla quam nunc, accumsan congue. Lorem ipsum primis in nibh vel risus. Sed vel lectus. Ut sagittis, ipsum dolor quam.Lorem ipsum dolor sit amet enim. Etiam ullamcorper. Suspendisse a pellentesque dui, non felis. Maecenas malesuada elit lectus felis, malesuada ultricies. Curabitur et ligula. Ut molestie a, ultricies porta urna. Vestibulum commodo volutpat a, convallis ac, laoreet enim. Phasellus fermentum in, dolor. Pellentesque facilisis. Nulla imperdiet sit amet magna. Vestibulum dapibus, mauris nec malesuada fames ac turpis velit, rhoncus eu, luctus et interdum adipiscing wisi. Aliquam erat ac ipsum. Integer aliquam purus. Quisque lorem tortor fringilla sed, vestibulum id, eleifend justo vel bibendum sapien massa ac turpis faucibus orci luctus non, consectetuer lobortis quis, varius in, purus. Integer ultrices posuere cubilia Curae, Nulla ipsum dolor lacus, suscipit adipiscing. Cum sociis natoque penatibus et ultrices volutpat. Nullam wisi ultricies a, gravida vitae, dapibus risus ante sodales lectus blandit eu, tempor diam pede cursus vitae, ultricies eu, faucibus quis, porttitor eros cursus lectus, pellentesque eget, bibendum a, gravida ullamcorper quam. Nullam viverra consectetuer. Quisque cursus et, porttitor risus. Aliquam sem. In hendrerit nulla quam nunc, accumsan congue. Lorem ipsum primis in nibh vel risus. Sed vel lectus. Ut sagittis, ipsum dolor quam.Lorem ipsum dolor sit amet enim. Etiam ullamcorper. Suspendisse a pellentesque dui, non felis. Maecenas malesuada elit lectus felis, malesuada ultricies. Curabitur et ligula. Ut molestie a, ultricies porta urna. Vestibulum commodo volutpat a, convallis ac, laoreet enim. Phasellus fermentum in, dolor. Pellentesque facilisis. Nulla imperdiet sit amet magna. Vestibulum dapibus, mauris nec malesuada fames ac turpis velit, rhoncus eu, luctus et interdum adipisci\n\n"}
]);*/

};
</script>
</body>
Expand Down
98 changes: 98 additions & 0 deletions src/doc.js
Original file line number Diff line number Diff line change
Expand Up @@ -439,11 +439,109 @@ var prototype = node.derive({
}
}
},
changePageLayout: function(layoutEnum){
this.pageLayout.configure(buildPageLayoutProperties(layoutEnum), layoutEnum);
this.contentChanged.fire();
},

getPageLayout: function () {
return this.pageLayout;
},

type: 'document'
});

var buildPageLayoutProperties = function (pageLayoutEnum) {

switch (pageLayoutEnum) {
case 'portrait':
return {
firstPageVerticalOffset: 60,
leftMargin: 60,
rightMargin: 60,
topMargin: 40,
bottomMargin: 40,
pageSpacer: 20,
textHeight: 585,
textWidth: 324,
};
case 'landscape':
return {
firstPageVerticalOffset: 60,
leftMargin: 60,
rightMargin: 60,
topMargin: 40,
bottomMargin: 40,
pageSpacer: 20,
textHeight: 324,
textWidth: 475,
};
default:
return {
firstPageVerticalOffset: 0,
leftMargin: 0,
rightMargin: 0,
topMargin: 0,
bottomMargin: 0,
pageSpacer: 0,
textHeight: 0,
textWidth: 0,
};
}
}

var pageLayoutPrototype = {
layoutProperties: buildPageLayoutProperties(),

configure: function (layoutProperties, layoutTypeEnum) {
this.type = layoutTypeEnum;
this.layoutProperties = layoutProperties;
},

getTextHeight: function () {
return this.layoutProperties.textHeight;
},

getTextWidth: function () {
return this.layoutProperties.textWidth;
},

getPageHeight: function () {
return this.layoutProperties.topMargin + this.layoutProperties.textHeight + this.layoutProperties.bottomMargin;
},

getPageHeightWithSpacer: function () {
return this.getPageHeight() + this.layoutProperties.pageSpacer;
},

getPageWidth: function () {
return this.layoutProperties.leftMargin + this.getTextWidth() + this.layoutProperties.rightMargin;
},

getSpaceBeetweenPageTexts: function () {
return this.layoutProperties.bottomMargin + this.layoutProperties.pageSpacer + this.layoutProperties.topMargin;
},

getTopMargin: function () {
return this.layoutProperties.topMargin;
},

getLeftMargin: function () {
return this.layoutProperties.leftMargin;
},

getHorizontalMargins: function () {
return this.layoutProperties.leftMargin + this.layoutProperties.rightMargin;
},

getFirstPageVerticalOffset: function () {
return this.layoutProperties.firstPageVerticalOffset;
},
}

exports = module.exports = function() {
var doc = Object.create(prototype);
doc.pageLayout = Object.create(pageLayoutPrototype);
doc._width = 0;
doc.selection = { start: 0, end: 0 };
doc.caretVisible = true;
Expand Down
84 changes: 66 additions & 18 deletions src/editor.js
Original file line number Diff line number Diff line change
Expand Up @@ -293,30 +293,47 @@ exports.create = function(element) {
}

function getVerticalOffset() {
var docHeight = doc.frame.bounds().h;
if (docHeight < element.clientHeight) {
switch (verticalAlignment) {
case 'middle':
return (element.clientHeight - docHeight) / 2;
case 'bottom':
return element.clientHeight - docHeight;
if (doc.getPageLayout().type) {
return doc.getPageLayout().getFirstPageVerticalOffset() + doc.getPageLayout().getTopMargin();
} else {
var docHeight = doc.frame.bounds().h;
if (docHeight < element.clientHeight) {
switch (verticalAlignment) {
case 'middle':
return (element.clientHeight - docHeight) / 2;
case 'bottom':
return element.clientHeight - docHeight;
}
}
return 0;
}
return 0;
}

var paint = function() {
function getHorizontalOffset() {
if (doc.getPageLayout().type) {
return Math.max(Math.floor((element.clientWidth - doc.getPageLayout().getPageWidth()) / 2), 0) + doc.getPageLayout().getLeftMargin();
}
return 0;
}

var availableWidth = element.clientWidth * 1; // adjust to 0.5 to see if we draw in the wrong places!
var paint = function() {

var pageLayout = doc.getPageLayout();

var availableWidth = pageLayout.getTextWidth() || element.clientWidth * 1; // adjust to 0.5 to see if we draw in the wrong places!
if (doc.width() !== availableWidth) {
doc.width(availableWidth);
}

var docHeight = doc.frame.bounds().h;
if (pageLayout.type) {
//show whole page
docHeight = getTotalPages() * pageLayout.getPageHeightWithSpacer() + getVerticalOffset();
}

var dpr = Math.max(1, window.devicePixelRatio || 1);

var logicalWidth = Math.max(doc.frame.actualWidth(), element.clientWidth),
var logicalWidth = Math.max(doc.frame.actualWidth() + doc.getPageLayout().getHorizontalMargins(), element.clientWidth),
logicalHeight = element.clientHeight;

canvas.width = dpr * logicalWidth;
Expand All @@ -339,12 +356,43 @@ exports.create = function(element) {
ctx.scale(dpr, dpr);

ctx.clearRect(0, 0, logicalWidth, logicalHeight);
ctx.translate(0, getVerticalOffset() - element.scrollTop);

if (pageLayout.type) {
drawPages(ctx, logicalWidth, logicalHeight);
}

ctx.translate(getHorizontalOffset(), getVerticalOffset() - element.scrollTop);
doc.draw(ctx, rect(0, element.scrollTop - getVerticalOffset(), logicalWidth, logicalHeight));

doc.draw(ctx, rect(0, element.scrollTop, logicalWidth, logicalHeight));
doc.drawSelection(ctx, selectDragStart || (document.activeElement === textArea));
};

var getTotalPages = function(){
var existingSpace = 16,
realH = doc.frame.bounds().h - existingSpace;

return Math.floor(realH / doc.getPageLayout().getPageHeightWithSpacer()) + (Math.ceil(realH % doc.getPageLayout().getPageHeightWithSpacer()) ? 1 : 0);
}

var drawPages = function (ctx, logicalWidth, logicalHeight) {

var layout = doc.getPageLayout(),
totalPages = getTotalPages();

ctx.fillStyle = 'rgb(220,220,220)';
ctx.fillRect(0, 0, logicalWidth, logicalHeight);

for (var i = 0; i < totalPages; ++i) {
var x = getHorizontalOffset() - layout.getLeftMargin();
var y = layout.getFirstPageVerticalOffset() + i * layout.getPageHeightWithSpacer() - element.scrollTop;

ctx.fillStyle = "white";
ctx.fillRect(x, y, layout.getPageWidth(), layout.getPageHeight());
ctx.strokeStyle = "black";
ctx.strokeRect(x, y, layout.getPageWidth(), layout.getPageHeight());
}
};

dom.handleEvent(element, 'scroll', paint);

dom.handleEvent(textArea, 'input', function() {
Expand All @@ -368,16 +416,16 @@ exports.create = function(element) {
textAreaDiv.style.left = bounds.l + 'px';
textAreaDiv.style.top = bounds.t + 'px';
textArea.focus();
var scrollDownBy = Math.max(0, bounds.t + bounds.h -
var scrollDownBy = Math.max(0, bounds.t + bounds.h + doc.getPageLayout().getSpaceBeetweenPageTexts() -
(element.scrollTop + element.clientHeight));
if (scrollDownBy) {
element.scrollTop += scrollDownBy;
}
var scrollUpBy = Math.max(0, element.scrollTop - bounds.t);
var scrollUpBy = Math.max(0, element.scrollTop - bounds.t - doc.getPageLayout().getSpaceBeetweenPageTexts());
if (scrollUpBy) {
element.scrollTop -= scrollUpBy;
}
var scrollRightBy = Math.max(0, bounds.l -
var scrollRightBy = Math.max(0, bounds.l -
(element.scrollLeft + element.clientWidth));
if (scrollRightBy) {
element.scrollLeft += scrollRightBy;
Expand All @@ -391,7 +439,7 @@ exports.create = function(element) {
textArea.value = textAreaContent;
textArea.select();

setTimeout(function() {
setTimeout(function () {
textArea.focus();
}, 10);
};
Expand All @@ -407,7 +455,7 @@ exports.create = function(element) {

function registerMouseEvent(name, handler) {
dom.handleMouseEvent(spacer, name, function(ev, x, y) {
handler(doc.byCoordinate(x, y - getVerticalOffset()));
handler(doc.byCoordinate(Math.max(x - getHorizontalOffset(), 0), y - getVerticalOffset()));
});
}

Expand Down
Loading