diff --git a/modules/io/src/mol/star_writer.hh b/modules/io/src/mol/star_writer.hh
index fd1b094a616c255c498fa2f1c23acfeeba9a503f..8ae465bf87f62b4e84b2f1c650d61b39b1a9e567 100644
--- a/modules/io/src/mol/star_writer.hh
+++ b/modules/io/src/mol/star_writer.hh
@@ -107,144 +107,137 @@ public:
     if(string_value == "") {
       value.value_ = "?";
     } else {
-      // string requires quotes if any of the following is True
-      // information from https://www.iucr.org/resources/cif/spec/version1.1/cifsyntax
-      // * space in string
-      // * any string that starts with any of the following strings
-      //   * _
-      //   * #
-      //   * $
-      //   * '
-      //   * "
-      //   * [
-      //   * ]
-      //   * ;
-      //   * data_ (case insensitive)
-      //   * save_ (case insensitive)
-      // * any string that is equal to any of the following reserved words 
-      //   * loop_ (case insensitive)
-      //   * stop_ (case insensitive)
-      //   * global_ (case insensitive)
-
-      bool is_multiline = false;
-      bool needs_quotes = false;
-
-      // newline in string
-      for(char c: string_value) {
-        if(c == '\n') {
-          is_multiline = true;
-          break;
-        }
+      if(StarWriterValue::HasNewline(string_value)) {
+        value.value_ = "\n;" + string_value + "\n;\n";
       }
-
-      // space in string
-      for(char c: string_value) {
-        if(isspace(c) && c != '\n') {
-          // linebreaks evaluate to true in isspace but do not require quotes
-          needs_quotes = true;
-          break;
-        }
+      else if(StarWriterValue::NeedsQuotes(string_value)) {
+        value.value_ = "\"" + string_value + "\"";
       }
-
-      // any string that starts with any of the special single characters
-      if(!needs_quotes) {
-        switch(string_value[0]) {
-          case '_': {
-            needs_quotes = true;
-            break;
-          }
-          case '#': {
-            needs_quotes = true;
-            break;
-          }
-          case '$': {
-            needs_quotes = true;
-            break;
-          }
-          case '\'': {
-            needs_quotes = true;
-            break;
-          }
-          case '\"': {
-            needs_quotes = true;
-            break;
-          }
-          case '[': {
-            needs_quotes = true;
-            break;
-          }
-          case ']': {
-            needs_quotes = true;
-            break;
-          }
-          case ';': {
-            needs_quotes = true;
-            break;
-          }
-        }
+      else {
+        value.value_ = string_value;
       }
+    }
+    return value;
+  }
 
-      // any string that starts with any of the special multi character thingies
-      if(!needs_quotes && string_value.size() >= 5 && string_value[4] == '_') {
-        // need to do case insensitive checking
-        if((string_value[0] == 'd' || string_value[0] == 'D') &&
-           (string_value[1] == 'a' || string_value[1] == 'A') &&
-           (string_value[2] == 't' || string_value[2] == 'T') &&
-           (string_value[3] == 'a' || string_value[3] == 'A')) {
-            needs_quotes = true;
-        }
-        if((string_value[0] == 's' || string_value[0] == 'S') &&
-           (string_value[1] == 'a' || string_value[1] == 'A') &&
-           (string_value[2] == 'v' || string_value[2] == 'V') &&
-           (string_value[3] == 'e' || string_value[3] == 'E')) {
-            needs_quotes = true;
-        }
+  static bool NeedsQuotes(const String& v) {
+
+    // string requires quotes if any of the following is True
+    // information from https://www.iucr.org/resources/cif/spec/version1.1/cifsyntax
+    // * space in string
+    // * any string that starts with any of the following strings
+    //   * _
+    //   * #
+    //   * $
+    //   * '
+    //   * "
+    //   * [
+    //   * ]
+    //   * ;
+    //   * data_ (case insensitive)
+    //   * save_ (case insensitive)
+    // * any string that is equal to any of the following reserved words 
+    //   * loop_ (case insensitive)
+    //   * stop_ (case insensitive)
+    //   * global_ (case insensitive)
+
+    // space in string
+    for(char c: v) {
+      if(isspace(c) && c != '\n') {
+        // linebreaks evaluate to true in isspace but do not need quotes
+        // they are handled with semi-colons
+        return true;
       }
+    }
 
-      // any string that is exactly one of the reserved words
-      if(!needs_quotes && string_value.size() == 5 && string_value[4] == '_') {
-        // need to do case insensitive checking
-        if((string_value[0] == 'l' || string_value[0] == 'L') &&
-           (string_value[1] == 'o' || string_value[1] == 'O') &&
-           (string_value[2] == 'o' || string_value[2] == 'O') &&
-           (string_value[3] == 'p' || string_value[3] == 'P')) {
-            needs_quotes = true;
-        }
-        if((string_value[0] == 's' || string_value[0] == 'S') &&
-           (string_value[1] == 't' || string_value[1] == 'T') &&
-           (string_value[2] == 'o' || string_value[2] == 'O') &&
-           (string_value[3] == 'p' || string_value[3] == 'P')) {
-            needs_quotes = true;
-        }
+    // any string that starts with any of the special single characters
+    switch(v[0]) {
+      case '_': {
+        return true;
+      }
+      case '#': {
+        return true;
+      }
+      case '$': {
+        return true;
+      }
+      case '\'': {
+        return true;
+      }
+      case '\"': {
+        return true;
       }
+      case '[': {
+        return true;
+      }
+      case ']': {
+        return true;
+      }
+      case ';': {
+        return true;
+      }
+      default: {
+        break;
+      }
+    }
 
-      if(!needs_quotes && string_value.size() == 7 && string_value[6] == '_') {
-        // need to do case insensitive checking
-        if((string_value[0] == 'g' || string_value[0] == 'G') &&
-           (string_value[1] == 'l' || string_value[1] == 'L') &&
-           (string_value[2] == 'o' || string_value[2] == 'O') &&
-           (string_value[3] == 'b' || string_value[3] == 'B') &&
-           (string_value[4] == 'a' || string_value[4] == 'A') &&
-           (string_value[5] == 'l' || string_value[5] == 'L')) {
-            needs_quotes = true;
-        }
+    // any string that starts with any of the special multi character thingies
+    if(v.size() >= 5 && v[4] == '_') {
+      // need to do case insensitive checking
+      if((v[0] == 'd' || v[0] == 'D') &&
+         (v[1] == 'a' || v[1] == 'A') &&
+         (v[2] == 't' || v[2] == 'T') &&
+         (v[3] == 'a' || v[3] == 'A')) {
+          return true;
+      }
+      if((v[0] == 's' || v[0] == 'S') &&
+         (v[1] == 'a' || v[1] == 'A') &&
+         (v[2] == 'v' || v[2] == 'V') &&
+         (v[3] == 'e' || v[3] == 'E')) {
+          return true;
       }
+    }
 
-      if(is_multiline && needs_quotes) {
-        value.value_ = "\n;\"" + string_value + "\"\n;\n";
+    // any string that is exactly one of the reserved words
+    if(v.size() == 5 && v[4] == '_') {
+      // need to do case insensitive checking
+      if((v[0] == 'l' || v[0] == 'L') &&
+         (v[1] == 'o' || v[1] == 'O') &&
+         (v[2] == 'o' || v[2] == 'O') &&
+         (v[3] == 'p' || v[3] == 'P')) {
+          return true;
       }
-      else if(needs_quotes) {
-        value.value_ = "\"" + string_value + "\"";
+      if((v[0] == 's' || v[0] == 'S') &&
+         (v[1] == 't' || v[1] == 'T') &&
+         (v[2] == 'o' || v[2] == 'O') &&
+         (v[3] == 'p' || v[3] == 'P')) {
+          return true;
       }
-      else if(is_multiline) {
-        value.value_ = "\n;" + string_value + "\n;\n";
+    }
+
+    if(v.size() == 7 && v[6] == '_') {
+      // need to do case insensitive checking
+      if((v[0] == 'g' || v[0] == 'G') &&
+         (v[1] == 'l' || v[1] == 'L') &&
+         (v[2] == 'o' || v[2] == 'O') &&
+         (v[3] == 'b' || v[3] == 'B') &&
+         (v[4] == 'a' || v[4] == 'A') &&
+         (v[5] == 'l' || v[5] == 'L')) {
+          return true;
       }
-      else {
-        value.value_ = string_value;
+    }
+    return false;
+  }
+
+  static bool HasNewline(const String& v) {
+    for(char c: v) {
+      if(c == '\n') {
+        return true;
       }
     }
-    return value;
+    return false;
   }
+
   const String& GetValue() const { return value_; }
 private:
   String value_;