Skip to content

Commit 764d106

Browse files
committed
Add support for custom increment (defaults to 10)
1 parent 2248758 commit 764d106

File tree

7 files changed

+97
-20
lines changed

7 files changed

+97
-20
lines changed

lib/commands/add.js

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@ import fs from 'node:fs/promises';
22
import path from 'node:path';
33
import { globby } from 'globby';
44
import { deburr, kebabCase } from 'lodash-es';
5-
import { ascii } from '../utils.js';
5+
import { ascii, printAutoRevealMessage, toNearest } from '../utils.js';
66

77
const DIGITS = 3;
8+
export const DEFAULT_INCREMENT = 10;
89

910
const filenameTemplate = (number, digits, title) =>
1011
`${number.toString().padStart(digits, '0')}${
@@ -17,7 +18,10 @@ const slideTemplate = (title) =>
1718
This note is only visible to the presenter.
1819
`;
1920

20-
export async function nextSlideNumber() {
21+
const createMessageTemplate = (filename) => `Created ./slides/${filename}
22+
Hint: Create a vertical slide by adding "---" to that file.`;
23+
24+
export async function nextSlideNumber(increment = DEFAULT_INCREMENT) {
2125
const slides = await globby('slides/*.md');
2226

2327
if (slides.length === 0) {
@@ -26,15 +30,20 @@ export async function nextSlideNumber() {
2630

2731
const lastSlide = slides.at(-1);
2832
const lastSlideName = path.basename(lastSlide);
33+
const lastSlideNumber = Number.parseInt(lastSlideName, 10);
2934

30-
return Number.parseInt(lastSlideName, 10) + 1;
35+
return toNearest(lastSlideNumber, increment) + Number.parseInt(increment, 10);
3136
}
3237

3338
export async function writeNewSlide(
3439
title,
35-
{ writeTitleToFileName = true, cwd = process.cwd() } = {},
40+
{
41+
writeTitleToFileName = true,
42+
cwd = process.cwd(),
43+
increment = DEFAULT_INCREMENT,
44+
} = {},
3645
) {
37-
const number = await nextSlideNumber();
46+
const number = await nextSlideNumber(increment);
3847
const filename = filenameTemplate(
3948
number,
4049
DIGITS,
@@ -46,15 +55,14 @@ export async function writeNewSlide(
4655
return { filename };
4756
}
4857

49-
export async function add(title, { increment = 1 } = {}) {
58+
export async function add(title, { increment = DEFAULT_INCREMENT } = {}) {
5059
const { filename } = await writeNewSlide(
5160
title ? title.join(' ') : undefined,
5261
{
62+
increment,
5363
cwd: path.join(process.cwd(), 'slides'),
5464
},
5565
);
5666

57-
console.log(
58-
`auto-reveal\n\n Created ./slides/${filename}\n Create a vertical slide by adding "---" to that file.`,
59-
);
67+
printAutoRevealMessage(createMessageTemplate(filename));
6068
}

lib/commands/create.js

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,17 @@ import fs from 'node:fs/promises';
22
import path from 'node:path';
33
import { deburr, kebabCase } from 'lodash-es';
44
import { mkdirp } from 'mkdirp';
5-
import { ascii } from '../utils.js';
5+
import { ascii, printAutoRevealMessage } from '../utils.js';
66
import { writeNewSlide } from './add.js';
77

8+
const createMessageTemplate = (
9+
targetDirectory,
10+
) => `Setting up your presentation in
11+
${targetDirectory}
12+
13+
Hint: Create new slides by running "auto-reveal add".
14+
Hint: Create new vertical slides by adding "---" inside your slide markdown file.`;
15+
816
export async function create(target, { name }) {
917
const targetDirectory = target ? path.resolve(target) : process.cwd();
1018

@@ -14,9 +22,7 @@ export async function create(target, { name }) {
1422
await mkdirp(targetDirectory);
1523
}
1624

17-
console.log(
18-
`\nauto-reveal\n\n Setting up your presentation in \n ${targetDirectory}\n\n Hint: Create new slides by running "auto-reveal add". \n Hint: Create new vertical slides by adding "---" inside your slide markdown file.\n`,
19-
);
25+
printAutoRevealMessage(createMessageTemplate(targetDirectory));
2026

2127
await mkdirp(path.join(targetDirectory, 'slides'));
2228
await mkdirp(path.join(targetDirectory, 'public'));

lib/program.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Command } from 'commander';
22

3-
import { add } from './commands/add.js';
3+
import { DEFAULT_INCREMENT, add } from './commands/add.js';
44
import { build } from './commands/build.js';
55
import { create } from './commands/create.js';
66
import { start } from './commands/start.js';
@@ -39,6 +39,11 @@ program
3939
.alias('slide')
4040
.description('Add a new slide to your presentation.')
4141
.argument('[title...]', 'Title of the slide')
42+
.option(
43+
'-i, --increment <increment>',
44+
'Increment of the slide prefix',
45+
DEFAULT_INCREMENT,
46+
)
4247
.action(add);
4348

4449
program

lib/utils.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,14 @@ export function ascii(str) {
2424
return str.replace(/[^\x20-\x7E]/g, '');
2525
}
2626

27+
export const toNearest = (number, base = 10) => Math.ceil(number / base) * base;
28+
29+
export function printAutoRevealMessage(message = '') {
30+
console.log(
31+
`\nauto-reveal\n\n${message.trim().replace(/^(?!\s*$)/gm, ' ')}\n`,
32+
);
33+
}
34+
2735
const { getTheme, getThemePackage, getRevealJsTheme, readJsonSync } = utils;
2836

2937
export { getTheme, getThemePackage, getRevealJsTheme, readJsonSync };

tests/commands/add.test.js

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ describe('add command tests', () => {
1919
const fixtures = fixturify.readSync(cwd);
2020

2121
expect(result.stdout).toStrictEqual(
22-
'auto-reveal\n\n Created ./slides/000.md\n Create a vertical slide by adding "---" to that file.',
22+
'\nauto-reveal\n\n Created ./slides/000.md\n Hint: Create a vertical slide by adding "---" to that file.\n',
2323
);
2424
expect(result.exitCode).to.equal(0);
2525
expect(fixtures).toStrictEqual({
@@ -45,13 +45,50 @@ describe('add command tests', () => {
4545
const fixtures = fixturify.readSync(cwd);
4646

4747
expect(result.stdout).toStrictEqual(
48-
'auto-reveal\n\n Created ./slides/001.md\n Create a vertical slide by adding "---" to that file.',
48+
'\nauto-reveal\n\n Created ./slides/010.md\n Hint: Create a vertical slide by adding "---" to that file.\n',
4949
);
5050
expect(result.exitCode).to.equal(0);
5151
expect(fixtures).toStrictEqual({
5252
slides: {
5353
'000.md': '# Slide 1',
54-
'001.md': 'Note:\n\nThis note is only visible to the presenter.\n',
54+
'010.md': 'Note:\n\nThis note is only visible to the presenter.\n',
55+
},
56+
});
57+
});
58+
59+
it('adds a new slide with a custom increment', async () => {
60+
const { cwd } = await makeFolder({
61+
files: {
62+
slides: {
63+
'003.md': '# Slide 1',
64+
},
65+
},
66+
});
67+
68+
const result1 = await execa({
69+
cwd,
70+
})`${process.cwd()}/bin/auto-reveal add -i 5`;
71+
72+
expect(result1.stdout).toStrictEqual(
73+
'\nauto-reveal\n\n Created ./slides/010.md\n Hint: Create a vertical slide by adding "---" to that file.\n',
74+
);
75+
expect(result1.exitCode).to.equal(0);
76+
77+
const result2 = await execa({
78+
cwd,
79+
})`${process.cwd()}/bin/auto-reveal add -i 5`;
80+
81+
expect(result2.stdout).toStrictEqual(
82+
'\nauto-reveal\n\n Created ./slides/015.md\n Hint: Create a vertical slide by adding "---" to that file.\n',
83+
);
84+
expect(result2.exitCode).to.equal(0);
85+
86+
const fixtures = fixturify.readSync(cwd);
87+
expect(fixtures).toStrictEqual({
88+
slides: {
89+
'003.md': '# Slide 1',
90+
'010.md': 'Note:\n\nThis note is only visible to the presenter.\n',
91+
'015.md': 'Note:\n\nThis note is only visible to the presenter.\n',
5592
},
5693
});
5794
});
@@ -72,13 +109,13 @@ describe('add command tests', () => {
72109
const fixtures = fixturify.readSync(cwd);
73110

74111
expect(result.stdout).toStrictEqual(
75-
'auto-reveal\n\n Created ./slides/001-hallole.md\n Create a vertical slide by adding "---" to that file.',
112+
'\nauto-reveal\n\n Created ./slides/010-hallole.md\n Hint: Create a vertical slide by adding "---" to that file.\n',
76113
);
77114
expect(result.exitCode).to.equal(0);
78115
expect(fixtures).toStrictEqual({
79116
slides: {
80117
'000.md': '# Slide 1',
81-
'001-hallole.md':
118+
'010-hallole.md':
82119
'# 👋 Hallöle\n\nNote:\n\nThis note is only visible to the presenter.\n',
83120
},
84121
});

tests/commands/create.test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ describe('create command tests', () => {
1717

1818
expect(result.exitCode).to.equal(0);
1919
expect(result.stdout).toStrictEqual(
20-
`\nauto-reveal\n\n Setting up your presentation in \n ${cwd}\n\n Hint: Create new slides by running "auto-reveal add". \n Hint: Create new vertical slides by adding "---" inside your slide markdown file.\n`,
20+
`\nauto-reveal\n\n Setting up your presentation in\n ${cwd}\n\n Hint: Create new slides by running "auto-reveal add".\n Hint: Create new vertical slides by adding "---" inside your slide markdown file.\n`,
2121
);
2222
expect(fixtures).toStrictEqual({
2323
public: {},

tests/utils.test.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { describe, expect, test } from 'vitest';
2+
import { toNearest } from '../lib/utils';
3+
4+
describe('Utils', () => {
5+
test('toNearest', async () => {
6+
expect(toNearest(3, 5)).toBe(5);
7+
expect(toNearest(7, 10)).toBe(10);
8+
expect(toNearest(15, 15)).toBe(15);
9+
expect(toNearest(10, 20)).toBe(20);
10+
expect(toNearest(10, 5)).toBe(10);
11+
expect(toNearest(0, 10)).toBe(0);
12+
});
13+
});

0 commit comments

Comments
 (0)