witten
/
luminotes
Archived
1
0
Fork 0

Tweaked the popup positioning code to prevent popups from getting smashed into the right side of the page. Removed (broken) images from downloaded HTML.

This commit is contained in:
Dan Helfman 2008-06-16 15:07:17 -07:00
parent 4bbebc4400
commit cfc1c18a55
3 changed files with 44 additions and 11 deletions

4
NEWS
View File

@ -1,7 +1,9 @@
1.4.1: June ?, 2008:
1.4.1: June 16, 2008:
* Implemented support for embedded images within wiki notes.
* You can now open a link pulldown by simply hovering the mouse over a link
for a few seconds.
* Tweaked the popup positioning code to prevent popups from getting smashed
into the right side of the page.
* Updated tools/set_plan.py to automatically update a user's group
membership.
* Removed Google AdWords <script> tag from distributed Luminotes tarball,

View File

@ -2488,10 +2488,6 @@ function Pulldown( wiki, notebook_id, pulldown_id, anchor, relative_to, ephemera
addElementClass( this.div, "invisible" );
appendChildNodes( document.body, this.div );
var position = calculate_position( anchor, relative_to );
setElementPosition( this.div, position );
removeElementClass( this.div, "invisible" );
if ( this.ephemeral ) {
// when the mouse cursor is moved into the pulldown, it becomes non-ephemeral (in other words,
@ -2503,7 +2499,12 @@ function Pulldown( wiki, notebook_id, pulldown_id, anchor, relative_to, ephemera
}
}
function calculate_position( anchor, relative_to ) {
Pulldown.prototype.finish_init = function () {
Pulldown.prototype.update_position.call( this );
removeElementClass( this.div, "invisible" );
}
function calculate_position( node, anchor, relative_to ) {
var anchor_dimensions = getElementDimensions( anchor );
// if the anchor has no height, use its first child (if any) instead
@ -2525,10 +2526,18 @@ function calculate_position( anchor, relative_to ) {
// position based on how far the page is scrolled.
if ( /MSIE/.test( navigator.userAgent ) )
position.y -= getElement( "html" ).scrollTop;
}
}
var node_dimensions = getElementDimensions( node );
// if the position is on the right half of the page, then align the right edge of the node with
// the right edge of the anchor
if ( position.x > getViewportDimensions().w * 0.5 ) {
if ( node_dimensions )
position.x = position.x - node_dimensions.w + anchor_dimensions.w;
}
// if we still don't have a height, move the position down a bit by an arbitrary amount
if ( anchor_dimensions.h == 0 )
position.y += 8;
@ -2539,7 +2548,7 @@ function calculate_position( anchor, relative_to ) {
}
Pulldown.prototype.update_position = function () {
var position = calculate_position( this.anchor, this.relative_to );
var position = calculate_position( this.div, this.anchor, this.relative_to );
setElementPosition( this.div, position );
}
@ -2564,6 +2573,8 @@ function Options_pulldown( wiki, notebook_id, invoker, editor ) {
var self = this;
connect( this.startup_checkbox, "onclick", function ( event ) { self.startup_clicked( event ); } );
Pulldown.prototype.finish_init.call( this );
}
Options_pulldown.prototype = new function () { this.prototype = Pulldown.prototype; };
@ -2593,6 +2604,7 @@ function Changes_pulldown( wiki, notebook_id, invoker, editor ) {
if ( !editor.user_revisions || editor.user_revisions.length == 0 ) {
appendChildNodes( this.div, createDOM( "span", "This note has no previous changes." ) );
Pulldown.prototype.finish_init.call( this );
return;
}
@ -2624,6 +2636,8 @@ function Changes_pulldown( wiki, notebook_id, invoker, editor ) {
appendChildNodes( this.div, link );
appendChildNodes( this.div, createDOM( "br" ) );
}
Pulldown.prototype.finish_init.call( this );
}
Changes_pulldown.prototype = new function () { this.prototype = Pulldown.prototype; };
@ -2671,6 +2685,7 @@ function Link_pulldown( wiki, notebook_id, invoker, editor, link, ephemeral ) {
if ( link.target ) {
this.title_field.value = link.href;
replaceChildNodes( this.note_summary, "web link" );
Pulldown.prototype.finish_init.call( this );
return;
}
@ -2683,18 +2698,21 @@ function Link_pulldown( wiki, notebook_id, invoker, editor, link, ephemeral ) {
if ( title == "search results" ) {
this.title_field.value = title;
this.display_summary( title, "current search results" );
Pulldown.prototype.finish_init.call( this );
return;
}
if ( title == "share this notebook" ) {
this.title_field.value = title;
this.display_summary( title, "share this notebook with others" );
Pulldown.prototype.finish_init.call( this );
return;
}
if ( title == "account settings" ) {
this.title_field.value = title;
this.display_summary( title, "account settings" );
Pulldown.prototype.finish_init.call( this );
return;
}
@ -2706,8 +2724,10 @@ function Link_pulldown( wiki, notebook_id, invoker, editor, link, ephemeral ) {
},
function ( result ) {
// if the user has already started typing something, don't overwrite it
if ( self.title_field.value.length != 0 )
if ( self.title_field.value.length != 0 ) {
Pulldown.prototype.finish_init.call( self );
return;
}
if ( result.note ) {
self.title_field.value = result.note.title;
self.display_summary( result.note.title, result.note.summary );
@ -2717,6 +2737,7 @@ function Link_pulldown( wiki, notebook_id, invoker, editor, link, ephemeral ) {
}
}
);
Pulldown.prototype.finish_init.call( this );
return;
}
@ -2726,6 +2747,7 @@ function Link_pulldown( wiki, notebook_id, invoker, editor, link, ephemeral ) {
if ( iframe ) {
this.title_field.value = iframe.editor.title;
this.display_summary( iframe.editor.title, iframe.editor.summarize() );
Pulldown.prototype.finish_init.call( this );
return;
}
@ -2739,8 +2761,10 @@ function Link_pulldown( wiki, notebook_id, invoker, editor, link, ephemeral ) {
},
function ( result ) {
// if the user has already started typing something, don't overwrite it
if ( self.title_field.value.length != 0 )
if ( self.title_field.value.length != 0 ) {
Pulldown.prototype.finish_init.call( self );
return;
}
if ( result.note ) {
self.title_field.value = result.note.title;
self.display_summary( result.note.title, result.note.summary );
@ -2750,6 +2774,8 @@ function Link_pulldown( wiki, notebook_id, invoker, editor, link, ephemeral ) {
}
}
);
Pulldown.prototype.finish_init.call( this );
}
Link_pulldown.prototype = new function () { this.prototype = Pulldown.prototype; };
@ -2844,6 +2870,7 @@ function Upload_pulldown( wiki, notebook_id, invoker, editor, link, ephemeral )
addElementClass( this.progress_iframe, "undisplayed" );
appendChildNodes( this.div, this.progress_iframe );
Pulldown.prototype.finish_init.call( this );
}
Upload_pulldown.prototype = new function () { this.prototype = Pulldown.prototype; };
@ -3086,6 +3113,7 @@ function File_link_pulldown( wiki, notebook_id, invoker, editor, link, ephemeral
// FIXME: when this is called, the text cursor moves to an unexpected location
editor.focus();
Pulldown.prototype.finish_init.call( this );
}
File_link_pulldown.prototype = new function () { this.prototype = Pulldown.prototype; };

View File

@ -5,13 +5,16 @@ from Tags import Html, Head, Title, Style, Meta, Body, H1, Div, Span, Hr, A
class Html_file( Html ):
NOTE_LINK_PATTERN = re.compile( u'<a\s+href="\/notebooks\/[^>]+[?&]note_id=([a-z0-9]*)"[^>]*>', re.IGNORECASE )
IMAGE_PATTERN = re.compile( u'<img [^>]* ?/?>', re.IGNORECASE )
def __init__( self, notebook_name, notes ):
relinked_notes = {} # map from note id to relinked note contents
# relink all note links so they point to named anchors within the page
# relink all note links so they point to named anchors within the page. also, for now, remove all
# images since they're not presently included with the download
for note in notes:
contents = self.NOTE_LINK_PATTERN.sub( r'<a href="#note_\1">', note.contents )
contents = self.IMAGE_PATTERN.sub( '', contents )
relinked_notes[ note.object_id ] = contents
cherrypy.response.headerMap[ u"Content-Disposition" ] = u"attachment; filename=wiki.html"