Index: modules/news_page/news_page.module
===================================================================
RCS file: /cvs/drupal/contributions/modules/news_page/news_page.module,v
retrieving revision 1.13
diff -u -r1.13 news_page.module
--- modules/news_page/news_page.module	14 Jan 2007 03:37:34 -0000	1.13
+++ modules/news_page/news_page.module	1 Mar 2007 00:33:50 -0000
@@ -56,6 +56,36 @@
   return array('access news page', 'access news page feed', 'create news page', 'edit own news page');
 }
 
+function news_page_cron() {
+  $interval = variable_get('news_page_cron_interval', 21600); 
+
+  if ((time() - $interval) >= variable_get('news_page_cron_last', 0)) {
+    watchdog('newspage-cron', 'starting...', WATCHDOG_NOTICE);
+    if (module_exist('feedmanager')) {
+      $result = db_query('SELECT * 
+                          FROM {news_page} 
+                          WHERE feedparser_promote = 1'
+                        );
+      while ($news_page = db_fetch_object($result)) {
+        watchdog('newspage-cron', 'found news_page node to process..' . $news_page->cid, WATCHDOG_NOTICE);
+        if ($news_page->include && $news_page->cid) {
+          $search = news_page_search_node_criteria($news_page->include, $news_page->cid);
+          $result = db_query_range($search, 0, $news_page->max_items);
+          while ($item = db_fetch_object($result)) {
+            watchdog('newspage-cron', 'found feedparser_node...' . $item->title, WATCHDOG_NOTICE);
+            db_query("UPDATE {node} 
+                      SET promote = 1 
+                      WHERE nid = %d", 
+                      $item->nid
+                      );
+          }
+        }
+      }
+      watchdog('newspage-cron', 'end...', WATCHDOG_NOTICE);
+      variable_set('news_page_cron_last',  time());
+    }
+  }
+}
 
 // Implementation of hook_link().
 function news_page_link($type, $node = 0, $main) {
@@ -135,17 +165,31 @@
   );
   
   $form['body_filter']['filter'] = filter_form($node->format);
-  
-  $results = db_query("SELECT cid, title FROM {aggregator_category}");
-  $row_count = db_num_rows($results);
-
-  if ($row_count == 0) form_set_error('cid', t('You must create at least 1 aggregator category before creating a news page.'));
 
   $categories[0] = t('--none--');
 
-  for ($counter = 1; $counter <=  $row_count; $counter++) {
-    $category= db_fetch_object ($results);
-    $categories[$category->cid] = $category->title;
+  if (module_exist('feedmanager')) {
+    $query = 
+    "SELECT cid, name
+    FROM {term_data} t
+    JOIN {aggregator_category_feed} c
+    ON c.cid = t.tid
+    GROUP BY cid";
+    $terms = db_query($query);
+    while ($term = db_fetch_object($terms)) {
+      $categories[$term->cid] = $term->name;
+    }
+  }
+  else {
+    $results = db_query("SELECT cid, title FROM {aggregator_category}");
+    $row_count = db_num_rows($results);
+  
+    if ($row_count == 0) form_set_error('cid', t('You must create at least 1 aggregator category before creating a news page.'));
+  
+    for ($counter = 1; $counter <=  $row_count; $counter++) {
+      $category= db_fetch_object ($results);
+      $categories[$category->cid] = $category->title;
+    }
   }
 
   $form['cid'] = array(
@@ -181,6 +225,16 @@
     '#required' => TRUE,
   );
 
+  if (module_exist('feedmanager')) {
+    $form['feedparser_promote'] = array(
+      '#type' => 'checkbox', 
+      '#title' => 'Use this News Page to promote FeedParser nodes?', 
+      '#default_value' => $node->feedparser_promote, 
+      '#checked' => false
+    );
+
+  }
+
   return $form;
 }
 
@@ -236,6 +290,22 @@
     '#required' => FALSE,
   );
 
+  if (module_exist('feedmanager')) {
+    $form['feedparser'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('FeedParser Settings')
+    );
+    $period = drupal_map_assoc(array(30, 21600, 32400, 43200, 86400, 172800, 259200, 604800), 'format_interval');
+    //$period[0] = t('disabled');
+    $form['feedparser']['news_page_cron_interval'] = array(
+      '#type' => 'select',
+      '#title' => t('How often should cron promote feedparser nodes to the front page?'),
+      '#default_value' => variable_get('news_page_cron_interval', 21600),
+      '#options' => $period,
+      '#description' => t('Select how often you wish to promote feedparser nodes.'),
+    );
+ }
+
   return $form;
 }
 
@@ -277,14 +347,14 @@
 // Implementation of hook_insert().
 function news_page_insert($node) {
   $search = news_page_search_criteria($node->include, $node->cid);
-  db_query("INSERT INTO {news_page} (nid, include, search, cid, max_items) VALUES (%d, '%s', '%s', %d, %d)", $node->nid, $node->include, $search, $node->cid, $node->max_items);
+  db_query("INSERT INTO {news_page} (nid, include, search, cid, max_items, feedparser_promote) VALUES (%d, '%s', '%s', %d, %d, '%s')", $node->nid, $node->include, $search, $node->cid, $node->max_items, $node->feedparser_promote);
 }
 
 
 // Implementation of hook_update().
 function news_page_update($node) {
   $search = news_page_search_criteria($node->include, $node->cid);
-  db_query("UPDATE {news_page} SET include = '%s', search = '%s', cid = %d, max_items = %d WHERE nid = %d", $node->include, $search, $node->cid, $node->max_items, $node->nid);
+  db_query("UPDATE {news_page} SET include = '%s', search = '%s', cid = %d, max_items = %d, feedparser_promote = '%s' WHERE nid = %d", $node->include, $search, $node->cid, $node->max_items, $node->feedparser_promote, $node->nid);
 }
 
 // Implementation of hook_delete().
@@ -295,7 +365,7 @@
 
 // Implementation of hook_load().
 function news_page_load($node) {
-  $additions = db_fetch_object(db_query('SELECT include, search, cid, max_items FROM {news_page} WHERE nid = %d', $node->nid));
+  $additions = db_fetch_object(db_query('SELECT include, search, cid, max_items, feedparser_promote FROM {news_page} WHERE nid = %d', $node->nid));
   return $additions;
 }
 
@@ -379,7 +449,7 @@
     }
 
     $filter_query = 
-    "SELECT i.*, f.link AS flink, f.title AS ftitle
+    "SELECT i.*, i.title as search_title, i.description as search_description, f.link AS flink, f.title AS ftitle
     FROM {aggregator_item} i
     LEFT JOIN {aggregator_feed} f
     ON i.fid = f.fid
@@ -388,7 +458,60 @@
     WHERE c.cid = '$cid' 
     AND ( $news_query )
     ORDER BY timestamp DESC";
+ 
+    return $filter_query;
+}
+
+function news_page_search_node_criteria($keywords, $cid) {
+
+    $words = explode(",", $keywords);
     
+    foreach ($words as $word) {
+      $word = trim($word);
+      if (preg_match("/^-/", $word)) {
+      $word = preg_replace('/^-/','', $word);
+      $not_title_filter[] = "lower(r.title) NOT LIKE '%%" . $word . "%%'";
+      $not_content_filter[] = "lower(r.body) NOT LIKE '%%" . $word . "%%'";
+      $not_filter_query = implode(" AND ", $not_title_filter) . ' AND ' . implode(" AND ", $not_content_filter);
+      } elseif (preg_match("/^\+/", $word)) {
+      $word = preg_replace('/^\+/','', $word);
+      $and_title_filter[] = "lower(r.title) LIKE '%%" . $word . "%%'";
+      $and_content_filter[] = "lower(r.body) LIKE '%%" . $word . "%%'";
+      $and_filter_query = implode(" AND ", $and_title_filter) . ' OR ' . implode(" AND ", $and_content_filter);
+      } else {
+      $title_filter[] = "lower(r.title) LIKE '%%" . $word . "%%'";
+      $content_filter[] = "lower(r.body) LIKE '%%" . $word . "%%'";
+      $filter_query = implode(" OR ", $title_filter) . ' OR ' . implode(" OR ", $content_filter);
+      }
+    }
+    $news_queries = array($not_filter_query, $and_filter_query, $filter_query);
+    $i = 0;
+    foreach ($news_queries as $query) {
+      if ($i>0 && drupal_strlen($query) > 0) {
+        $news_query .= "AND " ;
+      }
+      if (drupal_strlen($query)) {
+      $news_query .= "(". $query .")"; 
+      $i++;
+      }
+    }
+
+    $filter_query = 
+    "SELECT i.*, r.title, r.body, n.nid, n.created AS ftitle
+    FROM {aggregator_node} i
+    LEFT JOIN {aggregator_feed} f
+    ON i.fid = f.fid
+    LEFT JOIN {aggregator_category_feed} c
+    ON c.fid = f.fid
+    LEFT JOIN {node} n
+    ON i.nid = n.nid
+    LEFT JOIN {node_revisions} r
+    ON n.nid = r.nid
+    WHERE c.cid = '$cid' 
+    AND n.promote = 0 
+    AND ( $news_query )
+    ORDER BY n.created DESC";
+ 
     return $filter_query;
 }
 
@@ -410,7 +533,12 @@
 	$output .= '<p>';
 
 	if ($item->description) {
-	  $output .= '<span class="feed-item-body">' . aggregator_filter_xss($item->description) . '</span>';
+    if (module_exist('feedmanager')) {
+  	  $output .= '<span class="feed-item-body">' . feedmanager_filter_xss($item->description) . '</span>';
+    }
+    else {
+  	  $output .= '<span class="feed-item-body">' . aggregator_filter_xss($item->description) . '</span>';
+    }
 	}
 	
 	if ($blogit) {
