summaryrefslogtreecommitdiff
path: root/vendor/wikimedia/wrappedstring/src/WrappedString.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/wikimedia/wrappedstring/src/WrappedString.php')
-rw-r--r--vendor/wikimedia/wrappedstring/src/WrappedString.php110
1 files changed, 110 insertions, 0 deletions
diff --git a/vendor/wikimedia/wrappedstring/src/WrappedString.php b/vendor/wikimedia/wrappedstring/src/WrappedString.php
new file mode 100644
index 00000000..ed2593de
--- /dev/null
+++ b/vendor/wikimedia/wrappedstring/src/WrappedString.php
@@ -0,0 +1,110 @@
+<?php
+/**
+ * Copyright (c) 2015 Timo Tijhof <krinklemail@gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * @file
+ */
+
+namespace WrappedString;
+
+class WrappedString {
+ /** @var string */
+ protected $value;
+
+ /** @var string */
+ protected $prefix;
+
+ /** @var string */
+ protected $suffix;
+
+ /**
+ * @param string $value
+ * @param string $prefix
+ * @param string $suffix
+ */
+ public function __construct( $value, $prefix = null, $suffix = null ) {
+ $this->value = $value;
+ $this->prefix = $prefix;
+ $this->suffix = $suffix;
+ }
+
+ /**
+ * @param string $content
+ * @return WrappedString Newly wrapped string
+ */
+ protected function extend( $value ) {
+ $wrap = clone $this;
+ $suffixlen = strlen( $this->suffix );
+ if ( $suffixlen ) {
+ $wrap->value = substr( $this->value, 0, -$suffixlen );
+ }
+ $wrap->value .= substr( $value, strlen( $this->prefix ) );
+ return $wrap;
+ }
+
+ /**
+ * Merge consecutive wrapped strings with the same before/after values.
+ *
+ * Does not modify the array or the WrappedString objects.
+ *
+ * @param WrappedString[] $wraps
+ * @return WrappedString[]
+ */
+ protected static function compact( array &$wraps ) {
+ $consolidated = array();
+ $prev = current( $wraps );
+ while ( ( $wrap = next( $wraps ) ) !== false ) {
+ if ( $prev instanceof WrappedString
+ && $wrap instanceof WrappedString
+ && $prev->prefix !== null
+ && $prev->prefix === $wrap->prefix
+ && $prev->suffix !== null
+ && $prev->suffix === $wrap->suffix
+ ) {
+ $prev = $prev->extend( $wrap->value );
+ } else {
+ $consolidated[] = $prev;
+ $prev = $wrap;
+ }
+ }
+ // Add last one
+ $consolidated[] = $prev;
+
+ return $consolidated;
+ }
+
+ /**
+ * Join a several wrapped strings with a separator between each.
+ *
+ * @param string $sep
+ * @param WrappedString[] $wraps
+ * @return string
+ */
+ public static function join( $sep, array $wraps ) {
+ return implode( $sep, self::compact( $wraps ) );
+ }
+
+ /** @return string */
+ public function __toString() {
+ return $this->value;
+ }
+}