MOBILE-4292 multilang2: Create new multilang filter
This commit is contained in:
		
							parent
							
								
									61809c06c8
								
							
						
					
					
						commit
						772864245e
					
				@ -25,6 +25,7 @@ import { AddonFilterGlossaryModule } from './glossary/glossary.module';
 | 
			
		||||
import { AddonFilterMathJaxLoaderModule } from './mathjaxloader/mathjaxloader.module';
 | 
			
		||||
import { AddonFilterMediaPluginModule } from './mediaplugin/mediaplugin.module';
 | 
			
		||||
import { AddonFilterMultilangModule } from './multilang/multilang.module';
 | 
			
		||||
import { AddonFilterMultilang2Module } from './multilang2/multilang2.module';
 | 
			
		||||
import { AddonFilterTexModule } from './tex/tex.module';
 | 
			
		||||
import { AddonFilterTidyModule } from './tidy/tidy.module';
 | 
			
		||||
import { AddonFilterUrlToLinkModule } from './urltolink/urltolink.module';
 | 
			
		||||
@ -42,6 +43,7 @@ import { AddonFilterUrlToLinkModule } from './urltolink/urltolink.module';
 | 
			
		||||
        AddonFilterMathJaxLoaderModule,
 | 
			
		||||
        AddonFilterMediaPluginModule,
 | 
			
		||||
        AddonFilterMultilangModule,
 | 
			
		||||
        AddonFilterMultilang2Module,
 | 
			
		||||
        AddonFilterTexModule,
 | 
			
		||||
        AddonFilterTidyModule,
 | 
			
		||||
        AddonFilterUrlToLinkModule,
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										29
									
								
								src/addons/filter/multilang2/multilang2.module.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								src/addons/filter/multilang2/multilang2.module.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,29 @@
 | 
			
		||||
// (C) Copyright 2015 Moodle Pty Ltd.
 | 
			
		||||
//
 | 
			
		||||
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
// you may not use this file except in compliance with the License.
 | 
			
		||||
// You may obtain a copy of the License at
 | 
			
		||||
//
 | 
			
		||||
//     http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
//
 | 
			
		||||
// Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
 | 
			
		||||
import { APP_INITIALIZER, NgModule } from '@angular/core';
 | 
			
		||||
 | 
			
		||||
import { CoreFilterDelegate } from '@features/filter/services/filter-delegate';
 | 
			
		||||
import { AddonFilterMultilang2Handler } from './services/handlers/multilang2';
 | 
			
		||||
 | 
			
		||||
@NgModule({
 | 
			
		||||
    providers: [
 | 
			
		||||
        {
 | 
			
		||||
            provide: APP_INITIALIZER,
 | 
			
		||||
            multi: true,
 | 
			
		||||
            useValue: () => CoreFilterDelegate.registerHandler(AddonFilterMultilang2Handler.instance),
 | 
			
		||||
        },
 | 
			
		||||
    ],
 | 
			
		||||
})
 | 
			
		||||
export class AddonFilterMultilang2Module {}
 | 
			
		||||
							
								
								
									
										104
									
								
								src/addons/filter/multilang2/services/handlers/multilang2.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								src/addons/filter/multilang2/services/handlers/multilang2.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,104 @@
 | 
			
		||||
// (C) Copyright 2015 Moodle Pty Ltd.
 | 
			
		||||
//
 | 
			
		||||
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
// you may not use this file except in compliance with the License.
 | 
			
		||||
// You may obtain a copy of the License at
 | 
			
		||||
//
 | 
			
		||||
//     http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
//
 | 
			
		||||
// Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
 | 
			
		||||
import { Injectable } from '@angular/core';
 | 
			
		||||
 | 
			
		||||
import { CoreLang } from '@services/lang';
 | 
			
		||||
import { CoreFilterDefaultHandler } from '@features/filter/services/handlers/default-filter';
 | 
			
		||||
import { makeSingleton } from '@singletons';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Handler to support the Multilang filter.
 | 
			
		||||
 */
 | 
			
		||||
@Injectable({ providedIn: 'root' })
 | 
			
		||||
export class AddonFilterMultilang2HandlerService extends CoreFilterDefaultHandler {
 | 
			
		||||
 | 
			
		||||
    name = 'AddonFilterMultilang2Handler';
 | 
			
		||||
    filterName = 'multilang2';
 | 
			
		||||
    replacementDone = false;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This function filters the received text based on the language
 | 
			
		||||
     * tags embedded in the text, and the current user language or
 | 
			
		||||
     * 'other', if present.
 | 
			
		||||
     *
 | 
			
		||||
     * @param text The text to filter.
 | 
			
		||||
     * @returns string The filtered text for this multilang block.
 | 
			
		||||
     */
 | 
			
		||||
    async filter(text: string): Promise<string> {
 | 
			
		||||
        if (text.indexOf('mlang') === -1) {
 | 
			
		||||
            return text;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const currentLang = await CoreLang.getCurrentLanguage();
 | 
			
		||||
        this.replacementDone = false;
 | 
			
		||||
        const parentLanguage = CoreLang.getParentLanguage(currentLang);
 | 
			
		||||
 | 
			
		||||
        const search = /{\s*mlang\s+((?:[a-z0-9_-]+)(?:\s*,\s*[a-z0-9_-]+\s*)*)\s*}(.*?){\s*mlang\s*}/gim;
 | 
			
		||||
        const result = text.replace(
 | 
			
		||||
            search,
 | 
			
		||||
            (subString, language, content) => this.replaceLangs(currentLang, [subString, language, content], parentLanguage),
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        if (result === null) {
 | 
			
		||||
            return text; // Error during regex processing, keep original text.
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (this.replacementDone) {
 | 
			
		||||
            return result;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const result2 = text.replace(
 | 
			
		||||
            search,
 | 
			
		||||
            (subString, language, content) => this.replaceLangs('other', [subString, language, content], parentLanguage),
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        return result2 ?? text;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This function filters the current block of multilang tag. If
 | 
			
		||||
     * any of the tag languages (or their parent languages) match the
 | 
			
		||||
     * specified filtering language, it returns the text of the
 | 
			
		||||
     * block. Otherwise it returns an empty string.
 | 
			
		||||
     *
 | 
			
		||||
     * @param replaceLang A string that specifies the language used to filter the matches.
 | 
			
		||||
     * @param langBlock An array containing the matching captured pieces of the
 | 
			
		||||
     * regular expression. They are the languages of the tag, and the text associated with those languages.
 | 
			
		||||
     * @param parentLanguage A string that contains the parent language.
 | 
			
		||||
     *
 | 
			
		||||
     * @returns replaced string.
 | 
			
		||||
     */
 | 
			
		||||
    protected replaceLangs(replaceLang: string, langBlock: string[], parentLanguage: string | undefined): string {
 | 
			
		||||
        // Normalize languages.
 | 
			
		||||
        const blockLangs = (langBlock[1] ?? '').replace(/ /g, '').replace(/_/g, '-').toLowerCase().split(',');
 | 
			
		||||
        const blockText = langBlock[2] ?? '';
 | 
			
		||||
 | 
			
		||||
        for (const blockLang of blockLangs) {
 | 
			
		||||
            /* We don't check for empty values of blockLang as they simply don't
 | 
			
		||||
             * match any language and they don't produce any errors or warnings.
 | 
			
		||||
             */
 | 
			
		||||
            if (blockLang === replaceLang || parentLanguage === blockLang) {
 | 
			
		||||
                this.replacementDone = true;
 | 
			
		||||
 | 
			
		||||
                return blockText;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return '';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export const AddonFilterMultilang2Handler = makeSingleton(AddonFilterMultilang2HandlerService);
 | 
			
		||||
@ -12,6 +12,8 @@
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
 | 
			
		||||
import { AddonFilterMultilangHandler } from '@addons/filter/multilang/services/handlers/multilang';
 | 
			
		||||
import { AddonFilterMultilang2Handler } from '@addons/filter/multilang2/services/handlers/multilang2';
 | 
			
		||||
import { Component, Input, OnInit, Type } from '@angular/core';
 | 
			
		||||
import { FormGroup } from '@angular/forms';
 | 
			
		||||
 | 
			
		||||
@ -51,6 +53,11 @@ export class CoreUserProfileFieldComponent implements OnInit {
 | 
			
		||||
 | 
			
		||||
        this.componentClass = await CoreUserProfileFieldDelegate.getComponent(this.field, this.signup);
 | 
			
		||||
 | 
			
		||||
        if ('param1' in this.field && this.field.param1) {
 | 
			
		||||
            this.field.param1 = await AddonFilterMultilangHandler.filter(<string> this.field.param1);
 | 
			
		||||
            this.field.param1 = await AddonFilterMultilang2Handler.filter(<string> this.field.param1);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this.data.field = this.field;
 | 
			
		||||
        this.data.edit = CoreUtils.isTrueOrOne(this.edit);
 | 
			
		||||
        if (this.edit) {
 | 
			
		||||
 | 
			
		||||
@ -58,6 +58,7 @@ import { CoreSiteError } from '@classes/errors/siteerror';
 | 
			
		||||
import { CoreUserSupport } from '@features/user/services/support';
 | 
			
		||||
import { CoreErrorInfoComponent } from '@components/error-info/error-info';
 | 
			
		||||
import { CorePlatform } from '@services/platform';
 | 
			
		||||
import { AddonFilterMultilang2Handler } from '@addons/filter/multilang2/services/handlers/multilang2';
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * "Utils" service with helper functions for UI, DOM elements and HTML code.
 | 
			
		||||
@ -1170,6 +1171,7 @@ export class CoreDomUtilsProvider {
 | 
			
		||||
        if (hasHTMLTags && !CoreSites.getCurrentSite()?.isVersionGreaterEqualThan('3.7')) {
 | 
			
		||||
            // Treat multilang.
 | 
			
		||||
            options.message = await AddonFilterMultilangHandler.filter(<string> options.message);
 | 
			
		||||
            options.message = await AddonFilterMultilang2Handler.filter(<string> options.message);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const alertId = <string> Md5.hashAsciiStr((options.header || '') + '#' + (options.message || ''));
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user