All pastes #1853716 Raw Edit

lmaowaffle

public shellscript v1 · immutable
#1853716 ·published 2010-03-27 07:47 UTC
rendered paste body
# Module for archive functions# Last modified: 2008-07-16T22:54:53-04:00# set base url based on parametersset_baseurl(){   node_var="$1"   base_dir=`dirname "$2"`   # check if we want absolute links   if [ "$ABSOLUTE_LINKS" = 1 ]; then      BASE_URL="$BLOG_URL/"   else      BASE_URL="$node_var"      if [ "$base_dir" != . ]; then         blogdir_sedvar=`echo "${BLOG_DIR//\//\\\\/}\\\\/"`         base_dir="$base_dir/./"         BASE_URL=`echo "$base_dir" |sed -e 's/'$blogdir_sedvar'//g; /^[\.]\// s///; s/[^ \/]*./..\//g; s/^[\.][\.]\///g'`      fi      [ -z "$BASE_URL" ] && BASE_URL="./"   fi   # set link path to archives   ARCHIVES_PATH="${BASE_URL}$ARCHIVES_DIR/"}# set link/file for given categoryset_catlink(){   catlink_var="$1"   # title-based links   category_title=`nb_print "$NB_DATA_DIR/$catlink_var" 1`   category_dir=`set_smartlinktitle "$catlink_var" cat`   # failsafe for setting cat directories   : ${category_dir:=${catlink_var%%\.*}}   category_file="$category_dir/$NB_INDEXFILE"   category_link="$category_dir/$NB_INDEX"}# set link/file for given monthset_monthlink(){   month_dir="${1//\-//}"   month_file="$month_dir/$NB_INDEXFILE"   NB_ArchiveMonthLink="$month_dir/$NB_INDEX"}set_daylink(){   day_dir="${1//\-//}"   day_file="$day_dir/$NB_INDEXFILE"   NB_ArchiveDayLink="$day_dir/$NB_INDEX"}set_daynavlinks(){   daynavlinks_var="${1//\//-}"   day_id=   [ ! -z "$daynavlinks_var" ] &&   day_id=`lookup_id "$daynavlinks_var" "${DAY_DB_RESULTS[*]}"`   if [ ! -z "$day_id" ] && [ $day_id -gt 0 ]; then      # adjust for bash array - 1 = 0      ((day_id--))      # determine direction based on chronological date order      if [ "$CHRON_ORDER" = 1 ]; then         let prev_dayid=${day_id}+1         let next_dayid=${day_id}-1      else         let prev_dayid=${day_id}-1         let next_dayid=${day_id}+1      fi      prev_day=; NB_PrevArchiveDayLink=      [ $prev_dayid -ge 0 ] &&      prev_day=${DAY_DB_RESULTS[$prev_dayid]}      if [ ! -z "$prev_day" ]; then         prev_day_dir="${prev_day//\-//}"         prev_day_file="$prev_day_dir/$NB_INDEXFILE"         NB_PrevArchiveDayLink="$prev_day_dir/$NB_INDEX"      fi      next_day=; NB_NextArchiveDayLink=      [ $next_dayid -ge 0 ] &&      next_day=${DAY_DB_RESULTS[$next_dayid]}      if [ ! -z "$next_day" ]; then         next_day_dir="${next_day//\-//}"         next_day_file="$next_day_dir/$NB_INDEXFILE"         NB_NextArchiveDayLink="$next_day_dir/$NB_INDEX"      fi   fi}# set previous and next links for given monthset_monthnavlinks(){   monthnavlinks_var="${1//\//-}"   month_id=   [ ! -z "$monthnavlinks_var" ] &&   month_id=`lookup_id "$monthnavlinks_var" "${MONTH_DB_RESULTS[*]}"`   if [ ! -z "$month_id" ] && [ $month_id -gt 0 ]; then      # adjust for bash array - 1 = 0      ((month_id--))      # determine direction based on chronological date order      if [ "$CHRON_ORDER" = 1 ]; then         let prev_monthid=${month_id}+1         let next_monthid=${month_id}-1      else         let prev_monthid=${month_id}-1         let next_monthid=${month_id}+1      fi      prev_month=; NB_PrevArchiveMonthLink=      [ $prev_monthid -ge 0 ] &&      prev_month=${MONTH_DB_RESULTS[$prev_monthid]}      if [ ! -z "$prev_month" ]; then         prev_month_dir="${prev_month//\-//}"         prev_month_file="$prev_month_dir/$NB_INDEXFILE"         NB_PrevArchiveMonthLink="$prev_month_dir/$NB_INDEX"      fi      next_month=; NB_NextArchiveMonthLink=      [ $next_monthid -ge 0 ] &&      next_month=${MONTH_DB_RESULTS[$next_monthid]}      if [ ! -z "$next_month" ]; then         next_month_dir="${next_month//\-//}"         next_month_file="$next_month_dir/$NB_INDEXFILE"         NB_NextArchiveMonthLink="$next_month_dir/$NB_INDEX"      fi   fi}# generate entry's anchor/idset_entryid(){   echo "$x_id${1//[\/]/-}"}# use instead of translit_text to avoid file/URL collissionsset_smartlinktitle(){   altlink_var="$1"   altlink_type="$2"   case "$altlink_type" in      entry)      [ -f "$NB_DATA_DIR/$altlink_var" ] &&      read_metadata TITLE "$NB_DATA_DIR/$altlink_var"      smartlink_metatitle="$METADATA"      altentry_linktitle=`translit_text "$METADATA"`      # search for similar titles that fall on same day      alte_day=${altlink_var:0:10}      query_db "$alte_day"      ALTLINK_LIST=(${DB_RESULTS[*]})      if [ "${#ALTLINK_LIST}" -gt 1 ]; then         for alte in ${ALTLINK_LIST[*]}; do            [ -f "$NB_DATA_DIR/$alte" ] &&            read_metadata TITLE "$NB_DATA_DIR/$alte"            alte_linktitle=`translit_text "$METADATA"`            # entry title failsafe            [ -z "$alte_linktitle" ] &&            alte_linktitle=`translit_text "$notitle"`            echo "$alte:$alte_linktitle"         done |sort $SORT_ARGS > "$SCRATCH_FILE".altlinks      fi      link_match="$altentry_linktitle"      alte_backup=${altlink_var//-//}; alte_backup=${alte_backup//T//T}      alte_backup=${alte_backup%%.*}; altlink_backup="${alte_backup//*\/}"      ;;      cat)      [ -f "$NB_DATA_DIR/$altlink_var" ] &&      altcat_title=`nb_print "$NB_DATA_DIR/$altlink_var" 1`      altcat_linktitle=`translit_text "$altcat_title"`      query_db # get categories list      ALTLINK_LIST=(${db_categories[*]})      for altt in ${ALTLINK_LIST[*]}; do         [ -f "$NB_DATA_DIR/$altt" ] &&         altt_title=`nb_print "$NB_DATA_DIR/$altt" 1`         altt_linktitle=`translit_text "$altt_title"`         # cat title failsafe         [ -z "$altt_linktitle" ] &&         altt_linktitle=`translit_text "$notitle"`         echo "$altt:$altt_linktitle"      done |sort $SORT_ARGS > "$SCRATCH_FILE".altlinks      link_match="$altcat_linktitle"      altlink_backup=${altlink_var%%\.*}      ;;   esac   [ ! -f "$SCRATCH_FILE".altlinks ] && > "$SCRATCH_FILE".altlinks   # link match failsafe   [ -z "$link_match" ] &&   link_match=`translit_text "$notitle"`   get_linkconflicts(){      linkmatch_var="$1"      if [ ! -z "$linkmatch_var" ]; then         grep -c ":${linkmatch_var}$" "$SCRATCH_FILE".altlinks      else         echo 0      fi   }   TOTAL_LINKCFLICTS=`get_linkconflicts "$link_match"`   ALTLINK_LIST=(`cut -d":" -f 1 "$SCRATCH_FILE".altlinks`)   altli=0   while [ "$TOTAL_LINKCFLICTS" -gt 1 ]; do      for altl in ${ALTLINK_LIST[*]}; do         altl_match=`grep -c ":${link_match}$" "$SCRATCH_FILE".altlinks`         if [ "$altl_match" -gt 1 ]; then            let altli=${altl_match}-1            sed -e '/'$altl':*.*/ s//'$altl':'$link_match'_'${altli}'/' "$SCRATCH_FILE".altlinks > "$SCRATCH_FILE".altlinks.new            mv "$SCRATCH_FILE".altlinks.new "$SCRATCH_FILE".altlinks         else            altli=0 # reset counter         fi      done      TOTAL_LINKCFLICTS=`get_linkconflicts "$link_match"`   done   smart_linktitle=`sed -e '/'$altlink_var':/!d; /'$altlink_var':/ s///' "$SCRATCH_FILE".altlinks`   # smart linktitle failsafe and backwards compatibility   [ -z "$smart_linktitle" ] || [ "$FRIENDLY_LINKS" != 1 ] &&   smart_linktitle="$altlink_backup"   echo "$smart_linktitle"}# set link/file for given entryset_entrylink(){   entrylink_var="$1"   link_type="$2"   if [ "$ENTRY_ARCHIVES" = 1 ] && [ "$link_type" != altlink ]; then      entrylink_var="${entrylink_var//-//}"      entry_dir=${entrylink_var%%\.*}      entry_dir=${entry_dir:0:10}      entry_linktitle=`set_smartlinktitle "${entrylink_var//\//-}" entry`      permalink_file="$entry_dir/$entry_linktitle/$NB_INDEXFILE"      NB_EntryPermalink="$entry_dir/$entry_linktitle/$NB_INDEX"      month=${entrylink_var:0:7}      set_monthlink "$month"      day=${entrylink_var:0:10}      set_daylink "$day"   else      month=${entrylink_var:0:7}      set_monthlink "$month"      entrylink_id=$x_id${entrylink_var//[\/]/-}      NB_EntryPermalink="$NB_ArchiveMonthLink#$entrylink_id"      if [ "$DAY_ARCHIVES" = 1 ]; then         day=${entrylink_var:0:10}         set_daylink "$day"         NB_EntryPermalink="$NB_ArchiveDayLink#$entrylink_id"      fi   fi}# set previous and next links for given entryset_entrynavlinks(){   entrynavlinks_type="$1"   entrynavlinks_entry=`echo "$2" |grep '^[0-9].*'`   case "$entrynavlinks_type" in      prev)      prev_entry=; NB_PrevEntryPermalink=      prev_entry="$entrynavlinks_entry"      ;;      next)      next_entry=; NB_NextEntryPermalink=      next_entry="$entrynavlinks_entry"      ;;   esac   if [ ! -z "$prev_entry" ]; then      # Nijel: support for named permalinks      prev_entrylink_var=${prev_entry//[-]//}      prev_entry_file="${prev_entrylink_var##*.}"      prev_entry_dir=${prev_entrylink_var%%\.*}      prev_entry_dir=${prev_entry_dir:0:10}      prev_entry_linktitle=`set_smartlinktitle "$prev_entry" entry`      prev_permalink_file="$prev_entry_dir/$prev_entry_linktitle/$NB_INDEXFILE"      NB_PrevEntryPermalink="$prev_entry_dir/$prev_entry_linktitle/$NB_INDEX"   fi   if [ ! -z "$next_entry" ]; then      # Nijel: support for named permalinks      next_entrylink_var=${next_entry//[-]//}      next_entry_file="${next_entrylink_var##*.}"      next_entry_dir=${next_entrylink_var%%\.*}      next_entry_dir=${next_entry_dir:0:10}      next_entry_linktitle=`set_smartlinktitle "$next_entry" entry`      next_permalink_file="$next_entry_dir/$next_entry_linktitle/$NB_INDEXFILE"      NB_NextEntryPermalink="$next_entry_dir/$next_entry_linktitle/$NB_INDEX"   fi}# create entry archivemake_entryarchive(){   if [ "$ENTRY_ARCHIVES" = 1 ]; then      mkdir -p `dirname "$BLOG_DIR/$PARTS_DIR/$permalink_file"`      write_template > "$BLOG_DIR/$PARTS_DIR/$permalink_file"      make_page "$BLOG_DIR/$PARTS_DIR/$permalink_file" "$NB_TEMPLATE_DIR/$PERMALINK_TEMPLATE" \      "$BLOG_DIR/$ARCHIVES_DIR/$permalink_file"   fi}# build entry archivesbuild_entryarchives(){   ENTRYARCHIVES_LIST=($1)   ENTRYARCHIVES_TEMPLATE="$2"   ENTRYARCHIVES_DATATYPE="$3"   : ${CACHE_TYPE:=entry}   for entry in ${ENTRYARCHIVES_LIST[@]}; do      entry=${entry%%>*}      if [ -f "$NB_DATA_DIR/$entry" ]; then         [ -z "$PARTS_FILE" ] &&         PARTS_FILE="$BLOG_DIR/$PARTS_DIR/$permalink_file"         if [ "$ENTRYARCHIVES_TEMPLATE" = "$PERMALINKENTRY_TEMPLATE" ]; then            set_baseurl "" "$BLOG_DIR/$ARCHIVES_DIR/$permalink_file"            set_entrylink "$entry"            load_entry "$NB_DATA_DIR/$entry" "$ENTRYARCHIVES_DATATYPE" "$CACHE_TYPE"            year=${month:0:4}            month=${month:5:2}            day=${entry:8:2}            findba_entries "$entry" "${MASTER_DB_RESULTS[*]}"            set_entrynavlinks prev "$before_entry"            set_entrynavlinks next "$after_entry"            load_template "$NB_TEMPLATE_DIR/$ENTRYARCHIVES_TEMPLATE"            make_entryarchive         else            set_baseurl "$BASE_URL"            set_entrylink "$entry"            load_entry "$NB_DATA_DIR/$entry" "$ENTRYARCHIVES_DATATYPE"            load_template "$NB_TEMPLATE_DIR/$ENTRYARCHIVES_TEMPLATE"            if [ ! -z "$TEMPLATE_DATA" ]; then               mkdir -p `dirname "$PARTS_FILE"`               write_template >> "$PARTS_FILE"            fi         fi      fi   done}# generate archive contentmake_archive(){   query_type="$1"   db_catquery="$2"   MKARCH_ENTRY_TEMPLATE="$3"   PARTS_FILE="$4"   db_setlimit="$5"   db_limit="$6"   db_offset="$7"   query_db "$query_type" "$db_catquery" "$db_setlimit" "$db_limit" "$db_offset"   ARCHIVE_LIST=(); ARCHIVE_LIST=(${DB_RESULTS[@]})   mkdir -p `dirname "$PARTS_FILE"`   > "$PARTS_FILE"   # fallback to default entry template   [ ! -f "$NB_TEMPLATE_DIR/$MKARCH_ENTRY_TEMPLATE" ] &&   MKARCH_ENTRY_TEMPLATE="$ENTRY_TEMPLATE"   build_entryarchives "${ARCHIVE_LIST[*]}" "$MKARCH_ENTRY_TEMPLATE" "$ARCH_DATATYPE"   db_setlimit=; db_limit=; db_offset=}# divide larger archives into multiple pagespaginate(){   page_query="$1"   page_catquery="$2"   page_items="$3"   page_template="$4"   page_entrytemplate="$5"   page_dir="$6"   page_file="$7"   page_fbasedir=`dirname "$page_file"`   if [ "$page_fbasedir" != . ]; then      page_filedir="$page_fbasedir/"      page_file=`basename "$page_file"`   fi   update_pages(){      build_pagelist(){         if [ ! -z "$page_num" ]; then            [ -z "$PAGE_LIST" ] && PAGE_LIST="page$page_num"            [ "$PAGE_LIST" != "$OLD_PAGELIST" ] && PAGE_LIST="${OLD_PAGELIST//page$page_num/} page$page_num"            OLD_PAGELIST="$PAGE_LIST"         fi      }      query_db "$page_query" "$page_catquery" limit "$page_limit" "$page_offset"      PAGEMOD_VAR="$New_EntryFile$Delete_EntryFile$DeleteCatDBFile$Cat_EntryFile"      for page_entry in ${UPDATE_LIST[@]}; do         if [ ! -z "$PAGEMOD_VAR" ] || [ "$NB_QUERY" = all ] || [ "$page_catquery" = nocat ]; then            build_pagelist         else            [[ ${DB_RESULTS[*]} == *$page_entry* ]] && build_pagelist         fi      done      PAGE_LIST=`for page_n in $PAGE_LIST; do echo "$page_n"; done`   }   page_bynumber(){      set_baseurl "" "${page_dir}${page_filedir}$page_file"      make_archive "$page_query" "$page_catquery" "$page_entrytemplate" \      "$BLOG_DIR/$PARTS_DIR/${page_filedir}$arch_file" limit "$page_limit" "$page_offset"      make_page "$BLOG_DIR/$PARTS_DIR/${page_filedir}$arch_file" \      "$NB_TEMPLATE_DIR/$page_template" "${page_dir}${page_filedir}$arch_file"   }   query_db "$page_query" "$page_catquery"   total_items=${#DB_RESULTS[*]}   if [ "$total_items" -gt "$page_items" ] && [ "$page_items" != 0 ]; then      get_pages(){ y=0; page_totals=($(while [ "$y" -lt "$total_items" ]; do \         let y=${page_items}+$y; echo $y; done)); echo ${#page_totals[*]}; }         total_pages=`get_pages`; page_totals=0         # cleanup numbered page(s)         if [ "$NB_QUERY" = all ]; then            rm -f "${page_dir}${page_filedir}${page_file%%\.$NB_FILETYPE}"*[0-9]."$NB_FILETYPE"            nb_msg "$paginate_action $total_pages ($page_items/$total_items) ..."         else            nb_msg "$paginate_action ($page_items/$total_items) ..."         fi         page_limit=0; page_offset=1; page_num=0         while [ "$page_num" -lt "$total_pages" ]; do            let page_totals=${page_items}+$page_totals            let page_offset=${page_offset}+$page_limit            # if page items overflow, use difference to set new limit            if [ "$page_totals" -ge "$total_items" ]; then               let page_diff=${page_totals}-$total_items               let page_limit=${page_limit}-$page_diff            else               page_limit="$page_items"            fi            let page_num=${page_num}+1            let prev_num=${page_num}-1            let next_num=${page_num}+1            arch_file="$page_file"            arch_link="./$NB_INDEX"            arch_name="${page_file%%\.*}"            prev_page=`chg_suffix "$arch_name-page$prev_num".no`            next_page=`chg_suffix "$arch_name-page$next_num".no`            [ "$page_num" -gt 1 ] &&            arch_file=`chg_suffix "$arch_name-page$page_num".no`            echo '<table border="0" cellspacing="1" cellpadding="3" summary="page-menu">' > "$SCRATCH_FILE"            echo '<tr>' >> "$SCRATCH_FILE"            [ "$prev_num" = 1 ] &&            echo '<td><a href="'$arch_link'">'$NB_PrevPage'</a></td>' >> "$SCRATCH_FILE"            [ "$prev_num" -gt 1 ] &&            echo '<td><a href="'$prev_page'">'$NB_PrevPage'</a></td>' >> "$SCRATCH_FILE"            i=1            while [ $i -le $total_pages ]; do               [ "$i" = 1 ] && page="$arch_link" ||               page=`chg_suffix "$arch_name-page$i".no`               if [ "$i" = "$page_num" ]; then                  echo '<td>'$i'</td>' >> "$SCRATCH_FILE"               else                  echo '<td><a href="'$page'">'$i'</a></td>' >> "$SCRATCH_FILE"               fi               let i=${i}+1            done            ! [ "$next_num" -gt "$total_pages" ] &&            echo '<td><a href="'$next_page'">'$NB_NextPage'</a></td>' >> "$SCRATCH_FILE"            echo '</tr>' >> "$SCRATCH_FILE"; echo '</table>' >> "$SCRATCH_FILE"            NB_PageLinks=$(< "$SCRATCH_FILE")            if [ ! -z "${UPDATE_LIST[*]}" ] || [ ! -z "$NB_QUERY" ]; then               update_pages               for page_mod in ${PAGE_LIST[@]}; do                  [ "page$page_num" = "$page_mod" ] && page_bynumber               done            else               page_bynumber            fi            NB_PageLinks=         done      else         set_baseurl "" "${page_dir}${page_filedir}$page_file"         make_archive "$page_query" "$db_catquery" "$page_entrytemplate" "$BLOG_DIR/$PARTS_DIR/${page_filedir}$page_file"         make_page "$BLOG_DIR/$PARTS_DIR/${page_filedir}$page_file" "$NB_TEMPLATE_DIR/$page_template" \         "${page_dir}${page_filedir}$page_file"      fi      ARCH_DATATYPE=; page_filedir=   }   # build category archives   build_catarchives(){      export CACHE_TYPE=cat      if [ ! -z "${CAT_LIST[*]}" ]; then         for cat_arch in ${CAT_LIST[@]}; do            if [ -f "$NB_DATA_DIR/$cat_arch" ]; then               NB_ArchiveTitle=`nb_print "$NB_DATA_DIR/$cat_arch" 1`               set_catlink "$cat_arch"               [ ! -z "$CATARCH_DATATYPE" ] &&               ARCH_DATATYPE="$CATARCH_DATATYPE"               load_plugins archive/category               paginate all "$cat_arch" "$MAX_CATPAGE_ENTRIES" "$CATEGORY_TEMPLATE" \               "$CATENTRY_TEMPLATE" "$BLOG_DIR/$ARCHIVES_DIR/" "$category_file"            fi         done      fi   }   # loops through archives, and executes instructions by years or months   loop_archive(){      looparch_list=($1)      looparch_type="$2"      looparch_exec="$3"      # set instructions to execute based on $looparch_type      case $looparch_type in         years) looparchexec_years="$looparch_exec";;         months) looparchexec_months="$looparch_exec";;      esac      ARCHIVE_MASTER=(); ARCHIVE_YEARS=()      ARCHIVE_MASTER=(${looparch_list[*]})      ARCHIVE_YEARS=(`for db_item in ${ARCHIVE_MASTER[@]}; do echo $db_item; done |cut -c 1-4 |sort $SORT_ARGS`)      for yearn in ${ARCHIVE_YEARS[@]}; do         # execute instructions for each year         if [ "$looparch_type" = years ] && [ ! -z "$looparchexec_years" ]; then            $looparchexec_years         else            for monthn in 12 11 10 09 08 07 06 05 04 03 02 01; do               ARCHIVE_MONTHS=(`for db_item in ${ARCHIVE_MASTER[@]}; do echo $db_item; done |grep $yearn'[-]'$monthn'[-]' |sed 1q`)               for entry_month in ${ARCHIVE_MONTHS[@]}; do                  year="$yearn"                  month="$yearn-$monthn"                  query_db "$month"                  # execute instructions for each month                  if [ ! -z "${DB_RESULTS[*]}" ]; then                     [ ! -z "$looparchexec_months" ] &&                     $looparchexec_months                  fi               done            done         fi      done   }   # generate the archives   build_archives(){      LOOP_LIST=()      load_plugins archive      nb_msg "$buildarchives_action"      # build/update the category archives      build_catarchives      if [ "$NB_QUERY" = all ]; then         LOOP_LIST=(${UPDATE_LIST[*]})      else         # remove duplicate entries and category indices from update list, then sort into chronological order         LOOP_LIST=(`for moditem in ${UPDATE_LIST[@]}; do echo ${moditem%%>*}; done |sort $SORT_ARGS`)      fi      # plugins for yearly archives      load_plugins archive/year      # plugins month and day archives      [ "$MONTH_ARCHIVES" = 1 ] &&      load_plugins archive/month      # build entry archives      export CACHE_TYPE=entry      [ "$ENTRY_ARCHIVES" = 1 ] &&      build_entryarchives "${UPDATE_LIST[*]}" "$PERMALINKENTRY_TEMPLATE" ALL   }