--- paging-old.php	2014-10-15 16:41:11.000000000 +1300
+++ paging-new.php	2014-10-15 16:43:52.000000000 +1300
@@ -33,7 +33,8 @@
 		'add_args' => false, // array of query args to add
 		'add_fragment' => '',
 		'before_page_number' => '',
-		'after_page_number' => ''
+		'after_page_number' => '',
+		'link_current' => false,
 	);
 
 	$args = wp_parse_args( $args, $defaults );
@@ -55,7 +56,9 @@
 	$add_args = is_array( $args['add_args'] ) ? $args['add_args'] : false;
 	$r = '';
 	$page_links = array();
+	$page_link_data = array();
 	$dots = false;
+	$active = false;
 
 	if ( $args['prev_next'] && $current && 1 < $current ) :
 		$link = str_replace( '%_%', 2 == $current ? '' : $args['format'], $args['base'] );
@@ -71,27 +74,38 @@
 		 *
 		 * @param string $link The paginated link URL.
 		 */
-		$page_links[] = '<a class="prev page-numbers" href="' . esc_url( apply_filters( 'paginate_links', $link ) ) . '">' . $args['prev_text'] . '</a>';
+		$page_link_data[] = array(
+			'type' => 'prev',
+			'link' => esc_url( apply_filters( 'paginate_links', $link ) ),
+			'text' => $prev_text,
+			'active' => false,
+		);
 	endif;
 	for ( $n = 1; $n <= $total; $n++ ) :
-		if ( $n == $current ) :
-			$page_links[] = "<span class='page-numbers current'>" . $args['before_page_number'] . number_format_i18n( $n ) . $args['after_page_number'] . "</span>";
+		if ( $args['show_all'] || ( $n <= $end_size || ( $current && $n >= $current - $mid_size && $n <= $current + $mid_size ) || $n > $total - $end_size ) ) :
+			$link = str_replace( '%_%', 1 == $n ? '' : $args['format'], $args['base'] );
+			$link = str_replace( '%#%', $n, $link );
+			if ( $add_args ) {
+				$link = add_query_arg( $add_args, $link );
+			}
+			$link .= $args['add_fragment'];
+
+			/** This filter is documented in wp-includes/general-template.php */
+			$page_link_data[] = array(
+				'type' => 'page',
+				'link' => esc_url( apply_filters( 'paginate_links', $link ) ),
+				'text' => number_format_i18n( $n ),
+				'active' => ( $n == $current ),
+			);
 			$dots = true;
-		else :
-			if ( $args['show_all'] || ( $n <= $end_size || ( $current && $n >= $current - $mid_size && $n <= $current + $mid_size ) || $n > $total - $end_size ) ) :
-				$link = str_replace( '%_%', 1 == $n ? '' : $args['format'], $args['base'] );
-				$link = str_replace( '%#%', $n, $link );
-				if ( $add_args )
-					$link = add_query_arg( $add_args, $link );
-				$link .= $args['add_fragment'];
-
-				/** This filter is documented in wp-includes/general-template.php */
-				$page_links[] = "<a class='page-numbers' href='" . esc_url( apply_filters( 'paginate_links', $link ) ) . "'>" . $args['before_page_number'] . number_format_i18n( $n ) . $args['after_page_number'] . "</a>";
-				$dots = true;
-			elseif ( $dots && ! $args['show_all'] ) :
-				$page_links[] = '<span class="page-numbers dots">' . __( '&hellip;' ) . '</span>';
-				$dots = false;
-			endif;
+		elseif ( $dots && !$args['show_all'] ) :
+			$page_link_data[] = array(
+				'type' => 'dots',
+				'link' => null,
+				'text' => __( '&hellip;' ),
+				'active' => false,
+			);
+			$dots = false;
 		endif;
 	endfor;
 	if ( $args['prev_next'] && $current && ( $current < $total || -1 == $total ) ) :
@@ -102,9 +116,41 @@
 		$link .= $args['add_fragment'];
 
 		/** This filter is documented in wp-includes/general-template.php */
-		$page_links[] = '<a class="next page-numbers" href="' . esc_url( apply_filters( 'paginate_links', $link ) ) . '">' . $args['next_text'] . '</a>';
+		$page_link_data[] = array(
+			'type' => 'next',
+			'link' => esc_url( apply_filters( 'paginate_links', $link ) ),
+			'text' => $next_text,
+			'active' => false,
+		);
+	endif;
+	// If we just want the data without the HTML, then we don't need to
+	// process the HTML here.
+	if ( $args['type'] != 'array_raw' ) :
+		foreach ( $page_link_data as $page_link ) :
+			switch( $page_link['type'] ) {
+				case 'prev':
+					$page_links[] = '<a class="prev page-numbers" href="' . $page_link['text'] . '">' . $prev_text . '</a>';
+					break;
+				case 'next':
+					$page_links[] = '<a class="next page-numbers" href="' . $page_link['text'] . '">' . $next_text . '</a>';
+					break;
+				case 'dots':
+					$page_links[] = '<span class="page-numbers dots">' . $page_link['text'] . '</span>';
+					break;
+				case 'page':
+					if ( ! $args['link_current'] && $page_link['active'] ) {
+						$page_links[] = "<span class='page-numbers current'>" . $args['before_page_number'] . $page_link['text'] . $args['after_page_number'] . "</span>";
+					} else {
+						$page_links[] = "<a class='" . ($page_link['active'] ? 'current ' : null) . "page-numbers' href='" . $page_link['link'] . "'>" . $args['before_page_number'] . $page_link['text'] . $args['after_page_number'] . "</a>";
+					}
+					break;
+			}
+		endforeach;
 	endif;
 	switch ( $args['type'] ) {
+		case 'array_raw' :
+			return $page_link_data;
+
 		case 'array' :
 			return $page_links;
 
