summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--misc/teaser.js73
-rw-r--r--modules/node/node.module38
-rw-r--r--modules/user/user.module2
3 files changed, 109 insertions, 4 deletions
diff --git a/misc/teaser.js b/misc/teaser.js
new file mode 100644
index 000000000..0f4340d59
--- /dev/null
+++ b/misc/teaser.js
@@ -0,0 +1,73 @@
+// $Id$
+
+/**
+ * Auto-attach for teaser behaviour.
+ *
+ * Note: depends on resizable textareas.
+ */
+Drupal.teaserAttach = function() {
+ $('textarea.teaser:not(.joined)').each(function() {
+ var teaser = $(this).addClass('joined');
+
+ // Move teaser textarea before body, and remove its form-item wrapper.
+ var body = $('#'+ Drupal.settings.teaser[this.id]);
+ var parent = teaser[0].parentNode;
+ $(body).before(teaser);
+ $(parent).remove();
+
+ function trim(text) {
+ return text.replace(/^\s+/g, '').replace(/\s+$/g, '');
+ }
+
+ // Join the teaser back to the body.
+ function join_teaser() {
+ if (teaser.val()) {
+ body.val(trim(teaser.val()) +'\r\n\r\n'+ trim(body.val()));
+ }
+ // Hide and disable teaser
+ $(teaser).attr('disabled', 'disabled');
+ $(teaser).parent().slideUp('fast');
+ // Change label
+ $(this).val(Drupal.settings.teaserButton[1]);
+ }
+
+ // Split the teaser from the body.
+ function split_teaser() {
+ body[0].focus();
+ var selection = Drupal.getSelection(body[0]);
+ var split = selection.start;
+ var text = body.val();
+
+ // Note: using val() fails sometimes. jQuery bug?
+ teaser[0].value = trim(text.slice(0, split));
+ body[0].value = trim(text.slice(split));
+ // Reveal and enable teaser
+ $(teaser).attr('disabled', '');
+ $(teaser).parent().slideDown('fast');
+ // Change label
+ $(this).val(Drupal.settings.teaserButton[0]);
+ }
+
+ // Add split/join button.
+ var button = $('<input type="button" class="teaser-button" />')
+ .prependTo($(this).parent())
+
+ // Extract the teaser from the body, if set. Otherwise, stay in joined mode.
+ var text = body.val().split('<!--break-->', 2);
+ if (text.length == 2) {
+ teaser[0].value = trim(text[0]);
+ body[0].value = trim(text[1]);
+ $(teaser).attr('disabled', '');
+ $(button).val(Drupal.settings.teaserButton[0]).toggle(join_teaser, split_teaser);
+ }
+ else {
+ $(teaser).hide();
+ $(button).val(Drupal.settings.teaserButton[1]).toggle(split_teaser, join_teaser);
+ }
+
+ });
+}
+
+if (Drupal.jsEnabled) {
+ $(document).ready(Drupal.teaserAttach);
+}
diff --git a/modules/node/node.module b/modules/node/node.module
index 1a0e296e9..0f38e4580 100644
--- a/modules/node/node.module
+++ b/modules/node/node.module
@@ -139,6 +139,28 @@ function node_mark($nid, $timestamp) {
}
/**
+ * See if the user used JS to submit a teaser.
+ */
+function node_teaser_js(&$form, $form_values) {
+ // Glue the teaser to the body.
+ if (isset($form['#post']['teaser_js'])) {
+ if (trim($form_values['teaser_js'])) {
+ // Space the teaser from the body
+ $body = trim($form_values['teaser_js']) ."\r\n<!--break-->\r\n". trim($form_values['body']);
+ }
+ else {
+ // Empty teaser, no spaces.
+ $body = '<!--break-->'. $form_values['body'];
+ }
+ // Pass value onto preview/submit
+ form_set_value($form['body'], $body);
+ // Pass value back onto form
+ $form['body']['#value'] = $body;
+ }
+ return $form;
+}
+
+/**
* Automatically generate a teaser for a node body in a given format.
*/
function node_teaser($body, $format = NULL) {
@@ -2199,7 +2221,7 @@ function node_preview($node) {
function theme_node_preview($node) {
$output = '<div class="preview">';
if ($node->teaser && $node->teaser != $node->body) {
- drupal_set_message(t('The trimmed version of your post shows what your post looks like when promoted to the main page or when exported for syndication. You can insert the delimiter "&lt;!--break--&gt;" (without the quotes) to fine-tune where your post gets split.'));
+ drupal_set_message(t('The trimmed version of your post shows what your post looks like when promoted to the main page or when exported for syndication.<span class="no-js"> You can insert the delimiter "&lt;!--break--&gt;" (without the quotes) to fine-tune where your post gets split.</span>'));
$output .= '<h3>'. t('Preview trimmed version') .'</h3>';
$output .= node_view(drupal_clone($node), 1, FALSE, 0);
$output .= '<h3>'. t('Preview full version') .'</h3>';
@@ -2931,13 +2953,23 @@ function node_content_form($node) {
}
if ($type->has_body) {
- $form['body_filter']['body'] = array(
+ $form['body_field'] = array(
+ '#after_build' => array('node_teaser_js'));
+
+ $form['body_field']['teaser_js'] = array(
+ '#type' => 'textarea',
+ '#rows' => 10,
+ '#teaser' => 'edit-body',
+ '#disabled' => TRUE);
+
+ $form['body_field']['body'] = array(
'#type' => 'textarea',
'#title' => check_plain($type->body_label),
'#default_value' => $node->body,
'#rows' => 20,
'#required' => ($type->min_word_count > 0));
- $form['body_filter']['format'] = filter_form($node->format);
+
+ $form['body_field']['format'] = filter_form($node->format);
}
return $form;
diff --git a/modules/user/user.module b/modules/user/user.module
index 478a4053e..f278f468c 100644
--- a/modules/user/user.module
+++ b/modules/user/user.module
@@ -1333,7 +1333,7 @@ function user_edit_form($uid, $edit, $register = FALSE) {
}
// Picture/avatar:
- if (variable_get('user_pictures', 0)) {
+ if (variable_get('user_pictures', 0) && !$register) {
$form['picture'] = array('#type' => 'fieldset', '#title' => t('Picture'), '#weight' => 1);
$picture = theme('user_picture', (object)$edit);
if ($picture) {