{"version":3,"file":"myrmidon-cadmus-part-lexicography-word-collocations.mjs","sources":["../../../../projects/myrmidon/cadmus-part-lexicography-word-collocations/src/lib/lex-word-collocations-part.ts","../../../../projects/myrmidon/cadmus-part-lexicography-word-collocations/src/lib/components/word-colloc-literal-editor/word-colloc-literal-editor.ts","../../../../projects/myrmidon/cadmus-part-lexicography-word-collocations/src/lib/components/word-colloc-literal-editor/word-colloc-literal-editor.html","../../../../projects/myrmidon/cadmus-part-lexicography-word-collocations/src/lib/components/word-colloc-example-editor/word-colloc-example-editor.ts","../../../../projects/myrmidon/cadmus-part-lexicography-word-collocations/src/lib/components/word-colloc-example-editor/word-colloc-example-editor.html","../../../../projects/myrmidon/cadmus-part-lexicography-word-collocations/src/lib/components/word-colloc-token-editor/word-colloc-token-editor.ts","../../../../projects/myrmidon/cadmus-part-lexicography-word-collocations/src/lib/components/word-colloc-token-editor/word-colloc-token-editor.html","../../../../projects/myrmidon/cadmus-part-lexicography-word-collocations/src/lib/components/word-colloc-editor/word-colloc-editor.ts","../../../../projects/myrmidon/cadmus-part-lexicography-word-collocations/src/lib/components/word-colloc-editor/word-colloc-editor.html","../../../../projects/myrmidon/cadmus-part-lexicography-word-collocations/src/lib/services/word-collocation-parser.ts","../../../../projects/myrmidon/cadmus-part-lexicography-word-collocations/src/lib/pipes/word-collocation.pipe.ts","../../../../projects/myrmidon/cadmus-part-lexicography-word-collocations/src/lib/components/lex-word-collocations-part-editor/lex-word-collocations-part-editor.ts","../../../../projects/myrmidon/cadmus-part-lexicography-word-collocations/src/lib/components/lex-word-collocations-part-editor/lex-word-collocations-part-editor.html","../../../../projects/myrmidon/cadmus-part-lexicography-word-collocations/src/lib/components/lex-word-collocations-part-feature/lex-word-collocations-part-feature.ts","../../../../projects/myrmidon/cadmus-part-lexicography-word-collocations/src/lib/components/lex-word-collocations-part-feature/lex-word-collocations-part-feature.html","../../../../projects/myrmidon/cadmus-part-lexicography-word-collocations/src/public-api.ts","../../../../projects/myrmidon/cadmus-part-lexicography-word-collocations/src/myrmidon-cadmus-part-lexicography-word-collocations.ts"],"sourcesContent":["import { Part } from '@myrmidon/cadmus-core';\r\n\r\n/**\r\n * A token in a word collocation pattern.\r\n */\r\nexport interface WordCollocationToken {\r\n  pos: string;\r\n  features?: string[];\r\n  isHead?: boolean;\r\n  isOptional?: boolean;\r\n  note?: string;\r\n}\r\n\r\n/**\r\n * A literal instance of a collocation pattern token.\r\n */\r\nexport interface WordCollocationLiteral {\r\n  value: string;\r\n  tag?: string;\r\n  note?: string;\r\n}\r\n\r\n/**\r\n * An example of a word collocation pattern.\r\n */\r\nexport interface WordCollocationExample {\r\n  tokenNr: number;  // 0 for connective text, 1..n for tokens\r\n  literals: WordCollocationLiteral[];\r\n}\r\n\r\n/**\r\n * A words collocation pattern. This is a sequence of tokens, each\r\n * representing the word class (part of speech) for each word building\r\n * the collocation pattern. For example, a collocation like\r\n * \"strong tea\" would have the pattern ADJ+NOUN. Usually one word in the\r\n * pattern is the head token, because it is the lexical entry word\r\n * including this collocation. So, if the lexical entry word is \"tea\",\r\n * then the 2nd token (NOUN) is the head.\r\n * Examples then provide real-world sentences illustrating the use\r\n * of the collocation. These include 1 literal per token (each having the\r\n * ordinal number of the token it refers to in the pattern), plus eventual\r\n * connective text represented by literals whose token number is 0.\r\n */\r\nexport interface WordCollocation {\r\n  rank?: number;\r\n  tokens: WordCollocationToken[];\r\n  examples?: WordCollocationExample[];\r\n  note?: string;\r\n}\r\n\r\n/**\r\n * The LexWordCollocations part model.\r\n */\r\nexport interface LexWordCollocationsPart extends Part {\r\n  collocations: WordCollocation[];\r\n}\r\n\r\n/**\r\n * The type ID used to identify the LexWordCollocationsPart type.\r\n */\r\nexport const LEX_WORD_COLLOCATIONS_PART_TYPEID = 'it.vedph.lexicography.word-collocations';\r\n\r\n/**\r\n * JSON schema for the LexWordCollocations part.\r\n * You can use the JSON schema tool at https://jsonschema.net/.\r\n */\r\nexport const LEX_WORD_COLLOCATIONS_PART_SCHEMA = {\r\n  $schema: 'http://json-schema.org/draft-07/schema#',\r\n  $id: 'www.vedph.it/cadmus/parts/lexicography/' + LEX_WORD_COLLOCATIONS_PART_TYPEID + '.json',\r\n  type: 'object',\r\n  title: 'LexWordCollocationsPart',\r\n  required: [\r\n    'id',\r\n    'itemId',\r\n    'typeId',\r\n    'timeCreated',\r\n    'creatorId',\r\n    'timeModified',\r\n    'userId',\r\n    'collocations',\r\n  ],\r\n  properties: {\r\n    timeCreated: {\r\n      type: 'string',\r\n      pattern: '^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}.\\\\d+Z$',\r\n    },\r\n    creatorId: {\r\n      type: 'string',\r\n    },\r\n    timeModified: {\r\n      type: 'string',\r\n      pattern: '^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}.\\\\d+Z$',\r\n    },\r\n    userId: {\r\n      type: 'string',\r\n    },\r\n    id: {\r\n      type: 'string',\r\n      pattern: '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$',\r\n    },\r\n    itemId: {\r\n      type: 'string',\r\n      pattern: '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$',\r\n    },\r\n    typeId: {\r\n      type: 'string',\r\n      pattern: '^[a-z][-0-9a-z._]*$',\r\n    },\r\n    roleId: {\r\n      type: ['string', 'null'],\r\n      pattern: '^([a-z][-0-9a-z._]*)?$',\r\n    },\r\n\r\n    collocations: {\r\n      type: 'array',\r\n      items: {\r\n        type: 'object',\r\n        required: ['tokens'],\r\n        properties: {\r\n          rank: {\r\n            type: 'integer',\r\n          },\r\n          tokens: {\r\n            type: 'array',\r\n            items: { $ref: '#/definitions/token' },\r\n            minItems: 1,\r\n          },\r\n          examples: {\r\n            type: 'array',\r\n            items: { $ref: '#/definitions/example' },\r\n          },\r\n          note: {\r\n            type: 'string',\r\n          },\r\n        },\r\n        additionalProperties: false,\r\n      },\r\n    },\r\n  },\r\n  definitions: {\r\n    token: {\r\n      type: 'object',\r\n      required: ['pos'],\r\n      properties: {\r\n        pos: { type: 'string' },\r\n        features: {\r\n          type: 'array',\r\n          items: { type: 'string' },\r\n        },\r\n        isHead: { type: 'boolean' },\r\n        isOptional: { type: 'boolean' },\r\n        note: { type: 'string' },\r\n      },\r\n      additionalProperties: false,\r\n    },\r\n    literal: {\r\n      type: 'object',\r\n      required: ['value'],\r\n      properties: {\r\n        value: { type: 'string' },\r\n        tag: { type: 'string' },\r\n        note: { type: 'string' },\r\n      },\r\n      additionalProperties: false,\r\n    },\r\n    example: {\r\n      type: 'object',\r\n      required: ['tokenNr', 'literals'],\r\n      properties: {\r\n        tokenNr: { type: 'integer' },\r\n        literals: {\r\n          type: 'array',\r\n          items: { $ref: '#/definitions/literal' },\r\n          minItems: 1,\r\n        },\r\n      },\r\n      additionalProperties: false,\r\n    },\r\n  },\r\n  additionalProperties: false,\r\n};\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, OnInit, effect, input, model, output } from '@angular/core';\r\nimport {\r\n  FormBuilder,\r\n  FormControl,\r\n  FormGroup,\r\n  ReactiveFormsModule,\r\n  Validators,\r\n} from '@angular/forms';\r\n\r\n// material\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { ThesaurusEntry } from '@myrmidon/cadmus-core';\r\nimport { ThesEntriesPickerComponent } from '@myrmidon/cadmus-ui';\r\n\r\nimport { WordCollocationLiteral } from '../../lex-word-collocations-part';\r\n\r\n/**\r\n * Word collocation literal editor.\r\n */\r\n@Component({\r\n  selector: 'cadmus-word-colloc-literal-editor',\r\n  imports: [\r\n    CommonModule,\r\n    ReactiveFormsModule,\r\n    MatButtonModule,\r\n    MatCheckboxModule,\r\n    MatFormFieldModule,\r\n    MatIconModule,\r\n    MatInputModule,\r\n    MatSelectModule,\r\n    MatTooltipModule,\r\n    ThesEntriesPickerComponent,\r\n  ],\r\n  templateUrl: './word-colloc-literal-editor.html',\r\n  styleUrl: './word-colloc-literal-editor.css',\r\n})\r\nexport class WordCollocLiteralEditor {\r\n  public readonly literal = model<WordCollocationLiteral | undefined>();\r\n  // lex-word-cliteral-tags\r\n  public readonly tagEntries = input<ThesaurusEntry[] | undefined>();\r\n\r\n  public readonly cancelEdit = output();\r\n\r\n  public value: FormControl<string>;\r\n  public tag: FormControl<ThesaurusEntry | null>;\r\n  public note: FormControl<string | null>;\r\n  public form: FormGroup;\r\n\r\n  constructor(formBuilder: FormBuilder) {\r\n    // form\r\n    this.value = formBuilder.control('', {\r\n      validators: [Validators.required, Validators.maxLength(100)],\r\n      nonNullable: true,\r\n    });\r\n    this.tag = formBuilder.control(null);\r\n    this.note = formBuilder.control(null, {\r\n      validators: Validators.maxLength(1000),\r\n    });\r\n    this.form = formBuilder.group({\r\n      value: this.value,\r\n      tag: this.tag,\r\n      note: this.note,\r\n    });\r\n\r\n    // when model changes, update form\r\n    effect(() => {\r\n      const data = this.literal();\r\n      this.updateForm(data);\r\n    });\r\n  }\r\n\r\n  public mapIdToEntry(\r\n    id: string | null,\r\n    entries: ThesaurusEntry[] | undefined\r\n  ): ThesaurusEntry | null {\r\n    if (!id) return null;\r\n    if (!entries) return { id, value: id };\r\n    return entries.find((e) => e.id === id) || { id, value: id };\r\n  }\r\n\r\n  private updateForm(data: WordCollocationLiteral | undefined | null): void {\r\n    if (!data) {\r\n      this.form.reset();\r\n    } else {\r\n      this.value.setValue(data.value);\r\n      this.tag.setValue(data.tag ? this.mapIdToEntry(data.tag, this.tagEntries()) || null : null);\r\n      this.note.setValue(data.note || null);\r\n      this.form.markAsPristine();\r\n    }\r\n  }\r\n\r\n  private getData(): WordCollocationLiteral {\r\n    return {\r\n      value: this.value.value.trim(),\r\n      tag: this.tag.value?.id || undefined,\r\n      note: this.note.value?.trim() || undefined,\r\n    };\r\n  }\r\n\r\n  public cancel(): void {\r\n    this.cancelEdit.emit();\r\n  }\r\n\r\n  /**\r\n   * Saves the current form data by updating the `data` model signal.\r\n   * This method can be called manually (e.g., by a Save button) or\r\n   * automatically (via auto-save).\r\n   * @param pristine If true (default), the form is marked as pristine\r\n   * after saving.\r\n   * Set to false for auto-save if you want the form to remain dirty.\r\n   */\r\n  public save(pristine = true): void {\r\n    if (this.form.invalid) {\r\n      // show validation errors\r\n      this.form.markAllAsTouched();\r\n      return;\r\n    }\r\n\r\n    const data = this.getData();\r\n    this.literal.set(data);\r\n\r\n    if (pristine) {\r\n      this.form.markAsPristine();\r\n    }\r\n  }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"save()\">\r\n  <!-- value -->\r\n  <div>\r\n    <mat-form-field>\r\n      <mat-label>value</mat-label>\r\n      <input matInput [formControl]=\"value\" />\r\n      @if ($any(value).errors?.required && (value.dirty || value.touched)) {\r\n      <mat-error>value required</mat-error>\r\n      } @if ($any(value).errors?.maxLength && (value.dirty || value.touched)) {\r\n      <mat-error>value too long</mat-error>\r\n      }\r\n    </mat-form-field>\r\n  </div>\r\n\r\n  <!-- tag -->\r\n  <div>\r\n    @if (tagEntries()?.length) {\r\n    <cadmus-thes-entries-picker\r\n      [availableEntries]=\"tagEntries()!\"\r\n      [entries]=\"tag.value ? [tag.value!] : []\"\r\n      [hierarchicLabels]=\"true\"\r\n      [minEntries]=\"1\"\r\n      [maxEntries]=\"1\"\r\n    />\r\n    } @else {\r\n    <mat-form-field>\r\n      <mat-label>tag</mat-label>\r\n      <input matInput [formControl]=\"tag\" />\r\n      @if ($any(tag).errors?.maxLength && (tag.dirty || tag.touched)) {\r\n      <mat-error>tag too long</mat-error>\r\n      }\r\n    </mat-form-field>\r\n    }\r\n  </div>\r\n\r\n  <!-- note -->\r\n  <div>\r\n    <mat-form-field class=\"long-text\">\r\n      <mat-label>note</mat-label>\r\n      <textarea matInput [formControl]=\"note\" rows=\"3\"></textarea>\r\n      @if ($any(note).errors?.maxLength && (note.dirty || note.touched)) {\r\n      <mat-error>note too long</mat-error>\r\n      }\r\n    </mat-form-field>\r\n  </div>\r\n\r\n  <!-- buttons -->\r\n  <div>\r\n    <button type=\"button\" mat-icon-button matTooltip=\"Discard changes\" (click)=\"cancel()\">\r\n      <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n    </button>\r\n    <button\r\n      type=\"submit\"\r\n      mat-icon-button\r\n      matTooltip=\"Accept changes\"\r\n      [disabled]=\"form.invalid || form.pristine\"\r\n    >\r\n      <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n    </button>\r\n  </div>\r\n</form>\r\n","import { Component, computed, input, linkedSignal, model, output, signal } from '@angular/core';\r\nimport { FormControl, ReactiveFormsModule, Validators } from '@angular/forms';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\n\r\nimport { MatIconButton } from '@angular/material/button';\r\nimport {\r\n  MatExpansionPanel,\r\n  MatExpansionPanelHeader,\r\n  MatExpansionPanelTitle,\r\n} from '@angular/material/expansion';\r\nimport { MatFormField, MatLabel, MatError } from '@angular/material/form-field';\r\nimport { MatTooltip } from '@angular/material/tooltip';\r\nimport { MatIcon } from '@angular/material/icon';\r\nimport { MatInput } from '@angular/material/input';\r\n\r\nimport { FlatLookupPipe } from '@myrmidon/ngx-tools';\r\nimport { DialogService } from '@myrmidon/ngx-mat-tools';\r\nimport { ThesaurusEntry } from '@myrmidon/cadmus-core';\r\n\r\nimport { WordCollocationExample, WordCollocationLiteral } from '../../lex-word-collocations-part';\r\nimport { WordCollocLiteralEditor } from '../word-colloc-literal-editor/word-colloc-literal-editor';\r\n\r\n/**\r\n * Word collocation example editor component.\r\n */\r\n@Component({\r\n  selector: 'cadmus-word-colloc-example-editor',\r\n  imports: [\r\n    ReactiveFormsModule,\r\n    MatExpansionPanel,\r\n    MatExpansionPanelHeader,\r\n    MatExpansionPanelTitle,\r\n    MatFormField,\r\n    MatIcon,\r\n    MatIconButton,\r\n    MatInput,\r\n    MatLabel,\r\n    MatTooltip,\r\n    MatError,\r\n    FlatLookupPipe,\r\n    WordCollocLiteralEditor,\r\n  ],\r\n  templateUrl: './word-colloc-example-editor.html',\r\n  styleUrl: './word-colloc-example-editor.css',\r\n})\r\nexport class WordCollocExampleEditor {\r\n  /**\r\n   * Maximum token number. When 0 no limit is set.\r\n   */\r\n  public readonly maxTokenNr = input<number>(0);\r\n  /**\r\n   * The lex-word-cliteral-tags thesaurus entries.\r\n   */\r\n  public readonly tagEntries = input<ThesaurusEntry[] | undefined>(undefined);\r\n  /**\r\n   * The example to edit.\r\n   */\r\n  public readonly example = model<WordCollocationExample>({ tokenNr: 1, literals: [] });\r\n\r\n  public readonly literals = computed<WordCollocationLiteral[]>(() => this.example().literals);\r\n  public readonly editedLiterals = linkedSignal<WordCollocationLiteral[]>(this.literals);\r\n  public readonly edited = signal<WordCollocationLiteral | undefined>(undefined);\r\n  public readonly editedIndex = signal<number>(-1);\r\n  public readonly dirty = signal<boolean>(false);\r\n\r\n  /**\r\n   * Event emitted when the edit is cancelled.\r\n   */\r\n  public readonly cancelEdit = output();\r\n\r\n  public tokenNr: FormControl<number>;\r\n\r\n  constructor(private _dialogService: DialogService) {\r\n    this.tokenNr = new FormControl<number>(this.example().tokenNr, {\r\n      nonNullable: true,\r\n      validators: [Validators.min(1)],\r\n    });\r\n\r\n    // if maxTokenNr > 0, add max validator\r\n    if (this.maxTokenNr() > 0) {\r\n      this.tokenNr.addValidators(Validators.max(this.maxTokenNr()));\r\n    }\r\n\r\n    // when tokenNr changes, set dirty\r\n    this.tokenNr.valueChanges.pipe(takeUntilDestroyed()).subscribe(() => {\r\n      this.dirty.set(true);\r\n    });\r\n  }\r\n\r\n  public addLiteral(): void {\r\n    const literal: WordCollocationLiteral = {\r\n      value: '',\r\n    };\r\n    this.editedIndex.set(-1);\r\n    this.edited.set(literal);\r\n  }\r\n\r\n  public editLiteral(literal: WordCollocationLiteral, index: number): void {\r\n    this.editedIndex.set(index);\r\n    this.edited.set(structuredClone(literal));\r\n  }\r\n\r\n  public closeLiteral(): void {\r\n    this.editedIndex.set(-1);\r\n    this.edited.set(undefined);\r\n  }\r\n\r\n  public saveLiteral(literal: WordCollocationLiteral): void {\r\n    const literals = [...this.editedLiterals()];\r\n    if (this.editedIndex() === -1) {\r\n      literals.push(literal);\r\n    } else {\r\n      literals.splice(this.editedIndex(), 1, literal);\r\n    }\r\n    this.editedLiterals.set(literals);\r\n    this.closeLiteral();\r\n    this.dirty.set(true);\r\n  }\r\n\r\n  public deleteLiteral(index: number): void {\r\n    this._dialogService\r\n      .confirm('Confirmation', 'Delete literal?')\r\n      .subscribe((yes: boolean | undefined) => {\r\n        if (yes) {\r\n          if (this.editedIndex() === index) {\r\n            this.closeLiteral();\r\n          }\r\n          const literals = [...this.editedLiterals()];\r\n          literals.splice(index, 1);\r\n          this.editedLiterals.set(literals);\r\n          this.dirty.set(true);\r\n        }\r\n      });\r\n  }\r\n\r\n  public moveLiteralUp(index: number): void {\r\n    if (index < 1) {\r\n      return;\r\n    }\r\n    const literal = this.editedLiterals()[index];\r\n    const literals = [...this.editedLiterals()];\r\n    literals.splice(index, 1);\r\n    literals.splice(index - 1, 0, literal);\r\n    this.editedLiterals.set(literals);\r\n    this.dirty.set(true);\r\n  }\r\n\r\n  public moveLiteralDown(index: number): void {\r\n    if (index + 1 >= this.editedLiterals().length) {\r\n      return;\r\n    }\r\n    const literal = this.editedLiterals()[index];\r\n    const literals = [...this.editedLiterals()];\r\n    literals.splice(index, 1);\r\n    literals.splice(index + 1, 0, literal);\r\n    this.editedLiterals.set(literals);\r\n    this.dirty.set(true);\r\n  }\r\n\r\n  private getExample(): WordCollocationExample {\r\n    return {\r\n      tokenNr: this.tokenNr.value,\r\n      literals: this.editedLiterals(),\r\n    };\r\n  }\r\n\r\n  public cancel(): void {\r\n    this.cancelEdit.emit();\r\n  }\r\n\r\n  public save(): void {\r\n    if (!this.tokenNr.valid || !this.editedLiterals().length) {\r\n      return;\r\n    }\r\n    this.example.set(this.getExample());\r\n    this.tokenNr.markAsPristine();\r\n    this.dirty.set(false);\r\n  }\r\n}\r\n","<form>\r\n  <div class=\"form-row\">\r\n    <!-- nr -->\r\n    <mat-form-field class=\"nr\">\r\n      <mat-label>token nr.</mat-label>\r\n      <input matInput type=\"number\" min=\"1\" [formControl]=\"tokenNr\" />\r\n      @if ($any(tokenNr).errors?.max && (tokenNr.dirty || tokenNr.touched)) {\r\n      <mat-error>nr. max is {{ maxTokenNr() }}</mat-error>\r\n      }\r\n    </mat-form-field>\r\n\r\n    <!-- add button -->\r\n    <button type=\"button\" mat-flat-button class=\"mat-primary\" (click)=\"addLiteral()\">\r\n      <mat-icon>add_circle</mat-icon> literal\r\n    </button>\r\n  </div>\r\n\r\n  <!-- table-->\r\n  @if (literals().length > 0) {\r\n  <table>\r\n    <thead>\r\n      <tr>\r\n        <th></th>\r\n        <th>nr.</th>\r\n        <th>value</th>\r\n        <th>tag</th>\r\n      </tr>\r\n    </thead>\r\n    <tbody>\r\n      @for (literal of literals(); track literal; let i = $index; let first = $first; let last =\r\n      $last) {\r\n      <tr [class.selected]=\"i === editedIndex()\">\r\n        <td class=\"fit-width\">\r\n          <button\r\n            type=\"button\"\r\n            mat-icon-button\r\n            matTooltip=\"Edit this literal\"\r\n            (click)=\"editLiteral(literal, i)\"\r\n          >\r\n            <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n          </button>\r\n          <button\r\n            type=\"button\"\r\n            mat-icon-button\r\n            matTooltip=\"Move this literal up\"\r\n            [disabled]=\"first\"\r\n            (click)=\"moveLiteralUp(i)\"\r\n          >\r\n            <mat-icon>arrow_upward</mat-icon>\r\n          </button>\r\n          <button\r\n            type=\"button\"\r\n            mat-icon-button\r\n            matTooltip=\"Move this literal down\"\r\n            [disabled]=\"last\"\r\n            (click)=\"moveLiteralDown(i)\"\r\n          >\r\n            <mat-icon>arrow_downward</mat-icon>\r\n          </button>\r\n          <button\r\n            type=\"button\"\r\n            mat-icon-button\r\n            matTooltip=\"Delete this literal\"\r\n            (click)=\"deleteLiteral(i)\"\r\n          >\r\n            <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\r\n          </button>\r\n        </td>\r\n        <td>{{ $index + 1 }}.</td>\r\n        <td>{{ literal.value }}</td>\r\n        <td>{{ literal.tag | flatLookup : tagEntries() : 'id' : 'value' }}</td>\r\n      </tr>\r\n      }\r\n    </tbody>\r\n  </table>\r\n  } @if (edited()) {\r\n  <fieldset>\r\n    <mat-expansion-panel [expanded]=\"edited()\" [disabled]=\"!edited()\">\r\n      <mat-expansion-panel-header>\r\n        <mat-panel-title>Literal #{{ editedIndex() + 1 }}</mat-panel-title>\r\n      </mat-expansion-panel-header>\r\n      <cadmus-word-colloc-literal-editor\r\n        [tagEntries]=\"tagEntries()\"\r\n        [literal]=\"edited()\"\r\n        (literalChange)=\"saveLiteral($event!)\"\r\n        (cancelEdit)=\"cancel()\"\r\n      />\r\n    </mat-expansion-panel>\r\n  </fieldset>\r\n  }\r\n  <!-- buttons -->\r\n  <div>\r\n    <button type=\"button\" mat-icon-button matTooltip=\"Discard changes\" (click)=\"cancel()\">\r\n      <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n    </button>\r\n    <button\r\n      type=\"submit\"\r\n      mat-icon-button\r\n      matTooltip=\"Accept changes\"\r\n      [disabled]=\"!editedLiterals().length || !dirty()\"\r\n      (click)=\"save()\"\r\n    >\r\n      <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n    </button>\r\n  </div>\r\n</form>\r\n","import { Component, effect, input, model, output } from '@angular/core';\r\nimport {\r\n  FormBuilder,\r\n  FormControl,\r\n  FormGroup,\r\n  ReactiveFormsModule,\r\n  Validators,\r\n} from '@angular/forms';\r\n\r\nimport { MatIconButton } from '@angular/material/button';\r\nimport { MatIcon } from '@angular/material/icon';\r\nimport { MatCheckbox } from '@angular/material/checkbox';\r\nimport { MatError, MatFormField, MatLabel } from '@angular/material/form-field';\r\nimport { MatInput } from '@angular/material/input';\r\n\r\nimport { ThesaurusEntry, ThesEntriesPickerComponent } from '@myrmidon/cadmus-ui';\r\n\r\nimport { WordCollocationToken } from '../../lex-word-collocations-part';\r\n\r\n@Component({\r\n  selector: 'cadmus-word-colloc-token-editor',\r\n  imports: [\r\n    ReactiveFormsModule,\r\n    MatCheckbox,\r\n    MatError,\r\n    MatFormField,\r\n    MatIconButton,\r\n    MatIcon,\r\n    MatInput,\r\n    MatLabel,\r\n    ThesEntriesPickerComponent,\r\n  ],\r\n  templateUrl: './word-colloc-token-editor.html',\r\n  styleUrl: './word-colloc-token-editor.css',\r\n})\r\nexport class WordCollocTokenEditor {\r\n  public readonly token = model<WordCollocationToken | undefined>();\r\n  public readonly cancelEdit = output();\r\n\r\n  // lex-word-ctoken-pos-tags (required)\r\n  public readonly posEntries = input.required<ThesaurusEntry[] | undefined>();\r\n  // lex-word-ctoken-features\r\n  public readonly featureEntries = input<ThesaurusEntry[] | undefined>();\r\n  // lex-word-cliteral-tags\r\n  public readonly literalTagEntries = input<ThesaurusEntry[] | undefined>();\r\n\r\n  public pos: FormControl<ThesaurusEntry>;\r\n  public features: FormControl<ThesaurusEntry[]>;\r\n  public isHead: FormControl<boolean>;\r\n  public isOptional: FormControl<boolean>;\r\n  public note: FormControl<string | null>;\r\n  public form: FormGroup;\r\n\r\n  constructor(formBuilder: FormBuilder) {\r\n    this.pos = formBuilder.control(\r\n      { id: '', value: '' },\r\n      {\r\n        nonNullable: true,\r\n        validators: Validators.required,\r\n      }\r\n    );\r\n    this.features = formBuilder.control([], {\r\n      nonNullable: true,\r\n    });\r\n    this.isHead = formBuilder.control(false, { nonNullable: true });\r\n    this.isOptional = formBuilder.control(false, { nonNullable: true });\r\n    this.note = formBuilder.control(null, { validators: Validators.maxLength(1000) });\r\n    this.form = formBuilder.group({\r\n      pos: this.pos,\r\n      features: this.features,\r\n      isHead: this.isHead,\r\n      isOptional: this.isOptional,\r\n      note: this.note,\r\n    });\r\n\r\n    // when model changes, update form\r\n    effect(() => {\r\n      const data = this.token();\r\n      this.updateForm(data);\r\n    });\r\n  }\r\n\r\n  private mapIdToEntry(\r\n    id: string | null,\r\n    entries: ThesaurusEntry[] | undefined\r\n  ): ThesaurusEntry | null {\r\n    if (!id) return null;\r\n    if (!entries) return { id, value: id };\r\n    return entries.find((e) => e.id === id) || { id, value: id };\r\n  }\r\n\r\n  private mapIdsToEntries(ids: string[], entries: ThesaurusEntry[] | undefined): ThesaurusEntry[] {\r\n    if (!entries) return ids.map((id) => ({ id, value: id }));\r\n    return ids.map((id) => entries.find((e) => e.id === id) || { id, value: id });\r\n  }\r\n\r\n  private updateForm(data: WordCollocationToken | undefined | null): void {\r\n    if (!data) {\r\n      this.form.reset();\r\n    } else {\r\n      this.pos.setValue(this.mapIdToEntry(data.pos, this.posEntries()) || this.posEntries()?.[0]!);\r\n      this.features.setValue(this.mapIdsToEntries(data.features || [], this.featureEntries()));\r\n      this.isHead.setValue(!!data.isHead);\r\n      this.isOptional.setValue(!!data.isOptional);\r\n      this.note.setValue(data.note || null);\r\n      this.form.markAsPristine();\r\n    }\r\n  }\r\n\r\n  public onPosEntriesChange(entries: ThesaurusEntry[]): void {\r\n    this.pos.setValue(entries[0]);\r\n    this.pos.markAsDirty();\r\n    this.pos.updateValueAndValidity();\r\n  }\r\n\r\n  public onFeaturesChange(entries: ThesaurusEntry[]): void {\r\n    this.features.setValue(entries);\r\n    this.features.markAsDirty();\r\n    this.features.updateValueAndValidity();\r\n  }\r\n\r\n  private getToken(): WordCollocationToken {\r\n    return {\r\n      pos: this.pos.value.id,\r\n      features: this.features.value.map((e) => e.id),\r\n      isHead: this.isHead.value,\r\n      isOptional: this.isOptional.value,\r\n      note: this.note.value?.trim() || undefined,\r\n    };\r\n  }\r\n\r\n  public cancel(): void {\r\n    this.cancelEdit.emit();\r\n  }\r\n\r\n  /**\r\n   * Saves the current form data by updating the `data` model signal.\r\n   * This method can be called manually (e.g., by a Save button) or\r\n   * automatically (via auto-save).\r\n   * @param pristine If true (default), the form is marked as pristine\r\n   * after saving.\r\n   * Set to false for auto-save if you want the form to remain dirty.\r\n   */\r\n  public save(pristine = true): void {\r\n    if (this.form.invalid) {\r\n      // show validation errors\r\n      this.form.markAllAsTouched();\r\n      return;\r\n    }\r\n\r\n    const data = this.getToken();\r\n    this.token.set(data);\r\n\r\n    if (pristine) {\r\n      this.form.markAsPristine();\r\n    }\r\n  }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"save()\">\r\n  <div class=\"form-row\">\r\n    <!-- pos (always bound) -->\r\n    <cadmus-thes-entries-picker\r\n      [availableEntries]=\"posEntries()!\"\r\n      [entries]=\"[this.pos.value]\"\r\n      [hierarchicLabels]=\"true\"\r\n      [minEntries]=\"1\"\r\n      [maxEntries]=\"1\"\r\n      (entriesChange)=\"onPosEntriesChange($event!)\"\r\n    />\r\n    <!-- isHead -->\r\n    <mat-checkbox [formControl]=\"isHead\">head</mat-checkbox>\r\n    <!-- isOptional -->\r\n    <mat-checkbox [formControl]=\"isOptional\">optional</mat-checkbox>\r\n  </div>\r\n  <!-- features -->\r\n  <div>\r\n    @if (featureEntries()?.length) {\r\n    <div>\r\n      <fieldset>\r\n        <legend>features</legend>\r\n        <cadmus-thes-entries-picker\r\n          [availableEntries]=\"featureEntries()!\"\r\n          [entries]=\"features.value\"\r\n          (entriesChange)=\"onFeaturesChange($event!)\"\r\n        />\r\n      </fieldset>\r\n    </div>\r\n    }\r\n  </div>\r\n  <!-- note -->\r\n  <div>\r\n    <mat-form-field class=\"long-text\">\r\n      <mat-label>note</mat-label>\r\n      <textarea matInput [formControl]=\"note\" rows=\"3\"></textarea>\r\n      @if ($any(note).errors?.maxLength && (note.dirty || note.touched)) {\r\n      <mat-error>note too long</mat-error>\r\n      }\r\n    </mat-form-field>\r\n  </div>\r\n  <!-- buttons -->\r\n  <div>\r\n    <button type=\"button\" mat-icon-button matTooltip=\"Discard changes\" (click)=\"cancel()\">\r\n      <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n    </button>\r\n    <button\r\n      type=\"submit\"\r\n      mat-icon-button\r\n      matTooltip=\"Accept changes\"\r\n      [disabled]=\"form.invalid || form.pristine\"\r\n    >\r\n      <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n    </button>\r\n  </div>\r\n</form>\r\n","import { Component, effect, input, model, output, signal } from '@angular/core';\r\nimport {\r\n  FormBuilder,\r\n  FormControl,\r\n  FormGroup,\r\n  ReactiveFormsModule,\r\n  Validators,\r\n} from '@angular/forms';\r\n\r\nimport {\r\n  MatExpansionPanel,\r\n  MatExpansionPanelHeader,\r\n  MatExpansionPanelTitle,\r\n} from '@angular/material/expansion';\r\nimport { MatIconButton } from '@angular/material/button';\r\nimport { MatFormField, MatLabel } from '@angular/material/form-field';\r\nimport { MatIcon } from '@angular/material/icon';\r\nimport { MatInput } from '@angular/material/input';\r\n\r\nimport { EllipsisPipe, FlatLookupPipe, NgxToolsValidators } from '@myrmidon/ngx-tools';\r\nimport { DialogService } from '@myrmidon/ngx-mat-tools';\r\nimport { ThesaurusEntry } from '@myrmidon/cadmus-core';\r\n\r\nimport { WordCollocTokenEditor } from '../word-colloc-token-editor/word-colloc-token-editor';\r\nimport {\r\n  WordCollocation,\r\n  WordCollocationExample,\r\n  WordCollocationToken,\r\n} from '../../lex-word-collocations-part';\r\nimport { WordCollocExampleEditor } from '../word-colloc-example-editor/word-colloc-example-editor';\r\n\r\n@Component({\r\n  selector: 'cadmus-word-colloc-editor',\r\n  imports: [\r\n    ReactiveFormsModule,\r\n    MatExpansionPanel,\r\n    MatExpansionPanelHeader,\r\n    MatExpansionPanelTitle,\r\n    MatFormField,\r\n    MatIcon,\r\n    MatIconButton,\r\n    MatInput,\r\n    MatLabel,\r\n    WordCollocTokenEditor,\r\n    WordCollocExampleEditor,\r\n    FlatLookupPipe,\r\n    EllipsisPipe,\r\n  ],\r\n  templateUrl: './word-colloc-editor.html',\r\n  styleUrl: './word-colloc-editor.css',\r\n})\r\nexport class WordCollocEditor {\r\n  public readonly collocation = model<WordCollocation | undefined>();\r\n  public readonly cancelEdit = output();\r\n\r\n  // lex-word-ctoken-pos-tags (required)\r\n  public readonly tokPosEntries = input.required<ThesaurusEntry[] | undefined>();\r\n  // lex-word-ctoken-features\r\n  public readonly tokFeatureEntries = input<ThesaurusEntry[] | undefined>();\r\n  // lex-word-cliteral-tags\r\n  public readonly litTagEntries = input<ThesaurusEntry[] | undefined>();\r\n\r\n  public readonly editedToken = signal<WordCollocationToken | undefined>(undefined);\r\n  public readonly editedTokenIndex = signal<number>(-1);\r\n\r\n  public readonly editedExample = signal<WordCollocationExample | undefined>(undefined);\r\n  public readonly editedExampleIndex = signal<number>(-1);\r\n\r\n  public rank: FormControl<number>;\r\n  public tokens: FormControl<WordCollocationToken[]>;\r\n  public examples: FormControl<WordCollocationExample[]>;\r\n  public note: FormControl<string | null>;\r\n  public form: FormGroup;\r\n\r\n  constructor(formBuilder: FormBuilder, private _dialogService: DialogService) {\r\n    this.rank = formBuilder.control(0, { nonNullable: true });\r\n    this.tokens = formBuilder.control([], {\r\n      nonNullable: true,\r\n      validators: [NgxToolsValidators.strictMinLengthValidator(1)],\r\n    });\r\n    this.examples = formBuilder.control([], { nonNullable: true });\r\n    this.note = formBuilder.control(null, Validators.maxLength(1000));\r\n    this.form = formBuilder.group({\r\n      rank: this.rank,\r\n      tokens: this.tokens,\r\n      examples: this.examples,\r\n      note: this.note,\r\n    });\r\n\r\n    // when model changes, update form\r\n    effect(() => {\r\n      const data = this.collocation();\r\n      this.updateForm(data);\r\n    });\r\n  }\r\n\r\n  private updateForm(data: WordCollocation | undefined | null): void {\r\n    if (!data) {\r\n      this.form.reset();\r\n    } else {\r\n      this.rank.setValue(data.rank || 0);\r\n      this.tokens.setValue(data.tokens || []);\r\n      this.examples.setValue(data.examples || []);\r\n      this.note.setValue(data.note || null);\r\n      this.form.markAsPristine();\r\n    }\r\n  }\r\n\r\n  private getCollocation(): WordCollocation {\r\n    return {\r\n      rank: this.rank.value || undefined,\r\n      tokens: this.tokens.value,\r\n      examples: this.examples.value.length ? this.examples.value : undefined,\r\n      note: this.note.value || undefined,\r\n    };\r\n  }\r\n\r\n  //#region Tokens\r\n  public addToken(): void {\r\n    const entries: ThesaurusEntry[] = this.tokPosEntries()!;\r\n    const token: WordCollocationToken = {\r\n      pos: entries[0]?.id || '',\r\n    };\r\n    this.editToken(token, -1);\r\n  }\r\n\r\n  public editToken(token: WordCollocationToken, index: number): void {\r\n    this.editedTokenIndex.set(index);\r\n    this.editedToken.set(structuredClone(token));\r\n  }\r\n\r\n  public closeToken(): void {\r\n    this.editedTokenIndex.set(-1);\r\n    this.editedToken.set(undefined);\r\n  }\r\n\r\n  public saveToken(entry: WordCollocationToken): void {\r\n    const entries = [...this.tokens.value];\r\n    if (this.editedTokenIndex() === -1) {\r\n      entries.push(entry);\r\n    } else {\r\n      entries.splice(this.editedTokenIndex(), 1, entry);\r\n    }\r\n    this.tokens.setValue(entries);\r\n    this.tokens.markAsDirty();\r\n    this.tokens.updateValueAndValidity();\r\n    this.closeToken();\r\n  }\r\n\r\n  public deleteToken(index: number): void {\r\n    this._dialogService\r\n      .confirm('Confirmation', 'Delete token?')\r\n      .subscribe((yes: boolean | undefined) => {\r\n        if (yes) {\r\n          if (this.editedTokenIndex() === index) {\r\n            this.closeToken();\r\n          }\r\n          const tokens = [...this.tokens.value];\r\n          tokens.splice(index, 1);\r\n          this.tokens.setValue(tokens);\r\n          this.tokens.markAsDirty();\r\n          this.tokens.updateValueAndValidity();\r\n        }\r\n      });\r\n  }\r\n\r\n  public moveTokenUp(index: number): void {\r\n    if (index < 1) {\r\n      return;\r\n    }\r\n    const token = this.tokens.value[index];\r\n    const tokens = [...this.tokens.value];\r\n    tokens.splice(index, 1);\r\n    tokens.splice(index - 1, 0, token);\r\n    this.tokens.setValue(tokens);\r\n    this.tokens.markAsDirty();\r\n    this.tokens.updateValueAndValidity();\r\n  }\r\n\r\n  public moveTokenDown(index: number): void {\r\n    if (index + 1 >= this.tokens.value.length) {\r\n      return;\r\n    }\r\n    const token = this.tokens.value[index];\r\n    const tokens = [...this.tokens.value];\r\n    tokens.splice(index, 1);\r\n    tokens.splice(index + 1, 0, token);\r\n    this.tokens.setValue(tokens);\r\n    this.tokens.markAsDirty();\r\n    this.tokens.updateValueAndValidity();\r\n  }\r\n  //#endregion\r\n\r\n  //#region Examples\r\n  public addExample(): void {\r\n    const example: WordCollocationExample = {\r\n      tokenNr: this.tokens.value.length + 1,\r\n      literals: [],\r\n    };\r\n    this.editExample(example, -1);\r\n  }\r\n\r\n  public editExample(example: WordCollocationExample, index: number): void {\r\n    this.editedExampleIndex.set(index);\r\n    this.editedExample.set(structuredClone(example));\r\n  }\r\n\r\n  public closeExample(): void {\r\n    this.editedExampleIndex.set(-1);\r\n    this.editedExample.set(undefined);\r\n  }\r\n\r\n  public saveExample(example: WordCollocationExample): void {\r\n    const examples = [...this.examples.value];\r\n    if (this.editedExampleIndex() === -1) {\r\n      examples.push(example);\r\n    } else {\r\n      examples.splice(this.editedExampleIndex(), 1, example);\r\n    }\r\n    this.examples.setValue(examples);\r\n    this.examples.markAsDirty();\r\n    this.examples.updateValueAndValidity();\r\n    this.closeExample();\r\n  }\r\n\r\n  public deleteExample(index: number): void {\r\n    this._dialogService\r\n      .confirm('Confirmation', 'Delete example?')\r\n      .subscribe((yes: boolean | undefined) => {\r\n        if (yes) {\r\n          if (this.editedExampleIndex() === index) {\r\n            this.closeExample();\r\n          }\r\n          const examples = [...this.examples.value];\r\n          examples.splice(index, 1);\r\n          this.examples.setValue(examples);\r\n          this.examples.markAsDirty();\r\n          this.examples.updateValueAndValidity();\r\n        }\r\n      });\r\n  }\r\n\r\n  public moveExampleUp(index: number): void {\r\n    if (index < 1) {\r\n      return;\r\n    }\r\n    const example = this.examples.value[index];\r\n    const examples = [...this.examples.value];\r\n    examples.splice(index, 1);\r\n    examples.splice(index - 1, 0, example);\r\n    this.examples.setValue(examples);\r\n    this.examples.markAsDirty();\r\n    this.examples.updateValueAndValidity();\r\n  }\r\n\r\n  public moveExampleDown(index: number): void {\r\n    if (index + 1 >= this.examples.value.length) {\r\n      return;\r\n    }\r\n    const example = this.examples.value[index];\r\n    const examples = [...this.examples.value];\r\n    examples.splice(index, 1);\r\n    examples.splice(index + 1, 0, example);\r\n    this.examples.setValue(examples);\r\n    this.examples.markAsDirty();\r\n    this.examples.updateValueAndValidity();\r\n  }\r\n  //#endregion\r\n\r\n  public cancel(): void {\r\n    this.cancelEdit.emit();\r\n  }\r\n\r\n  /**\r\n   * Saves the current form data by updating the `data` model signal.\r\n   * This method can be called manually (e.g., by a Save button) or\r\n   * automatically (via auto-save).\r\n   * @param pristine If true (default), the form is marked as pristine\r\n   * after saving.\r\n   * Set to false for auto-save if you want the form to remain dirty.\r\n   */\r\n  public save(pristine = true): void {\r\n    if (this.form.invalid) {\r\n      // show validation errors\r\n      this.form.markAllAsTouched();\r\n      return;\r\n    }\r\n\r\n    const collocation = this.getCollocation();\r\n    this.collocation.set(collocation);\r\n\r\n    if (pristine) {\r\n      this.form.markAsPristine();\r\n    }\r\n  }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"save()\">\r\n  <!-- rank -->\r\n  <mat-form-field>\r\n    <mat-label>rank</mat-label>\r\n    <input matInput type=\"number\" min=\"0\" [formControl]=\"rank\" />\r\n  </mat-form-field>\r\n\r\n  <!-- text -->\r\n  TODO add text with DSL to parse\r\n\r\n  <!-- examples -->\r\n  <div>\r\n    <button type=\"button\" mat-flat-button class=\"mat-primary\" (click)=\"addExample()\">\r\n      <mat-icon>add_circle</mat-icon> example\r\n    </button>\r\n  </div>\r\n  @if (examples.value.length) {\r\n  <table>\r\n    <thead>\r\n      <tr>\r\n        <th></th>\r\n        <th>nr.</th>\r\n        <th>value</th>\r\n      </tr>\r\n    </thead>\r\n    <tbody>\r\n      @for (entry of examples.value; track entry; let i = $index; let first = $first; let last =\r\n      $last) {\r\n      <tr [class.selected]=\"entry === editedExample()\">\r\n        <td class=\"fit-width\">\r\n          <button\r\n            type=\"button\"\r\n            mat-icon-button\r\n            matTooltip=\"Edit this example\"\r\n            (click)=\"editExample(entry, i)\"\r\n          >\r\n            <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n          </button>\r\n          <button\r\n            type=\"button\"\r\n            mat-icon-button\r\n            matTooltip=\"Move this example up\"\r\n            [disabled]=\"first\"\r\n            (click)=\"moveExampleUp(i)\"\r\n          >\r\n            <mat-icon>arrow_upward</mat-icon>\r\n          </button>\r\n          <button\r\n            type=\"button\"\r\n            mat-icon-button\r\n            matTooltip=\"Move this example down\"\r\n            [disabled]=\"last\"\r\n            (click)=\"moveExampleDown(i)\"\r\n          >\r\n            <mat-icon>arrow_downward</mat-icon>\r\n          </button>\r\n          <button\r\n            type=\"button\"\r\n            mat-icon-button\r\n            matTooltip=\"Delete this example\"\r\n            (click)=\"deleteExample(i)\"\r\n          >\r\n            <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\r\n          </button>\r\n        </td>\r\n        <td>{{ entry.tokenNr }}.</td>\r\n        <td>{{ entry.literals.join(' ') | ellipsis }}</td>\r\n      </tr>\r\n      }\r\n    </tbody>\r\n  </table>\r\n  } @if (editedExample()) {\r\n  <fieldset>\r\n    <mat-expansion-panel [expanded]=\"editedExample()\" [disabled]=\"!editedExample()\">\r\n      <mat-expansion-panel-header>\r\n        <mat-panel-title>Example #{{ editedExampleIndex() + 1 }}</mat-panel-title>\r\n      </mat-expansion-panel-header>\r\n      <cadmus-word-colloc-example-editor\r\n        [tagEntries]=\"litTagEntries()\"\r\n        [example]=\"editedExample()!\"\r\n        (exampleChange)=\"saveExample($event!)\"\r\n        (cancelEdit)=\"closeExample()\"\r\n      />\r\n    </mat-expansion-panel>\r\n  </fieldset>\r\n  }\r\n\r\n  <!-- tokens -->\r\n  <div>\r\n    <button type=\"button\" mat-flat-button class=\"mat-primary\" (click)=\"addToken()\">\r\n      <mat-icon>add_circle</mat-icon> token\r\n    </button>\r\n  </div>\r\n  @if (tokens.value.length) {\r\n  <table>\r\n    <thead>\r\n      <tr>\r\n        <th></th>\r\n        <th>nr.</th>\r\n        <th>POS</th>\r\n        <th>features</th>\r\n        <th>opt.</th>\r\n      </tr>\r\n    </thead>\r\n    <tbody>\r\n      @for (entry of tokens.value; track entry; let i = $index; let first = $first; let last =\r\n      $last) {\r\n      <tr [class.selected]=\"entry === editedToken()\" [class.head]=\"entry.isHead\">\r\n        <td class=\"fit-width\">\r\n          <button\r\n            type=\"button\"\r\n            mat-icon-button\r\n            matTooltip=\"Edit this token\"\r\n            (click)=\"editToken(entry, i)\"\r\n          >\r\n            <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n          </button>\r\n          <button\r\n            type=\"button\"\r\n            mat-icon-button\r\n            matTooltip=\"Move this token up\"\r\n            [disabled]=\"first\"\r\n            (click)=\"moveTokenUp(i)\"\r\n          >\r\n            <mat-icon>arrow_upward</mat-icon>\r\n          </button>\r\n          <button\r\n            type=\"button\"\r\n            mat-icon-button\r\n            matTooltip=\"Move this token down\"\r\n            [disabled]=\"last\"\r\n            (click)=\"moveTokenDown(i)\"\r\n          >\r\n            <mat-icon>arrow_downward</mat-icon>\r\n          </button>\r\n          <button\r\n            type=\"button\"\r\n            mat-icon-button\r\n            matTooltip=\"Delete this token\"\r\n            (click)=\"deleteToken(i)\"\r\n          >\r\n            <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\r\n          </button>\r\n        </td>\r\n        <td>{{ i + 1 }}.</td>\r\n        <td>{{ entry.pos | flatLookup : tokPosEntries() : 'id' : 'value' }}</td>\r\n        <td>\r\n          @for (f of entry.features; track f; let first = $first) { @if (!first) { , }\r\n          {{ f | flatLookup : tokFeatureEntries() : 'id' : 'value' }}\r\n          }\r\n        </td>\r\n        <td>\r\n          @if (entry.isOptional) {\r\n          <mat-icon>check_box</mat-icon>\r\n          } @else {\r\n          <mat-icon>check_box_outline_blank</mat-icon>\r\n          }\r\n        </td>\r\n      </tr>\r\n      }\r\n    </tbody>\r\n  </table>\r\n  } @if (editedToken()) {\r\n  <fieldset>\r\n    <mat-expansion-panel [expanded]=\"editedToken()\" [disabled]=\"!editedToken()\">\r\n      <mat-expansion-panel-header>\r\n        <mat-panel-title>Token #{{ editedTokenIndex() + 1 }}</mat-panel-title>\r\n      </mat-expansion-panel-header>\r\n      <cadmus-word-colloc-token-editor\r\n        [posEntries]=\"tokPosEntries()\"\r\n        [featureEntries]=\"tokFeatureEntries()\"\r\n        [literalTagEntries]=\"litTagEntries()\"\r\n        [token]=\"editedToken()\"\r\n        (tokenChange)=\"saveToken($event!)\"\r\n        (cancelEdit)=\"closeToken()\"\r\n      />\r\n    </mat-expansion-panel>\r\n  </fieldset>\r\n  }\r\n\r\n  <!-- buttons -->\r\n  <div>\r\n    <button type=\"button\" mat-icon-button matTooltip=\"Discard changes\" (click)=\"cancel()\">\r\n      <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n    </button>\r\n    <button\r\n      type=\"submit\"\r\n      mat-icon-button\r\n      matTooltip=\"Accept changes\"\r\n      [disabled]=\"form.invalid || form.pristine\"\r\n    >\r\n      <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n    </button>\r\n  </div>\r\n</form>\r\n","import {\r\n  WordCollocation,\r\n  WordCollocationToken,\r\n  WordCollocationExample,\r\n  WordCollocationLiteral,\r\n} from '../lex-word-collocations-part';\r\n\r\nexport interface ResultWrapper<T> {\r\n  value: T;\r\n  error?: string;\r\n}\r\n\r\n/**\r\n * A parser for word collocations.\r\n */\r\nexport class WordCollocationParser {\r\n  /**\r\n   * Parse multiple collocations from text (one per line).\r\n   * @param text The text to parse.\r\n   * @param labelToIdMap Optional map from labels to IDs for POS values.\r\n   */\r\n  static parse(\r\n    text: string,\r\n    labelToIdMap?: { [key: string]: string }\r\n  ): ResultWrapper<WordCollocation[]> {\r\n    if (!text?.trim()) {\r\n      return { value: [], error: 'Input text is empty' };\r\n    }\r\n\r\n    const lines = text\r\n      .split('\\n')\r\n      .map((l) => l.trim())\r\n      .filter((l) => l.length > 0);\r\n    const collocations: WordCollocation[] = [];\r\n    const errors: string[] = [];\r\n\r\n    for (let i = 0; i < lines.length; i++) {\r\n      try {\r\n        const collocation = this.parseSingle(lines[i], labelToIdMap);\r\n        collocations.push(collocation);\r\n      } catch (error) {\r\n        errors.push(`Line ${i + 1}: ${error instanceof Error ? error.message : String(error)}`);\r\n      }\r\n    }\r\n\r\n    return {\r\n      value: collocations,\r\n      error: errors.length > 0 ? errors.join('\\n') : undefined,\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Parse a single collocation from a line.\r\n   * @param line The line to parse.\r\n   * @param labelToIdMap Optional map from labels to IDs for POS values.\r\n   */\r\n  private static parseSingle(\r\n    line: string,\r\n    labelToIdMap?: { [key: string]: string }\r\n  ): WordCollocation {\r\n    let index = 0;\r\n    const original = line;\r\n\r\n    // Parse rank (optional)\r\n    const rank = this.parseRank(line);\r\n    if (rank !== undefined) {\r\n      const rankMatch = line.match(/^\\(\\d+\\)\\s*/);\r\n      if (rankMatch) {\r\n        index = rankMatch[0].length;\r\n        line = line.substring(index);\r\n      }\r\n    }\r\n\r\n    // Parse tokens (required, ends with :)\r\n    const colonIndex = line.indexOf(':');\r\n    if (colonIndex === -1) {\r\n      throw new Error(`Missing ':' separator in \"${original}\"`);\r\n    }\r\n\r\n    const tokensStr = line.substring(0, colonIndex).trim();\r\n    const examplesStr = line.substring(colonIndex + 1).trim();\r\n\r\n    if (!tokensStr) {\r\n      throw new Error(`No tokens found before ':' in \"${original}\"`);\r\n    }\r\n\r\n    const tokens = this.parseTokens(tokensStr, original, labelToIdMap);\r\n\r\n    // Parse examples (optional)\r\n    const examples = examplesStr\r\n      ? this.parseExamples(examplesStr, tokens.length, original)\r\n      : undefined;\r\n\r\n    return {\r\n      rank: rank || undefined,\r\n      tokens,\r\n      examples,\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Parse rank from the beginning of the line.\r\n   */\r\n  private static parseRank(line: string): number | undefined {\r\n    const match = line.match(/^\\((\\d+)\\)/);\r\n    return match ? parseInt(match[1], 10) : undefined;\r\n  }\r\n\r\n  /**\r\n   * Parse tokens separated by '+'.\r\n   * @param tokensStr The tokens string to parse.\r\n   * @param original The original line for error reporting.\r\n   * @param labelToIdMap Optional map from labels to IDs for POS values.\r\n   */\r\n  private static parseTokens(\r\n    tokensStr: string,\r\n    original: string,\r\n    labelToIdMap?: { [key: string]: string }\r\n  ): WordCollocationToken[] {\r\n    const tokenParts = tokensStr.split('+').map((t) => t.trim());\r\n    const tokens: WordCollocationToken[] = [];\r\n    let headCount = 0;\r\n\r\n    for (const part of tokenParts) {\r\n      if (!part) {\r\n        throw new Error(`Empty token in \"${original}\"`);\r\n      }\r\n\r\n      const token = this.parseToken(part, original, labelToIdMap);\r\n      if (token.isHead) {\r\n        headCount++;\r\n      }\r\n      tokens.push(token);\r\n    }\r\n\r\n    if (headCount === 0) {\r\n      throw new Error(`No head token found (enclose in <>) in \"${original}\"`);\r\n    }\r\n    if (headCount > 1) {\r\n      throw new Error(`Multiple head tokens found in \"${original}\"`);\r\n    }\r\n\r\n    return tokens;\r\n  }\r\n\r\n  /**\r\n   * Parse a single token.\r\n   * @param part The token string to parse.\r\n   * @param original The original line for error reporting.\r\n   * @param labelToIdMap Optional map from labels to IDs for POS values.\r\n   */\r\n  private static parseToken(\r\n    part: string,\r\n    original: string,\r\n    labelToIdMap?: { [key: string]: string }\r\n  ): WordCollocationToken {\r\n    const isHead = part.startsWith('<');\r\n    let content = part;\r\n\r\n    if (isHead) {\r\n      if (!part.includes('>')) {\r\n        throw new Error(`Unclosed '<' in token \"${part}\" in \"${original}\"`);\r\n      }\r\n      const endBracket = part.indexOf('>');\r\n      if (endBracket === -1) {\r\n        throw new Error(`Unclosed '<' in token \"${part}\" in \"${original}\"`);\r\n      }\r\n      content = part.substring(1, endBracket).trim();\r\n\r\n      // Check for note after >\r\n      const afterBracket = part.substring(endBracket + 1).trim();\r\n      if (afterBracket) {\r\n        const noteMatch = afterBracket.match(/^\\(([^)]+)\\)$/);\r\n        if (noteMatch) {\r\n          const pos = this.mapLabelToId(content, labelToIdMap);\r\n          return {\r\n            pos,\r\n            isHead: true,\r\n            note: noteMatch[1].trim(),\r\n          };\r\n        }\r\n      }\r\n    }\r\n\r\n    // Check for note in parentheses\r\n    const noteMatch = content.match(/^([^(]+)\\s*\\(([^)]+)\\)$/);\r\n    if (noteMatch) {\r\n      const pos = this.mapLabelToId(noteMatch[1].trim(), labelToIdMap);\r\n      return {\r\n        pos,\r\n        isHead: isHead || undefined,\r\n        note: noteMatch[2].trim(),\r\n      };\r\n    }\r\n\r\n    const pos = this.mapLabelToId(content.trim(), labelToIdMap);\r\n    return {\r\n      pos,\r\n      isHead: isHead || undefined,\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Map a label to its ID using the provided map, or return the label if no map is provided.\r\n   * @param label The label to map.\r\n   * @param labelToIdMap Optional map from labels to IDs.\r\n   */\r\n  private static mapLabelToId(label: string, labelToIdMap?: { [key: string]: string }): string {\r\n    if (!labelToIdMap) {\r\n      return label;\r\n    }\r\n    return labelToIdMap[label] ?? label;\r\n  }\r\n\r\n  /**\r\n   * Map an ID to its label using the provided map, or return the ID if no map is provided.\r\n   * @param id The ID to map.\r\n   * @param idToLabelMap Optional map from IDs to labels.\r\n   */\r\n  private static mapIdToLabel(id: string, idToLabelMap?: { [key: string]: string }): string {\r\n    if (!idToLabelMap) {\r\n      return id;\r\n    }\r\n    return idToLabelMap[id] ?? id;\r\n  }\r\n\r\n  /**\r\n   * Create an inverse map from IDs to labels.\r\n   * @param labelToIdMap Map from labels to IDs.\r\n   */\r\n  private static createInverseMap(labelToIdMap: { [key: string]: string }): {\r\n    [key: string]: string;\r\n  } {\r\n    const inverseMap: { [key: string]: string } = {};\r\n    for (const [label, id] of Object.entries(labelToIdMap)) {\r\n      inverseMap[id] = label;\r\n    }\r\n    return inverseMap;\r\n  }\r\n\r\n  /**\r\n   * Parse examples from the string after ':'.\r\n   */\r\n  private static parseExamples(\r\n    examplesStr: string,\r\n    tokenCount: number,\r\n    original: string\r\n  ): WordCollocationExample[] {\r\n    const examples: WordCollocationExample[] = [];\r\n    const parts = this.splitExampleParts(examplesStr);\r\n\r\n    let tokenNr = 0;\r\n\r\n    for (const part of parts) {\r\n      if (part.startsWith('<')) {\r\n        // Head literal\r\n        const literals = this.parseHeadLiteral(part, original);\r\n        tokenNr++;\r\n        examples.push({ tokenNr, literals });\r\n      } else if (part.startsWith('[')) {\r\n        // Alternative literals\r\n        const literals = this.parseAlternativeLiterals(part, original);\r\n        tokenNr++;\r\n        examples.push({ tokenNr, literals });\r\n      } else {\r\n        // Simple literal\r\n        const literals = [{ value: part.trim() }];\r\n        examples.push({ tokenNr: 0, literals });\r\n      }\r\n    }\r\n\r\n    return examples;\r\n  }\r\n\r\n  /**\r\n   * Split example string into parts while respecting brackets.\r\n   */\r\n  private static splitExampleParts(examplesStr: string): string[] {\r\n    const parts: string[] = [];\r\n    let current = '';\r\n    let inBracket = false;\r\n    let bracketType = '';\r\n\r\n    for (let i = 0; i < examplesStr.length; i++) {\r\n      const char = examplesStr[i];\r\n\r\n      if (!inBracket && (char === '<' || char === '[')) {\r\n        if (current.trim()) {\r\n          parts.push(...current.trim().split(/\\s+/));\r\n          current = '';\r\n        }\r\n        inBracket = true;\r\n        bracketType = char;\r\n        current = char;\r\n      } else if (\r\n        inBracket &&\r\n        ((bracketType === '<' && char === '>') || (bracketType === '[' && char === ']'))\r\n      ) {\r\n        current += char;\r\n        // Check if there's a note following\r\n        let j = i + 1;\r\n        while (j < examplesStr.length && examplesStr[j] === ' ') j++;\r\n        if (j < examplesStr.length && examplesStr[j] === '(') {\r\n          const noteEnd = examplesStr.indexOf(')', j);\r\n          if (noteEnd !== -1) {\r\n            current += examplesStr.substring(i + 1, noteEnd + 1);\r\n            i = noteEnd;\r\n          }\r\n        }\r\n        parts.push(current.trim());\r\n        current = '';\r\n        inBracket = false;\r\n        bracketType = '';\r\n      } else {\r\n        current += char;\r\n      }\r\n    }\r\n\r\n    if (current.trim()) {\r\n      parts.push(...current.trim().split(/\\s+/));\r\n    }\r\n\r\n    return parts.filter((p) => p.length > 0);\r\n  }\r\n\r\n  /**\r\n   * Parse head literal enclosed in <>.\r\n   */\r\n  private static parseHeadLiteral(part: string, original: string): WordCollocationLiteral[] {\r\n    if (!part.startsWith('<') || !part.includes('>')) {\r\n      throw new Error(`Invalid head literal \"${part}\" in \"${original}\"`);\r\n    }\r\n\r\n    const endBracket = part.indexOf('>');\r\n    const content = part.substring(1, endBracket).trim();\r\n\r\n    const literal: WordCollocationLiteral = { value: '' };\r\n\r\n    // Check for note within the brackets\r\n    const noteMatch = content.match(/^(.+?)\\s*\\(([^)]+)\\)$/);\r\n    if (noteMatch) {\r\n      literal.value = noteMatch[1].trim();\r\n      literal.note = noteMatch[2].trim();\r\n    } else {\r\n      literal.value = content;\r\n    }\r\n\r\n    return [literal];\r\n  }\r\n\r\n  /**\r\n   * Parse alternative literals enclosed in [].\r\n   */\r\n  private static parseAlternativeLiterals(\r\n    part: string,\r\n    original: string\r\n  ): WordCollocationLiteral[] {\r\n    if (!part.startsWith('[') || !part.includes(']')) {\r\n      throw new Error(`Invalid alternative literal \"${part}\" in \"${original}\"`);\r\n    }\r\n\r\n    const endBracket = part.indexOf(']');\r\n    let content = part.substring(1, endBracket).trim();\r\n\r\n    // Check for optional marker\r\n    const isOptional = content.startsWith('?');\r\n    if (isOptional) {\r\n      content = content.substring(1).trim();\r\n    }\r\n\r\n    const alternatives = content.split(',').map((alt) => alt.trim());\r\n    const literals: WordCollocationLiteral[] = [];\r\n\r\n    for (const alt of alternatives) {\r\n      const noteMatch = alt.match(/^(.+?)\\s*\\(([^)]+)\\)$/);\r\n      if (noteMatch) {\r\n        literals.push({\r\n          value: noteMatch[1].trim(),\r\n          note: noteMatch[2].trim(),\r\n        });\r\n      } else {\r\n        literals.push({ value: alt });\r\n      }\r\n    }\r\n\r\n    return literals;\r\n  }\r\n\r\n  /**\r\n   * Convert a WordCollocation to a string representation.\r\n   * @param collocation The collocation to convert.\r\n   * @param labelToIdMap Optional map from labels to IDs for POS values (will be inverted).\r\n   */\r\n  static toString(collocation: WordCollocation, labelToIdMap?: { [key: string]: string }): string {\r\n    const idToLabelMap = labelToIdMap ? this.createInverseMap(labelToIdMap) : undefined;\r\n\r\n    let result = '';\r\n\r\n    // Rank\r\n    if (collocation.rank) {\r\n      result += `(${collocation.rank}) `;\r\n    }\r\n\r\n    // Tokens\r\n    result += collocation.tokens\r\n      .map((token) => {\r\n        const pos = this.mapIdToLabel(token.pos, idToLabelMap);\r\n        let tokenStr = pos;\r\n        if (token.note) {\r\n          tokenStr += ` (${token.note})`;\r\n        }\r\n        if (token.isHead) {\r\n          tokenStr = `<${tokenStr}>`;\r\n        }\r\n        return tokenStr;\r\n      })\r\n      .join('+');\r\n\r\n    result += ':';\r\n\r\n    // Examples\r\n    if (collocation.examples && collocation.examples.length > 0) {\r\n      result += ' ';\r\n      const exampleParts: string[] = [];\r\n\r\n      for (const example of collocation.examples) {\r\n        if (example.tokenNr === 0) {\r\n          // Simple literals\r\n          for (const literal of example.literals) {\r\n            exampleParts.push(literal.value);\r\n          }\r\n        } else {\r\n          // Check if this is the head token\r\n          const isHead = collocation.tokens[example.tokenNr - 1]?.isHead;\r\n\r\n          if (isHead && example.literals.length === 1) {\r\n            // Head literal - note goes INSIDE the brackets\r\n            let literalStr = example.literals[0].value;\r\n            if (example.literals[0].note) {\r\n              literalStr += ` (${example.literals[0].note})`;\r\n            }\r\n            exampleParts.push(`<${literalStr}>`);\r\n          } else if (example.literals.length === 1) {\r\n            // Single alternative\r\n            let literalStr = example.literals[0].value;\r\n            if (example.literals[0].note) {\r\n              literalStr += ` (${example.literals[0].note})`;\r\n            }\r\n            exampleParts.push(`[${literalStr}]`);\r\n          } else {\r\n            // Multiple alternatives\r\n            const alternatives = example.literals\r\n              .map((lit) => (lit.note ? `${lit.value} (${lit.note})` : lit.value))\r\n              .join(', ');\r\n            exampleParts.push(`[${alternatives}]`);\r\n          }\r\n        }\r\n      }\r\n\r\n      result += exampleParts.join(' ');\r\n    }\r\n\r\n    return result;\r\n  }\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\nimport { WordCollocation } from '../lex-word-collocations-part';\r\nimport { WordCollocationParser } from '../services/word-collocation-parser';\r\n\r\n/**\r\n * A pipe to format a word collocation as string.\r\n * Usage:\r\n * ```html\r\n * {{ collocation | wordCollocation:labelToIdMap }}\r\n * ```\r\n */\r\n@Pipe({\r\n  name: 'wordCollocation',\r\n  pure: true,\r\n})\r\nexport class WordCollocationPipe implements PipeTransform {\r\n  transform(\r\n    value: WordCollocation | null | undefined,\r\n    labelToIdMap?: { [key: string]: string }\r\n  ): string {\r\n    if (!value) {\r\n      return '';\r\n    }\r\n    try {\r\n      return WordCollocationParser.toString(value, labelToIdMap);\r\n    } catch {\r\n      return '';\r\n    }\r\n  }\r\n}\r\n","import { Component, computed, OnInit, signal } from '@angular/core';\r\nimport {\r\n  FormControl,\r\n  FormBuilder,\r\n  FormGroup,\r\n  UntypedFormGroup,\r\n  ReactiveFormsModule,\r\n  Validators,\r\n} from '@angular/forms';\r\nimport { TitleCasePipe } from '@angular/common';\r\n\r\nimport {\r\n  MatCard,\r\n  MatCardActions,\r\n  MatCardContent,\r\n  MatCardHeader,\r\n  MatCardTitle,\r\n} from '@angular/material/card';\r\nimport { MatIcon } from '@angular/material/icon';\r\nimport { MatButton, MatIconButton } from '@angular/material/button';\r\nimport { MatTooltip } from '@angular/material/tooltip';\r\nimport {\r\n  MatExpansionPanel,\r\n  MatExpansionPanelHeader,\r\n  MatExpansionPanelTitle,\r\n} from '@angular/material/expansion';\r\nimport { MatFormField, MatLabel, MatHint } from '@angular/material/form-field';\r\nimport { MatInput } from '@angular/material/input';\r\n\r\nimport { NgxToolsValidators } from '@myrmidon/ngx-tools';\r\nimport { DialogService } from '@myrmidon/ngx-mat-tools';\r\nimport { EditedObject, ThesauriSet, ThesaurusEntry } from '@myrmidon/cadmus-core';\r\nimport { CloseSaveButtonsComponent, ModelEditorComponentBase } from '@myrmidon/cadmus-ui';\r\nimport { AuthJwtService } from '@myrmidon/auth-jwt-login';\r\n\r\nimport {\r\n  LEX_WORD_COLLOCATIONS_PART_TYPEID,\r\n  LexWordCollocationsPart,\r\n  WordCollocation,\r\n} from '../../lex-word-collocations-part';\r\nimport { WordCollocEditor } from '../word-colloc-editor/word-colloc-editor';\r\nimport { WordCollocationPipe } from '../../pipes/word-collocation.pipe';\r\nimport { WordCollocationParser } from '../../../public-api';\r\n\r\n/**\r\n * WordCollocationsPart editor component.\r\n * Thesauri: lex-word-ctoken-pos-tags, lex-word-ctoken-features, lex-word-cliteral-tags.\r\n */\r\n@Component({\r\n  selector: 'cadmus-lex-word-collocations-part-editor',\r\n  imports: [\r\n    ReactiveFormsModule,\r\n    MatButton,\r\n    MatCard,\r\n    MatCardActions,\r\n    MatCardContent,\r\n    MatCardHeader,\r\n    MatCardTitle,\r\n    MatExpansionPanel,\r\n    MatExpansionPanelHeader,\r\n    MatExpansionPanelTitle,\r\n    MatFormField,\r\n    MatIcon,\r\n    MatIconButton,\r\n    MatInput,\r\n    MatTooltip,\r\n    TitleCasePipe,\r\n    CloseSaveButtonsComponent,\r\n    WordCollocEditor,\r\n    WordCollocationPipe,\r\n    MatHint\r\n],\r\n  templateUrl: './lex-word-collocations-part-editor.html',\r\n  styleUrl: './lex-word-collocations-part-editor.css',\r\n})\r\nexport class LexWordCollocationPartEditor\r\n  extends ModelEditorComponentBase<LexWordCollocationsPart>\r\n  implements OnInit\r\n{\r\n  public readonly editedIndex = signal<number>(-1);\r\n  public readonly edited = signal<WordCollocation | undefined>(undefined);\r\n\r\n  // lex-word-ctoken-pos-tags\r\n  public readonly tokPosEntries = signal<ThesaurusEntry[] | undefined>(undefined);\r\n  // lex-word-ctoken-features\r\n  public readonly tokFeatureEntries = signal<ThesaurusEntry[] | undefined>(undefined);\r\n  // lex-word-cliteral-tags\r\n  public readonly litTagEntries = signal<ThesaurusEntry[] | undefined>(undefined);\r\n\r\n  public readonly labelToIdMap = computed<{ [key: string]: string }>(() => {\r\n    const map: { [key: string]: string } = {};\r\n    const posEntries = this.tokPosEntries();\r\n    if (posEntries) {\r\n      for (const entry of posEntries) {\r\n        map[entry.value] = entry.id;\r\n      }\r\n    }\r\n    return map;\r\n  });\r\n\r\n  public collocations: FormControl<WordCollocation[]>;\r\n\r\n  public dslText: FormControl<string | null>;\r\n  public dslForm: FormGroup;\r\n  public readonly dslError = signal<string | undefined>(undefined);\r\n\r\n  constructor(\r\n    authService: AuthJwtService,\r\n    formBuilder: FormBuilder,\r\n    private _dialogService: DialogService\r\n  ) {\r\n    super(authService, formBuilder);\r\n    // form\r\n    this.collocations = formBuilder.control([], {\r\n      // at least 1 entry\r\n      validators: NgxToolsValidators.strictMinLengthValidator(1),\r\n      nonNullable: true,\r\n    });\r\n\r\n    // DSL form\r\n    this.dslText = formBuilder.control(null, Validators.required);\r\n    this.dslForm = formBuilder.group({\r\n      dslText: this.dslText,\r\n    });\r\n  }\r\n\r\n  public override ngOnInit(): void {\r\n    super.ngOnInit();\r\n  }\r\n\r\n  protected buildForm(formBuilder: FormBuilder): FormGroup | UntypedFormGroup {\r\n    return formBuilder.group({\r\n      entries: this.collocations,\r\n    });\r\n  }\r\n\r\n  private updateThesauri(thesauri: ThesauriSet): void {\r\n    let key = 'lex-word-ctoken-pos-tags';\r\n    if (this.hasThesaurus(key)) {\r\n      this.tokPosEntries.set(thesauri[key].entries);\r\n    } else {\r\n      this.tokPosEntries.set(undefined);\r\n    }\r\n    key = 'lex-word-ctoken-features';\r\n    if (this.hasThesaurus(key)) {\r\n      this.tokFeatureEntries.set(thesauri[key].entries);\r\n    } else {\r\n      this.tokFeatureEntries.set(undefined);\r\n    }\r\n    key = 'lex-word-cliteral-tags';\r\n    if (this.hasThesaurus(key)) {\r\n      this.litTagEntries.set(thesauri[key].entries);\r\n    } else {\r\n      this.litTagEntries.set(undefined);\r\n    }\r\n  }\r\n\r\n  private updateForm(part?: LexWordCollocationsPart | null): void {\r\n    if (!part) {\r\n      this.form.reset();\r\n      return;\r\n    }\r\n    this.collocations.setValue(part.collocations || []);\r\n    this.form.markAsPristine();\r\n  }\r\n\r\n  protected override onDataSet(data?: EditedObject<LexWordCollocationsPart>): void {\r\n    // thesauri\r\n    if (data?.thesauri) {\r\n      this.updateThesauri(data.thesauri);\r\n    }\r\n\r\n    // form\r\n    this.updateForm(data?.value);\r\n  }\r\n\r\n  protected getValue(): LexWordCollocationsPart {\r\n    let part = this.getEditedPart(LEX_WORD_COLLOCATIONS_PART_TYPEID) as LexWordCollocationsPart;\r\n    part.collocations = this.collocations.value || [];\r\n    return part;\r\n  }\r\n\r\n  public addCollocation(): void {\r\n    const collocation: WordCollocation = {\r\n      tokens: [],\r\n    };\r\n    this.editCollocation(collocation, -1);\r\n  }\r\n\r\n  public editCollocation(collocation: WordCollocation, index: number): void {\r\n    this.editedIndex.set(index);\r\n    this.edited.set(structuredClone(collocation));\r\n  }\r\n\r\n  public closeCollocation(): void {\r\n    this.editedIndex.set(-1);\r\n    this.edited.set(undefined);\r\n  }\r\n\r\n  public saveCollocation(collocation: WordCollocation): void {\r\n    const collocations = [...this.collocations.value];\r\n    if (this.editedIndex() === -1) {\r\n      collocations.push(collocation);\r\n    } else {\r\n      collocations.splice(this.editedIndex(), 1, collocation);\r\n    }\r\n    this.collocations.setValue(collocations);\r\n    this.collocations.markAsDirty();\r\n    this.collocations.updateValueAndValidity();\r\n    this.closeCollocation();\r\n  }\r\n\r\n  public deleteCollocation(index: number): void {\r\n    this._dialogService\r\n      .confirm('Confirmation', 'Delete collocation?')\r\n      .subscribe((yes: boolean | undefined) => {\r\n        if (yes) {\r\n          if (this.editedIndex() === index) {\r\n            this.closeCollocation();\r\n          }\r\n          const collocations = [...this.collocations.value];\r\n          collocations.splice(index, 1);\r\n          this.collocations.setValue(collocations);\r\n          this.collocations.markAsDirty();\r\n          this.collocations.updateValueAndValidity();\r\n        }\r\n      });\r\n  }\r\n\r\n  public moveCollocationUp(index: number): void {\r\n    if (index < 1) {\r\n      return;\r\n    }\r\n    const collocation = this.collocations.value[index];\r\n    const collocations = [...this.collocations.value];\r\n    collocations.splice(index, 1);\r\n    collocations.splice(index - 1, 0, collocation);\r\n    this.collocations.setValue(collocations);\r\n    this.collocations.markAsDirty();\r\n    this.collocations.updateValueAndValidity();\r\n  }\r\n\r\n  public moveCollocationDown(index: number): void {\r\n    if (index + 1 >= this.collocations.value.length) {\r\n      return;\r\n    }\r\n    const collocation = this.collocations.value[index];\r\n    const collocations = [...this.collocations.value];\r\n    collocations.splice(index, 1);\r\n    collocations.splice(index + 1, 0, collocation);\r\n    this.collocations.setValue(collocations);\r\n    this.collocations.markAsDirty();\r\n    this.collocations.updateValueAndValidity();\r\n  }\r\n\r\n  public parseDsl(): void {\r\n    const dsl = this.dslText.value;\r\n    if (!dsl) {\r\n      return;\r\n    }\r\n    try {\r\n      const result = WordCollocationParser.parse(dsl);\r\n      if (result.error) {\r\n        this.dslError.set(`Error parsing DSL: ${result.error}`);\r\n      } else {\r\n        const collocations = [...this.collocations.value];\r\n        collocations.push(...result.value);\r\n        this.collocations.setValue(collocations);\r\n        this.collocations.markAsDirty();\r\n        this.collocations.updateValueAndValidity();\r\n        this.dslError.set(undefined);\r\n      }\r\n    } catch (e) {\r\n      console.error(e);\r\n    }\r\n  }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"save()\">\r\n  <mat-card>\r\n    <mat-card-header>\r\n      <div mat-card-avatar>\r\n        <mat-icon>picture_in_picture</mat-icon>\r\n      </div>\r\n      <mat-card-title>\r\n        {{ (modelName() | titlecase) || 'Word Collocations Part' }}\r\n      </mat-card-title>\r\n    </mat-card-header>\r\n    <mat-card-content>\r\n      <!-- batch add collocations -->\r\n      <div>\r\n        <fieldset>\r\n          <legend>batch</legend>\r\n          <form [formGroup]=\"dslForm\" (submit)=\"parseDsl()\">\r\n            <mat-form-field class=\"long-text\">\r\n              <textarea\r\n                matInput\r\n                [formControl]=\"dslText\"\r\n                placeholder=\"collocation(s), one per line\"\r\n                rows=\"3\"\r\n              ></textarea>\r\n              <mat-hint>(RANK) POS+...: &lt;a&gt; [b, c] d</mat-hint>\r\n            </mat-form-field>\r\n            <div>\r\n              <button\r\n                type=\"button\"\r\n                mat-icon-button\r\n                class=\"mat-primary\"\r\n                (click)=\"parseDsl()\"\r\n                matTooltip=\"Parse collocations and add them\"\r\n              >\r\n                <mat-icon>library_add</mat-icon>\r\n              </button>\r\n            </div>\r\n          </form>\r\n        </fieldset>\r\n      </div>\r\n      <!-- add collocation -->\r\n      <div class=\"mt\">\r\n        <button type=\"button\" mat-flat-button class=\"mat-primary\" (click)=\"addCollocation()\">\r\n          <mat-icon>add_circle</mat-icon> collocation\r\n        </button>\r\n      </div>\r\n      @if (collocations.value.length) {\r\n      <table>\r\n        <thead>\r\n          <tr>\r\n            <th></th>\r\n            <th>nr.</th>\r\n            <th>collocation</th>\r\n          </tr>\r\n        </thead>\r\n        <tbody>\r\n          @for (entry of collocations.value; track entry; let i = $index; let first = $first; let\r\n          last = $last) {\r\n          <tr [class.selected]=\"entry === edited()\">\r\n            <td class=\"fit-width\">\r\n              <button\r\n                type=\"button\"\r\n                mat-icon-button\r\n                matTooltip=\"Edit this collocation\"\r\n                (click)=\"editCollocation(entry, i)\"\r\n              >\r\n                <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n              </button>\r\n              <button\r\n                type=\"button\"\r\n                mat-icon-button\r\n                matTooltip=\"Move this collocation up\"\r\n                [disabled]=\"first\"\r\n                (click)=\"moveCollocationUp(i)\"\r\n              >\r\n                <mat-icon>arrow_upward</mat-icon>\r\n              </button>\r\n              <button\r\n                type=\"button\"\r\n                mat-icon-button\r\n                matTooltip=\"Move this collocation down\"\r\n                [disabled]=\"last\"\r\n                (click)=\"moveCollocationDown(i)\"\r\n              >\r\n                <mat-icon>arrow_downward</mat-icon>\r\n              </button>\r\n              <button\r\n                type=\"button\"\r\n                mat-icon-button\r\n                matTooltip=\"Delete this collocation\"\r\n                (click)=\"deleteCollocation(i)\"\r\n              >\r\n                <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\r\n              </button>\r\n            </td>\r\n            <td>{{ i + 1 }}</td>\r\n            <td>{{ entry | wordCollocation : labelToIdMap() }}</td>\r\n          </tr>\r\n          }\r\n        </tbody>\r\n      </table>\r\n      } @if (edited()) {\r\n      <fieldset>\r\n        <mat-expansion-panel [expanded]=\"edited()\" [disabled]=\"!edited()\">\r\n          <mat-expansion-panel-header>\r\n            <mat-panel-title>Collocation #</mat-panel-title>\r\n          </mat-expansion-panel-header>\r\n          <cadmus-word-colloc-editor\r\n            [tokPosEntries]=\"tokPosEntries()\"\r\n            [tokFeatureEntries]=\"tokFeatureEntries()\"\r\n            [litTagEntries]=\"litTagEntries()\"\r\n            [collocation]=\"edited()\"\r\n            (collocationChange)=\"saveCollocation($event!)\"\r\n            (editorClose)=\"closeCollocation()\"\r\n          />\r\n        </mat-expansion-panel>\r\n      </fieldset>\r\n      }\r\n    </mat-card-content>\r\n    <mat-card-actions>\r\n      <cadmus-close-save-buttons [form]=\"form\" [noSave]=\"userLevel < 2\" (closeRequest)=\"close()\" />\r\n    </mat-card-actions>\r\n  </mat-card>\r\n</form>\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { Router, ActivatedRoute } from '@angular/router';\r\n\r\nimport { ItemService, ThesaurusService } from '@myrmidon/cadmus-api';\r\nimport { EditPartFeatureBase, PartEditorService } from '@myrmidon/cadmus-state';\r\nimport { CurrentItemBarComponent } from '@myrmidon/cadmus-ui-pg';\r\n\r\nimport { LexWordCollocationPartEditor } from '../lex-word-collocations-part-editor/lex-word-collocations-part-editor';\r\n\r\n@Component({\r\n  selector: 'cadmus-lex-word-collocations-part-feature',\r\n  imports: [CurrentItemBarComponent, LexWordCollocationPartEditor],\r\n  templateUrl: './lex-word-collocations-part-feature.html',\r\n  styleUrl: './lex-word-collocations-part-feature.css',\r\n})\r\nexport class LexWordCollocationsPartFeature extends EditPartFeatureBase implements OnInit {\r\n  constructor(\r\n    router: Router,\r\n    route: ActivatedRoute,\r\n    snackbar: MatSnackBar,\r\n    itemService: ItemService,\r\n    thesaurusService: ThesaurusService,\r\n    editorService: PartEditorService\r\n  ) {\r\n    super(router, route, snackbar, itemService, thesaurusService, editorService);\r\n  }\r\n\r\n  protected override getReqThesauriIds(): string[] {\r\n    return ['lex-word-ctoken-pos-tags', 'lex-word-ctoken-features', 'lex-word-cliteral-tags'];\r\n  }\r\n}\r\n","<cadmus-current-item-bar />\r\n<cadmus-lex-word-collocations-part-editor\r\n  [identity]=\"identity\"\r\n  [data]=\"$any(data)\"\r\n  (dataChange)=\"save($event!.value!)\"\r\n  (editorClose)=\"close()\"\r\n  (dirtyChange)=\"onDirtyChange($event)\"\r\n/>\r\n","/*\r\n * Public API Surface of cadmus-part-lexicography-word-collocations\r\n */\r\n\r\nexport * from './lib/lex-word-collocations-part';\r\nexport * from './lib/components/word-colloc-example-editor/word-colloc-example-editor';\r\nexport * from './lib/components/word-colloc-literal-editor/word-colloc-literal-editor';\r\nexport * from './lib/components/word-colloc-token-editor/word-colloc-token-editor';\r\nexport * from './lib/components/word-colloc-editor/word-colloc-editor';\r\nexport * from './lib/components/lex-word-collocations-part-editor/lex-word-collocations-part-editor';\r\nexport * from './lib/components/lex-word-collocations-part-feature/lex-word-collocations-part-feature';\r\nexport * from './lib/services/word-collocation-parser';\r\nexport * from './lib/pipes/word-collocation.pipe';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i3","i4"],"mappings":"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"}