diff --git a/nietzsche-beta-app/src/app/app.module.ts b/nietzsche-beta-app/src/app/app.module.ts index 623c815..a91dc7c 100644 --- a/nietzsche-beta-app/src/app/app.module.ts +++ b/nietzsche-beta-app/src/app/app.module.ts @@ -1,88 +1,100 @@ import { AppComponent } from './app.component'; import { BrowserModule } from '@angular/platform-browser'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { FormsModule, ReactiveFormsModule} from '@angular/forms'; import { NgModule } from '@angular/core'; import {MatCardModule} from '@angular/material/card'; import { MatToolbarModule, MatButtonModule, MatFormFieldModule, MatInputModule } from '@angular/material'; import {MatProgressBarModule} from '@angular/material/progress-bar'; import {MatTreeModule} from '@angular/material/tree'; import { MatExpansionModule } from '@angular/material/expansion'; import {MatIconModule} from '@angular/material/icon'; import { MatListModule } from '@angular/material/list'; import { MatMenuModule} from '@angular/material/menu'; import { MatSidenavModule } from '@angular/material'; import { MatSelectModule } from '@angular/material/select'; import {MatTabsModule} from '@angular/material/tabs'; import {MatTooltipModule} from '@angular/material'; import { CommonModule } from '@angular/common'; import { HttpClientModule } from '@angular/common/http'; import { QueryService } from './services/query.service'; import {routing} from './app.routing'; import {HomeComponent} from './home.component'; import { ManuscriptViewComponentComponent } from './manuscript-view-component/manuscript-view-component.component'; import { ContentViewTabComponentComponent } from './content-view-tab-component/content-view-tab-component.component'; import { RhizomeViewComponentComponent } from './rhizome-view-component/rhizome-view-component.component'; import { MainMenuComponentComponent } from './main-menu-component/main-menu-component.component'; import { PageViewWrapperComponent } from './page-view-wrapper-component/page-view-wrapper.component'; import { NavigationListComponentComponent } from './navigation-list-component/navigation-list-component.component'; import {NavigationServiceService} from './services/navigation-service.service'; import { TlnEditionModule} from './tln-edition/tln-edition.module'; import { NavTree } from './navigation-list-component/navtree-directive.directive'; import { LazyImageLoadDirectiveDirective } from './content-view-tab-component/lazy-image-load-directive.directive'; import { ImpressumComponent } from './impressum.component'; import { ProjectComponent } from './project.component'; import { NavigationlistListComponentComponent } from './navigation-list-component/navigationlist-list-component/navigationlist-list-component.component'; import { QuantComponent } from './quant/quant.component'; import { QueryComponent } from './query.component'; import { ConceptionComponent } from './conception.component'; +import { SupportComponent } from './support/support.component'; +import { HeadingComponent } from './support/heading.component'; +import { AddContentPipe } from './support/add-content.pipe'; +import { SubheadingComponent } from './support/subheading.component'; +import { SubSubheadingComponent } from './support/subsubheading.component'; +import { MenuComponent } from './support/menu.component'; @NgModule({ declarations: [ AppComponent, HomeComponent, ManuscriptViewComponentComponent, ContentViewTabComponentComponent, RhizomeViewComponentComponent, MainMenuComponentComponent, PageViewWrapperComponent, NavigationListComponentComponent, NavTree, LazyImageLoadDirectiveDirective, ImpressumComponent, ProjectComponent, NavigationlistListComponentComponent, QuantComponent, QueryComponent, - ConceptionComponent + ConceptionComponent, + SupportComponent, + HeadingComponent, + AddContentPipe, + SubheadingComponent, + SubSubheadingComponent, + MenuComponent ], imports: [ routing, BrowserModule, BrowserAnimationsModule, CommonModule, HttpClientModule, MatButtonModule, MatCardModule, MatExpansionModule, MatIconModule, MatListModule, MatMenuModule, MatProgressBarModule, MatSelectModule, // for themes selection MatSidenavModule, MatTabsModule, MatToolbarModule, MatTooltipModule, MatTreeModule, MatFormFieldModule, MatInputModule, FormsModule, TlnEditionModule, ReactiveFormsModule ], providers: [ NavigationServiceService, QueryService ], bootstrap: [AppComponent] }) export class AppModule { } diff --git a/nietzsche-beta-app/src/app/app.routing.ts b/nietzsche-beta-app/src/app/app.routing.ts index 91d8959..07828dc 100644 --- a/nietzsche-beta-app/src/app/app.routing.ts +++ b/nietzsche-beta-app/src/app/app.routing.ts @@ -1,26 +1,28 @@ import {ExtraOptions,RouterModule, Routes} from '@angular/router'; +import {SupportComponent} from './support/support.component'; import {HomeComponent} from './home.component'; import {ImpressumComponent} from './impressum.component'; import {ProjectComponent} from './project.component'; import {QueryComponent} from './query.component'; import {ConceptionComponent} from './conception.component'; import {ContentViewTabComponentComponent} from './content-view-tab-component/content-view-tab-component.component'; import {CONTENT_ROUTES} from './content-view-tab-component/content-view-routes'; -import { CONTENT_VIEW_ROUTE, CONCEPTION_ROUTE, DATA_ROUTE, DOCUMENTATION_ROUTE, HOME_ROUTE, IMPRESSUM_ROUTE, PROJECT_ROUTE } from './constants'; +import { CONTENT_VIEW_ROUTE, CONCEPTION_ROUTE, DATA_ROUTE, DOCUMENTATION_ROUTE, HELP_ROUTE, HOME_ROUTE, IMPRESSUM_ROUTE, PROJECT_ROUTE } from './constants'; const APP_ROUTES: Routes = [ {path: '', redirectTo: HOME_ROUTE, pathMatch: 'prefix'}, {path: HOME_ROUTE, component: HomeComponent}, + {path: HELP_ROUTE, component: SupportComponent}, {path: CONCEPTION_ROUTE, component: ConceptionComponent}, {path: CONTENT_VIEW_ROUTE, component: ContentViewTabComponentComponent, children: CONTENT_ROUTES}, {path: DATA_ROUTE, component: QueryComponent}, {path: PROJECT_ROUTE, component: ProjectComponent}, {path: IMPRESSUM_ROUTE, component: ImpressumComponent}, {path: '**', redirectTo: HOME_ROUTE, pathMatch: 'prefix'} // any other unknown url will be forwarded to home ]; const routerOptions: ExtraOptions = { useHash: false, anchorScrolling: 'enabled' }; export const routing = RouterModule.forRoot(APP_ROUTES, routerOptions); diff --git a/nietzsche-beta-app/src/app/constants.ts b/nietzsche-beta-app/src/app/constants.ts index 5a87371..7c45af4 100644 --- a/nietzsche-beta-app/src/app/constants.ts +++ b/nietzsche-beta-app/src/app/constants.ts @@ -1,308 +1,308 @@ import {NavTreeDef} from './models/models'; export const CONTENT_VIEW_ROUTE: string = 'contentView'; export const DOCUMENTATION_ROUTE: string = 'doku'; export const DATA_ROUTE: string = 'query'; export const CONCEPTION_ROUTE: string = 'conception'; export const HOME_ROUTE: string = 'home'; +export const HELP_ROUTE: string = 'support'; export const IMPRESSUM_ROUTE: string = 'impressum'; export const PROJECT_ROUTE: string = 'project'; import { BASE_URL } from './tln-edition/constants'; export { BASE_URL } from './tln-edition/constants'; //export const BASE_URL: string = 'https://nietzsche.fuseki.services.dasch.swiss/nietzsche'; - export const NAVTREE_DEFS: NavTreeDef[] = [ { id: 'manuscript', idx: 0, isActive: true, label: 'Manuskripte', itemQParam: 'manuscript', entries: [], apiDef: { type: 0, // rdf baseUrl: BASE_URL, dataArray: 'results.bindings', query: 'manuscripts.rq', mapping: { // maps the properties of the reponse to tha NavTabDef properties, which are displayed id: 'manuscript.value', // Short id, iri in most cases iri: 'manuscript.value', // iri type: 'type.value', label: 'title.value', description: 'gsaSignature.value', avatar: 'thumbImage.value' } } }, { id: 'page', idx: 1, isActive: false, label: 'Seiten', itemQParam: 'page', entries: [], apiDef: { type: 0, // rdf baseUrl: BASE_URL, dataArray: 'results.bindings', query: 'getPageData.rq', mapping: { id: 'page.value', // Short id, iri in most cases iri: 'page.value', // iri label: 'pageNumber.value', thumb: 'thumb.value', idx: 'pageNumber.value', svg: 'svgUrl.value', } } } ]; // Queries export const RQ_CROSSREF_TREE_MANUSCRIPTS: string = ` PREFIX data: PREFIX tln: PREFIX rdf: SELECT ?manuscript ?title ?thumbImage ?gsaSignature WHERE { ?manuscript a tln:ManuscriptUnity; tln:hasTitle ?title; tln:hasManuscriptType "Mappe"; tln:hasPages/rdf:first/tln:hasFaksimileImage/tln:hasThumburl ?thumbImage ; tln:hasGsaSignature ?gsaSignature . }`; export const RQ_CROSSREF_TREE_PAGES: string = ` PREFIX tln: PREFIX rdf: PREFIX xsd: SELECT DISTINCT ?page ?pageNumber ?type WHERE { ?s (tln:hasPages/(rdf:rest*)/rdf:first) ?page. ?page tln:hasNumber ?pageNumber. ?page a tln:Page. BIND (tln:page AS ?type) BIND (xsd:integer(REPLACE(?pageNumber, "\\\\D+", "")) AS ?sorting) } ORDER BY (?sorting) `; export const RQ_CROSSREF_TREE_LINES: string = ` PREFIX tln: PREFIX rdf: PREFIX xsd: SELECT DISTINCT ?line ?lNumber ?type WHERE { ?s (tln:hasLines/(rdf:rest*)/rdf:first) ?line. ?line a tln:Line. BIND (tln:line AS ?type) OPTIONAL { ?line tln:lineHasNumber ?lNumber. } } ORDER BY (?lNumber) `; export const RQ_CROSSREF_TREE_WORDS: string = ` PREFIX tln: PREFIX rdf: PREFIX xsd: PREFIX homotypic: SELECT DISTINCT ?word ?line ?text ?type WHERE { ?word tln:wordBelongsToLine ?line. ?word a tln:SimpleWord. BIND(tln:SimpleWord AS ?type) OPTIONAL { ?word homotypic:hasText ?text. } } ORDER BY (?word) `; export const CROSSREF_TREE_DEFS: NavTreeDef[] = [ { id: 'manuscript', idx: 0, isActive: true, label: 'Manuskript ', itemQParam: 'manuscript', entries: [], apiDef: { type: 0, // rdf baseUrl: BASE_URL, dataArray: 'results.bindings', query: RQ_CROSSREF_TREE_MANUSCRIPTS, mapping: { // maps the properties of the reponse to tha NavTabDef properties, which are displayed id: 'manuscript.value', // Short id, iri in most cases iri: 'manuscript.value', // iri type: 'type.value', label: 'title.value', description: 'gsaSignature.value', avatar: 'thumbImage.value' } } }, { id: 'page', idx: 1, isActive: false, label: 'S. ', itemQParam: 'page', entries: [], apiDef: { type: 0, // rdf baseUrl: BASE_URL, dataArray: 'results.bindings', query: RQ_CROSSREF_TREE_PAGES, mapping: { id: 'page.value', // Short id, iri in most cases iri: 'page.value', // iri label: 'pageNumber.value', type: 'type.value' } } }, { id: 'line', idx: 2, isActive: false, label: 'Zeile ', itemQParam: '', entries: [], apiDef: { type: 0, // rdf baseUrl: BASE_URL, dataArray: 'results.bindings', query: RQ_CROSSREF_TREE_LINES, mapping: { id: 'line.value', // Short id, iri in most cases iri: 'line.value', // iri label: 'lNumber.value', type: 'type.value' } } }, { id: 'word', idx: 3, isActive: false, label: '', itemQParam: '', entries: [], apiDef: { type: 0, // rdf baseUrl: BASE_URL, dataArray: 'results.bindings', query: RQ_CROSSREF_TREE_WORDS, mapping: { id: 'word.value', // Short id, iri in most cases iri: 'word.value', // iri label: 'text.value', type: 'type.value' }, paramTriple: 2 } } ]; // GENERIC TREES // Queries export const RQ_GENERIC_TREE_ROOT: string = ` PREFIX data: PREFIX tln: PREFIX rdf: SELECT DISTINCT ?manuscript ?title ?type ?gsaSignature WHERE { ?manuscript a tln:ManuscriptUnity; tln:hasTitle ?title; tln:hasManuscriptType "Mappe"; tln:hasGsaSignature ?gsaSignature . OPTIONAL { tln:ManuscriptUnity a ?type } }`; export const RQ_GENERIC_RDF_PROPERTY_TREE: string = ` PREFIX rdfs: SELECT DISTINCT ?p ?type ?label ?comment WHERE { ?s ?p ?o. OPTIONAL { ?p rdfs:label ?label. ?p rdfs:comment ?comment. ?p a ?sth. } } ORDER BY (?label) LIMIT 10 `; export const RQ_GENERIC_OBJECT_TREE: string = ` PREFIX rdfs: SELECT DISTINCT ?o ?type ?label ?comment WHERE { ?s ?p ?o. OPTIONAL { ?o rdfs:label ?label. ?o rdfs:comment ?comment. ?o a ?sth. } } ORDER BY (?label) LIMIT 10 `; export const GENERIC_ROOT_TREE_DEF: NavTreeDef[] = [ { id: 'root', idx: 0, isActive: true, label: 'Manuskript ', itemQParam: 'manuscript', entries: [], apiDef: { type: 0, // rdf baseUrl: BASE_URL, dataArray: 'results.bindings', query: RQ_GENERIC_TREE_ROOT, mapping: { // maps the properties of the reponse to tha NavTabDef properties, which are displayed id: 'manuscript.value', // Short id, iri in most cases iri: 'manuscript.value', // iri type: 'type.value', label: 'title.value', description: 'gsaSignature.value' } } }, { id: 'property', idx: 1, isActive: true, label: 'Property ', itemQParam: '', entries: [], apiDef: { type: 0, // rdf baseUrl: BASE_URL, dataArray: 'results.bindings', query: RQ_GENERIC_RDF_PROPERTY_TREE, mapping: { // maps the properties of the reponse to tha NavTabDef properties, which are displayed id: 'p.value', // Short id, iri in most cases iri: 'p.value', // iri type: 'type.value', label: 'label.value', description: 'comment.value' } } }, { id: 'object', idx: 1, isActive: true, label: 'Object ', itemQParam: '', entries: [], apiDef: { type: 0, // rdf baseUrl: BASE_URL, dataArray: 'results.bindings', query: RQ_GENERIC_OBJECT_TREE, mapping: { // maps the properties of the reponse to tha NavTabDef properties, which are displayed id: 'o.value', // Short id, iri in most cases iri: 'o.value', // iri type: 'type.value', label: 'label.value', description: 'comment.value' } } } ]; diff --git a/nietzsche-beta-app/src/app/main-menu-component/main-menu-component.component.html b/nietzsche-beta-app/src/app/main-menu-component/main-menu-component.component.html index 6874924..d148d2c 100644 --- a/nietzsche-beta-app/src/app/main-menu-component/main-menu-component.component.html +++ b/nietzsche-beta-app/src/app/main-menu-component/main-menu-component.component.html @@ -1,16 +1,25 @@
+ +
diff --git a/nietzsche-beta-app/src/app/main-menu-component/main-menu-component.component.ts b/nietzsche-beta-app/src/app/main-menu-component/main-menu-component.component.ts index 00fe67c..ebfd4f3 100644 --- a/nietzsche-beta-app/src/app/main-menu-component/main-menu-component.component.ts +++ b/nietzsche-beta-app/src/app/main-menu-component/main-menu-component.component.ts @@ -1,32 +1,33 @@ import { Component, OnInit } from '@angular/core'; import {Subscription} from 'rxjs'; import {ActivatedRoute, Params} from '@angular/router'; -import { CONTENT_VIEW_ROUTE, CONCEPTION_ROUTE, DATA_ROUTE, DOCUMENTATION_ROUTE, HOME_ROUTE, IMPRESSUM_ROUTE, PROJECT_ROUTE } from '../constants'; +import { CONTENT_VIEW_ROUTE, CONCEPTION_ROUTE, DATA_ROUTE, DOCUMENTATION_ROUTE, HELP_ROUTE, HOME_ROUTE, IMPRESSUM_ROUTE, PROJECT_ROUTE } from '../constants'; @Component({ selector: 'app-main-menu-component', templateUrl: './main-menu-component.component.html', styleUrls: ['./main-menu-component.component.scss'] }) export class MainMenuComponentComponent implements OnInit { contentViewLink: string[] = [ CONTENT_VIEW_ROUTE ]; fullScreen: string; impressumLink: string[] = [ IMPRESSUM_ROUTE ]; homeLink: string[] = [ HOME_ROUTE ]; + supportLink: string[] = [ HELP_ROUTE ]; projectLink: string[] = [ PROJECT_ROUTE]; dataLink: string[] = [ DATA_ROUTE]; conceptionLink: string[] = [ CONCEPTION_ROUTE]; queryParamSub: Subscription; queryParams: Params; constructor(private activatedRoute: ActivatedRoute) { } ngOnInit() { this.queryParamSub = this.activatedRoute.queryParams.subscribe( (queryParams: Params ) => { this.fullScreen = queryParams.fullscreen; this.queryParams = queryParams; }); } } diff --git a/nietzsche-beta-app/src/app/support/.help.component.html.swp b/nietzsche-beta-app/src/app/support/.help.component.html.swp new file mode 100644 index 0000000..51853f8 Binary files /dev/null and b/nietzsche-beta-app/src/app/support/.help.component.html.swp differ diff --git a/nietzsche-beta-app/src/app/support/add-content.pipe.spec.ts b/nietzsche-beta-app/src/app/support/add-content.pipe.spec.ts new file mode 100644 index 0000000..fc1dd1f --- /dev/null +++ b/nietzsche-beta-app/src/app/support/add-content.pipe.spec.ts @@ -0,0 +1,8 @@ +import { AddContentPipe } from './add-content.pipe'; + +describe('AddContentPipe', () => { + it('create an instance', () => { + const pipe = new AddContentPipe(); + expect(pipe).toBeTruthy(); + }); +}); diff --git a/nietzsche-beta-app/src/app/support/add-content.pipe.ts b/nietzsche-beta-app/src/app/support/add-content.pipe.ts new file mode 100644 index 0000000..bbb5687 --- /dev/null +++ b/nietzsche-beta-app/src/app/support/add-content.pipe.ts @@ -0,0 +1,17 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import { Content } from './models'; + +@Pipe({ + name: 'addContent' +}) +export class AddContentPipe implements PipeTransform { + + transform(index: number, titles: Content[]): string{ + //titles.push({ title: title, link: title.replace(/ /g, '_')}); + //return title; + console.log(titles.length, index); + if (titles == undefined || titles == null || titles.length <= index) return ''; + return '#' + titles[index].link; + } + +} diff --git a/nietzsche-beta-app/src/app/support/heading.component.html b/nietzsche-beta-app/src/app/support/heading.component.html new file mode 100644 index 0000000..4f435cd --- /dev/null +++ b/nietzsche-beta-app/src/app/support/heading.component.html @@ -0,0 +1,4 @@ +

{{prefix + ' ' + title}}

+

{{prefix + ' ' + title}}

+
{{prefix + ' ' + title}}
+ diff --git a/nietzsche-beta-app/src/app/tln-edition/tln-quant/tln-data.component.scss b/nietzsche-beta-app/src/app/support/heading.component.scss similarity index 100% rename from nietzsche-beta-app/src/app/tln-edition/tln-quant/tln-data.component.scss rename to nietzsche-beta-app/src/app/support/heading.component.scss diff --git a/nietzsche-beta-app/src/app/support/heading.component.spec.ts b/nietzsche-beta-app/src/app/support/heading.component.spec.ts new file mode 100644 index 0000000..dea2f02 --- /dev/null +++ b/nietzsche-beta-app/src/app/support/heading.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HeadingComponent } from './heading.component'; + +describe('HeadingComponent', () => { + let component: HeadingComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HeadingComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HeadingComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/nietzsche-beta-app/src/app/support/heading.component.ts b/nietzsche-beta-app/src/app/support/heading.component.ts new file mode 100644 index 0000000..9dce327 --- /dev/null +++ b/nietzsche-beta-app/src/app/support/heading.component.ts @@ -0,0 +1,56 @@ +import { Component, OnInit, Input, EventEmitter, Output } from '@angular/core'; +import { Content } from './models'; + +interface Sectioning { + prefix: string; + sectionNumber: number; + subsectionNumber?: number; + href: string; +} + +@Component({ + selector: 'heading', + templateUrl: './heading.component.html', + styleUrls: ['./heading.component.scss'] +}) +export class HeadingComponent implements OnInit { + @Input() title: string; + @Input() href: string; + @Input() tableOfContents: Content[]; + @Output() tableOfContentsChanged = new EventEmitter(); + @Input() level: number = 0; + @Output() indexChanged = new EventEmitter(); + prefix: string; + + constructor() { } + + ngOnInit() { + const sectioning = this.getSectioning(); + this.prefix = sectioning.prefix; + if (this.href == undefined || this.href == null){ + this.href = sectioning.href; + } + this.tableOfContents.push({ title: this.title, link: this.href, level: this.level, + sectionNumber: sectioning.sectionNumber, subsectionNumber: sectioning.subsectionNumber, prefix: sectioning.prefix }); + this.indexChanged.emit(this.tableOfContents.length); + this.tableOfContentsChanged.emit(this.tableOfContents); + + } + getSectioning(): Sectioning{ + if (this.tableOfContents.length == 0){ + return { prefix: '1.', sectionNumber: 1, href: this.title.replace(/ /g, '_') } + } + let sectionNumber = this.tableOfContents[this.tableOfContents.length-1].sectionNumber; + if (this.level == 0){ + sectionNumber += 1; + return { prefix: String(sectionNumber) + '.', sectionNumber: sectionNumber, href: this.title.replace(/ /g, '_') }; + } + let parents = this.tableOfContents.filter(content =>content.level == 0); + const href = parents[parents.length-1].title.replace(/ /g, '_') + '_' + this.title.replace(/ /g, '_'); + const subsectionNumber = (this.tableOfContents[this.tableOfContents.length-1].subsectionNumber != undefined) + ? this.tableOfContents[this.tableOfContents.length-1].subsectionNumber+1 + : 1; + return { prefix: String(sectionNumber) + '.' + String(subsectionNumber), sectionNumber: sectionNumber, subsectionNumber: subsectionNumber, href: href }; + } + +} diff --git a/nietzsche-beta-app/src/app/support/menu.component.html b/nietzsche-beta-app/src/app/support/menu.component.html new file mode 100644 index 0000000..468f200 --- /dev/null +++ b/nietzsche-beta-app/src/app/support/menu.component.html @@ -0,0 +1,7 @@ +
+ + + {{item.title}} + +
diff --git a/nietzsche-beta-app/src/app/support/menu.component.scss b/nietzsche-beta-app/src/app/support/menu.component.scss new file mode 100644 index 0000000..b148d10 --- /dev/null +++ b/nietzsche-beta-app/src/app/support/menu.component.scss @@ -0,0 +1,12 @@ +button { + white-space: nowrap; + display: inline; +} +#mymenu{ +} +.level0 { + text-decoration: underline; +} +.level1 { + margin-left: 15px; +} diff --git a/nietzsche-beta-app/src/app/support/menu.component.spec.ts b/nietzsche-beta-app/src/app/support/menu.component.spec.ts new file mode 100644 index 0000000..beb2d9b --- /dev/null +++ b/nietzsche-beta-app/src/app/support/menu.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { MenuComponent } from './menu.component'; + +describe('MenuComponent', () => { + let component: MenuComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ MenuComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(MenuComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/nietzsche-beta-app/src/app/support/menu.component.ts b/nietzsche-beta-app/src/app/support/menu.component.ts new file mode 100644 index 0000000..fff2974 --- /dev/null +++ b/nietzsche-beta-app/src/app/support/menu.component.ts @@ -0,0 +1,23 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { ActivatedRoute, Params } from '@angular/router'; +import { Content } from './models'; + +@Component({ + selector: 'menu', + templateUrl: './menu.component.html', + styleUrls: ['./menu.component.scss'] +}) +export class MenuComponent implements OnInit { + @Input() titles: Content[] = [] + queryParams: Params; + + constructor(private activatedRoute: ActivatedRoute ) { } + + ngOnInit() { + this.activatedRoute.queryParams.subscribe( (queryParams: Params ) => { + this.queryParams = queryParams; + }); + + } + +} diff --git a/nietzsche-beta-app/src/app/support/models.ts b/nietzsche-beta-app/src/app/support/models.ts new file mode 100644 index 0000000..cb844cb --- /dev/null +++ b/nietzsche-beta-app/src/app/support/models.ts @@ -0,0 +1,8 @@ +export interface Content { + title: string; + link: string; + prefix: string; + sectionNumber: number; + level?: number; + subsectionNumber?: number; +} diff --git a/nietzsche-beta-app/src/app/support/subheading.component.ts b/nietzsche-beta-app/src/app/support/subheading.component.ts new file mode 100644 index 0000000..89eb4e6 --- /dev/null +++ b/nietzsche-beta-app/src/app/support/subheading.component.ts @@ -0,0 +1,17 @@ +import { Component, OnInit } from '@angular/core'; +import { HeadingComponent } from './heading.component'; + +@Component({ + selector: 'subheading', + templateUrl: './heading.component.html', + styleUrls: ['./heading.component.scss'] +}) +export class SubheadingComponent extends HeadingComponent { + level: number = 1; + + constructor() { + super(); + } + + +} diff --git a/nietzsche-beta-app/src/app/support/subsubheading.component.ts b/nietzsche-beta-app/src/app/support/subsubheading.component.ts new file mode 100644 index 0000000..e73a559 --- /dev/null +++ b/nietzsche-beta-app/src/app/support/subsubheading.component.ts @@ -0,0 +1,17 @@ +import { Component, OnInit } from '@angular/core'; +import { HeadingComponent } from './heading.component'; + +@Component({ + selector: 'subsubheading', + templateUrl: './heading.component.html', + styleUrls: ['./heading.component.scss'] +}) +export class SubSubheadingComponent extends HeadingComponent { + level: number = 2; + + constructor() { + super(); + } + + +} diff --git a/nietzsche-beta-app/src/app/support/support.component.html b/nietzsche-beta-app/src/app/support/support.component.html new file mode 100644 index 0000000..d5249c1 --- /dev/null +++ b/nietzsche-beta-app/src/app/support/support.component.html @@ -0,0 +1,519 @@ + + + + Anleitung + + + + {{item.prefix + ' ' + item.title}} + + + +
+

Die digitale Edition „Der späte Nietzsche“ macht die Mappen Mp + XIV-XVIII mit sämtlichen Hintergrundinformationen sowohl als + Faksimile wie auch in der differenzierten Transkription je einzeln wie + auch in einer synoptischen Darstellung zugänglich.

+

Über den Menupunkt Digitale Edition + wird diese aufgerufen. Unterhalb des Menus erscheint auf der linken Seite die + Navigationsleiste und auf der rechten Seite + ein Untermenu mit dem Inhalt des jeweils ausgewählten Menupunktes. Per Default wird die + Manuskriptansicht + der ersten archivalischen Manuskripteinheit angezeigt. +

+
+ +
+

Die Navigationsleiste hat zwei Untermenus (Manuskripte und Seiten) + und ein Textfeld Filter.

+
+
+
+

Manuskripte

+ +
+
+

Im Menu Manuskripte dient die Navigation zur Auswahl einer archivalischen Manuskripteinheit. + Die ausgewählte Manuskripteinheit wird in der + Manuskriptansicht + geöffnet. +

+

Die archivalischen Manuskripteinheiten werden in Kacheln angezeigt. Dabei zeigt eine Kachel links + jeweils eine Vor­schau der ersten Manuskriptseite und rechts in fetter Schrift die hier verwendete + Bezeichnung der archivalischen Manuskripteinheit, sowie darunter die GSA-Signatur und eine symbolische Repräsentation + der Daten­lage: + +

+

Mittels des Textfeldes Filter kann die Auswahl der dar­gestellten archivalischen Manuskripteinheiten + ein­ge­schränkt werden. Dabei bezieht sich der Filterausdruck auf die Be­zeichnung der archivalischen Manuskripteinheiten. +

+
+
+
+
+

Seiten

+ +
+
+

Im Menu Seiten dient die Navigation zur Auswahl einer Manuskriptseite. + Die ausgewählte Manuskriptseite wird in der + Seitenansicht + geöffnet. +

+

Die Manuskriptseiten werden in Kacheln angezeigt. Dabei zeigt eine Kachel oben + jeweils in fetter Schrift die Paginierung, sowie darunter die + Bezeichung der ent­sprech­enden archivalischen Manuskripteinheit; + darunter erscheint eine Vorschau der Trans­kription und des Faksimiles, + sowie eine symbolische Repräsentation + der Daten­lage: + +

+

Mittels des Textfeldes Filter kann die Auswahl der + dar­gestellten Manuskriptseiten + ein­ge­schränkt werden. Dabei bezieht sich der + Filterausdruck auf die Paginierung der + Manuskriptseiten.

+
+
+ +
+

In der Manuskriptansicht werden Informationen zu einer ausgewählten archivalischen Manuskripteinheit angezeigt.

+

+
+

Navigation der Manuskriptansicht

+
+
    +
  1. Navigationsleiste ein-/ausblenden
  2. +
  3. Vollbildansicht ein/aus
  4. +
+

+

+

+
+

Manuskriptbeschreibungen

+
+

+ Unter der Rubrik Manuskriptbeschreibungen werden die einzelnen Manuskriptblätter beschrieben. Eine Vorschau + zeigt dabei jeweils die Faksimiles der in dieser Edition enthaltenen Seiten der Blätter sowie ihre Paginierung. +

+

+

Über die Knöpfe launch und chrome_reader_mode kann eine Manuskriptseite + in der Seitenansicht + geöffnet werden. Dabei öffnet launch die Seite in einem neuen Tab. +

+
+ +

Navigation der Seitenansicht

+

+
+
    +
  1. Navigationsleiste ein-/ausblenden
  2. +
  3. Vollbildansicht ein/aus
  4. +
  5. Gehe zu erster Seite der ausgewählten archivalischen Manuskripteinheit
  6. +
  7. Gehe zu vorangegangener Seite
  8. +
  9. Ansicht: Transkription, Faksimile, Transkription/Faksimile, Faksimile/Transkription
  10. +
  11. Zoom
  12. +
  13. Seitenidentifikation. Erscheint das Symbol info, dann kann über diesen Knopf die Seiteninformation angezeigt werden.
  14. +
  15. Rotation nach rechts/links um 90°
  16. +
  17. Suche auf der Seite. Mittels des Knopfs search kann die Volltextsuche Suche aufgerufen werden.
  18. +
  19. Gehe zu nächster Seite
  20. +
  21. Gehe zu letzter Seite der ausgewählten archivalischen Manuskripteinheit
  22. +
+
+

Seitenansicht

+

+
+

Die Seitenansicht zeigt das farblich hervorgehobene + Transkriptionsfeld (IIa) + und/oder das Faksimile (IIb). Im + Bearbeitungszustand "Textdaten vollständig erfasst" werden die + Wörter gelb hervorgehoben und ein Tooltip zeigt + Zusatzinformationen an, wenn die Maus darüber bewegt wird. In + der synoptischen Ansicht wird auch das entsprechende Wort der + anderen Ansicht hervorgehoben angezeigt.
+ Die zum seitlichen Rand + hin anschließende Spalten (I) + bieten Raum für die Marginalien: Die Zeilenmarkierung sowie die + Hinweise zu Anschlüssen bei nicht habituellem Schriftverlauf. +

+

Anders als bei Schriftzeichen läßt sich bei + Seiten- und Passagenstreichungen, Randanstreichungen und + Markierungen nicht immer mit Sicherheit entscheiden, ob diese von + Nietzsche oder von späteren Bearbeiter*innen herrühren. + Für die Dokumentation solcher redaktioneller Spuren im + Manuskript wurde folgende Differenzierung vor­genommen: stammen + sie von Nietzsches Hand, werden sie im Transkriptionsfeld gezeigt; + sind sie mit großer Wahrscheinlichkeit einer fremden Hand + zuzuordnen, werden sie in der Seiteninformation aufgelistet; + bei unsicherer Herkunft werden sie zwar ins Transkriptions­feld + übernommen, ihre Zuschreibung in der Seiteninformation + jedoch in Frage gestellt. +

+

Hinweise:

+
    +
  • + Werden Wörter oder Zeilennummern angeklickt, dann erscheinen die + entsprechenden Wörter/Zeilen violett hervorgehoben. In der URL + ist diese Information enthalten, so dass sie + kopiert und verwendet werden kann. Daher kann per Link auf ein oder + mehrere Wörter/Zeilen Bezug genommen werden.
  • +
  • Wurden Wörter angeklickt, dann erscheint in der + Datenabfrage + ein Panel Wortfilter, mittels dessen die IRIs + der entsprechenden Wörter als Filter für + die Anfrage ausgewählt werden können. +
  • +
  • + Eine weitere Funktion, die für die Datenabfrage genutzt werden kann, ist der <Ctrl-Klick> + auf ein Wort. In diesem Fall erscheint ein Javascript-Alert mit der IRI + des entsprechenden Wortes. +
  • +
+
+

I Marginalien

+

+
+

Zeilenmarkierung: Für eine differenzierte Umschrift, die auch die typographischen Aspekte des Manuskripts berücksichtigt, ist eine + regelrechte Zeilenzählung bezüglich vieler Manuskriptseiten oft nicht praktikabel, bisweilen unmöglich. Bei der + hier vorgenommenen Zeilenmarkierung, die ausschließlich der Funktion einer bequemeren Referenz dient, sind + die indizierten Zeilen mit geraden Zahlen bezeichnet; die dadurch eingeschlossenen Zwischenräume werden + durch die entsprechenden, in der Zeilenzahlleiste nicht ausgedruckten ungeraden Zahlen repräsentiert. +

+

+ Anschlusspfeile: Auf den unmittelbaren Fortgang des Schreibverlaufs, sofern dieser nicht offensichtlich ist, weisen als Lesehilfe + Anschlusspfeile hin. Dabei zeigen die Pfeile in der linken Spalte textuelle Anschlüsse zu + der entsprechenden Zeile, während in der rechten Spalte Anschlüsse von dieser Zeile auf eine + andere Zeile erscheinen. Wird die Maus auf einen solchen Pfeil bewegt, dann wird die Zeilenreferenz des Anschlusses + eingeblendet, sowie (falls sich die Referenz auf eine andere Seite bezieht) eine Vorschau auf die entsprechende Zeile (s.o.). +

+
+

IIa Transkription

+
+

Die Wiedergabe der Schriftverteilung auf den Manuskriptseiten (Ränder, Einzüge, Zeilenabstände etc.) ist nach + Maßgaben des Drucks standardisiert; Aufzeichnungen mit Schriftzeilen, die in der gewählten Laufweite im + Transkriptionsfeld nicht Platz fänden, werden kondensiert.

+

+ Die Transkription unternimmt es nicht, die in den Aufzeichnungen wechselnde Deutlichkeit der Schrift + abzubilden. Abkürzungen werden als solche wiedergegeben, die zahlreichen Ligaturen und Verschleifungen + aber aufgelöst. +

+

+ In deutscher Schreibschrift niedergeschriebene Passagen sind in der Transkription durch Antiquaschrift, in lateinischer + Schreibschrift oder Druckschrift geschriebene Passagen in seriphenloser Schrift gesetzt; wo diese Schriftarten in + Nietzsches Handschrift nicht ohne Abweichungen und Mischungen vorkommen, kann nur der jeweils + vorherrschende Duktus differenziert werden. +

+

+ Die Verwendung verschiedener Schreibmittel wird durch unterschiedliche Farben in der Transkription dargestellt; es + wird zwischen schwarzen, braunen und violetten Tinten, sowie zwischen Blei-, Rot- und Blaustiften + unterschieden. Bei der Vielzahl verwendeter Tinten und Stifte identifizieren die Druckfarben nicht ein einzelnes + Schreibgerät oder -mittel, sie indizieren aber deren jeweilige Differenzierbarkeit. Eine weitere Druckfarbe + (’grün’) signalisiert einen separierbaren Korrekturvorgang mit einer bereits verwendeten Tintenfarbe; diese wird + kurz als „Tinte der letzten Korrektur“ bezeichnet. +

+

+ Um darüber hinaus einzelne Schreib- und Korrekturvorgänge zu differenzieren, benutzt die Transkription + unterschiedliche Schriftgrößen; die ursprüngliche Niederschrift ist in normaler Größe wiedergegeben; als + Einfügungen oder nicht selbständige Hinzufügungen gewertete Schriftzüge erscheinen in Petitschrift; an diesen + nochmals vorgenommene Änderungen oder Zusätze werden in einer kleineren Petitschrift gesetzt, falls dieser + Vorgang nicht schon durch die Position des Schriftzugs oder durch das differente Schreibmittel erkennbar ist. +

+

+ Grafische Elemente des Manuskripts (Streichungen, Abtrennungslinien, Einfügungs- oder + Fortsetzungslinien, Zeichnungen etc.) sind stark stilisiert; insbesondere gibt die Transkription nur über die + Häufigkeit, nicht aber über unterschiedliche Weisen der Durchstreichung einzelner Wörter oder Zeilen + Auskunft; diagonale Passagen- und Seitenstreichungen werden als solche wiedergegeben, andere Formen + (Mehrfachstreichungen, Schraffur- oder Kreuzstreichungen etc.) werden als X-förmige Tilgung gezeigt. +

+

Unterlegte Areale im Transkriptionsfeld weisen auf Korrekturen und Überschreibungen hin.

+
+
Korrekturen
+

+
+

Wird die Maus über ein Wort mit Korrekturen bewegt, dann wird der Korrekturverlauf eingeblendet. Die Versionsnummern + werden dabei aufsteigend vorangestellt.

+
+
Überschreibungen
+

+
+

Wird die Maus über ein Wort bewegt, das ein anderes überschreibt, dann zeigt der Tooltip das überschriebene + Word. Bei Teilüberschreibungen wird der überschreibende Wortteil farblich hervorgehoben.

+
+
Bearbeitungsspuren fremder Hände
+
+

Randanstreichungen und (zumeist vertikal-zentrierte) Passagen- + oder Seitenstreichungen werden unter Angabe der in der Transkription betroffenen Zeilen + in den Seiten­informationen mitgeteilt. Markierungen und Kommentare oder andere Notizen + sind transkribiert; den (ungefähren) Ort dieser Aufzeichnungen im Manuskript signalisiert ein ins + Transkriptionsfeld gesetzter Platzhalter ◊. Wird die Maus über dieses Symbol bewegt, erscheint + ein Tooltip in violetter Farbe, in dem Inhalt und Schreibmittel (kursiv) mitgeteilt werden. +

+

+

+ Nicht unter die verzeichneten Spuren fremder Hand werden die + stereotypen Prozeduren von Paginierung und Foliierung aufgenommen; sie sind in den Manuskriptbeschreibungen dokumentiert. +

+
+

In der Transkription benutzte Schriften und Farben

+

+

IIb Faksimile

+
+

Auf dem Faksimile werden die gleichen Informationen wie auf dem Transkriptionsfeld eingeblendet. Zudem wird + das Symbol an einer freien Ecke eingeblendet, über das die Copyright Information + zum Faksimile aufgerufen werden kann.

+
+

+

Seiteninformation

+

+
+

Die Seiteninformation wird von unten eingeblendet und zeigt (falls vorhanden):

+
    +
  • Druckorte: Es werden die Druckorte für solche Aufzeichnungen angegeben, die als Vorlage für die + „Nachgelassenen Fragmente“ in KGW VII 3 und KGW VIII 1-3, für die „Vorstufen“ und „Fassungen“ in KGW + VII 4/2 und KSA und für in die Brief­wechsel­ausgabe übernommenen „Briefentwürfe“ in KGB interpretiert + werden konnten.
  • +
  • Kritische Anmerkungen: + Es werden kritische Anmerkungen zur Seite mitgeteilt, deren Art und Anzahl + sich auch subjektiven Entscheidungen verdanken. Ist die vor dem Lemma stehende Zeilenzahl unterstrichen + so bezieht sich die Mitteilung auf ein überschriebenes Wort der entsprechenden Zeile.
    + Mit „?“ wird auf unsichere Entzifferungen hingewiesen, mit „¿“ auf stark verschliffene oder atypische (in + der Transkription nicht wiedergegebene, durch roten Fettdruck hervorgehobene) Schreibweisen und mit „Vk“ auf + (ebenfalls durch roten Fettdruck hervorgehobene) Verdeutlichungskorrekturen im Manuskript, die wohl eine leichtere + Lesbarkeit auch für den Schreiber bewirken sollten.
    + Schreibfehler werden nur dort nach „>“ von den Herausgebern korrigiert (beziehungsweise nach „>?“ bei + einem aus mehreren möglichen Verbesserungen gewählten Vorschlag), wo sie als Lesehilfen nötig erscheinen; + ebenso wird bei Auflösungen von Abkürzungen verfahren.
    + Insbesondere die bei Änderungen im Manuskript nicht systematisch durchgeführten grammatikalischen + Anpassungen sind in diesen Anmerkungen nicht ergänzt; der Ausdruck „nach unvollständiger Korrektur des + Kontextes >“ macht aber auf den Umstand aufmerksam, daß ein im Manuskript nicht verbesserter Schriftzug dank seiner Gestalt + schon als die von den Herausgebern mitgeteilte, dem korrigierten Kontext entsprechende Lesart interpretiert + werden kann.
    + Um nicht die Kohärenz von Aufzeichnungen zu konstituieren, wo sie allenfalls thematisch naheliegt, von + der Manuskriptgestalt her aber nicht gesichert ist, werden solche Fortsetzungen oder vermuteteten Fortsetzungen, in Abgrenzung von + durch die Anschlusspfeile behaupteten Schreibverläufen, nur in den Seiteninformationen mitgeteilt. +
  • +
  • Querverweise: per Klick wird der Eintrag im Untermenu Querverweise geöffnet
  • +
  • Manuskriptbeschreibung
  • +
+
+

Tooltip

+

+
+

Der Tooltip zeigt folgende Informationen:

+
    +
  • Wörter: Wort, Kritische Anmerkungen, Korrekturverlauf, Überschreibungen. Die auf der Transkription + verwendete Farbe zur Darstellung des Wortes wird wegen der Sichtbarkeit auf dunklem Hintergrund invertiert.
  • +
  • Bearbeitungsspuren fremder Hände: Inhalt und Schreibmittel (kursiv) vor violettem Hintergrund
  • +
  • Anschlusspfeile: Zeilenreferenz und Vorschau auf Zeileninhalt
  • +
+
+ +

Die Ansicht Querverweise zeigt entweder alle Querverweise der ausgewählten archivalischen Manuskripteinheit oder der ausgewählten Seite.

+

Querverweise einer Manuskripteinheit

+

+

Querverweise einer Seite

+

In dieser Ansicht werden die textgenetischen Querverweise zu den Abschreibprozessen einer Seite angezeigt und die ausgewählten Stellen übereinander + zur vergleichenden Lektüre dargestellt.

+

+

Legende:

+
    +
  1. Vollbildansicht ein/aus
  2. +
  3. Zeige alle Querverweise der ausgewählten Manuskripteinheit
  4. +
  5. Die ausgewählte Seite in der Seitenansicht öffnen
  6. +
  7. Zoom
  8. +
  9. Suche: Text wird auf ausgewählten Stellen angezeigt. Über das Symbol search kann die Volltextsuche Suche + aufgerufen werden.
  10. +
  11. Darstellung des Abschreibeverhältnis der Textstellen. Die Textstellen können über die Kacheln + ein- bzw. ausgeblendet werden.
  12. +
  13. Anzeige der ausgewählten Textstellen zur vergleichenden Lektüre: +
      +
    • a: Seitenidentifikation
    • +
    • b: Identifikation der Textstelle
    • +
    +
  14. +
+ +
+

Die Suche kann als Volltextsuche verwendet werden. Allerdings + erfolgt die Suche auf einer nicht-linearisierten Transkription. Damit + nun aber dennoch Phrasen aufgefunden werden können, wurden für + jede Seite mittels Machine Reasoning pseudo-lineare Texte erzeugt. In einem ersten Schritt wird + in diesen nach der exakten Phrase gesucht. In einem zweiten Schritt + werden die entsprechenden nicht-linearen Transkriptionen für die + gefundenen pseudo-linearen Texte angezeigt. Dabei kann nicht + garantiert werden, dass jede in den Manuskripten enthaltene Phrase + tatsächlich gefunden wird. +

+
+

+

Legende:

+
    +
  1. Navigationsleiste ein-/ausblenden
  2. +
  3. Vollbild ein-/ausblenden
  4. +
  5. Zoom
  6. +
  7. Eingabe der zu suchenden Phrase. Mit Enter oder per Klick auf das Symbol search wird die Suche ausgeführt.
  8. +
  9. Optionen
  10. +
  11. Anzeige der Treffermenge
  12. +
  13. Seitenidentifikation für Seiten mit Treffer
  14. +
  15. Hervorhebung der gesuchten Wörter
  16. +
+
Optionen
+

+

Legende:

+
    +
  1. Groß- und Kleinschreibung ignorieren: ein/aus
  2. +
  3. Einschränkung des Korpus auf ausgewählte Manuskripteinheiten. (Ohne Auswahl wird in allen Manuskripteinheiten gesucht)
  4. +
+ +
+

Die Datenabfrage erlaubt, per Menu komplexe Anfragen zu den Eigenschaften der transkribierten Wörtern zusammenzustellen und auszuführen. + Die Anfrage selektiert alle Wörter, die über die ausgewählten Eigenschaften verfügen. + Dabei können die Resultate erstens in einer Tabelle angezeigt, in der sie in ein quantitatives Verhähltnis zu den Wörtern gesetzt + werden, die nicht über diese Eigenschaften verfügen, zweitens als Rohdaten aufgelistet und drittens als CSV- oder JSON-Datei heruntergeladen werden. +

+
+

+

Legende:

+
    +
  1. Navigationsleiste ein-/ausblenden
  2. +
  3. Vollbild ein-/ausblenden
  4. +
  5. Worteigenschaften: Zum Auswählen aufklappen
  6. +
  7. Wortfilter: Falls Wörter vorgängig durch Anklicken ausgewählten wurden, können deren IRIs hier als Filter verwendet werden + (siehe Hinweise).
  8. +
  9. Einschränkung des Korpus auf ausgewählte Manuskripteinheiten. (Ohne Auswahl bezieht sich die Anfrage auf alle Manuskripteinheiten)
  10. +
  11. SPARQL-Query: Aufklappen zur Bearbeitung der Anfrage in SPARQL (Optional)
  12. +
  13. Im Reiter Tabelle werden die Resultate in ihrem quantitativen Verhähltnis zu anderen Daten dargestellt.
  14. +
  15. Im Reiter Rohdaten werden die Resultate in ihrer unmittelbaren Form präsentiert.
  16. +
  17. Im Reiter Datenmodell kann das Datenmodell, auf dem die Daten beruhen, angezeigt werden. Dies ist etwa hilfreich, + wenn man die SPARQL-Query selbst bearbeiten möchte.
  18. +
+
Worteigenschaften
+
+

Im Dialogpanel Worteigenschaften lassen sich diejenigen Eigenschaften auswählen, für die ein Wort + selektiert werden soll. +

+
+

+

Legende:

+
    +
  1. Selektiert alle Wörter, für die es eine frühere Schreibversion gibt.
  2. +
  3. Selektiert alle Wörter, die von Nietzsche gestrichen wurden.
  4. +
  5. Selektiert alle Wörter, die von Nietzsche korrigiert wurden.
  6. +
  7. Selektiert alle Wörter, die ein anderes Wort überschreiben.
  8. +
  9. Selektiert alle Wörter, deren Wortstreichung von Nietzsche aufgehoben wurde.
  10. +
  11. Selektiert alle Wörter, die diesem regulären Ausdruck entsprechen. + Im einfachsten Fall ist der reguläre Ausdruck identisch bzw. ein Teil des Wortes.
  12. +
  13. Als Datengrundlage Wörter mit bzw. ohne Satzzeichen verwenden.
  14. +
  15. Als Datengrundlage edierte bzw. unedierte Wörter verwenden. Bei edierten Wörtern handelt + es sich einerseits um Korrekturen von Schreibfehlern durch die Editoren und andererseits um automatisch + er­zeugte Wortkorrekturen wie etwa der Entfernung des Trennzeichens bei Wörtern, die über die Zeile hinaus verlaufen.
  16. +
  17. Anfrage absenden: Über diesen Knopf kann die Anfrage abgesendet werden.
  18. +
+
Wortfilter
+
+

Im Dialogpanel Wortfilter können die IRIs + der vorgängig durch Anklicken selektierten Wörter als Filter für die Anfrage ausgewählt werden.

+
+

+
SPARQL-Query
+
+

Im Dialogpanel SPARQL-Query kann die Anfrage direkt als SPARQL-Query bearbeitet werden. +

+
+

+

Legende:

+
    +
  1. Anfrage abschicken.
  2. +
  3. Anfrage zurücksetzen: Anfrage im Zustand der Auswahl durch Worteigenschaften wiederherstellen.
  4. +
  5. SPARQL-Query für Kommandozeilenanfrage mittels curl
  6. +
  7. Kommandozeilenanfrage kopieren
  8. +
+
Tabelle
+
+

Die Tabelle zeigt die Resultate der Anfrage. Dabei werden die Wörter mit den ausgewählten + Eigenschaften in ein quantitatives Verhähltnis zu den Wörtern ohne diese Eigenschaften gesetzt. +

+
+

+

Legende:

+
    +
  1. Information zu den Resultaten: Anzahl Resultate (Anzahl Wortvorkommnisse mit Eigenschaften vs. alle Wortvorkommnisse). + Dabei bezeichnen die Resultate die Anzahl Worte (types) im Unterschied zu den Wortvorkommnissen (tokens). +
  2. +
  3. Filter: Wortfilter mittels Zeichenkette
  4. +
  5. Resultate exportieren: Rohdaten als CSV- oder JSON-Datei exportieren
  6. +
  7. Wort: Diese Spalte zeigt die Wörter (types) mit den ausgewählten Eigenschaften.
  8. +
  9. Anzahl mit Eigenschaften (einfach): Anzahl Vorkommnisse (tokens) mit den ausgewählten Eigenschaften (Einfachzählung).
  10. +
  11. % Wortanteil: Prozentualer Anteil der Vorkommnisse (tokens) mit den ausgewählten Eigenschaften gegenüber aller Vorkommnissen dieses Wortes.
  12. +
  13. % aller Wörter: Prozentualer Anteil der Vorkommnisse (tokens) mit den ausgewählten Eigenschaften gegenüber aller Wortvorkommnissen.
  14. +
  15. Anzahl mit Eigenschaften (mehrfach): Anzahl Vorkommnisse (tokens) mit den ausgewählten Eigenschaften. Mehrfachzählung: Ein Wortvorkommnis wird mehr als einmal gezählt, wenn es die ausgewählte Eigeschaft mehrfach besitzt. Bsp.: Ein zweifach gestrichenes Wort wird zweimal gezählt, wenn die Eigenschaft "Wort ist gestrichen" ausgewählt wird.
  16. +
  17. Anzahl Total: Anzahl der Vorkommnisse diese Wortes insgesamt.
  18. +
  19. % aller Wörter: Prozentualer Anteil der Vorkommnisse dieses Wortes gegenüber allen Wortvorkommnissen.
  20. +
  21. Items per Page: Auswahl der Anzahl Resultate, die pro Seite angezeigt werden.
  22. +
  23. Anzeige der Anzahl Resultate, die auf dieser Seite angezeigt werden vs. aller Resultate
  24. +
  25. Navigation der Resultateseitenanzeige
  26. +
+
Rohdaten
+
+

Die Rohdaten zeigt die Resultate der Anfrage in der Weise, wie sie vom Fuseki Server als Antwort auf + die Anfrage gegeben werden. +

+
+

+

Legende:

+
    +
  1. Resultate exportieren: Rohdaten als CSV- oder JSON-Datei exportieren
  2. +
  3. id: In dieser Spalte wird das Wort des Resultates angezeigt (type).
  4. +
  5. word: In dieser Spalte wird die Referenz auf das Wortvorkommnis angezeigt
  6. +
  7. numText: Anzahl der Wortvorkommnisse insgesamt
  8. +
  9. total: Anzahl aller Wortvorkommnisse
  10. +
  11. Items per Page: Auswahl der Anzahl Resultate, die pro Seite angezeigt werden.
  12. +
  13. Anzeige der Anzahl Resultate, die auf dieser Seite angezeigt werden vs. aller Resultate
  14. +
  15. Navigation der Resultateseitenanzeige
  16. +
+
Datenmodell
+
+

Im Reiter Datenmodell wird das Datenmodell dargestellt, auf dem die Daten der digitalen Edition beruhen. Dieses + Datenmodell kann genutzt werden, um die SPARQL-Query abzuändern oder um eine solche Anfrage von Grund auf auszuarbeiten. +

+
+

+ +
+

Hier lassen sich die Daten der digitalen Edition abfragen. Im Reiter + Datenabfrage + erscheinen dazu vorbereitete Anfragen und ein Textfeld für eigene SPARQL-Anfragen. Im Reiter + Datenmodell + wird das Datenmodell dargestellt, auf dem die Daten der digitalen Edition beruhen. Dieses + Datenmodell kann genutzt werden, um die SPARQL-Query abzuändern oder um eine solche Anfrage von Grund auf auszuarbeiten. +

+
+

+
+

Wird eine vorbereitete Anfrage in der Auswahl Query auswählen ausgewählt, + dann erscheint sie in Form einer SPARQL-Query im Textfeld. Diese kann entweder bearbeitet + oder per Play-Button abgesendet werden. +

+
+

+
+

Die Resultate der Anfrage erscheinen in einer Tabelle. Ausserdem lassen sie sich im CSV- oder JSON-Format + exportieren.

+
+

+
+

Handelt es sich bei dem Inhalt einer Spalte um die IRIs + einer archivalischen Manuskripteinheit, einer Seite oder eines Wortes, dann werden diese zur besseren Lesbarkeit + aufgelöst. Mittels Slider kann aber zwischen der Rohdarstellung und der aufgelösten Darstellung gewechselt werden. + Über die Knöpfe chrome_reader_mode (im gleichen Tab) und launch (in neuem Tab) + lassen sich die einzelnen IRIs als Teil der digitalen Edition anzeigen. +

+
+

+ +
+
diff --git a/nietzsche-beta-app/src/app/support/support.component.scss b/nietzsche-beta-app/src/app/support/support.component.scss new file mode 100644 index 0000000..7358e73 --- /dev/null +++ b/nietzsche-beta-app/src/app/support/support.component.scss @@ -0,0 +1,49 @@ +ol li::marker { + color: red; +} +.roman { + color: red; +} +.img-container { + display: flex; + align-items: center; + justify-content: center; + width: 650px; +} +.img { + flex-basis: 40% +} +.img-text { + font-size: 12pt; + padding-left: 20px; + text-align: justify; + hyphens: auto; + -moz-hyphens: auto; + lang: de; +} +.text { + font-size: 12pt; + text-align: justify; +} +td.text { + width: 320px; +} +div.text { + width: 650px; +} +li { + width: 650px; +} +#navi { + width: 100%; + height: 50px; + margin: 0; + padding: 0; + white-space: nowrap; +} +.level0 { + text-decoration: underline; +} +.level1 { + margin-left: 15px; +} diff --git a/nietzsche-beta-app/src/app/support/support.component.spec.ts b/nietzsche-beta-app/src/app/support/support.component.spec.ts new file mode 100644 index 0000000..191ecee --- /dev/null +++ b/nietzsche-beta-app/src/app/support/support.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HelpComponent } from './help.component'; + +describe('HelpComponent', () => { + let component: HelpComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HelpComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HelpComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/nietzsche-beta-app/src/app/support/support.component.ts b/nietzsche-beta-app/src/app/support/support.component.ts new file mode 100644 index 0000000..4f0b5e9 --- /dev/null +++ b/nietzsche-beta-app/src/app/support/support.component.ts @@ -0,0 +1,45 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute, Params, Router } from '@angular/router'; +import { Content } from './models'; +import { CONTENT_VIEW_ROUTE, CONCEPTION_ROUTE, DATA_ROUTE, DOCUMENTATION_ROUTE, HELP_ROUTE, HOME_ROUTE, IMPRESSUM_ROUTE, PROJECT_ROUTE } from '../constants'; + +@Component({ + selector: 'support', + templateUrl: './support.component.html', + styleUrls: ['./support.component.scss'] +}) +export class SupportComponent implements OnInit { + titles: Content[] = [] + queryParams: Params; + contentViewLink: string[] = [ '/' + CONTENT_VIEW_ROUTE ]; + impressumLink: string[] = [ IMPRESSUM_ROUTE ]; + homeLink: string[] = [ HOME_ROUTE ]; + supportLink: string[] = [ HELP_ROUTE ]; + projectLink: string[] = [ PROJECT_ROUTE]; + dataLink: string[] = [ DATA_ROUTE]; + conceptionLink: string[] = [ CONCEPTION_ROUTE]; + index: number = 0; + + + constructor(private activatedRoute: ActivatedRoute, private router: Router ) { } + + ngOnInit() { + this.activatedRoute.queryParams.subscribe( (queryParams: Params ) => { + this.queryParams = queryParams; + }); + + } + getContentClass(level: number): string { + return 'level' + level; + } + getNextChildFragment(index: number, titles: Content[]): string { + if (titles == undefined || titles == null || titles.length <= index) return ''; + return titles[index].link; + } + moveToMenuItem(hash: string){ + console.log(hash); + this.router.navigate([], { queryParams: this.queryParams, fragment: hash }); + setTimeout(()=>{ + window.location = window.location;}, 200); + } +} diff --git a/nietzsche-beta-app/src/app/tln-edition/tln-navigation-elements/toggle-navigation.component.html b/nietzsche-beta-app/src/app/tln-edition/tln-navigation-elements/toggle-navigation.component.html index 0cfcac8..597250f 100644 --- a/nietzsche-beta-app/src/app/tln-edition/tln-navigation-elements/toggle-navigation.component.html +++ b/nietzsche-beta-app/src/app/tln-edition/tln-navigation-elements/toggle-navigation.component.html @@ -1,7 +1,7 @@ - diff --git a/nietzsche-beta-app/src/app/tln-edition/tln-navigation-elements/toggle-navigation.component.ts b/nietzsche-beta-app/src/app/tln-edition/tln-navigation-elements/toggle-navigation.component.ts index ed62080..d8d89df 100644 --- a/nietzsche-beta-app/src/app/tln-edition/tln-navigation-elements/toggle-navigation.component.ts +++ b/nietzsche-beta-app/src/app/tln-edition/tln-navigation-elements/toggle-navigation.component.ts @@ -1,33 +1,34 @@ -import { Component, OnInit} from '@angular/core'; +import { Component, Input, OnInit} from '@angular/core'; import { Router, ActivatedRoute, Params } from '@angular/router'; import { TLN_SEARCH_ROUTE, TLN_FULLSCREEN_PARAM, TLN_NAV_BAR_OPEN_STATE_PARAM} from '../constants'; import { Mapping } from '../route-reader'; import { RouteUpdater } from '../route-updater'; @Component({ selector: 'toggle-navigation', templateUrl: './toggle-navigation.component.html', styleUrls: ['./toggle-navigation.component.css'] }) export class ToggleNavigationComponent extends RouteUpdater { + @Input() showNavBarOpenButton: boolean = true; fullscreen: boolean = false; navBarOpenState: boolean = false; protected mapping: Mapping = { navBarOpenState: { param: TLN_NAV_BAR_OPEN_STATE_PARAM, type: "boolean" }, fullscreen: { param: TLN_FULLSCREEN_PARAM, type: "boolean" } } constructor(protected router: Router, protected activatedRoute: ActivatedRoute ) { super(router, activatedRoute); } private toggleFullscreen(){ this.fullscreen = !this.fullscreen; this.updateParams(); } toggleNavDrawer(){ this.navBarOpenState = !this.navBarOpenState; this.updateParams(); } } diff --git a/nietzsche-beta-app/src/app/tln-edition/tln-quant/tln-data.component.css b/nietzsche-beta-app/src/app/tln-edition/tln-quant/tln-data.component.css index e56d8c9..ce8302e 100644 --- a/nietzsche-beta-app/src/app/tln-edition/tln-quant/tln-data.component.css +++ b/nietzsche-beta-app/src/app/tln-edition/tln-quant/tln-data.component.css @@ -1,3 +1,4 @@ .select { width: 100%; } + diff --git a/nietzsche-beta-app/src/app/tln-edition/tln-status/tln-status.component.css b/nietzsche-beta-app/src/app/tln-edition/tln-status/tln-status.component.css index e69de29..3c65360 100644 --- a/nietzsche-beta-app/src/app/tln-edition/tln-status/tln-status.component.css +++ b/nietzsche-beta-app/src/app/tln-edition/tln-status/tln-status.component.css @@ -0,0 +1,8 @@ +.show-container { + margin-top: 10px; + margin-left: 10%; + margin-right: 10%; +} +.description { + padding: 5px; +} diff --git a/nietzsche-beta-app/src/app/tln-edition/tln-status/tln-status.component.html b/nietzsche-beta-app/src/app/tln-edition/tln-status/tln-status.component.html index 3324252..4675359 100644 --- a/nietzsche-beta-app/src/app/tln-edition/tln-status/tln-status.component.html +++ b/nietzsche-beta-app/src/app/tln-edition/tln-status/tln-status.component.html @@ -1 +1,7 @@ -{{getStatus(tlnStatus)}} +{{getStatus(tlnStatus.status)}} +
+
+ {{key}}{{getSaveInformation(key, iconDescriptions, 'asdf')}} +
+
diff --git a/nietzsche-beta-app/src/app/tln-edition/tln-status/tln-status.component.ts b/nietzsche-beta-app/src/app/tln-edition/tln-status/tln-status.component.ts index 58864a4..b24f6e9 100644 --- a/nietzsche-beta-app/src/app/tln-edition/tln-status/tln-status.component.ts +++ b/nietzsche-beta-app/src/app/tln-edition/tln-status/tln-status.component.ts @@ -1,81 +1,89 @@ import { Component, Input, OnInit } from '@angular/core'; import { TlnQueryServiceInterface } from '../models'; import { TlnCacheQueryService} from '../tln-query.service'; import { DataHandler} from '../data_handler'; import { TlnStatus } from '../datatypes/status'; import { DATA_PROCESSING_STATUS } from '../constants'; /** * Given a page or manuscript IRI, this component will request its status information and * symbolize it with an icon. **/ @Component({ selector: 'tln-status', templateUrl: './tln-status.component.html', styleUrls: ['./tln-status.component.css'] }) export class TlnStatusComponent implements OnInit { + readonly SHOW_NONE_OPTION: number = -1; + readonly SHOW_PAGE_OPTION: number = 0; + readonly SHOW_MANUSCRIPT_OPTION: number = 1; + @Input() showDataStatusOptions: number = this.SHOW_NONE_OPTION; @Input() currentIri: string; /** * OPTIONAL pass a queryService with method * {@link /interfaces/TlnQueryServiceInterface.html#getData|getData} * to TlnPageViewComponent. **/ @Input() queryService: TlnQueryServiceInterface; /** * the data handler of this component that retrieves * data and instantiates it according to their proper * datatypes. **/ dataHandler: DataHandler = new DataHandler(this); private readonly icon_names: string[] = [ 'task_alt', 'data_saver_on', 'data_saver_off' ]; readonly descriptions: string[] = [ 'Textdaten vollständig erfasst', 'Textdaten teilweise erfasst', 'Ohne Textdaten' ] private readonly DEFAULT: string = this.icon_names[0]; private readonly DEFAULT_DESCRIPTION: string = this.descriptions[0]; data_processing_dict = {} iconDescriptions = {} tlnStatus: TlnStatus; constructor(private localQueryService: TlnCacheQueryService) { } ngOnInit() { + this.initDataProcessingDict(); if (this.currentIri != undefined && this.currentIri != null){ - this.initDataProcessingDict(); this.localQueryService.use_cache = true; let tlnQueryService = (this.queryService != null) ? this.queryService : this.localQueryService; this.dataHandler.addHandler('tlnStatus', { 'handler': TlnStatus }); this.dataHandler.setQueryService(tlnQueryService); this.dataHandler.getData('tlnStatus', this.currentIri); } } private initDataProcessingDict() { const data_processing_keys = Object.values(DATA_PROCESSING_STATUS); for (let i = 0; i < this.icon_names.length; i++){ this.data_processing_dict[data_processing_keys[i]] = this.icon_names[i]; } this.iconDescriptions = this.getIconDescriptions(); } - private getStatus(currentStatus: TlnStatus): string { - const status = (currentStatus != undefined) ? currentStatus.status : undefined; + private getStatus(currentStatus: string): string { + const status = (currentStatus != undefined) ? currentStatus : undefined; return this.getSaveInformation(status, this.data_processing_dict, this.DEFAULT); } - private getDescription(currentStatus: TlnStatus): string { + private getDescription(currentStatus: string): string { const icon = this.getStatus(currentStatus); return this.getSaveInformation(icon, this.iconDescriptions, this.DEFAULT_DESCRIPTION); } private getSaveInformation(key: string, dictionary: Object, defaultValue: string): string { if (key == undefined || key == null || dictionary[key] == undefined){ return defaultValue; } return dictionary[key]; } + private getKeys(): string[] { + if(this.showDataStatusOptions > this.SHOW_PAGE_OPTION) return this.icon_names; + return [ this.icon_names[0], this.icon_names[2] ]; + } public getIconDescriptions(): Object { let iconDescriptions = {}; for (let i = 0; i < this.icon_names.length; i++){ iconDescriptions[this.icon_names[i]] = this.descriptions[i]; } return iconDescriptions; } }