+ /**
+ * Describe a {@link Story} from its {@link MetaData} and return a list of
+ * title/value that represent this {@link Story}.
+ *
+ * @param meta
+ * the {@link MetaData} to represent
+ *
+ * @return the information
+ */
+ public static List<Entry<String, String>> getMetaDesc(MetaData meta) {
+ List<Entry<String, String>> metaDesc = new ArrayList<Entry<String, String>>();
+
+ // TODO: i18n
+
+ StringBuilder tags = new StringBuilder();
+ for (String tag : meta.getTags()) {
+ if (tags.length() > 0) {
+ tags.append(", ");
+ }
+ tags.append(tag);
+ }
+
+ metaDesc.add(new SimpleEntry<String, String>("Author", meta.getAuthor()));
+ metaDesc.add(new SimpleEntry<String, String>("Publication date",
+ formatDate(meta.getDate())));
+ metaDesc.add(new SimpleEntry<String, String>("Published on", meta
+ .getPublisher()));
+ metaDesc.add(new SimpleEntry<String, String>("URL", meta.getUrl()));
+ metaDesc.add(new SimpleEntry<String, String>("Word count", format(meta
+ .getWords())));
+ metaDesc.add(new SimpleEntry<String, String>("Source", meta.getSource()));
+ metaDesc.add(new SimpleEntry<String, String>("Subject", meta
+ .getSubject()));
+ metaDesc.add(new SimpleEntry<String, String>("Language", meta.getLang()));
+ metaDesc.add(new SimpleEntry<String, String>("Tags", tags.toString()));
+
+ return metaDesc;
+ }
+
+ /**
+ * Open the {@link Story} with an external reader (the program will be
+ * passed the main file associated with this {@link Story}).
+ *
+ * @param lib
+ * the {@link BasicLibrary} to select the {@link Story} from
+ * @param luid
+ * the {@link Story} LUID
+ * @param sync
+ * execute the process synchronously (wait until it is terminated
+ * before returning)
+ *
+ * @throws IOException
+ * in case of I/O error
+ */
+ @Override
+ public void openExternal(BasicLibrary lib, String luid, boolean sync)
+ throws IOException {