diff --git a/backend/src/Core/MathComps.TexParser/Images/ImageProcessingConfig.cs b/backend/src/Core/MathComps.TexParser/Images/ImageProcessingConfig.cs
index 4d7d9809..6f0764ce 100644
--- a/backend/src/Core/MathComps.TexParser/Images/ImageProcessingConfig.cs
+++ b/backend/src/Core/MathComps.TexParser/Images/ImageProcessingConfig.cs
@@ -4,12 +4,12 @@ namespace MathComps.TexParser.Images;
/// Configuration for that specifies how to resolve, name, and store images.
///
/// Function that resolves a TeX image ID to an absolute source file path. Returns null if not found.
-/// Prefix for generated image file names (e.g., "algebra-1-rozklady" or "50-a-i-1").
+/// Function producing the output file name for a discovered image. Receives the TeX image ID and the running counter (1-based, advances per unique image).
/// Delegate that persists a discovered image. Receives the source file path and the destination file name.
/// Optional callback invoked when an image source cannot be resolved. Receives the TeX image ID.
public record ImageProcessingConfig(
Func ImageSourceResolver,
- string FileNamePrefix,
+ Func OutputFileName,
Action PersistImage,
Action? OnMissingImage = null
);
diff --git a/backend/src/Core/MathComps.TexParser/Images/TexImageProcessor.cs b/backend/src/Core/MathComps.TexParser/Images/TexImageProcessor.cs
index c30a21b3..41ebd6d9 100644
--- a/backend/src/Core/MathComps.TexParser/Images/TexImageProcessor.cs
+++ b/backend/src/Core/MathComps.TexParser/Images/TexImageProcessor.cs
@@ -88,8 +88,8 @@ ImageProcessingConfig config
return new(image with { Id = existingContentId }, state);
}
- // Build a deterministic file name for stable URLs.
- var newFileName = $"{config.FileNamePrefix}-{state.Counter}.svg";
+ // Build a file name for using the caller's strategy.
+ var newFileName = config.OutputFileName(image.Id, state.Counter);
// Persist the image using the configured strategy (local copy, R2 upload, etc.)
config.PersistImage(sourcePath, newFileName);
diff --git a/backend/src/Infrastructure/MathComps.Infrastructure/Storage/IFileUploader.cs b/backend/src/Infrastructure/MathComps.Infrastructure/Storage/IFileUploader.cs
index 769e3b79..ba795f3c 100644
--- a/backend/src/Infrastructure/MathComps.Infrastructure/Storage/IFileUploader.cs
+++ b/backend/src/Infrastructure/MathComps.Infrastructure/Storage/IFileUploader.cs
@@ -9,7 +9,7 @@ public interface IFileUploader
/// Uploads a local file to remote storage at the specified key.
///
/// Absolute path to the local file to upload.
- /// The storage key (e.g., "handouts/pdfs/factorization.sk.pdf").
+ /// The storage key (e.g., "handouts/factorization/factorization.sk.pdf").
/// A task representing the asynchronous upload operation.
Task UploadAsync(string localFilePath, string key);
}
diff --git a/backend/src/Tools/MathComps.Cli.DatabaseSeeder/DatabaseSeeder.cs b/backend/src/Tools/MathComps.Cli.DatabaseSeeder/DatabaseSeeder.cs
index b1aabe7d..ca1d167f 100644
--- a/backend/src/Tools/MathComps.Cli.DatabaseSeeder/DatabaseSeeder.cs
+++ b/backend/src/Tools/MathComps.Cli.DatabaseSeeder/DatabaseSeeder.cs
@@ -247,7 +247,7 @@ await ProgressHelper.ExecuteWithProgressAsync(
// Configure image processing for this problem
var imageConfig = new ImageProcessingConfig(
ImageSourceResolver: imageId => SkmoImageHelper.FindImageSourcePath(imageId, parsedProblem.RawProblem.OlympiadYear),
- FileNamePrefix: problemSlug,
+ OutputFileName: (_, counter) => $"{problemSlug}-{counter}.svg",
PersistImage: (sourcePath, destinationFileName) =>
{
// Ensure the output directory exists
diff --git a/backend/src/Tools/MathComps.Cli.Handouts/BuildCommand.cs b/backend/src/Tools/MathComps.Cli.Handouts/BuildCommand.cs
index 33365324..061596d7 100644
--- a/backend/src/Tools/MathComps.Cli.Handouts/BuildCommand.cs
+++ b/backend/src/Tools/MathComps.Cli.Handouts/BuildCommand.cs
@@ -82,6 +82,30 @@ private record PendingUpload(string SourcePath, string R2Key);
/// All image metadata discovered during processing.
private record HandoutImageResult(Document ProcessedDocument, ImmutableList DiscoveredImages);
+ ///
+ /// The R2 prefix under which every handout artefact (PDFs, images) lives.
+ ///
+ private const string HandoutsR2Prefix = "handouts";
+
+ ///
+ /// Derives the language-stripped handout slug from a .tex filename. Handles both
+ /// main handouts (e.g. "factorization.cs.tex" -> "factorization") and their
+ /// skeleton variants (e.g. "factorization.cs-skeleton.tex" -> "factorization").
+ ///
+ /// The .tex filename (with extension).
+ /// The language-stripped handout slug.
+ private static string ToHandoutSlug(string texFileName)
+ => Regex.Replace(texFileName, @"\.([a-z]{2})(-skeleton)?\.tex$", "", RegexOptions.IgnoreCase);
+
+ ///
+ /// Builds the full R2 key for a handout asset by prefixing its slug-relative path
+ /// with . Centralises the prefix so PDF and image
+ /// upload paths stay in sync.
+ ///
+ /// The slug-prefixed asset path (e.g. "factorization/box.svg").
+ /// The full R2 key (e.g. "handouts/factorization/box.svg").
+ private static string ToHandoutR2Key(string slugRelativeKey) => $"{HandoutsR2Prefix}/{slugRelativeKey}";
+
///
public override async Task ExecuteAsync(CommandContext context, Settings settings)
{
@@ -205,10 +229,10 @@ public override async Task ExecuteAsync(CommandContext context, Settings se
await uploader.UploadAsync(upload.SourcePath, upload.R2Key);
// Upload PDFs
- await UploadPdfToR2Async(inputFile, inputDirectory, uploader);
+ await UploadHandoutPdfAsync(inputFile, inputDirectory, uploader);
// Upload the skeleton PDF
- await UploadPdfToR2Async(skeletonFile, inputDirectory, uploader);
+ await UploadHandoutPdfAsync(skeletonFile, inputDirectory, uploader);
}
}
catch (Exception exception)
@@ -427,13 +451,14 @@ private static void CompileTexFile(
}
///
- /// Uploads a compiled PDF from the source directory to Cloudflare R2.
+ /// Uploads a compiled handout PDF (main or skeleton) to remote storage, nesting it
+ /// under the handout's slug folder so every artefact for one handout sits together.
///
/// The .tex file whose corresponding PDF should be uploaded.
/// The directory containing the compiled PDFs.
/// The file uploader instance.
/// A task representing the asynchronous upload operation.
- private static async Task UploadPdfToR2Async(FileInfo texFile, DirectoryInfo sourceDirectory, IFileUploader fileUploader)
+ private static async Task UploadHandoutPdfAsync(FileInfo texFile, DirectoryInfo sourceDirectory, IFileUploader fileUploader)
{
// Determine the PDF filename from the TeX filename
var pdfFileName = Path.ChangeExtension(texFile.Name, ".pdf");
@@ -446,8 +471,8 @@ private static async Task UploadPdfToR2Async(FileInfo texFile, DirectoryInfo sou
return;
}
- // Upload the PDF to R2 under the handouts/pdfs/ prefix
- var r2Key = $"handouts/pdfs/{pdfFileName}";
+ // Build the R2 key so every artefact for one handout lands in the same folder
+ var r2Key = ToHandoutR2Key($"{ToHandoutSlug(texFile.Name)}/{pdfFileName}");
await fileUploader.UploadAsync(sourcePdfPath, r2Key);
AnsiConsole.MarkupLine($" [green]✓ PDF uploaded:[/] {Markup.Escape(pdfFileName)}");
}
@@ -457,27 +482,32 @@ private static async Task UploadPdfToR2Async(FileInfo texFile, DirectoryInfo sou
/// Discovered images are queued for async upload after processing completes.
///
/// The parsed .
- /// The source .tex file name (e.g., "algebra-1-rozklady-sk.tex").
+ /// The source .tex file name (e.g., "factorization.cs.tex").
/// List to collect image uploads for async execution. Null when uploads are skipped.
/// An containing the processed document and discovered images.
private static HandoutImageResult ProcessHandoutImages(Document document, string sourceFileName, List? pendingUploads)
{
- // Extract the handout identifier from the filename (e.g., "algebra-1-rozklady-sk.tex" -> "algebra-1-rozklady-sk")
- var handoutId = Path.GetFileNameWithoutExtension(sourceFileName);
+ // Language-stripped handout slug shared by every language variant of this handout.
+ var handoutSlug = ToHandoutSlug(sourceFileName);
// Source directory for handout images
var handoutsDirectory = "../../../../data/handouts/Images";
+ // In .tex sources images are referenced as ".pdf" because pdfcsplain embeds
+ // PDFs. The web frontend wants SVGs, which sit alongside the PDFs on disk
+ // This swaps the extension so callers can read it as "the SVG counterpart of ".
+ static string ToSvgName(string pdfImageId) => $"{pdfImageId.RemoveEnd(".pdf")}.svg";
+
// Configure the image processor for this handout
var config = new ImageProcessingConfig(
- ImageSourceResolver: imageId => Path.Combine(handoutsDirectory, $"{imageId.RemoveEnd(".pdf")}.svg"),
- FileNamePrefix: handoutId,
- PersistImage: (sourcePath, destinationFileName) =>
+ ImageSourceResolver: imageId => Path.Combine(handoutsDirectory, ToSvgName(imageId)),
+ OutputFileName: (imageId, _) => $"{handoutSlug}/{ToSvgName(imageId)}",
+ PersistImage: (sourcePath, contentId) =>
{
// Queue the image upload for async execution after processing completes
- pendingUploads?.Add(new PendingUpload(sourcePath, $"handouts/images/{destinationFileName}"));
+ pendingUploads?.Add(new PendingUpload(sourcePath, ToHandoutR2Key(contentId)));
},
- OnMissingImage: imageId => AnsiConsole.MarkupLine($"[yellow]Warning:[/] Handout [yellow]{handoutId}[/] has a missing image: {imageId}")
+ OnMissingImage: imageId => AnsiConsole.MarkupLine($"[yellow]Warning:[/] Handout [yellow]{handoutSlug}[/] has a missing image: {imageId}")
);
// Collect all discovered images from all sections
diff --git a/backend/src/Tools/MathComps.Cli.Handouts/README.md b/backend/src/Tools/MathComps.Cli.Handouts/README.md
index 698db218..57037750 100644
--- a/backend/src/Tools/MathComps.Cli.Handouts/README.md
+++ b/backend/src/Tools/MathComps.Cli.Handouts/README.md
@@ -9,8 +9,8 @@ For each matched `.tex` file, the tool runs these steps in order:
1. **Generate skeleton** — strips solutions/proofs/hints, produces a `-skeleton.tex` worksheet
2. **Compile TeX** — runs the configured compiler (2 passes) on both main + skeleton files
3. **Parse to JSON** — converts the TeX document structure into `RawContentBlock[]` JSON (saved locally to `web/src/content/handouts/`)
-4. **Upload images** — processes SVG images and uploads them to R2 (`handouts/images/`)
-5. **Upload PDFs** — uploads compiled PDFs to R2 (`handouts/pdfs/`)
+4. **Upload images** — processes SVG images and uploads them to R2 under `handouts//.svg`, where `` is the language-stripped handout id (so all language variants share one image set)
+5. **Upload PDFs** — uploads compiled main + skeleton PDFs to R2 under `handouts//.pdf` (same folder as the images)
## Prerequisites
diff --git a/web/src/components/features/problems/services/problem-api-urls.ts b/web/src/components/features/problems/services/problem-api-urls.ts
index 212a8ddf..9211952d 100644
--- a/web/src/components/features/problems/services/problem-api-urls.ts
+++ b/web/src/components/features/problems/services/problem-api-urls.ts
@@ -17,21 +17,24 @@ export type ImageType = 'problems' | 'handouts'
export function getProblemImageUrl(contentId: string, type: ImageType): string {
switch (type) {
case 'handouts':
- return `${getR2BaseUrl()}/handouts/images/${contentId}`
+ return `${getR2BaseUrl()}/handouts/${contentId}`
case 'problems':
return `${getApiBaseUrl()}/images/${type}/${contentId}`
}
}
/**
- * Builds a public URL to a handout PDF by its filename.
- * PDFs are served from Cloudflare R2.
+ * Builds a public URL to a handout PDF by its filename. The handout's
+ * language-stripped slug is derived from the filename — both `..pdf`
+ * and `.-skeleton.pdf` collapse to the same slug so every artefact
+ * lives in one folder on R2.
*
* @param filename - The PDF filename (e.g., "factorization.sk.pdf")
* @returns The public URL to the PDF on R2
*/
export function getHandoutPdfUrl(filename: string): string {
- return `${getR2BaseUrl()}/handouts/pdfs/${filename}`
+ const slug = filename.replace(/\.[a-z]{2}(-skeleton)?\.pdf$/i, '')
+ return `${getR2BaseUrl()}/handouts/${slug}/${filename}`
}
/**
diff --git a/web/src/components/shared/utils/__tests__/media-utils.test.ts b/web/src/components/shared/utils/__tests__/media-utils.test.ts
index 14b94726..9ba235e0 100644
--- a/web/src/components/shared/utils/__tests__/media-utils.test.ts
+++ b/web/src/components/shared/utils/__tests__/media-utils.test.ts
@@ -133,13 +133,13 @@ describe('resolveMarkdownImageUrl', () => {
// Handouts use a different host than problems but the same contentId shape
it('routes a bare contentId to the R2 handouts endpoint', () => {
expect(resolveMarkdownImageUrl('media:fig-7', 'handouts')).toBe(
- 'https://r2.example.test/handouts/images/fig-7'
+ 'https://r2.example.test/handouts/fig-7'
)
})
it('preserves a trailing query string after resolution', () => {
expect(resolveMarkdownImageUrl('media:fig-7?width=400&height=300', 'handouts')).toBe(
- 'https://r2.example.test/handouts/images/fig-7?width=400&height=300'
+ 'https://r2.example.test/handouts/fig-7?width=400&height=300'
)
})
})
diff --git a/web/src/content/handouts/angle-basics-1.cs.json b/web/src/content/handouts/angle-basics-1.cs.json
index e7131eab..8b645f72 100644
--- a/web/src/content/handouts/angle-basics-1.cs.json
+++ b/web/src/content/handouts/angle-basics-1.cs.json
@@ -141,7 +141,7 @@
},
{
"type": "image",
- "id": "angle-basics-1.cs-1.svg",
+ "id": "angle-basics-1/angles-vertical.svg",
"scale": 1.0,
"isInline": false
}
@@ -159,7 +159,7 @@
},
{
"type": "image",
- "id": "angle-basics-1.cs-2.svg",
+ "id": "angle-basics-1/angles-corresponding.svg",
"scale": 1.0,
"isInline": false
}
@@ -177,7 +177,7 @@
},
{
"type": "image",
- "id": "angle-basics-1.cs-3.svg",
+ "id": "angle-basics-1/angles-alternate.svg",
"scale": 1.0,
"isInline": false
}
@@ -204,7 +204,7 @@
},
{
"type": "image",
- "id": "angle-basics-1.cs-4.svg",
+ "id": "angle-basics-1/angles-supplementary.svg",
"scale": 1.0,
"isInline": false
}
@@ -351,7 +351,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.cs-5.svg",
+ "id": "angle-basics-1/angles-supplementary-derive-vertical.svg",
"scale": 1.0,
"isInline": false
}
@@ -454,7 +454,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.cs-6.svg",
+ "id": "angle-basics-1/angles-vertical-derive-supplementary.svg",
"scale": 1.0,
"isInline": false
}
@@ -603,7 +603,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.cs-7.svg",
+ "id": "angle-basics-1/angles-corresponding-alternate-supplementary-connection.svg",
"scale": 1.0,
"isInline": false
}
@@ -838,7 +838,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.cs-8.svg",
+ "id": "angle-basics-1/angles-triangle.svg",
"scale": 1.0,
"isInline": false
}
@@ -1072,7 +1072,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.cs-9.svg",
+ "id": "angle-basics-1/angles-polygon.svg",
"scale": 1.0,
"isInline": false
}
@@ -1193,7 +1193,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.cs-10.svg",
+ "id": "angle-basics-1/angles-polygon-fan.svg",
"scale": 1.0,
"isInline": false
}
@@ -1351,7 +1351,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.cs-11.svg",
+ "id": "angle-basics-1/angles-polygon-interior.svg",
"scale": 1.0,
"isInline": false
}
@@ -1585,7 +1585,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.cs-12.svg",
+ "id": "angle-basics-1/angles-complementary-parallel-statement.svg",
"scale": 1.0,
"isInline": false
}
@@ -1704,7 +1704,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.cs-13.svg",
+ "id": "angle-basics-1/angles-complementary-parallel-solution.svg",
"scale": 1.0,
"isInline": false
}
@@ -1740,7 +1740,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.cs-14.svg",
+ "id": "angle-basics-1/angles-complementary-in-triangle.svg",
"scale": 1.0,
"isInline": false
}
@@ -1796,7 +1796,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.cs-14.svg",
+ "id": "angle-basics-1/angles-complementary-in-triangle.svg",
"scale": 1.0,
"isInline": false
}
@@ -2030,7 +2030,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.cs-15.svg",
+ "id": "angle-basics-1/angles-sas-warning.svg",
"scale": 1.0,
"isInline": false
}
@@ -2294,7 +2294,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.cs-16.svg",
+ "id": "angle-basics-1/angles-sss-proof.svg",
"scale": 1.0,
"isInline": false
}
@@ -2606,7 +2606,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.cs-17.svg",
+ "id": "angle-basics-1/angles-sas-proof.svg",
"scale": 1.0,
"isInline": false
}
@@ -2853,7 +2853,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.cs-18.svg",
+ "id": "angle-basics-1/angles-asa-proof.svg",
"scale": 1.0,
"isInline": false
}
@@ -3192,7 +3192,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.cs-19.svg",
+ "id": "angle-basics-1/angles-Ssa-proof-one-solution.svg",
"scale": 1.0,
"isInline": false
}
@@ -3362,7 +3362,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.cs-20.svg",
+ "id": "angle-basics-1/angles-Ssa-proof-isosceles.svg",
"scale": 1.0,
"isInline": false
}
@@ -3424,7 +3424,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.cs-21.svg",
+ "id": "angle-basics-1/angles-Ssa-proof-two-solutions.svg",
"scale": 1.0,
"isInline": false
}
@@ -3628,7 +3628,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.cs-22.svg",
+ "id": "angle-basics-1/angles-isosceles-triangle.svg",
"scale": 1.0,
"isInline": false
}
@@ -3918,7 +3918,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.cs-23.svg",
+ "id": "angle-basics-1/angles-equilateral.svg",
"scale": 1.0,
"isInline": false
}
@@ -4062,7 +4062,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.cs-24.svg",
+ "id": "angle-basics-1/angles-isosceles-right-triangle.svg",
"scale": 1.0,
"isInline": false
}
@@ -4370,7 +4370,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.cs-25.svg",
+ "id": "angle-basics-1/angles-90-60-30.svg",
"scale": 1.0,
"isInline": false
}
@@ -4796,175 +4796,175 @@
},
"images": [
{
- "contentId": "angle-basics-1.cs-1.svg",
+ "contentId": "angle-basics-1/angles-vertical.svg",
"originalId": "angles-vertical.pdf",
"width": "82.61pt",
"height": "65.04pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.cs-2.svg",
+ "contentId": "angle-basics-1/angles-corresponding.svg",
"originalId": "angles-corresponding.pdf",
"width": "106.36pt",
"height": "66.59pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.cs-3.svg",
+ "contentId": "angle-basics-1/angles-alternate.svg",
"originalId": "angles-alternate.pdf",
"width": "100.63pt",
"height": "58.17pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.cs-4.svg",
+ "contentId": "angle-basics-1/angles-supplementary.svg",
"originalId": "angles-supplementary.pdf",
"width": "85.68pt",
"height": "47.81pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.cs-5.svg",
+ "contentId": "angle-basics-1/angles-supplementary-derive-vertical.svg",
"originalId": "angles-supplementary-derive-vertical.pdf",
"width": "95.91pt",
"height": "78.49pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.cs-6.svg",
+ "contentId": "angle-basics-1/angles-vertical-derive-supplementary.svg",
"originalId": "angles-vertical-derive-supplementary.pdf",
"width": "95.91pt",
"height": "78.49pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.cs-7.svg",
+ "contentId": "angle-basics-1/angles-corresponding-alternate-supplementary-connection.svg",
"originalId": "angles-corresponding-alternate-supplementary-connection.pdf",
"width": "98.31pt",
"height": "65.02pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.cs-8.svg",
+ "contentId": "angle-basics-1/angles-triangle.svg",
"originalId": "angles-triangle.pdf",
"width": "182.63pt",
"height": "128.67pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.cs-9.svg",
+ "contentId": "angle-basics-1/angles-polygon.svg",
"originalId": "angles-polygon.pdf",
"width": "146.67pt",
"height": "106.43pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.cs-10.svg",
+ "contentId": "angle-basics-1/angles-polygon-fan.svg",
"originalId": "angles-polygon-fan.pdf",
"width": "146.67pt",
"height": "106.43pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.cs-11.svg",
+ "contentId": "angle-basics-1/angles-polygon-interior.svg",
"originalId": "angles-polygon-interior.pdf",
"width": "146.67pt",
"height": "106.43pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.cs-12.svg",
+ "contentId": "angle-basics-1/angles-complementary-parallel-statement.svg",
"originalId": "angles-complementary-parallel-statement.pdf",
"width": "91.52pt",
"height": "72.46pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.cs-13.svg",
+ "contentId": "angle-basics-1/angles-complementary-parallel-solution.svg",
"originalId": "angles-complementary-parallel-solution.pdf",
"width": "120.78pt",
"height": "103.36pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.cs-14.svg",
+ "contentId": "angle-basics-1/angles-complementary-in-triangle.svg",
"originalId": "angles-complementary-in-triangle.pdf",
"width": "153.73pt",
"height": "123.67pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.cs-15.svg",
+ "contentId": "angle-basics-1/angles-sas-warning.svg",
"originalId": "angles-sas-warning.pdf",
"width": "240.45pt",
"height": "77.45pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.cs-16.svg",
+ "contentId": "angle-basics-1/angles-sss-proof.svg",
"originalId": "angles-sss-proof.pdf",
"width": "180.33pt",
"height": "129.76pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.cs-17.svg",
+ "contentId": "angle-basics-1/angles-sas-proof.svg",
"originalId": "angles-sas-proof.pdf",
"width": "190.6pt",
"height": "165.53pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.cs-18.svg",
+ "contentId": "angle-basics-1/angles-asa-proof.svg",
"originalId": "angles-asa-proof.pdf",
"width": "156.76pt",
"height": "165.02pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.cs-19.svg",
+ "contentId": "angle-basics-1/angles-Ssa-proof-one-solution.svg",
"originalId": "angles-Ssa-proof-one-solution.pdf",
"width": "116.57pt",
"height": "129.18pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.cs-20.svg",
+ "contentId": "angle-basics-1/angles-Ssa-proof-isosceles.svg",
"originalId": "angles-Ssa-proof-isosceles.pdf",
"width": "116.86pt",
"height": "122.28pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.cs-21.svg",
+ "contentId": "angle-basics-1/angles-Ssa-proof-two-solutions.svg",
"originalId": "angles-Ssa-proof-two-solutions.pdf",
"width": "191.58pt",
"height": "154.75pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.cs-22.svg",
+ "contentId": "angle-basics-1/angles-isosceles-triangle.svg",
"originalId": "angles-isosceles-triangle.pdf",
"width": "117.87pt",
"height": "114.32pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.cs-23.svg",
+ "contentId": "angle-basics-1/angles-equilateral.svg",
"originalId": "angles-equilateral.pdf",
"width": "107.91pt",
"height": "97.32pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.cs-24.svg",
+ "contentId": "angle-basics-1/angles-isosceles-right-triangle.svg",
"originalId": "angles-isosceles-right-triangle.pdf",
"width": "97.95pt",
"height": "95.36pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.cs-25.svg",
+ "contentId": "angle-basics-1/angles-90-60-30.svg",
"originalId": "angles-90-60-30.pdf",
"width": "146.09pt",
"height": "131.24pt",
diff --git a/web/src/content/handouts/angle-basics-1.en.json b/web/src/content/handouts/angle-basics-1.en.json
index cfa6f30a..3267a577 100644
--- a/web/src/content/handouts/angle-basics-1.en.json
+++ b/web/src/content/handouts/angle-basics-1.en.json
@@ -141,7 +141,7 @@
},
{
"type": "image",
- "id": "angle-basics-1.en-1.svg",
+ "id": "angle-basics-1/angles-vertical.svg",
"scale": 1.0,
"isInline": false
}
@@ -159,7 +159,7 @@
},
{
"type": "image",
- "id": "angle-basics-1.en-2.svg",
+ "id": "angle-basics-1/angles-corresponding.svg",
"scale": 1.0,
"isInline": false
}
@@ -177,7 +177,7 @@
},
{
"type": "image",
- "id": "angle-basics-1.en-3.svg",
+ "id": "angle-basics-1/angles-alternate.svg",
"scale": 1.0,
"isInline": false
}
@@ -204,7 +204,7 @@
},
{
"type": "image",
- "id": "angle-basics-1.en-4.svg",
+ "id": "angle-basics-1/angles-supplementary.svg",
"scale": 1.0,
"isInline": false
}
@@ -351,7 +351,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.en-5.svg",
+ "id": "angle-basics-1/angles-supplementary-derive-vertical.svg",
"scale": 1.0,
"isInline": false
}
@@ -454,7 +454,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.en-6.svg",
+ "id": "angle-basics-1/angles-vertical-derive-supplementary.svg",
"scale": 1.0,
"isInline": false
}
@@ -603,7 +603,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.en-7.svg",
+ "id": "angle-basics-1/angles-corresponding-alternate-supplementary-connection.svg",
"scale": 1.0,
"isInline": false
}
@@ -838,7 +838,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.en-8.svg",
+ "id": "angle-basics-1/angles-triangle.svg",
"scale": 1.0,
"isInline": false
}
@@ -1072,7 +1072,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.en-9.svg",
+ "id": "angle-basics-1/angles-polygon.svg",
"scale": 1.0,
"isInline": false
}
@@ -1193,7 +1193,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.en-10.svg",
+ "id": "angle-basics-1/angles-polygon-fan.svg",
"scale": 1.0,
"isInline": false
}
@@ -1360,7 +1360,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.en-11.svg",
+ "id": "angle-basics-1/angles-polygon-interior.svg",
"scale": 1.0,
"isInline": false
}
@@ -1594,7 +1594,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.en-12.svg",
+ "id": "angle-basics-1/angles-complementary-parallel-statement.svg",
"scale": 1.0,
"isInline": false
}
@@ -1713,7 +1713,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.en-13.svg",
+ "id": "angle-basics-1/angles-complementary-parallel-solution.svg",
"scale": 1.0,
"isInline": false
}
@@ -1749,7 +1749,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.en-14.svg",
+ "id": "angle-basics-1/angles-complementary-in-triangle.svg",
"scale": 1.0,
"isInline": false
}
@@ -1805,7 +1805,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.en-14.svg",
+ "id": "angle-basics-1/angles-complementary-in-triangle.svg",
"scale": 1.0,
"isInline": false
}
@@ -2023,7 +2023,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.en-15.svg",
+ "id": "angle-basics-1/angles-sas-warning.svg",
"scale": 1.0,
"isInline": false
}
@@ -2287,7 +2287,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.en-16.svg",
+ "id": "angle-basics-1/angles-sss-proof.svg",
"scale": 1.0,
"isInline": false
}
@@ -2608,7 +2608,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.en-17.svg",
+ "id": "angle-basics-1/angles-sas-proof.svg",
"scale": 1.0,
"isInline": false
}
@@ -2855,7 +2855,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.en-18.svg",
+ "id": "angle-basics-1/angles-asa-proof.svg",
"scale": 1.0,
"isInline": false
}
@@ -3194,7 +3194,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.en-19.svg",
+ "id": "angle-basics-1/angles-Ssa-proof-one-solution.svg",
"scale": 1.0,
"isInline": false
}
@@ -3364,7 +3364,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.en-20.svg",
+ "id": "angle-basics-1/angles-Ssa-proof-isosceles.svg",
"scale": 1.0,
"isInline": false
}
@@ -3426,7 +3426,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.en-21.svg",
+ "id": "angle-basics-1/angles-Ssa-proof-two-solutions.svg",
"scale": 1.0,
"isInline": false
}
@@ -3630,7 +3630,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.en-22.svg",
+ "id": "angle-basics-1/angles-isosceles-triangle.svg",
"scale": 1.0,
"isInline": false
}
@@ -3924,7 +3924,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.en-23.svg",
+ "id": "angle-basics-1/angles-equilateral.svg",
"scale": 1.0,
"isInline": false
}
@@ -4068,7 +4068,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.en-24.svg",
+ "id": "angle-basics-1/angles-isosceles-right-triangle.svg",
"scale": 1.0,
"isInline": false
}
@@ -4376,7 +4376,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.en-25.svg",
+ "id": "angle-basics-1/angles-90-60-30.svg",
"scale": 1.0,
"isInline": false
}
@@ -4802,175 +4802,175 @@
},
"images": [
{
- "contentId": "angle-basics-1.en-1.svg",
+ "contentId": "angle-basics-1/angles-vertical.svg",
"originalId": "angles-vertical.pdf",
"width": "82.61pt",
"height": "65.04pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.en-2.svg",
+ "contentId": "angle-basics-1/angles-corresponding.svg",
"originalId": "angles-corresponding.pdf",
"width": "106.36pt",
"height": "66.59pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.en-3.svg",
+ "contentId": "angle-basics-1/angles-alternate.svg",
"originalId": "angles-alternate.pdf",
"width": "100.63pt",
"height": "58.17pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.en-4.svg",
+ "contentId": "angle-basics-1/angles-supplementary.svg",
"originalId": "angles-supplementary.pdf",
"width": "85.68pt",
"height": "47.81pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.en-5.svg",
+ "contentId": "angle-basics-1/angles-supplementary-derive-vertical.svg",
"originalId": "angles-supplementary-derive-vertical.pdf",
"width": "95.91pt",
"height": "78.49pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.en-6.svg",
+ "contentId": "angle-basics-1/angles-vertical-derive-supplementary.svg",
"originalId": "angles-vertical-derive-supplementary.pdf",
"width": "95.91pt",
"height": "78.49pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.en-7.svg",
+ "contentId": "angle-basics-1/angles-corresponding-alternate-supplementary-connection.svg",
"originalId": "angles-corresponding-alternate-supplementary-connection.pdf",
"width": "98.31pt",
"height": "65.02pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.en-8.svg",
+ "contentId": "angle-basics-1/angles-triangle.svg",
"originalId": "angles-triangle.pdf",
"width": "182.63pt",
"height": "128.67pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.en-9.svg",
+ "contentId": "angle-basics-1/angles-polygon.svg",
"originalId": "angles-polygon.pdf",
"width": "146.67pt",
"height": "106.43pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.en-10.svg",
+ "contentId": "angle-basics-1/angles-polygon-fan.svg",
"originalId": "angles-polygon-fan.pdf",
"width": "146.67pt",
"height": "106.43pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.en-11.svg",
+ "contentId": "angle-basics-1/angles-polygon-interior.svg",
"originalId": "angles-polygon-interior.pdf",
"width": "146.67pt",
"height": "106.43pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.en-12.svg",
+ "contentId": "angle-basics-1/angles-complementary-parallel-statement.svg",
"originalId": "angles-complementary-parallel-statement.pdf",
"width": "91.52pt",
"height": "72.46pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.en-13.svg",
+ "contentId": "angle-basics-1/angles-complementary-parallel-solution.svg",
"originalId": "angles-complementary-parallel-solution.pdf",
"width": "120.78pt",
"height": "103.36pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.en-14.svg",
+ "contentId": "angle-basics-1/angles-complementary-in-triangle.svg",
"originalId": "angles-complementary-in-triangle.pdf",
"width": "153.73pt",
"height": "123.67pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.en-15.svg",
+ "contentId": "angle-basics-1/angles-sas-warning.svg",
"originalId": "angles-sas-warning.pdf",
"width": "240.45pt",
"height": "77.45pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.en-16.svg",
+ "contentId": "angle-basics-1/angles-sss-proof.svg",
"originalId": "angles-sss-proof.pdf",
"width": "180.33pt",
"height": "129.76pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.en-17.svg",
+ "contentId": "angle-basics-1/angles-sas-proof.svg",
"originalId": "angles-sas-proof.pdf",
"width": "190.6pt",
"height": "165.53pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.en-18.svg",
+ "contentId": "angle-basics-1/angles-asa-proof.svg",
"originalId": "angles-asa-proof.pdf",
"width": "156.76pt",
"height": "165.02pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.en-19.svg",
+ "contentId": "angle-basics-1/angles-Ssa-proof-one-solution.svg",
"originalId": "angles-Ssa-proof-one-solution.pdf",
"width": "116.57pt",
"height": "129.18pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.en-20.svg",
+ "contentId": "angle-basics-1/angles-Ssa-proof-isosceles.svg",
"originalId": "angles-Ssa-proof-isosceles.pdf",
"width": "116.86pt",
"height": "122.28pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.en-21.svg",
+ "contentId": "angle-basics-1/angles-Ssa-proof-two-solutions.svg",
"originalId": "angles-Ssa-proof-two-solutions.pdf",
"width": "191.58pt",
"height": "154.75pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.en-22.svg",
+ "contentId": "angle-basics-1/angles-isosceles-triangle.svg",
"originalId": "angles-isosceles-triangle.pdf",
"width": "117.87pt",
"height": "114.32pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.en-23.svg",
+ "contentId": "angle-basics-1/angles-equilateral.svg",
"originalId": "angles-equilateral.pdf",
"width": "107.91pt",
"height": "97.32pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.en-24.svg",
+ "contentId": "angle-basics-1/angles-isosceles-right-triangle.svg",
"originalId": "angles-isosceles-right-triangle.pdf",
"width": "97.95pt",
"height": "95.36pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.en-25.svg",
+ "contentId": "angle-basics-1/angles-90-60-30.svg",
"originalId": "angles-90-60-30.pdf",
"width": "146.09pt",
"height": "131.24pt",
diff --git a/web/src/content/handouts/angle-basics-1.sk.json b/web/src/content/handouts/angle-basics-1.sk.json
index a981e63f..7f9de665 100644
--- a/web/src/content/handouts/angle-basics-1.sk.json
+++ b/web/src/content/handouts/angle-basics-1.sk.json
@@ -141,7 +141,7 @@
},
{
"type": "image",
- "id": "angle-basics-1.sk-1.svg",
+ "id": "angle-basics-1/angles-vertical.svg",
"scale": 1.0,
"isInline": false
}
@@ -159,7 +159,7 @@
},
{
"type": "image",
- "id": "angle-basics-1.sk-2.svg",
+ "id": "angle-basics-1/angles-corresponding.svg",
"scale": 1.0,
"isInline": false
}
@@ -177,7 +177,7 @@
},
{
"type": "image",
- "id": "angle-basics-1.sk-3.svg",
+ "id": "angle-basics-1/angles-alternate.svg",
"scale": 1.0,
"isInline": false
}
@@ -204,7 +204,7 @@
},
{
"type": "image",
- "id": "angle-basics-1.sk-4.svg",
+ "id": "angle-basics-1/angles-supplementary.svg",
"scale": 1.0,
"isInline": false
}
@@ -351,7 +351,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.sk-5.svg",
+ "id": "angle-basics-1/angles-supplementary-derive-vertical.svg",
"scale": 1.0,
"isInline": false
}
@@ -454,7 +454,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.sk-6.svg",
+ "id": "angle-basics-1/angles-vertical-derive-supplementary.svg",
"scale": 1.0,
"isInline": false
}
@@ -603,7 +603,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.sk-7.svg",
+ "id": "angle-basics-1/angles-corresponding-alternate-supplementary-connection.svg",
"scale": 1.0,
"isInline": false
}
@@ -838,7 +838,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.sk-8.svg",
+ "id": "angle-basics-1/angles-triangle.svg",
"scale": 1.0,
"isInline": false
}
@@ -1072,7 +1072,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.sk-9.svg",
+ "id": "angle-basics-1/angles-polygon.svg",
"scale": 1.0,
"isInline": false
}
@@ -1193,7 +1193,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.sk-10.svg",
+ "id": "angle-basics-1/angles-polygon-fan.svg",
"scale": 1.0,
"isInline": false
}
@@ -1351,7 +1351,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.sk-11.svg",
+ "id": "angle-basics-1/angles-polygon-interior.svg",
"scale": 1.0,
"isInline": false
}
@@ -1585,7 +1585,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.sk-12.svg",
+ "id": "angle-basics-1/angles-complementary-parallel-statement.svg",
"scale": 1.0,
"isInline": false
}
@@ -1704,7 +1704,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.sk-13.svg",
+ "id": "angle-basics-1/angles-complementary-parallel-solution.svg",
"scale": 1.0,
"isInline": false
}
@@ -1740,7 +1740,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.sk-14.svg",
+ "id": "angle-basics-1/angles-complementary-in-triangle.svg",
"scale": 1.0,
"isInline": false
}
@@ -1796,7 +1796,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.sk-14.svg",
+ "id": "angle-basics-1/angles-complementary-in-triangle.svg",
"scale": 1.0,
"isInline": false
}
@@ -2030,7 +2030,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.sk-15.svg",
+ "id": "angle-basics-1/angles-sas-warning.svg",
"scale": 1.0,
"isInline": false
}
@@ -2294,7 +2294,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.sk-16.svg",
+ "id": "angle-basics-1/angles-sss-proof.svg",
"scale": 1.0,
"isInline": false
}
@@ -2606,7 +2606,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.sk-17.svg",
+ "id": "angle-basics-1/angles-sas-proof.svg",
"scale": 1.0,
"isInline": false
}
@@ -2853,7 +2853,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.sk-18.svg",
+ "id": "angle-basics-1/angles-asa-proof.svg",
"scale": 1.0,
"isInline": false
}
@@ -3192,7 +3192,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.sk-19.svg",
+ "id": "angle-basics-1/angles-Ssa-proof-one-solution.svg",
"scale": 1.0,
"isInline": false
}
@@ -3362,7 +3362,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.sk-20.svg",
+ "id": "angle-basics-1/angles-Ssa-proof-isosceles.svg",
"scale": 1.0,
"isInline": false
}
@@ -3424,7 +3424,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.sk-21.svg",
+ "id": "angle-basics-1/angles-Ssa-proof-two-solutions.svg",
"scale": 1.0,
"isInline": false
}
@@ -3628,7 +3628,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.sk-22.svg",
+ "id": "angle-basics-1/angles-isosceles-triangle.svg",
"scale": 1.0,
"isInline": false
}
@@ -3918,7 +3918,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.sk-23.svg",
+ "id": "angle-basics-1/angles-equilateral.svg",
"scale": 1.0,
"isInline": false
}
@@ -4062,7 +4062,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.sk-24.svg",
+ "id": "angle-basics-1/angles-isosceles-right-triangle.svg",
"scale": 1.0,
"isInline": false
}
@@ -4370,7 +4370,7 @@
"content": [
{
"type": "image",
- "id": "angle-basics-1.sk-25.svg",
+ "id": "angle-basics-1/angles-90-60-30.svg",
"scale": 1.0,
"isInline": false
}
@@ -4796,175 +4796,175 @@
},
"images": [
{
- "contentId": "angle-basics-1.sk-1.svg",
+ "contentId": "angle-basics-1/angles-vertical.svg",
"originalId": "angles-vertical.pdf",
"width": "82.61pt",
"height": "65.04pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.sk-2.svg",
+ "contentId": "angle-basics-1/angles-corresponding.svg",
"originalId": "angles-corresponding.pdf",
"width": "106.36pt",
"height": "66.59pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.sk-3.svg",
+ "contentId": "angle-basics-1/angles-alternate.svg",
"originalId": "angles-alternate.pdf",
"width": "100.63pt",
"height": "58.17pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.sk-4.svg",
+ "contentId": "angle-basics-1/angles-supplementary.svg",
"originalId": "angles-supplementary.pdf",
"width": "85.68pt",
"height": "47.81pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.sk-5.svg",
+ "contentId": "angle-basics-1/angles-supplementary-derive-vertical.svg",
"originalId": "angles-supplementary-derive-vertical.pdf",
"width": "95.91pt",
"height": "78.49pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.sk-6.svg",
+ "contentId": "angle-basics-1/angles-vertical-derive-supplementary.svg",
"originalId": "angles-vertical-derive-supplementary.pdf",
"width": "95.91pt",
"height": "78.49pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.sk-7.svg",
+ "contentId": "angle-basics-1/angles-corresponding-alternate-supplementary-connection.svg",
"originalId": "angles-corresponding-alternate-supplementary-connection.pdf",
"width": "98.31pt",
"height": "65.02pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.sk-8.svg",
+ "contentId": "angle-basics-1/angles-triangle.svg",
"originalId": "angles-triangle.pdf",
"width": "182.63pt",
"height": "128.67pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.sk-9.svg",
+ "contentId": "angle-basics-1/angles-polygon.svg",
"originalId": "angles-polygon.pdf",
"width": "146.67pt",
"height": "106.43pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.sk-10.svg",
+ "contentId": "angle-basics-1/angles-polygon-fan.svg",
"originalId": "angles-polygon-fan.pdf",
"width": "146.67pt",
"height": "106.43pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.sk-11.svg",
+ "contentId": "angle-basics-1/angles-polygon-interior.svg",
"originalId": "angles-polygon-interior.pdf",
"width": "146.67pt",
"height": "106.43pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.sk-12.svg",
+ "contentId": "angle-basics-1/angles-complementary-parallel-statement.svg",
"originalId": "angles-complementary-parallel-statement.pdf",
"width": "91.52pt",
"height": "72.46pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.sk-13.svg",
+ "contentId": "angle-basics-1/angles-complementary-parallel-solution.svg",
"originalId": "angles-complementary-parallel-solution.pdf",
"width": "120.78pt",
"height": "103.36pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.sk-14.svg",
+ "contentId": "angle-basics-1/angles-complementary-in-triangle.svg",
"originalId": "angles-complementary-in-triangle.pdf",
"width": "153.73pt",
"height": "123.67pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.sk-15.svg",
+ "contentId": "angle-basics-1/angles-sas-warning.svg",
"originalId": "angles-sas-warning.pdf",
"width": "240.45pt",
"height": "77.45pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.sk-16.svg",
+ "contentId": "angle-basics-1/angles-sss-proof.svg",
"originalId": "angles-sss-proof.pdf",
"width": "180.33pt",
"height": "129.76pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.sk-17.svg",
+ "contentId": "angle-basics-1/angles-sas-proof.svg",
"originalId": "angles-sas-proof.pdf",
"width": "190.6pt",
"height": "165.53pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.sk-18.svg",
+ "contentId": "angle-basics-1/angles-asa-proof.svg",
"originalId": "angles-asa-proof.pdf",
"width": "156.76pt",
"height": "165.02pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.sk-19.svg",
+ "contentId": "angle-basics-1/angles-Ssa-proof-one-solution.svg",
"originalId": "angles-Ssa-proof-one-solution.pdf",
"width": "116.57pt",
"height": "129.18pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.sk-20.svg",
+ "contentId": "angle-basics-1/angles-Ssa-proof-isosceles.svg",
"originalId": "angles-Ssa-proof-isosceles.pdf",
"width": "116.86pt",
"height": "122.28pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.sk-21.svg",
+ "contentId": "angle-basics-1/angles-Ssa-proof-two-solutions.svg",
"originalId": "angles-Ssa-proof-two-solutions.pdf",
"width": "191.58pt",
"height": "154.75pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.sk-22.svg",
+ "contentId": "angle-basics-1/angles-isosceles-triangle.svg",
"originalId": "angles-isosceles-triangle.pdf",
"width": "117.87pt",
"height": "114.32pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.sk-23.svg",
+ "contentId": "angle-basics-1/angles-equilateral.svg",
"originalId": "angles-equilateral.pdf",
"width": "107.91pt",
"height": "97.32pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.sk-24.svg",
+ "contentId": "angle-basics-1/angles-isosceles-right-triangle.svg",
"originalId": "angles-isosceles-right-triangle.pdf",
"width": "97.95pt",
"height": "95.36pt",
"scale": 1.0
},
{
- "contentId": "angle-basics-1.sk-25.svg",
+ "contentId": "angle-basics-1/angles-90-60-30.svg",
"originalId": "angles-90-60-30.pdf",
"width": "146.09pt",
"height": "131.24pt",
diff --git a/web/src/content/handouts/introduction-to-inequalities.cs.json b/web/src/content/handouts/introduction-to-inequalities.cs.json
index 28112860..ac103cee 100644
--- a/web/src/content/handouts/introduction-to-inequalities.cs.json
+++ b/web/src/content/handouts/introduction-to-inequalities.cs.json
@@ -35,7 +35,7 @@
"content": [
{
"type": "image",
- "id": "introduction-to-inequalities.cs-1.svg",
+ "id": "introduction-to-inequalities/box.svg",
"scale": 1.0,
"isInline": false
}
@@ -3243,7 +3243,7 @@
"content": [
{
"type": "image",
- "id": "introduction-to-inequalities.cs-2.svg",
+ "id": "introduction-to-inequalities/ag-proof.svg",
"scale": 1.0,
"isInline": false
}
@@ -3588,7 +3588,7 @@
"content": [
{
"type": "image",
- "id": "introduction-to-inequalities.cs-1.svg",
+ "id": "introduction-to-inequalities/box.svg",
"scale": 1.0,
"isInline": false
}
@@ -7616,14 +7616,14 @@
},
"images": [
{
- "contentId": "introduction-to-inequalities.cs-1.svg",
+ "contentId": "introduction-to-inequalities/box.svg",
"originalId": "box.pdf",
"width": "187.88pt",
"height": "116.3pt",
"scale": 1.0
},
{
- "contentId": "introduction-to-inequalities.cs-2.svg",
+ "contentId": "introduction-to-inequalities/ag-proof.svg",
"originalId": "ag-proof.pdf",
"width": "210.76pt",
"height": "64.28pt",
diff --git a/web/src/content/handouts/introduction-to-inequalities.en.json b/web/src/content/handouts/introduction-to-inequalities.en.json
index 8788bf4c..718960f8 100644
--- a/web/src/content/handouts/introduction-to-inequalities.en.json
+++ b/web/src/content/handouts/introduction-to-inequalities.en.json
@@ -35,7 +35,7 @@
"content": [
{
"type": "image",
- "id": "introduction-to-inequalities.en-1.svg",
+ "id": "introduction-to-inequalities/box.svg",
"scale": 1.0,
"isInline": false
}
@@ -3243,7 +3243,7 @@
"content": [
{
"type": "image",
- "id": "introduction-to-inequalities.en-2.svg",
+ "id": "introduction-to-inequalities/ag-proof.svg",
"scale": 1.0,
"isInline": false
}
@@ -3588,7 +3588,7 @@
"content": [
{
"type": "image",
- "id": "introduction-to-inequalities.en-1.svg",
+ "id": "introduction-to-inequalities/box.svg",
"scale": 1.0,
"isInline": false
}
@@ -7616,14 +7616,14 @@
},
"images": [
{
- "contentId": "introduction-to-inequalities.en-1.svg",
+ "contentId": "introduction-to-inequalities/box.svg",
"originalId": "box.pdf",
"width": "187.88pt",
"height": "116.3pt",
"scale": 1.0
},
{
- "contentId": "introduction-to-inequalities.en-2.svg",
+ "contentId": "introduction-to-inequalities/ag-proof.svg",
"originalId": "ag-proof.pdf",
"width": "210.76pt",
"height": "64.28pt",
diff --git a/web/src/content/handouts/introduction-to-inequalities.sk.json b/web/src/content/handouts/introduction-to-inequalities.sk.json
index e48c169c..c24cc0fe 100644
--- a/web/src/content/handouts/introduction-to-inequalities.sk.json
+++ b/web/src/content/handouts/introduction-to-inequalities.sk.json
@@ -35,7 +35,7 @@
"content": [
{
"type": "image",
- "id": "introduction-to-inequalities.sk-1.svg",
+ "id": "introduction-to-inequalities/box.svg",
"scale": 1.0,
"isInline": false
}
@@ -3243,7 +3243,7 @@
"content": [
{
"type": "image",
- "id": "introduction-to-inequalities.sk-2.svg",
+ "id": "introduction-to-inequalities/ag-proof.svg",
"scale": 1.0,
"isInline": false
}
@@ -3588,7 +3588,7 @@
"content": [
{
"type": "image",
- "id": "introduction-to-inequalities.sk-1.svg",
+ "id": "introduction-to-inequalities/box.svg",
"scale": 1.0,
"isInline": false
}
@@ -7616,14 +7616,14 @@
},
"images": [
{
- "contentId": "introduction-to-inequalities.sk-1.svg",
+ "contentId": "introduction-to-inequalities/box.svg",
"originalId": "box.pdf",
"width": "187.88pt",
"height": "116.3pt",
"scale": 1.0
},
{
- "contentId": "introduction-to-inequalities.sk-2.svg",
+ "contentId": "introduction-to-inequalities/ag-proof.svg",
"originalId": "ag-proof.pdf",
"width": "210.76pt",
"height": "64.28pt",