diff --git a/src/QBar/BlockOutput.hs b/src/QBar/BlockOutput.hs
new file mode 100644
index 0000000000000000000000000000000000000000..23cc2508624ae2b5f59583c6f1c92963c4d464c2
--- /dev/null
+++ b/src/QBar/BlockOutput.hs
@@ -0,0 +1,39 @@
+module BlockOutput where
+
+import qualified Data.Text.Lazy as T
+
+newtype BlockText = BlockText [BlockTextSegment]
+instance Semigroup BlockText where
+  (BlockText a) <> (BlockText b) = BlockText (a <> b)
+instance Monoid BlockText where
+  mempty = BlockText []
+
+data BlockTextSegment = BlockTextSegment {
+    active :: Bool,
+    importance :: Importance,
+    text :: T.Text
+  }
+  | PangoTextSegment T.Text
+
+type Importance = Float
+
+mkText :: Bool -> Importance -> T.Text -> BlockText
+mkText active importance text = BlockText [BlockTextSegment { text, active, importance }]
+
+activeImportantText :: Importance -> T.Text -> BlockText
+activeImportantText = mkText True
+
+importantText :: Importance -> T.Text -> BlockText
+importantText = mkText False
+
+activeText :: T.Text -> BlockText
+activeText = mkText True 0
+
+normalText :: T.Text -> BlockText
+normalText = mkText False 0
+
+pangoText :: T.Text -> BlockText
+pangoText pango = BlockText [PangoTextSegment pango]
+
+surroundWith :: (T.Text -> BlockText) -> T.Text -> T.Text -> BlockText -> BlockText
+surroundWith format left right middle = (format left) <> middle <> (format right)
diff --git a/src/QBar/Core.hs b/src/QBar/Core.hs
index db2155d95de1aa978e10c8f559669e08a4a6edff..9b25be1396d685676600c677cf73a042065311a6 100644
--- a/src/QBar/Core.hs
+++ b/src/QBar/Core.hs
@@ -85,38 +85,6 @@ data Bar = Bar {
 data BarUpdateChannel = BarUpdateChannel (IO ())
 type BarUpdateEvent = Event.Event
 
-newtype BlockText = BlockText [BlockTextSegment]
-instance Semigroup BlockText where
-  (BlockText a) <> (BlockText b) = BlockText (a <> b)
-instance Monoid BlockText where
-  mempty = BlockText []
-
-data BlockTextSegment = BlockTextSegment {
-    active :: Bool,
-    importance :: Importance,
-    text :: T.Text
-  }
-  | PangoTextSegment T.Text
-
-type Importance = Float
-
-mkText :: Bool -> Importance -> T.Text -> BlockText
-mkText active importance text = BlockText [BlockTextSegment { text, active, importance }]
-
-activeImportantText :: Importance -> T.Text -> BlockText
-activeImportantText = mkText True
-
-importantText :: Importance -> T.Text -> BlockText
-importantText = mkText False
-
-activeText :: T.Text -> BlockText
-activeText = mkText True 0
-
-normalText :: T.Text -> BlockText
-normalText = mkText False 0
-
-pangoText :: T.Text -> BlockText
-pangoText pango = BlockText [PangoTextSegment pango]
 
 defaultColor :: T.Text
 defaultColor = "#969896"