ropegeo-common 1.21.0 → 1.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/helpers/hydrateOfflinePageWirePaths.d.ts.map +1 -1
  2. package/dist/helpers/hydrateOfflinePageWirePaths.js +1 -0
  3. package/dist/models/betaSections/betaSection.d.ts +10 -1
  4. package/dist/models/betaSections/betaSection.d.ts.map +1 -1
  5. package/dist/models/betaSections/betaSection.js +56 -2
  6. package/dist/models/betaSections/betaSectionExcerpt.d.ts +2 -0
  7. package/dist/models/betaSections/betaSectionExcerpt.d.ts.map +1 -1
  8. package/dist/models/betaSections/betaSectionExcerpt.js +5 -0
  9. package/dist/models/betaSections/formatExcerptHtml.d.ts +16 -0
  10. package/dist/models/betaSections/formatExcerptHtml.d.ts.map +1 -0
  11. package/dist/models/betaSections/formatExcerptHtml.js +238 -0
  12. package/dist/models/betaSections/normalizeExcerptHtml.d.ts +6 -0
  13. package/dist/models/betaSections/normalizeExcerptHtml.d.ts.map +1 -0
  14. package/dist/models/betaSections/normalizeExcerptHtml.js +42 -0
  15. package/dist/models/betaSections/offlineBetaSection.d.ts +1 -1
  16. package/dist/models/betaSections/offlineBetaSection.d.ts.map +1 -1
  17. package/dist/models/betaSections/offlineBetaSection.js +2 -2
  18. package/dist/models/betaSections/offlineBetaSectionImage.d.ts +2 -1
  19. package/dist/models/betaSections/offlineBetaSectionImage.d.ts.map +1 -1
  20. package/dist/models/betaSections/offlineBetaSectionImage.js +5 -1
  21. package/dist/models/betaSections/onlineBetaSection.d.ts +2 -1
  22. package/dist/models/betaSections/onlineBetaSection.d.ts.map +1 -1
  23. package/dist/models/betaSections/onlineBetaSection.js +3 -3
  24. package/dist/models/betaSections/onlineBetaSectionImage.d.ts +3 -2
  25. package/dist/models/betaSections/onlineBetaSectionImage.d.ts.map +1 -1
  26. package/dist/models/betaSections/onlineBetaSectionImage.js +7 -3
  27. package/dist/models/index.d.ts +2 -2
  28. package/dist/models/index.d.ts.map +1 -1
  29. package/dist/models/pageViews/offlinePageView.d.ts +10 -0
  30. package/dist/models/pageViews/offlinePageView.d.ts.map +1 -1
  31. package/dist/models/pageViews/offlineRopewikiPageView.d.ts +2 -1
  32. package/dist/models/pageViews/offlineRopewikiPageView.d.ts.map +1 -1
  33. package/dist/models/pageViews/offlineRopewikiPageView.js +16 -0
  34. package/dist/models/pageViews/onlinePageView.d.ts +10 -0
  35. package/dist/models/pageViews/onlinePageView.d.ts.map +1 -1
  36. package/dist/models/pageViews/onlineRopewikiPageView.d.ts +2 -1
  37. package/dist/models/pageViews/onlineRopewikiPageView.d.ts.map +1 -1
  38. package/dist/models/pageViews/onlineRopewikiPageView.js +20 -3
  39. package/dist/models/pageViews/ropewikiPageView.d.ts +3 -0
  40. package/dist/models/pageViews/ropewikiPageView.d.ts.map +1 -1
  41. package/dist/models/pageViews/ropewikiPageView.js +11 -0
  42. package/package.json +6 -2
@@ -1 +1 @@
1
- {"version":3,"file":"hydrateOfflinePageWirePaths.d.ts","sourceRoot":"","sources":["../../src/helpers/hydrateOfflinePageWirePaths.ts"],"names":[],"mappings":"AA6BA,qGAAqG;AACrG,wBAAgB,2BAA2B,CACvC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,IAAI,CAiBN"}
1
+ {"version":3,"file":"hydrateOfflinePageWirePaths.d.ts","sourceRoot":"","sources":["../../src/helpers/hydrateOfflinePageWirePaths.ts"],"names":[],"mappings":"AA8BA,qGAAqG;AACrG,wBAAgB,2BAA2B,CACvC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,IAAI,CAiBN"}
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.hydrateOfflinePageWirePaths = hydrateOfflinePageWirePaths;
4
4
  const offlinePageBundlePaths_1 = require("./offlinePageBundlePaths");
5
5
  const PATH_LIKE_KEYS = new Set([
6
+ 'downloadedPreviewPath',
6
7
  'downloadedBannerPath',
7
8
  'downloadedFullPath',
8
9
  'offlineTilesTemplate',
@@ -8,17 +8,26 @@ export declare abstract class BetaSection {
8
8
  title: string;
9
9
  text: string;
10
10
  latestRevisionDate: Date;
11
- protected constructor(order: number, title: string, text: string, latestRevisionDate: Date);
11
+ /** Stable database identity when supplied by the page-view API. */
12
+ id: string | null;
13
+ protected constructor(order: number, title: string, text: string, latestRevisionDate: Date, id?: string | null);
12
14
  /**
13
15
  * Builds a {@link BetaSectionExcerpt} for a verbatim excerpt from this section's text.
14
16
  * When the excerpt cannot be located, `start` and `end` are left undefined.
15
17
  */
16
18
  toExcerpt(excerptText: string, confidence: number): BetaSectionExcerpt;
19
+ /**
20
+ * Renders an excerpt with nearby section context when its offsets still
21
+ * match this section, otherwise falls back to the excerpt alone.
22
+ */
23
+ toExcerptHtml(excerpt: BetaSectionExcerpt): string;
17
24
  static fromResponseBody(body: unknown, fetchType?: FetchType): BetaSection;
18
25
  protected static assertNumber(obj: Record<string, unknown>, key: string): void;
19
26
  protected static assertString(obj: Record<string, unknown>, key: string): void;
20
27
  protected static assertIso8601DateString(obj: Record<string, unknown>, key: string): void;
21
28
  protected static normalizeCommonFields(obj: Record<string, unknown>, context: string, expectedFetchType: FetchType): void;
29
+ private static assertNullableNonEmptyString;
22
30
  protected static parseImagesArray(obj: Record<string, unknown>, key: string, expectedFetchType: FetchType): BetaSectionImage[];
31
+ protected static assertUniqueImageIds(images: BetaSectionImage[], sectionId: unknown): void;
23
32
  }
24
33
  //# sourceMappingURL=betaSection.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"betaSection.d.ts","sourceRoot":"","sources":["../../../src/models/betaSections/betaSection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAItD,wBAAgB,yBAAyB,CACrC,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,WAAW,GACtC,IAAI,CAEN;AAED,8BAAsB,WAAW;IAC7B,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,EAAE,IAAI,CAAC;IAEzB,SAAS,aACL,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,kBAAkB,EAAE,IAAI;IAQ5B;;;OAGG;IACH,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,kBAAkB;IAWtE,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,SAAS,GAAG,WAAW;IA0B1E,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAS9E,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAS9E,SAAS,CAAC,MAAM,CAAC,uBAAuB,CACpC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,GAAG,EAAE,MAAM,GACZ,IAAI;IAeP,SAAS,CAAC,MAAM,CAAC,qBAAqB,CAClC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,OAAO,EAAE,MAAM,EACf,iBAAiB,EAAE,SAAS,GAC7B,IAAI;IAaP,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAC7B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,GAAG,EAAE,MAAM,EACX,iBAAiB,EAAE,SAAS,GAC7B,gBAAgB,EAAE;CAOxB"}
1
+ {"version":3,"file":"betaSection.d.ts","sourceRoot":"","sources":["../../../src/models/betaSections/betaSection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAatD,wBAAgB,yBAAyB,CACrC,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,WAAW,GACtC,IAAI,CAEN;AAED,8BAAsB,WAAW;IAC7B,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,EAAE,IAAI,CAAC;IACzB,mEAAmE;IACnE,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAElB,SAAS,aACL,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,kBAAkB,EAAE,IAAI,EACxB,EAAE,GAAE,MAAM,GAAG,IAAW;IAS5B;;;OAGG;IACH,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,kBAAkB;IAWtE;;;OAGG;IACH,aAAa,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM;IAwClD,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,SAAS,GAAG,WAAW;IA0B1E,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAS9E,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAS9E,SAAS,CAAC,MAAM,CAAC,uBAAuB,CACpC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,GAAG,EAAE,MAAM,GACZ,IAAI;IAeP,SAAS,CAAC,MAAM,CAAC,qBAAqB,CAClC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,OAAO,EAAE,MAAM,EACf,iBAAiB,EAAE,SAAS,GAC7B,IAAI;IAcP,OAAO,CAAC,MAAM,CAAC,4BAA4B;IAgB3C,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAC7B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,GAAG,EAAE,MAAM,EACX,iBAAiB,EAAE,SAAS,GAC7B,gBAAgB,EAAE;IAYrB,SAAS,CAAC,MAAM,CAAC,oBAAoB,CACjC,MAAM,EAAE,gBAAgB,EAAE,EAC1B,SAAS,EAAE,OAAO,GACnB,IAAI;CAeV"}
@@ -4,16 +4,19 @@ exports.BetaSection = void 0;
4
4
  exports.registerBetaSectionParser = registerBetaSectionParser;
5
5
  const betaSectionExcerpt_1 = require("./betaSectionExcerpt");
6
6
  const betaSectionImage_1 = require("./betaSectionImage");
7
+ const formatExcerptHtml_1 = require("./formatExcerptHtml");
8
+ const normalizeExcerptHtml_1 = require("./normalizeExcerptHtml");
7
9
  const betaSectionParsers = new Map();
8
10
  function registerBetaSectionParser(fetchType, parse) {
9
11
  betaSectionParsers.set(fetchType, parse);
10
12
  }
11
13
  class BetaSection {
12
- constructor(order, title, text, latestRevisionDate) {
14
+ constructor(order, title, text, latestRevisionDate, id = null) {
13
15
  this.order = order;
14
16
  this.title = title;
15
17
  this.text = text;
16
18
  this.latestRevisionDate = new Date(latestRevisionDate);
19
+ this.id = id;
17
20
  }
18
21
  /**
19
22
  * Builds a {@link BetaSectionExcerpt} for a verbatim excerpt from this section's text.
@@ -29,6 +32,32 @@ class BetaSection {
29
32
  }
30
33
  return new betaSectionExcerpt_1.BetaSectionExcerpt(excerptText, start, start + excerptText.length, confidence);
31
34
  }
35
+ /**
36
+ * Renders an excerpt with nearby section context when its offsets still
37
+ * match this section, otherwise falls back to the excerpt alone.
38
+ */
39
+ toExcerptHtml(excerpt) {
40
+ const validOffsets = excerpt.text != null &&
41
+ Number.isInteger(excerpt.start) &&
42
+ Number.isInteger(excerpt.end) &&
43
+ excerpt.start >= 0 &&
44
+ excerpt.end > excerpt.start &&
45
+ excerpt.end <= this.text.length &&
46
+ this.text.slice(excerpt.start, excerpt.end) === excerpt.text &&
47
+ (0, formatExcerptHtml_1.isSafeTextBoundary)(this.text, excerpt.start) &&
48
+ (0, formatExcerptHtml_1.isSafeTextBoundary)(this.text, excerpt.end);
49
+ if (!validOffsets)
50
+ return excerpt.toHtml();
51
+ const excerptStart = excerpt.start;
52
+ const excerptEnd = excerpt.end;
53
+ const characters = (0, formatExcerptHtml_1.visibleCharacters)(this.text);
54
+ const structuredContext = (0, formatExcerptHtml_1.listContext)(this.text, excerptStart, excerptEnd, characters);
55
+ const before = structuredContext?.before ??
56
+ this.text.slice((0, formatExcerptHtml_1.previousSentenceStart)(this.text, excerptStart, characters), excerptStart);
57
+ const after = structuredContext?.after ??
58
+ this.text.slice(excerptEnd, (0, formatExcerptHtml_1.nextSentenceEnd)(this.text, excerptEnd, characters));
59
+ return (0, normalizeExcerptHtml_1.normalizeExcerptListHtml)(`${(0, formatExcerptHtml_1.fadeText)(before, 'toward-end')}${excerpt.text}${(0, formatExcerptHtml_1.fadeText)(after, 'toward-start')}`);
60
+ }
32
61
  static fromResponseBody(body, fetchType) {
33
62
  if (body == null || typeof body !== 'object') {
34
63
  throw new Error('BetaSection body must be an object');
@@ -75,17 +104,42 @@ class BetaSection {
75
104
  BetaSection.assertString(obj, 'title');
76
105
  BetaSection.assertString(obj, 'text');
77
106
  BetaSection.assertIso8601DateString(obj, 'latestRevisionDate');
107
+ BetaSection.assertNullableNonEmptyString(obj, 'id');
78
108
  if (obj.fetchType !== expectedFetchType) {
79
109
  throw new Error(`${context}.fetchType must be "${expectedFetchType}", got: ${JSON.stringify(obj.fetchType)}`);
80
110
  }
81
111
  obj.latestRevisionDate = new Date(obj.latestRevisionDate);
82
112
  }
113
+ static assertNullableNonEmptyString(obj, key) {
114
+ const value = obj[key];
115
+ if (value === undefined || value === null) {
116
+ obj[key] = null;
117
+ return;
118
+ }
119
+ if (typeof value !== 'string' || value.trim().length === 0) {
120
+ throw new Error(`BetaSection.${key} must be a non-empty string or null, got: ${JSON.stringify(value)}`);
121
+ }
122
+ }
83
123
  static parseImagesArray(obj, key, expectedFetchType) {
84
124
  const v = obj[key];
85
125
  if (!Array.isArray(v)) {
86
126
  throw new Error(`BetaSection.${key} must be an array, got: ${typeof v}`);
87
127
  }
88
- return v.map((item) => betaSectionImage_1.BetaSectionImage.fromResult(item, expectedFetchType));
128
+ const images = v.map((item) => betaSectionImage_1.BetaSectionImage.fromResult(item, expectedFetchType));
129
+ BetaSection.assertUniqueImageIds(images, obj.id);
130
+ return images;
131
+ }
132
+ static assertUniqueImageIds(images, sectionId) {
133
+ const seen = new Set();
134
+ for (const image of images) {
135
+ if (seen.has(image.id)) {
136
+ const sectionLabel = typeof sectionId === 'string' && sectionId.length > 0
137
+ ? sectionId
138
+ : 'unknown';
139
+ throw new Error(`Duplicate image id ${image.id} in beta section ${sectionLabel}`);
140
+ }
141
+ seen.add(image.id);
142
+ }
89
143
  }
90
144
  }
91
145
  exports.BetaSection = BetaSection;
@@ -5,6 +5,8 @@ export declare class BetaSectionExcerpt {
5
5
  readonly confidence: number;
6
6
  constructor(text: string | undefined, start: number | undefined, end: number | undefined, confidence: number);
7
7
  toPlain(): Record<string, unknown>;
8
+ /** Returns displayable excerpt HTML when the owning beta section is unavailable. */
9
+ toHtml(): string;
8
10
  static fromResult(result: unknown): BetaSectionExcerpt;
9
11
  private static assertConfidence;
10
12
  private static assertNonNegativeInteger;
@@ -1 +1 @@
1
- {"version":3,"file":"betaSectionExcerpt.d.ts","sourceRoot":"","sources":["../../../src/models/betaSections/betaSectionExcerpt.ts"],"names":[],"mappings":"AAAA,qBAAa,kBAAkB;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;gBAGxB,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,UAAU,EAAE,MAAM;IAStB,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAclC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,kBAAkB;IAgCtD,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAQ/B,OAAO,CAAC,MAAM,CAAC,wBAAwB;CAK1C"}
1
+ {"version":3,"file":"betaSectionExcerpt.d.ts","sourceRoot":"","sources":["../../../src/models/betaSections/betaSectionExcerpt.ts"],"names":[],"mappings":"AAEA,qBAAa,kBAAkB;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;gBAGxB,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,UAAU,EAAE,MAAM;IAStB,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAclC,oFAAoF;IACpF,MAAM,IAAI,MAAM;IAIhB,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,kBAAkB;IAgCtD,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAQ/B,OAAO,CAAC,MAAM,CAAC,wBAAwB;CAK1C"}
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.BetaSectionExcerpt = void 0;
4
+ const normalizeExcerptHtml_1 = require("./normalizeExcerptHtml");
4
5
  class BetaSectionExcerpt {
5
6
  constructor(text, start, end, confidence) {
6
7
  BetaSectionExcerpt.assertConfidence(confidence);
@@ -22,6 +23,10 @@ class BetaSectionExcerpt {
22
23
  }
23
24
  return out;
24
25
  }
26
+ /** Returns displayable excerpt HTML when the owning beta section is unavailable. */
27
+ toHtml() {
28
+ return (0, normalizeExcerptHtml_1.normalizeExcerptListHtml)(this.text ?? '');
29
+ }
25
30
  static fromResult(result) {
26
31
  if (result == null || typeof result !== 'object' || Array.isArray(result)) {
27
32
  throw new Error('BetaSectionExcerpt result must be an object');
@@ -0,0 +1,16 @@
1
+ type VisibleCharacter = {
2
+ value: string;
3
+ index: number;
4
+ };
5
+ export declare function visibleCharacters(html: string): VisibleCharacter[];
6
+ /** True when an offset does not split tag markup or a character entity. */
7
+ export declare function isSafeTextBoundary(html: string, offset: number): boolean;
8
+ export declare function previousSentenceStart(html: string, anchor: number, characters: VisibleCharacter[]): number;
9
+ export declare function nextSentenceEnd(html: string, anchor: number, characters: VisibleCharacter[]): number;
10
+ export declare function listContext(html: string, excerptStart: number, excerptEnd: number, characters: VisibleCharacter[]): {
11
+ before: string;
12
+ after: string;
13
+ } | null;
14
+ export declare function fadeText(html: string, direction: 'toward-end' | 'toward-start'): string;
15
+ export {};
16
+ //# sourceMappingURL=formatExcerptHtml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatExcerptHtml.d.ts","sourceRoot":"","sources":["../../../src/models/betaSections/formatExcerptHtml.ts"],"names":[],"mappings":"AAAA,KAAK,gBAAgB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAsBzD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAuBlE;AAYD,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAsCxE;AAuCD,wBAAgB,qBAAqB,CACjC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,gBAAgB,EAAE,GAC/B,MAAM,CAkBR;AAED,wBAAgB,eAAe,CAC3B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,gBAAgB,EAAE,GAC/B,MAAM,CAuBR;AAyCD,wBAAgB,WAAW,CACvB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,gBAAgB,EAAE,GAC/B;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CA0C1C;AAED,wBAAgB,QAAQ,CACpB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,YAAY,GAAG,cAAc,GACzC,MAAM,CA8BR"}
@@ -0,0 +1,238 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.visibleCharacters = visibleCharacters;
4
+ exports.isSafeTextBoundary = isSafeTextBoundary;
5
+ exports.previousSentenceStart = previousSentenceStart;
6
+ exports.nextSentenceEnd = nextSentenceEnd;
7
+ exports.listContext = listContext;
8
+ exports.fadeText = fadeText;
9
+ const HEADER_TAG = /^<\s*(\/?)h[1-6]\b/i;
10
+ const NON_TERMINAL_ABBREVIATIONS = new Set([
11
+ 'dr',
12
+ 'e.g',
13
+ 'etc',
14
+ 'i.e',
15
+ 'mr',
16
+ 'mrs',
17
+ 'ms',
18
+ 'no',
19
+ 'st',
20
+ 'vs',
21
+ ]);
22
+ function visibleCharacters(html) {
23
+ const characters = [];
24
+ let headerDepth = 0;
25
+ for (let index = 0; index < html.length; index += 1) {
26
+ if (html[index] === '<') {
27
+ const end = html.indexOf('>', index + 1);
28
+ if (end === -1)
29
+ break;
30
+ const tag = html.slice(index, end + 1);
31
+ const header = tag.match(HEADER_TAG);
32
+ if (header != null) {
33
+ headerDepth += header[1] === '/' ? -1 : 1;
34
+ headerDepth = Math.max(0, headerDepth);
35
+ }
36
+ index = end;
37
+ continue;
38
+ }
39
+ if (headerDepth === 0) {
40
+ characters.push({ value: html[index], index });
41
+ }
42
+ }
43
+ return characters;
44
+ }
45
+ function hasVisibleText(characters, start, end) {
46
+ return characters.some(({ value, index }) => index >= start && index < end && /\S/.test(value));
47
+ }
48
+ /** True when an offset does not split tag markup or a character entity. */
49
+ function isSafeTextBoundary(html, offset) {
50
+ if (offset < 0 || offset > html.length)
51
+ return false;
52
+ if (offset > 0 && offset < html.length) {
53
+ const code = html.charCodeAt(offset - 1);
54
+ if (code >= 0xd800 && code <= 0xdbff)
55
+ return false;
56
+ }
57
+ let inTag = false;
58
+ let quote = null;
59
+ for (let index = 0; index < offset; index += 1) {
60
+ const char = html[index];
61
+ if (inTag) {
62
+ if (quote != null) {
63
+ if (char === quote)
64
+ quote = null;
65
+ continue;
66
+ }
67
+ if (char === '"' || char === "'") {
68
+ quote = char;
69
+ continue;
70
+ }
71
+ if (char === '>')
72
+ inTag = false;
73
+ continue;
74
+ }
75
+ if (char === '<')
76
+ inTag = true;
77
+ }
78
+ if (inTag)
79
+ return false;
80
+ const entityStart = html.lastIndexOf('&', Math.max(0, offset - 1));
81
+ if (entityStart !== -1 && entityStart < offset) {
82
+ const semicolon = html.indexOf(';', entityStart);
83
+ if (semicolon >= offset) {
84
+ const entity = html.slice(entityStart, semicolon + 1);
85
+ if (/^&(?:#\d{1,7}|#x[\da-f]{1,6}|[a-z][\w:-]{0,31});$/i.test(entity)) {
86
+ return false;
87
+ }
88
+ }
89
+ }
90
+ return true;
91
+ }
92
+ function isSentenceBoundary(characters, characterIndex) {
93
+ const current = characters[characterIndex];
94
+ if (current.value === '!' || current.value === '?')
95
+ return true;
96
+ if (current.value !== '.')
97
+ return false;
98
+ const previous = characters[characterIndex - 1]?.value;
99
+ const next = characters[characterIndex + 1]?.value;
100
+ if (previous != null && next != null && /\d/.test(previous) && /\d/.test(next)) {
101
+ return false;
102
+ }
103
+ if (previous != null &&
104
+ next != null &&
105
+ /[A-Za-z]/.test(previous) &&
106
+ /[A-Za-z]/.test(next) &&
107
+ characters[characterIndex + 2]?.value === '.') {
108
+ return false;
109
+ }
110
+ let token = '';
111
+ for (let index = characterIndex - 1; index >= 0; index -= 1) {
112
+ const value = characters[index].value;
113
+ if (!/[A-Za-z.]/.test(value))
114
+ break;
115
+ token = value + token;
116
+ }
117
+ const normalized = token.toLowerCase();
118
+ return (token.length > 1 &&
119
+ !NON_TERMINAL_ABBREVIATIONS.has(normalized) &&
120
+ !/^(?:[a-z]\.)+[a-z]?$/i.test(token));
121
+ }
122
+ function previousSentenceStart(html, anchor, characters) {
123
+ const boundaries = characters
124
+ .map((character, index) => ({ character, index }))
125
+ .filter(({ character, index }) => character.index < anchor &&
126
+ isSentenceBoundary(characters, index))
127
+ .map(({ character }) => character.index + 1);
128
+ if (boundaries.length === 0)
129
+ return 0;
130
+ const latest = boundaries[boundaries.length - 1];
131
+ const boundary = hasVisibleText(characters, latest, anchor)
132
+ ? latest
133
+ : boundaries[boundaries.length - 2];
134
+ let start = boundary ?? 0;
135
+ while (start < anchor && /\s/.test(html[start]))
136
+ start += 1;
137
+ return start;
138
+ }
139
+ function nextSentenceEnd(html, anchor, characters) {
140
+ const boundary = characters.find(({ index }, characterIndex) => index >= anchor && isSentenceBoundary(characters, characterIndex));
141
+ if (boundary == null)
142
+ return html.length;
143
+ let end = boundary.index + 1;
144
+ while (end < html.length) {
145
+ const rest = html.slice(end);
146
+ const whitespace = rest.match(/^\s+/);
147
+ if (whitespace != null) {
148
+ end += whitespace[0].length;
149
+ continue;
150
+ }
151
+ const closingTag = rest.match(/^<\/(?!ul\b|ol\b|li\b)[a-z][^>]*>/i);
152
+ if (closingTag != null) {
153
+ end += closingTag[0].length;
154
+ continue;
155
+ }
156
+ break;
157
+ }
158
+ return end;
159
+ }
160
+ function findContainingList(html, excerptStart, excerptEnd) {
161
+ const stack = [];
162
+ const ranges = [];
163
+ const tags = html.matchAll(/<(\/?)(ul|ol)\b[^>]*>/gi);
164
+ for (const tag of tags) {
165
+ const start = tag.index;
166
+ const end = start + tag[0].length;
167
+ const name = tag[2].toLowerCase();
168
+ if (tag[1] !== '/') {
169
+ stack.push({ name, start, end });
170
+ continue;
171
+ }
172
+ const openIndex = stack.map(({ name: n }) => n).lastIndexOf(name);
173
+ if (openIndex === -1)
174
+ continue;
175
+ const [open] = stack.splice(openIndex, 1);
176
+ if (open.start <= excerptStart && end >= excerptEnd) {
177
+ ranges.push({
178
+ openStart: open.start,
179
+ openEnd: open.end,
180
+ closeStart: start,
181
+ closeEnd: end,
182
+ });
183
+ }
184
+ }
185
+ return (ranges.sort((a, b) => b.openStart - a.openStart || a.closeEnd - b.closeEnd)[0] ?? null);
186
+ }
187
+ function listContext(html, excerptStart, excerptEnd, characters) {
188
+ const excerpt = html.slice(excerptStart, excerptEnd).trim();
189
+ if (!/^<li\b/i.test(excerpt) || !/<\/li\s*>$/i.test(excerpt)) {
190
+ return null;
191
+ }
192
+ const range = findContainingList(html, excerptStart, excerptEnd);
193
+ if (range == null)
194
+ return null;
195
+ const listBody = html.slice(range.openEnd, range.closeStart);
196
+ const items = [...listBody.matchAll(/<li\b[^>]*>[\s\S]*?<\/li\s*>/gi)].map((match) => ({
197
+ start: range.openEnd + match.index,
198
+ end: range.openEnd + match.index + match[0].length,
199
+ }));
200
+ const previous = items.filter(({ end }) => end <= excerptStart).at(-1);
201
+ const next = items.find(({ start }) => start >= excerptEnd);
202
+ const before = previous != null
203
+ ? html.slice(range.openStart, range.openEnd) +
204
+ html.slice(previous.start, previous.end)
205
+ : html.slice(previousSentenceStart(html, range.openStart, characters), range.openEnd);
206
+ const after = next != null
207
+ ? html.slice(next.start, next.end) +
208
+ html.slice(range.closeStart, range.closeEnd)
209
+ : html.slice(range.closeStart, nextSentenceEnd(html, range.closeEnd, characters));
210
+ return { before, after };
211
+ }
212
+ function fadeText(html, direction) {
213
+ const parts = html.split(/(<[^>]+>)/g);
214
+ const wordCount = parts.reduce((count, part) => part.startsWith('<')
215
+ ? count
216
+ : count + (part.match(/\S+/g)?.length ?? 0), 0);
217
+ if (wordCount === 0)
218
+ return html;
219
+ let wordIndex = 0;
220
+ return parts
221
+ .map((part) => {
222
+ if (part.startsWith('<'))
223
+ return part;
224
+ return part
225
+ .split(/(\s+)/)
226
+ .map((token) => {
227
+ if (token.length === 0 || /^\s+$/.test(token))
228
+ return token;
229
+ const progress = wordCount === 1 ? 1 : wordIndex / (wordCount - 1);
230
+ const proximity = direction === 'toward-end' ? progress : 1 - progress;
231
+ const opacity = (0.3 + proximity * 0.4).toFixed(2);
232
+ wordIndex += 1;
233
+ return `<span style="opacity: ${opacity}">${token}</span>`;
234
+ })
235
+ .join('');
236
+ })
237
+ .join('');
238
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Repairs the list fragments Ropewiki excerpts commonly produce without
3
+ * otherwise rewriting the source HTML.
4
+ */
5
+ export declare function normalizeExcerptListHtml(html: string): string;
6
+ //# sourceMappingURL=normalizeExcerptHtml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalizeExcerptHtml.d.ts","sourceRoot":"","sources":["../../../src/models/betaSections/normalizeExcerptHtml.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgC7D"}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.normalizeExcerptListHtml = normalizeExcerptListHtml;
4
+ function countTags(html, pattern) {
5
+ return html.match(pattern)?.length ?? 0;
6
+ }
7
+ /**
8
+ * Repairs the list fragments Ropewiki excerpts commonly produce without
9
+ * otherwise rewriting the source HTML.
10
+ */
11
+ function normalizeExcerptListHtml(html) {
12
+ if (html.length === 0)
13
+ return html;
14
+ let normalized = html;
15
+ let olOpenCount = countTags(normalized, /<ol\b[^>]*>/gi);
16
+ let olCloseCount = countTags(normalized, /<\/ol\s*>/gi);
17
+ if (olOpenCount === 0 && olCloseCount > 0) {
18
+ normalized = normalized.replace(/<\/ol\s*>/gi, '</ul>');
19
+ normalized = '<ul>'.repeat(olCloseCount) + normalized;
20
+ olCloseCount = 0;
21
+ }
22
+ else if (olOpenCount > olCloseCount) {
23
+ normalized += '</ol>'.repeat(olOpenCount - olCloseCount);
24
+ }
25
+ else if (olCloseCount > olOpenCount) {
26
+ normalized = '<ol>'.repeat(olCloseCount - olOpenCount) + normalized;
27
+ }
28
+ const ulOpenCount = countTags(normalized, /<ul\b[^>]*>/gi);
29
+ const ulCloseCount = countTags(normalized, /<\/ul\s*>/gi);
30
+ if (ulOpenCount > ulCloseCount) {
31
+ normalized += '</ul>'.repeat(ulOpenCount - ulCloseCount);
32
+ }
33
+ else if (ulCloseCount > ulOpenCount) {
34
+ normalized = '<ul>'.repeat(ulCloseCount - ulOpenCount) + normalized;
35
+ }
36
+ const hasListItem = /<li\b[^>]*>/i.test(normalized);
37
+ const hasListContainer = /<\/?(?:ul|ol)\b[^>]*>/i.test(normalized);
38
+ if (hasListItem && !hasListContainer) {
39
+ normalized = `<ul>${normalized}</ul>`;
40
+ }
41
+ return normalized;
42
+ }
@@ -3,7 +3,7 @@ import { OfflineBetaSectionImage } from './offlineBetaSectionImage';
3
3
  export declare class OfflineBetaSection extends BetaSection {
4
4
  readonly fetchType: "offline";
5
5
  images: OfflineBetaSectionImage[];
6
- constructor(order: number, title: string, text: string, latestRevisionDate: Date, images?: OfflineBetaSectionImage[]);
6
+ constructor(order: number, title: string, text: string, latestRevisionDate: Date, images?: OfflineBetaSectionImage[], id?: string | null);
7
7
  static fromResponseBody(body: unknown): OfflineBetaSection;
8
8
  }
9
9
  //# sourceMappingURL=offlineBetaSection.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"offlineBetaSection.d.ts","sourceRoot":"","sources":["../../../src/models/betaSections/offlineBetaSection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA6B,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,qBAAa,kBAAmB,SAAQ,WAAW;IAC/C,QAAQ,CAAC,SAAS,EAAG,SAAS,CAAU;IACxC,MAAM,EAAE,uBAAuB,EAAE,CAAC;gBAG9B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,kBAAkB,EAAE,IAAI,EACxB,MAAM,CAAC,EAAE,uBAAuB,EAAE;IAMtC,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,kBAAkB;CAU7D"}
1
+ {"version":3,"file":"offlineBetaSection.d.ts","sourceRoot":"","sources":["../../../src/models/betaSections/offlineBetaSection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA6B,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,qBAAa,kBAAmB,SAAQ,WAAW;IAC/C,QAAQ,CAAC,SAAS,EAAG,SAAS,CAAU;IACxC,MAAM,EAAE,uBAAuB,EAAE,CAAC;gBAG9B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,kBAAkB,EAAE,IAAI,EACxB,MAAM,CAAC,EAAE,uBAAuB,EAAE,EAClC,EAAE,GAAE,MAAM,GAAG,IAAW;IAM5B,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,kBAAkB;CAU7D"}
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.OfflineBetaSection = void 0;
4
4
  const betaSection_1 = require("./betaSection");
5
5
  class OfflineBetaSection extends betaSection_1.BetaSection {
6
- constructor(order, title, text, latestRevisionDate, images) {
7
- super(order, title, text, latestRevisionDate);
6
+ constructor(order, title, text, latestRevisionDate, images, id = null) {
7
+ super(order, title, text, latestRevisionDate, id);
8
8
  this.fetchType = 'offline';
9
9
  this.images = Array.isArray(images) ? images : [];
10
10
  }
@@ -3,7 +3,8 @@ export declare class OfflineBetaSectionImage extends BetaSectionImage {
3
3
  readonly fetchType: "offline";
4
4
  downloadedBannerPath: string | null;
5
5
  downloadedFullPath: string | null;
6
- constructor(order: number, id: string, downloadedBannerPath: string | null, downloadedFullPath: string | null, linkUrl: string, caption: string | null, latestRevisionDate: Date);
6
+ downloadedPreviewPath: string | null;
7
+ constructor(order: number, id: string, downloadedBannerPath: string | null, downloadedFullPath: string | null, linkUrl: string, caption: string | null, latestRevisionDate: Date, downloadedPreviewPath?: string | null);
7
8
  static fromResult(result: unknown): OfflineBetaSectionImage;
8
9
  }
9
10
  //# sourceMappingURL=offlineBetaSectionImage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"offlineBetaSectionImage.d.ts","sourceRoot":"","sources":["../../../src/models/betaSections/offlineBetaSectionImage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAkC,MAAM,oBAAoB,CAAC;AAEtF,qBAAa,uBAAwB,SAAQ,gBAAgB;IACzD,QAAQ,CAAC,SAAS,EAAG,SAAS,CAAU;IACxC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;gBAG9B,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,EACV,oBAAoB,EAAE,MAAM,GAAG,IAAI,EACnC,kBAAkB,EAAE,MAAM,GAAG,IAAI,EACjC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,kBAAkB,EAAE,IAAI;IAO5B,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,uBAAuB;CAc9D"}
1
+ {"version":3,"file":"offlineBetaSectionImage.d.ts","sourceRoot":"","sources":["../../../src/models/betaSections/offlineBetaSectionImage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAkC,MAAM,oBAAoB,CAAC;AAEtF,qBAAa,uBAAwB,SAAQ,gBAAgB;IACzD,QAAQ,CAAC,SAAS,EAAG,SAAS,CAAU;IACxC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;gBAGjC,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,EACV,oBAAoB,EAAE,MAAM,GAAG,IAAI,EACnC,kBAAkB,EAAE,MAAM,GAAG,IAAI,EACjC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,kBAAkB,EAAE,IAAI,EACxB,qBAAqB,GAAE,MAAM,GAAG,IAAW;IAQ/C,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,uBAAuB;CAgB9D"}
@@ -3,11 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.OfflineBetaSectionImage = void 0;
4
4
  const betaSectionImage_1 = require("./betaSectionImage");
5
5
  class OfflineBetaSectionImage extends betaSectionImage_1.BetaSectionImage {
6
- constructor(order, id, downloadedBannerPath, downloadedFullPath, linkUrl, caption, latestRevisionDate) {
6
+ constructor(order, id, downloadedBannerPath, downloadedFullPath, linkUrl, caption, latestRevisionDate, downloadedPreviewPath = null) {
7
7
  super(order, id, linkUrl, caption, latestRevisionDate);
8
8
  this.fetchType = 'offline';
9
9
  this.downloadedBannerPath = downloadedBannerPath;
10
10
  this.downloadedFullPath = downloadedFullPath;
11
+ this.downloadedPreviewPath = downloadedPreviewPath;
11
12
  }
12
13
  static fromResult(result) {
13
14
  if (result == null || typeof result !== 'object') {
@@ -17,6 +18,9 @@ class OfflineBetaSectionImage extends betaSectionImage_1.BetaSectionImage {
17
18
  betaSectionImage_1.BetaSectionImage.normalizeCommonFields(r, 'OfflineBetaSectionImage', 'offline');
18
19
  betaSectionImage_1.BetaSectionImage.assertStringOrNull(r, 'downloadedBannerPath');
19
20
  betaSectionImage_1.BetaSectionImage.assertStringOrNull(r, 'downloadedFullPath');
21
+ if (r.downloadedPreviewPath === undefined)
22
+ r.downloadedPreviewPath = null;
23
+ betaSectionImage_1.BetaSectionImage.assertStringOrNull(r, 'downloadedPreviewPath');
20
24
  if ('downloadBytes' in r && r.downloadBytes != null) {
21
25
  throw new Error('OfflineBetaSectionImage.downloadBytes is not supported');
22
26
  }
@@ -4,8 +4,9 @@ import { OnlineBetaSectionImage } from './onlineBetaSectionImage';
4
4
  export declare class OnlineBetaSection extends BetaSection {
5
5
  readonly fetchType: "online";
6
6
  images: OnlineBetaSectionImage[];
7
- constructor(order: number, title: string, text: string, latestRevisionDate: Date, images?: OnlineBetaSectionImage[]);
7
+ constructor(order: number, title: string, text: string, latestRevisionDate: Date, images?: OnlineBetaSectionImage[], id?: string | null);
8
8
  toOffline(downloadedImages: Record<string, {
9
+ preview?: string | null;
9
10
  banner: string | null;
10
11
  full: string | null;
11
12
  }>): OfflineBetaSection;
@@ -1 +1 @@
1
- {"version":3,"file":"onlineBetaSection.d.ts","sourceRoot":"","sources":["../../../src/models/betaSections/onlineBetaSection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA6B,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,qBAAa,iBAAkB,SAAQ,WAAW;IAC9C,QAAQ,CAAC,SAAS,EAAG,QAAQ,CAAU;IACvC,MAAM,EAAE,sBAAsB,EAAE,CAAC;gBAG7B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,kBAAkB,EAAE,IAAI,EACxB,MAAM,CAAC,EAAE,sBAAsB,EAAE;IAMrC,SAAS,CAAC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,GAAG,kBAAkB;IAe/G,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,iBAAiB;CAU5D"}
1
+ {"version":3,"file":"onlineBetaSection.d.ts","sourceRoot":"","sources":["../../../src/models/betaSections/onlineBetaSection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA6B,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,qBAAa,iBAAkB,SAAQ,WAAW;IAC9C,QAAQ,CAAC,SAAS,EAAG,QAAQ,CAAU;IACvC,MAAM,EAAE,sBAAsB,EAAE,CAAC;gBAG7B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,kBAAkB,EAAE,IAAI,EACxB,MAAM,CAAC,EAAE,sBAAsB,EAAE,EACjC,EAAE,GAAE,MAAM,GAAG,IAAW;IAM5B,SAAS,CACL,gBAAgB,EAAE,MAAM,CACpB,MAAM,EACN;QAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAC1E,GACF,kBAAkB;IAiBrB,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,iBAAiB;CAU5D"}
@@ -4,13 +4,13 @@ exports.OnlineBetaSection = void 0;
4
4
  const betaSection_1 = require("./betaSection");
5
5
  const offlineBetaSection_1 = require("./offlineBetaSection");
6
6
  class OnlineBetaSection extends betaSection_1.BetaSection {
7
- constructor(order, title, text, latestRevisionDate, images) {
8
- super(order, title, text, latestRevisionDate);
7
+ constructor(order, title, text, latestRevisionDate, images, id = null) {
8
+ super(order, title, text, latestRevisionDate, id);
9
9
  this.fetchType = 'online';
10
10
  this.images = Array.isArray(images) ? images : [];
11
11
  }
12
12
  toOffline(downloadedImages) {
13
- return new offlineBetaSection_1.OfflineBetaSection(this.order, this.title, this.text, this.latestRevisionDate, this.images.map((image) => image.toOffline(downloadedImages[image.id]?.banner ?? null, downloadedImages[image.id]?.full ?? null)));
13
+ return new offlineBetaSection_1.OfflineBetaSection(this.order, this.title, this.text, this.latestRevisionDate, this.images.map((image) => image.toOffline(downloadedImages[image.id]?.banner ?? null, downloadedImages[image.id]?.full ?? null, downloadedImages[image.id]?.preview ?? null)), this.id);
14
14
  }
15
15
  static fromResponseBody(body) {
16
16
  if (body == null || typeof body !== 'object') {
@@ -5,10 +5,11 @@ export declare class OnlineBetaSectionImage extends BetaSectionImage {
5
5
  readonly fetchType: "online";
6
6
  bannerUrl: string | null;
7
7
  fullUrl: string | null;
8
+ previewUrl: string | null;
8
9
  /** Byte sizes per rendition; null when not provided by API. */
9
10
  downloadBytes: DownloadBytes | null;
10
- constructor(order: number, id: string, bannerUrl: string | null, fullUrl: string | null, linkUrl: string, caption: string | null, latestRevisionDate: Date, downloadBytes: DownloadBytes | null);
11
- toOffline(downloadedBannerPath: string | null, downloadedFullPath: string | null): OfflineBetaSectionImage;
11
+ constructor(order: number, id: string, bannerUrl: string | null, fullUrl: string | null, linkUrl: string, caption: string | null, latestRevisionDate: Date, downloadBytes: DownloadBytes | null, previewUrl?: string | null);
12
+ toOffline(downloadedBannerPath: string | null, downloadedFullPath: string | null, downloadedPreviewPath?: string | null): OfflineBetaSectionImage;
12
13
  static fromResult(result: unknown): OnlineBetaSectionImage;
13
14
  }
14
15
  //# sourceMappingURL=onlineBetaSectionImage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"onlineBetaSectionImage.d.ts","sourceRoot":"","sources":["../../../src/models/betaSections/onlineBetaSectionImage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAkC,MAAM,oBAAoB,CAAC;AACtF,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,qBAAa,sBAAuB,SAAQ,gBAAgB;IACxD,QAAQ,CAAC,SAAS,EAAG,QAAQ,CAAU;IACvC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,+DAA+D;IAC/D,aAAa,EAAE,aAAa,GAAG,IAAI,CAAC;gBAGhC,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,kBAAkB,EAAE,IAAI,EACxB,aAAa,EAAE,aAAa,GAAG,IAAI;IAQvC,SAAS,CAAC,oBAAoB,EAAE,MAAM,GAAG,IAAI,EAAE,kBAAkB,EAAE,MAAM,GAAG,IAAI,GAAG,uBAAuB;IAY1G,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,sBAAsB;CAY7D"}
1
+ {"version":3,"file":"onlineBetaSectionImage.d.ts","sourceRoot":"","sources":["../../../src/models/betaSections/onlineBetaSectionImage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAkC,MAAM,oBAAoB,CAAC;AACtF,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,qBAAa,sBAAuB,SAAQ,gBAAgB;IACxD,QAAQ,CAAC,SAAS,EAAG,QAAQ,CAAU;IACvC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,+DAA+D;IAC/D,aAAa,EAAE,aAAa,GAAG,IAAI,CAAC;gBAGhC,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,kBAAkB,EAAE,IAAI,EACxB,aAAa,EAAE,aAAa,GAAG,IAAI,EACnC,UAAU,GAAE,MAAM,GAAG,IAAW;IASpC,SAAS,CACL,oBAAoB,EAAE,MAAM,GAAG,IAAI,EACnC,kBAAkB,EAAE,MAAM,GAAG,IAAI,EACjC,qBAAqB,GAAE,MAAM,GAAG,IAAW,GAC5C,uBAAuB;IAa1B,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,sBAAsB;CAc7D"}
@@ -4,15 +4,16 @@ exports.OnlineBetaSectionImage = void 0;
4
4
  const betaSectionImage_1 = require("./betaSectionImage");
5
5
  const offlineBetaSectionImage_1 = require("./offlineBetaSectionImage");
6
6
  class OnlineBetaSectionImage extends betaSectionImage_1.BetaSectionImage {
7
- constructor(order, id, bannerUrl, fullUrl, linkUrl, caption, latestRevisionDate, downloadBytes) {
7
+ constructor(order, id, bannerUrl, fullUrl, linkUrl, caption, latestRevisionDate, downloadBytes, previewUrl = null) {
8
8
  super(order, id, linkUrl, caption, latestRevisionDate);
9
9
  this.fetchType = 'online';
10
10
  this.bannerUrl = bannerUrl;
11
11
  this.fullUrl = fullUrl;
12
12
  this.downloadBytes = downloadBytes;
13
+ this.previewUrl = previewUrl;
13
14
  }
14
- toOffline(downloadedBannerPath, downloadedFullPath) {
15
- return new offlineBetaSectionImage_1.OfflineBetaSectionImage(this.order, this.id, downloadedBannerPath, downloadedFullPath, this.linkUrl, this.caption, this.latestRevisionDate);
15
+ toOffline(downloadedBannerPath, downloadedFullPath, downloadedPreviewPath = null) {
16
+ return new offlineBetaSectionImage_1.OfflineBetaSectionImage(this.order, this.id, downloadedBannerPath, downloadedFullPath, this.linkUrl, this.caption, this.latestRevisionDate, downloadedPreviewPath);
16
17
  }
17
18
  static fromResult(result) {
18
19
  if (result == null || typeof result !== 'object') {
@@ -22,6 +23,9 @@ class OnlineBetaSectionImage extends betaSectionImage_1.BetaSectionImage {
22
23
  betaSectionImage_1.BetaSectionImage.normalizeCommonFields(r, 'OnlineBetaSectionImage', 'online');
23
24
  betaSectionImage_1.BetaSectionImage.assertStringOrNull(r, 'bannerUrl');
24
25
  betaSectionImage_1.BetaSectionImage.assertStringOrNull(r, 'fullUrl');
26
+ if (r.previewUrl === undefined)
27
+ r.previewUrl = null;
28
+ betaSectionImage_1.BetaSectionImage.assertStringOrNull(r, 'previewUrl');
25
29
  betaSectionImage_1.BetaSectionImage.assertDownloadBytesOrNull(r, 'downloadBytes');
26
30
  Object.setPrototypeOf(r, OnlineBetaSectionImage.prototype);
27
31
  return r;
@@ -88,8 +88,8 @@ export { PageView } from './pageViews/pageView';
88
88
  export { RopewikiPageView as BaseRopewikiPageView } from './pageViews/ropewikiPageView';
89
89
  export { OnlineRopewikiPageView } from './pageViews/onlineRopewikiPageView';
90
90
  export { OfflineRopewikiPageView } from './pageViews/offlineRopewikiPageView';
91
- export type { OnlinePageView } from './pageViews/onlinePageView';
92
- export type { OfflinePageView } from './pageViews/offlinePageView';
91
+ export type { OnlinePageView, OnlineBetaSectionLookup, OnlineBetaSectionLookupEntry, } from './pageViews/onlinePageView';
92
+ export type { OfflinePageView, OfflineBetaSectionLookup, OfflineBetaSectionLookupEntry, } from './pageViews/offlinePageView';
93
93
  export { formatMeasurementValue } from './measurements/measurementValue';
94
94
  export { Measurement, FREEDOM_MEASUREMENT_SYSTEM } from './measurements/measurement';
95
95
  export type { MeasurementUnit } from './measurements/measurement';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/models/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/models/index.ts"],"names":[],"mappings":"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"}
@@ -2,11 +2,21 @@ import type { OfflinePagePreview } from '../previews/offlinePagePreview';
2
2
  import { RouteType } from '../routes/routeType';
3
3
  import type { Bounds } from '../minimap/bounds';
4
4
  import { PageViewType } from './pageViewType';
5
+ import type { OfflineBetaSection } from '../betaSections/offlineBetaSection';
6
+ import type { OfflineBetaSectionImage } from '../betaSections/offlineBetaSectionImage';
7
+ export type OfflineBetaSectionLookupEntry = {
8
+ /** Null for page-level images, which use the empty relevant-context key. */
9
+ section: OfflineBetaSection | null;
10
+ imagesById: Record<string, OfflineBetaSectionImage>;
11
+ };
12
+ /** Relevant-context lookup keyed by beta-section id (`""` for page-level images). */
13
+ export type OfflineBetaSectionLookup = Record<string, OfflineBetaSectionLookupEntry>;
5
14
  export interface OfflinePageView {
6
15
  readonly fetchType: 'offline';
7
16
  readonly id: string;
8
17
  readonly routeType: RouteType;
9
18
  readonly pageViewType: PageViewType;
19
+ toBetaSectionLookup(): OfflineBetaSectionLookup;
10
20
  toPagePreview(): OfflinePagePreview;
11
21
  /** Bounds for Mapbox offline pack when this page uses a page minimap; otherwise null. */
12
22
  getMapboxPackBounds(): Bounds | null;
@@ -1 +1 @@
1
- {"version":3,"file":"offlinePageView.d.ts","sourceRoot":"","sources":["../../../src/models/pageViews/offlinePageView.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,WAAW,eAAe;IAC5B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,aAAa,IAAI,kBAAkB,CAAC;IACpC,yFAAyF;IACzF,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAAC;CACxC"}
1
+ {"version":3,"file":"offlinePageView.d.ts","sourceRoot":"","sources":["../../../src/models/pageViews/offlinePageView.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAC7E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAEvF,MAAM,MAAM,6BAA6B,GAAG;IACxC,4EAA4E;IAC5E,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;CACvD,CAAC;AAEF,qFAAqF;AACrF,MAAM,MAAM,wBAAwB,GAAG,MAAM,CAAC,MAAM,EAAE,6BAA6B,CAAC,CAAC;AAErF,MAAM,WAAW,eAAe;IAC5B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,mBAAmB,IAAI,wBAAwB,CAAC;IAChD,aAAa,IAAI,kBAAkB,CAAC;IACpC,yFAAyF;IACzF,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAAC;CACxC"}
@@ -3,7 +3,7 @@ import { OfflineBetaSectionImage } from '../betaSections/offlineBetaSectionImage
3
3
  import { OfflineCenteredRegionMiniMap } from '../minimap/concrete/offlineCenteredRegionMiniMap';
4
4
  import { OfflinePageMiniMap } from '../minimap/concrete/offlinePageMiniMap';
5
5
  import { OfflinePagePreview } from '../previews/offlinePagePreview';
6
- import { OfflinePageView } from './offlinePageView';
6
+ import { type OfflineBetaSectionLookup, OfflinePageView } from './offlinePageView';
7
7
  import { RopewikiPageView } from './ropewikiPageView';
8
8
  import { RouteType } from '../routes/routeType';
9
9
  import { RopewikiVehicleType } from '../ropewikiVehicleType';
@@ -22,6 +22,7 @@ export declare class OfflineRopewikiPageView extends RopewikiPageView implements
22
22
  lat: number;
23
23
  lon: number;
24
24
  } | null);
25
+ toBetaSectionLookup(): OfflineBetaSectionLookup;
25
26
  toPagePreview(): OfflinePagePreview;
26
27
  getMapboxPackBounds(): import('../minimap/bounds').Bounds | null;
27
28
  static fromResult(result: unknown, pageRoot?: string | null): OfflineRopewikiPageView;
@@ -1 +1 @@
1
- {"version":3,"file":"offlineRopewikiPageView.d.ts","sourceRoot":"","sources":["../../../src/models/pageViews/offlineRopewikiPageView.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAElF,OAAO,EAAE,4BAA4B,EAAE,MAAM,kDAAkD,CAAC;AAChG,OAAO,EAAE,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEpE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAAkC,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtF,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAG7D,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAElE,qBAAa,uBAAwB,SAAQ,gBAAiB,YAAW,eAAe;IACpF,QAAQ,CAAC,SAAS,EAAG,SAAS,CAAU;IACxC,WAAW,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAC5C,YAAY,EAAE,kBAAkB,EAAE,CAAC;IACnC,OAAO,EAAE,kBAAkB,GAAG,4BAA4B,GAAG,IAAI,CAAC;gBAG9D,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EAAE,EACb,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,EAAE,EACvC,gBAAgB,EAAE,OAAO,gCAAgC,EAAE,gBAAgB,EAC3E,MAAM,EAAE,OAAO,iBAAiB,EAAE,YAAY,GAAG,IAAI,EACrD,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,IAAI,EAC3C,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,OAAO,EAAE,mBAAmB,GAAG,IAAI,EACnC,aAAa,EAAE,iBAAiB,GAAG,IAAI,EACvC,WAAW,EAAE,eAAe,GAAG,IAAI,EACnC,aAAa,EAAE,iBAAiB,GAAG,IAAI,EACvC,aAAa,EAAE,iBAAiB,GAAG,IAAI,EACvC,UAAU,EAAE,iBAAiB,GAAG,IAAI,EACpC,cAAc,EAAE,iBAAiB,GAAG,IAAI,EACxC,WAAW,EAAE,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC,GAAG,IAAI,EAC7D,YAAY,EAAE,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC,GAAG,IAAI,EAC9D,WAAW,EAAE,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC,GAAG,IAAI,EAC7D,QAAQ,EAAE,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC,GAAG,IAAI,EAC1D,gBAAgB,EAAE,iBAAiB,GAAG,IAAI,EAC1C,eAAe,EAAE,iBAAiB,GAAG,IAAI,EACzC,YAAY,EAAE,iBAAiB,GAAG,IAAI,EACtC,MAAM,EAAE,MAAM,EAAE,EAChB,kBAAkB,EAAE,IAAI,EACxB,WAAW,EAAE,uBAAuB,GAAG,IAAI,EAC3C,YAAY,EAAE,kBAAkB,EAAE,EAClC,OAAO,EAAE,kBAAkB,GAAG,4BAA4B,GAAG,IAAI,EACjE,WAAW,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAsCpD,aAAa,IAAI,kBAAkB;IAqBnC,mBAAmB,IAAI,OAAO,mBAAmB,EAAE,MAAM,GAAG,IAAI;IAOhE,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,uBAAuB;CA2CxF"}
1
+ {"version":3,"file":"offlineRopewikiPageView.d.ts","sourceRoot":"","sources":["../../../src/models/pageViews/offlineRopewikiPageView.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,7 @@ const pageView_1 = require("./pageView");
12
12
  const ropewikiPageView_1 = require("./ropewikiPageView");
13
13
  const pageViewType_1 = require("./pageViewType");
14
14
  const hydrateOfflinePageWirePaths_1 = require("../../helpers/hydrateOfflinePageWirePaths");
15
+ const lodash_1 = require("lodash");
15
16
  class OfflineRopewikiPageView extends ropewikiPageView_1.RopewikiPageView {
16
17
  constructor(id, routeType, name, aka, url, quality, userVotes, regions, difficultyRating, permit, rappelCount, jumps, vehicle, rappelLongest, shuttleTime, overallLength, descentLength, exitLength, approachLength, overallTime, approachTime, descentTime, exitTime, approachElevGain, descentElevGain, exitElevGain, months, latestRevisionDate, bannerImage, betaSections, miniMap, coordinates) {
17
18
  super(id, routeType, name, aka, url, quality, userVotes, regions, difficultyRating, permit, rappelCount, jumps, vehicle, rappelLongest, shuttleTime, overallLength, descentLength, exitLength, approachLength, overallTime, approachTime, descentTime, exitTime, approachElevGain, descentElevGain, exitElevGain, months, latestRevisionDate, coordinates);
@@ -20,6 +21,20 @@ class OfflineRopewikiPageView extends ropewikiPageView_1.RopewikiPageView {
20
21
  this.betaSections = betaSections;
21
22
  this.miniMap = miniMap;
22
23
  }
24
+ toBetaSectionLookup() {
25
+ const identifiedSections = this.betaSections.filter((section) => section.id != null);
26
+ const lookup = (0, lodash_1.mapValues)((0, lodash_1.keyBy)(identifiedSections, (section) => section.id), (section) => ({
27
+ section,
28
+ imagesById: (0, lodash_1.keyBy)(section.images, (image) => image.id),
29
+ }));
30
+ if (this.bannerImage != null) {
31
+ lookup[''] = {
32
+ section: null,
33
+ imagesById: { [this.bannerImage.id]: this.bannerImage },
34
+ };
35
+ }
36
+ return lookup;
37
+ }
23
38
  toPagePreview() {
24
39
  const mapData = this.miniMap != null && this.miniMap.miniMapType === miniMapType_1.MiniMapType.Page
25
40
  ? this.miniMap.mapDataId
@@ -50,6 +65,7 @@ class OfflineRopewikiPageView extends ropewikiPageView_1.RopewikiPageView {
50
65
  throw new Error(`OfflineRopewikiPageView.betaSections must be an array, got: ${typeof r.betaSections}`);
51
66
  }
52
67
  r.betaSections = r.betaSections.map((item) => betaSection_1.BetaSection.fromResponseBody(item, 'offline'));
68
+ ropewikiPageView_1.RopewikiPageView.assertUniqueBetaSectionIds(r.betaSections, 'OfflineRopewikiPageView');
53
69
  if (r.miniMap == null) {
54
70
  r.miniMap = null;
55
71
  }
@@ -7,6 +7,15 @@ import type { DownloadPhase } from '../../download/downloadPhase';
7
7
  import type { DownloadJob } from '../../download/downloadJob';
8
8
  import type { DownloadJobConfig, DownloadPlatformHarness, DownloadTaskDependency } from '../../download/types';
9
9
  import type { OnlineMiniMap } from '../minimap/abstract/onlineMiniMap';
10
+ import type { OnlineBetaSection } from '../betaSections/onlineBetaSection';
11
+ import type { OnlineBetaSectionImage } from '../betaSections/onlineBetaSectionImage';
12
+ export type OnlineBetaSectionLookupEntry = {
13
+ /** Null for page-level images, which use the empty relevant-context key. */
14
+ section: OnlineBetaSection | null;
15
+ imagesById: Record<string, OnlineBetaSectionImage>;
16
+ };
17
+ /** Relevant-context lookup keyed by beta-section id (`""` for page-level images). */
18
+ export type OnlineBetaSectionLookup = Record<string, OnlineBetaSectionLookupEntry>;
10
19
  export interface OnlinePageView {
11
20
  readonly fetchType: 'online';
12
21
  readonly id: string;
@@ -14,6 +23,7 @@ export interface OnlinePageView {
14
23
  readonly pageViewType: PageViewType;
15
24
  readonly miniMap: OnlineMiniMap | null;
16
25
  readonly downloadFolder: string | null;
26
+ toBetaSectionLookup(): OnlineBetaSectionLookup;
17
27
  planDownloadPhases(): DownloadPhase[];
18
28
  getDependenciesForPhases(phases: DownloadPhase[]): Record<string, DownloadTaskDependency>;
19
29
  toOfflineFromExtractedBundle(pageRoot: string, platformHarness: DownloadPlatformHarness): Promise<OfflinePageView>;
@@ -1 +1 @@
1
- {"version":3,"file":"onlinePageView.d.ts","sourceRoot":"","sources":["../../../src/models/pageViews/onlinePageView.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC/G,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAEvE,MAAM,WAAW,cAAc;IAC3B,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,kBAAkB,IAAI,aAAa,EAAE,CAAC;IACtC,wBAAwB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IAC1F,4BAA4B,CACxB,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,uBAAuB,GACzC,OAAO,CAAC,eAAe,CAAC,CAAC;IAC5B,SAAS,CACL,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,yBAAyB,EAAE,aAAa,CAAC,EACxF,iBAAiB,CAAC,EAAE,OAAO,wCAAwC,EAAE,kBAAkB,GAAG,OAAO,kDAAkD,EAAE,4BAA4B,GAAG,IAAI,GACzL,eAAe,CAAC;IACnB,aAAa,IAAI,WAAW,CAAC;IAC7B,WAAW,IAAI,SAAS,CAAC;IACzB,aAAa,CAAC,MAAM,EAAE,iBAAiB,GAAG,WAAW,CAAC;CACzD"}
1
+ {"version":3,"file":"onlinePageView.d.ts","sourceRoot":"","sources":["../../../src/models/pageViews/onlinePageView.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC/G,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAErF,MAAM,MAAM,4BAA4B,GAAG;IACvC,4EAA4E;IAC5E,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;CACtD,CAAC;AAEF,qFAAqF;AACrF,MAAM,MAAM,uBAAuB,GAAG,MAAM,CAAC,MAAM,EAAE,4BAA4B,CAAC,CAAC;AAEnF,MAAM,WAAW,cAAc;IAC3B,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,mBAAmB,IAAI,uBAAuB,CAAC;IAC/C,kBAAkB,IAAI,aAAa,EAAE,CAAC;IACtC,wBAAwB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IAC1F,4BAA4B,CACxB,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,uBAAuB,GACzC,OAAO,CAAC,eAAe,CAAC,CAAC;IAC5B,SAAS,CACL,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,yBAAyB,EAAE,aAAa,CAAC,EACxF,iBAAiB,CAAC,EAAE,OAAO,wCAAwC,EAAE,kBAAkB,GAAG,OAAO,kDAAkD,EAAE,4BAA4B,GAAG,IAAI,GACzL,eAAe,CAAC;IACnB,aAAa,IAAI,WAAW,CAAC;IAC7B,WAAW,IAAI,SAAS,CAAC;IACzB,aAAa,CAAC,MAAM,EAAE,iBAAiB,GAAG,WAAW,CAAC;CACzD"}
@@ -8,7 +8,6 @@ import { SavedPage } from '../mobile/savedPage';
8
8
  import { ImageVersions } from '../mobile/imageVersions';
9
9
  import { OnlinePagePreview } from '../previews/onlinePagePreview';
10
10
  import { OfflineRopewikiPageView } from './offlineRopewikiPageView';
11
- import { OnlinePageView } from './onlinePageView';
12
11
  import { RopewikiPageView } from './ropewikiPageView';
13
12
  import { RouteType } from '../routes/routeType';
14
13
  import { RopewikiVehicleType } from '../ropewikiVehicleType';
@@ -16,6 +15,7 @@ import { DownloadJob } from '../../download/downloadJob';
16
15
  import { DownloadPhase } from '../../download/downloadPhase';
17
16
  import type { DownloadJobConfig, DownloadPlatformHarness, DownloadTaskDependency } from '../../download/types';
18
17
  import type { OfflinePageView } from './offlinePageView';
18
+ import { type OnlineBetaSectionLookup, OnlinePageView } from './onlinePageView';
19
19
  export declare class OnlineRopewikiPageView extends RopewikiPageView implements OnlinePageView {
20
20
  readonly fetchType: "online";
21
21
  bannerImage: OnlineBetaSectionImage | null;
@@ -44,6 +44,7 @@ export declare class OnlineRopewikiPageView extends RopewikiPageView implements
44
44
  lat: number;
45
45
  lon: number;
46
46
  } | null, downloadFolder?: string | null);
47
+ toBetaSectionLookup(): OnlineBetaSectionLookup;
47
48
  planDownloadPhases(): DownloadPhase[];
48
49
  getDependenciesForPhases(phases: DownloadPhase[]): Record<string, DownloadTaskDependency>;
49
50
  toOfflineFromExtractedBundle(pageRoot: string, platformHarness: DownloadPlatformHarness): Promise<OfflinePageView>;
@@ -1 +1 @@
1
- {"version":3,"file":"onlineRopewikiPageView.d.ts","sourceRoot":"","sources":["../../../src/models/pageViews/onlineRopewikiPageView.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"onlineRopewikiPageView.d.ts","sourceRoot":"","sources":["../../../src/models/pageViews/onlineRopewikiPageView.ts"],"names":[],"mappings":"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"}
@@ -36,6 +36,7 @@ const saveOfflinePageTask_1 = require("../../download/tasks/saveOfflinePageTask"
36
36
  const saveOfflinePageViewTaskDependency_1 = require("../../download/dependencies/saveOfflinePageViewTaskDependency");
37
37
  const downloadConstants_1 = require("../../download/helpers/downloadConstants");
38
38
  const offlinePageBundlePaths_1 = require("../../helpers/offlinePageBundlePaths");
39
+ const lodash_1 = require("lodash");
39
40
  class OnlineRopewikiPageView extends ropewikiPageView_1.RopewikiPageView {
40
41
  constructor(id, routeType, name, aka, url, quality, userVotes, regions, difficultyRating, permit, rappelCount, jumps, vehicle, rappelLongestFeet, shuttleTimeMinutes, overallLengthMiles, descentLengthMiles, exitLengthMiles, approachLengthMiles, overallTimeHours, approachTimeHours, descentTimeHours, exitTimeHours, approachElevGainFeet, descentElevGainFeet, exitElevGainFeet, months, latestRevisionDate, bannerImage, betaSections, miniMap, coordinates, downloadFolder = null) {
41
42
  super(id, routeType, name, aka, url, quality, userVotes, regions, difficultyRating, permit, ropewikiPageView_1.RopewikiPageView.coerceRappelCount(rappelCount), jumps, vehicle, lengthMeasurement_1.LengthMeasurement.coerce(rappelLongestFeet, lengthMeasurement_1.FEET), timeMeasurement_1.TimeMeasurement.coerce(shuttleTimeMinutes, timeMeasurement_1.MINUTES), lengthMeasurement_1.LengthMeasurement.coerce(overallLengthMiles, lengthMeasurement_1.MILES), lengthMeasurement_1.LengthMeasurement.coerce(descentLengthMiles, lengthMeasurement_1.MILES), lengthMeasurement_1.LengthMeasurement.coerce(exitLengthMiles, lengthMeasurement_1.MILES), lengthMeasurement_1.LengthMeasurement.coerce(approachLengthMiles, lengthMeasurement_1.MILES), ropewikiPageView_1.RopewikiPageView.coerceTimeOrRange(overallTimeHours, timeMeasurement_1.HOURS), ropewikiPageView_1.RopewikiPageView.coerceTimeOrRange(approachTimeHours, timeMeasurement_1.HOURS), ropewikiPageView_1.RopewikiPageView.coerceTimeOrRange(descentTimeHours, timeMeasurement_1.HOURS), ropewikiPageView_1.RopewikiPageView.coerceTimeOrRange(exitTimeHours, timeMeasurement_1.HOURS), lengthMeasurement_1.LengthMeasurement.coerce(approachElevGainFeet, lengthMeasurement_1.FEET), lengthMeasurement_1.LengthMeasurement.coerce(descentElevGainFeet, lengthMeasurement_1.FEET), lengthMeasurement_1.LengthMeasurement.coerce(exitElevGainFeet, lengthMeasurement_1.FEET), months, latestRevisionDate, coordinates);
@@ -45,6 +46,20 @@ class OnlineRopewikiPageView extends ropewikiPageView_1.RopewikiPageView {
45
46
  this.miniMap = miniMap;
46
47
  this.downloadFolder = downloadFolder;
47
48
  }
49
+ toBetaSectionLookup() {
50
+ const identifiedSections = this.betaSections.filter((section) => section.id != null);
51
+ const lookup = (0, lodash_1.mapValues)((0, lodash_1.keyBy)(identifiedSections, (section) => section.id), (section) => ({
52
+ section,
53
+ imagesById: (0, lodash_1.keyBy)(section.images, (image) => image.id),
54
+ }));
55
+ if (this.bannerImage != null) {
56
+ lookup[''] = {
57
+ section: null,
58
+ imagesById: { [this.bannerImage.id]: this.bannerImage },
59
+ };
60
+ }
61
+ return lookup;
62
+ }
48
63
  planDownloadPhases() {
49
64
  if (this.hasBundleDownloadFolder()) {
50
65
  return this.planBundleDownloadPhases();
@@ -153,9 +168,9 @@ class OnlineRopewikiPageView extends ropewikiPageView_1.RopewikiPageView {
153
168
  }
154
169
  return versions;
155
170
  };
156
- const toOfflineImage = (image) => image.toOffline(getVersions(image.id)[imageVersions_1.ImageVersion.banner] ?? null, getVersions(image.id)[imageVersions_1.ImageVersion.full] ?? null);
171
+ const toOfflineImage = (image) => image.toOffline(getVersions(image.id)[imageVersions_1.ImageVersion.banner] ?? null, getVersions(image.id)[imageVersions_1.ImageVersion.full] ?? null, getVersions(image.id)[imageVersions_1.ImageVersion.preview] ?? null);
157
172
  const offlineBannerImage = this.bannerImage == null ? null : toOfflineImage(this.bannerImage);
158
- const offlineSections = this.betaSections.map((section) => new offlineBetaSection_1.OfflineBetaSection(section.order, section.title, section.text, section.latestRevisionDate, section.images.map((image) => toOfflineImage(image))));
173
+ const offlineSections = this.betaSections.map((section) => new offlineBetaSection_1.OfflineBetaSection(section.order, section.title, section.text, section.latestRevisionDate, section.images.map((image) => toOfflineImage(image)), section.id));
159
174
  let offlineMiniMap = null;
160
175
  if (this.miniMap != null) {
161
176
  if (downloadedMiniMap == null) {
@@ -189,6 +204,7 @@ class OnlineRopewikiPageView extends ropewikiPageView_1.RopewikiPageView {
189
204
  throw new Error(`OnlineRopewikiPageView.betaSections must be an array, got: ${typeof r.betaSections}`);
190
205
  }
191
206
  r.betaSections = r.betaSections.map((item) => betaSection_1.BetaSection.fromResponseBody(item, 'online'));
207
+ ropewikiPageView_1.RopewikiPageView.assertUniqueBetaSectionIds(r.betaSections, 'OnlineRopewikiPageView');
192
208
  if (r.miniMap == null) {
193
209
  r.miniMap = null;
194
210
  }
@@ -299,7 +315,7 @@ class OnlineRopewikiPageView extends ropewikiPageView_1.RopewikiPageView {
299
315
  const slots = [];
300
316
  const collect = (image) => {
301
317
  const versions = {
302
- preview: image.bannerUrl,
318
+ preview: image.previewUrl,
303
319
  banner: image.bannerUrl,
304
320
  full: image.fullUrl,
305
321
  };
@@ -337,6 +353,7 @@ class OnlineRopewikiPageView extends ropewikiPageView_1.RopewikiPageView {
337
353
  return info.exists ? absolutePath : null;
338
354
  };
339
355
  downloadedImageVersions[slot.imageId] = new imageVersions_1.ImageVersions({
356
+ preview: await resolveVersion(imageVersions_1.ImageVersion.preview, slot.versions.preview),
340
357
  banner: await resolveVersion(imageVersions_1.ImageVersion.banner, slot.versions.banner),
341
358
  full: await resolveVersion(imageVersions_1.ImageVersion.full, slot.versions.full),
342
359
  });
@@ -70,6 +70,9 @@ export declare abstract class RopewikiPageView {
70
70
  protected static assertString(obj: Record<string, unknown>, key: string): void;
71
71
  protected static assertNullableString(obj: Record<string, unknown>, key: string): void;
72
72
  protected static rejectLegacyTopLevelMapDataId(r: Record<string, unknown>, context: string): void;
73
+ protected static assertUniqueBetaSectionIds(sections: {
74
+ id: string | null;
75
+ }[], context: string): void;
73
76
  protected static parseCoordinateComponent(value: unknown): number | null;
74
77
  protected static assertNullableCoordinates(obj: Record<string, unknown>, key: string): void;
75
78
  protected static assertNumber(obj: Record<string, unknown>, key: string): void;
@@ -1 +1 @@
1
- {"version":3,"file":"ropewikiPageView.d.ts","sourceRoot":"","sources":["../../../src/models/pageViews/ropewikiPageView.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ropewikiPageView.d.ts","sourceRoot":"","sources":["../../../src/models/pageViews/ropewikiPageView.ts"],"names":[],"mappings":"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"}
@@ -181,6 +181,17 @@ class RopewikiPageView {
181
181
  throw new Error(`${context} must not include top-level mapDataId; set mapDataId on page minimaps instead`);
182
182
  }
183
183
  }
184
+ static assertUniqueBetaSectionIds(sections, context) {
185
+ const seen = new Set();
186
+ for (const section of sections) {
187
+ if (section.id == null)
188
+ continue;
189
+ if (seen.has(section.id)) {
190
+ throw new Error(`Duplicate beta-section id in ${context}: ${section.id}`);
191
+ }
192
+ seen.add(section.id);
193
+ }
194
+ }
184
195
  static parseCoordinateComponent(value) {
185
196
  if (typeof value === 'number' && Number.isFinite(value)) {
186
197
  return value;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ropegeo-common",
3
- "version": "1.21.0",
3
+ "version": "1.22.0",
4
4
  "description": "Shared domain models and helpers for RopeGeo and WebScraper",
5
5
  "license": "ISC",
6
6
  "repository": {
@@ -53,6 +53,7 @@
53
53
  "@aws-sdk/client-sqs": "^3.971.0",
54
54
  "@testing-library/react": "^16.3.2",
55
55
  "@types/jest": "^29.5.14",
56
+ "@types/lodash": "^4.17.24",
56
57
  "@types/node": "^22.10.0",
57
58
  "@types/react": "^19.0.0",
58
59
  "@types/react-dom": "^19.2.3",
@@ -66,5 +67,8 @@
66
67
  },
67
68
  "files": [
68
69
  "dist"
69
- ]
70
+ ],
71
+ "dependencies": {
72
+ "lodash": "^4.18.1"
73
+ }
70
74
  }