Skip to content

Document Markdown publication export - #710

Open
Ujjwals17 wants to merge 2 commits into
JabRef:mainfrom
Ujjwals17:patch-1
Open

Ujjwals17 wants to merge 2 commits into
JabRef:mainfrom
Ujjwals17:patch-1

Conversation

@Ujjwals17

@Ujjwals17 Ujjwals17 commented Oct 27, 2026 •

Copy link
Copy Markdown

Pull Request Description

Summary

This updates en/collaborative-work/export/README.md with instructions for Markdown publication exports, including date ordering, group sections and PDF links. This documentation describes the proposed exporter, whose implementation has not yet merged into JabRef.

Steps to test

  1. Open the preview of en/collaborative-work/export/README.md and check the headings, numbered instructions and lists.
  2. Run the JabRef development build from Ujjwals17/jabref, branch feature/markdown-publication-export.
  3. Follow the documented instructions to export a library using Markdown publications.
  4. Confirm that the output contains up to five recent publications and all exported publications, ordered newest first.
  5. Create a group named Export with subgroups. Confirm that subgroup descriptions become headings, with subgroup names used when descriptions are blank.
  6. Confirm that group sections contain only entries included in the export.
  7. Test online and local PDF attachments. Confirm that usable online links are retained and local links are relative to the exported Markdown file.

Related issues and pull requests

Documents JabRef/jabref#12729

Implementation: JabRef/jabref#17598

AI usage

ChatGPT Plus (GPT-6.1 Sol Light) assisted with reviewing the documentation and PR description.

Checklist

  • I reviewed and take ownership of all content in this PR, including any AI-assisted text
  • I opened JabRef and followed these instructions myself to confirm they still work (tested on version: development build from feature/markdown-publication-export)
  • [/] Any links I added or changed work (no 404s) — no links added or changed
  • [/] Any images or tables I added display correctly — no images or tables added
  • I checked spelling/grammar

@qodo-free-for-open-source-projects

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (0) 📘 Rule violations (0) 📎 Requirement gaps (0)

Grey Divider

Great, no issues found!

Qodo reviewed your code and found no material issues that require review

Grey Divider

Tip of the day
💡 Did you know, you can describe a rule in plain language on the Rules page and Qodo drafts it for you

More tips ↗ | Customize Qodo ↗ | Qodo docs ↗

Grey Divider

Qodo Logo

@qodo-free-for-open-source-projects

Copy link
Copy Markdown

PR Summary by Qodo

Document Markdown publication export

📝 Documentation 🕐 Less than 10 minutes

Grey Divider

AI Description

• Explain how to export a JabRef library as a Markdown publication list.
• Document date ordering, group-based sections, and PDF link behavior.
• Describe proposed exporter behavior; the implementation has not yet merged.
Diagram

graph TD
  A["JabRef library"] --> B["Export selection"] --> C["Markdown publications"] --> D["Publication list"]
  C --> E["Group sections"]
  C --> F["PDF links"]
Loading
High-Level Assessment

Keeping the instructions on the existing export help page is appropriate: readers can find the new format alongside export guidance. A separate page would add navigation for a short, focused topic. Confirm the documented behavior when the implementation merges.

Files changed (1) +43 / -1

Documentation (1) +43 / -1
README.mdAdd Markdown publication export instructions +43/-1

Add Markdown publication export instructions

• Adds steps for exporting all or selected entries and explains the recent and complete lists, publication-date ordering, and entry links. Documents group-derived headings and PDF attachment links, including relative-path requirements for local files.

en/collaborative-work/export/README.md

renovate-bot pushed a commit to renovate-bot/JabRef-_-jabref that referenced this pull request Nov 13, 2026
### Summary

Adds a Markdown publication export format for publishing bibliographies
on Markdown websites. It includes the five most recent publications, the
complete publication list, optional group sections, bibliographic
details, and DOI, URL and portable PDF links.

### Steps to test

1. Run JabRef from this branch and open a library containing more than
five publications.
2. Choose File → Export, select Markdown publications, and save the
Markdown file.
3. Open the exported file in a Markdown preview. Confirm that Recent
publications contains at most five entries and All publications contains
every exported entry, ordered newest first.
4. Check entries with different publication years, months and days.
Entries without usable publication dates should appear last.
5. Create a group named Export and add subgroups containing entries.
Export again. Subgroup descriptions should become section headings, with
subgroup names used when descriptions are blank.
6. Check an entry containing both DOI and URL fields. Its title should
link to the DOI.
7. Check online and local PDF attachments. Online attachments should
retain their links; local attachments should use paths relative to the
exported Markdown file.
8. Move the Markdown file and local PDFs together, preserving their
relative locations, and confirm that the local PDF links still work.

I also verified that a local PDF attachment exports as a relative link
and opens from the Markdown preview, and that an online PDF attachment
retains its URL.

Manual testing on macOS confirmed that the format appears in the export
dialog and produces a rendered publication list containing five recent
entries, all 15 example entries, and the two expected entries under
Journal Publications.

<img width="1019" height="419" alt="Screenshot 2026-10-27 at 8 36 14 PM"
src="https://github.com/user-attachments/assets/6e811c24-64ec-4e52-a58b-db2ed20b9f17"
/>
<img width="1001" height="422" alt="Screenshot 2026-10-27 at 8 36 32 PM"
src="https://github.com/user-attachments/assets/eeb206e6-474b-4abe-be20-29f1724a4c0c"
/>


### Related issues and pull requests

Closes JabRef#12729

Documentation: JabRef/user-documentation#710

### AI usage

ChatGPT Plus (GPT-6.1 Sol Light) assisted with code, tests, debugging
and written material for this contribution. A group member reviewed
successive versions of the patch.

<details>
<summary>AI CHECKLIST.md walkthrough</summary>

# Code checklist

## 1. Code self-review

### Nullability and control flow

- [x] No `== null` / `!= null` checks — JSpecify annotations
(`@NullMarked`, `@Nullable`, `@NonNull`) used instead.
- [x] No `Objects.requireNonNull(...)` — nullability expressed via
JSpecify annotations.
- [x] New classes annotated with `@NullMarked`
(`org.jspecify.annotations.NullMarked`).
- [/] New packages annotated with `@NullMarked`
(`org.jspecify.annotations.NullMarked`). No new Java packages.
- [x] `Optional` consumed with `ifPresent` / `ifPresentOrElse` / `map` /
`orElseThrow` — never `orElse(unusedValue)` nor an `isPresent()` +
`get()` block.
- [/] `StringUtil.isBlank(...)` used instead of `s == null ||
s.isBlank()`. No combined null/blank checks.

### Exceptions

- [x] No `catch (Exception e)` — only specific exceptions are caught.
- [x] No `throw new RuntimeException(...)` /
`IllegalStateException(...)` — these tear down the whole application.
- [/] Logged exceptions are passed as the **last** logger argument
(`LOGGER.info("...", e)`), not concatenated into the message string. No
exception logging added.

### Style and idioms

- [x] New `BibEntry` objects built with withers (`withField`, not
`setField`).
- [x] Modern Java used: `List.of()` / `Map.of()` / `Set.of()`,
`Path.of()`, `SequencedCollection` / `SequencedSet`, text blocks.
- [/] Regexes use a precompiled `Pattern.compile(...)` constant, not
`String.matches(...)`. No Java regex calls added; layout expressions use
the existing formatter mechanism.
- [/] Keep alphabetical ordering when adding variables or enum items. No
existing ordered variable or enum lists were extended.
- [/] Background work uses `org.jabref.logic.util.BackgroundTask`, not
`new Thread()`. No background tasks added.
- [x] No commented-out code, no trivial comments restating the code, no
AI-disclosure comments in source.
- [/] Markdown Javadoc (`///`) uses Markdown syntax, not JavaDoc inline
tags: `code` instead of `{@code}`, `[ClassName]` instead of `{@link}`.
No Javadoc added.

### User-facing text

- [x] All user-facing text localized (`Localization.lang` in Java, `%`
prefix in FXML).
- [x] Sentence case (not Title Case); no trailing `!`; labels do not end
with `:`.
- [/] Variance expressed with placeholders (`"...: %0"`), not string
concatenation. No variable UI messages added.

### Security

- [/] User-controlled data (request params, entry fields, file contents)
is HTML-escaped before being written into any `text/html` response —
including exception/error messages, not just the success body (XSS).
This change produces Markdown files, not HTML responses.

### Tests

- [/] In case issue lists an example, this concrete example is covered
by a test case. The issue links an illustrative website rather than a
reproducible fixture; its derived requirements are covered by exporter
tests.
- [x] Behavior changes in `org.jabref.model` / `org.jabref.logic` have
added or updated tests.
- [x] Tests assert object contents (`assertEquals`), use plain JUnit
asserts (not AssertJ), have no `@DisplayName`, do not catch exceptions
(let them propagate so JUnit reports setup/teardown failures directly),
and use `@TempDir` instead of manual temp directories.
- [/] Fetcher tests hit the live endpoints — the remote API is not
mocked or stubbed (automated-review suggestions to mock it are rejected
on purpose). No fetcher changes.

## 2. Verification commands

- [x] `./gradlew :jablib:check` (or `./gradlew check` for all modules).
- [x] `./gradlew checkstyleMain checkstyleTest checkstyleJmh`.
- [x] `./gradlew modernizer`.
- [x] `./gradlew --no-configuration-cache :rewriteDryRun` reports no
changes (run `./gradlew rewriteRun` to fix).
- [x] `./gradlew javadoc`.
- [x] `npx markdownlint-cli2 "docs/**/*.md" "*.md"` (only if Markdown
changed).
- [x] `npm ci && npm run textlint` reports no misspellings (only if
Markdown changed).
- [/] Only if formatting is still off after `rewriteRun`: `docker run -v
$(pwd):/github/workspace ghcr.io/leventebajczi/intellij-format:master
"*.java" "" ".idea/codeStyles/Project.xml"`.

After the final convention fixes, the exporter test suite, OpenRewrite
dry run, and jablib main/test Checkstyle checks passed again.

## 3. Documentation

- [x] `CHANGELOG.md` entry added if the change is visible to the user
(end-user wording, no extra blank lines, sorted in next to existing
entries about the same component/feature). Link the issue if one exists;
link the PR only when no issue exists. Use `TODO` as the placeholder
when neither is known yet — never a fake number. No entry for fixes to
changes that were themselves introduced after the last release (feature
only in `## [Unreleased]`) — update the existing unreleased entry
instead if needed.
- [x] Searched [jabref/issues](https://github.com/JabRef/jabref/issues)
and
[jabref-koppor/issues](https://github.com/JabRef/jabref-koppor/issues)
for a related issue; linked only on a confident match, otherwise kept
`TODO` (no `closes`/`fixes` for merely-similar issues).

Searched both repositories for `is:issue markdown export`.
JabRef#12729 is the direct match; no additional issues are
claimed as fixed.

- [x] Requirement added to `docs/requirements/<area>.md` if the change
is a new feature or significant bug fix (skip for refactors, minor
fixes, and internal changes).
- [x] Developer documentation under `docs/` updated if behavior or
architecture changed.

The new export behavior is documented in `docs/requirements/export.md`,
covering publication ordering, group sections and portable links, with
references to the implementation and tests.

Requirements and implementation/test references are present. User
documentation submitted:
JabRef/user-documentation#710

## 4. Pull request

- [x] PR body built from `.github/PULL_REQUEST_TEMPLATE.md`, every
section filled.
- [x] All checklist items kept and marked `[x]`, `[ ]`, or `[/]`.
- [x] "Steps to test" is a numbered list with a cropped screenshot of
the result for every visible change; no video (only allowed when another
program is involved, e.g. drag and drop or push to an external
application).
- [x] All HTML comments removed from the PR body.
- [ ] PR created with `gh pr create --body-file <file>` (not `--body`).
- [/] If `CHANGELOG.md` used a `TODO` placeholder (no issue confidently
identified yet — an existing issue link always stays), the PR was opened
as draft, the placeholder was replaced with the real PR-number link
after PR creation, committed and pushed, and only then was the PR marked
ready for review. If an issue is identified or created later, the link
is switched to the issue.

The PR is currently being prepared through GitHub's browser interface.
CLI creation has not been performed.

</details>

### Validation

The following checks passed during development:

- `./gradlew :jablib:check`
- `./gradlew checkstyleMain checkstyleTest checkstyleJmh`
- `./gradlew modernizer`
- `./gradlew --no-configuration-cache :rewriteDryRun`
- `./gradlew javadoc`
- `npx markdownlint-cli2 "docs/**/*.md" "*.md"`
- `npm ci && npm run textlint`
- Requirement traceability validation

After the latest code-convention changes, the
MarkdownPublicationExporterTest suite, OpenRewrite dry run, and jablib
main/test Checkstyle checks passed again.

### Checklist

- [x] I own the copyright of the code submitted and I license it under
the [MIT license](https://github.com/JabRef/jabref/blob/main/LICENSE)
- [x] If AI tools were used, I disclosed them in the "AI usage" section
and reviewed, understood, and take full ownership of all AI-generated
code
- [x] I manually tested my changes in running JabRef (always required)
- [x] I added JUnit tests for changes (if applicable)
- [x] I added screenshots in the PR description (if change is visible to
the user)
- [x] I added **one sentence (max 20 words)** to `CHANGELOG.md`
describing the change from the user's point of view (if the change is
visible to the user)
- [x] I checked the [user documentation](https://docs.jabref.org/) for
up to dateness and submitted a pull request to our [user documentation
repository](https://github.com/JabRef/user-documentation/tree/main/en)

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Siedlerchr <siedlerkiller@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant