'print',
'title' => t('Printer friendly'),
'callback' => 'print_controller',
'access' => user_access('access content'),
'type' => MENU_CALLBACK
);
$items[] = array(
'path' => 'admin/settings/print',
'title' => t('Printer friendly'),
'description' => t('Adds a printer-friendly version link to node pages.'),
'callback' => 'drupal_get_form',
'callback arguments' => array('print_main_settings')
);
}
else {
$nid = arg(1);
if (is_numeric($nid)) {
$items[] = array(
'path' => 'print/'. $nid,
'title' => t('Printer friendly'),
'callback' => 'print_node_controller',
'callback arguments' => array($nid),
'type' => MENU_CALLBACK
);
}
}
return $items;
}
/********************************************************************
* Drupal Hooks :: Core
********************************************************************/
/**
* Implementation of hook_link().
*/
function print_link($type, $node = 0, $main = 0) {
$links = array();
if ($node->type == 'book' && function_exists('book_link')) {
return;
}
$print_settings = variable_get('print_settings', print_settings_default());
if ($type == 'node' && $print_settings['show_link'] && $main == 0) {
$links['print'] = theme('print_link', $node);
}
return $links;
}
function print_form_alter($form_id, &$form) {
// Add the node-type settings option to activate the printer friendly version link
if ('node_type_form' == $form_id) {
$form['workflow']['print_display'] = array(
'#type' => 'checkbox',
'#title' => t('Show printer-friendly version link'),
'#return_value' => 1,
'#default_value' => variable_get('print_display_'. $form['#node_type']->type, '1'),
'#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' ))),
);
}
/* elseif ('comment_admin_settings' == $form_id) {
$form['viewing_options']['print_display_comment'] = array(
'#type' => 'checkbox',
'#title' => t('Show printer-friendly version link'),
'#return_value' => 1,
'#default_value' => variable_get('print_display_comment', '1'),
'#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' ))),
);
}*/
}
function print_settings_default() {
return array('show_link' => 1, 'logo_url' => '', 'css' => '', 'urls' => 1, 'newwindow' => 0, 'sendtoprinter' => 0);
}
function print_sourceurl_settings_default() {
return array('enabled' => 1, 'date' => 0, 'forcenode' => 0);
}
function print_robot_settings_default() {
return array('noindex' => 1, 'nofollow' => 1, 'noarchive' => 0, 'nocache' => 0);
}
function print_main_settings() {
$print_settings = variable_get('print_settings', print_settings_default());
$form['print_settings'] = array(
'#type' => 'fieldset',
'#tree' => TRUE,
);
$form['print_settings']['show_link'] = array(
'#type' => 'radios',
'#title' => t('Printer-friendly page link'),
'#default_value' => $print_settings['show_link'],
'#options' => array(t("Disabled"), t("Enabled")),
'#description' => t("Enable or disable the printer friendly page link for each node. Even if the link is disabled, you can still view the print version of a node by going to print/nid where nid is the numeric id of the node."),
);
$form['print_settings']['logo_url'] = array(
'#type' => 'textfield',
'#title' => t('Logo URL'),
'#default_value' => $print_settings['logo_url'],
'#size' => 60,
'#maxlength' => 250,
'#description' => t('An alternative logo to display on the printer friendly version. If left empty, the current theme\'s logo is used.'),
);
$form['print_settings']['css'] = array(
'#type' => 'textfield',
'#title' => t('Stylesheet URL'),
'#default_value' => $print_settings['css'],
'#size' => 60,
'#maxlength' => 64,
'#description' => t('The URL to your custom print cascading stylesheet, if any. When none is specified, a set of default styles are used.'),
);
$form['print_settings']['urls'] = array(
'#type' => 'checkbox',
'#title' => t('Printer friendly URLs list'),
'#return_value' => 1,
'#default_value' => $print_settings['urls'],
'#description' => t('If set, links in your page will be de-activated, and a list of the destination URLs will be displayed at the bottom of the page.'),
);
$form['print_settings']['newwindow'] = array(
'#type' => 'checkbox',
'#title' => t('Open the printer-friendly version in a new window'),
'#return_value' => 1,
'#default_value' => $print_settings['newwindow'],
'#description' => t('Setting this option will make the printer-friendly version open in a new window/tab.'),
);
$form['print_settings']['sendtoprinter'] = array(
'#type' => 'checkbox',
'#title' => t('Send to printer'),
'#return_value' => 1,
'#default_value' => $print_settings['sendtoprinter'],
'#description' => t('Automatically calls the browser\'s print function when the printer-friendly version is displayed.'),
);
$print_sourceurl_settings = variable_get('print_sourceurl_settings', print_sourceurl_settings_default());
$form['print_sourceurl_settings'] = array(
'#type' => 'fieldset',
'#title' => t('Source URL'),
'#collapsible' => true,
'#collapsed' => true,
'#tree' => true,
);
$form['print_sourceurl_settings']['enabled'] = array(
'#type' => 'checkbox',
'#title' => t('Display source URL'),
'#return_value' => 1,
'#default_value' => $print_sourceurl_settings['enabled'],
'#description' => t('When this option is selected, the URL for the original page will be displayed at the bottom of the printer-friendly version.'),
);
$form['print_sourceurl_settings']['date'] = array(
'#type' => 'checkbox',
'#title' => t('Add current time/date to the source URL'),
'#return_value' => 1,
'#default_value' => $print_sourceurl_settings['date'],
'#description' => t('Display the current date and time in the Source URL line.'),
);
$form['print_sourceurl_settings']['forcenode'] = array(
'#type' => 'checkbox',
'#title' => t('Force use of node ID in source URL'),
'#return_value' => 1,
'#default_value' => $print_sourceurl_settings['forcenode'],
'#description' => t('Drupal will attempt to use the page\'s defined alias in case there is one. To force the use of the fixed URL, activate this option.'),
);
$print_robot_settings = variable_get('print_robot_settings', print_robot_settings_default());
$form['print_robot_settings'] = array(
'#type' => 'fieldset',
'#title' => t('Robots META tags'),
'#collapsible' => true,
'#collapsed' => true,
'#tree' => TRUE,
);
$form['print_robot_settings']['noindex'] = array(
'#type' => 'checkbox',
'#title' => t('Add noindex'),
'#return_value' => 1,
'#default_value' => $print_robot_settings['noindex'],
'#description' => t('Instruct robots to not index printer friendly pages. Recommended for good search engine karma.')
);
$form['print_robot_settings']['nofollow'] = array(
'#type' => 'checkbox',
'#title' => t('Add nofollow'),
'#return_value' => 1,
'#default_value' => $print_robot_settings['nofollow'],
'#description' => t('Instruct robots to not follow outgoing links on printer friendly pages.')
);
$form['print_robot_settings']['noarchive'] = array(
'#type' => 'checkbox',
'#title' => t('Add noarchive'),
'#return_value' => 1,
'#default_value' => $print_robot_settings['noarchive'],
'#description' => t('Non-standard tag to instruct search engines to not show a "Cached" link for your printer friendly pages. Recognized by Googlebot.')
);
$form['print_robot_settings']['nocache'] = array(
'#type' => 'checkbox',
'#title' => t('Add nocache'),
'#return_value' => 1,
'#default_value' => $print_robot_settings['nocache'],
'#description' => t('Non-standard tag to instruct search engines to not show a "Cached" link for your printer friendly pages')
);
return system_settings_form($form);
}
/********************************************************************
* Module Functions :: Controllers
********************************************************************/
function print_node_controller($nid) {
print_generate_node($nid);
}
function print_controller($module = NULL) {
$f = 'print_generate_'. $module;
if (function_exists($f)) {
$f();
} else {
drupal_not_found();
}
}
/********************************************************************
* Module Functions
********************************************************************/
/**
* Generates a meta tag to tell robots what they may index based on module settings
*
* @return string
*/
function _print_robots_meta_generator() {
$robots_settings = variable_get('print_robot_settings', print_robot_settings_default());
$robots_meta = array();
if(!empty($robots_settings['noindex'])) {
$robots_meta[] = 'noindex';
}
if(!empty($robots_settings['nofollow'])) {
$robots_meta[] = 'nofollow';
}
if(!empty($robots_settings['noarchive'])) {
$robots_meta[] = 'noarchive';
}
if(!empty($robots_settings['nocache'])) {
$robots_meta[] = 'nocache';
}
if(sizeof($robots_meta) > 0) {
$robots_meta = isset($robots_meta[1]) ? implode(', ', $robots_meta) : $robots_meta[0];
$robots_meta = '\n";
} else {
$robots_meta = '';
}
return $robots_meta;
}
/**
* We need to manipulate URLs in two manners, depending on the state of the Printer Friendly URLs setting:
* 1. When on, we need to show the original URLs, making sure that they are absolute (even anchor names).
* 2. When off, relative URLs must be transformed to absolute URLs, including images, but not the anchors.
*/
function print_rewrite_urls($matches) {
// Get value of Printer Friendly URLs setting
$print_settings = variable_get('print_settings', print_settings_default());
$pfurls = (!empty($print_settings['urls']));
// first, split the html into the different tag attributes
$attribs = preg_split("/[ \t]+/m", $matches[1]);
for ($i=1; $i < count($attribs); $i++) {
// If the attribute is href or src, we may need to rewrite the URL in the value
if (preg_match("/^href|src/i", $attribs[$i]) > 0) {
// We may need to rewrite the URL, so let's isolate it
preg_match("/.*?=(.*)/is", $attribs[$i], $urls);
$url = trim($urls[1]," \t\n\r\0\x0B\"\'");
if (strpos($url, '://') || preg_match("/^mailto:.*?@.*?\..*?$/iu", $url)) {
// URL is absolute, do nothing
$newurl = $url;
} else {
if (substr($url, 0, 1) == "#") {
// URL is an anchor tag
if ($pfurls) {
// Printer Friendly URLs is on, so we need to make it absolute
$newurl = url("node/" . $node->nid, NULL, substr($url,1), TRUE);
$matches[1] = str_replace($url, $newurl, $matches[1]);
}
} else {
// URL is relative, convert it into absolute URL, removing any extra beginning or end '/'
$newurl = url(trim($url,"/"), NULL, NULL, TRUE);
$matches[1] = str_replace($url, $newurl, $matches[1]);
}
}
}
}
$ret = '<' . $matches[1] . '>';
if ($attribs[0] == "a") {
$ret .= $matches[2] . '';
if ($pfurls) {
$ret .= ' ';
}
}
return $ret;
}
/**
* Outputs a printer friendly page.
*/
function print_generate_node($title) {
global $base_url;
/* We can take a node id or a node title */
$node = (is_numeric($title)) ? node_load(array('nid' => $title)) : node_load(array('title' => $title));
if (!$node->title) return false;
// To work with other node types, use drupal's render engine instead of the old node_view method
$node->body = drupal_render(node_build_content($node)->content);
// Convert the a href elements
$pattern = "@<(a[^>]*?)>(.*?)@is";
$node->body = preg_replace_callback($pattern, "print_rewrite_urls", $node->body);
// Now the img elements
$pattern = "@<(img[^>]*?)>@is";
$node->body = preg_replace_callback($pattern, "print_rewrite_urls", $node->body);
// associative array settings
$print_settings = variable_get('print_settings', print_settings_default());
$print_sourceurl_settings = variable_get('print_sourceurl_settings', print_sourceurl_settings_default());
// Display the collected links at the bottom of the page.
if (!empty($print_settings['urls'])) {
$urls = print_friendly_urls();
if (count($urls)) {
$node->pfp_links = '';
$max = count($urls);
for ($i = 0; $i < $max; $i++) {
$node->pfp_links .= '['. ($i + 1) .'] '. $urls[$i] ."
\n";
}
}
}
init_theme();
$node->logo = !empty($print_settings['logo_url']) ? $print_settings['logo_url'] : theme_get_setting('logo');
/* Grab and format the src URL */
if ($print_sourceurl_settings['enabled'] == 1) {
if (empty($print_sourceurl_settings['forcenode'])) {
$node->source_url = url("node/$node->nid", NULL, NULL, TRUE);
} else {
$clean_url = (bool)variable_get('clean_url', '0');
$node->source_url = $base_url . '/' . ($clean_url ? '' : '?q=') . 'node/' . $node->nid;
}
} else {
$node->source_url = 0;
}
$node->language = $GLOBALS['locale'];
$node->undefcss = empty($print_settings['css']);
$node->printcss = !empty($print_settings['css']) ? $print_settings['css'] : (drupal_get_path('module', 'print') . '/' . 'print.css');
$node->printdate = $print_sourceurl_settings['date'];
$node->sendtoprinter = $print_settings['sendtoprinter'];
$robots_meta = _print_robots_meta_generator();
include_once(drupal_get_path('module', 'print') . '/' . 'print.node.tpl.php');
}
function print_friendly_urls($url = 0) {
static $urls = array();
if ($url) {
$urls[] = $url;
return count($urls);
}
return $urls;
}
/********************************************************************
* Module Functions :: Themeable Functions
********************************************************************/
function theme_print_link($node) {
$print_settings = variable_get('print_settings', print_settings_default());
$attributes = array('title' => t('Display a printer friendly version of this page.'), 'class' => 'print-page');
if ($print_settings['newwindow']) {
$attributes['target'] = '_blank';
}
return array('title' => t('Printer friendly version'), 'href' => "print/$node->nid", 'attributes' => $attributes);
}