From 58b7a3f738e404e9ac63a8889d2cd85877d052f6 Mon Sep 17 00:00:00 2001 From: PatrikBak Date: Wed, 13 May 2026 17:54:08 +0200 Subject: [PATCH] Nest handout R2 assets under handouts// so language variants share one set MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously every image and PDF was uploaded once per language: angle-basics-1.cs-1.svg, angle-basics-1.sk-1.svg, angle-basics-1.en-1.svg — three byte-identical copies of one SVG. PDFs lived under handouts/pdfs/, images under handouts/images/, with the language code and a counter baked into each filename. Both kinds of artefact now live under handouts//, where is the language-stripped handout id (the .tex file stem, matching the English slug in handouts.json). All three language versions of factorization point at the same factorization/box.svg, factorization/ag-proof.svg, and the main + skeleton PDFs join them in the same folder. ImageProcessingConfig swaps FileNamePrefix for an OutputFileName delegate so each caller picks its own naming scheme; problem images keep their -.svg shape unchanged. The handouts CLI derives the slug + R2 key via two small helpers (ToHandoutSlug, ToHandoutR2Key) shared between the image and PDF paths. Co-Authored-By: Claude Opus 4.7 --- .../Images/ImageProcessingConfig.cs | 4 +- .../Images/TexImageProcessor.cs | 4 +- .../Storage/IFileUploader.cs | 2 +- .../DatabaseSeeder.cs | 2 +- .../MathComps.Cli.Handouts/BuildCommand.cs | 58 +++++++--- .../Tools/MathComps.Cli.Handouts/README.md | 4 +- .../problems/services/problem-api-urls.ts | 11 +- .../utils/__tests__/media-utils.test.ts | 4 +- .../content/handouts/angle-basics-1.cs.json | 102 +++++++++--------- .../content/handouts/angle-basics-1.en.json | 102 +++++++++--------- .../content/handouts/angle-basics-1.sk.json | 102 +++++++++--------- .../introduction-to-inequalities.cs.json | 10 +- .../introduction-to-inequalities.en.json | 10 +- .../introduction-to-inequalities.sk.json | 10 +- 14 files changed, 229 insertions(+), 196 deletions(-) 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",