                 (not (string/blank? recommendation)) (assoc :recommendation recommendation))
         path-to-numbers (layout/path-to-number items)]
     (string/join
-     "\n\n"
+     double-newline
      (concat
       [title
        (format "%s-%s" year issue)


(defn wrap-line [text]
  ;; see http://rosettacode.org/wiki/Word_wrap#Clojure
  (string/join "\n" (re-seq (re-pattern (str ".{1," line-length "}(?:\\s|\\z)")) text)))

(defn- entry-heading-str
  [{:keys [creator title subtitles name-of-part source-publisher source-date]}]

(defn- level-str [items path path-to-numbers]
  (str
   (when-let [section-title (last path)]
     (format "%s%s%s"
             (layout/section-numbers (get path-to-numbers path))
             (layout/translations section-title "FIXME")
             double-newline))
   (cond
     ;; handle the special case where the editorial or the recommendations are passed in the tree
     (#{:editorial :recommendation} (last path)) (md-to-text items)
     ;; handle a list of entries
     (sequential? items) (string/join double-newline (map entry-str items))
     :else (string/join double-newline (map #(level-str (get items %) (conj path %) path-to-numbers) (keys items))))))

(defn- standard-catalog?
  "If `items` is a map, i.e. are grouped by genre, then we assume that
