Newer
Older
Matt Westgate
committed
<?php
Matt Westgate
committed
/**
* @file
* Displays Printer-friendly versions of Drupal pages.
*
* This is the core module of the PF package, with the Drupal hooks
* and other administrative functions.
define('PRINT_FOOTER_OPTIONS_DEFAULT', 1);
define('PRINT_FOOTER_USER_DEFAULT', '');
define('PRINT_CSS_DEFAULT', '');
define('PRINT_URLS_DEFAULT', 1);
define('PRINT_COMMENTS_DEFAULT', 0);
define('PRINT_NEWWINDOW_DEFAULT', 1);
define('PRINT_HTML_LINK_POS_DEFAULT', 'link');
define('PRINT_HTML_SHOW_LINK_DEFAULT', 1);
define('PRINT_HTML_NODE_LINK_VISIBILITY_DEFAULT', 0);
define('PRINT_HTML_NODE_LINK_PAGES_DEFAULT', '');
define('PRINT_HTML_LINK_CLASS_DEFAULT', 'print-page');
define('PRINT_HTML_SYS_LINK_VISIBILITY_DEFAULT', 1);
define('PRINT_HTML_LINK_USE_ALIAS_DEFAULT', 0);
define('PRINT_HTML_BOOK_LINK_DEFAULT', 1);
define('PRINT_HTML_NEW_WINDOW_DEFAULT', 0);
define('PRINT_HTML_SENDTOPRINTER_DEFAULT', 0);
define('PRINT_SOURCEURL_ENABLED_DEFAULT', 1);
define('PRINT_SOURCEURL_DATE_DEFAULT', 0);
define('PRINT_SOURCEURL_FORCENODE_DEFAULT', 0);
define('PRINT_ROBOTS_NOINDEX_DEFAULT', 1);
define('PRINT_ROBOTS_NOFOLLOW_DEFAULT', 1);
define('PRINT_ROBOTS_NOARCHIVE_DEFAULT', 0);
define('PRINT_TYPE_SHOW_LINK_DEFAULT', 1);
define('PRINT_TYPE_COMMENT_LINK_DEFAULT', 0);
define('PRINT_ALLOW_NORMAL_LINK', 1);
define('PRINT_ALLOW_BOOK_LINK', 2);
João Ventura
committed
Matt Westgate
committed
/**
*/
function print_perm() {
return array('access print', 'administer print');
}
*/
function print_theme() {
return array(
'print_format_link' => array(
'arguments' => array(),
),
'print_text' => array(
'arguments' => array(),
),
);
}
Matt Westgate
committed
*/
Matt Westgate
committed
$items = array();
$items[PRINT_PATH] = array(
'title' => 'Printer-friendly',
'access arguments' => array('access print'),
João Ventura
committed
'type' => MENU_CALLBACK,
'file' => 'print.pages.inc',
);
$items['admin/settings/print'] = array(
'description' => 'Adds a printer-friendly version link to content and administrative pages.',
'page callback' => 'drupal_get_form',
'page arguments' => array('print_html_settings'),
'access arguments' => array('administer print'),
'file' => 'print.admin.inc',
);
$items['admin/settings/print/html'] = array(
'title' => 'Web page',
'type' => MENU_DEFAULT_LOCAL_TASK,
);
$items['admin/settings/print/common'] = array(
'title' => 'Settings',
'page callback' => 'drupal_get_form',
'page arguments' => array('print_main_settings'),
'access arguments' => array('administer print'),
João Ventura
committed
'file' => 'print.admin.inc',
Matt Westgate
committed
return $items;
}
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/**
* Implementation of hook_block().
*/
function print_block($op = 'list', $delta = 0, $edit = array()) {
switch ($op) {
case 'list':
$block[$delta]['info'] = t('Printer, e-mail and PDF versions');
return $block;
break;
case 'configure':
return '';
case 'save':
return;
case 'view':
$nid = preg_replace('!^node/!', '', $_GET['q']);
if (is_numeric($nid)) {
$node = node_load(array('nid' => $nid));
}
else {
$node = NULL;
}
$funcs = get_defined_functions();
$block['content'] = '';
foreach ($funcs['user'] as $func) {
if (preg_match('!^print.*?_insert_link$!', $func)) {
$link = $func(NULL, $node);
if (!empty($link)) {
$block['content'] .= $link .'<br />';
}
}
}
return $block;
break;
}
}
Matt Westgate
committed
/**
* Implementation of hook_link().
*/
function print_link($type, $node = NULL, $teaser = FALSE) {
$print_html_link_pos = variable_get('print_html_link_pos', array(PRINT_HTML_LINK_POS_DEFAULT => PRINT_HTML_LINK_POS_DEFAULT));
$print_html_link_use_alias = variable_get('print_html_link_use_alias', PRINT_HTML_LINK_USE_ALIAS_DEFAULT);
$allowed_type = print_link_allowed(array('type' => $type, 'node' => $node, 'teaser' => $teaser));
if (($allowed_type === PRINT_ALLOW_NORMAL_LINK) && !empty($print_html_link_pos['link'])) {
drupal_add_css(drupal_get_path('module', 'print') .'/css/printlinks.css');
$query = print_query_string_encode($query_arr, array('q'));
Matt Westgate
committed
if ($print_html_link_use_alias) {
$path = drupal_get_path_alias('node/'. $node->nid);
}
else {
$path = $node->nid;
}
$links['print'] = array('href' => PRINT_PATH .'/'. $path,
'title' => $format['text'],
'attributes' => $format['attributes'],
/**
* Implementation of hook_link_alter().
*/
function print_link_alter(&$links, $node) {
foreach ($links as $module => $link) {
if (strpos($module, 'book_printer') !== FALSE) {
$print_html_book_link = variable_get('print_html_book_link', PRINT_HTML_BOOK_LINK_DEFAULT);
$format['attributes']['title'] = $link['attributes']['title'];
$links[$module]['href'] = PRINT_PATH .'/'. $link['href'];
$links[$module]['attributes'] = $format['attributes'];
}
}
*/
function print_help($path, $arg) {
switch ($path) {
case 'admin/help#print':
// Return a line-break version of the module README
return filter_filter('process', 1, NULL, file_get_contents(drupal_get_path('module', 'print') .'/README.txt') );
$print_html_link_pos = variable_get('print_html_link_pos', array(PRINT_HTML_LINK_POS_DEFAULT => PRINT_HTML_LINK_POS_DEFAULT));
if ((preg_match('!^node/!i', $path) == 0) &&
!(empty($print_html_link_pos['link']) && empty($print_html_link_pos['corner']))) {
static $output = FALSE;
if ($output === FALSE) {
$output = TRUE;
$link = print_insert_link();
if ($link) {
return "<span class='print-syslink'>$link</span>";
}
Matt Westgate
committed
}
Matt Westgate
committed
/**
* Implementation of hook_nodeapi().
*/
function print_nodeapi(&$node, $op = 'view', $teaser, $page) {
switch ($op) {
case 'view':
$print_html_link_pos = variable_get('print_html_link_pos', array(PRINT_HTML_LINK_POS_DEFAULT => PRINT_HTML_LINK_POS_DEFAULT));
if (($teaser === FALSE) && !empty($print_html_link_pos['corner']) &&
$link = print_insert_link(NULL, $node);
if ($link) {
$node->content['print_link'] = array(
'#value' => "<span class='print-link'>$link</span>",
'#weight' => -1,
);
*/
function print_form_alter(&$form, $form_state, $form_id) {
// Add the node-type settings option to activate the printer-friendly version link
'#collapsible' => TRUE,
'#collapsed' => TRUE,
);
$form['print']['print_display'] = array(
'#type' => 'checkbox',
'#title' => t('Show printer-friendly version link'),
'#default_value' => variable_get('print_display_'. $form['#node_type']->type, PRINT_TYPE_SHOW_LINK_DEFAULT),
'#description' => t('Displays the link to a printer-friendly version of the content. Further configuration is available on the !settings.', array('!settings' => l(t('settings page'), 'admin/settings/print' ))),
);
'#type' => 'checkbox',
'#title' => t('Show printer-friendly version link in individual comments'),
'#default_value' => variable_get('print_display_comment_'. $form['#node_type']->type, PRINT_TYPE_COMMENT_LINK_DEFAULT),
'#description' => t('Displays the link to a printer-friendly version of the comment. Further configuration is available on the !settings.', array('!settings' => l(t('settings page'), 'admin/settings/print' ))),
);
}
Matt Westgate
committed
}
/**
* Auxiliary function to fill the Printer-friendly link attributes
*
* @param $title
* text to displayed by the link when hovering over it with the mouse
* @param $class
* class attribute to be used in the link
* @param $new_window
* if TRUE opens the target page in a new window
function print_fill_attributes($title = '', $class = '', $new_window = FALSE) {
$print_newwindow = variable_get('print_newwindow', PRINT_NEWWINDOW_DEFAULT);
$print_robots_noindex = variable_get('print_robots_noindex', PRINT_ROBOTS_NOINDEX_DEFAULT);
if (!empty($class)) {
$attributes['class'] = $class;
}
case 0:
$attributes['target'] = '_blank';
break;
case 1:
$attributes['onclick'] = 'window.open(this.href); return false';
break;
}
$attributes['rel'] = 'nofollow';
}
/**
* Auxiliary function to set the link text and html flag
*
* @param $type
* type of link: 0 or 1 for a text-only link, 2 for icon-only and 3 for
* both text and icon
* @param $text
* text to be displayed on the link to the printer-friendly page
* @param $img
* path to the icon file
* @return
* array with the link text and html flag
*/
function _print_format_link_aux($type = 0, $text = '', $img = '') {
if ($type >= 2) {
$html = TRUE;
switch ($type) {
case 2:
$text = theme('image', $img, $text, $text, array('class' => 'print-icon'));
$text = theme('image', $img, $text, $text, array('class' => 'print-icon print-icon-margin')) . $text;
break;
}
}
else {
$html = FALSE;
}
return array('text' => $text,
'html' => $html,
/**
* Format the Printer-friendly link
*
* @return
* array of formatted attributes
* @ingroup themeable
*/
$print_html_link_class = variable_get('print_html_link_class', PRINT_HTML_LINK_CLASS_DEFAULT);
$print_html_new_window = variable_get('print_html_new_window', PRINT_HTML_NEW_WINDOW_DEFAULT);
$print_html_show_link = variable_get('print_html_show_link', PRINT_HTML_SHOW_LINK_DEFAULT);
$text = t('Printer-friendly version');
$img = drupal_get_path('module', 'print') .'/icons/print_icon.gif';
$title = t('Display a printer-friendly version of this page.');
$class = strip_tags($print_html_link_class);
$new_window = $print_html_new_window;
$format = _print_format_link_aux($print_html_show_link, $text, $img);
return array('text' => $format['text'],
'html' => $format['html'],
'attributes' => print_fill_attributes($title, $class, $new_window),
/**
* Define the strings displayed by the module in the printer-friendly template
*
* @return
* array with the used text strings
* @ingroup themeable
*/
return array('retrieved' => '',
'sourceURL' => '',
'published' => '',
'by' => '',
'created' => '',
'links' => '',
/**
* Auxiliary function to display a formatted Printer-friendly link
*
* Function made available so that developers may call this function from
* their defined pages/blocks.
*
* @param $path
* path of the original page (optional). If not specified, the current URL
* @param $node
* an optional node object, to be used in defining the path, if used, the
* path argument is irrelevant
* @return
* string with the HTML link to the printer-friendly page
function print_insert_link($path = NULL, $node = NULL) {
if ($node !== NULL) {
$nid = $node->nid;
$path = 'node/'. $nid;
$allowed_type = print_link_allowed(array('node' => $node));
}
else {
$nid = preg_replace('!^node/!', '', $_GET['q']);
$path = $_GET['q'];
}
else {
$nid = NULL;
}
$allowed_type = print_link_allowed(array('path' => $path));
}
if ($allowed_type) {
if ($nid !== NULL) {
if ($allowed_type === PRINT_ALLOW_BOOK_LINK) {
$path = 'book/export/html/'. $nid;
if (variable_get('print_html_link_use_alias', PRINT_HTML_LINK_USE_ALIAS_DEFAULT)) {
$path = drupal_get_path_alias($path);
}
else {
$path = $nid;
}
}
$path = PRINT_PATH .'/'. $path;
$query = print_query_string_encode($_GET, array('q'));
drupal_add_css(drupal_get_path('module', 'print') .'/css/printlinks.css');
$format = theme('print_format_link');
return '<span class="print">'. l($format['text'], $path, array('attributes' => $format['attributes'], 'query' => $query, 'absolute' => TRUE, 'html' => $format['html'])) .'</span>';
else {
return FALSE;
}
/**
* Determine if the current page is enabled according to the visibility settings
*
* @param $visibility
* current visibility settings:
* 0 for show on every page except the listed pages
* 1 for show on only the listed pages
* @param $pages
* list of pages
* @return
* TRUE if it is enabled, FALSE otherwise
*/
function _print_page_match($visibility, $pages) {
if ($pages) {
$path = drupal_get_path_alias($_GET['q']);
$page_match = drupal_match_path($path, $pages);
if ($path != $_GET['q']) {
$page_match = $page_match || drupal_match_path($_GET['q'], $pages);
}
return !($visibility xor $page_match);
}
else {
return !$visibility;
}
}
/**
* Determine a the link to the PF version is allowed depending on all possible settings
*
* @param $args
* array containing the possible parameters:
* teaser, node, type, path
* @return
* FALSE if not allowed
* PRINT_ALLOW_NORMAL_LINK if a normal link is allowed
* PRINT_ALLOW_BOOK_LINK if a link is allowed in a book node
*/
function print_link_allowed($args) {
if (!empty($args['teaser']) || !user_access('access print')) {
// If showing only the teaser or the user is not allowed or link is disabled
return FALSE;
}
if (!empty($args['path'])) {
$nid = preg_replace('!^node/!', '', drupal_get_normal_path($args['path']));
if (is_numeric($nid)) {
$args['node'] = node_load(array('nid' => $nid));
}
}
if ($node_type === FALSE) {
if (isset($node->type)) {
$node_type = $node->type;
}
else {
$node_type = '';
}
}
// Node
$print_html_node_link_visibility = variable_get('print_html_node_link_visibility', PRINT_HTML_NODE_LINK_VISIBILITY_DEFAULT);
$print_html_node_link_pages = variable_get('print_html_node_link_pages', PRINT_HTML_NODE_LINK_PAGES_DEFAULT);
!_print_page_match($print_html_node_link_visibility, $print_html_node_link_pages)) {
// Page not in visibility list or we are working!
return FALSE;
}
elseif (isset($args['type']) && ($args['type'] == 'comment') && isset($node_type)) {
// Link is for a comment, return the configured setting
return variable_get('print_display_comment_'. $node_type, PRINT_TYPE_COMMENT_LINK_DEFAULT);
}
else {
// Node link
if (isset($node_type) &&
!variable_get('print_display_'. $node_type, PRINT_TYPE_SHOW_LINK_DEFAULT)) {
// Link for this node type is disabled
return FALSE;
}
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
// Node is a book;
$print_html_book_link = variable_get('print_html_book_link', PRINT_HTML_BOOK_LINK_DEFAULT);
if (!$print_html_book_link || !user_access('access printer-friendly version')) {
// Book link is disabled
return FALSE;
}
else {
return PRINT_ALLOW_BOOK_LINK;
}
}
else {
return PRINT_ALLOW_NORMAL_LINK;
}
}
}
else {
// 'System' page
$print_html_sys_link_visibility = variable_get('print_html_sys_link_visibility', PRINT_HTML_SYS_LINK_VISIBILITY_DEFAULT);
$print_html_sys_link_pages = variable_get('print_html_sys_link_pages', PRINT_HTML_SYS_LINK_PAGES_DEFAULT);
return _print_page_match($print_html_sys_link_visibility, $print_html_sys_link_pages);
}
}
/**
* Parse an array into a valid urlencoded query string.
* Modified from drupal_query_string_encode to prevent re-encoding of
* encoded original.
*
* @param $query
* The array to be processed e.g. $_GET
* @param $exclude
* The array filled with keys to be excluded.
* @return
* urlencoded string which can be appended to/as the URL query string
*/
function print_query_string_encode($query, $exclude = array(), $parent = '') {
$params = array();
foreach ($query as $key => $value) {
if ($parent) {
$key = $parent .'['. $key .']';
}
if (is_array($value)) {
$params[] = print_query_string_encode($value, $exclude, $key);
}
else {
$params[] = $key .'='. rawurlencode($value);
}